📄 mutdiv.asm.svn-base
字号:
LCALL CalClear ;CLEAR +27 ~ +34
MOV A,R4
ADD A,#7
MOV R7,A ;SOURCE R7=+7~+10 (4 BYTES)
MOV R3,#4
LCALL _MBIN_MOV ;+7~+10 COPY TO +27 ~ +34
MOV A,R5 ;DEST R5=+27~+34 (8 BYTES)
CLR C
SUBB A,#8
MOV R7,A ;SOURCE R7=+19~+26 (8 BYTES)
MOV R3,#6
LCALL _NDIV ;(卖出价-发行价)*10000/发行价 商存于+11~+18 (ONLY USE +13 ~ +18)
MOV A,R4
ADD A,#7
MOV R0,A
MOV A,#6
LCALL CalClear ;CLEAR +7~+12 (6 BYTES) 存放 商数
MOV A,R4
ADD A,#19
MOV R0,A
MOV R1,A
MOV A,#6
LCALL CalClear ;CLEAR +19~+24 (6 BYTES)存放 除数
MOV A,R4
ADD A,#2
MOV R0,A
MOV A,@R0
MOV @R1,A ;已持有年数
MOV A,R1
MOV R5,A ;R5= +19 ~ +24
CLR C
SUBB A,#6
MOV R7,A ;R7= +13 ~ +18
MOV R3,#6
LCALL _NDIV ;(卖出价-发行价)*10000/发行价/YEARS 商存于+7~+12
MOV A,R4
MOV R0,A
MOV R1,A
MOV A,#6
LCALL CalClear ;CLEAR +0 ~ +5 存放被减数(利率值)
MOVX A,@DPTR
MOV @R1,A
INC R1
INC DPTR
MOVX A,@DPTR
MOV @R1,A ;SET 利率值 2 bytes
MOV A,R4
MOV R7,A
ADD A,#7
MOV R5,A ;(+0 ~ +5) +/- (+7 ~ +12)
MOV R3,#6
MOV A,R6
CJNE A,#0xFE,SaleCalc30
MOV R6,#0
LCALL _MBIN_SUB
JNC SaleCalc40
MOV A,R4
MOV R0,A
MOV R1,#6
LCALL BuCode
MOV A,R4
MOV R0,A
MOV R1,#6
LCALL _MBIN_AONE
MOV A,R4
ADD A,#4
MOV R0,A
MOV A,#0xFE
MOV @R0,A
SJMP SaleCalc50
SaleCalc30:
LCALL _MBIN_ADD
SaleCalc40:
MOV A,R4
ADD A,#4
MOV R0,A
CLR A
MOV @R0,A
SaleCalc50:
RET
DebtCalc20:
LJMP DebtCalc20B
DebtCalc10A:
CJNE A,#1,DebtCalc20
BuyCalc:
LCALL _SETLILVDPTR ;FIND FLASH POINTER
MOV A,R4
ADD A,#11
MOV R0,A
MOV R1,A
MOV A,#4
LCALL CalClear ;CLEAR +11 ~ +14
MOVX A,@DPTR
MOV @R1,A
INC R1
INC DPTR
MOVX A,@DPTR
MOV @R1,A ;SET 利率值 2 bytes
MOV A,R4
ADD A,#7
MOV R7,A ;R7= +7 ~ +10
ADD A,#4
MOV R5,A ;R5= +11 ~ +14
MOV R3,#4
LCALL _NMUL ;(发行价*利率)RESULT +15 ~ +22 (ONLY USE +15~+20)
MOV A,R4
ADD A,#11
MOV R5,A
ADD A,#4
MOV R7,A
MOV R3,#6
LCALL _MBIN_MOV ;COPY (+15 ~ +20) TO (+11 ~ +16) 存放 被乘数(发行价*利率)
MOV A,R4
ADD A,#17
MOV R0,A
MOV R1,A
MOV A,#6
LCALL CalClear ;CLEAR +17 ~ +22 存放 乘数(年数)
MOV A,R4
ADD A,#2
MOV R0,A
MOV A,@R0
MOV @R1,A ;存放 乘数(年数)
MOV A,R4
ADD A,#11
MOV R7,A
ADD A,#6
MOV R5,A
MOV R3,#6
LCALL _NMUL ;(发行价*利率*年数)RESULT +23 ~ +34 (ONLY USE +23~+29 7 BYTES)
; 注意:此处会破坏 RAM 中 (+40 ~ +47)单元
MOV A,R4
ADD A,#23
MOV R7,A ;R7=+23 ~ +29
ADD A,#8
MOV R5,A ;R5=+31 ~ +37
MOV R3,#7
LCALL _MBIN_MOV ;COPY (+23 ~ +29) TO (+31 ~ +37) PROTECT
MOV A,R4
ADD A,#3
MOV R5,A ;R5=+3 ~ +6 买入价
ADD A,#4
MOV R7,A ;R7=+7 ~ +10 发行价
MOV R3,#4
LCALL _MBIN_SUB ;(发行价-买入价) RESULT IN +7 ~ +10
JNC BuyCalc08
MOV R6,#0xFE
MOV A,R7
MOV R0,A
MOV R1,#4
LCALL BuCode
MOV A,R7
MOV R0,A
MOV R1,#4
LCALL _MBIN_AONE ;不够减,则取补码
BuyCalc08:
MOV A,R4
ADD A,#11
MOV R0,A
MOV R1,A
MOV A,#4
LCALL CalClear ;CLEAR +11 ~ +14
MOV A,#0x10
MOV @R1,A
INC R1
MOV A,#0x27
MOV @R1,A
DEC R1
MOV A,R1
MOV R5,A ;被乘数10000
CLR C
SUBB A,#4
MOV R7,A ;乘数=(发行价-买入价)
MOV R3,#4
LCALL _NMUL ;(发行价-买入价)*10000 RESULT IN +15 ~ +22 (ONLY USE +15 ~ +20)
MOV A,R4
ADD A,#15
MOV R5,A ;减数 R5=+15~+21 (发行价-买入价)
ADD A,#16
MOV R7,A ;被减数 R7=+31~+37 (发行价*利率*年数)
MOV R3,#7
MOV A,R6
CJNE A,#0xFE,BuyCalc09 ;(发行价-买入价)为正
MOV R6,#0 ;(发行价-买入价)为负
LCALL _MBIN_SUB ;(发行价*利率*年数)-[-(发行价-买入价)*10000] RESULT IN (+31~ +37)
JNC BuyCalc11
MOV R6,#0xFE
MOV A,R7
MOV R0,A
MOV R1,#7
LCALL BuCode
MOV A,R7
MOV R0,A
MOV R1,#7
LCALL _MBIN_AONE ;不够减,则取补码 (+31~ +37)
SJMP BuyCalc12
BuyCalc11:
MOV R6,#0
SJMP BuyCalc12
BuyCalc09:
LCALL _MBIN_ADD ;(发行价*利率*年数)+[+(发行价-买入价)*10000]RESULT IN (+31~ +37)
BuyCalc12:
MOV A,R4
ADD A,#7
MOV R0,A
MOV A,#24
LCALL CalClear ;CLEAR +7 ~ +30
MOV A,R4
ADD A,#14
MOV R5,A
MOV A,R4
ADD A,#31
MOV R7,A
MOV R3,#7
LCALL _MBIN_MOV ;COPY (+31~+37) TO (+14~+20) 被除数
MOV A,R4
ADD A,#3
MOV R7,A
MOV A,R4
ADD A,#21
MOV R5,A
MOV R3,#4
LCALL _MBIN_MOV ;COPY (+3~+6) TO (+21~+27) 除数
MOV A,R5 ;R5= +21 ~ +27
CLR C
SUBB A,#7
MOV R7,A ;R7= +14 ~ +20
MOV R3,#7
LCALL _NDIV ;R7/R5 RESULT IN (+7 ~ +13) 作为新的被除数
MOV A,R4
ADD A,#14
MOV R0,A
MOV R1,A
MOV A,#7
LCALL CalClear ;CLEAR +14 ~ +20
MOV A,R4
ADD A,#2
MOV R0,A
MOV A,@R0
MOV @R1,A ;取年数送入 (+14 ~ +20) 除数
MOV A,R4
MOV R0,A
MOV A,#7
LCALL CalClear ;CLEAR (+0 ~ +6) 存放商数
MOV A,R4
ADD A,#7
MOV R7,A ;R7 被除数
ADD A,#7
MOV R5,A ;R5 除数
MOV R3,#7
LCALL _NDIV ;RESULT (+0 ~ +7)
MOV A,R4
ADD A,#4
MOV R0,A ;+4
MOV A,R6
CJNE A,#0xFE,BuyCalc30
MOV @R0,A
RET
BuyCalc30:
CLR A
MOV @R0,A
RET
DebtCalc20B:
CJNE A,#2,DebtCalc30 ;IF no=0,1,2 MUST ERROR !
HoldCalc:
DebtCalc30:
RET
;-------------------------------------;
;Description: 取得利率表首地址
; IN: NO
; OUT: DPTR
;-------------------------------------;
_SETLILVDPTR:
MOV A,R4
MOV R0,A
INC R0
MOV A,@R0
JZ SETLILV20 ;IF TIME=0(3 YEAR),THEN
MOV DPTR,#(TEMPSTART+DEBTBEGIN+2) ;跳到第二个表表头 TIME=1(5 YEAR)
SJMP SETLILV30
SETLILV20:
MOV DPTR,#(DEBTBEGIN+TEMPSTART)
SETLILV30:
RET
;----------------------------------
; 模块名:HouseCalc MAKE:yujinhe
; 功能:个人住房贷款月还款的计算
;----------------------------------
_HouseCalc:
MOV A,R1
;; mov a,#30h ;?????????
MOV R4,A
Check_Hdata:
ADD A,#1
MOV R0,A ;+1
MOV A,@R0
JZ HdataErr ;YEAR=0 ERROR
INC R0
MOV R1,#4
Check_Hda10:
MOV A,@R0 ;+2
JNZ Check_Hend
INC R0
DJNZ R1,Check_Hda10
HdataErr: ;MONEY=0 ERROR
MOV A,R4
MOV R0,A
MOV A,#8
LCALL CalClear ;OUTPUT ALL CLEAR "0"
RET
Check_Hend:
MOV A,R4
INC A
MOV R0,A
ADD A,#5
MOV R1,A ;+6,+7 SAVE 12*N
MOV A,@R0 ;取出年数
MOV B,#12
MUL AB
MOV @R1,A ;12N LOW
INC R1
MOV A,B
MOV @R1,A ;12N HIGH
DEC R1
MOV A,R1
MOV R7,A
ADD A,#2
MOV R5,A
MOV R3,#2
LCALL _MBIN_MOV ;COPY 12N TO +8,+9
MOV A,R5
MOV R0,A
MOV A,@R0
ADD A,#1
MOV @R0,A
INC R0
MOV A,@R0
ADDC A,#0
MOV @R0,A ;12N+1
;; CLR C
;; RRC A
;; MOV @R0,A
;; DEC R0
;; MOV A,@R0
;; RRC A ;此处若除以 2 误差会较大,故应放后面乘完利率后再除 2 较好。
;; MOV @R0,A ;(12N+1)/2
MOV A,R4
MOV R0,A
MOV A,@R0
JNZ HouseCalc20
MOV DPTR,#HOUSEBEGIN+TEMPSTART
SJMP HouseCalc25
HouseCalc20:
MOV DPTR,#HOUSEBEGIN+2+TEMPSTART
HouseCalc25:
MOV A,R5
ADD A,#2
MOV R0,A
MOVX A,@DPTR
MOV @R0,A
INC R0
INC DPTR
MOVX A,@DPTR
MOV @R0,A ;传入利率 2 BYTES +10,+11
MOV A,R5
MOV R7,A ;SOURCE R7 +8,+9
ADD A,#2
MOV R5,A ;DEST R5 +10,+11
MOV R3,#2
LCALL _NMUL ;(12N+1)*4425 (4425 is 利率) RESULT +12 ~ +15
;; MOV A,R4
;; ADD A,#16
;; MOV R0,A
;; MOV R1,#4
;; CLR C
;;HouseCalc07:
;; DEC R0
;; MOV A,@R0
;; RRC A
;; MOV @R0,A
;; DJNZ R1,HouseCalc07 ;(12N+1)/2*4425 (4425 is 利率) RESULT +12 ~ +15
MOV A,R7
MOV R0,A
MOV A,#4
LCALL CalClear ;CLEAR +8 ~ +11
MOV A,R7
MOV R0,A
MOV A,#0x80
MOV @R0,A
INC R0
MOV A,#0x84
MOV @R0,A
INC R0
MOV A,#0x1E
MOV @R0,A ;被加数 2000000 存于 +8 ~ +11
INC R0
INC R0 ;+12
MOV A,R0
MOV R5,A ;R5= +12 ~ +15
MOV R3,#4 ;R7 NO CHANGE= +8 ~ +11
LCALL _MBIN_ADD ;(12N+1)*4425+2000000 RESULT +8 ~ +11
MOV A,R4
ADD A,#2
MOV R7,A ;SOURCE R7=+2 ~ +5 R5=+12 ~ +15 NO CHANGE
MOV R3,#4
LCALL _MBIN_MOV ;COPY +2 ~ +5 TO +12 ~ +15
MOV A,R5
SUBB A,#4
MOV R7,A ;SOURCE R7=+8 ~ +11 R5=+12 ~ +15 NO CHANGE
MOV R3,#4
LCALL _NMUL ;((12N+1)*4425+2000000)*70000 RESULT +16 ~ +23
MOV A,R4
ADD A,#8
MOV R0,A
MOV A,#8
LCALL CalClear ;CLEAR +8 ~ +15 用于存放商数
MOV A,R4
ADD A,#24
MOV R0,A
MOV R1,A
MOV A,#8
LCALL CalClear ;CLEAR +8 ~ +15 用于存放除数
MOV A,R1
PUSH ACC
MOV A,#0x80
MOV @R1,A
INC R1
MOV A,#0x84
MOV @R1,A
INC R1
MOV A,#0x1E
MOV @R1,A ;除数 2000000 存于 +8 ~ +15
POP ACC
MOV R5,A ;SOURCE R5=+24 ~ +31
SUBB A,#8
MOV R7,A ;SOURCE R7=+16 ~ +23
MOV R3,#8
LCALL _NDIV ;((12N+1)*4425+2000000)*70000/2000000 RESULT +8 ~ +15
MOV A,R4
ADD A,#16
MOV R0,A
MOV R5,A ;R5=+16,+17
MOV A,#8
LCALL CalClear ;CLEAR +16 ~ +23 用于存放除数
MOV A,R4
ADD A,#6
MOV R7,A ;R7=+6,+7
MOV R3,#2
LCALL _MBIN_MOV ;COPY +6,+7 TO +16,+17
MOV A,R4
MOV R0,A
MOV A,#8
LCALL CalClear ;CLEAR +0 ~ +7 用于存放商数
MOV A,R5 ;DEST R5= +16~ +23
SUBB A,#8
MOV R7,A ;SOURCE R7= +8 ~ +15
MOV R3,#8
LCALL _NDIV ;((12N+1)*4425+2000000)*70000/2000000/12N RESULT +0 ~ +7
RET
;--------------------------------------
; 模块名:SavingCalc MAKE:yujinhe
; 功能:个人存款利息的计算
;--------------------------------------
_SavingCalc:
MOV A,R1
;;;; mov a,#0x30 ;???????????
MOV R4,A
Check_Sdata:
ADD A,#1
MOV R0,A ;+1
MOV A,@R0
JNZ Check_Sda05
INC R0
MOV A,@R0 ;+2
JNZ Check_Sda05
SdataErr: ;YEAR=0 ERROR
MOV A,R4
MOV R0,A
MOV A,#8
LCALL CalClear ;OUTPUT ALL CLEAR "0"
RET
Check_Sda05:
MOV A,R4
ADD A,#3
MOV R0,A
MOV R1,#4
Check_Sda10:
MOV A,@R0 ;+3
JNZ Check_Send
INC R0
DJNZ R1,Check_Sda10
SJMP SdataErr ;MONEY=0 ERROR
Check_Send:
MOV A,R4
LCALL DATAJUDGE ;判断输入数据的合法性
MOV A,R4
ADD A,#7
MOV R0,A
MOV R1,A
MOV R3,#20
LCALL CalClear ;CLEAR WORKING RAM +7 ~ +26 (TOTAL 20 BYTES)
MOV DPTR,#SAVEBEGIN+TEMPSTART
MOV A,R4
MOV R0,A
MOV A,@R0
MOV R6,A ;取出 (储种) 作为搜索 利率表DPTR 的指针
MOV B,#2
LCALL DPTRADD05 ;SEARCH DPTR POINTER
MOVX A,@DPTR
MOV @R1,A
INC R1
INC DPTR
MOVX A,@DPTR
MOV @R1,A ;从 FLASH 取出 2 BYTES 利率值传入。
MOV A,R4
ADD A,#3
MOV R7,A ;金额 SOURCE R7=+3 ~ +6
ADD A,#4
MOV R5,A ;利率 DEST R5=+7 ~ +10
MOV R3,#4
LCALL _NMUL ;2000000*171 RESULT +11 ~ +18 (实际最大只用+11~+16)
; MOV A,R7
; MOV R0,A
; MOV A,#8
; LCALL CalClear ;CLEAR +3 ~ +10 将用于存储商数.
;
; MOV A,R4
; ADD A,#11
; MOV R0,A
; MOV R2,#2 ;MOVE 2 TIMES = 相当于乘 4 .
;SavingCalc05:
; MOV R3,#8 ;MOVE 8 BYTES
; CLR C
; MOV A,R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -