📄 newmath.asm.svn-base
字号:
sjmp Mbcd_Ad300
Mbcd_Ad200:
lcall DORESULT ;拷贝计算结果(8字节整数+8字节小数)
mov r0,#11101111b ;设置标志 r0=0xef 结果没有溢出
; lcall DORESULT ;对计算结果的处理,判断整数及小数的长度
; mov a,b
; jz Mbcd_Ad210 ;如果不存在四舍五入问题
; lcall DEL4SAVE5 ;进行四舍五入处理
; lcall CALBCDLEN ;整数BCD码长R1, 小数BCD码长R0
; lcall ACTDOTLEN ;再次进行有效码长及小数点位数的确定
;Mbcd_Ad210:
; mov dptr,#(TEMPSTART+D3NUM)
; mov a,r0
; movx @dptr,a
Mbcd_Ad300:
mov dptr,#(TEMPSTART+ARITHFLAG)
movx a,@dptr
lcall JUDEGSIG_16 ;设置结果是否溢出标志
ret
;********************************
; 多字节带符号 BCD 码加法
;********************************
MBCD_ADD:
mov dptr,#(TEMPSTART+ARITHFLAG) ;取俩操作数符号
movx a,@dptr
anl a,#00000011b
cjne a,#0,MBCD_AD_10
ljmp MBCD_SU_21 ;************* +A + +B =+(a+b)
MBCD_AD_10:
cjne a,#1,MBCD_AD_20
ljmp MBCD_SU_30 ;****** -A + +B =+(b-a)
MBCD_AD_20:
cjne a,#2,MBCD_AD_30
ljmp MBCD_SU_32 ;****** +A + -B =+(a-b)
MBCD_AD_30:
ljmp MBCD_SU_12 ;************* -A + -B =-(a+b)
;********************************
; 多字节带符号 BCD 码减法
;********************************
MBCD_SUB:
mov dptr,#(TEMPSTART+ARITHFLAG) ;取俩操作数符号
movx a,@dptr
anl a,#00000011b
cjne a,#0,MBCD_SU_10
sjmp MBCD_SU_32 ;****** +A - +B =+(a-b)
MBCD_SU_10:
cjne a,#1,MBCD_SU_20
MBCD_SU_12: ;************* -A - +B =-(a+b)
movx a,@dptr
orl a,#00000100b
sjmp MBCD_SU_22
MBCD_SU_20:
cjne a,#2,MBCD_SU_30
MBCD_SU_21: ;************* +A - -B =+(a+b)
movx a,@dptr
anl a,#11111011b
MBCD_SU_22:
movx @dptr,a ;加法结果符号可直接确定
lcall MBCD_ADD_NS
sjmp MBCD_SU_50
MBCD_SU_30: ;****** ;-A - -B =+(b-a)
mov r3,#LENTH
lcall XMEMXCH ;第一第二操作数互换(BCD码)
MBCD_SU_32:
lcall MBCD_SUB_NS ;减法结果符号根据俩数大小确定
MBCD_SU_50:
ret
;********************************
; 多字节无符号 BCD 码减法
;OUT:
; R0=0x10 结果溢出标志.
; R0=0xef 正常状况下
;********************************
MBCD_SUB_NS:
mov r3,#LENTH
mov r7,#LOW(TEMPSTART+BCDD1BUF)
mov r6,#HIGH(TEMPSTART+BCDD1BUF)
mov r5,#LOW(TEMPSTART+BCDD2BUF)
mov r4,#HIGH(TEMPSTART+BCDD2BUF)
lcall XMEMCOMP
mov a,r7
cjne a,#1,Mbcd_Su20 ;被减数大于等于减数(r7=0 相等; r7=2 大于)
lcall XMEMXCH ;如果第一操作数小于第二操作数,则将第一第二操作数互换
mov dptr,#(TEMPSTART+ARITHFLAG)
movx a,@dptr
orl a,#00000100b
movx @dptr,a ;设置结果为负
sjmp Mbcd_Su10
;--------------------------- 12.18 改俞昆提"正负"号问题
Mbcd_Su20:
mov dptr,#(TEMPSTART+ARITHFLAG)
movx a,@dptr
anl a,#11111011b
movx @dptr,a ;设置结果为正
;--------------------------- 12.18 改俞昆提"正负"号问题
Mbcd_Su10:
lcall CHANGECOPY
lcall MBIN_SUB ;R3 未改变,仍然是#LENTH
jc Mbcd_Su100 ;如果结果溢出(此分支不可能,因为俩7字节BIN减不会溢出8字节)
lcall COMPTOMAX ;取结果送到临时区转换为BCD,并与极大值相比较 out: R7
mov a,r7
cjne a,#2,Mbcd_Su200 ;小于等于最大值
Mbcd_Su100:
mov r0,#LENTH
mov dptr,#(TEMPSTART+BCDD3BUF)
lcall Calcul_Clear
mov r0,#00010000b ;if r7=2 结果溢出,设置溢出标志 r0=010h, 并且全清结果
sjmp Mbcd_Su300
Mbcd_Su200:
lcall DORESULT ;拷贝计算结果(8字节整数+8字节小数)
mov r0,#11101111b ;if r7=0 or 1 结果没有溢出,设置标志 r0=0xefh
; lcall DORESULT ;对计算结果的处理,判断整数及小数的长度
; mov a,b
; jz Mbcd_Su210 ;如果不存在四舍五入问题
; lcall DEL4SAVE5 ;进行四舍五入处理
; lcall CALBCDLEN ;整数BCD码长R1, 小数BCD码长R0
; lcall ACTDOTLEN ;再次进行有效码长及小数点位数的确定
;Mbcd_Su210:
; mov dptr,#(TEMPSTART+D3NUM)
; mov a,r0
; movx @dptr,a
Mbcd_Su300:
mov dptr,#(TEMPSTART+ARITHFLAG)
movx a,@dptr
lcall JUDEGSIG_16 ;设置结果是否溢出标志
ret
;********************************
; 多字节无浮号 BCD 码乘法
;OUT:
; R0=0xEF 结果溢出标志.
; R0=0x10 结果未溢出标志.
;********************************
MBCD_MUL:
lcall CHANGECOPY
lcall MBIN_MUL ;R3 未改变,仍然是#LENTH
jnc Mbcd_Mu050
mov r0,#11101111b ;如果结果为零,设置标志 r0=0xef 结果没有溢出
sjmp Mbcd_Mu120
Mbcd_Mu050:
mov r3,#LENTH ;R3 被 MBIN_MUL 修改,因此需要重送
mov r7,#LOW(TEMPSTART+CENJI)
mov r6,#HIGH(TEMPSTART+CENJI)
mov r5,#LOW(TEMPSTART+BCDBIN1)
mov r4,#HIGH(TEMPSTART+BCDBIN1)
push ar3 ;注意:转换的长度为乘数(或被乘数)的俩倍长故此处R3需要保存
clr c
mov a,r3
rlc a
mov r3,a
lcall StrCopy
lcall XBIN_BCD ;取结果送到临时区转换为 BCD
pop ar3
lcall JUDGEINT ;判断BCD码结果的整数部分是否溢出
jc Mbcd_Mu100
mov a,r3
rrc a
add a,#LOW(TEMPSTART+BCDBIN2)
mov r7,a
mov a,#HIGH(TEMPSTART+BCDBIN2)
addc a,#0
mov r6,a ;R6R7 指向BCD码乘积结果的最底有效字节
mov r5,#LOW(TEMPSTART+MAXNUM)
mov r4,#HIGH(TEMPSTART+MAXNUM)
lcall XMEMCOMP ;与极大值相比较
mov a,r7
cjne a,#2,Mbcd_Mu200 ;小于等于最大值
Mbcd_Mu100:
mov r0,#00010000b ;if r7=2 结果溢出,设置溢出标志 r0=0x10 结果溢出
Mbcd_Mu120:
push ar0
mov r0,#LENTH
mov dptr,#(TEMPSTART+BCDD3BUF)
lcall Calcul_Clear
pop ar0
sjmp Mbcd_Mu300
Mbcd_Mu200:
clr c
mov a,r3
rrc a
add a,#LOW(TEMPSTART+BCDBIN2)
mov r7,a
mov a,#HIGH(TEMPSTART+BCDBIN2)
addc a,#0
mov r6,a ;R6R7 指向BCD码乘积结果的最底有效字节
lcall DORESU_10 ;拷贝计算结果(8字节整数+8字节小数)
Mbcd_Mu220:
mov r0,#11101111b ;if r7=0 or 1 结果正常,设置标志 r0=0xef 没有溢出
; lcall DORESU_10 ;对计算结果的处理,判断整数及小数的长度
; mov a,b
; jz Mbcd_Mu210 ;如果不存在四舍五入问题
; lcall DEL4SAVE5 ;进行四舍五入处理
; lcall CALBCDLEN ;整数BCD码长R1, 小数BCD码长R0
; lcall ACTDOTLEN ;再次进行有效码长及小数点位数的确定
;Mbcd_Mu210:
; mov dptr,#(TEMPSTART+D3NUM)
; mov a,r0
; movx @dptr,a
Mbcd_Mu300:
lcall JUDGESIGN ;结果符号及溢出标志处理
ret
;********************************
; 多字节无浮号 BCD 码除法
;OUT:
; R0=0xEF 结果溢出标志.
; R0=0x10 结果未溢出标志.
;********************************
MBCD_DIV:
mov r3,#LENTH
mov r7,#LOW(TEMPSTART+BCDD1BUF)
mov r6,#HIGH(TEMPSTART+BCDD1BUF)
mov r5,#LOW(TEMPSTART+BCDBIN1)
mov r4,#HIGH(TEMPSTART+BCDBIN1)
mov a,r3 ;
rl a ;
mov r0,a ;
mov dptr,#(TEMPSTART+BCDBIN1) ;
lcall Calcul_Clear ;清空BCDBIN转换缓冲区
lcall StrCopy ;取被除数(BCD码)送到转换缓冲区
lcall TIME10N ;被除数放大10的N次幂倍(N 等于欲显示的有效小数位数)
push ar3
mov a,r3
rl a
mov r3,a
lcall XBCD_BIN ;被除数转换为BIN(转换的长度为被除数的俩倍)
mov r7,#LOW(TEMPSTART+BCDBIN2)
mov r6,#HIGH(TEMPSTART+BCDBIN2)
mov r5,#LOW(TEMPSTART+DIVD1BUF)
mov r4,#HIGH(TEMPSTART+DIVD1BUF)
lcall StrCopy ;送到第一操作数区
pop ar3
mov r7,#LOW(TEMPSTART+BCDD2BUF)
mov r6,#HIGH(TEMPSTART+BCDD2BUF)
mov r5,#LOW(TEMPSTART+BCDBIN1)
mov r4,#HIGH(TEMPSTART+BCDBIN1)
mov a,r3 ;
rl a ;
mov r0,a ;
mov dptr,#(TEMPSTART+BCDBIN1) ;
lcall Calcul_Clear ;清空BCDBIN转换缓冲区
lcall StrCopy
mov a,r3
rl a
mov r3,a
lcall XBCD_BIN ;取除数送到临时区转换为BIN
mov r7,#LOW(TEMPSTART+BCDBIN2)
mov r6,#HIGH(TEMPSTART+BCDBIN2)
mov r5,#LOW(TEMPSTART+DIVD2BUF)
mov r4,#HIGH(TEMPSTART+DIVD2BUF)
lcall StrCopy ;送到第二操作数区
lcall MBIN_DIV ;out: a=0feh 商数为零; a=0ffh 除法溢出; a=0 一般情况
cjne a,#0feh,MBCD_D10
mov r0,#11101111b ;结果为零,r0=0xef 没有溢出标志
sjmp MBCD_D40
MBCD_D10:
cjne a,#0ffh,MBCD_D20
sjmp MBCD_D35 ;如果除法结果溢出
MBCD_D20:
mov r7,#LOW(TEMPSTART+SANADD)
mov r6,#HIGH(TEMPSTART+SANADD)
mov r5,#LOW(TEMPSTART+BCDBIN1)
mov r4,#HIGH(TEMPSTART+BCDBIN1)
lcall StrCopy ;商数拷贝到临时缓冲区
lcall XBIN_BCD ;转换为BCD码
clr c
mov a,r3
rrc a
mov r0,a ;r0=(偏移) dptr=#(BCDBIN1)+r0
mov r1,a ;r1=(长度)
lcall JUDGEI_10 ;判断BCD码结果的整数部分是否溢出
jc MBCD_D35 ;如果溢出
mov ar3,ar0 ;恢复ar3为16字节
mov r7,#LOW(TEMPSTART+BCDBIN2)
mov r6,#HIGH(TEMPSTART+BCDBIN2)
mov r5,#LOW(TEMPSTART+MAXNUM)
mov r4,#HIGH(TEMPSTART+MAXNUM)
lcall XMEMCOMP ;与极大值相比较
mov a,r7
cjne a,#2,MBCD_D50 ;小于等于最大值
MBCD_D35:
mov r0,#00010000b ;if r7=2 结果溢出,设置溢出标志 r0=0x10 结果溢出
MBCD_D40:
push ar0
mov r0,#LENTH ;全清结果
mov dptr,#(TEMPSTART+BCDD3BUF)
lcall Calcul_Clear
pop ar0
sjmp MBCD_D60
MBCD_D50:
lcall DORESULT ;拷贝计算结果(8字节整数+8字节小数)
mov r0,#11101111b ;if r7=0 or 1 结果正常,设置标志 r0=0xef 结果没有溢出
; lcall DORESULT ;对计算结果的处理,判断整数及小数的长度
; mov a,b
; jz MBCD_D55 ;如果不存在四舍五入问题
; lcall DEL4SAVE5 ;进行四舍五入处理
; lcall CALBCDLEN ;整数BCD码长R1, 小数BCD码长R0
; lcall ACTDOTLEN ;再次进行有效码长及小数点位数的确定
;MBCD_D55:
; mov dptr,#(TEMPSTART+D3NUM)
; mov a,r0
; movx @dptr,a
MBCD_D60:
lcall JUDGESIGN ;结果及溢出标志处理
ret
;***********************************
;函数说明: 将被除数(BCD码)放大10的N次幂
; IN: R3 -> 被除数(或除数)长度
; CHANGE: A,R0,R1,DPTR,Cy
; KEEP: R3
;***********************************
TIME10N:
mov a,r3
rl a
rl a
mov r0,a ;总的移位次数=(r3/2)*8
TIME10_05:
mov dptr,#(TEMPSTART+BCDBIN1)
mov a,r3
rl a
mov r1,a ;需要移位的字节数
clr c
TIME10_10:
movx a,@dptr
rlc a
movx @dptr,a
inc dptr
djnz r1,TIME10_10
djnz r0,TIME10_05
ret
;***************************************************
;函数说明: 判断乘积(或商数)的整数部分是否溢出(已经转为BCD码)
; 方法: 从乘积的最低字节向高位跳过 (乘数长度*1.5)字节
; 判断剩余字节是否全部为零,如果为零,没有溢出; 否则溢出.
;
; IN: R3->乘数(或被乘数)的字节长度
; OUT: Cy=1 溢出 ;Cy=0 没有溢出 ;
; CHANGE: R0,R1,A,DPTR,Cy
; KEEP: R3
;***************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -