Fix the result storage and dispatching after long add, mul and div
authorNick Downing <nick@ndcode.org>
Wed, 19 Jun 2019 07:18:40 +0000 (17:18 +1000)
committerNick Downing <nick@ndcode.org>
Wed, 19 Jun 2019 07:18:40 +0000 (17:18 +1000)
sm3.asm

diff --git a/sm3.asm b/sm3.asm
index f073a8d..f6ff0ac 100644 (file)
--- a/sm3.asm
+++ b/sm3.asm
@@ -475,7 +475,7 @@ mul_w_done:
 ; long arithmetic operations
 ; top stack long cached in de:hl'
 
-       .org    page2 * 0x100 - 12
+       .org    page2 * 0x100 - 13
 
 page2_dispatch0:
        ld      a,(bc)
@@ -484,6 +484,8 @@ page2_dispatch0:
        ld      h,page0
        jp      (hl)
 
+add_l_done:
+       ex      de,hl
 page2_dispatch2:
        ld      a,(bc)
        inc     bc
@@ -514,6 +516,39 @@ page2_st_l:
        call    math_st_l
        jr      page2_dispatch0
 
+page2_imm_cmprev_sl:
+       rst     0x38
+       .db     0x3e ; ld a,
+page2_cmp_sl:
+       rst     0x30
+       call    math_cmprev_sl
+       jr      page2_dispatch0
+
+page2_imm_cmprev_ul:
+       rst     0x38
+       .db     0x3e ; ld a,
+page2_cmp_ul:
+       rst     0x30
+       call    math_cmprev_ul
+       jr      page2_dispatch0
+
+page2_imm_cmp_sl:
+       rst     0x38
+       .db     0x3e ; ld a,
+page2_cmprev_sl:
+       rst     0x30
+       call    math_cmp_sl
+       jr      page2_dispatch0
+
+page2_imm_cmp_ul:
+       rst     0x38
+       .db     0x3e ; ld a,
+page2_cmprev_ul:
+       rst     0x30
+       call    math_cmp_ul
+       jr      page2_dispatch0
+
+
 ; page 2 to 2
 
 page2_imm_and_l:
@@ -548,54 +583,35 @@ page2_imm_add_l:
        .db     0x3e ; ld a,
 page2_add_l:
        rst     0x30
-       call    math_add_l
-       jr      page2_dispatch2
+       exx
+       add     hl,de
+       exx
+       adc     hl,de
+       jr      add_l_done
 
 page2_imm_subrev_l:
        rst     0x38
        .db     0x3e ; ld a,
 page2_sub_l:
        rst     0x30
-       call    math_subrev_l
-       jr      page2_dispatch2
+       exx
+       ex      de,hl
+       or      a
+       sbc     hl,de
+       exx
+       sbc     hl,de
+       jr      add_l_done
 
 ; use addition for page2_imm_sub_l
 page2_subrev_l:
        rst     0x30
-       call    math_sub_l
-       jr      page2_dispatch2
-
-page2_imm_cmprev_sl:
-       rst     0x38
-       .db     0x3e ; ld a,
-page2_cmp_sl:
-       rst     0x30
-       call    math_cmprev_sl
-       jr      page2_dispatch2
-
-page2_imm_cmprev_ul:
-       rst     0x38
-       .db     0x3e ; ld a,
-page2_cmp_ul:
-       rst     0x30
-       call    math_cmprev_ul
-       jr      page2_dispatch2
-
-page2_imm_cmp_sl:
-       rst     0x38
-       .db     0x3e ; ld a,
-page2_cmprev_sl:
-       rst     0x30
-       call    math_cmp_sl
-       jr      page2_dispatch2
-
-page2_imm_cmp_ul:
-       rst     0x38
-       .db     0x3e ; ld a,
-page2_cmprev_ul:
-       rst     0x30
-       call    math_cmp_ul
-       jr      page2_dispatch2
+       exx
+       or      a
+       sbc     hl,de
+       exx
+       ex      de,hl
+       sbc     hl,de
+       jr      add_l_done
 
 page2_imm_sl_l:
        rst     0x28
@@ -604,7 +620,7 @@ page2_slrev_l:
        pop     hl
        ex      de,hl
        call    math_sl_l
-       jr      page2_dispatch2
+       jr      mul_l_done
 
 page2_imm_sr_sl:
        rst     0x28
@@ -613,7 +629,7 @@ page2_srrev_sl:
        pop     hl
        ex      de,hl
        call    math_sr_sl
-       jr      page2_dispatch2h
+       jr      mul_l_done
 
 page2_imm_sr_ul:
        rst     0x28
@@ -622,16 +638,16 @@ page2_srrev_ul:
        pop     hl
        ex      de,hl
        call    math_sr_ul
-       jr      page2_dispatch2h
+       jr      mul_l_done
 
 page2_imm_mul_ul:
        call    math_mul_imm_l
-       jr      page2_dispatch2h
+       jr      mul_l_done
 
 page2_mul_l:
        rst     0x30
        call    math_mul_l
-       jr      page2_dispatch2h
+       jr      mul_l_done
 
 page1_imm_divrev_sl:
        rst     0x30
@@ -666,12 +682,13 @@ page1_divrev_ul:
        ex      de,hl
        call    math_div_ul
 div_l_done:
-       ex      de,hl
-       push    hl
+       push    de
        exx
        push    de
        exx
-page2_dispatch2h:
+mul_l_done:
+       ex      de,hl
+;page2_dispatch2h:
        ld      a,(bc)
        inc     bc
        ld      l,a
@@ -931,36 +948,19 @@ math_xor_w: ; de ^= hl
 
 ; use inline code for math_add_imm_w, math_add_w
 
-math_add_l: ; de:hl' += hl:de'
-       exx
-       add     hl,de
-       exx
-       adc     hl,de
-       ex      de,hl
-       ret
+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'
-       exx
-       or      a
-       sbc     hl,de
-       exx
-       ex      de,hl
-       sbc     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'
-       exx
-       ex      de,hl
-       or      a
-       sbc     hl,de
-       exx
-       sbc     hl,de
        ex      de,hl
        ret