.MACRO div16 ;div16 ra,rb,rc,rd ;ra:rb/rc:rd=r0:r1...r2:r3
push @0
push @1
push @2
push @3
clr r0
clr r1
clr r2
clr r3
inc r3
div16_1:
cp @0,@2
brcs div16_3
brne div16_2
cp @1,@3
breq div16_5
brcs div16_3
div16_2: ;A>B
cpi @2,0x80
brpl div16_5
lsl @3
rol @2
lsl r3
rol r2
cpi @2,0x7f
rjmp div16_1
div16_3:
cpi @0,0 ;A=0? yes:end
brne div16_4
cpi @1,0
breq div16_e
div16_4:
lsr @2
ror @3
lsr r2
ror r3
brne div16_41
tst r2
breq div16_e
div16_41:
cp @1,@3
cpc @0,@2
brcs div16_4
div16_5:
sub @1,@3
sbc @0,@2
add r1,r3
adc r0,r2
rjmp div16_3
div16_e:
mov r2,@0
mov r3,@1
pop @3
pop @2
pop @1
pop @0
.ENDMACRO
.MACRO mul16 ;mul16 ra,rb,rc,rd ;r0:r1:r2:r3=ra:rb*rc:rd
;work r4
push @2
push @3
push @0
push @1
clr r0
clr r1
clr r2
clr r3
clr r4
A_BL:
lsr @3
brcc A_BL1
add r3,@1
adc r2,@0
adc r1,r4
A_BL1:
tst @3
breq A_BH
lsl @1
rol @0
rol r4
rjmp A_BL
A_BH:
pop @1
pop @0
pop @3
push @3
push @0
push @1
clr r4
A_BH1:
lsr @2
brcc A_BH2
add r2,@1
adc r1,@0
adc r0,r4
A_BH2:
tst @2
breq mul16e
lsl @1
rol @0
rol r4
rjmp A_BH1
mul16e:
pop @1
pop @0
pop @3
pop @2
.ENDMACRO
.MACRO mul16s ;mul16s ra,rb,rc,rd
;r0:r1:r2:r3=ra:rb*rc:rd
;work r4,r5
clr r0
clr r1
clr r2
clr r3
clr r4
clr r5
;
tst @0
brpl f_1
neg @1
sbc r4,@0
mov @0,r4
clr
r4
inc r5
f_1: tst @2
brpl f_0
neg @3
sbc r4,@2
mov @2,r4
clr r4
dec r5
f_0:
push @3
push @0
push @1
A_BLs:
lsr @3
brcc A_BLs1
add r3,@1
adc r2,@0
adc r1,r4
A_BLs1:
tst @3
breq A_BHs
lsl @1
rol @0
rol r4
rjmp A_BLs
A_BHs:
pop @1
pop @0
pop @3
clr r4
A_BHs1:
lsr @2
brcc A_BHs2
add r2,@1
adc r1,@0
adc r0,r4
A_BHs2:
tst @2
breq mul16es
lsl @1
rol @0
rol r4
rjmp A_BHs1
mul16es:
tst r5
breq mul16es1
clr r5
neg r3
sbc r5,r2
mov r2,r5
clr r5
sbc r5,r1
mov r1,r5
clr r5
sbc r5,r0
mov r0,r5
mul16es1:
.ENDMACRO