A żeby ci jeszcze bardziej namieszać, to pokażę ci jeden z bardziej zaawansowanych kawałków, który pozwala na mieszanie kodu z danymi...
W głównej części programu można drukować teksty w taki sposób:
...
call print_text
db 22,18,0,"Napis w tresci",0
...
Wielokropki to oczywiście dowolny kod przed i po wydrukowaniu tekstu. A sama procedura drukowania wygląda tak:
print_text
pop hl
print_text2
ld a,(hl)
inc hl
or a
jr nz,print_text1
push hl
ret
print_text1
rst 16
jr print_text2
Procedury dostarczające w taki sposób statycznych parametrów są dość częstym rozwiązaniem w ROMie (RST 8, RST 28 - kalkulator itp).
Cały mechanizm polega na tym, że po CALL na stos odkładany jest adres powrotu, czyli adres następnego bajtu po trzybajtowej instrukcji. W procedurze podnosimy ten adres ze stosu i używamy go jako wskaźnika do tekstu. Jedyna istotna różnica to sposób powrotu - po odczytaniu ostatniego bajtu wskaźnik ustawia się na pierwszy bajt po tekście (a właściwie po znaczniku końca) a następnie jest odkładany na stos a RET działa dokładnie odwrotnie do CALL - podnosi adres ze stosu i skacze pod ten adres wracając do kolejnej instrukcji po tekście.
Powrót zamiast PUSH/RET można w tym wypadku wykonać też przez JP (HL), ale nie zawsze się da, bo nie zawsze wskaźnikiem do danych będzie HL.
Ot taki sobie - czasem przydatny - myk
