[an error occurred while processing this directive]
|
;Регистры используемые в 32 битной арифметике
Dst equ 50h
Dst_0 equ 50h
Dst_1 equ 51h
Dst_2 equ 52h
Dst_3 equ 53h
Tmp equ 54h
Tmp_0 equ 54h
Tmp_1 equ 55h
Tmp_2 equ 56h
Tmp_3 equ 57h
Src equ 58h
Src_0 equ 58h
Src_1 equ 59h
; Деление: Tmp(32 бит) / Src(16 бит) => Dst(32 бит), R6:R7 - остаток, C=1
Div_32_16:
clr A
mov R6, A
mov R7, A
mov Dst_3, A
mov Dst_2, A
mov Dst_1, A
mov Dst_0, #11$: clr C ; Ротация влево делимого с сохpанением бита
mov A, Tmp_0 ; пеpеноса в C
rlc A
mov Tmp_0, A
mov A, Tmp_1
rlc A
mov Tmp_1, A
mov A, Tmp_2
rlc A
mov Tmp_2, A
mov A, Tmp_3
rlc A
mov Tmp_3, A
jnc 2$
inc Tmp_02$: mov A, R7 ; Получаем текущий остаток деления
rlc A
mov R7, A
mov A, R6
rlc A
mov R6, A
jc 3$mov A, Src_1 ; Пpовеpка R6:R7 >= Src
subb A, R6 ; C: Src_1 < R6
jc 3$
jnz 4$
mov A, Src_0
subb A, R7 ; C: Src_0 < R7
jc 3$
jnz 4$3$: clr C ; Вычитаем делитель из текущего остатка
mov A, R7
subb A, Src_0
mov R7, A
mov A, R6
subb A, Src_1
mov R6, A
setb C4$: mov A, Dst_0 ; Сдвиг частного влево
rlc A
mov Dst_0, A
mov A, Dst_1
rlc A
mov Dst_1, A
mov A, Dst_2
rlc A
mov Dst_2, A
mov A, Dst_3
rlc A
mov Dst_3, Ajnc 1$
ret; Деление: Tmp(24 бит) / Src(16 бит) => Dst(24 бит), R6:R7 - остаток, C=1
Div_32_16:
clr A
mov R6, A
mov R7, A
mov Dst_2, A
mov Dst_1, A
mov Dst_0, #11$: clr C ; Ротация влево делимого с сохpанением бита
mov A, Tmp_0 ; пеpеноса в C
rlc A
mov Tmp_0, A
mov A, Tmp_1
rlc A
mov Tmp_1, A
mov A, Tmp_2
rlc A
mov Tmp_2, A
jnc 2$
inc Tmp_02$: mov A, R7 ; Получаем текущий остаток деления
rlc A
mov R7, A
mov A, R6
rlc A
mov R6, A
jc 3$mov A, Src_1 ; Пpовеpка R6:R7 >= Src
subb A, R6 ; C: Src_1 < R6
jc 3$
jnz 4$
mov A, Src_0
subb A, R7 ; C: Src_0 < R7
jc 3$
jnz 4$3$: clr C ; Вычитаем делитель из текущего остатка
mov A, R7
subb A, Src_0
mov R7, A
mov A, R6
subb A, Src_1
mov R6, A
setb C4$: mov A, Dst_0 ; Сдвиг частного влево
rlc A
mov Dst_0, A
mov A, Dst_1
rlc A
mov Dst_1, A
mov A, Dst_2
rlc A
mov Dst_2, Ajnc 1$
ret; Деление: Tmp(16 бит) / Src(16 бит) => Dst(16 бит), R6:R7 - остаток, C=1
Div_16_16:
clr A
mov R6, A
mov R7, A
mov Dst_1, A
mov Dst_0, #11$: clr C ; Ротация влево делимого с сохpанением бита
mov A, Tmp_0 ; пеpеноса в C
rlc A
mov Tmp_0, A
mov A, Tmp_1
rlc A
mov Tmp_1, A
jnc 2$
inc Tmp_02$: mov A, R7 ; Получаем текущий остаток деления
rlc A
mov R7, A
mov A, R6
rlc A
mov R6, A
jc 3$mov A, Src_1 ; Пpовеpка R6:R7 >= Src
subb A, R6 ; C: Src_1 < R6
jc 3$
jnz 4$
mov A, Src_0
subb A, R7 ; C: Src_0 < R7
jc 3$
jnz 4$3$: clr C ; Вычитаем делитель из текущего остатка
mov A, R7
subb A, Src_0
mov R7, A
mov A, R6
subb A, Src_1
mov R6, A
setb C4$: mov A, Dst_0 ; Сдвиг частного влево
rlc A
mov Dst_0, A
mov A, Dst_1
rlc A
mov Dst_1, A
jnc 1$
ret
E-mail: info@telesys.ru