mc8051fun/long_xdiv.c

70 lines
812 B
C
Raw Normal View History

2024-06-05 08:19:50 +02:00
#include "mc8051fun.h"
/*
* r0 = numerator
* r1 = denominator
* r2 = quotient (result)
* r3 = rest
* r7 = length in bytes
*/
void long_xdiv() __naked
{
__asm
.globl long_xdiv
long_xdiv:
mov r5,AR7 ;#0x01
push AR0
mov r0,AR3
lcall long_xset_zero
pop AR0
mov r4,AR1
clr c
mov a,r0
addc a,r5 ;#DIGITS-1
mov r0,a
003$:
movx a,@r0
mov r6,#8
002$:
rlc a
push ACC
push AR0
mov r0,AR3 ;#_rest
mov r7,AR5 ;#DIGITS
lcall long_xrlc
mov r0,AR3 ;#_rest
; mov r1,#_val1
mov r7,AR5 ;#DIGITS
push AR1
lcall long_xsub
pop AR1
jnc 001$
mov r0,AR3 ;#_rest
; mov r1,#_val1
mov r7,AR5 ;#DIGITS
push AR1
lcall long_xadd
pop AR1
setb c
001$:
cpl c
mov r0,AR2 ; #_result
mov r7,AR5 ;#DIGITS
lcall long_xrlc
pop AR0
pop ACC
djnz r6,002$
djnz r0,003$
ret
__endasm;
}