From 7d392f2d421ff33f3d7f7f6b4f1536ba0bcd564d Mon Sep 17 00:00:00 2001
From: David Schmenk <dschmenk@gmail.com>
Date: Mon, 27 Nov 2017 13:00:45 -0800
Subject: [PATCH] Reduce stack usage on (I)CALL

---
 src/vmsrc/plvm01.s  |  30 ++++-----
 src/vmsrc/plvm02.s  |  64 +++++++++---------
 src/vmsrc/plvm03.s  |  34 +++++-----
 src/vmsrc/plvm802.s | 159 +++++++++++++++++++++++++-------------------
 4 files changed, 154 insertions(+), 133 deletions(-)

diff --git a/src/vmsrc/plvm01.s b/src/vmsrc/plvm01.s
index cf1d8fb..c6468a9 100644
--- a/src/vmsrc/plvm01.s
+++ b/src/vmsrc/plvm01.s
@@ -891,19 +891,19 @@ CALL    +INC_IP
     +INC_IP
     LDA (IP),Y
     STA CALLADR+2
-    LDA IPH
-    PHA
-    LDA IPL
-    PHA
     TYA
+    CLC
+    ADC IPL
+    PHA
+    LDA IPH
+    ADC #$00
     PHA
 CALLADR JSR $FFFF
     PLA
-    TAY
+    STA IPH
     PLA
     STA IPL
-    PLA
-    STA IPH
+    LDY #$00
     JMP NEXTOP
 ;*
 ;* INDIRECT CALL TO ADDRESS (NATIVE CODE)
@@ -913,19 +913,19 @@ ICAL    LDA ESTKL,X
     LDA ESTKH,X
     STA ICALADR+2
     INX
-    LDA IPH
-    PHA
-    LDA IPL
-    PHA
     TYA
+    CLC
+    ADC IPL
+    PHA
+    LDA IPH
+    ADC #$00
     PHA
 ICALADR JSR $FFFF
     PLA
-    TAY
+    STA IPH
     PLA
     STA IPL
-    PLA
-    STA IPH
+    LDY #$00
     JMP NEXTOP
 ;*
 ;* ENTER FUNCTION WITH FRAME SIZE AND PARAM COUNT
@@ -941,9 +941,9 @@ ENTER   INY
     DEC IFPH
 +   INY
     LDA (IP),Y
+    BEQ +
     ASL
     TAY
-    BEQ +
 -   LDA ESTKH,X
     DEY
     STA (IFP),Y
diff --git a/src/vmsrc/plvm02.s b/src/vmsrc/plvm02.s
index 7278cf2..11b3d2d 100755
--- a/src/vmsrc/plvm02.s
+++ b/src/vmsrc/plvm02.s
@@ -1429,25 +1429,25 @@ CALL	+INC_IP
 	+INC_IP
 	LDA	(IP),Y
 	STA	TMPH
+    TYA
+    CLC
+    ADC IPL
+    PHA
 	LDA	IPH
-	PHA
-	LDA	IPL
-	PHA
-	TYA
+    ADC #$00
 	PHA
 	JSR	JMPTMP
-	PLA
-	TAY
+    PLA
+	STA	IPH
 	PLA
 	STA	IPL
-	PLA
-	STA	IPH
 	LDA	#>OPTBL		; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
 	STA	OPPAGE
 !IF SELFMODIFY {
     BIT	LCRWEN+LCBNK2
 	BIT	LCRWEN+LCBNK2
 }
+    LDY #$00
 	JMP	NEXTOP
 ;
 CALLX	+INC_IP
@@ -1456,29 +1456,29 @@ CALLX	+INC_IP
 	+INC_IP
 	LDA	(IP),Y
 	STA	TMPH
+    TYA
+    CLC
+    ADC IPL
+    PHA
 	LDA	IPH
-	PHA
-	LDA	IPL
-	PHA
-	TYA
+    ADC #$00
 	PHA
 	STA	ALTRDOFF
 	;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
 	JSR	JMPTMP
 	;SEI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
 	STA	ALTRDON
-	PLA
-	TAY
+    PLA
+	STA	IPH
 	PLA
 	STA	IPL
-	PLA
-	STA	IPH
 	LDA	#>OPXTBL	; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
 	STA	OPPAGE
 !IF SELFMODIFY {
     BIT	LCRWEN+LCBNK2
 	BIT	LCRWEN+LCBNK2
 }
+    LDY #$00
 	JMP	NEXTOP
 ;*
 ;* INDIRECT CALL TO ADDRESS (NATIVE CODE)
@@ -1488,25 +1488,25 @@ ICAL	LDA	ESTKL,X
 	LDA	ESTKH,X
 	STA	TMPH
 	INX
+    TYA
+    CLC
+    ADC IPL
+    PHA
 	LDA	IPH
-	PHA
-	LDA	IPL
-	PHA
-	TYA
+    ADC #$00
 	PHA
 	JSR	JMPTMP
-	PLA
-	TAY
+    PLA
+	STA	IPH
 	PLA
 	STA	IPL
-	PLA
-	STA	IPH
 	LDA	#>OPTBL		; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
 	STA	OPPAGE
 !IF SELFMODIFY {
     BIT	LCRWEN+LCBNK2
 	BIT	LCRWEN+LCBNK2
 }
+    LDY #$00
 	JMP	NEXTOP
 ;
 ICALX	LDA	ESTKL,X
@@ -1514,11 +1514,12 @@ ICALX	LDA	ESTKL,X
 	LDA	ESTKH,X
 	STA	TMPH
 	INX
+    TYA
+    CLC
+    ADC IPL
+    PHA
 	LDA	IPH
-	PHA
-	LDA	IPL
-	PHA
-	TYA
+    ADC #$00
 	PHA
 	STA	ALTRDOFF
 	;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
@@ -1526,17 +1527,16 @@ ICALX	LDA	ESTKL,X
 	;SEI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
 	STA	ALTRDON
 	PLA
-	TAY
+	STA	IPH
 	PLA
 	STA	IPL
-	PLA
-	STA	IPH
 	LDA	#>OPXTBL	; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
 	STA	OPPAGE
 !IF SELFMODIFY {
     BIT	LCRWEN+LCBNK2
 	BIT	LCRWEN+LCBNK2
 }
+    LDY #$00
 	JMP	NEXTOP
 ;*
 ;* JUMP INDIRECT TRHOUGH TMP
@@ -1559,9 +1559,9 @@ ENTER	INY
 	STA	IFPH
 	INY
 	LDA	(IP),Y
+    BEQ	+
 	ASL
 	TAY
-	BEQ	+
 -	LDA	ESTKH,X
 	DEY
 	STA	(IFP),Y
diff --git a/src/vmsrc/plvm03.s b/src/vmsrc/plvm03.s
index ee2e9f0..f2328b3 100644
--- a/src/vmsrc/plvm03.s
+++ b/src/vmsrc/plvm03.s
@@ -1048,23 +1048,23 @@ CALL    +INC_IP
         +INC_IP
         LDA     (IP),Y
         STA     CALLADR+2
-        LDA     IPX
+        TYA
+        CLC
+        ADC     IPL
         PHA
         LDA     IPH
+        ADC     #$00
         PHA
-        LDA     IPL
-        PHA
-        TYA
+        LDA     IPX
         PHA
 CALLADR JSR     $FFFF
         PLA
-        TAY
-        PLA
-        STA     IPL
+        STA     IPX
         PLA
         STA     IPH
         PLA
-        STA     IPX
+        STA     IPL
+        LDY     #$00
         JMP     NEXTOP
 ;*
 ;* INDIRECT CALL TO ADDRESS (NATIVE CODE)
@@ -1074,23 +1074,23 @@ ICAL    LDA     ESTKL,X
         LDA     ESTKH,X
         STA     ICALADR+2
         INX
-        LDA     IPX
+        TYA
+        CLC
+        ADC     IPL
         PHA
         LDA     IPH
+        ADC     #$00
         PHA
-        LDA     IPL
-        PHA
-        TYA
+        LDA     IPX
         PHA
 ICALADR JSR     $FFFF
         PLA
-        TAY
-        PLA
-        STA     IPL
+        STA     IPX
         PLA
         STA     IPH
         PLA
-        STA     IPX
+        STA     IPL
+        LDY     #$00
         JMP     NEXTOP
 ;*
 ;* ENTER FUNCTION WITH FRAME SIZE AND PARAM COUNT
@@ -1109,9 +1109,9 @@ ENTER   INY
         STA     IFPH
         INY
         LDA     (IP),Y
+        BEQ     +
         ASL
         TAY
-        BEQ     +
 -       LDA     ESTKH,X
         DEY
         STA     (IFP),Y
diff --git a/src/vmsrc/plvm802.s b/src/vmsrc/plvm802.s
index 48142eb..3fdf2d0 100755
--- a/src/vmsrc/plvm802.s
+++ b/src/vmsrc/plvm802.s
@@ -1114,118 +1114,133 @@ CALL    +INC_IP
         LDA     (IP16),Y
         STA     TMP
         +INC_IP
-EMUSTK  STY     IPY
-        SEC                     ; SWITCH TO EMULATED MODE
+EMUSTK  SEC                     ; SWITCH TO EMULATED MODE
         XCE
         !AS
-        TSX                     ; COPY HW EVAL STACK TO ZP EVAL STACK
-        TXA
+        STY     IPY
+        TSC                     ; MOVE HW EVAL STACK TO ZP EVAL STACK
+        EOR     #$FF
         SEC
-        SBC     HWSP
+        ADC     HWSP            ; STACK DEPTH = (HWSP - SP)/2
         LSR
-        LDX     ESP
+        EOR     #$FF
+        SEC
+        ADC     ESP             ; ESP - STACK DEPTH
         TAY
-        BEQ     +
--       DEX
-        PLA
+        TAX
+        BRA     +
+-       PLA
         STA     ESTKL,X
         PLA
         STA     ESTKH,X
-        DEY
+        INX
++       CPX     ESP
         BNE     -
-+       LDA     IP16H
-        PHA
-        LDA     IP16L
-        PHA
         LDA     IPY
+        CLC
+        ADC     IP16L
+        PHA
+        LDA     IP16H
+        ADC     #$00
         PHA
         PHX
+        TYX
         JSR     JMPTMP
-        PLY                     ; COPY RETURN VALUES TO HW EVAL STACK
+        PLY                     ; MOVE RETURN VALUES TO HW EVAL STACK
         STY     ESP
-        PLY
-        PLA
-        STA     IP16L
         PLA
         STA     IP16H
-        CPX     ESP
-        BEQ     +
--       LDA     ESTKH,X
+        PLA
+        STA     IP16L
+        STX     TMPL
+        TYX
+        BRA     +
+-       DEX
+        LDA     ESTKH,X
         PHA
         LDA     ESTKL,X
         PHA
-        INX
-        CPX     ESP
++       CPX     TMPL
         BNE     -
-+       CLC                     ; SWITCH BACK TO NATIVE MODE
+        CLC                     ; SWITCH BACK TO NATIVE MODE
         XCE
         REP     #$20            ; 16 BIT A/M
         SEP     #$10            ; 8 BIT X,Y
         !AL
+        TSX
+        STX     HWSP
         LDX     #>OPTBL         ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
         STX     OP16PAGE
+        LDY     #$00
         JMP     NEXTOP16
 ;
 CALLX   +INC_IP
         LDA     (IP16),Y
         STA     TMP
         +INC_IP
-EMUSTKX STY     IPY
-        SEC                     ; SWITCH TO EMULATED MODE
+EMUSTKX SEC                     ; SWITCH TO EMULATED MODE
         XCE
         !AS
-        TSX                     ; COPY HW EVAL STACK TO ZP EVAL STACK
-        TXA
+        STY     IPY
+        TSC                     ; MOVE HW EVAL STACK TO ZP EVAL STACK
+        EOR     #$FF
         SEC
-        SBC     HWSP
+        ADC     HWSP            ; STACK DEPTH = (HWSP - SP)/2
         LSR
-        LDX     ESP
+        EOR     #$FF
+        SEC
+        ADC     ESP             ; ESP - STACK DEPTH
         TAY
-        BEQ     +
--       DEX
-        PLA
+        TAX
+        BRA     +
+-       PLA
         STA     ESTKL,X
         PLA
         STA     ESTKH,X
-        DEY
+        INX
++       CPX     ESP
         BNE     -
-+       LDA     IP16H
-        PHA
-        LDA     IP16L
-        PHA
         LDA     IPY
+        CLC
+        ADC     IP16L
+        PHA
+        LDA     IP16H
+        ADC     #$00
         PHA
         PHX
+        TYX
         STX     ALTRDOFF
         ;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
         JSR     JMPTMP
         ;SEI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
         STX     ALTRDON
-        PLY                     ; COPY RETURN VALUES TO HW EVAL STACK
+        PLY                     ; MOVE RETURN VALUES TO HW EVAL STACK
         STY     ESP
-        PLY
-        PLA
-        STA     IP16L
         PLA
         STA     IP16H
-        CPX     ESP
-        BEQ     +
--       LDA     ESTKH,X
+        PLA
+        STA     IP16L
+        STX     TMPL
+        TYX
+        BRA     +
+-       DEX
+        LDA     ESTKH,X
         PHA
         LDA     ESTKL,X
         PHA
-        INX
-        CPX     ESP
++       CPX     TMPL
         BNE     -
-+       CLC                     ; SWITCH BACK TO NATIVE MODE
+        CLC                     ; SWITCH BACK TO NATIVE MODE
         XCE
         REP     #$20            ; 16 BIT A/M
         SEP     #$10            ; 8 BIT X,Y
         !AL
+        TSX
+        STX     HWSP
         LDX     #>OPXTBL         ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
         STX     OP16PAGE
+        LDY     #$00
         JMP     NEXTOP16
-
 ;*
 ;* INDIRECT CALL TO ADDRESS (NATIVE CODE)
 ;*
@@ -1260,10 +1275,10 @@ ENTER   INY
         !AS
         INY
         LDA     (IP16),Y
+        BEQ     +
         ASL
         TAY
-        BEQ     +
-        LDX     ESP
+        LDX     ESP             ; MOVE PARAMETERS TO CALL FRAME
 -       LDA     ESTKH,X
         DEY
         STA     (IFP),Y
@@ -1284,22 +1299,25 @@ LEAVEX  STX     ALTRDOFF
         ;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
 LEAVE   SEP     #$20            ; 8 BIT A/M
         !AS
-        TSX                     ; COPY HW EVAL STACK TO ZP EVAL STACK
-        TXA
-        LDX     ESP
+        TSC                     ; MOVE HW EVAL STACK TO ZP EVAL STACK
+        EOR     #$FF
         SEC
-        SBC     HWSP
+        ADC     HWSP            ; STACK DEPTH = (HWSP - SP)/2
         LSR
-        BEQ     +
+        EOR     #$FF
+        SEC
+        ADC     ESP             ; ESP - STACK DEPTH
         TAY
--       DEX
-        PLA
+        TAX
+        BRA     +
+-       PLA
         STA     ESTKL,X
         PLA
         STA     ESTKH,X
-        DEY
+        INX
++       CPX     ESP
         BNE     -
-+       PLA                     ; DEALLOCATE POOL + FRAME
+        PLA                     ; DEALLOCATE POOL + FRAME
         REP     #$20            ; 16 BIT A/M
         !AL
         AND     #$00FF
@@ -1316,22 +1334,25 @@ RETX    STX     ALTRDOFF
         ;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
 RET     SEP     #$20            ; 8 BIT A/M
         !AS
-        TSX                     ; COPY HW EVAL STACK TO ZP EVAL STACK
-        TXA
-        LDX     ESP
+        TSC                     ; MOVE HW EVAL STACK TO ZP EVAL STACK
+        EOR     #$FF
         SEC
-        SBC     HWSP
+        ADC     HWSP            ; STACK DEPTH = (HWSP - SP)/2
         LSR
-        BEQ     +
+        EOR     #$FF
+        SEC
+        ADC     ESP             ; ESP - STACK DEPTH
         TAY
--       DEX
-        PLA
+        TAX
+        BRA     +
+-       PLA
         STA     ESTKL,X
         PLA
         STA     ESTKH,X
-        DEY
+        INX
++       CPX     ESP
         BNE     -
-+       REP     #$20            ; 16 BIT A/M
+        REP     #$20            ; 16 BIT A/M
         !AL
         LDA     IFP             ; DEALLOCATE POOL
         STA     PP