Implement new calling convention with automatic C-style stack cleanup
authorNick Downing <nick@ndcode.org>
Sun, 16 Jun 2019 11:34:43 +0000 (21:34 +1000)
committerNick Downing <nick@ndcode.org>
Sun, 16 Jun 2019 11:34:43 +0000 (21:34 +1000)
sm2.asm

diff --git a/sm2.asm b/sm2.asm
index ecaf66d..adcd0c7 100644 (file)
--- a/sm2.asm
+++ b/sm2.asm
@@ -1140,6 +1140,7 @@ start:
        call    page0_jmp
        .db     <page0_imm_call
        .dw     sm_main
+       .dw     0
        .db     <page0_esc
        jp      0
 
@@ -1157,10 +1158,8 @@ sm_main:
        .dw     2
 
        ; call sm_factorial(argument)
-       .db     <page1_page0
-       .db     <page0_imm_call
+       .db     <page1_imm_call
        .dw     sm_factorial
-       .db     <page0_imm_stkadj
        .dw     4
 
        ; print 10000s
@@ -1173,10 +1172,8 @@ sm_main:
        .db     <page0_page1
        .db     page1_imm_add_w
        .dw     '0
-       .db     <page1_page0
-       .db     <page0_imm_call
+       .db     <page1_imm_call
        .dw     sm_print_char
-       .db     <page0_imm_stkadj
        .dw     2
 
        ; print 1000s
@@ -1189,10 +1186,8 @@ sm_main:
        .db     <page0_page1
        .db     page1_imm_add_w
        .dw     '0
-       .db     <page1_page0
-       .db     <page0_imm_call
+       .db     <page1_imm_call
        .dw     sm_print_char
-       .db     <page0_imm_stkadj
        .dw     2
 
        ; print 100s
@@ -1205,10 +1200,8 @@ sm_main:
        .db     <page0_page1
        .db     page1_imm_add_w
        .dw     '0
-       .db     <page1_page0
-       .db     <page0_imm_call
+       .db     <page1_imm_call
        .dw     sm_print_char
-       .db     <page0_imm_stkadj
        .dw     2
 
        ; print 10s
@@ -1221,10 +1214,8 @@ sm_main:
        .db     <page0_page1
        .db     page1_imm_add_w
        .dw     '0
-       .db     <page1_page0
-       .db     <page0_imm_call
+       .db     <page1_imm_call
        .dw     sm_print_char
-       .db     <page0_imm_stkadj
        .dw     2
 
        ; print 1s
@@ -1232,28 +1223,22 @@ sm_main:
        .dw     0
        .db     page1_imm_add_w
        .dw     '0
-       .db     <page1_page0
-       .db     <page0_imm_call
+       .db     <page1_imm_call
        .dw     sm_print_char
-       .db     <page0_imm_stkadj
        .dw     2
 
        ; print cr
        .db     <page0_imm_w
        .dw     0xd
-       .db     <page1_page0
-       .db     <page0_imm_call
+       .db     <page1_imm_call
        .dw     sm_print_char
-       .db     <page0_imm_stkadj
        .dw     2
 
        ; print lf
        .db     <page0_imm_w
        .dw     0xa
-       .db     <page1_page0
-       .db     <page0_imm_call
+       .db     <page1_imm_call
        .dw     sm_print_char
-       .db     <page0_imm_stkadj
        .dw     2
 
        ; destroy stack frame
@@ -1261,7 +1246,7 @@ sm_main:
        .dw     2
 
        ; return
-       .db     <page0_jmp
+       .db     <page0_ret
 
 sm_factorial:
  .db <page0_trace
@@ -1292,10 +1277,8 @@ sm_factorial:
        .dw     0
 
        ; call sm_factorial(argument - 1)
-       .db     <page1_page0
-       .db     <page0_imm_call
+       .db     <page1_imm_call
        .dw     sm_factorial
-       .db     <page0_imm_stkadj
        .dw     2
 
        ; get argument
@@ -1310,7 +1293,7 @@ sm_factorial:
 
        ; return
  .db <page0_trace
-       .db     <page0_jmp
+       .db     <page0_ret
 
 1$:
        ; yes, set up for *result =
@@ -1324,7 +1307,7 @@ sm_factorial:
 
        ; return
  .db <page0_trace
-       .db     <page0_jmp
+       .db     <page0_ret
 
 sm_print_char:
        .db     <page0_esc
@@ -1333,4 +1316,4 @@ sm_print_char:
        ld      a,(hl)
        call    print_char
        ld      h,page0
-       jp      page0_jmp
+       jp      page0_ret