MPBASIC kann um neue Prozeduren/Funktionen erweitert werden. s. MPBASIC, Prozedurtabelle. 2021 habe ich mich mit dieser Thematik beschäftigt (→ Tiny, BASIC-Erweiterung).
Erstaunlicherweise sind in der Literatur jedoch keine Beispiele zu finden. Auch Informationen, welche Register nutzbar sind, fehlen. Teilweise stehen auch falsche oder fehlerhafte Angaben in der Literatur.
Hat die Funktion nur einen Eingabeparameter, wird dieser in RR4 übergeben.
Hat die Funktion nur einen Ausgabeparameter, wird dieser in RR2 zurückgegeben.
Prozeduren mit mehr Parametern s. Beispiel2.
Beispiel1:
simple Prozedur CLS, simple Funktion LET (nicht mit dem Kommando LET verwechseln!)
17/ 8000 : 03 43 4C 53 tab_prc: db 3,"CLS" 18/ 8004 : 80 0D dw p_cls 19/ 8006 : 03 4C 45 54 db 3,"LET" 20/ 800A : 80 13 dw f_let 21/ 800C : FF db 0FFh ; Listenende 28/ 800D : 29/ 800D : 5C 0C p_cls: ld r5, #12 ; cls 30/ 800F : D6 08 18 call putch 31/ 8012 : AF ret 32/ 8013 : 40/ 8013 : 28 E4 f_let: ld R2, R4 ; Y := X 41/ 8015 : 38 E5 ld R3, R5 42/ 8017 : AF ret
Der Hex-Code ist im Speicher an %8000 abzulegen.
Nutzung in BASIC
1 PROC SETRR[8,%8000];REM Erweiterung einbinden 10 PROC CLS 20 LET A=41,B=42 30 PRINT A,B 40 PROC [A]=LET[B];PRINT LET[A] 50 PRINT A,B ES4.0: 1OSETRR[8,%8000] 10OCLS 20LA=41,B=42 30PA,B 40O[A]=LET[B] 50PLET[A] 60PA,B 9999E
in Zeile 1 wird die Erweiterung aktiviert (Reg8+9 mit Adresse der externen Prozedurtabelle laden). Zeile 10 ruft die Prozedur „CLS“ auf. Zeile 40 demonstriert den Aufruf der Funktion „LET“ via PROC. Es passiert dasselbe wie bei LET A=B. Zeile 50 kopiert den Wert aus A in eine temporäre Variable, und diese wird ausgegeben. Es passiert also dasselbe wie bei PRINT A.
Beispiel2: mehr Parameter
Drei Ein- und drei Ausgabeparameter. Die Eingabeparameter werden den Ausgabeparametern zugewiesen (3faches LET).
109/ 801F : ;----------------------------------------------------------------------------- 110/ 801F : ; Beispiel 3 Ein- und Ausgabeparameter PROC [Y1,Y2,Y3] = para [X1,X2,X3] 111/ 801F : ; in X1, X2 auf Stack, RR4 = X3 112/ 801F : ; out Y1, Y2 auf Stack, RR2 = Y3 113/ 801F : ; SP returnadr. 114/ 801F : ; SP+2 Parameter X2 115/ 801F : ; SP+4 Parameter X1 116/ 801F : ; SP+6 (intern f. interpreter) 117/ 801F : ; SP+8 Platz f. Ergebnisvariable Y1 118/ 801F : ; SP+10 Platz f. Ergebnisvariable Y2 119/ 801F : ; Beim Ende muss der SP auf (intern f. interpreter) zeigen 121/ 801F : ;----------------------------------------------------------------------------- 122/ 801F : 123/ 801F : 50 E2 f_let3: pop R2 ; RR2 Rückkehradresse zum Interpreter 124/ 8021 : 50 E3 pop R3 125/ 8023 : 50 E6 pop R6 ; RR6 Adresse von X2 126/ 8025 : 50 E7 pop R7 127/ 8027 : 50 E8 pop R8 ; RR8 Adresse von X1 128/ 8029 : 50 E9 pop R9 129/ 802B : ;... 130/ 802B : A8 FE ld R10,gpr ; stack 131/ 802D : B8 FF ld R11,gpr+1 132/ 802F : 70 E3 push R3 ; Ret-Adr. wieder auf Stack 133/ 8031 : 70 E2 push R2 134/ 8033 : A0 EA incw RR10 ; (intern) übergehen 135/ 8035 : A0 EA incw RR10 136/ 8037 : 92 8A lde @RR10,R8 ; Y1 := X1 137/ 8039 : A0 EA incw RR10 138/ 803B : 92 9A lde @RR10,R9 139/ 803D : A0 EA incw RR10 140/ 803F : 92 6A lde @RR10,R6 ; Y2 := X2 141/ 8041 : A0 EA incw RR10 142/ 8043 : 92 7A lde @RR10,R7 143/ 8045 : 28 E4 ld R2,R4 ; Y3 := X3 144/ 8047 : 38 E5 ld R3,R5 145/ 8049 : AF ret 1
Nutzung in BASIC
1 PROC SETRR[8,%8000];REM Erweiterung einbinden 90 PROC[A,B,C]=LET3[%111,%222,%333] 100 PRINTHEX A,B,C ES4.0: 1OSETRR[8,%8000] 90O[A,B,C]=LET3[%111,%222,%333] 100HA,B,C 9999E
Parameterübergabe s. MPBASIC, Übergabe der Parameter.