OldComp.cz
https://www.oldcomp.cz/

ZX ROM různé...
https://www.oldcomp.cz/viewtopic.php?f=124&t=10571
Stránka 11

Autor:  zxcygnus [ 08.12.2021, 20:51 ]
Předmět příspěvku:  ZX ROM různé...

Co udělá toto volání?
Kód:
ld      a,#fe
call    #1601    ; volání CHAN-OPEN
ld      (iy+#52),3    ; SCR_CT - počet řádků, po jejichž vytisknutí na obrazovku se objeví otázka scroll
...
ld      de,#9c0
call    #c0a    ; volání PO-MSG
Následuje tisk hlášky s číslem 0..3 - což je podle DE typ souboru. Vím, že #1601 je podprogram CHAN-OPEN, kterým se dá přepnout na kanál kam se bude vypisovat pomocí RST #10, takže pokud použiju
Kód:
ld      a,2
call    #1601
Tak tím inicializuji výpis na obrazovku shodný s příkazem PRINT v BASICu do oblasti řádků 0 až 21.

Ale není mi jasné to číslo kanálu #fe (tj. -2).

Autor:  ub880d [ 08.12.2021, 22:27 ]
Předmět příspěvku:  Re: ZX ROM různé...

zxcygnus píše:
Co udělá toto volání?
Kód:
ld      a,#fe
call    #1601    ; volání CHAN-OPEN
ld      (iy+#52),3    ; SCR_CT - počet řádků, po jejichž vytisknutí na obrazovku se objeví otázka scroll
...
ld      de,#9c0
call    #c0a    ; volání PO-MSG
Následuje tisk hlášky s číslem 0..3 - což je podle DE typ souboru. Vím, že #1601 je podprogram CHAN-OPEN, kterým se dá přepnout na kanál kam se bude vypisovat pomocí RST #10, takže pokud použiju
Kód:
ld      a,2
call    #1601
Tak tím inicializuji výpis na obrazovku shodný s příkazem PRINT v BASICu do oblasti řádků 0 až 21.

Ale není mi jasné to číslo kanálu #fe (tj. -2).


ako hovori spektracka biblia:

"Na počátků existuje sedm proudů: od #FD do #03."

(vid. komentovany vypis rom [zenitcentrum, pdf od souftouse] na adrese #15C6)

mam za to ze -3 az -1 su streamy, ktore clovek nevie zavriet cez CLOSE # a tym je zabezpecene ze ich basic moze vzdy pouzit.

EDIT: teraz pozeram ze ani 0-3 sa zavriet nedaju. sice nevyhodia pri pokuse o zavretie chybu, ale sa po zavreti automaticky otvoria s defaultnymi kanalmi, ale tie -3 az -1 nejde overridnut inou hodnotou, kdezto 0-3 ano, vid:
Kód:
OPEN #2,"k"
PRINT "hello world": PAUSE 0

Autor:  Busy [ 08.12.2021, 23:06 ]
Předmět příspěvku:  Re: ZX ROM různé...

Stream #FE alebo -2 je to iste co 2 ale je otvoreny na "s" (t.j. horna cast obrazovky) bez moznosti ho presmerovat a (ako napisal ub880d) zavriet.

Autor:  zxcygnus [ 11.12.2021, 13:17 ]
Předmět příspěvku:  Re: ZX ROM různé...

Při zkoumání D-Textu jsem narazil na zajímavý způsob, jak předávat parametry programu ve strojáku z BASICu bez POKE a to rovnou trojici 16 bit čísel bez znaménka.

Doufám, že jsem v tom při zjednodušování nenadělal chyby. Fungovalo mi to.
Kód:
10 LET a = 111
20 LET b = 222
30 LET c = 333
40 RANDOMIZE a+b/(c/USR 32768)
Záleží na tom, aby sčítání a dělení bylo tak, jak je, jinak se hodnoty neuloží na zásobník správně.
Kód:
        cpu     z80undoc
        org     32768

        call    7833    ; #1e99 FIND-INT2 vyzvedne poslední hodnotu INT ze zásobníku do BC
        push    bc
        call    7833    ; #1e99 FIND-INT2 vyzvedne poslední hodnotu INT ze zásobníku do BC
        push    bc
        call    7833    ; #1e99 FIND-INT2 vyzvedne poslední hodnotu INT ze zásobníku do BC
        pop     de
        pop     hl

        ld      (PARAM_1),hl    ; uloží obsah a
        ld      (PARAM_2),de   ; uloží obsah b
        ld      (PARAM_3),bc   ; uloží obsah c

; 3x call 11560 zajišťuje, aby se proměnné po návratu do v BASICu nezměnily
        call    11560   ; #2d28 STACK-A vytvoří z hodn. v reg. A hodn. ve floating p. a uloží na zásobník
        call    11560   ; #2d28 STACK-A vytvoří z hodn. v reg. A hodn. ve floating p. a uloží na zásobník
        call    11560   ; #2d28 STACK-A vytvoří z hodn. v reg. A hodn. ve floating p. a uloží na zásobník
        ret

PARAM_1 dw      0       ; bude obsah a
PARAM_2 dw      0       ; bude obsah b
PARAM_3 dw      0       ; bude obsah c
Po zredukování na jeden parametr to pak vypadá takto:
Kód:
10 LET a = 111
20 RANDOMIZE a/USR 32768
nebo
20 RANDOMIZE a/USR VAL "32768"
A k tomu minimalistický stroják.
Kód:
        cpu     z80undoc
        org     32768

        call    7833    ; #1e99 FIND-INT2 vyzvedne poslední hodnotu INT ze zásobníku do BC
        ld      (PARAM_1),bc
; tady s tím BC něco dělej
        call    11560   ; #2d28 STACK-A vytvoří z hodn. v reg. A hodn. ve floating p. a uloží na zásobník
        ret

PARAM_1 dw      0
Nedá se použít LET b = a/USR ..., protože po návratu by se provedlo dělení proměnné a. Bylo by nutné volat LET b = USR... samostatně a pak se do proměnné b přenese obsah BC.
Kód:
10 LET b=USR 40000
20 PRINT b
a k tomu
Kód:
        cpu     z80undoc
        org     40000
        ld      bc,12345
        ret

Není mi jasné, jak to je s nutností dát do BC nenulovou hodnotu, aby se nedělilo nulou. Zdá se, že to potřeba není. Ale co s tím udělá STK-STORE a FP-CALC za všech okolností jsem netrasoval. Jen se mi nepodařilo to dostat do stavu, že by se nula v BC objevila po návratu z STACK-A.

Autor:  Busy [ 11.12.2021, 14:18 ]
Předmět příspěvku:  Re: ZX ROM různé...

Ano tento sposob je zaujimavy tym ze vyuziva typicke zasobnikove vyhodnocovanie vyrazov, pri ktorom sa argumenty a medzivysledky ukladaju na zasobnik a vyberaju podla potreby.

Ohladom toho prveho RANDOMIZE a+b/(c/USR 32768) je dolezite len to, aby operacie medzi a,b,c,USR mali postupne vzrastajucu prioritu. Tym padom sa nebudu rovno vykonavat, ale hodnoty sa budu iba ukladat na zasobnik, pretoze ako prva sa musi vykonat operacia s najvyssou prioritou, co je v nasom pripade unarna funkcia USR. Takze kludne by to mohlo byt aj trebars aj RANDOMIZE a+b*c^USR 32768.

V pripade iba jedneho parametra je najjednoduchsie napisat RANDOMIZE a OR USR 32768 a potom je uplne jedno co sa vrati v BC, do RANDOMIZE pojde bud 1 alebo hodnota ktora sa hodi na zasobnik na konci kodu, a ak to bude nejaky integer (z registra A alebo BC) tak potom nic nezhavaruje a program pobezi dalej bez chyby.

Pokial chceme aby strojak vratil hodnotu v BC, mozeme napriklad napisat LET vystup=vstup+USR 32768 kde na zaciatku strojaku si nacitame hodnotu zo "vstup" ulozenu na zasobniku a na konci strojaku ulozime na zasobnik nulu. Operacia scitania potom hodnotu BC vratenu cez USR scita s touto nulou a vysledok celeho vyrazu bude nasa hodnota vlozena do BC.

Autor:  rombor [ 11.12.2021, 15:33 ]
Předmět příspěvku:  Re: ZX ROM různé...

Zaujímavý spôsob.

V tom prvom príklade má byť zrejme
Kód:
        pop    de
        pop    hl

Autor:  zxcygnus [ 11.12.2021, 15:52 ]
Předmět příspěvku:  Re: ZX ROM různé...

rombor píše:
Zaujímavý spôsob.

V tom prvom príklade má byť zrejme
Kód:
        pop    de
        pop    hl
Ano, určitě mělo být. Moje chyba. Muselo se to tam vloudit při přeformátovávání do fóra. Dodatečně opravuji, aby to nemátlo.

A ještě jednu chybu jsem v tom spáchal - hodnoty jsou v opačném pořadí, proměnná c bude v HL a proměnná a bude v BC. Hodnoty v paměti pak budou v pořadí 333 (PARAM_1), 222 (PARAM_2), 111 (PARAM_3).

Viz screenshot.

Přílohy:
screenshot_02.png
screenshot_02.png [ 15.73 KiB | Zobrazeno 4770 krát ]

Stránka 11 Všechny časy jsou v UTC + 1 hodina [ Letní čas ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/