OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 07.02.2023, 07:50

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 44 ]  Přejít na stránku 1, 2, 3  Další
Autor Zpráva
 Předmět příspěvku: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 26.12.2021, 11:34 
Offline
Kecálek

Registrován: 09.01.2021, 18:37
Příspěvky: 77
Has thanked: 13 times
Been thanked: 11 times
Ahoj, docela by se mi hodilo mít k dispozici nový příkaz z Basicu, ale jako ne moc znalý romky se raději zeptám místních znalců.
Mám nějakou rutinu a tu spoušním přes rand usr xxx. Rád bych jí spustil třeba Print ( .
Tuším,že se to musí řešit přes vyvolání chyby, ale to je tak všechno.
Samozřejmě počítám s úpravou romky. Ta bude vyměněná stejně, protože ta rutina bude v té prázdné zadní oblasti.

Díky, těším se na různá zajímavá řešení.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 26.12.2021, 13:08 
Offline
Pan Štábní

Registrován: 12.05.2013, 22:24
Příspěvky: 1316
Bydliště: u Prahy
Has thanked: 39 times
Been thanked: 326 times
Není ani potřeba úprava ROM.
Mechanismus je stejný jako u "on error goto", stačí si hlídat Syntax error a sám si udělat syntaktickou analýzu.
Příkladů je dost, jde se inspirovat třeba v Kamasoft Basicu 2, ProDosu, ...


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 28.12.2021, 21:23 
Offline
Pan Generální

Registrován: 22.05.2013, 21:14
Příspěvky: 3386
Bydliště: Bratislava
Has thanked: 351 times
Been thanked: 707 times
Maly, narychlo napisany priklad ako si rozsirit basic o novy prikaz bez modifikacie romky:
Kód:
init    ld      hl,(#5C3D)      ;; ERRSP
        ld      (hl),low handler
        inc     hl
        ld      (hl),high handler
        ret

handler ld      bc,handler      ;; Adresa error handlera
        push    bc              ;; na zasobniku obnovena
        xor     a
        sbc     hl,sp           ;; Test ci je chyba v cmdline editore
        jp      z,#12B4         ;; Ak ano, pokracuj za editor
        ld      a,(#5C3A)       ;; ERRNR = cislo chyby ktora nastala
        cp      #0B             ;; Nastala chyba 'Nonsense in BASIC' ?
        jr      nz,theend       ;; Ak nie, skok na povodnu cinnost
        ld      hl,(#5C5D)      ;; CHADD = program counter pre basic
        dec     hl
        ld      a,(hl)          ;; Predchadzajuci znak nebol platny prikaz
        cp      '*'             ;; Je to nas novy prikaz (hviezdicka) ?
        jr      nz,theend       ;; Ak nie, skok na povodnu cinnost

        ld      (iy+#00),#FF    ;; Zrusenie chyby 'Nonsense in BASIC'
cmd     call    #2530           ;; Kontrola syntaxe ?
        jr      z,next          ;; Ak ano, preskoc funkcionalitu

        xor     a               ;; Nejaka funkcionalita noveho prikazu
        out     (#fe),a         ;; (cierny border len ako priklad)

next    jp      #1b76           ;; Pokracovanie na dalsi prikaz v basicu

theend  call    #2530           ;; Kontrola syntaxe ?
        jp      z,#12B7         ;; Ak ano, skok za kontrolu syntaxe
        jp      #1303           ;; Ak nie, skok na vypis chyboveho hlasenia
Inicializacia sa robi zavolanim adresy init.

Ak je moznost upravy romky, tak je to uplne trivialne. Na #1B44 je kontrola, ci nacitany znak je platny prikaz basicu (jeho kod je aspon #CE), ak nie, tak to skoci na #1B8A kde to spravi chybu Nonsense in basic. Staci skok na chybu zmenit na skok do vlastnej rutinky kde sa otestuje kod noveho prikazu a na chybu sa skoci az potom, ked to nie je ani nas novy prikaz. A ak je, tak kod bude taky isty ako od labelu "cmd" vo vyssie uvedenom priklade.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 28.12.2021, 23:13 
Offline
Kecálek

Registrován: 09.01.2021, 18:37
Příspěvky: 77
Has thanked: 13 times
Been thanked: 11 times
Ahoj, díky za příklad. Chodí to tak napůl. Z řádku to na hvězdičku reaguje, ale z programu ne. Když dám hvězdičku a něco, tak to vytuhne. A dalo by se třeba *0 *1 *2 ... ? tedy dvouznaková instrukce?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 28.12.2021, 23:43 
Offline
Pan Generální

Registrován: 22.05.2013, 21:14
Příspěvky: 3386
Bydliště: Bratislava
Has thanked: 351 times
Been thanked: 707 times
Na zaciatku programu treba dat USR init, pretoze spustenie programu prikazom RUN obcas zrusi aktutalne nastavenie ERRSP (zalezi od prechadzajucej cinnosti). Pokial sa v programe pouziva CLEAR, tak za neho je tiez vhodne dat USR init.

Samozrejme aj zlozitejsie prikazy by sa dali, staci po hviezdicke skontrolovat ci za nou nasleduju dalsie znaky prikazu.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 29.12.2021, 22:02 
Offline
Kecálek

Registrován: 09.01.2021, 18:37
Příspěvky: 77
Has thanked: 13 times
Been thanked: 11 times
Super, chápu. A jak se kontroluje zda následuje další znak příkazu ?
Když Ty ten kód sypeš z rukávu.. :)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 29.12.2021, 23:18 
Offline
Pan Generální

Registrován: 22.05.2013, 21:14
Příspěvky: 3386
Bydliště: Bratislava
Has thanked: 351 times
Been thanked: 707 times
Napriklad takto:
Kód:
        ...
        ld      a,(hl)          ;; Predchadzajuci znak nebol platny prikaz
        cp      '*'             ;; Je to nas novy prikaz (hviezdicka) ?
        jr      nz,theend       ;; Ak nie, skok na povodnu cinnost
        inc     hl
        ld      a,(hl)
        cp     '1'
        jr      z,prikaz_1
        cp     '2'
        jr      z,prikaz_2
        ...
        jr      theend


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 29.12.2021, 23:57 
Offline
Kecálek

Registrován: 09.01.2021, 18:37
Příspěvky: 77
Has thanked: 13 times
Been thanked: 11 times
Takto jsem si to predstavoval, ale to mi porad tuhne. Jak dam hvezdicka a neco.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 30.12.2021, 00:14 
Offline
Kecálek

Registrován: 09.01.2021, 18:37
Příspěvky: 77
Has thanked: 13 times
Been thanked: 11 times
Kód:
handler ld      bc,handler      ;; Adresa error handlera
        push    bc              ;; na zasobniku obnovena
        xor     a
        sbc     hl,sp           ;; Test ci je chyba v cmdline editore
        jp      z,#12B4         ;; Ak ano, pokracuj za editor
        ld      a,(#5C3A)       ;; ERRNR = cislo chyby ktora nastala
        cp      #0B             ;; Nastala chyba 'Nonsense in BASIC' ?
        jr      nz,theend       ;; Ak nie, skok na povodnu cinnost
        ld      hl,(#5C5D)      ;; CHADD = program counter pre basic
        dec     hl
        ld      a,(hl)          ;; Predchadzajuci znak nebol platny prikaz
        cp      '*'             ;; Je to nas novy prikaz (hviezdicka) ?
        jr      nz,theend       ;; Ak nie, skok na povodnu cinnost
;        ld      (iy+#00),#FF    ;; Zrusenie chyby 'Nonsense in BASIC'
;cmd     call    #2530           ;; Kontrola syntaxe ?
;        jr      z,next          ;; Ak ano, preskoc funkcionalitu

        inc     hl
        ld      a,(hl)
        cp     '1'
        jr      z,prikaz_1
        cp     '2'
        jr      z,prikaz_2
        cp     '3'
        jr      z,prikaz_3
        xor     a
        out     (#fe),a

next    jp      #1b76           ;; Pokracovanie na dalsi prikaz v basicu

theend  call    #2530           ;; Kontrola syntaxe ?
        jp      z,#12B7         ;; Ak ano, skok za kontrolu syntaxe
        jp      #1303           ;; Ak nie, skok na vypis chyboveho hlasenia
       
prikaz_1 ld     a,#1
        out     (#fe),a         ;;
        jr      next
       
prikaz_2 ld     a,#2
        out     (#fe),a         ;;
        jr      next
       
prikaz_3 ld     a,#3
        out     (#fe),a         ;;
        jr      next


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 30.12.2021, 01:08 
Offline
Pan Generální

Registrován: 22.05.2013, 21:14
Příspěvky: 3386
Bydliště: Bratislava
Has thanked: 351 times
Been thanked: 707 times
caga píše:
Takto jsem si to predstavoval, ale to mi porad tuhne. Jak dam hvezdicka a neco.
Pretoze namiesto tvojho xor a:out (#fe),a ma byt moj jr theend - vid moj kod vyssie. Pointa je v tom, ze ked sa za hviezdickou nenajde nic rozumneho (dalsie znaky prikazu) tak to ma skocit na theend aby to mohla syntaxna kontrola spravne spracovat a vyhodit otaznik pri zlom znaku za hviezdickou.
Dalej, chyba ti tam ld (iy+#00),#FF ktore je nutne na vynulovanie chyby v pripade, ked sa nejaky z tvojich novych prikazov spravne rozpozna.
A nakoniec, po spravnom rozpoznani prikazu treba pomocou call #2530 zistit, ci sa kontroluje syntax a ak ano, treba preskocit funkcionalitu prikazu. Pretoze isto by nebolo zrovna vhodne, ak by sa pri odosielani basic riadku s prikazmi tieto prikazy zaroven aj naostro vykonavali :)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 31.12.2021, 00:52 
Offline
Kecálek

Registrován: 09.01.2021, 18:37
Příspěvky: 77
Has thanked: 13 times
Been thanked: 11 times
Tak já nevím. Vždyť i v tom prvním příkladu pokud zadám příkaz *1 tak by přece mělo ke změně borderu dojít. Nedojde a zatuhne.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 31.12.2021, 02:04 
Offline
Pan Štábní

Registrován: 01.12.2017, 21:01
Příspěvky: 1770
Bydliště: BA-Petržalka :(
Has thanked: 17 times
Been thanked: 279 times
Nemalo by to pri spracovávaní zvyšovať premennú CHADD? Ako to vie či je už koniec príkazu, nemalo by sa to tiež kontrolovať? Napríklad *1 je v poriadku, ale čo keď zadáme *1x čo už je nezmysel?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 31.12.2021, 10:23 
Offline
Pan Generální

Registrován: 22.05.2013, 21:14
Příspěvky: 3386
Bydliště: Bratislava
Has thanked: 351 times
Been thanked: 707 times
Presne ako pise PotPalo, v tom mojom originalnom priklade som zabudol skontrolovat ci za prikazom uz nenasleduju ziadne parametre. Pretoze ked sa zada hviezdicka a za nou este nieco, napr. *1 tak handler spravne zdetekuje a zakceptuje hviezdicku, avsak nasledne syntaxna kontrola v romke zisti ze nasleduje 1 co je chyba. Znovu sa zaktivuej handler, ale kedze sme stale na prikaze hviezdicka, handler si mysli ze je vseko OK a skoci do romky na pokracovanie syntaxnej kontroly. A takto sa to donekonecna zacykli.

Tu je opravena verzia doplnena o testovanie konca prikazu - za hviezdickou musi nasledovat bud dvojbodka oddelujuca nasledujuci prikaz, alebo koniec basicoveho riadku.
Kód:
init    ld      hl,(#5C3D)      ;; ERRSP
        ld      (hl),low handler
        inc     hl
        ld      (hl),high handler
        ret

handler ld      bc,handler      ;; Adresa error handlera
        push    bc              ;; na zasobniku obnovena
        xor     a
        sbc     hl,sp           ;; Test ci je chyba v cmdline editore
        jp      z,#12B4         ;; Ak ano, pokracuj za editor
        ld      a,(#5C3A)       ;; ERRNR = cislo chyby ktora nastala
        cp      #0B             ;; Nastala chyba 'Nonsense in BASIC' ?
        jr      nz,theend       ;; Ak nie, skok na povodnu cinnost
        ld      hl,(#5C5D)      ;; CHADD = program counter pre basic
        dec     hl
        ld      a,(hl)          ;; Predchadzajuci znak nebol platny prikaz
        cp      '*'             ;; Je to nas novy prikaz (hviezdicka) ?
        jr      nz,theend       ;; Ak nie, skok na povodnu cinnost

        rst     #18             ;; NOVE ;; Daj aktualny znak z basic programu
        cp      ':'             ;; NOVE ;; Za prikazom musi byt dvojbodka
        jr      z,cmdok         ;; NOVE ;; Ak ano, vsetko je v poriadku
        cp      #0D             ;; NOVE ;; Alebo ked nie dvojbodka tak aspon koniec riadku
        jr      nz,theend       ;; NOVE ;; Ak nie tak je to chyba

cmdok   ld      (iy+#00),#FF    ;; Zrusenie chyby 'Nonsense in BASIC'
        call    #2530           ;; Kontrola syntaxe ?
        jr      z,next          ;; Ak ano, preskoc funkcionalitu

        xor     a               ;; Nejaka funkcionalita noveho prikazu
        out     (#fe),a         ;; (cierny border len ako priklad)

next    jp      #1b76           ;; Pokracovanie na dalsi prikaz v basicu

theend  call    #2530           ;; Kontrola syntaxe ?
        jp      z,#12B7         ;; Ak ano, skok za kontrolu syntaxe
        jp      #1303           ;; Ak nie, skok na vypis chyboveho hlasenia


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 31.12.2021, 10:44 
Offline
Pan Generální

Registrován: 22.05.2013, 21:14
Příspěvky: 3386
Bydliště: Bratislava
Has thanked: 351 times
Been thanked: 707 times
caga píše:
A dalo by se třeba *0 *1 *2 ... ? tedy dvouznaková instrukce?
Tuhla cely handler s osmimi novymi prikazmi: *0 *1 ... *7.
Kód:
init    ld      hl,(#5C3D)      ;; ERRSP
        ld      (hl),low handler
        inc     hl
        ld      (hl),high handler
        ret

handler ld      bc,handler      ;; Adresa error handlera
        push    bc              ;; na zasobniku obnovena
        xor     a
        sbc     hl,sp           ;; Test ci je chyba v cmdline editore
        jp      z,#12B4         ;; Ak ano, pokracuj za editor
        ld      a,(#5C3A)       ;; ERRNR = cislo chyby ktora nastala
        cp      #0B             ;; Nastala chyba 'Nonsense in BASIC' ?
        jr      nz,theend       ;; Ak nie, skok na povodnu cinnost
        ld      hl,(#5C5D)      ;; CHADD = program counter pre basic
        dec     hl
        ld      a,(hl)          ;; Predchadzajuci znak nebol platny prikaz
        cp      '*'             ;; Je to nas novy prikaz (hviezdicka) ?
        jr      nz,theend       ;; Ak nie, skok na povodnu cinnost

        rst     #18             ;; Daj aktualny znak z basic programu
        cp      '0'             ;; Ak je to mensie ako znak 0
        jr      c,theend        ;; potom bude chyba
        cp      '7'             ;; Ak je to vecsie ako znak 7
        jr      nc,theend       ;; potom bude tiez chyba
        ld      e,a             ;; Znak je 0..7, odlozime si ho do registra E

        rst     #20             ;; Daj nasledujuci znak z basic programu
        cp      ':'             ;; Za prikazom musi byt dvojbodka
        jr      z,cmdok         ;; Ak ano, vsetko je v poriadku
        cp      #0D             ;; Alebo ked nie dvojbodka tak aspon koniec riadku
        jr      nz,theend       ;; Ak nie tak je to chyba
cmdok   ld      (iy+#00),#FF    ;; Zrusenie chyby 'Nonsense in BASIC'
        call    #2530           ;; Kontrola syntaxe ?
        jr      z,next          ;; Ak ano, preskoc funkcionalitu

        ld      a,e             ;; Nejaka funkcionalita noveho prikazu
        and     #07
        out     (#fe),a         ;; (nastavenie borderu len ako priklad)

next    jp      #1b76           ;; Pokracovanie na dalsi prikaz v basicu

theend  call    #2530           ;; Kontrola syntaxe ?
        jp      z,#12B7         ;; Ak ano, skok za kontrolu syntaxe
        jp      #1303           ;; Ak nie, skok na vypis chyboveho hlasenia
Inak v tomto konkretnom pripade by bolo jednoduchsie hviezdicku uplne vyhodit a nove prikazy by boli iba cislice 0..7 takto:
Kód:
   ...
   ld   a,(hl)      ;; Predchadzajuci znak nebol platny prikaz
   cp   '0'      ;; Ak je to mensie ako znak 0
   jr   c,theend   ;; potom bude chyba
   cp   '7'      ;; Ak je to vecsei ako znak 7
   jr   nc,theend   ;; potom bude tiez chyba
   ld   e,a      ;; Znak je 0..7, odlozime si ho do registra E

   rst   #18      ;; Daj aktualny znak z basic programu
   cp   ':'      ;; Za prikazom musi byt dvojbodka
   ...
Jediny problem ktory by nastal by bol ze odoslanim samotnej cislice z prikazoveho riadku by to romka vyhodnotila ze uzivatel chce zmazat dany riadok, takze namiesto vykonania noveho prikazu by sa zmazal dany riadok. To sa da ale lahko ofintit, staci pred prikaz napisat dvojbodku. Interpreter to vyhodni ze tam nie je cislo riadku a teda riadok sa ma hned vykonat. V pripade, ze ma byt takyto "ciselny" prikaz na zaciatku riadku ktory sa ma zaradit do basic programu, netreba ani dvojbodku, staci medzi cislo riadku a ciselny prikaz dat cokolvek co basic interpreter nevyhodnocuje, napr. medzeru, alebo nejaky kod na zmenu farby pri listingu.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 31.12.2021, 13:02 
Offline
Radil
Uživatelský avatar

Registrován: 13.05.2013, 17:48
Příspěvky: 506
Bydliště: Košice
Has thanked: 342 times
Been thanked: 257 times
Aby sa akceptoval aj príkaz *7, musí byť v oboch príkladoch táto podmienka cp '7'+1.

_________________
https://pmd85.borik.net - PMD 85 Emulátor, PMD 85, PMD 32-SD
https://pp01.borik.net - PP 01 Emulátor, PP 01, SD-ROM Modul


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 44 ]  Přejít na stránku 1, 2, 3  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 2 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz