#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; }