Improve trace, add unsigned division
authorNick Downing <nick@ndcode.org>
Mon, 10 Jun 2019 03:47:46 +0000 (13:47 +1000)
committerNick Downing <nick@ndcode.org>
Mon, 10 Jun 2019 03:47:46 +0000 (13:47 +1000)
sm.asm

diff --git a/sm.asm b/sm.asm
index 26de185..5fb2a5f 100644 (file)
--- a/sm.asm
+++ b/sm.asm
@@ -27,7 +27,8 @@
        .db     esc
        ex      de,hl
        call    print_word
-       jp      print_crlf
+       call    print_crlf
+       rst     0 ; can't return into ccp as clobbered by stack growth
 
 sm_factorial:
        ; get argument
@@ -127,7 +128,7 @@ print_digit:
        ld      a,(hl)
        pop     hl
        pop     de
-       jr      print_char
+       jp      print_char
 
 print_space:
        push    af
@@ -137,41 +138,72 @@ print_space:
        ret
 
 print_stack:
+       push    af
+       push    bc
        push    de
        push    hl
-       ld      hl,6
-       add     hl,sp
+       ld      a,'p
+       call    print_char
+       ld      a,'c
+       call    print_char
+       ld      a,'=
+       call    print_char
+       rst     0x10 ; ex bc,hl
        call    print_word
+       rst     0x10 ; ex bc,hl
        call    print_space
-       ex      de,hl
+       ld      a,'o
+       call    print_char
+       ld      a,'p
+       call    print_char
+       ld      a,'=
+       call    print_char
        call    print_word
-       ex      de,hl
        call    print_space
-       ld      e,(hl)
-       inc     hl
-       ld      d,(hl)
-       inc     hl
-       ex      de,hl
+       ld      a,'s
+       call    print_char
+       ld      a,'p
+       call    print_char
+       ld      a,'=
+       call    print_char
+       ld      hl,10
+       add     hl,sp
        call    print_word
-       ex      de,hl
        call    print_space
-       ld      e,(hl)
-       inc     hl
-       ld      d,(hl)
-       inc     hl
+       ld      a,'t
+       call    print_char
+       ld      a,'o
+       call    print_char
+       ld      a,'s
+       call    print_char
+       ld      a,'=
+       call    print_char
        ex      de,hl
        call    print_word
        ex      de,hl
        call    print_space
+       ld      a,'s
+       call    print_char
+       ld      a,'t
+       call    print_char
+       ld      a,'k
+       call    print_char
+       ld      b,4
+       ld      a,'=
+1$:    call    print_char
        ld      e,(hl)
        inc     hl
        ld      d,(hl)
-       ;inc    hl
+       inc     hl
        ex      de,hl
        call    print_word
        ex      de,hl
+       ld      a,' 
+       djnz    1$
        pop     hl
        pop     de
+       pop     bc
+       pop     af
 print_crlf:
        push    af
        ld      a,0xd
@@ -244,47 +276,42 @@ print_char:
 
        .org    0x338
 
-; print 'A'
+; print 'A
        push    af
-       ld      a,0x41
+       ld      a,'A
        call    print_char
        pop     af
        ret
 
 ; lower dispatcher, just before 0x100
 
-       .org    0x3ed
+       .org    0x3eb ;d
 
-sm:
-       pop     hl
-       .db     1 ; ld bc,
-dispatch_l5: ; tos in hl, pc in de
+dispatch_l5: ; pc in de
        ex      de,hl
        pop     de
 dispatch_l6: ; tos in de, pc in hl
- rst 0x28 ; print hl
        ld      c,l
        ld      b,h
-       inc     bc
        ld      l,(hl)
        ld      h,>esc
- rst 0x28 ; print hl
  rst 0x30 ; print stack
+       inc     bc
        jp      (hl)
 
+sm:
+       pop     bc
+       .db     0x21 ; ld hl,
 dispatch_l1: ; tos in de and hl, pc in bc
        push    de
 dispatch_l2: ; tos in hl, pc in bc
-       ld      e,l
-       ld      d,h
+       ex      de,hl
 dispatch_l3: ; tos in de, pc in bc, h clobbered
        ld      h,>esc
 dispatch_l4: ; tos in de, pc in bc, h = >esc
- rst 0x20 ; print bc
        ld      a,(bc)
        ld      l,a
        inc     bc
- rst 0x28 ; print hl
  rst 0x30 ; print stack
        jp      (hl)
 
@@ -406,6 +433,32 @@ add_w:
        add     hl,de
        jr      dispatch_l2
 
+;sub_iw: ; same as imm_w, sub_w
+;      rst     8 ; ld hl,(bc)+
+;      .db     0x3e ; ld a,
+sub_xw: ; same as xchg_w, sub_w
+       pop     hl
+       rst     0x10 ; ex bc,hl
+       .db     0x3e ; ld a,
+sub_w: ; same as neg_w, add_w
+       pop     hl
+       or      a
+       sbc     hl,de
+       jr      dispatch_l2
+
+eq_iw: ; same as imm_w, eq_w
+       rst     8 ; ld hl,(bc)+
+       .db     0x3e ; ld a,
+eq_w:
+       pop     hl
+       sub     a
+       sbc     hl,de
+       ld      e,a
+       ld      d,a
+       jr      nz,dispatch_l3
+       inc     e
+       jr      dispatch_l3
+
 ; middle dispatch routines
 
 jmp: ; also means ret
@@ -460,50 +513,12 @@ dispatch_mm1: ; pc in bc
 dispatch_m0: ; pc in bc, h = >esc
        pop     de
 dispatch_m4:
- rst 0x20 ; print bc
        ld      a,(bc)
        ld      l,a
-       inc     bc
- rst 0x28 ; print hl
  rst 0x30 ; print stack
+       inc     bc
        jp      (hl)
 
-;sub_iw: ; same as imm_w, sub_w
-;      rst     8 ; ld hl,(bc)+
-;      .db     0x3e ; ld a,
-sub_xw: ; same as xchg_w, sub_w
-       pop     hl
-       rst     0x10 ; ex bc,hl
-       .db     0x3e ; ld a,
-sub_w: ; same as neg_w, add_w
-       pop     hl
-       or      a
-       sbc     hl,de
-       jr      dispatch_u2
-
-mul_iw:
-       rst     8 ; ld hl,(bc)+
-       .db     0x3e ; ld a,
-mul_w:
-       pop     hl
-       push    bc
-       call    mul_de_hl
-       pop     bc
-       jr      dispatch_u2
-
-eq_iw: ; same as imm_w, eq_w
-       rst     8 ; ld hl,(bc)+
-       .db     0x3e ; ld a,
-eq_w:
-       pop     hl
-       sub     a
-       sbc     hl,de
-       ld      e,a
-       ld      d,a
-       jr      nz,dispatch_u3
-       inc     e
-       jr      dispatch_u3
-
 lt_iuw: ; same as imm_w, lt_iuw
        rst     8 ; ld hl,(bc)+
        .db     0x3e ; ld a,
@@ -583,62 +598,87 @@ xor_w:
        ld      d,a
        jr      dispatch_u3
 
+;sl_xw:
+;      pop     hl
+;      ex      de,hl
+;      .db     0x3e ; ld a,
 sl_w:
        pop     hl
-       push    bc
        call    sl_hl_e
-       pop     bc
        jr      dispatch_u2
 
+;sr_xuw:
+;      pop     hl
+;      ex      de,hl
+;      .db     0x3e ; ld a,
 sr_uw:
        pop     hl
-       push    bc
        call    srl_hl_e
-       pop     bc
        jr      dispatch_u2
 
+;sr_xsw:
+;      pop     hl
+;      ex      de,hl
+;      .db     0x3e ; ld a,
 sr_sw:
        pop     hl
-       push    bc
        call    sra_hl_e
-       pop     bc
        jr      dispatch_u2
 
+mul_iw:
+       rst     8 ; ld hl,(bc)+
+       .db     0x3e ; ld a,
+mul_w:
+       pop     hl
+       call    mul_hl_de
+       jr      dispatch_u2
+
+div_iuw:
+       rst     8 ; ld hl,(bc)+
+       .db     0x3e ; ld a,
+div_xuw:
+       pop     hl
+       ex      de,hl
+       .db     0x3e ; ld a,
+div_uw:
+       pop     hl
+       call    div_hl_de
+;      jr      dispatch_um1
+
 ; upper dispatcher, after 0x200
 
-dispatch_u1: ; tos in de and hl, pc in bc
-       push    de
+dispatch_um1: ; tos in hl and de, pc in bc
+       push    hl
+       .db     0x3e ; ld a,
+;dispatch_u1: ; tos in de and hl, pc in bc
+;      push    de
 dispatch_u2: ; tos in hl, pc in bc
-       ld      e,l
-       ld      d,h
+       ex      de,hl
 dispatch_u3: ; tos in de, pc in bc, h clobbered
        ld      h,>esc
 dispatch_u4: ; tos in de, pc in bc, h = >esc
- rst 0x20 ; print bc
        ld      a,(bc)
        ld      l,a
-       inc     bc
- rst 0x28 ; print hl
  rst 0x30 ; print stack
+       inc     bc
        jp      (hl)
 
 ; math package
 
 sl_hl_e:
        ld      a,e
-sl_hl_a:
        and     0xf
        ret     z
-       ld      b,a
 1$:    add     hl,hl
-       djnz    1$
+       dec     a
+       jr      nz,1$
        ret
 
 srl_hl_e:
        ld      a,e
-srl_hl_a:
        and     0xf
        ret     z
+       push    bc
        ld      b,a
        ld      a,l
 srl_hl_loop:
@@ -646,13 +686,14 @@ srl_hl_loop:
        rra
        djnz    srl_hl_loop
        ld      l,a
+       pop     bc
        ret
 
 sra_hl_e:
        ld      a,e
-sra_hl_a:
        and     0xf
        ret     z
+       push    bc
        ld      b,a
        ld      a,l
 sra_hl_loop:
@@ -660,9 +701,11 @@ sra_hl_loop:
        rra
        djnz    sra_hl_loop
        ld      l,a
+       pop     bc
        ret
 
-mul_de_hl:
+mul_hl_de:
+       push    bc
        ld      a,h
        ld      c,l
        ld      hl,0
@@ -679,4 +722,35 @@ mul_de_hl:
        jr      nc,4$
        add     hl,de
 4$:    djnz    3$
+       pop     bc
+       ret
+
+div_hl_de:
+       push    bc
+       ld      a,h
+       ld      c,l
+       ld      hl,0
+       ld      b,8
+1$:    rla
+       adc     hl,hl
+       sbc     hl,de
+       jr      nc,2$
+       add     hl,de
+2$:    djnz    1$
+       rla
+       cpl
+       push    af
+       ld      a,c
+       ld      b,8
+3$:    rla
+       adc     hl,hl
+       sbc     hl,de
+       jr      nc,4$
+       add     hl,de
+4$:    djnz    3$
+       rla
+       cpl
+       pop     de
+       ld      e,a
+       pop     bc
        ret