page2_imm_divrev_sl:
rst 0x38
;.db 0x3e ; ld a,
- call math_div_sl0
+ ex de,hl
+ push bc
+ call math_div_sl1
jr div_l_done
page2_div_sl:
;rst 0x30
exx
pop de
exx
- call math_div_sl0
+ ex de,hl
+ push bc
+ call math_div_sl1
jr div_l_done
page2_imm_div_sl:
rst 0x38
;.db 0x3e ; ld a,
- ex de,hl
- call math_div_sl
+ push bc
+ call math_div_sl0
jr div_l_done
page2_divrev_sl:
;rst 0x30
exx
pop de
exx
- ex de,hl
- call math_div_sl
+ push bc
+ call math_div_sl0
jr div_l_done
page2_imm_divrev_ul:
rst 0x38
;.db 0x3e ; ld a,
- call math_div_ul0
+ ex de,hl
+ push bc
+ call math_div_ul1
jr div_l_done
page2_div_ul:
;rst 0x30
exx
pop de
exx
- call math_div_ul0
+ ex de,hl
+ push bc
+ call math_div_ul1
jr div_l_done
page2_imm_div_ul:
rst 0x38
;.db 0x3e ; ld a,
- ex de,hl
- call math_div_ul
+ push bc
+ call math_div_ul0
jr div_l_done
page2_divrev_ul:
;rst 0x30
exx
pop de
exx
- ex de,hl
- call math_div_ul
+ push bc
+ call math_div_ul0
div_l_done:
+ pop bc
exx
push de
exx
scf
ret
-math_div_sl0: ; hl':hl, de':de = de':hl % hl':de, de':hl / hl':de, signed
+math_div_sl0: ; hl':hl, de':de = hl':de % de':hl, hl':de / de':hl, signed
exx
ex de,hl
exx
-math_div_sl: ; ; hl':hl, de':de = hl':hl % de':de, hl':hl / de':de, signed
- push bc
+math_div_sl1: ; ; hl':hl, de':de = de':de % hl':hl, de':de / hl':hl, signed
exx
- ld a,h
- or a
+ ld c,l
+ ld b,h
ld a,d
rla
+ sub a,a
+ ld l,a
+ ld h,a
exx
- jp m,div_l_n ; positive dividend
-
- ; positive dividend
ld c,l
ld b,h
- ld hl,0
+ ld l,a
+ ld h,a
+math_div_sl:
+ ; hl':hl, de':de =
+ ; hl':hl:de':de % bc':bc, hl':hl:de':de / bc':bc, signed
exx
ld a,h
- ld c,l
- ld hl,0
+ or a
+ ld a,b
+ rla
+ ;exx
+ jp m,div_l_n ; positive dividend
+
+ ; positive dividend
+ ;exx
+ ld a,d
exx
jr nc,div_l_pp ; positive dividend, positive divisor
; positive dividend, negative divisor
call div_l_n1
exx
- ld b,a
- ld a,c
+ ld d,a
+ ld a,e
exx
call div_l_ncf
exx
- ld c,a
+ ld e,a
exx
- ld a,b
+ ld a,d
call div_l_ncf
- ld b,a
- ld a,c
+ ld d,a
+ ld a,e
call div_l_ncf
inc a
- jr c,div_l_p_done
- sbc hl,de
+ ld e,a
+ ret c
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
- jr div_l_p_done
+ ret
div_l_n:
+ exx
; negative dividend
- call dec_l ; reduces remainder by 1 (we inc later)
- ld c,l
- ld b,h
- ld hl,-1
+ ld a,e
+ or d
+ dec de ; reduces remainder by 1 (we inc later)
exx
- ld a,h
- ld c,l
- ld hl,-1
+ jr nz,1$
+ dec de
+1$: ld a,d
exx
jr c,div_l_nn ; negative dividend, negative divisor
; negative dividend, positive divisor
call div_l1
exx
- ld b,a
- ld a,c
+ ld d,a
+ ld a,e
exx
call div_lcf
exx
- ld c,a
+ ld e,a
exx
- ld a,b
+ ld a,d
call div_lcf
- ld b,a
- ld a,c
+ ld d,a
+ ld a,e
call div_lcf
inc a
- jr c,div_l_n_done
- sbc hl,de
+ ld e,a
+ jr c,2$
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
+ exx
+2$: inc hl ; get into range divisor+1..0
+ ld a,l
+ or h
+ ret nz
+ exx
+ inc hl
exx
- jr div_l_n_done
+ ret
-math_div_ul0: ; hl:hl', de:de' = hl:de' % de:hl', hl:de' / de:hl', unsigned
+math_div_ul0: ; hl':hl, de':de = hl':de % de':hl, hl':de / de':hl, unsigned
exx
ex de,hl
exx
-math_div_ul: ; ; hl:hl', de:de' = hl:hl' % de:de', hl:hl' / de:de', unsigned
- push bc
+math_div_ul1: ; ; hl':hl, de':de = de':de % hl':hl, de':de / hl':hl, unsigned
ld c,l
ld b,h
- ld hl,0
+ sub a
+ ld l,a
+ ld h,a
exx
- ld a,h
ld c,l
- ld hl,0
+ ld b,h
+ ld l,a
+ ld h,a
+ ;exx
+;math_div_ul:
+ ; hl':hl, de':de =
+ ; hl':hl:de':de % bc':bc, hl':hl:de':de / bc':bc, unsigned
+ ;exx
+ ld a,d
exx
div_l_pp: ; positive dividend, positive divisor
call div_l0
exx
- ld b,a
- ld a,c
+ ld d,a
+ ld a,e
exx
call div_lcf
exx
- ld c,a
+ ld e,a
exx
- ld a,b
+ ld a,d
call div_lcf
- ld b,a
- ld a,c
+ ld d,a
+ ld a,e
call div_lcf
- jr nc,div_l_p_done
- add hl,de
- exx
- adc hl,de
- exx
-div_l_p_done:
ld e,a
- ld d,b
+ ret nc
+ add hl,bc
exx
- ld e,c
- ld d,b
+ adc hl,bc
exx
- pop bc
ret
div_l_nn: ; negative dividend, negative divisor
call div_l_n0
exx
- ld b,a
- ld a,c
+ ld d,a
+ ld a,e
exx
call div_l_ncf
exx
- ld c,a
+ ld e,a
exx
- ld a,b
+ ld a,d
call div_l_ncf
- ld b,a
- ld a,c
+ ld d,a
+ ld a,e
call div_l_ncf
- jr nc,div_l_n_done
- add hl,de
- exx
- adc hl,de
- exx
-div_l_n_done:
ld e,a
- ld d,b
+ jr nc,1$
+ add hl,bc
exx
- ld e,c
- ld d,b
+ adc hl,bc
exx
- pop bc
-inc_l: ; get into range divisor+1..0
- inc hl
+1$: inc hl ; get into range divisor+1..0
ld a,l
or h
ret nz
exx
ret
-dec_l:
- ld a,l
- or h
- dec hl
- ret nz
- exx
- dec hl
- exx
- ret
-
; non-restoring division routine
; see earlier comments for the word version, this extends the concept to long
exx
adc hl,hl
exx
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp nc,div_l01
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp nc,div_l12
inc a
exx
adc hl,hl
exx
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp nc,div_l03
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp nc,div_l14
inc a
exx
adc hl,hl
exx
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp nc,div_l05
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp nc,div_l16
inc a
exx
adc hl,hl
exx
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp nc,div_l07
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp nc,div_l18
inc a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp nc,div_l11
inc a
exx
adc hl,hl
exx
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp nc,div_l02
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp nc,div_l13
inc a
exx
adc hl,hl
exx
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp nc,div_l04
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp nc,div_l15
inc a
exx
adc hl,hl
exx
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp nc,div_l06
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp nc,div_l17
inc a
exx
adc hl,hl
exx
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp nc,div_l08
dec a
adc hl,hl
exx
or a
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp c,div_l_n01
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp c,div_l_n12
inc a
adc hl,hl
exx
or a
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp c,div_l_n03
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp c,div_l_n14
inc a
adc hl,hl
exx
or a
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp c,div_l_n05
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp c,div_l_n16
inc a
adc hl,hl
or a
exx
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp c,div_l_n07
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp c,div_l_n18
inc a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp c,div_l_n11
inc a
adc hl,hl
exx
or a
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp c,div_l_n02
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp c,div_l_n13
inc a
adc hl,hl
exx
or a
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp c,div_l_n04
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp c,div_l_n15
inc a
adc hl,hl
exx
or a
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp c,div_l_n06
dec a
exx
adc hl,hl
exx
- add hl,de
+ add hl,bc
exx
- adc hl,de
+ adc hl,bc
exx
jp c,div_l_n17
inc a
adc hl,hl
exx
or a
- sbc hl,de
+ sbc hl,bc
exx
- sbc hl,de
+ sbc hl,bc
exx
jp c,div_l_n08
dec a