📄 mutdiv.asm.svn-base
字号:
; PUSH ACC
;SavingCalc10:
; MOV A,@R0
; RLC A
; MOV @R0,A
; INC R0
; DJNZ R3,SavingCalc10
; POP ACC
; MOV R0,A
; DJNZ R2,SavingCalc05 ;2000000*171*4 (先计税后值 *0.8 = *4/5) RESULT +11 ~ +18
;
; MOV A,R4
; ADD A,#19
; MOV R0,A
; MOV R1,A
;
; PUSH ACC ;PROTECT +19
; MOV A,#8
; LCALL CalClear ;CLEAR +19 ~ +26 将用于存储 除数.(500)
; MOV A,#0xF4
; MOV @R1,A
; INC R1
; MOV A,#0x01
; MOV @R1,A ;fill with 除数 500
; POP ACC ;RESTORE +19
;
; MOV R5,A ;DEST R5=+19 ~ +26
; SUBB A,#8
; MOV R7,A ;SOURCE R7=+11 ~ +18
; MOV R3,#8
; LCALL _NDIV ;2000000*171/100*4/5 RESULT +3 ~ +10
; ;除的商绝对小于或等于 4 BYTES,故只需截取底 4 BYTES。(+0 ~ +3)
;
; MOV A,R4
; ADD A,#7
; MOV R0,A
; MOV R1,A
; MOV A,#20
; LCALL CalClear ;CLEAR WORKING RAM +7 ~ +26 (TOTAL 20 BYTES)
;
MOV A,R4
MOV R0,A
MOV A,@R0
JNZ SavingCalc25
;如果为活期:
SavingCalc20:
MOV A,R4
INC A
MOV R0,A ;天数 +1,+2
ADD A,#16
MOV R1,A ;+17,+18 (覆盖乘积2000000*171 RESULT +11 ~ +18 的高 2bytes)
MOV A,@R0
MOV @R1,A
INC R0
INC R1
MOV A,@R0
MOV @R1,A ;将天数存入乘数区 (2 BYTES)
MOV A,R4
MOV R5,A
ADD A,#11
MOV R7,A
MOV R3,#8
LCALL _MBIN_MOV ;COPY +11~+18 TO +0~+7
MOV A,R4
ADD A,#8
MOV R0,A
MOV A,#4
LCALL CalClear ;CLEAR +19 ~ +22 (乘数区 HIGH 4 BYTES)
MOV A,R4
MOV R7,A ;SOURCE R7= +0~+5
ADD A,#6
MOV R5,A ;DEST R5= +6~+11
MOV R3,#6
LCALL _NMUL ;2000000*171*DAYS RESULT +12 ~ +23(实际最大只用+12~+19 8 bytes)
MOV A,R4
MOV R0,A
MOV A,#12
LCALL CalClear ;CLEAR +0 ~ +11 (12 BYTES将用于存储商数.实际只用 +4 ~ +11)
MOV A,R4
ADD A,#20
MOV R0,A
MOV R1,A
MOV A,#8
LCALL CalClear ;CLEAR +20 ~ +27 (8 BYTES将用于存储除数.)
MOV A,#0x44
MOV @R1,A
INC R1
MOV A,#0x9E
MOV @R1,A
INC R1
MOV A,#0x45
MOV @R1,A ;存入除数 365*10000*5/4=4562500
DEC R1
DEC R1
MOV A,R1
MOV R5,A ;DEST R5 = +19 ~ +26
SUBB A,#8
MOV R7,A ;SOURCE R7 = +11 ~ +18
MOV R3,#8
LCALL _NDIV ;2000000*171*DAYS/365/10000/5*4 RESULT +3 ~ +10
SavingCalc22:
MOV A,R4
MOV R5,A ;DEST R5 = +0 ~ +7
ADD A,#4
MOV R7,A ;SOURCE R7 = +4 ~ +11
MOV R3,#8
LCALL _MBIN_MOV ;COPY +4 ~ +11 TO +0 ~ +7
RET
SavingCalc25:
CJNE A,#1,SavingCalc40
;如果为定期 3月或者6月:
SavingCalc30: ;3 months
MOV A,R4
INC A
MOV R0,A ;月数 +1,+2
ADD A,#16
MOV R1,A ;+17,+18 (覆盖乘积2000000*171 RESULT +11 ~ +18 的高 2bytes)
MOV A,@R0
MOV @R1,A
INC R0
INC R1
MOV A,@R0
MOV @R1,A ;将月数存入乘数区 (2 BYTES)
MOV A,R4
MOV R5,A
ADD A,#11
MOV R7,A
MOV R3,#8
LCALL _MBIN_MOV ;COPY +11~+18 TO +0~+7
MOV A,R4
ADD A,#8
MOV R0,A
MOV A,#4
LCALL CalClear ;CLEAR +19 ~ +22 (乘数区 HIGH 4 BYTES)
MOV A,R4
MOV R7,A ;SOURCE R7= +0~+5
ADD A,#6
MOV R5,A ;DEST R5= +6~+11
MOV R3,#6
LCALL _NMUL ;2000000*171*DAYS RESULT +12 ~ +23(实际最大只用+12~+19 8 bytes)
MOV A,R4
MOV R0,A
MOV A,#12
LCALL CalClear ;CLEAR +0 ~ +11 (12 BYTES将用于存储商数.实际只用 +4 ~ +11)
MOV A,R4
ADD A,#20
MOV R0,A
MOV R1,A
MOV A,#8
LCALL CalClear ;CLEAR +20 ~ +27 (8 BYTES将用于存储除数.)
MOV A,#0xF0
MOV @R1,A
INC R1
MOV A,#0x49
MOV @R1,A
INC R1
MOV A,#0x02
MOV @R1,A ;存入除数 12*10000*5/4=150000
DEC R1
DEC R1
MOV A,R1
MOV R5,A ;DEST R5 = +19 ~ +26
SUBB A,#8
MOV R7,A ;SOURCE R7 = +11 ~ +18
MOV R3,#8
LCALL _NDIV ;2000000*171*MONTHS/12/10000/5*4 RESULT +3 ~ +10
LJMP SavingCalc22 ;移商数到指针头
SavingCalc40:
CJNE A,#2,SavingCalc45
LJMP SavingCalc30 ;6 months
SavingCalc45:
CJNE A,#3,SavingCalc50
LJMP SavingCalc80 ;1 year
SavingCalc50:
CJNE A,#4,SavingCalc55
LJMP SavingCalc80 ;2 year
SavingCalc55:
CJNE A,#5,SavingCalc60
LJMP SavingCalc80 ;3 year
SavingCalc60:
CJNE A,#6,SavingCalc65
LJMP SavingCalc80 ;5 year
SavingCalc65:
MOV A,R4
MOV R0,A
CLR A
MOV @R0,A
INC R0
MOV @R0,A
INC R0
MOV @R0,A
INC R0
MOV @R0,A ;RETURN 4 BYTES "00"
RET
;如果为定期 1,2,3,5 年:
SavingCalc80:
MOV A,R4
INC A
MOV R0,A ;年数 +1,+2
ADD A,#16
MOV R1,A ;+17,+18 (覆盖乘积2000000*171 RESULT +11 ~ +18 的高 2bytes)
MOV A,@R0
MOV @R1,A
INC R0
INC R1
MOV A,@R0
MOV @R1,A ;将年数存入乘数区 (2 BYTES)
MOV A,R4
MOV R5,A
ADD A,#11
MOV R7,A
MOV R3,#8
LCALL _MBIN_MOV ;COPY +11~+18 TO +0~+7
MOV A,R4
ADD A,#8
MOV R0,A
MOV A,#4
LCALL CalClear ;CLEAR +19 ~ +22 (乘数区 HIGH 4 BYTES)
MOV A,R4
MOV R7,A ;SOURCE R7= +0~+5
ADD A,#6
MOV R5,A ;DEST R5= +6~+11
MOV R3,#6
LCALL _NMUL ;2000000*171*DAYS RESULT +12 ~ +23(实际最大只用+12~+19 8 bytes)
MOV A,R4
MOV R0,A
MOV A,#12
LCALL CalClear ;CLEAR +0 ~ +11 (12 BYTES将用于存储商数.实际只用 +4 ~ +11)
MOV A,R4
ADD A,#20
MOV R0,A
MOV R1,A
MOV A,#8
LCALL CalClear ;CLEAR +20 ~ +27 (8 BYTES将用于存储除数.)
MOV A,#0xD4
MOV @R1,A
INC R1
MOV A,#0x30
MOV @R1,A ;存入除数 10000*5/4=12500
DEC R1
MOV A,R1
MOV R5,A ;DEST R5 = +19 ~ +26
SUBB A,#8
MOV R7,A ;SOURCE R7 = +11 ~ +18
MOV R3,#8
LCALL _NDIV ;2000000*171*YEARS/10000/5*4 RESULT +3 ~ +10
LJMP SavingCalc22 ;移商数到指针头
;---------------------
;JUDGE THE INPUT DATA
;INPUT, OUTPUT : NO
;MAY BE CHANGE +1,+2
;---------------------
DATAJUDGE:
MOV A,R4
MOV R0,A
MOV A,@R0
INC R0 ;ONLY JUDGE TIME(LOW)
JZ DATAJU100 ;储种为活期不加判断
CJNE A,#1,DATAJU010
MOV A,@R0 ; 定期 3 个月
CLR C
SUBB A,#3
JNC DATAJU100 ;>= 3 MONTHS
SJMP DATAJU080
DATAJU010:
CJNE A,#2,DATAJU020
MOV A,@R0 ; 定期 6 个月
CLR C
SUBB A,#6
JNC DATAJU100 ;>= 6 MONTHS
SJMP DATAJU080
DATAJU020:
CJNE A,#4,DATAJU030
MOV A,@R0 ; 定期 2 年
CLR C
SUBB A,#2
JNC DATAJU100 ;>= 2 YEARS
SJMP DATAJU080
DATAJU030:
CJNE A,#5,DATAJU040
MOV A,@R0 ; 定期 3 年
CLR C
SUBB A,#3
JNC DATAJU100 ;>= 3 YEARS
SJMP DATAJU080
DATAJU040:
CJNE A,#6,DATAJU100
MOV A,@R0 ; 定期 5 年
CLR C
SUBB A,#5
JNC DATAJU100 ;>= 5 YEARS
DATAJU080:
INC R0
MOV A,@R0 ;继续判断数据高位是否为零。
JNZ DATAJU100
DEC R0
CLR A
MOV @R0,A ;数据高,低位均清零。
DATAJU100:
RET
;========================================================================;
;MBIN_MOV(uchar SourceAdd1,uchar SourceAdd2,uchar Length3)
;-------------------------------;
;Description: 多字节移位
; IN:
; R7==源地址,数据存放格式为先低后高
; R5==目的地址,数据存放格式为先低后高
; R3==Length
; OUT: NO
;-------------------------------;
_MBIN_MOV:
MOV A,R7
MOV R0,A
MOV A,R5
MOV R1,A
MBIN_MOV10:
MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R3,MBIN_MOV10
RET
;-----------------------------
;计算反码
; IN: R0 --> 入口地址指针
; R1 --> 长度
; OUT: NO
;-----------------------------
BuCode:
MOV A,@R0
XRL A,#0xFF
MOV @R0,A
INC R0
DJNZ R1,BuCode
RET
;-----------------------------
; 计算字串加一
; IN: R0 --> 入口地址指针
; R1 --> 长度(MUST >=2)
; OUT: Cy=1 OVER; ELSE Cy=0
;-----------------------------
_MBIN_AONE:
DEC R1
MOV A,@R0
ADD A,#1
MOV @R0,A
MBIN_AONE20:
INC R0
MOV A,@R0
ADDC A,#0
MOV @R0,A
DJNZ R1,MBIN_AONE20
RET
;========================================================================;
;bit _BCDADD(uchar SourceAdd1,uchar SourceAdd2,uchar Length3)
;-------------------------------;
;Description: 多字节BCD码加法
; IN:
; R7==加数起始地址
; R5==被加数起始地址
; R3==Length
; OUT:
; 和在SourceAdd1指向的缓冲区中,最高位进位在CY中
; USE: PSW、A、R2 堆栈需求: 2字节
;-------------------------------;
_BCDADD:
mov a,r7
mov r0,a
mov a,r5
mov r1,a
MOV A,R3 ;取字节数至R2中
MOV R2,A
ADD A,R0 ;初始化数据指针
MOV R0,A
MOV A,R2
ADD A,R1
MOV R1,A
CLR C
BCD1:
DEC R0 ;调整数据指针
DEC R1
MOV A,@R0
ADDC A,@R1 ;按字节相加
DA A ;十进制调整
MOV @R0,A ;和存回[R0]中
DJNZ R2,BCD1 ;处理完所有字节?
RET
;========================================================================;
;uchar BIN_BCD(uchar SourceAdd,uchar DestAdd,uchar length)
;-------------------------------;
;Description: converte BIN to BCD format
; IN:
; R7==BIN buffer address,存放顺序为先低后高
; R5==BCD buffer address,存放顺序为先低后高
; R3==converte length
; OUT: No
; R7==BCD 长度
; USE: A,B,DPTR,R0,R2,R3,R5,R6,R7
;-------------------------------;
BIN_BCD_Pro:
mov a,r5
mov r0,a ;clear target area
mov a,r3
mov r6,a
lcall CalClear
mov a,r3
mov b,#8
mul ab
mov r2,a ;bin lenght
bin_bcd13:
mov a,r7
mov r0,a
mov b,r3
clr c
bin_bcd11:
mov a,@r0
rlc a
mov @r0,a
inc r0
djnz b,bin_bcd11
mov b,r6
mov a,r5
mov r0,a
bin_bcd12:
mov a,@r0
addc a,@r0
da a
mov @r0,a
inc r0
djnz b,bin_bcd12
jnc bin_bcd131
mov @r0,#00h
inc r6
inc b
ljmp bin_bcd12
bin_bcd131:
djnz r2,bin_bcd13
mov a,r6
mov r7,a
ret
;========================================================================;
;uchar BCD_BIN(uchar SourceAdd,uchar DestAdd,uchar length)
;-------------------------------;
;Description: converte BCD to BIN
; IN:
; R7==BCD buffer address,存放格式为先低后高
; R5==BIN buffer address,存放格式为先低后高,指针指向低字节(out)
; R3==converte length
; OUT:
; USE:
;-------------------------------;
BCD_BIN_Pro:
mov a,r7
mov r0,a ;pointer
add a,r3
dec a
mov r1,a ;交换高低字节
mov a,r3
clr c
rrc a ;/2
mov r6,a
ExchangeDataLoop:
xch a,@r0
xch a,@r1
xch a,@r0
inc r0
dec r1
djnz r6,ExchangeDataLoop
mov a,r5
mov r0,a ;clear BIN buffer
mov a,r3 ;length
lcall CalClear
mov a,r7
mov r0,a ;BCD buffer pointer
mov a,r3 ;length
mov r4,a
BCD_BIN_Calcul:
lcall Mul10
mov a,@r0
swap a
anl a,#0fh
lcall AddSum
lcall Mul10
mov a,@r0
anl a,#0fh
lcall AddSum
inc r0
djnz r4,BCD_BIN_Calcul
ret
;========================================================================;
;Description: 缓冲区清零处理,*SourceAdd为缓冲区首址,Length为清零的长度
; IN:
; R0==缓冲区首址
; A ==Length
; OUT: No
; USE: R0,A,destroyed register B
;-------------------------------;
CalClear:
mov @r0,#00h
inc r0
dec a
jnz CalClear
RET
;------------------------------------------------------------------------;
Mul10:
mov a,r3 ;length
mov r6,a
mov a,r5 ;dest
mov r1,a
mov r2,#00h
clr c
Mul10_Loop:
mov a,@r1
mov b,#10
push psw
mul ab
pop psw
addc a,r2
mov @r1,a
mov r2,b
inc r1
djnz r6,Mul10_Loop
ret
;------------------------------------------------------------------------;
AddSum:
mov b,r5
mov r1,b ;dest
mov b,r3
add a,@r1
mov @r1,a
djnz b,AddSumLoop
ljmp AddSumExit
AddSumLoop:
inc r1
mov a,@r1
addc a,#00h
mov @r1,a
djnz b,AddSumLoop
AddSumExit:
ret
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -