OldComp.cz https://www.oldcomp.cz/ |
|
Jak vytvořit nový příkaz ? https://www.oldcomp.cz/viewtopic.php?f=124&t=10614 |
Stránka 3 z 3 |
Autor: | Busy [ 01.01.2022, 11:41 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
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. |
Autor: | caga [ 01.01.2022, 12:32 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
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. |
Autor: | PotPalo [ 01.01.2022, 14:23 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
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. |
Autor: | Busy [ 01.01.2022, 18:50 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
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 A basic bude pokracovat tam, kde predtym volal vyssie spomenute USR.
ld hl,#2758 exx ei ret |
Autor: | Busy [ 07.01.2022, 23:28 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
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 ;; |
Autor: | caga [ 08.01.2022, 00:10 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
A takto muze to A nabyvat dvou nebo troj ciferneho cisla? |
Autor: | Busy [ 08.01.2022, 00:39 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
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.
|
Autor: | caga [ 08.01.2022, 08:05 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
Já myslel příkaz *123, a A by se rovnalo 123. To volani 1C82 jsem myslel, že to zařídí... Myslel, nekoukal. |
Autor: | Busy [ 08.01.2022, 10:20 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
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 napisalPrikaz 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 a bude to pekne fungovat.20 * cislo 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. |
Autor: | PotPalo [ 08.01.2022, 12:00 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
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. |
Autor: | Busy [ 08.01.2022, 14:12 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
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). |
Autor: | Busy [ 08.01.2022, 19:09 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
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 |
Autor: | caga [ 09.01.2022, 16:52 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
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 |
Autor: | Busy [ 09.01.2022, 18:14 ] |
Předmět příspěvku: | Re: Jak vytvořit nový příkaz ? |
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. |
Stránka 3 z 3 | Všechny časy jsou v UTC + 1 hodina [ Letní čas ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |