The following article was printed in November 1984 of the magazine „MC".
Find some routines typically used on a 6502 CPU.

Zero-Page-Adressierung beim Z80

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:
 ldb,(ix+(var8-varbgn))
oderld(ix+(var3-varbgn)),0
oderadda,(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.
Oliver Victor

Scanned by Werner Cirsovius
November 2002
© Franzis' Verlag