Код:
;=======================================================================
; HL [A] = HL/10
;-----------------------------------------------------------------------
proc udiv10
;-----------------------------------------------------------------------
ora a
mov a,h
rar
mov b,a
mov a,l
rar
mov c,a ; bc = n >> 1
ora a
mov a,b
rar
mov d,a
mov a,c
rar
add c
mov e,a
mov c,a
mov a,d
adc b
mov b,a
mov d,a ; bc = de = (hl>>1)+(hl>>2) = q
xchg ; de = n ; bc = hl = q
xra a
call shr_hl.s4 ; hl = q >> 4
dad b ; hl = q = q + (q>>4)
mov c,h
mvi b,0
dad b ; hl = q = q + (q>>8)
xra a
call shr_hl.s3 ; hl = q = q >> 3
mov b,h
mov c,l ; bc = q
dad h
dad h
dad b
dad h ; hl = q*10
mov a,e
sub l
adi 6
rar
rar
rar
rar
ani 15 ; a = (r+6)>>4
add c
mov l,a
mov a,b
aci 0
mov h,a ; hl = q + ((r+6)>>4) = n/10
mov a,l
add a
add a
add l
add a ; a = l*10
sub e
cma
inr a ; a = e - l*10 (remainder)
ret
;-----------------------------------------------------------------------
.dummy = shr_hl
;-----------------------------------------------------------------------
endp
;=======================================================================
;
;=======================================================================
; FOR .s1-.s7 A MUST BE 0 !
;-----------------------------------------------------------------------
proc shr_hl
;-----------------------------------------------------------------------
xra a
.s1:
dad h
ral
.s2:
dad h
ral
.s3:
dad h
ral
.s4:
dad h
ral
.s5:
dad h
ral
.s6:
dad h
ral
.s7:
dad h
ral
mov l,h
mov h,a
ret
;-----------------------------------------------------------------------
endp
;=======================================================================