Fix bugs, working signed division
authorNick Downing <nick@ndcode.org>
Thu, 13 Jun 2019 15:36:13 +0000 (01:36 +1000)
committerNick Downing <nick@ndcode.org>
Thu, 13 Jun 2019 15:36:13 +0000 (01:36 +1000)
sm.asm

diff --git a/sm.asm b/sm.asm
index 856d028..c19d8f4 100644 (file)
--- a/sm.asm
+++ b/sm.asm
@@ -913,8 +913,8 @@ mul_hl_de:
 
 div_hl_de:
        push    bc
-       ld      c,l
 divu:  ld      a,h
+       ld      c,l
        ld      hl,0
        call    div0
        ld      b,a
@@ -930,7 +930,6 @@ divu:       ld      a,h
 
 div_hl_de_signed:
        push    bc
-       ld      c,l
        ld      a,h
        or      a
        ld      a,d
@@ -943,6 +942,7 @@ div_hl_de_signed:
        ; negative dividend, positive divisor
        dec     hl                      ; reduces remainder by 1 (we inc later)
        ld      a,h
+       ld      c,l
        ld      hl,-1
        call    div1
        ld      b,a
@@ -959,15 +959,17 @@ div_hl_de_signed:
        ret
 
 2$:    ; positive dividend, negative divisor
+       ld      a,h
+       ld      c,l
        ld      hl,0
-       call    div3
+       call    divn1
        ld      b,a
        ld      a,c
        ld      c,b
        call    divn
-;      inc     a
-;      jr      c,3$
-;      sbc     hl,de
+       inc     a
+       jr      c,3$
+       sbc     hl,de
 3$:    ld      d,c
        ld      e,a
        pop     bc
@@ -979,14 +981,15 @@ div_hl_de_signed:
        ; negative dividend, negative divisor
        dec     hl                      ; reduces remainder by 1 (we inc later)
        ld      a,h
+       ld      c,l
        ld      hl,-1
-       call    div2
+       call    divn0
        ld      b,a
        ld      a,c
        ld      c,b
        call    divn
-;      jr      nc,5$
-;      add     hl,de
+       jr      nc,5$
+       add     hl,de
 5$:    inc     hl                      ; get into range divisor+1..0
        ld      d,c
        ld      e,a
@@ -1128,10 +1131,10 @@ div11:  add     a,a
  ;call print_crlf
        ret
 
-; div2/3 are the same as div0/1 but carry reversed after add/subtract divisor
+; divn0/3 are the same as div0/1 but carry reversed after add/subtract divisor
 
-divn:  jr      c,div3
-div2:
+divn:  jr      c,divn1
+divn0:
  ;push af
  ;ld a,'A
  ;call print_char
@@ -1152,13 +1155,14 @@ div2:
        ld      b,8
        scf
        rla
-div20: adc     hl,hl
+divn00:        adc     hl,hl
+       or      a
        sbc     hl,de
-       jr      c,div21
+       jr      c,divn01
        dec     a
-       jr      div31
-div21: add     a,a
-       djnz    div20
+       jr      divn11
+divn01:        add     a,a
+       djnz    divn00
        dec     a
        or      a
  ;push af
@@ -1181,7 +1185,7 @@ div21:    add     a,a
  ;call print_crlf
        ret
 
-div3:
+divn1:
  ;push af
  ;ld a,'C
  ;call print_char
@@ -1201,13 +1205,13 @@ div3:
  ;ex de,hl
        ld      b,8
        add     a,a
-div30: adc     hl,hl
+divn10:        adc     hl,hl
        add     hl,de
-       jr      c,div31
+       jr      c,divn11
        inc     a
-       jr      div21
-div31: add     a,a
-       djnz    div30
+       jr      divn01
+divn11:        add     a,a
+       djnz    divn10
        ;inc    a
        ;dec    a                       ; compensation
        scf