From 23f10afff46826e02e87143c2e91b914f26d981e Mon Sep 17 00:00:00 2001 From: Nick Downing Date: Fri, 14 Jun 2019 01:36:13 +1000 Subject: [PATCH] Fix bugs, working signed division --- sm.asm | 50 +++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/sm.asm b/sm.asm index 856d028..c19d8f4 100644 --- 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 -- 2.34.1