Měl bych k tomu příkladu pár poznámek:
1. Ty dva znaky na konci tam máš proto, že po vykonání podprogramu TEXTOUT program normálně pokračuje tím, co následuje za instrukcí call TEXTOUT, a tedy vlastně znovu vykonává ten TEXTOUT. Řešení: instrukci ret, kterou máš teď úplně na konci, přesuň za call TEXTOUT, protože tady má správně ten program končit.
2. Chápu správně, že data defb 10,1 mají za cíl nastavit modrý inkoust? Pokud ano, tak tam má být buď defb 16,1 nebo hexadecimálně defb #10,1. Takhle to nedává smysl, a proto jsou tam ty otazníky na začátku.
3. Ty instrukce and a bit se obě zabývají nejvyšším bitem toho kterého bajtu, a podle tohoto bitu mají zřejmě za cíl poznat, kdy jsme dospěli na konec dat. Je to trochu zvláštní způsob, ale použít se dá. Musí se ale k poslednímu bajtu textových dat přičíst 128 (tedy dvojkově 10000000), čímž se jeho nejvyšší bit nastaví na 1. V tomhle případě tedy znak "m" nahradíme jeho hodnotou (109) zvýšenou o 128, což je 237.
Zkus to testnout:
ent $
call #D6B
ld a,2
call #1601
ld hl,TEXT1
call TEXTOUT
ret
TEXTOUT ld a,(hl)
and 127
rst 16
bit 7,(hl)
inc hl
jr z,TEXTOUT
ret
TEXT1 defb 22,15,10
defb 16,1
defm "ZX Spectru"
defb 237