MUL__8_8.inc 文件:
;-------------------------------------------------------------
;
; 8位乘法器
;
;
; 输入两个8位常数 var1 和 var2,
; 输出一个16位数 R17,R18(低在先)
;
;-------------------------------------------------------------
.macro LDI__Rn
.if ((@1 >> 7) & 0x01)
SET
.else
CLT
.endif
BLD @0,7
.if ((@1 >> 6) & 0x01)
SET
.else
CLT
.endif
BLD @0,6
.if ((@1 >> 5) & 0x01)
SET
.else
CLT
.endif
BLD @0,5
.if ((@1 >> 4) & 0x01)
SET
.else
CLT
.endif
BLD @0,4
.if ((@1 >> 3) & 0x01)
SET
.else
CLT
.endif
BLD @0,3
.if ((@1 >> 2) & 0x01)
SET
.else
CLT
.endif
BLD @0,2
.if ((@1 >> 1) & 0x01)
SET
.else
CLT
.endif
BLD @0,1
.if (@1 & 0x01)
SET
.else
CLT
.endif
BLD @0,0
.endmacro
.macro CLR__Rn
CLT
BLD @0,7
BLD @0,6
BLD @0,5
BLD @0,4
BLD @0,3
BLD @0,2
BLD @0,1
BLD @0,0
.endmacro
.macro SET__Rn
SET
BLD @0,7
BLD @0,6
BLD @0,5
BLD @0,4
BLD @0,3
BLD @0,2
BLD @0,1
BLD @0,0
.endmacro
.macro BMOV ; Rn,b <--- Ri,b
BST @2, @3
BLD @0, @1
.endmacro
.macro ROR__Rn ; Rn,Cy,n(辅助进位)
BRCS ROR_Rn1
CLT
RJMP ROR_Rn2
ROR_Rn1:SET
ROR_Rn2:BLD R20,0
BST @0,0
BRTS ROR_Rn3
CLC
RJMP ROR_Rn4
ROR_Rn3:SEC
ROR_Rn4:BMOV @0,0,@0,1
BMOV @0,1,@0,2
BMOV @0,2,@0,3
BMOV @0,3,@0,4
BMOV @0,4,@0,5
BMOV @0,5,@0,6
BMOV @0,6,@0,7
BMOV @0,7,R20,0
.endmacro
.macro DEC__Rn ; Rn,Cy,n(辅助进位)
BMOV R20,0,@0,0
BMOV @0,0,@0,1
BMOV @0,1,@0,2
BMOV @0,2,@0,3
BMOV @0,3,@0,4
BMOV @0,4,@0,5
BMOV @0,5,@0,6
BMOV @0,6,@0,7
CLT
BLD @0,7
BST R20,0
.endmacro
.macro ADDC__1_1 ;(An,n),(Bn,n),(Cy,n)
; (An,n)+(Bn,n)+(Cy,n)==(Cy,n),(An,n)
SBRS @4,@5 ; Cy,n
RJMP CyC
CyS: SBRC @2,@3 ; Bn,n
RJMP SBnS
SBnC: SBRS @0,@1 ; An,n
RJMP SAnC
SAnS: CLT
BLD @0,@1 ; An,n
RJMP ADDC__1_1_END
SAnC: CLT
BLD @4,@5 ; Cy,n
SET
BLD @0,@1 ; An,n
SBnS: RJMP ADDC__1_1_END
CyC: SBRS @0,@1 ; An,n
RJMP CAnC
CAnS: SBRS @2,@3 ; Bn,n
RJMP CBnC
CBnS: SET
BLD @4,@5 ; Cy,n
CLT
BLD @0,@1 ; An,n
CBnC: RJMP ADDC__1_1_END
CAnC: BMOV @0,@1,@2,@3 ; An,n,Bn,n
ADDC__1_1_END:
.endmacro
.macro ADDC__8_8 ; Rm, Rn,(Cy,n)
; Rm+Rn--->Rm,(Cy,n)(低在先)
CLR__Rn R20
ADDC__1_1 @0,0,@1,0,R20,0
ADDC__1_1 @0,1,@1,1,R20,0
ADDC__1_1 @0,2,@1,2,R20,0
ADDC__1_1 @0,3,@1,3,R20,0
ADDC__1_1 @0,4,@1,4,R20,0
ADDC__1_1 @0,5,@1,5,R20,0
ADDC__1_1 @0,6,@1,6,R20,0
ADDC__1_1 @0,7,@1,7,R20,0
BST R20,0
BRTS ADDC_1
CLC
RJMP ADDC_2
ADDC_1: SEC
ADDC_2:
.endmacro |