The following article was printed in January 1981 of the magazine „MC".
A hint how to use the Z80 CPU calling subroutines.

Z-80-Programmier-Tip

Wie ein Unterprogramm merkt, wo man es hingeladen hat

Oft ist es von großem Vorteil, Unterprogramme zu haben, die ganz und gar unabhängig sind von einem bestimmten Speicherbereich, die von allgemeiner Bedeutung sind, wie etwa Ein-/Ausgaberoutinen usw., die man dann beliebig in jedes Programm einbinden kann. Das ist mit relativen Sprüngen beim Z80 leicht möglich. Wenn man dann aber aus diesem Unterprogramm heraus auf eine Monitor-Subroutine springen will, bei der man z.B. bei Textausgaben eine absolute Adresse übergeben muß, die Bestandteil des relokatiblen Unterprogramms ist, stößt man auf Schwierigkeiten. Woher weiß man beim Schreiben der Routine, auf welche Adresse der Datenbereich, den man ja mitverschieben will, später zu liegen kommt.

Eine Möglichkeit ist, zurückzuschauen, unter welcher Adresse das Unterprogramm aufgerufen wurde. Die Aufrufstelle hat man durch die Return-Adresse im Stack. Den Rest kann man durch die relative Distanz des Datenbereichs zur Anfangsadresse berechnen. Man muß lediglich die Reihenfolge im Stack etwas umordnen und am Schluß wieder rückwärts abspulen - so wird kein Register dabei zerstört. Alles weitere kann man aus dem Beispiel ersehen. Hier wurde die absolute Adresse im Register DE an die Monitor-Subroutine „MSG" übergeben. Sehr gut geeignet wäre auch das IX- oder lY-Register, da hier indizierte Adressierung möglich ist.
Karl Schedler

Programmbeispiel
„Rufendes" Hauptprogramm:
	...
	CALL	RELOC	;Aufruf
RETAD:	...
	...

Relokatibles Unterprogramm, eingebunden ab Adresse RELOC


RELOC:	EX	(SP),HL	;hole Return-Adr. rette HL
	PUSH	HL	;rette Return-Adr.
	PUSH	DE	;rette DE

	...

	DEC	HL	;MSB Aufruf-Adr.
	LD	D,(HL)
	DEC	HL	;LSB Aufruf-Adr.
	LD	E,(HL)	;RELOC in DE

	...

	LD	HL,MES-RELOC
	ADD	HL,DE	;berechne MES

	...

	EX	DE,HL
	CALL	MSG	;Aufruf MSG übergeben MES in DE

	...

MES:	DEFW		;Textzeichen

	...

ENDE:	POP	DE	;hole DE
	POP	HL	;hole Return-Adr.
	EX	(SP),HL	;hole HL, Push Return
	RET		;Adr. RETAD

Scanned by Werner Cirsovius
November 2002
© Franzis' Verlag