Итерации по Ньютону. Может, кому пригодится
Код:
;-----------------------------------------------------------------------
; HL = SQRT(HL)
;-----------------------------------------------------------------------
sqrt:
;-----------------------------------------------------------------------
mov a,h
ana l
inr a
jz .FFFF
;-----------------------------------------------------------------------
xchg
.loop:
mov b,h
mov c,l
push d
push b
lxi h,0
call gg_d32a
pop h
push h
dad d
mov a,h
rar
mov h,a
mov a,l
rar
mov l,a
;-----------------------------------------------------------------------
pop b
pop d
mov a,b
cmp h
jnz .loop
mov a,l
cmp c
jnz .loop
;-----------------------------------------------------------------------
ret
;-----------------------------------------------------------------------
.FFFF:
mov h,a
ret
;-----------------------------------------------------------------------
Использует подпрограмму деления Д32А из книжки Гуртовцева и Гудыменко
Скрытый текст
Код:
;-----------------------------------------------------------------------
; HLDE / BC = DE (HL)
; CY=0 -> result overflow
;-----------------------------------------------------------------------
proc gg_d32a ; Д32А
;-----------------------------------------------------------------------
mov a,l
sub c
mov a,h
sbb b
rnc
call negb
xra a
.loop:
dad h
rar
xchg
dad h
xchg
jnc .m1
inx h
.m1:
push h
dad b
jnc .m2
ral
.m3:
inx d
inx sp
inx sp
adi 16
jnc .loop
; stc
ret
.m2:
ral
jc .m3
pop h
adi 16
jnc .loop
; stc
ret
;-----------------------------------------------------------------------
endp
;-----------------------------------------------------------------------
proc negb
mov a,b
cma
mov b,a
mov a,c
cma
mov c,a
inx b
ret
endp
;-----------------------------------------------------------------------
[свернуть]