| OldComp.cz https://oldcomp.cz/ |
|
| ASM: Získání celého čísla (příkazem Input) https://oldcomp.cz/viewtopic.php?f=40&t=3265 |
Stránka 2 z 2 |
| Autor: | tomascz [ 04.11.2015, 22:02 ] |
| Předmět příspěvku: | Re: ASM: Získání celého čísla (příkazem Input) |
Busy píše: Pokial chces aby sa to po uspesne aktivovanom error handleri korektne vratilo z USR do basicu, je nutne pred navratom nastavit tienove HL na hodnotu #2758: Kód: ld a,255 ; aby Ok,0:1 Pokial to tak nespravis, funkcia USR sa z toho psychicky zosype... ld (iy+0),a ld hl,#2758 <= toto je nove exx <= toto je nove ret ; navrat do Basicu No,... Zatím jsem se z toho psychicky zosypával tak nanejvýš já Inu, jak prosté... Busy píše: A este dva postrehy: Kód: ld a,255 ; aby Ok,0:1 Staci rovno napisat ld (iy+0),255ld (iy+0),a Kód: call FP_TO_BC ; do BC vysledek A tu zase staci rovno napisat jp FP_TO_BCret Jj, normálně bych to udělal stejně, ale chtěl jsem mít zdrojáky křišťálově čisté |
|
| Autor: | Busy [ 05.11.2015, 09:19 ] |
| Předmět příspěvku: | Re: ASM: Získání celého čísla (příkazem Input) |
tomascz píše: Jak píšou na straně 202 Komentovaného výpisu ZX Rom, "Je zajímavé, že registrový pár IY je znovu nastaven na svou původní hodnotu po návratu přes STACK-BC, ale důležitý ukazatel na poslední literál, který je v H’L‘, obnoven není. Proto pro úspěšný návrat do BASICu musí zrcadlové HL obsahovat adresu instrukce "end-calc" v podprogramu SCANNING, která je na adrese #2758." Ano, je to jedna z chyb v romke. Register IY sa pouziva na adresaciu systemoviek, preto musi byt nastaveny na #5C3A. Autori romky nezabudli na moznost ze ho uzivatel zmeni a nevrati nazad, preto hned ako uplne prva instrukcia v romke sa vykona prave to LD IY,#5C3A. Ale popritom uplne zabudli na HL' - asi ich nenapadlo, ze uzivatelsky program moze urobit aj EXX. tomascz píše: Jj, normálně bych to udělal stejně, ale chtěl jsem mít zdrojáky křišťálově čisté Ja si zase pod pojmom krystalovo cisty zdrojak predstavujem nieco kde nie su rozne do oci bijuce neefektivity tohto typu |
|
| Autor: | mborik128 [ 05.11.2015, 09:43 ] |
| Předmět příspěvku: | Re: ASM: Získání celého čísla (příkazem Input) |
tomascz píše: Busy píše: Kód: ld a,255 ; aby Ok,0:1 Staci rovno napisat ld (iy+0),255ld (iy+0),a Kód: call FP_TO_BC ; do BC vysledek A tu zase staci rovno napisat jp FP_TO_BCret Jj, normálně bych to udělal stejně, ale chtěl jsem mít zdrojáky křišťálově čisté
|
|
| Autor: | tomascz [ 05.11.2015, 10:40 ] |
| Předmět příspěvku: | Re: ASM: Získání celého čísla (příkazem Input) |
Busy píše: tomascz píše: Jj, normálně bych to udělal stejně, ale chtěl jsem mít zdrojáky křišťálově čisté Ja si zase pod pojmom krystalovo cisty zdrojak predstavujem nieco kde nie su rozne do oci bijuce neefektivity tohto typu mborik128 píše: tomascz píše: Jj, normálně bych to udělal stejně, ale chtěl jsem mít zdrojáky křišťálově čisté To je nejaky zvlastny typ trollingu? ![]() Dobře, tak mohl jsem použít ozačení "zdroják jasný naprosto každému", ale grossův výrok mi přišel podobně vhodný, navíc i mírně vtipný |
|
| Autor: | Busy [ 05.11.2015, 10:51 ] |
| Předmět příspěvku: | Re: ASM: Získání celého čísla (příkazem Input) |
tomascz píše: mborik128 píše: tomascz píše: Jj, normálně bych to udělal stejně, ale chtěl jsem mít zdrojáky křišťálově čisté To je nejaky zvlastny typ trollingu? ![]() |
|
| Autor: | tomascz [ 05.11.2015, 12:02 ] |
| Předmět příspěvku: | Re: ASM: Získání celého čísla (příkazem Input) |
No, já už bych možná zbytečnou debatu ukončil a řeknu jen, že konkrétně u těchto dvou zmiňovaných instrukcí byl můj původní záměr opravdu mít hodnotu 255 jak na adrese (IY+0), tak v akumulátoru - jednoduše proto, že se mi nechtělo bádat, jestli rutina v ROMce testuje akumulátor nebo (IY+0). Proto tedy nebyla použita přímo instrukce "Ld (IY+N),M". Žel bohu pro získání "Ok, 0:1" nezabírala ani jedna varianta - až ta třetí s HL' a Exx... Kombinace Call a Ret je samozřejmě jasně zdrcnutelná do JP, resp. JR. Protože ale se ptám v sekci "ZX Spectrum začátečníci", bral jsem ohled na to, že Ret na konci rutiny je pro každého jasnějším signálem jejího konce než JP. Tím bych tedy debatu ukončil. Získání celého kladného čísla jsem nakonec vyrobil kombinací všech zde zmíněných postupů, tj. svého (filtrování kláves 0-9), busyho (buffrování vstupu) a Val (kalkulátor). Případ Val(""), který opět produkuje Nonsense, řeším tím, že jako prvním znakem v buffru je natvrdo znak nula a uživatelův ciferný text začíná až na pozici "Buffer+1" - příkaz Val(Buffer) tedy vždy vyhodnotí minimálně text "0" (signál nesmyslu v oboru celých kladných čísel). Mohl bych testovat rovnou, jestli délka vstupního řetězce je nulová, ale to je věcí konečné optimalizace - aktuálně řeším další věci. Zpracování chyb (tj. odchytávání výjimek jak poradil busy) tedy momentálně nevyužívám - bude se ale hodit pro odchytávání výjimek produkovaných MDOSem v utilitě, na které teď dělám. |
|
| Stránka 2 z 2 | Všechny časy jsou v UTC + 1 hodina [ Letní čas ] |
| Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |
|