📄 mutdiv.asm.svn-base
字号:
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R3,DEC1TIME10
POP ACC
MOV R3,A
RET
;--------------------------------
; 被除数加除数一次,结果送回被除数
; LENGTH = R3
; IN :NO
; OUT: NO
;--------------------------------
ADD1TIME:
MOV A,R3
PUSH ACC
MOV A,R7
MOV R0,A ;被除数最高位
MOV A,R5
MOV R1,A ;除数最低位
CLR C
ADD1TIME10:
MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R3,ADD1TIME10
POP ACC
MOV R3,A
RET
;===================================
;===================================
;===================================
;===================================
;-------------------------------;
;Description: 多字节 BIN 码乘法
; IN:
; R7==被乘数起始地址(LOW)
; R5==乘数起始地址(LOW)
; R3==Length==为使程序简化,令 1<=R3<=32 BYTES
; 且令被乘数与乘数等长,不足位在高位补零.
; 这样总共最大移位 32*8=256,可用一个寄存器R2来控制
; OUT:
; ?==临时乘积起始地址(LOW) LEN=2*R3
; ?==最后的乘积起始地址(LOW) LEN=2*R3
; 最高位进位在CY中
;-------------------------------;
_NMUL:
LCALL CLEAR_LSCJ ; 清中间积
LCALL CLEAR_CJ ; 清乘积
MOV A,R3
RL A
RL A
RL A ; 假定R3<=16
MOV R2,A ; R2=总共最大移位BIT 数
MOV B,#0
NMUL_10:
LCALL CS_RR1 ; 乘数右移 1 BIT
JNC NMUL_CY0
NMUL_CY1:
MOV A,R2
PUSH ACC
LCALL CLEAR_LSCJ ; 清中间积
LCALL BCSCOPY ; 被乘数COPY到中间积
LCALL LSCJ_RLB ; 中间积左移B位
LCALL LSCJJZJ ; 中间积加到终积
POP ACC
MOV R2,A
NMUL_CY0:
INC B
DJNZ R2,NMUL_10
RET
;--------------------------
;将乘数R5右移 1 BIT, 保存于C
;R3,R5 不该变
;R0,A 该变
;--------------------------
CS_RR1:
MOV A,R3
PUSH ACC
CLR C
MOV A,R5
ADDC A,R3 ;GET THE MAX ADDR POINTER 此处地址在选择时,务必保证不溢出.
MOV R0,A
CLR C
CS_RRLOOP:
DEC R0
MOV A,@R0
RRC A
MOV @R0,A
DJNZ R3,CS_RRLOOP ;R3 为移位的 BYTE 数
POP ACC
MOV R3,A
RET
;----------------------------------
;将临时乘积左移 B BITS, C不保存,低位补0
;R3,R4,B 不该变
;R0,A 该变
;----------------------------------
LSCJ_RLB:
MOV A,B
PUSH ACC
JZ LSCJ_RLBEND
CLR C
LSCJ_RLBLOOP:
LCALL LSCJ_RL1
DJNZ B,LSCJ_RLBLOOP
LSCJ_RLBEND:
POP ACC
MOV B,A
RET
;----------------------------------
;将临时乘积 左移 1 BIT, C保存,低位补0
;R3 不该变
;R0,R2 该变
;----------------------------------
LSCJ_RL1:
MOV A,R3
MOV R2,A ;PROTECT R3
CLR C
RL A
RL A
ADDC A,R7 ;R7+R3*4=临时乘积BEGIN
MOV R0,A
MOV A,R3
RL A
MOV R3,A ;乘积长度=两倍的被乘数长度
LSCJ_RLLOOP:
MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R3,LSCJ_RLLOOP ;R3 为移位的 BYTE 数
MOV A,R2 ;RESTORE R3
MOV R3,A
RET
;=======================================;
;Description: 将被乘数 COPY 到 临时乘积
; IN: NO
; OUT: NO
; R0,R1,R2 该变
;---------------------------------------;
BCSCOPY:
MOV A,R3
MOV R2,A ;PROTECT R3
MOV A,R7
MOV R0,A ;SOURCE
CLR C
MOV A,R3
RL A
RL A
ADDC A,R7 ;R7+R3*4=临时乘积BEGIN
MOV R1,A ;DEST
BCSCOPY_LOOP:
MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R3,BCSCOPY_LOOP ;LENGTH
MOV A,R2
MOV R3,A ;RESTORE R3
BCSCOPY80:
CLR A
MOV @R1,A
INC R1
DJNZ R3,BCSCOPY80
MOV A,R2
MOV R3,A ;RESTORE R3
RET
;-------------------------------;
; 乘积清零
;-------------------------------;
CLEAR_CJ:
CLR C
MOV A,R3
RL A
ADDC A,R7 ;R7+R3*2=乘积 BEGIN
MOV R0,A
MOV A,R3
RL A
LCALL CalClear
RET
;-------------------------------;
; 临时乘积清零
;-------------------------------;
CLEAR_LSCJ:
CLR C
MOV A,R3
RL A
RL A
ADDC A,R7 ;R7+R3*4=临时乘积BEGIN
MOV R0,A
MOV A,R3
RL A
LCALL CalClear
RET
;=======================================;
;Description: 将临时乘积加到终积处
; IN: NO
; OUT: C 和的益出标志
; R3,R7 不该变
; R0,R1,A 该变
;---------------------------------------;
LSCJJZJ:
MOV A,R3
PUSH ACC
CLR C
MOV A,R3
RL A
ADDC A,R7 ;R7+R3*2=乘积 BEGIN
MOV R1,A ;DEST
MOV A,R3
RL A
ADDC A,R1 ;R1+R3*2=临时乘积 BEGIN
MOV R0,A ;SOURCE
MOV A,R3
RL A
MOV R3,A ;R3=R3*2 累加积的BYTE数
CLR C
LSCJJZJ_LOOP:
MOV A,@R0
ADDC A,@R1
MOV @R1,A
INC R0
INC R1
DJNZ R3,LSCJJZJ_LOOP ;LENGTH
POP ACC
MOV R3,A
RET
;===================================
;===================================
;===================================
;===================================
;-------------------------------;
;Description: 多字节 BIN 码加法
; IN:
; R7==加数起始地址(LOW)
; R5==被加数起始地址(LOW)
; R3==Length
; OUT:
; 和在SourceAdd1指向的缓冲区中,最高位进位在CY中
; USE: PSW、A、R2 堆栈需求: 2字节
;-------------------------------;
_MBIN_ADD:
MOV A,R7
MOV R0,A
MOV A,R5
MOV R1,A
CLR C
MBIN_A10:
MOV A,@R0
ADDC A,@R1 ;按字节相加
MOV @R0,A ;和存回[R0]中
INC R0 ;调整数据指针
INC R1
DJNZ R3,MBIN_A10 ;处理完所有字节?
RET
;========================================================================;
;bit BCD_Sub(uchar SourceAdd1,uchar SourceAdd2,uchar Length3)
;-------------------------------;
;Description: 多字节 BIN 码加法
; IN:
; R7==被减数起始地址,数据存放格式为先低后高
; R5==减数起始地址,数据存放格式为先低后高
; R3==Length
; OUT:
; 差在SourceAdd1指向的缓冲区中,最高位进位在CY中
; PSW、A、R2、R3 堆栈需求: 6字节
;-------------------------------;
_MBIN_SUB:
MOV A,R7
MOV R0,A
MOV A,R5
MOV R1,A
CLR C
MBIN_S10:
MOV A,@R0
SUBB A,@R1 ;按字节相减
MOV @R0,A ;存回[R0]中
INC R0 ;调整数据指针
INC R1
DJNZ R3,MBIN_S10 ;处理完所有字节?
RET
;-------------------------------------;
;Description: 多字节 BIN 码比较大小
; IN:
; R7==被减数起始地址,数据存放格式为先低后高
; R5==减数起始地址,数据存放格式为先低后高
; R3==Length
; OUT:
; CY=0 AND A=0 两串数相等
; CY=0 AND A=FF R7串大于R5串
; CY=1 R7串小于R5串
; PSW、A、R2、R3 堆栈需求:
;-------------------------------------;
_MBIN_COMP:
CLR C
MOV A,R7
ADDC A,R3
MOV R0,A ;源指针最高 BYTE
CLR C
MOV A,R5
ADDC A,R3
MOV R1,A ;目标指针最高 BYTE
CLR C
MBIN_CP10:
DEC R0 ;调整数据指针
DEC R1
MOV A,@R1
MOV B,A ;DEST -> B
MOV A,@R0 ;SOURCE -> A
CJNE A,B,MBIN_CP30
DJNZ R3,MBIN_CP10 ;处理完所有字节?
CLR A ;R7 = R5
MBIN_CP20:
RET
MBIN_CP30:
JC MBIN_CP20 ;R7 < R5
MOV A,#0xFF
SJMP MBIN_CP20 ;R7 > R5
;-------------------------------------;
;Description: 多字节 BIN 码比较大小
; IN:
; R7==被减数起始地址,数据存放格式为先低后高(LOW)
; DPTR==减数起始地址,数据存放格式为先低后高(LOW)
; R3==Length
; OUT:
; CY=0 AND A=0 两串数相等
; CY=0 AND A=FF R7串大于DPTR 串
; CY=1 R7串小于DPTR 串
; PSW、A、R2、R3 堆栈需求:
;-------------------------------------;
_MBIN_COMPX:
CLR C
MOV A,R7
ADDC A,R3
MOV R0,A ;源指针最高 BYTE
CLR C
MOV A,R3
MOV R1,A ;DPTR POINTER
MOV A,DPL
MOV R2,A ;DPL PROTECT
MBIN_CPX10:
MOV A,R2
MOV DPL,A ;DPL RESTORE
DEC R0 ;调整数据指针
DEC R1
CLR C
MOV A,DPL
ADDC A,R1
MOV DPL,A
MOV A,DPH
ADDC A,#0
MOV DPH,A
MOVX A,@DPTR ;DPTR + R1
MOV B,A ;DEST -> B
MOV A,@R0 ;SOURCE -> A
CJNE A,B,MBIN_CPX30
DJNZ R3,MBIN_CPX10 ;处理完所有字节?
CLR A ;R7 = DPTR
MBIN_CPX20:
RET
MBIN_CPX30:
JC MBIN_CPX20 ;R7 < DPTR
MOV A,#0xFF
SJMP MBIN_CPX20 ;R7 > DPTR
;-------------------------------------;
;Description: 多字节 BIN 码比较大小
; IN: R6 TABLE POINTER
; OUT: DPTR
;-------------------------------------;
DPTRADD:
MOV B,#9 ;表每行 9 BYTES。(4 BYTES 等级数,4 BYTES 速算扣除数,1 BYTE 税率)
DPTRADD05:
MOV A,R6
MUL AB ; 9*9=45 故乘的结果 B=0,只用 A
MOV B,A
DPTRADD10:
CLR C
MOV A,DPL
ADDC A,B
MOV DPL,A
MOV A,DPH
ADDC A,#0
MOV DPH,A ;DPTR + B
RET
;-------------------------------------;
;Description: SET DPTR NO.1 ADDR
; IN: NO
; OUT: DPTR
;-------------------------------------;
_SETDPTR:
MOV A,R4
MOV R0,A
MOV A,@R0
JZ SETDPTR20 ;IF TAXNO=0,THEN
MOV DPTR,#(TEMPSTART+FLASHBEGIN)+81 ;跳到第二个税表表头
SJMP SETDPTR30
SETDPTR20:
MOV DPTR,#(FLASHBEGIN+TEMPSTART)
SETDPTR30:
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
;---------------------------------------------------------------------
;函数名:DebtCalc @2002/4/17
;入口:yieldno -- 收益率种类
; outprice -- 卖出价格
; inprice -- 买入价格
; baseprice -- 发行价格
; yearno -- 持有年数
; debtno -- 国债种类
;出口:yieldtop 收益率(无百分数格式,例如:输出为1050,则其收益率为 10。5%)
;---------------------------------------------------------------------
;RAM:
;1 byte yieldno (0: sale 1: buy 2 hold)
;1 byte debtno (0: 3year 1: 5year)
;1 byte years
;4 byte outprice(if yield=0,2) or inprice (if yield=1)
;4 byte baseprice
;
DebtCalc10:
LJMP DebtCalc10A
_DebtCalc:
MOV A,R1
; mov a,#2dh ;???????????
MOV R4,A ;为可用内 RAM 之首地址,指向 -->TAXNO
CHECKDATA:
ADD A,#2
MOV R0,A ;+2
MOV A,@R0
JZ DebtErr ;YEAR=0 ERROR
;02-5-28 20:19
DEC R0 ;IF YEAR != 0
MOV A,@R0
INC R0
JNZ CHECK_DEBT05 ;KIND=5 年期
CHECK_DEBT03: ;KIND=3 年期
MOV A,@R0
ANL A,#0FCH ;02-6-4 9:10
JZ CHECK_DEBT10 ;IF YEARS <= 3
MOV A,#3
MOV @R0,A
SJMP CHECK_DEBT10
CHECK_DEBT05:
MOV A,@R0
CJNE A,#6,CHECK_DEBT06
CHECK_DEBT08: ;IF A=6
MOV A,#5
MOV @R0,A
SJMP CHECK_DEBT10
CHECK_DEBT06:
JNC CHECK_DEBT08 ;IF A>6
CHECK_DEBT10:
MOV A,R4
ADD A,#3
MOV R0,A ;DEBT PRICE
MOV R1,#4
CHECKPRICE:
MOV A,@R0 ;+3
JNZ CHECKPR50
INC R0
DJNZ R1,CHECKPRICE
SJMP DebtErr ;PRICE1=0 ERROR
CHECKPR50:
MOV A,R4
ADD A,#7
MOV R0,A
MOV R1,#4
CHECKPR60:
MOV A,@R0 ;+7
JNZ CHECKEND
INC R0
DJNZ R1,CHECKPR60
DebtErr: ;PRICE2=0 ERROR
MOV A,R4
MOV R0,A
MOV A,#8
LCALL CalClear ;OUTPUT ALL CLEAR "0"
RET
CHECKEND:
MOV A,R4
MOV R0,A
MOV A,@R0
CJNE A,#0,DebtCalc10
SaleCalc:
LCALL _SETLILVDPTR ;FIND FLASH POINTER
MOV A,R4
ADD A,#3
MOV R7,A
ADD A,#ALL_LENTH
MOV R5,A
MOV R3,#ALL_LENTH
LCALL _MBIN_SUB ;减的结果为(卖出价-买入价) ;+3 ~ +7
JNC SaleCalc20 ;减的结果为正 02-4-22 11:48
MOV R6,#0FEH ;减的结果为负
MOV A,R7
MOV R0,A
MOV R1,#4
LCALL BuCode ;计算反码
MOV A,R7
MOV R0,A
MOV R1,#4
LCALL _MBIN_AONE ;计算补码( = 反码 + 1) ;+3 ~ +7
SaleCalc20:
MOV A,R5 ;R7 NO CHANGE (+3)
ADD A,#ALL_LENTH
MOV R5,A ;R5=+11
MOV R3,#ALL_LENTH
LCALL _MBIN_MOV ;COPY +3~+6 -> +11~+14
MOV A,R5
ADD A,#ALL_LENTH
MOV R0,A ;R0=+15
MOV R1,A
PUSH ACC ;+15 PROTECT
MOV A,#ALL_LENTH
LCALL CalClear ;CLEAR +15 ~ +18
MOV A,#10H
MOV @R1,A
INC R1
MOV A,#27H
MOV @R1,A ;乘数 = 10000 (2710H)
POP ACC ;+15 RESTORE
MOV R5,A ;乘数 +15 ~ +18
SUBB A,#ALL_LENTH
MOV R7,A ;被乘数 +11 ~ +14
MOV R3,#ALL_LENTH ;LENGTH
LCALL _NMUL ;(卖出价-发行价)*10000 RESULT +19 ~ +26 (ONLY USE +19 ~ +24)
MOV A,R4
ADD A,#11
MOV R0,A
MOV A,#8
LCALL CalClear ;CLEAR +11 ~ +18 存放 商数
MOV A,R4
ADD A,#27
MOV R0,A
MOV R5,A ;DEST R5=+27~+34 (8 BYTES)
MOV A,#8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -