Change call to jmp and ret to dispatcher for the shorter math subroutines
authorNick Downing <nick@ndcode.org>
Fri, 21 Jun 2019 12:59:51 +0000 (22:59 +1000)
committerNick Downing <nick@ndcode.org>
Fri, 21 Jun 2019 12:59:51 +0000 (22:59 +1000)
sm3.asm

diff --git a/sm3.asm b/sm3.asm
index df94a6e..7bd4abf 100644 (file)
--- a/sm3.asm
+++ b/sm3.asm
@@ -163,12 +163,14 @@ page0_stkptr:
        jr      page0_dispatch1
 
 page0_stkld_w:
-       call    math_stkld_w
-       jr      page0_dispatch1
+       ;call   math_stkld_w
+       ;jr     page0_dispatch1
+       jp      math_stkld_w
 
 page0_imm_w:
-       call    math_imm_w
-       jr      page0_dispatch1
+       ;call   math_imm_w
+       ;jr     page0_dispatch1
+       jp      math_imm_w
 
 ; page 0 to 2
 
@@ -180,13 +182,14 @@ page0_page2:
        jr      page0_dispatch2
 
 page0_stkld_l:
-       call    math_stkld_l
-       jr      page0_dispatch2
-
+       ;call   math_stkld_l
+       ;jr     page0_dispatch2
+       jp      math_stkld_l
 
 page0_imm_l:
-       call    math_imm_l
-       jr      page0_dispatch2
+       ;call   math_imm_l
+       ;jr     page0_dispatch2
+       jp      math_imm_l
 
 ; page 1 interpreter
 ; word arithmetic operations
@@ -229,15 +232,15 @@ page1_jmp:
        jr      page1_dispatch0
 
 page1_stkst_w:
-       call    math_stkst_w
-       jr      page1_dispatch0
+       ;call   math_stkst_w
+       ;jr     page1_dispatch0
+       jp      math_stkst_w
 
 page1_st_w:
        pop     hl
-;      ld      (hl),e
-;      inc     hl
-;      ld      (hl),d
- call xxxmath_st_w
+       ld      (hl),e
+       inc     hl
+       ld      (hl),d
        jr      page1_dispatch0
 
 page1_imm_cmprev_sw:
@@ -245,16 +248,18 @@ page1_imm_cmprev_sw:
        .db     0x3e ; ld a,
 page1_cmp_sw:
        pop     hl
-       call    math_cmprev_sw
-       jr      page1_dispatch0
+       ;call   math_cmprev_sw
+       ;jr     page1_dispatch0
+       jp      math_cmprev_sw
 
 page1_imm_cmp_sw:
        rst     0x28
        .db     0x3e ; ld a,
 page1_cmprev_sw:
        pop     hl
-       call    math_cmp_sw
-       jr      page1_dispatch0
+       ;call   math_cmp_sw
+       ;jr     page1_dispatch0
+       jp      math_cmp_sw
 
 page1_imm_cmprev_uw:
        rst     0x28
@@ -285,31 +290,37 @@ page1_ld_w:
        jr      page1_dispatch1
 
 page1_imm_and_w:
-       call    math_and_imm_w
-       jr      page1_dispatch1
+       ;call   math_and_imm_w
+       ;jr     page1_dispatch1
+       jp      math_and_imm_w
 
 page1_and_w:
        pop     hl
-       call    math_and_w
-       jr      page1_dispatch1
+       ;call   math_and_w
+       ;jr     page1_dispatch1a
+       jp      math_and_w
 
 page1_imm_or_w:
-       call    math_or_imm_w
-       jr      page1_dispatch1
+       ;call   math_or_imm_w
+       ;jr     page1_dispatch1
+       jp      math_or_imm_w
 
 page1_or_w:
        pop     hl
-       call    math_or_w
-       jr      page1_dispatch1
+       ;call   math_or_w
+       ;jr     page1_dispatch1
+       jp      math_or_w
 
 page1_imm_xor_w:
-       call    math_xor_imm_w
-       jr      page1_dispatch1
+       ;call   math_xor_imm_w
+       ;jr     page1_dispatch1
+       jp      math_xor_imm_w
 
 page1_xor_w:
        pop     hl
-       call    math_xor_w
-       jr      page1_dispatch1
+       ;call   math_xor_w
+       ;jr     page1_dispatch1
+       jp      math_xor_w
 
 page1_imm_add_w:
        rst     0x28
@@ -429,8 +440,9 @@ page1_divrev_uw:
 
 page1_ld_l:
        ex      de,hl
-       call    math_ld_l
-       jr      page1_dispatch2
+       ;call   math_ld_l
+       ;jr     page1_dispatch2
+       jp      math_ld_l
 
 page1_imm_slrev_l:
        rst     0x38
@@ -509,75 +521,86 @@ page2_page0:
        jr      page2_dispatch0
 
 page2_stkst_l:
-       call    math_stkst_l
-       jr      page2_dispatch0
+       ;call   math_stkst_l
+       ;jr     page2_dispatch0
+       jp      math_stkst_l
 
 page2_st_l:
        pop     hl
-       call    math_st_l
-       jr      page2_dispatch0
+       ;call   math_st_l
+       ;jr     page2_dispatch0
+       jp      math_st_l
 
 page2_imm_cmprev_sl:
        rst     0x38
        .db     0x3e ; ld a,
 page2_cmp_sl:
        rst     0x30
-       call    math_cmprev_sl
-       jr      page2_dispatch0
+       ;call   math_cmprev_sl
+       ;jr     page2_dispatch0
+       jp      math_cmprev_sl
 
 page2_imm_cmprev_ul:
        rst     0x38
        .db     0x3e ; ld a,
 page2_cmp_ul:
        rst     0x30
-       call    math_cmprev_ul
-       jr      page2_dispatch0
+       ;call   math_cmprev_ul
+       ;jr     page2_dispatch0
+       jp      math_cmprev_ul
 
 page2_imm_cmp_sl:
        rst     0x38
        .db     0x3e ; ld a,
 page2_cmprev_sl:
        rst     0x30
-       call    math_cmp_sl
-       jr      page2_dispatch0
+       ;call   math_cmp_sl
+       ;jr     page2_dispatch0
+       jp      math_cmp_sl
 
 page2_imm_cmp_ul:
        rst     0x38
        .db     0x3e ; ld a,
 page2_cmprev_ul:
        rst     0x30
-       call    math_cmp_ul
-       jr      page2_dispatch0
-
+       ;call   math_cmp_ul
+       ;jr     page2_dispatch0
+       jp      math_cmp_ul
 
 ; page 2 to 2
 
 page2_imm_and_l:
-       call    math_and_imm_l
-       jr      page2_dispatch2
+       ;call   math_and_imm_l
+       ;jr     page2_dispatch2
+       jp      math_and_imm_l
 
 page2_and_l:
        rst     0x30
-       call    math_and_l
-       jr      page2_dispatch2
+       ;call   math_and_l
+       ;jr     page2_dispatch2
+       jp      math_and_l
 
 page2_imm_or_l:
-       call    math_or_imm_l
-       jr      page2_dispatch2
+       ;call   math_or_imm_l
+       ;jr     page2_dispatch2
+       jp      math_or_imm_l
 
 page2_or_l:
        rst     0x30
-       call    math_or_l
-       jr      page2_dispatch2
+       ;call   math_or_l
+       ;jr     page2_dispatch2
+       jp      math_or_l
 
 page2_imm_xor_l:
-       call    math_xor_imm_l
-       jr      page2_dispatch2
+       ;call   math_xor_imm_l
+       ;jr     page2_dispatch2
+       jp      math_xor_imm_l
 
 page2_xor_l:
        rst     0x30
-       call    math_xor_l
-       jr      page2_dispatch2
+       ;call   math_xor_l
+       ;jr     page2_dispatch2
+       jp      math_xor_l
 
 page2_imm_add_l:
        rst     0x38
@@ -726,6 +749,20 @@ test_lt:
 ; these can be duplicated without much cost, and will be called often, so the
 ; calling convention is geared to what the interpreter needs (de:hl' and so on)
 
+math_imm_w: ; immediate to de
+       ld      a,(bc)
+       inc     bc
+       ld      e,a
+       ld      a,(bc)
+       inc     bc
+       ld      d,a
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page1
+       jp      (hl)
+
 math_imm_l: ; immediate to de:hl'
        ld      a,(bc)
        inc     bc
@@ -737,14 +774,19 @@ math_imm_l: ; immediate to de:hl'
        exx
        ld      h,a
        exx
-math_imm_w: ; immediate to de
+;math_imm_w: ; immediate to de
        ld      a,(bc)
        inc     bc
        ld      e,a
        ld      a,(bc)
        inc     bc
        ld      d,a
-       ret
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page2
+       jp      (hl)
 
 math_stkld_w: ; sp(imm_w) to de
        ld      a,(bc)
@@ -758,7 +800,12 @@ math_stkld_w: ; sp(imm_w) to de
        ld      e,(hl)
        inc     hl
        ld      d,(hl)
-       ret
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page1
+       jp      (hl)
 
 math_stkld_l: ; sp(imm_w) to de:hl'
        ld      a,(bc)
@@ -782,7 +829,12 @@ math_ld_l: ; (hl) to de:hl'
        ld      e,(hl)
        inc     hl
        ld      d,(hl)
-       ret
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page2
+       jp      (hl)
 
 math_stkst_w: ; de to sp(imm_w)
        ld      a,(bc)
@@ -792,22 +844,15 @@ math_stkst_w: ; de to sp(imm_w)
        inc     bc
        ld      h,a
        add     hl,sp
-; use inline code for math_st_w
-xxxmath_st_w:
-.if 0
- call print_word
- ld a,':
- call print_char
- ex de,hl
- call print_word
- ex de,hl
- ld a,' 
- call print_char
-.endif
        ld      (hl),e
        inc     hl
        ld      (hl),d
-       ret
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page0
+       jp      (hl)
 
 math_stkst_l: ; de:hl' to sp(imm_w)
        ld      a,(bc)
@@ -848,7 +893,12 @@ math_st_l: ; de:hl' to (hl)
        ld      (hl),e
        inc     hl
        ld      (hl),d
-       ret
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page0
+       jp      (hl)
 
 math_and_imm_l: ; de:hl' &= imm_l
        ld      a,(bc)
@@ -872,7 +922,26 @@ math_and_imm_w: ; de &= imm_w
        inc     bc
        and     d
        ld      d,a
-       ret
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ;ld     h,page1
+       jp      (hl)
+
+math_and_w: ; de &= hl
+       ld      a,e
+       and     l
+       ld      e,a
+       ld      a,d
+       and     h
+       ld      d,a
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page1
+       jp      (hl)
 
 math_and_l: ; de:hl' &= hl:de'
        exx
@@ -883,14 +952,35 @@ math_and_l: ; de:hl' &= hl:de'
        and     d
        ld      h,a
        exx
-math_and_w: ; de &= hl
+;math_and_imm_w: ; de &= imm_w
        ld      a,e
        and     l
        ld      e,a
        ld      a,d
        and     h
        ld      d,a
-       ret
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page2
+       jp      (hl)
+
+math_or_imm_w: ; de |= imm_w
+       ld      a,(bc)
+       inc     bc
+       or      e
+       ld      e,a
+       ld      a,(bc)
+       inc     bc
+       or      d
+       ld      d,a
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page1
+       jp      (hl)
 
 math_or_imm_l: ; de:hl' |= imm_l
        ld      a,(bc)
@@ -905,7 +995,7 @@ math_or_imm_l: ; de:hl' |= imm_l
        or      h
        ld      h,a
        exx
-math_or_imm_w: ; de |= imm_w
+;math_or_imm_w: ; de |= imm_w
        ld      a,(bc)
        inc     bc
        or      e
@@ -914,7 +1004,26 @@ math_or_imm_w: ; de |= imm_w
        inc     bc
        or      d
        ld      d,a
-       ret
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ;ld     h,page2
+       jp      (hl)
+
+math_or_w: ; de |= hl
+       ld      a,e
+       or      l
+       ld      e,a
+       ld      a,d
+       or      h
+       ld      d,a
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page1
+       jp      (hl)
 
 math_or_l: ; de:hl' |= hl:de'
        exx
@@ -925,14 +1034,35 @@ math_or_l: ; de:hl' |= hl:de'
        or      d
        ld      h,a
        exx
-math_or_w: ; de |= hl
+;math_or_w: ; de |= hl
        ld      a,e
        or      l
        ld      e,a
        ld      a,d
        or      h
        ld      d,a
-       ret
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page2
+       jp      (hl)
+
+math_xor_imm_w: ; de ^= imm_w
+       ld      a,(bc)
+       inc     bc
+       xor     e
+       ld      e,a
+       ld      a,(bc)
+       inc     bc
+       xor     d
+       ld      d,a
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ;ld     h,page1
+       jp      (hl)
 
 math_xor_imm_l: ; de:hl' ^= imm_l
        ld      a,(bc)
@@ -947,7 +1077,7 @@ math_xor_imm_l: ; de:hl' ^= imm_l
        xor     h
        ld      h,a
        exx
-math_xor_imm_w: ; de ^= imm_w
+;math_xor_imm_w: ; de ^= imm_w
        ld      a,(bc)
        inc     bc
        xor     e
@@ -956,7 +1086,26 @@ math_xor_imm_w: ; de ^= imm_w
        inc     bc
        xor     d
        ld      d,a
-       ret
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ;ld     h,page2
+       jp      (hl)
+
+math_xor_w: ; de ^= hl
+       ld      a,e
+       xor     l
+       ld      e,a
+       ld      a,d
+       xor     h
+       ld      d,a
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page1
+       jp      (hl)
 
 math_xor_l: ; de:hl' ^= hl:de'
        exx
@@ -967,32 +1116,19 @@ math_xor_l: ; de:hl' ^= hl:de'
        xor     d
        ld      h,a
        exx
-math_xor_w: ; de ^= hl
+;math_xor_w: ; de ^= hl
        ld      a,e
        xor     l
        ld      e,a
        ld      a,d
        xor     h
        ld      d,a
-       ret
-
-; use inline code for math_add_imm_w, math_add_w
-
-math_add_l: ; hl:hl' += de:de'
-ret
-
-; use addition for math_sub_imm_w, math_sub_imm_l
-; use inline code for math_sub_w
-
-math_sub_l: ; de:hl' -= hl:de'
-       ex      de,hl
-       ret
-
-; use inline code for math_subrev_imm_w, math_subrev_w
-
-math_subrev_l: ; de:hl' = hl:de' - de:hl'
-       ex      de,hl
-       ret
+       ;ret
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page2
+       jp      (hl)
 
 math_cmp_sw: ; cf=1 de < hl, zf=1 de == hl, signed
        ex      de,hl
@@ -1001,9 +1137,15 @@ math_cmprev_sw: ; cf=1 hl < de, zf=1 hl == de, signed
        sbc     hl,de
        ld      a,h
        rla
-       ret     po
+       ;ret    po
+       jp      po,1$
        ccf
-       ret
+       ;ret
+1$:    ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page0
+       jp      (hl)
 
 ; use inline code for math_cmp_uw, math_cmprev_uw
 
@@ -1014,20 +1156,33 @@ math_cmp_sl: ; cf=1 de:hl' < hl:de', zf=1 de:hl' == hl:de', signed
        jr      z,cmp_l_entry
        ld      a,h
        rla
-       ret     po
+       ;ret    po
+       jp      po,1$
        ccf
-       ret
+       ;ret
+1$:    ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page0
+       jp      (hl)
 
 math_cmp_ul: ; cf=1 de:hl' < hl:de', zf=1 de:hl' == hl:de', unsigned
        ex      de,hl
        or      a
        sbc     hl,de
-       ret     nz
+       ;ret    nz
+       jr      nz,cmp_l_dispatch
 cmp_l_entry:
        exx
        sbc     hl,de
        exx
-       ret
+       ;ret
+cmp_l_dispatch:
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page0
+       jp      (hl)
 
 math_cmprev_sl: ; cf=1 hl:de' < de:hl', zf=1 hl:de' == de:hl', signed
        or      a
@@ -1035,20 +1190,33 @@ math_cmprev_sl: ; cf=1 hl:de' < de:hl', zf=1 hl:de' == de:hl', signed
        jr      z,cmprev_l_entry
        ld      a,h
        rla
-       ret     po
+       ;ret    po
+       jp      po,1$
        ccf
-       ret
+       ;ret
+1$:    ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page0
+       jp      (hl)
 
 math_cmprev_ul: ; cf=1 de:hl' < de:de', zf=1 de:hl' == hl:de', unsigned
        or      a
        sbc     hl,de
-       ret     nz
+       ;ret    nz
+       jr      nz,cmprev_l_dispatch
 cmprev_l_entry:
        exx
        ex      de,hl
        sbc     hl,de
        exx
-       ret
+       ;ret
+cmprev_l_dispatch:
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page0
+       jp      (hl)
 
 ; heavyweight routines
 
@@ -2635,12 +2803,12 @@ sm_main:
        .db     <page0_imm_w
        .dw     0
        .db     <page1_stkst_w
-       .dw     2+2
+       .dw     2;+2
 
 digit_loop:
        ; while i < 5
        .db     <page0_stkld_w
-       .dw     2+2
+       .dw     2;+2
        .db     <page1_imm_cmp_sw
        .dw     5
        .db     <page0_jge
@@ -2648,12 +2816,12 @@ digit_loop:
 
        ; get current value
        .db     <page0_stkld_w
-       .dw     0+2
+       .dw     0;+2
 
        ; get place value
        .db     <page1_page0
        .db     <page0_stkld_w
-       .dw     4+2
+       .dw     4;+2
        .db     <page1_imm_sl_w
        .dw     1
        .db     <page1_imm_add_w
@@ -2665,7 +2833,7 @@ digit_loop:
 
        ; replace current value with remainder
        .db     <page1_stkst_w
-       .dw     2+2
+       .dw     2;+2
 
        ; print quotient plus '0
        .db     <page0_page1
@@ -2678,11 +2846,11 @@ digit_loop:
 
        ; ++i
        .db     <page0_stkld_w
-       .dw     2+2
+       .dw     2;+2
        .db     <page1_imm_add_w
        .dw     1
        .db     <page1_stkst_w
-       .dw     2+2
+       .dw     2;+2
 
        ; loop
        .db     <page0_imm_jmp
@@ -2728,12 +2896,12 @@ digit_loope:
        .db     <page0_imm_w
        .dw     0
        .db     <page1_stkst_w
-       .dw     4+2
+       .dw     4;+2
 
 digit_loop2:
        ; while i < 10
        .db     <page0_stkld_w
-       .dw     4+2
+       .dw     4;+2
        .db     <page1_imm_cmp_sw
        .dw     10
        .db     <page0_jge
@@ -2741,12 +2909,12 @@ digit_loop2:
 
        ; get current value
        .db     <page0_stkld_l
-       .dw     0+2
+       .dw     0;+2
 
        ; get place value
        .db     <page2_page0
        .db     <page0_stkld_w
-       .dw     8+2
+       .dw     8;+2
        .db     <page1_imm_sl_w
        .dw     2
        .db     <page1_imm_add_w
@@ -2758,7 +2926,7 @@ digit_loop2:
 
        ; replace current value with remainder
        .db     <page2_stkst_l
-       .dw     4+2
+       .dw     4;+2
 
        ; print quotient plus '0
        .db     <page0_page1
@@ -2771,11 +2939,11 @@ digit_loop2:
 
        ; ++i
        .db     <page0_stkld_w
-       .dw     4+2
+       .dw     4;+2
        .db     <page1_imm_add_w
        .dw     1
        .db     <page1_stkst_w
-       .dw     4+2
+       .dw     4;+2
 
        ; loop
        .db     <page0_imm_jmp
@@ -2822,7 +2990,7 @@ place_values2:
 sm_factorial:
        ; get argument
        .db     <page0_stkld_w
-       .dw     4+2
+       .dw     4;+2
 
        ; is argument < 2?
        .db     <page1_imm_cmp_sw
@@ -2832,12 +3000,12 @@ sm_factorial:
 
        ; no, set up for *result =
        .db     <page0_stkld_w
-       .dw     2+2
+       .dw     2;+2
 
        ; get argument
        .db     <page1_page0
        .db     <page0_stkld_w
-       .dw     6+2
+       .dw     6;+2
 
        ; subtract 1
        .db     <page1_imm_add_w
@@ -2856,7 +3024,7 @@ sm_factorial:
 
        ; get argument
        .db     <page0_stkld_w
-       .dw     8+2
+       .dw     8;+2
 
        ; multiply
        .db     <page1_mul_w
@@ -2870,7 +3038,7 @@ sm_factorial:
 1$:
        ; yes, set up for *result =
        .db     <page0_stkld_w
-       .dw     2+2
+       .dw     2;+2
 
        ; set *result = 1
        .db     <page1_page0
@@ -2884,7 +3052,7 @@ sm_factorial:
 sm_factorial2:
        ; get argument
        .db     <page0_stkld_l
-       .dw     4+2
+       .dw     4;+2
 
        ; is argument < 2?
        .db     <page2_imm_cmp_sl
@@ -2895,12 +3063,12 @@ sm_factorial2:
 
        ; no, set up for *result =
        .db     <page0_stkld_w
-       .dw     2+2
+       .dw     2;+2
 
        ; get argument
        .db     <page1_page0
        .db     <page0_stkld_l
-       .dw     6+2
+       .dw     6;+2
 
        ; subtract 1
        .db     <page2_imm_add_l
@@ -2919,7 +3087,7 @@ sm_factorial2:
 
        ; get argument
        .db     <page0_stkld_l
-       .dw     10+2
+       .dw     10;+2
 
        ; multiply
        .db     <page2_mul_l
@@ -2933,7 +3101,7 @@ sm_factorial2:
 1$:
        ; yes, set up for *result =
        .db     <page0_stkld_w
-       .dw     2+2
+       .dw     2;+2
 
        ; set *result = 1
        .db     <page1_page0