div_hl_de:
push bc
- ld c,l
divu: ld a,h
+ ld c,l
ld hl,0
call div0
ld b,a
div_hl_de_signed:
push bc
- ld c,l
ld a,h
or a
ld a,d
; 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
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
; 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
;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
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
;call print_crlf
ret
-div3:
+divn1:
;push af
;ld a,'C
;call print_char
;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