.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