Aus Gründen der Übersichtlichkeit werden in einem Assembler-Programm alle Variablen in einen aufeinanderfolgenden Block geschrieben.
Beim 6502-Prozessor liegen Sie in der Zero-Page und können mit vielen Befehlen direkt verarbeitet werden.
Beim Z80 bietet es sich an, eines der ohnehin oftmals brachliegenden Index-Register IX oder IY zu Anfang des Programms auf die Basis dieses Variablenblocks zu legen:
start: ld ix,varbgn ;Haupt-
... ... ;programm
... ...
varbgn: ;Variablen-
var1: defb 0 ;bereich
... ... .
varn: defb 0
Nun hat man die Möglichkeit, mit Hilfe des Index-Registers IX jede Variable direkt zu adressieren.
Den dazu benötigten Offset errechnet der Assembler:
| ld | b,(ix+(var8-varbgn)) |
oder | ld | (ix+(var3-varbgn)),0 |
oder | add | a,(ix+(var5-varbgn)) |
Mit diesem kleinen Trick genießt man den vollen Zero-Page-Komfort des 6502-Prozessors, denn fast alle Befehle des Z80 lassen sich auch über die Index-Register indiziert verwenden.
Obendrein verbraucht man weniger Speicherplatz als bei absoluter Adressierung.
Das „Häkchen" an der Sache sei an einem kleinen Programm demonstriert, dessen Resultat sogar routinierte Z80-Programmierer überraschen wird:
0100 DD 21 80 80 ld ix,8080H
0104 AF xor a
0105 32 0A 01 loop: ld (ireg+2),a
0108 DD 77 00 ireg: ld (ix+0),a
010B 3C inc a
010C 20 F7 jr nz,loop
010E FF rst 38
Nachdem man dieses Programm gestartet hat, wird man feststellen, daß der Bereich von 8080H bis 80FFH mit den Werten 00...7F gefüllt ist, wie man es erwartet hat.
Außerdem ist aber der Bereich von 8000H bis 807FH mit 80...FF belegt worden!
Man sieht also, daß der Offset des IX-Registers nicht nur positiv sein kann, sondern (wie bei relativen Sprüngen) auch negativ wirkt.
Dies ist aber in keinem Z80-Handbuch erwähnt, so daß es den Autor Stunden gekostet hat, den „Fehler" zu finden, der bei einem Offset >127 auftrat.
Der Assembler (hier: M80) bringt in diesem Fall übrigens keine Fehlermeldung.
Genauso akzeptiert er aber auch eine Formulierung, in der ein negativer Wert benutzt wird, wie z.B. „
ld b,(ix-5)
", prüft aber auch hier nicht den Oberlauf bei -129.
Die direkte Variablen-Adressierung ist eine angenehme Sache, die jeder ausprobieren sollte.
Es sollte lediglich darauf geachtet werden, daß bei System-CALLs das entsprechende Index-Register auf den Stack gerettet wird, da es im Betriebssystem verändert werden könnte.