OldComp.cz

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


Právě je 29.03.2024, 01:07

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 Předchozí  1, 2, 3
Autor Zpráva
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 01.01.2022, 11:41 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
caga píše:
Z basicu skočím na svůj stroják, běžím v něm a přijdu o návratovou adresu. Nesahal jsem do oblasti systémových proměných, ani do oblasti, kde je basic a proměné. Registry jsou všechny změněné. Je možné se vrátit skokem na nějakou adresu?
Ano, je to mozne. Pokial volas strojak pomocou USR, tak posledna navratova adresa na zasobniku je #2D2B, takze ak si o nu prisiel, ale inak je zvysok zasobnika v poriadku, tak staci urobit JP #2D2B.

Ale uprimne si taku situaciu neviem dost dobre predstavit. Skus napisat nejaky usercase kedy a ako by sa take nieco mohlo stat.


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

Registrován: 09.01.2021, 18:37
Příspěvky: 108
Has thanked: 16 times
Been thanked: 22 times
Měl jsem představu, že bych si uložil obsah paměti od 5b00 na nějaké médium. Někdy pak z toho média nahrál zpět do paměti a zůstal v basicu. Teda jako jednoduchý snap.
Proti snapu u D40 třeba, mě nejde o to při nahrání zpět pokračovat v běhu tam, kde bylo uloženo, ale být v interpreteru basicu s nahraným bas programem, případně i s asm kódem někde dál.


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

Registrován: 01.12.2017, 21:01
Příspěvky: 2062
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 323 times
caga píše:
...Registry jsou všechny změněné. ...

Pre návrat do BASICu potrebuješ správne nastaviť IY a HL' aby to nespadlo. Keď som o tom nevedel a pri pokusoch v assembleri som používal aj tieto registre, tak som nechápal prečo mi program na konci spadol.

_________________
Oznamy o novom príspevku mi na mail chodia iba sporadicky, takže keď sa nehlásim v diskusii, tak je to tým. V 80% nepríde mail vôbec.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 01.01.2022, 18:50 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
caga píše:
Měl jsem představu, že bych si uložil obsah paměti od 5b00 na nějaké médium. Někdy pak z toho média nahrál zpět do paměti a zůstal v basicu. Teda jako jednoduchý snap.
Aha, jasne. V tom pripade ale vobec netreba riesit nejake adresy kam skakat do romky.

V kode, ktory zavolas z basicu pomocou USR, si uloz tieto dve oblasti pameti:
Prva bude zacinat na #5C00 a koncit tam kam ukazuje systemova premenna STKEND.
Druha bude zacinat na aktualnej hodnote SP a koncit aktualne nastavenym RAMTOP-om.

Pri loadovani tohto "snapu" loadni obe casti nazad do pameti. Adresu, kam nahrat druhu cast, lahko zistis z nastavenia RAMTOP ktory bude ulozeny v prvej casti. A potom vykonaj nasledujuci kod:
Kód:
ld sp,zaciatok_druhej_oblasti
ld hl,#2758
exx
ei
ret
A basic bude pokracovat tam, kde predtym volal vyssie spomenute USR.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 07.01.2022, 23:28 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
caga píše:
A dalo by se třeba *0 *1 *2 ... ? tedy dvouznaková instrukce?
Cisto prakticky, naco vymyslat dvojznakove prikazy *1 *2 *3 ... ked mozeme to cislo dat ako obecny numericky parameter ?
Takze tu je priklad, ako by to mohlo vyzerat. Prikaz je iba hviezdicka, a za nou nasleduje lubovolny ciselny vyraz:
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

        call    tstend          ;; Uz je koniec prikazu ?
        jr      z,theend        ;; Ak ano, je to zle
        call    #1C82           ;; Nacitaj ciselny parameter

        call    tstend          ;; A teraz je uz koniec prikazu ?
        jr      nz,theend       ;; Ak este stale nie, je to zle

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

        call    #1E94           ;; Ciselny parameter do registra A
        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

tstend  rst     #18             ;; Test ci sme uz prisli na koniec prikazu
        cp      ':'             ;; Bud je za prikazom dvojbodka
        ret     z               ;;
        cp      #0D             ;; Alebo enter
        ret                     ;;


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

Registrován: 09.01.2021, 18:37
Příspěvky: 108
Has thanked: 16 times
Been thanked: 22 times
A takto muze to A nabyvat dvou nebo troj ciferneho cisla?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 08.01.2022, 00:39 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
caga píše:
A takto muze to A nabyvat dvou nebo troj ciferneho cisla?
Nie som si celkom isty kam tou otazkou mieris. A je akumulator, osembitovy register, takze moze nadobudat lubovolne hodnoty od 0 az do 255.


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

Registrován: 09.01.2021, 18:37
Příspěvky: 108
Has thanked: 16 times
Been thanked: 22 times
Já myslel příkaz *123, a A by se rovnalo 123. To volani 1C82 jsem myslel, že to zařídí... Myslel, nekoukal.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 08.01.2022, 10:20 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
caga píše:
Já myslel příkaz *123, a A by se rovnalo 123. To volani 1C82 jsem myslel, že to zařídí... Myslel, nekoukal.
Ano, takto to bude tiez fungovat. Uz vyssie som napisal
Prikaz je iba hviezdicka, a za nou nasleduje lubovolny ciselny vyraz
takze za hviezdickou mozes napisat cokolvek, co dava ciselny vysledok. Presne ako v ktoromkolvek klasickom prikaze basicu ktory akceptuje ciselny parameter.
Napriklad trebars kludne aj
Kód:
10 LET cislo=123
20 * cislo
a bude to pekne fungovat.
Samozrejme, vysledok vyrazu musi byt cislo v rozsahu 0 az 255, ak bude mimo rozsah, spravi sa chyba Integer out of range.
A samozrejme budu osetrene akekolvek ine chyby pri vyhodnocovani vyrazu. Napriklad *1/0 hodi klasicke delenie nulou Number too big.


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

Registrován: 01.12.2017, 21:01
Příspěvky: 2062
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 323 times
Test na koniec príkazu ma zaujal. Kontroluje sa iba dvojbodka a enter. Ale bežný program v BASICu umožňuje dať napríklad aj ľubovoľný počet medzier za príkaz (alebo pred? teraz neviem) a tiež to funguje.

_________________
Oznamy o novom príspevku mi na mail chodia iba sporadicky, takže keď sa nehlásim v diskusii, tak je to tým. V 80% nepríde mail vôbec.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 08.01.2022, 14:12 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
PotPalo píše:
Test na koniec príkazu ma zaujal. Kontroluje sa iba dvojbodka a enter. Ale bežný program v BASICu umožňuje dať napríklad aj ľubovoľný počet medzier za príkaz (alebo pred? teraz neviem) a tiež to funguje.
Medzery a rozne riadiace kody (farby, at, tab, comma...) sa interpretrom nijak nevyhodnocuju a iba sa preskakuju. Toto zabezpecuju rutinky RST #18 a RST #20 ktorymi si interpreter nacitava basic program.

Vdaka tomu si mozes basic program pekne naformatovat - prakticky na lubovolne miesto vlozit medzery, farby a rozne dalsie kody ktore zmenia vzhlad listingu, ale nijak nevplyvaju na vykonavanie basicu (iba sa strati zopar taktov ich preskakovanim).


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 08.01.2022, 19:09 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Taky maly (extremny) priklad:
Kód:
10 LET Tato premenna sluzi na uchovavanie cisla a jej nazov moze obsahovat aj medzery=0
20 PRINT Tato premenna sluzi na uchovavanie cisla a jej nazov moze obsahovat aj medzery


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

Registrován: 09.01.2021, 18:37
Příspěvky: 108
Has thanked: 16 times
Been thanked: 22 times
Busy (nebo i ostatni) kouknul by si na to, jak tedy zajistit to hladke pokracovani? Nejde o odkoukani synt. chyb, ale o to znovu nastaveni zasovniku a navratove adr. . Je to v podstate souhr tech 2 temat v tomto vlakne. diky
Kód:
;**** ulozeni do eprom
        org     $3900
save    ld      ($5b00),sp
        ld      ($5b02),bc
        ld      ($5b04),de
        ld      ($5b06),hl
     
        ld      de,$4000
        ld      hl,skonvrom
        ld      bc,skonovl-szacovl
        ldir
        jp      szacovl
skonvrom
        org     $4000
szacovl ld      a,$01                   ;1= 1 na /CSROM
        out     (csrom),a               
        ld      de,$0000
        ld      hl,$5b00
        ld      bc,$4000
        ldir                            ;tento prikaz je nahrazen ovladacem
        xor     a
        out     (csrom),a               ;0= 0 na /CSROM
        ret
skonovl

;**** nacteni z eprom
load    org     $3a00
        ld      de,$4000
        ld      hl,lkonvrom
        ld      bc,lkonovl-lzacovl
        ldir
        jp      lzacovl
lkonvrom
        org     $4000
lzacovl ld      a,$01                   ;1= 1 na /CSROM
        out     (csrom),a               
        ld      de,$5b00
        ld      hl,$0000
        ld      bc,$4000
        ldir                            ;tento prikaz je nahrazen ovladacem
       
; a ted to spravne nastavit :)
        xor     a
        out     (csrom),a               ;0= 0 na /CSROM
        ld      sp,($5b00)
        ld      bc,($5b02)
        ld      de,($5b04)
        ld      hl,($5b06)
        ret
       
;*****  *0 save   *1 load     
        FPOS    #1B46           ;; Odskok na rom patch
        jp      c,newcmd

        FPOS    #3C01           ;; Umiestnenie patchu v romke
        org     #3C01

newcmd  ld      a,c             ;; Predchadzajuci znak nebol platny prikaz
        cp      '*'             ;; Je to nas novy prikaz (hviezdicka) ?
        jr      nz,error        ;; Ak nie, potom bude chyba

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

        rst     #20             ;; Chod na nasledujuci znak v basic programe
        call    #1BEE           ;; Pri kontrole syntaxe chod na dalsi prikaz

        ld      a,e             ;; Nejaka funkcionalita noveho prikazu
        and     #07
        cp      0
        jp      z,save
        cp      1
        jp      z,load

error   rst     #08             ;; Chyba 'Nonsense in BASIC'
        db      #0B   


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Jak vytvořit nový příkaz ?
PříspěvekNapsal: 09.01.2022, 18:14 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Zopar otazok k tej rutinke:
- Preco kopirujes natvrdo #4000 bajtov ?
- Akym ovladacom sa nahradi ldir ?

A este zopar poznamok:
- Nepouzivaj adresy #xx00. Vzdy na kazdom #xxFF nechaj dva #FF bajty, kvoli tomu ze toto programy zvyknu pouzivat ako IM2 vektor.
- Rutinky SAVE a LOAD mozes dat priamo k tomu mojmu kodu a usetris dva JP skoky. Alebo ich potrebujes mat na presne definovanej adrese ?
- And #07 mozes vynechat a rovno testovat znaky '1' a '2'
- Druhy test je zbytocny, pretoze do tejto casti to vojde len vtedy, ked je to jeden zo znakov '1' alebo '2', nic ine to nemoze byt
- Registre BC,DE,HL vobec netreba odkladat. Jediny co potrebujes odlozit je SP.
- Zbytocne ukladas temer cely print buffer. SP odloz napr. na #5CB6, tam aj tak v tej chvili nie je nic dolezite a potom ti staci odpametat az od #5C00.
- Nezabudni odpametat aj zasobnik ! Ten je od hodnoty SP az po RAMTOP.


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 Předchozí  1, 2, 3

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 4 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