Exchange roles of bc and de, adjust interface to math package which doesn't use excha...
authorNick Downing <nick@ndcode.org>
Mon, 10 Jun 2019 00:18:50 +0000 (10:18 +1000)
committerNick Downing <nick@ndcode.org>
Mon, 10 Jun 2019 00:18:50 +0000 (10:18 +1000)
sm.asm

diff --git a/sm.asm b/sm.asm
index e6c5418..30237f9 100644 (file)
--- a/sm.asm
+++ b/sm.asm
@@ -4,9 +4,10 @@
 
        ld      hl,0x308
        ld      de,8
-       ld      bc,0x38 ;0x10
+       ld      bc,0x30 ;0x38 ;0x10
        ldir
 
+       pop     de
        call    sm
 
        ; push argument
@@ -24,7 +25,7 @@
        .dw     2
 
        .db     esc
-       rst     0x10 ; ex bc,hl
+       ex      de,hl
        call    print_word
        jp      print_crlf
 
@@ -142,9 +143,9 @@ print_stack:
        add     hl,sp
        call    print_word
        call    print_space
-       rst     0x10 ; ex bc,hl
+       ex      de,hl
        call    print_word
-       rst     0x10 ; ex bc,hl
+       ex      de,hl
        call    print_space
        ld      e,(hl)
        inc     hl
@@ -194,13 +195,13 @@ print_char:
 
        .org    0x308
 
-; ld hl,(de)+
-       ex      de,hl
-       ld      e,(hl)
+; ld hl,(bc)+
+       rst     0x10 ; ex bc,hl
+       ld      c,(hl)
        inc     hl
-       ld      d,(hl)
+       ld      b,(hl)
        inc     hl
-       ex      de,hl
+       rst     0x10 ; ex bc,hl
        ret
 
        .org    0x310
@@ -216,18 +217,18 @@ print_char:
 
        .org    0x318
 
-; print bc
-       rst     0x10 ; ex bc,hl
+; print de
+       ex      de,hl
        call    print_word
-       rst     0x10 ; ex bc,hl
+       ex      de,hl
        jp      print_space
 
        .org    0x320
 
-; print de
-       ex      de,hl
+; print bc
+       rst     0x10 ; ex bc,hl
        call    print_word
-       ex      de,hl
+       rst     0x10 ; ex bc,hl
        jp      print_space
        
        .org    0x328
@@ -256,35 +257,35 @@ print_char:
 
 sm:
        pop     hl
-       .db     0x11 ; ld de,
+       .db     1 ; ld bc,
 
-dispatch_l5m1: ; pc in bc
-       rst     0x10 ; ex bc,hl
+dispatch_l5m1: ; pc in de
+       ex      de,hl
 dispatch_l5: ; pc in hl
-       pop     bc
-dispatch_l6: ; tos in bc, pc in hl, d clobbered
-       ld      d,>esc
-dispatch_l7: ; tos in bc, pc in hl, d = >esc
+       pop     de
+dispatch_l6: ; tos in de, pc in hl, b clobbered
+       ld      b,>esc
+dispatch_l7: ; tos in de, pc in hl, b = >esc
  rst 0x28 ; print hl
-       ld      e,(hl)
+       ld      c,(hl)
        inc     hl
-       ex      de,hl
+       rst     0x10 ; ex bc,hl
  rst 0x28 ; print hl
  rst 0x30 ; print stack
        jp      (hl)
 
-dispatch_l1: ; tos in bc and hl, pc in de
-       push    bc
-dispatch_l2: ; tos in hl, pc in de
-       ld      c,l
-       ld      b,h
-dispatch_l3: ; tos in bc, pc in de, h clobbered
+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
+dispatch_l3: ; tos in de, pc in bc, h clobbered
        ld      h,>esc
-dispatch_l4: ; tos in bc, pc in de, h = >esc
- rst 0x20 ; print de
-       ld      a,(de)
+dispatch_l4: ; tos in de, pc in bc, h = >esc
+ rst 0x20 ; print bc
+       ld      a,(bc)
        ld      l,a
-       inc     de
+       inc     bc
  rst 0x28 ; print hl
  rst 0x30 ; print stack
        jp      (hl)
@@ -292,28 +293,28 @@ dispatch_l4: ; tos in bc, pc in de, h = >esc
 ; 0x100
 
 esc:
-       ex      de,hl
+       rst     0x10 ; ex bc,hl
        jp      (hl)
 
 call_i: ; same as imm_w, call
-       rst     8 ; ld hl,(de)+
-       push    bc
-       ld      c,e
-       ld      b,d
+       rst     8 ; ld hl,(bc)+
+       push    de
+       ld      e,c
+       ld      d,b
        jr      dispatch_l6
 
 _call:
-       ex      de,hl
        rst     0x10 ; ex bc,hl
+       ex      de,hl
        jr      dispatch_l6
 
 jmp_i: ; same as imm_w, jmp
-       rst     8 ; ld hl,(de)+
+       rst     8 ; ld hl,(bc)+
        jr      dispatch_l7
 
 jz_i: ; same as imm_w, jz
-       rst     8 ; ld hl,(de)+
-       rst     0x10 ; ex bc, hl
+       rst     8 ; ld hl,(bc)+
+       ex      de,hl
        .db     0x3e ; ld a,
 jz:
        pop     hl
@@ -323,8 +324,8 @@ jz:
        jr      dispatch_l5m1
 
 jnz_i: ; same as imm_w, jnz
-       rst     8 ; ld hl,(de)+
-       rst     0x10 ; ex bc, hl
+       rst     8 ; ld hl,(bc)+
+       ex      de,hl
        .db     0x3e ; ld a,
 jnz:
        pop     hl
@@ -337,142 +338,144 @@ jnz:
 ;      pop     hl
 ;      jr      dispatch_l6
 
-jmp: ; also means ret
-       ld      e,c
-       ld      d,b
-       jr      dispatch_m0
-
 xchg_w:
        pop     hl
        jr      dispatch_l1
 
 dup_w:
-       push    bc
+       push    de
        jr      dispatch_l4
 
 imm_w:
-       rst     8 ; ld hl,(de)+
+       rst     8 ; ld hl,(bc)+
        jr      dispatch_l1
 
-adj_isp: ; same as imm_w, adj_sp
-       rst     8 ; ld hl,(de)+
-       push    bc
-       .db     0x3e ; ld a,
-adj_sp: ; same as add_sp, st_sp
-       rst     0x10 ; ex bc,hl
-       add     hl,sp
-       .db     0x3e ; ld a,
-st_sp:
-       rst     0x10 ; ex bc,hl
-       ld      sp,hl
-       jr      dispatch_mm1
-
 add_isp: ; same as imm_w, add_sp
-       rst     8 ; ld hl,(de)+
-       push    bc
+       rst     8 ; ld hl,(bc)+
+       push    de
        .db     0x3e ; ld a,
 add_sp:
-       rst     0x10 ; ex bc,hl
+       ex      de,hl
        add     hl,sp
        jr      dispatch_l2
 
 ld_iw: ; same as imm_w, ld_w
-       rst     8 ; ld hl,(de)+
-       push    bc
+       rst     8 ; ld hl,(bc)+
+       push    de
        .db     0x3e ; ld a,
 ld_w:
-       rst     0x10 ; ex bc,hl
-       ld      c,(hl)
+       ex      de,hl
+       ld      e,(hl)
        inc     hl
-       ld      b,(hl)
+       ld      d,(hl)
        jr      dispatch_l3
 
 ld_isb: ; same as imm_w, ld_sb
-       rst     8 ; ld hl,(de)+
-       push    bc
+       rst     8 ; ld hl,(bc)+
+       push    de
        .db     0x3e ; ld a,
 ld_sb:
-       rst     0x10 ; ex bc,hl
-       ld      c,(hl)
-       ld      a,c
+       ex      de,hl
+       ld      e,(hl)
+       ld      a,e
        rla
        sbc     a,a
-       ld      b,a
+       ld      d,a
        jr      dispatch_l3
 
 ld_iub: ; same as imm_w, ld_ub
-       rst     8 ; ld hl,(de)+
-       push    bc
+       rst     8 ; ld hl,(bc)+
+       push    de
        .db     0x3e ; ld a,
 ld_ub:
-       rst     0x10 ; ex bc,hl
-       ld      c,(hl)
-       ld      b,0
+       ex      de,hl
+       ld      e,(hl)
+       ld      d,0
        jr      dispatch_l3
 
+neg_w:
+       dec     de
+not_w:
+       ld      a,e
+       cpl
+       ld      e,a
+       ld      a,d
+       cpl
+       ld      d,a
+       jr      dispatch_l4
+
+add_iw: ; same as imm_w, add_w
+       rst     8 ; ld hl,(bc)+
+       .db     0x3e ; ld a,
+add_w:
+       pop     hl
+       add     hl,de
+       jr      dispatch_l2
+
+; middle dispatch routines
+
+jmp: ; also means ret
+       ld      c,e
+       ld      b,d
+       jr      dispatch_m0
+
+adj_isp: ; same as imm_w, adj_sp
+       rst     8 ; ld hl,(bc)+
+       push    de
+       .db     0x3e ; ld a,
+adj_sp: ; same as add_sp, st_sp
+       ex      de,hl
+       add     hl,sp
+       .db     0x3e ; ld a,
+st_sp:
+       ex      de,hl
+       ld      sp,hl
+       jr      dispatch_mm1
+
 ;st_ixw: ; same as imm_w, xchg_w, st_w
-;      rst     8 ; ld hl,(de)+
-;      ld      (hl),c
+;      rst     8 ; ld hl,(bc)+
+;      ld      (hl),e
 ;      inc     hl
-;      ld      (hl),b
+;      ld      (hl),d
 ;      jr      dispatch_mm1
 
 st_iw: ; same as imm_w, st_w
-       rst     8 ; ld hl,(de)+
-       rst     0x10 ; ex bc,hl
+       rst     8 ; ld hl,(bc)+
+       ex      de,hl
        .db     0x3e ; ld a,
 st_w:
        pop     hl
-       ld      (hl),c
+       ld      (hl),e
        inc     hl
-       ld      (hl),b
+       ld      (hl),d
        jr      dispatch_mm1
 
-st_ixb: ; same as imm_w, xchg_w, st_b
-       rst     8 ; ld hl,(de)+
+st_ixb: ; same as imm_w, xchg_w, st_d
+       rst     8 ; ld hl,(bc)+
        .db     0x3e ; ld a,
-st_b:
+st_d:
        pop     hl
-       ld      (hl),c
+       ld      (hl),e
        jr      dispatch_mm1
 
-neg_w:
-       dec     bc
-not_w:
-       ld      a,c
-       cpl
-       ld      c,a
-       ld      a,b
-       cpl
-       ld      b,a
-       jr      dispatch_l4
-
 ; middle dispatcher, near 0x180, smaller in size
 ; used for store-type routines that empty stack and need it to be popped
 
-dispatch_mm1: ; pc in de
+dispatch_mm1: ; pc in bc
        ld      h,>esc
-dispatch_m0: ; pc in de, h = >esc
-       pop     bc
+dispatch_m0: ; pc in bc, h = >esc
+       pop     de
 dispatch_m4:
- rst 0x20 ; print de
-       ld      a,(de)
+ rst 0x20 ; print bc
+       ld      a,(bc)
        ld      l,a
-       inc     de
+       inc     bc
  rst 0x28 ; print hl
  rst 0x30 ; print stack
        jp      (hl)
 
-add_iw: ; same as imm_w, add_w
-       rst     8 ; ld hl,(de)+
-       .db     0x3e ; ld a,
-add_w:
-       pop     hl
-       add     hl,bc
-       jr      dispatch_u2
-
 ;sub_iw: ; same as imm_w, sub_w
-;      rst     8 ; ld hl,(de)+
+;      rst     8 ; ld hl,(bc)+
 ;      .db     0x3e ; ld a,
 sub_xw: ; same as xchg_w, sub_w
        pop     hl
@@ -481,148 +484,154 @@ sub_xw: ; same as xchg_w, sub_w
 sub_w: ; same as neg_w, add_w
        pop     hl
        or      a
-       sbc     hl,bc
+       sbc     hl,de
        jr      dispatch_u2
 
 mul_iw:
-       rst     8 ; ld hl,(de)+
+       rst     8 ; ld hl,(bc)+
        .db     0x3e ; ld a,
 mul_w:
        pop     hl
-       push    de
-       call    mul_bc_hl
-       pop     de
+       push    bc
+       call    mul_de_hl
+       pop     bc
        jr      dispatch_u2
 
 eq_iw: ; same as imm_w, eq_w
-       rst     8 ; ld hl,(de)+
+       rst     8 ; ld hl,(bc)+
        .db     0x3e ; ld a,
 eq_w:
        pop     hl
        sub     a
-       sbc     hl,bc
-       ld      c,a
-       ld      b,a
+       sbc     hl,de
+       ld      e,a
+       ld      d,a
        jr      nz,dispatch_u3
-       inc     c
+       inc     e
        jr      dispatch_u3
 
 lt_iuw: ; same as imm_w, lt_iuw
-       rst     8 ; ld hl,(de)+
+       rst     8 ; ld hl,(bc)+
        .db     0x3e ; ld a,
 gt_uw: ; same as xchg_w, lt_uw
        pop     hl
-       rst     0x10 ; ex bc,hl
+       ex      de,hl
        .db     0x3e ; ld a,
 lt_uw:
        pop     hl
        sub     a
-       sbc     hl,bc
-       ld      b,a
+       sbc     hl,de
+       ld      d,a
        adc     a,a
-       ld      c,a
+       ld      e,a
        jr      dispatch_u3
 
 lt_isw: ; same as imm_w, lt_isw
-       rst     8 ; ld hl,(de)+
+       rst     8 ; ld hl,(bc)+
        .db     0x3e ; ld a,
 gt_sw: ; same as xchg_w, lt_sw
        pop     hl
-       rst     0x10 ; ex bc,hl
+       ex      de,hl
        .db     0x3e ; ld a,
 lt_sw:
        pop     hl
        sub     a
-       sbc     hl,bc
-       ld      b,a
+       sbc     hl,de
+       ld      d,a
        jp      pe,lt_sw_overflow
        add     hl,hl
        adc     a,a
-       ld      c,a
+       ld      e,a
        jr      dispatch_u3
 lt_sw_overflow:
        add     hl,hl
        ccf
        adc     a,a
-       ld      c,a
+       ld      e,a
        jr      dispatch_u3
 
 and_iw: ; same as imm_w, and_w
-       rst     8 ; ld hl,(de)+
+       rst     8 ; ld hl,(bc)+
        .db     0x3e ; ld a,
 and_w:
        pop     hl
        ld      a,l
-       or      c
-       ld      c,a
+       or      e
+       ld      e,a
        ld      a,h
-       or      b
-       ld      b,a
+       or      d
+       ld      d,a
        jr      dispatch_u3
 
 or_iw: ; same as imm_w, and_w
-       rst     8 ; ld hl,(de)+
+       rst     8 ; ld hl,(bc)+
        .db     0x3e ; ld a,
 or_w:
        pop     hl
        ld      a,l
-       or      c
-       ld      c,a
+       or      e
+       ld      e,a
        ld      a,h
-       or      b
-       ld      b,a
+       or      d
+       ld      d,a
        jr      dispatch_u3
 
 xor_iw: ; same as imm_w, and_w
-       rst     8 ; ld hl,(de)+
+       rst     8 ; ld hl,(bc)+
        .db     0x3e ; ld a,
 xor_w:
        pop     hl
        ld      a,l
-       xor     c
-       ld      c,a
+       xor     e
+       ld      e,a
        ld      a,h
-       xor     b
-       ld      b,a
+       xor     d
+       ld      d,a
        jr      dispatch_u3
 
 sl_w:
        pop     hl
-       call    sl_hl_c
+       push    bc
+       call    sl_hl_e
+       pop     bc
        jr      dispatch_u2
 
 sr_uw:
        pop     hl
-       call    srl_hl_c
+       push    bc
+       call    srl_hl_e
+       pop     bc
        jr      dispatch_u2
 
 sr_sw:
        pop     hl
-       call    sra_hl_c
+       push    bc
+       call    sra_hl_e
+       pop     bc
        jr      dispatch_u2
 
 ; upper dispatcher, after 0x200
 
-dispatch_u1: ; tos in bc and hl, pc in de
-       push    bc
-dispatch_u2: ; tos in hl, pc in de
-       ld      c,l
-       ld      b,h
-dispatch_u3: ; tos in bc, pc in de, h clobbered
+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
+dispatch_u3: ; tos in de, pc in bc, h clobbered
        ld      h,>esc
-dispatch_u4: ; tos in bc, pc in de, h = >esc
- rst 0x20 ; print de
-       ld      a,(de)
+dispatch_u4: ; tos in de, pc in bc, h = >esc
+ rst 0x20 ; print bc
+       ld      a,(bc)
        ld      l,a
-       inc     de
+       inc     bc
  rst 0x28 ; print hl
  rst 0x30 ; print stack
        jp      (hl)
 
 ; math package
 
-sl_hl_c:
-       ld      a,c
+sl_hl_e:
+       ld      a,e
 sl_hl_a:
        and     0xf
        ret     z
@@ -631,8 +640,8 @@ sl_hl_a:
        djnz    1$
        ret
 
-srl_hl_c:
-       ld      a,c
+srl_hl_e:
+       ld      a,e
 srl_hl_a:
        and     0xf
        ret     z
@@ -645,8 +654,8 @@ srl_hl_loop:
        ld      l,a
        ret
 
-sra_hl_c:
-       ld      a,c
+sra_hl_e:
+       ld      a,e
 sra_hl_a:
        and     0xf
        ret     z
@@ -659,11 +668,10 @@ sra_hl_loop:
        ld      l,a
        ret
 
-mul_bc_hl:
-       ex      de,hl
-mul_bc_de:
+mul_de_hl:
+       ld      a,h
+       ld      c,l
        ld      hl,0
-       ld      a,b
        ld      b,8
 1$:    add     hl,hl
        rla