Login

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

 ifndef included_div32
 define included_div32
 include "div32_16.asm"
 include "../../common/mul16.asm"

var_x=xOP2   ;output
var_b=xOP2   ; 4 bytes, result gets copied to bottom anyways
var_n=xOP3
div32_32:
;228+{0,115}+2*div32_16+mul16
;min: 1982cc
;max: 2952cc
;avg: 2560.887cc
;HLDE/(var_x+4)
  ld bc,(var_x+6)
  call div32_16
  ld (var_b+2),de   ;top 16-bit digit
;Need to adjust the remainder
;(HL:00-DE*(var_x+4))
  push hl
  ld bc,(var_x+4)
  call mul16

  ;DEHL
  ld b,d
  ld c,e
  ex de,hl
  pop hl
  ;BCDE
  xor a
  sub e
  ld e,a
  ld a,0
  sbc a,d
  ld d,a
  sbc hl,bc
  jr nc,div32_32_final
div32_320;_:
  ld bc,(var_b+2)
  dec bc
  ld (var_b+2),bc
  ld bc,(var_x+4)
  ex de,hl
  add hl,bc
  ld bc,(var_x+6)
  ex de,hl
  adc hl,bc
  jr nc,div32_320;-_
  or a
div32_32_final:
;HLDE is the new remainder
  ld bc,(var_x+6)
  sbc hl,bc
  jr z,div32_32_finaldecvarb;+_
  add hl,bc
  call div32_16
  ld (var_b),de   ;low 16-bits
  ret
div32_32_finaldecvarb;_:
  dec hl
  ld (var_b),hl
  ret
 endif