Fix all relative jumps to be in range, debug multiply and divide calling stuff
authorNick Downing <nick@ndcode.org>
Wed, 19 Jun 2019 00:50:55 +0000 (10:50 +1000)
committerNick Downing <nick@ndcode.org>
Wed, 19 Jun 2019 00:50:55 +0000 (10:50 +1000)
sm3.asm

diff --git a/sm3.asm b/sm3.asm
index 06d1abe..f073a8d 100644 (file)
--- a/sm3.asm
+++ b/sm3.asm
-page0  =       1
-page1  =       2
-page2  =       3
+page0  =       2
+page1  =       4
+page2  =       6
 
        .area   SM (abs,ovr)
 
+       .org    0x100
+
+       ld      hl,restarts
+       ld      de,0x28
+       ld      bc,restarts_end - restarts
+       ldir
+
+       ld      bc,sm_start
+       jp      page0_dispatch0
+sm_start:
+       .db     <page0_imm_call
+       .dw     sm_main
+       .dw     0
+       .db     <page0_esc
+       jp      0
+
+restarts:
+       ; rst 0x28, immediate to hl
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      a,(bc)
+       inc     bc
+       ld      h,a
+       ret
+       .db     0
+       ; rst 0x30, pop hl:de'
+       pop     hl
+       exx
+       pop     de
+       exx
+       ex      (sp),hl
+       ret
+       .db     0,0
+       ; rst 0x38, immediate to hl:de'
+       ld      a,(bc)
+       inc     bc
+       exx
+       ld      e,a
+       exx
+       ld      a,(bc)
+       inc     bc
+       exx
+       ld      d,a
+       exx
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      a,(bc)
+       inc     bc
+       ld      h,a
+       ret
+restarts_end:
+
 ; page 0 interpreter
 ; stack and control transfer
 
-       .org    page0 * 0x100
+       .org    page0 * 0x100 - 18
 
-; administrative
+page0_dispatch0:
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page0
+       jp      (hl)
+
+page0_dispatch1:
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page1
+       jp      (hl)
+
+page0_dispatch2:
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page2
+       jp      (hl)
+
+; page 0 administrative
 
 page0_trace:
-       jp      start ; will be overwritten with print_trace
+       jp      print_trace
 
 page0_esc:
        ld      l,c
        ld      h,b
        jp      (hl)
 
-page0_page2:
-       exx
-       pop     hl
-       exx
-       inc     h ; page 1
-page0_page1:
-       pop     de
-       ld      a,(bc)
-       inc     bc
-       ld      l,a
-       inc     h ; page 1 (or 2 if came from page0_page2)
-       jp      (hl)
+; page 0 to 0
 
 page0_jeq:
        jr      nz,not_taken
@@ -55,6 +119,27 @@ page0_jge:
        jr      nc,page0_imm_jmp
        jr      not_taken
 
+page0_imm_call:
+       rst     0x28
+       push    bc
+       ld      c,l
+       ld      b,h
+       jr      page0_dispatch0
+
+page0_ret:
+       pop     bc
+page0_stkadj:
+       rst     0x28
+       add     hl,sp
+       ld      sp,hl
+       jr      page0_dispatch0
+
+; page 0 to 1
+
+page0_page1:
+       pop     de
+       jr      page0_dispatch1
+
 page0_peq:
        call    test_eq
        jr      page0_dispatch1
@@ -71,54 +156,34 @@ page0_pge:
        call    test_ge
        jr      page0_dispatch1
 
-page0_imm_call:
-       rst     0x28
-       push    bc
-       ld      c,l
-       ld      b,h
-       jr      page0_dispatch0
-
-page0_ret:
-       pop     bc
-page0_stkadj:
-       rst     0x28
-       add     hl,sp
-       ld      sp,hl
-page0_dispatch0:
-       ld      a,(bc)
-       inc     bc
-       ld      l,a
-       ld      h,page0
-       jp      (hl)
-
 page0_stkptr:
        rst     0x28
        add     hl,sp
        ex      de,hl
-page0_dispatch1:
-       ld      a,(bc)
-       inc     bc
-       ld      l,a
-       ld      h,page1
-       jp      (hl)
+       jr      page0_dispatch1
 
 page0_stkld_w:
        call    math_stkld_w
        jr      page0_dispatch1
 
-page0_stkld_l:
-       call    math_stkld_l
-page0_dispatch2:
-       ld      a,(bc)
-       inc     bc
-       ld      l,a
-       ld      h,page2
-       jp      (hl)
-
 page0_imm_w:
        call    math_imm_w
        jr      page0_dispatch1
 
+; page 0 to 2
+
+page0_page2:
+       exx
+       pop     hl
+       exx
+       pop     de
+       jr      page0_dispatch2
+
+page0_stkld_l:
+       call    math_stkld_l
+       jr      page0_dispatch2
+
+
 page0_imm_l:
        call    math_imm_l
        jr      page0_dispatch2
@@ -127,11 +192,31 @@ page0_imm_l:
 ; word arithmetic operations
 ; top stack word cached in de
 
-       .org    page1 * 0x100
+       .org    page1 * 0x100 - 13
+
+page1_dispatch0:
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page0
+       jp      (hl)
+
+add_w_done:
+       ex      de,hl
+page1_dispatch1:
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page1
+       jp      (hl)
+
+; page 1 administrative
 
 page1_trace:
        jp      print_trace
 
+; page 1 to 0
+
 page1_page0:
        push    de
        jr      page1_dispatch0
@@ -145,29 +230,7 @@ page1_jmp:
 
 page1_stkst_w:
        call    math_stkst_w
-page1_dispatch0:
-       ld      a,(bc)
-       inc     bc
-       ld      l,a
-       ld      h,page0
-       jp      (hl)
-
-page1_ld_w:
-       ex      de,hl
-       ld      e,(hl)
-       inc     hl
-       ld      d,(hl)
-       jr      page1_dispatch1
-
-page1_ld_l:
-       ex      de,hl
-       call    math_ld_l
-page1_dispatch2:
-       ld      a,(bc)
-       inc     bc
-       ld      l,a
-       ld      h,page2
-       jp      (hl)
+       jr      page1_dispatch0
 
 page1_st_w:
        pop     hl
@@ -176,6 +239,50 @@ page1_st_w:
        ld      (hl),d
        jr      page1_dispatch0
 
+page1_imm_cmprev_sw:
+       rst     0x28
+       .db     0x3e ; ld a,
+page1_cmp_sw:
+       pop     hl
+       call    math_cmprev_sw
+       jr      page1_dispatch0
+
+page1_imm_cmp_sw:
+       rst     0x28
+       .db     0x3e ; ld a,
+page1_cmprev_sw:
+       pop     hl
+       call    math_cmp_sw
+       jr      page1_dispatch0
+
+page1_imm_cmprev_uw:
+       rst     0x28
+       .db     0x3e ; ld a,
+page1_cmp_uw:
+       pop     hl
+       or      a
+       sbc     hl,de
+       jr      page1_dispatch0
+
+page1_imm_cmp_uw:
+       rst     0x28
+       .db     0x3e ; ld a,
+page1_cmprev_uw:
+       pop     hl
+       ex      de,hl
+       or      a
+       sbc     hl,de
+       jr      page1_dispatch0
+
+; page 1 to 1
+
+page1_ld_w:
+       ex      de,hl
+       ld      e,(hl)
+       inc     hl
+       ld      d,(hl)
+       jr      page1_dispatch1
+
 page1_imm_and_w:
        call    math_and_imm_w
        jr      page1_dispatch1
@@ -209,8 +316,7 @@ page1_imm_add_w:
 page1_add_w:
        pop     hl
        add     hl,de
-       ex      de,hl
-       jr      page1_dispatch1
+       jr      add_w_done
 
 page1_imm_subrev_w:
        rst     0x28
@@ -219,8 +325,7 @@ page1_sub_w:
        pop     hl
        or      a
        sbc     hl,de
-       ex      de,hl
-       jr      page1_dispatch1
+       jr      add_w_done
 
 ; use addition for page1_imm_sub_w
 page1_subrev_w:
@@ -228,203 +333,171 @@ page1_subrev_w:
        ex      de,hl
        or      a
        sbc     hl,de
-       ex      de,hl
-       jr      page1_dispatch1
-
-page1_imm_cmprev_sw:
-       rst     0x28
-       .db     0x3e ; ld a,
-page1_cmp_sw:
-       pop     hl
-       call    math_cmprev_sw
-       jr      page1_dispatch0
-
-page1_imm_cmp_sw:
-       rst     0x28
-       .db     0x3e ; ld a,
-page1_cmprev_sw:
-       pop     hl
-       call    math_cmp_sw
-       jr      page1_dispatch0
-
-page1_imm_cmprev_uw:
-       rst     0x28
-       .db     0x3e ; ld a,
-page1_cmp_uw:
-       pop     hl
-       or      a
-       sbc     hl,de
-       jr      page1_dispatch0
-
-page1_imm_cmp_uw:
-       rst     0x28
-       .db     0x3e ; ld a,
-page1_cmprev_uw:
-       pop     hl
-       ex      de,hl
-       or      a
-       sbc     hl,de
-       jr      page1_dispatch0
+       jr      add_w_done
 
 page1_imm_slrev_w:
        rst     0x28
        .db     0x3e ; ld a,
 page1_sl_w:
        pop     hl
-       call    math_slrev_w
-page1_dispatch1:
-       ld      a,(bc)
-       inc     bc
-       ld      l,a
-       ld      h,page1
-       jp      (hl)
+       call    math_sl_w
+       jr      mul_w_done
 
 page1_imm_sl_w:
-       ld      a,(bc)
-       inc     bc
-       ld      l,a
+       rst     0x28
        .db     0x3e ; ld a,
 page1_slrev_w:
        pop     hl
-       call    math_sl_w
-       jr      page1_dispatch1
-
-page1_imm_slrev_l:
-       ex      de,hl
-       call    math_imm_l
-       call    math_sl_l
-       jr      page1_dispatch2
-
-page1_sl_l:
-       exx
-       pop     hl
-       exx
-       pop     hl
-       call    math_sl_l0
-       jr      page1_dispatch2
+       call    math_sl_w0
+       jr      mul_w_done
 
 page1_imm_srrev_sw:
        rst     0x28
        .db     0x3e ; ld a,
 page1_sr_sw:
        pop     hl
-       call    math_srrev_sw
-       jr      page1_dispatch1
+       call    math_sr_sw
+       jr      mul_w_done
 
 page1_imm_sr_sw:
-       ld      a,(bc)
-       inc     bc
-       ex      de,hl
-       call    math_srrev_sw0
-       jr      page1_dispatch1
-
+       rst     0x28
+       .db     0x3e ; ld a,
 page1_srrev_sw:
        pop     hl
-       call    math_sr_sw
-       jr      page1_dispatch1
-
-page1_imm_srrev_sl:
-       ex      de,hl
-       call    math_imm_l
-       call    math_sr_sl
-       jr      page1_dispatch2
-
-page1_sr_sl:
-       exx
-       pop     hl
-       exx
-       pop     hl
-       call    math_sr_sl0
-       jr      page1_dispatch2
+       call    math_sr_sw0
+       jr      mul_w_done
 
 page1_imm_srrev_uw:
        rst     0x28
        .db     0x3e ; ld a,
 page1_sr_uw:
        pop     hl
-       call    math_srrev_uw
-       jr      page1_dispatch1
+       call    math_sr_uw
+       jr      mul_w_done
 
 page1_imm_sr_uw:
-       ld      a,(bc)
-       inc     bc
-       ex      de,hl
-       call    math_srrev_uw0
-       jr      page1_dispatch1
-
+       rst     0x28
+       .db     0x3e ; ld a,
 page1_srrev_uw:
        pop     hl
-       call    math_sr_uw
-       jr      page1_dispatch1
-
-page1_imm_srrev_ul:
-       ex      de,hl
-       call    math_imm_l
-       call    math_sr_ul
-       jr      page1_dispatch2
-
-page1_sr_ul:
-       exx
-       pop     hl
-       exx
-       pop     hl
-       call    math_sr_ul0
-       jr      page1_dispatch2
+       call    math_sr_uw0
+       jr      mul_w_done
 
 page1_imm_mul_uw:
        call    math_mul_imm_w
-       jr      page1_dispatch1
+       jr      mul_w_done
 
 page1_mul_w:
        pop     hl
        call    math_mul_w
-       jr      page1_dispatch1
+       jr      mul_w_done
 
 page1_imm_divrev_sw:
        rst     0x28
        .db     0x3e ; ld a,
 page1_div_sw:
        pop     hl
-       call    math_divrev_sw
-       push    hl
-       jr      page1_dispatch1
+       call    math_div_sw
+       jr      div_w_done
 
 page1_imm_div_sw:
        rst     0x28
        .db     0x3e ; ld a,
 page1_divrev_sw:
        pop     hl
-       call    math_div_sw
-       push    hl
-       jr      page1_dispatch1
+       call    math_div_sw0
+       jr      div_w_done
 
 page1_imm_divrev_uw:
        rst     0x28
        .db     0x3e ; ld a,
 page1_div_uw:
        pop     hl
-       call    math_divrev_uw
-       push    hl
-       jr      page1_dispatch1
+       call    math_div_uw
+       jr      div_w_done
 
 page1_imm_div_uw:
        rst     0x28
        .db     0x3e ; ld a,
 page1_divrev_uw:
        pop     hl
-       call    math_div_uw
-       push    hl
-       jr      page1_dispatch1
+       call    math_div_uw0
+       jr      div_w_done
+
+; page 1 to 2
+
+page1_ld_l:
+       ex      de,hl
+       call    math_ld_l
+       jr      page1_dispatch2
+
+page1_imm_slrev_l:
+       rst     0x38
+       .db     0x3e ; ld a,
+page1_sl_l:
+       rst     0x30
+       call    math_sl_l0
+       jr      page1_dispatch2
+
+page1_imm_srrev_sl:
+       rst     0x38
+       .db     0x3e ; ld a,
+page1_sr_sl:
+       rst     0x30
+       call    math_sr_sl0
+       jr      page1_dispatch2
+
+page1_imm_srrev_ul:
+       rst     0x38
+       .db     0x3e ; ld a,
+page1_sr_ul:
+       rst     0x30
+       call    math_sr_ul0
+page1_dispatch2:
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page2
+       jp      (hl)
+
+div_w_done:
+       push    de
+mul_w_done:
+       ex      de,hl
+;page1_dispatch1h:
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page1
+       jp      (hl)
+
+; page 2 interpreter
+; long arithmetic operations
+; top stack long cached in de:hl'
+
+       .org    page2 * 0x100 - 12
+
+page2_dispatch0:
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page0
+       jp      (hl)
 
-; page 2 interpreter
-; long arithmetic operations
-; top stack long cached in de:hl'
+page2_dispatch2:
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page2
+       jp      (hl)
 
-       .org    page2 * 0x100
+; page 2 administrative
 
 page2_trace:
        jp      print_trace
 
+; page 2 to 0
+
 page2_page0:
        push    de
        exx
@@ -434,27 +507,21 @@ page2_page0:
 
 page2_stkst_l:
        call    math_stkst_l
-page2_dispatch0:
-       ld      a,(bc)
-       inc     bc
-       ld      l,a
-       ld      h,page0
-       jp      (hl)
+       jr      page2_dispatch0
 
 page2_st_l:
        pop     hl
        call    math_st_l
        jr      page2_dispatch0
 
+; page 2 to 2
+
 page2_imm_and_l:
        call    math_and_imm_l
        jr      page2_dispatch2
 
 page2_and_l:
-       exx
-       pop     de
-       exx
-       pop     hl
+       rst     0x30
        call    math_and_l
        jr      page2_dispatch2
 
@@ -463,10 +530,7 @@ page2_imm_or_l:
        jr      page2_dispatch2
 
 page2_or_l:
-       exx
-       pop     de
-       exx
-       pop     hl
+       rst     0x30
        call    math_or_l
        jr      page2_dispatch2
 
@@ -475,10 +539,7 @@ page2_imm_xor_l:
        jr      page2_dispatch2
 
 page2_xor_l:
-       exx
-       pop     de
-       exx
-       pop     hl
+       rst     0x30
        call    math_xor_l
        jr      page2_dispatch2
 
@@ -536,124 +597,86 @@ page2_cmprev_ul:
        call    math_cmp_ul
        jr      page2_dispatch2
 
-page1_imm_sl_l:
-       ld      a,(bc)
-       inc     bc
-       ld      l,a
+page2_imm_sl_l:
+       rst     0x28
        .db     0x3e ; ld a,
 page2_slrev_l:
        pop     hl
-       call    math_sl_l
-page2_dispatch2:
-       ld      a,(bc)
-       inc     bc
-       ld      l,a
-       ld      h,page2
-       jp      (hl)
-
-page2_imm_sr_sl:
-       ld      a,(bc)
-       inc     bc
        ex      de,hl
-       call    math_sr_sl1
+       call    math_sl_l
        jr      page2_dispatch2
 
+page2_imm_sr_sl:
+       rst     0x28
+       .db     0x3e ; ld a,
 page2_srrev_sl:
        pop     hl
+       ex      de,hl
        call    math_sr_sl
-       jr      page2_dispatch2
+       jr      page2_dispatch2h
 
 page2_imm_sr_ul:
-       ld      a,(bc)
-       inc     bc
-       ex      de,hl
-       call    math_sr_ul1
-       jr      page2_dispatch2
-
+       rst     0x28
+       .db     0x3e ; ld a,
 page2_srrev_ul:
        pop     hl
+       ex      de,hl
        call    math_sr_ul
-       jr      page2_dispatch2
+       jr      page2_dispatch2h
 
 page2_imm_mul_ul:
        call    math_mul_imm_l
-       jr      page2_dispatch2
+       jr      page2_dispatch2h
 
 page2_mul_l:
-       exx
-       pop     de
-       exx
-       pop     hl
+       rst     0x30
        call    math_mul_l
-       jr      page2_dispatch2
-
-page2_imm_divrev_sl:
-       exx
-       ex      de,hl
-       exx
-       call    math_imm_l
-       jr      div_sl_entry
+       jr      page2_dispatch2h
 
-page2_div_sl:
-       exx
-       ex      de,hl
-       pop     hl
-       exx
-       pop     hl
-div_sl_entry:
+page1_imm_divrev_sl:
+       rst     0x30
+       .db     0x3e ; ld a,
+page1_div_sl:
+       rst     0x38
        call    math_div_sl0
-div_sl_done:
-       push    hl
-       exx
-       push    de
-       exx
-       jr      page2_dispatch2
-
-page2_imm_div_sl:
-       call    math_div_imm_sl
-       jr      div_sl_done
+       jr      div_l_done
 
-page2_divrev_sl:
-       exx
-       pop     de
-       exx
-       pop     hl
+page1_imm_div_sl:
+       rst     0x30
+       .db     0x3e ; ld a,
+page1_divrev_sl:
+       rst     0x38
+       ex      de,hl
        call    math_div_sl
-       jr      div_sl_done
+       jr      div_l_done
 
-page2_imm_divrev_ul:
-       exx
-       ex      de,hl
-       exx
-       call    math_imm_l
-       jr      div_ul_entry
+page1_imm_divrev_ul:
+       rst     0x30
+       .db     0x3e ; ld a,
+page1_div_ul:
+       rst     0x38
+       call    math_div_ul0
+       jr      div_l_done
 
-page2_div_ul:
-       exx
+page1_imm_div_ul:
+       rst     0x30
+       .db     0x3e ; ld a,
+page1_divrev_ul:
+       rst     0x38
+       ex      de,hl
+       call    math_div_ul
+div_l_done:
        ex      de,hl
-       pop     hl
-       exx
-       pop     hl
-div_ul_entry:
-       call    math_div_ul0
-div_ul_done:
        push    hl
        exx
        push    de
        exx
-       jr      page2_dispatch2
-
-page2_imm_div_ul:
-       call    math_div_imm_ul
-       jr      div_ul_done
-
-page2_divrev_ul:
-       exx
-       pop     de
-       exx
-       pop     hl
-       call    math_div_ul
-       jr      div_ul_done
+page2_dispatch2h:
+       ld      a,(bc)
+       inc     bc
+       ld      l,a
+       ld      h,page2
+       jp      (hl)
 
 ; conditionals
 
@@ -908,8 +931,6 @@ math_xor_w: ; de ^= hl
 
 ; use inline code for math_add_imm_w, math_add_w
 
-math_add_imm_l: ; de:hl' += imm_l
-       call    math_imm_l0
 math_add_l: ; de:hl' += hl:de'
        exx
        add     hl,de
@@ -933,8 +954,6 @@ math_sub_l: ; de:hl' -= hl:de'
 
 ; use inline code for math_subrev_imm_w, math_subrev_w
 
-math_subrev_imm_l: ; de:hl' = imm_l - de:hl'
-       call    math_imm_l0
 math_subrev_l: ; de:hl' = hl:de' - de:hl'
        exx
        ex      de,hl
@@ -945,10 +964,8 @@ math_subrev_l: ; de:hl' = hl:de' - de:hl'
        ex      de,hl
        ret
 
-; use rst 8 then math_cmp_sw for math_cmp_imm_sw
 math_cmp_sw: ; cf=1 de < hl, zf=1 de == hl, signed
        ex      de,hl
-; use rst 8 then math_cmprev_sw for math_cmprev_imm_sw
 math_cmprev_sw: ; cf=1 hl < de, zf=1 hl == de, signed
        or      a
        sbc     hl,de
@@ -958,11 +975,8 @@ math_cmprev_sw: ; cf=1 hl < de, zf=1 hl == de, signed
        ccf
        ret
 
-; use rst 8 then inline code for math_cmp_imm_uw, math_cmprev_imm_uw
 ; use inline code for math_cmp_uw, math_cmprev_uw
 
-math_cmp_imm_sl: ; cf=1 de:hl' < imm_l, zf=1 de:hl' == imm_l, signed
-       call    math_imm_l0
 math_cmp_sl: ; cf=1 de:hl' < hl:de', zf=1 de:hl' == hl:de', signed
        ex      de,hl
        or      a
@@ -974,8 +988,6 @@ math_cmp_sl: ; cf=1 de:hl' < hl:de', zf=1 de:hl' == hl:de', signed
        ccf
        ret
 
-math_cmp_imm_ul: ; cf=1 de:hl' < imm_l, zf=1 de:hl' == imm_l, unsigned
-       call    math_imm_l0
 math_cmp_ul: ; cf=1 de:hl' < hl:de', zf=1 de:hl' == hl:de', unsigned
        ex      de,hl
        or      a
@@ -987,8 +999,6 @@ cmp_l_entry:
        exx
        ret
 
-math_cmprev_imm_sl: ; cf=1 hl:de' < imm_l, zf=1 hl:de' == imm_l, signed
-       call    math_imm_l0
 math_cmprev_sl: ; cf=1 hl:de' < de:hl', zf=1 hl:de' == de:hl', signed
        or      a
        sbc     hl,de
@@ -999,8 +1009,6 @@ math_cmprev_sl: ; cf=1 hl:de' < de:hl', zf=1 hl:de' == de:hl', signed
        ccf
        ret
 
-math_cmprev_imm_ul: ; cf=1 de:hl' < imm_l, zf=1 de:hl' == imm_l, unsigned
-       call    math_imm_l0
 math_cmprev_ul: ; cf=1 de:hl' < de:de', zf=1 de:hl' == hl:de', unsigned
        or      a
        sbc     hl,de
@@ -1315,7 +1323,6 @@ math_mul_w: ; hl *= de
        ld      hl,0
        call    mul_w0
        pop     af
-       call    mul_w
 mul_w: ; bit 0
        add     hl,hl
 mul_w0:        rla
@@ -1927,27 +1934,41 @@ div_l_n:
        sbc     hl,de
        jr      div_l_n_done
 
-div_l_nn: ; negative dividend, negative divisor
-       call    div_l_n0
+math_div_ul0: ; hl:hl', de:de' = hl:de' % de:hl', hl:de' / de:hl', unsigned
+       exx
+       ex      de,hl
+       exx
+math_div_ul: ; ; hl:hl', de:de' = hl:hl' % de:de', hl:hl' / de:de', unsigned
+       push    bc
+       exx
+       ld      c,l
+       ld      b,h
+       ld      hl,0
+       exx
+       ld      a,h
+       ld      c,l
+       ld      hl,0
+div_l_pp: ; positive dividend, positive divisor
+       call    div_l0
        ld      b,a
        ld      a,c
-       call    div_l_ncf
+       call    div_lcf
        ld      c,a
        exx
        ld      a,b
        exx
-       call    div_l_ncf
+       call    div_lcf
        exx
        ld      b,a
        ld      a,c
        exx
-       call    div_l_ncf
-       jr      nc,div_l_n_done
+       call    div_lcf
+       jr      nc,div_l_p_done
        exx
        add     hl,de
        exx
        adc     hl,de
-div_l_n_done:
+div_l_p_done:
        exx
        ld      e,a
        ld      d,b
@@ -1955,51 +1976,29 @@ div_l_n_done:
        ld      e,c
        ld      d,b
        pop     bc
-inc_l:                                 ; get into range divisor+1..0
-       exx
-       inc     hl
-       ld      a,l
-       or      h
-       exx
-       ret     nz
-       inc     hl
        ret
 
-math_div_ul0: ; hl:hl', de:de' = hl:de' % de:hl', hl:de' / de:hl', unsigned
-       exx
-       ex      de,hl
-       exx
-math_div_ul: ; ; hl:hl', de:de' = hl:hl' % de:de', hl:hl' / de:de', unsigned
-       push    bc
-       exx
-       ld      c,l
-       ld      b,h
-       ld      hl,0
-       exx
-       ld      a,h
-       ld      c,l
-       ld      hl,0
-div_l_pp: ; positive dividend, positive divisor
-       call    div_l0
+div_l_nn: ; negative dividend, negative divisor
+       call    div_l_n0
        ld      b,a
        ld      a,c
-       call    div_lcf
+       call    div_l_ncf
        ld      c,a
        exx
        ld      a,b
        exx
-       call    div_lcf
+       call    div_l_ncf
        exx
        ld      b,a
        ld      a,c
        exx
-       call    div_lcf
-       jr      nc,div_l_p_done
+       call    div_l_ncf
+       jr      nc,div_l_n_done
        exx
        add     hl,de
        exx
        adc     hl,de
-div_l_p_done:
+div_l_n_done:
        exx
        ld      e,a
        ld      d,b
@@ -2007,6 +2006,14 @@ div_l_p_done:
        ld      e,c
        ld      d,b
        pop     bc
+inc_l:                                 ; get into range divisor+1..0
+       exx
+       inc     hl
+       ld      a,l
+       or      h
+       exx
+       ret     nz
+       inc     hl
        ret
 
 dec_l:
@@ -2022,8 +2029,10 @@ dec_l:
 ; non-restoring division routine
 ; see earlier comments for the word version, this extends the concept to long
 
+; changed all jr to jp, revisit this
+
 div_lcf:
-       jr      c,div_l1
+       jp      c,div_l1
 div_l0: ; bit 0, above
        scf
        rla
@@ -2035,7 +2044,7 @@ div_l0: ; bit 0, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      nc,div_l01
+       jp      nc,div_l01
        dec     a
 div_l11: ; bit 1, below
        add     a,a
@@ -2047,7 +2056,7 @@ div_l11: ; bit 1, below
        add     hl,de
        exx
        adc     hl,de
-       jr      nc,div_l12
+       jp      nc,div_l12
        inc     a
 div_l02: ; bit 2, above
        add     a,a
@@ -2059,7 +2068,7 @@ div_l02: ; bit 2, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      nc,div_l03
+       jp      nc,div_l03
        dec     a
 div_l13: ; bit 3, below
        add     a,a
@@ -2071,7 +2080,7 @@ div_l13: ; bit 3, below
        add     hl,de
        exx
        adc     hl,de
-       jr      nc,div_l14
+       jp      nc,div_l14
        inc     a
 div_l04: ; bit 4, above
        add     a,a
@@ -2083,7 +2092,7 @@ div_l04: ; bit 4, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      nc,div_l05
+       jp      nc,div_l05
        dec     a
 div_l15: ; bit 5, below
        add     a,a
@@ -2095,7 +2104,7 @@ div_l15: ; bit 5, below
        add     hl,de
        exx
        adc     hl,de
-       jr      nc,div_l16
+       jp      nc,div_l16
        inc     a
 div_l06: ; bit 6, above
        add     a,a
@@ -2107,7 +2116,7 @@ div_l06: ; bit 6, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      nc,div_l07
+       jp      nc,div_l07
        dec     a
 div_l17: ; bit 7, below
        add     a,a
@@ -2119,7 +2128,7 @@ div_l17: ; bit 7, below
        add     hl,de
        exx
        adc     hl,de
-       jr      nc,div_l18
+       jp      nc,div_l18
        inc     a
 div_l08: ; done, above
        add     a,a
@@ -2137,7 +2146,7 @@ div_l1: ; bit 0, below
        add     hl,de
        exx
        adc     hl,de
-       jr      nc,div_l11
+       jp      nc,div_l11
        inc     a
 div_l01: ; bit 1, above
        add     a,a
@@ -2149,7 +2158,7 @@ div_l01: ; bit 1, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      nc,div_l02
+       jp      nc,div_l02
        dec     a
 div_l12: ; bit 2, below
        add     a,a
@@ -2161,7 +2170,7 @@ div_l12: ; bit 2, below
        add     hl,de
        exx
        adc     hl,de
-       jr      nc,div_l13
+       jp      nc,div_l13
        inc     a
 div_l03: ; bit 3, above
        add     a,a
@@ -2173,7 +2182,7 @@ div_l03: ; bit 3, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      nc,div_l04
+       jp      nc,div_l04
        dec     a
 div_l14: ; bit 4, below
        add     a,a
@@ -2185,7 +2194,7 @@ div_l14: ; bit 4, below
        add     hl,de
        exx
        adc     hl,de
-       jr      nc,div_l15
+       jp      nc,div_l15
        inc     a
 div_l05: ; bit 5, above
        add     a,a
@@ -2197,7 +2206,7 @@ div_l05: ; bit 5, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      nc,div_l06
+       jp      nc,div_l06
        dec     a
 div_l16: ; bit 6, below
        add     a,a
@@ -2209,7 +2218,7 @@ div_l16: ; bit 6, below
        add     hl,de
        exx
        adc     hl,de
-       jr      nc,div_l17
+       jp      nc,div_l17
        inc     a
 div_l07: ; bit 7, above
        add     a,a
@@ -2221,7 +2230,7 @@ div_l07: ; bit 7, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      nc,div_l08
+       jp      nc,div_l08
        dec     a
 div_l18: ; done, below
        add     a,a
@@ -2234,7 +2243,7 @@ div_l18: ; done, below
 ; see earlier comments for the word version, this extends the concept to long
 
 div_l_ncf:
-       jr      c,div_l_n1
+       jp      c,div_l_n1
 div_l_n0: ; bit 0, above
        scf
        rla
@@ -2247,7 +2256,7 @@ div_l_n0: ; bit 0, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      c,div_l_n01
+       jp      c,div_l_n01
        dec     a
 div_l_n11: ; bit 1, below
        add     a,a
@@ -2259,7 +2268,7 @@ div_l_n11: ; bit 1, below
        add     hl,de
        exx
        adc     hl,de
-       jr      c,div_l_n12
+       jp      c,div_l_n12
        inc     a
 div_l_n02: ; bit 2, above
        add     a,a
@@ -2272,7 +2281,7 @@ div_l_n02: ; bit 2, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      c,div_l_n03
+       jp      c,div_l_n03
        dec     a
 div_l_n13: ; bit 3, below
        add     a,a
@@ -2284,7 +2293,7 @@ div_l_n13: ; bit 3, below
        add     hl,de
        exx
        adc     hl,de
-       jr      c,div_l_n14
+       jp      c,div_l_n14
        inc     a
 div_l_n04: ; bit 4, above
        add     a,a
@@ -2297,7 +2306,7 @@ div_l_n04: ; bit 4, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      c,div_l_n05
+       jp      c,div_l_n05
        dec     a
 div_l_n15: ; bit 5, below
        add     a,a
@@ -2309,7 +2318,7 @@ div_l_n15: ; bit 5, below
        add     hl,de
        exx
        adc     hl,de
-       jr      c,div_l_n16
+       jp      c,div_l_n16
        inc     a
 div_l_n06: ; bit 6, above
        add     a,a
@@ -2322,7 +2331,7 @@ div_l_n06: ; bit 6, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      c,div_l_n07
+       jp      c,div_l_n07
        dec     a
 div_l_n17: ; bit 7, below
        add     a,a
@@ -2334,7 +2343,7 @@ div_l_n17: ; bit 7, below
        add     hl,de
        exx
        adc     hl,de
-       jr      c,div_l_n18
+       jp      c,div_l_n18
        inc     a
 div_l_n08: ; done, above
        add     a,a
@@ -2352,7 +2361,7 @@ div_l_n1: ; bit 0, below
        add     hl,de
        exx
        adc     hl,de
-       jr      c,div_l_n11
+       jp      c,div_l_n11
        inc     a
 div_l_n01: ; bit 1, above
        add     a,a
@@ -2365,7 +2374,7 @@ div_l_n01: ; bit 1, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      c,div_l_n02
+       jp      c,div_l_n02
        dec     a
 div_l_n12: ; bit 2, below
        add     a,a
@@ -2377,7 +2386,7 @@ div_l_n12: ; bit 2, below
        add     hl,de
        exx
        adc     hl,de
-       jr      c,div_l_n13
+       jp      c,div_l_n13
        inc     a
 div_l_n03: ; bit 3, above
        add     a,a
@@ -2390,7 +2399,7 @@ div_l_n03: ; bit 3, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      c,div_l_n04
+       jp      c,div_l_n04
        dec     a
 div_l_n14: ; bit 4, below
        add     a,a
@@ -2402,7 +2411,7 @@ div_l_n14: ; bit 4, below
        add     hl,de
        exx
        adc     hl,de
-       jr      c,div_l_n15
+       jp      c,div_l_n15
        inc     a
 div_l_n05: ; bit 5, above
        add     a,a
@@ -2415,7 +2424,7 @@ div_l_n05: ; bit 5, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      c,div_l_n06
+       jp      c,div_l_n06
        dec     a
 div_l_n16: ; bit 6, below
        add     a,a
@@ -2427,7 +2436,7 @@ div_l_n16: ; bit 6, below
        add     hl,de
        exx
        adc     hl,de
-       jr      c,div_l_n17
+       jp      c,div_l_n17
        inc     a
 div_l_n07: ; bit 7, above
        add     a,a
@@ -2440,7 +2449,7 @@ div_l_n07: ; bit 7, above
        sbc     hl,de
        exx
        sbc     hl,de
-       jr      c,div_l_n08
+       jp      c,div_l_n08
        dec     a
 div_l_n18: ; done, below
        add     a,a
@@ -2545,62 +2554,6 @@ digits:
 
 ; sm code
 
-start:
-       ld      hl,print_trace
-       ld      (page0_trace + 1),hl
-
-       ld      hl,restarts
-       ld      de,0x28
-       ld      bc,restarts_end - restarts
-       ldir
-
-       ld      bc,sm_start
-       jp      page0_dispatch0
-sm_start:
-       .db     <page0_imm_call
-       .dw     sm_main
-       .dw     0
-       .db     <page0_esc
-       jp      0
-
-restarts:
-       ; rst 0x28, immediate to hl
-       ld      a,(bc)
-       inc     bc
-       ld      l,a
-       ld      a,(bc)
-       inc     bc
-       ld      h,a
-       ret
-       .db     0
-       ; rst 0x30, pop hl:de'
-       pop     hl
-       exx
-       pop     de
-       exx
-       ex      (sp),hl
-       ret
-       .db     0,0
-       ; rst 0x38, immediate to hl:de'
-       ld      a,(bc)
-       inc     bc
-       exx
-       ld      e,a
-       exx
-       ld      a,(bc)
-       inc     bc
-       exx
-       ld      d,a
-       exx
-       ld      a,(bc)
-       inc     bc
-       ld      l,a
-       ld      a,(bc)
-       inc     bc
-       ld      h,a
-       ret
-restarts_end:
-
 sm_main:
        ; create stack frame
        .db     <page0_stkadj