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