ZX-81 ROM kódjából próbáltam megérteni, hogyan tölt be egy bájtot kazettáról, de nem sikerült. A kérdéses résznek az egy bit beolvasásának itt az assembly kódja:
;; GET-BIT
L0385: PUSH DE ; save the.
LD E,$94 ; timing value.
;; TRAILER
L0388: LD B,$1A ; counter to twenty six.
;; COUNTER
L038A: DEC E ; decrement the measuring timer.
IN A,($FE) ; read the
RLA ;
BIT 7,E ; <<< Kérdéses: minek ez? A Z flag úgyis eltűnik, nem kerül felhasználásra
LD A,E ;
JR C,L0388 ; loop back with carry to TRAILER
DJNZ L038A ; to COUNTER
POP DE ;
JR NZ,L039C ; to BIT-DONE <<< Kérdéses: Ez sosem ugorhat el, mivel Z=1 akkor minek?
CP $56 ;
JR NC,L034E ; to NEXT-BIT <<< Kérdéses: Ha ez elugrik, nem kerül C-be a beolvasott bit. Ha nem, akkor meg csak 0 kerüleht majd a C-be. Akkor hogyan kerület 1-es bit a C-be?
;; BIT-DONE
L039C: CCF ; complement carry flag
RL C ;
JR NC,L034E ; to NEXT-BIT
RET ; return with full byte.
A kód elvileg a C-ben gyűjti a biteket. ZX-81 alatt minden bit előtt van egy hosszú bevezető szünet a kazettán, a NEXT-BIT azt ugorja át, majd jön ide a konkrét bit beolvasásához. A bitek betöltése csak ebben a kiemelt kódrészletben kellene, hogy megtörténjen.
A legfőbb kérdés, hogy hogyan kerül 1-es bit a C-be? (Szerintem sehogy, de a valóságban mégis.) A másik két kérdés csak olyan utasításokra vonatkozik, amiket nem értek, mit keresnek ott.
A kérdéseket jelöltem a forrásban is.
Ha valaki el tudná magyarázni a kód működését pontosan, annak örülnék, mert én nem értem.
A teljes forrás több helyen is megtalálható a neten. A teljes LOAD parancs kódja a 0x0340 címtől kezdődik.
Megoldás: A DJNZ nem állítja a Z flaget.
- 211 megtekintés
Hozzászólások
Az első két kérésed egymást válaszolja meg: az első beállítja a Z bitet, a második pedig az alapján ugrik. A köztes DJNZ-nek ugyanis semmi köze a Z bithez: nem is néz rá, nem is állít rajta.
- A hozzászóláshoz be kell jelentkezni
A DJNZ nem nyúl a Flag-hez? Ó, hogy erre nem is gondoltam! Eszembe sem jutott megnézni.
Köszönöm!
- A hozzászóláshoz be kell jelentkezni
Szia!
Tudom, hogy nem segítség, csak az emlékeim idézem.
Több mint 40 éve volt - akkor a fenti kód alapján sikerült egy gyors save - load párost írnom amit töredék idő alatt mentette a programokat és töltötte vissza.
Sajnos a kód már nem hiszem, hogy megvan.
- A hozzászóláshoz be kell jelentkezni
A harmadik kérdésedre... azt hiszem, nagyobb kódot kéne látni, legalább NEXT-BIT (L034E)-től, hogy újra összeálljon a kép a fejemben (kábé 30 éve elég jól ismertem ezt a kódrészletet ZX Spectrumban).
Byte beolvasásakor 1-es értékkel indítasz, az új olvasott bitet betolod jobbról, és nézed hogy balról ami kipottyan az mi, ha 1 akkor kész vagy a byte-tal, ha 0 akkor kell még további biteket olvasni. Ez az idézett kód alján, a BIT-DONE címke alatti rész.
Amit kérdezel, az szerintem azzal kapcsolatos, hogy egy bit olvasásához két ciklus is kell, először alacsony jelértéket olvasol és várod hogy magasra ugorjon (mérve az időt), majd utána magasat olvasol és várod hogy alacsonyba menjen. (Vagy fordítva, mittudomén.) És talán ezzel kapcsolatos az a C bit ellenőrzés, tehát hogy ennek a közepénél vagy végénél tartasz. De nem tudom, ehhez a teljes kódot kéne látni és végigbogarászni.
(Szerk: Nem tudom hogy a ZX-81 és a Spectrum azonos szalagformátumot használ-e. Illetve ha a leírásod helyes akkor úgy tűnik hogy nem.)
- A hozzászóláshoz be kell jelentkezni