Superscript für TURBO PASCAL
Ich fand den Artikel über Superscript so interessant, dass ich den Assemblerteil, an den Parameter übergeben werden, für TURBO PASCAL modifiziert habe.
Parameter bei BASIC und TURBO PASCAL
BASICTURBO PASCAL
CALL script(x%,y%,text$)procedure MCODE(x,y:byte;var msg:longstr); external $F000;
procedure script(x,y:byte;msg:longstr);
[Aus dem JOYCE BASIC Handbuch:] Das Kommando CALL spezifiziert die Adresse des Unterprogramms, optional gefolgt von einer Liste von Parametern. Die Adresse darf nur durch den Wert einer Variablen (auch eines Feldelements), nicht aber durch einen Ausdruck angegeben werden.
Variablen werden in der Weise übergeben, daß die Adresse des Wertes jedes Parameters übergeben wird; für einen String ist dieser Wert der String-Bezeichner. Anzahl und Typ der Parameter müssen im BASIC-Programm und in der Subroutine übereinstimmen; die Übereinstimmung wird nicht geprüft. Wenn möglich, werden die Adressen in Register übernommen, anderenfalls werden sie in einen Bereich des Speichers eingetragen.
Für Mallard-80 sind die Eingabebedingungen:

Bei drei oder weniger Parametern:
HLenthält die Adresse von Parameter 1 (falls vorhanden)
DEenthält die Adresse von Parameter 2 (falls vorhanden)
BCenthält die Adresse von Parameter 3 (falls vorhanden)

Bei vier oder mehr Parametern:
HLenthält die Adresse von Parameter 1
DEenthält die Adresse von Parameter 2
BCenthält die Adresse eines Speicherbereichs, der die Adressen der anderen Parameter enthält, z. B.:
 
2 BytesAdresse von Parameter nhohe Adresse
 ... 
 Adresse von Parameter 4 
 Adresse von Parameter 3niedrige Adresse
BC enthält dann die Adresse des niedrigstwertigen Bytes der Adresse von Parameter 3.
Die Prozedur script wird mit dem auf dem Stack abgelegten Text aufgerufen. Diese wiederum ruft die Prozedur MCODE auf, wobei nun der Text als Adressreferenz übergeben wird, was die Verabeitung der Parameter vereinfacht. Zu beachten ist, dass die Parameter in umgekehrter Reihenfolge vom Stack abgeholt werden müssen.
Parameterübergabe in BASICParameterübergabe in TURBO PASCAL
aufruf:
	ld	l,(hl)		; x-Position
	ld	a,(de)
	ld	h,a		; y-Position
	dec	l
	dec	h
	ld	(xypos),hl
	ld	l,c
	ld	h,b		; Zeiger auf Stringdeskriptor
	ld	a,(hl)		; Stringlaenge
	or	a
	ret	z		; -> zurueck, falls Stringlaenge 0
	ld	c,a
	ld	b,0
	ld	(strlen),a	; Stringlaenge speichern
	inc	hl
	ld	a,(hl)
	inc	hl
	ld	h,(hl)
	ld	l,a		; hl = Stringadresse
	ld	de,string
	ldir			; String in Common-Bereich uebertragen
	ld	bc,rout		; Adresse der aufzurufenden Routine
	call	xbios
	dw	00e9h		; Screen-Environment einschalten
	ret			; zurueck zu Basic
aufruf:
	pop	iy
	pop	de		; Zeiger auf String
	pop	bc		; y-Position
	pop	hl		; x-Position
	ld	h,c
	push	iy
	dec	l
	dec	h
	ld	(xypos),hl
	ex	de,hl		; Zeiger auf String
	ld	a,(hl)		; Stringlaenge
	or	a
	ret	z		; -> zurueck, falls Stringlaenge 0
	ld	c,a
	ld	b,0
	ld	(strlen),a	; Stringlaenge speichern
	inc	hl		; hl = Stringadresse
	ld	de,string
	ldir			; String in Common-Bereich uebertragen
	ld	bc,rout		; Adresse der aufzurufenden Routine
	call	xbios
	dw	00e9h		; Screen-Environment einschalten
	ret			; zurueck zu TURBO PASCAL
[TURBO PASCAL source] [Assembler source]