📄 newmath.asm.svn-base
字号:
JUDGEINT:
clr c
mov a,r3
rrc a
mov r1,a ;r1=0.5*(乘数长度)
add a,r3
mov r0,a ;r0=1.5*(乘数长度)
JUDGEI_10:
mov dptr,#(TEMPSTART+BCDBIN2)
clr c ;-------- dptr + r0 -------
mov a,dpl
add a,r0
mov dpl,a
mov a,dph
addc a,#0
mov dph,a ;-------- dptr + r0 -------
setb c
JUDGEIN_10:
movx a,@dptr
jnz JUDGEIN_30
inc dptr
djnz r1,JUDGEIN_10
clr c
JUDGEIN_30:
ret
;**********************************************
;函数说明: 将传入的两串操作数BCD码转换为BIN码后分别
; 拷贝到第一操作数区和第二操作数区
;
;**********************************************
CHANGECOPY:
mov r3,#LENTH
mov r7,#LOW(TEMPSTART+BCDD1BUF)
mov r6,#HIGH(TEMPSTART+BCDD1BUF)
mov r5,#LOW(TEMPSTART+BCDBIN1)
mov r4,#HIGH(TEMPSTART+BCDBIN1)
lcall StrCopy
lcall XBCD_BIN ;取第一操作数送到临时区转换为BIN
mov r7,#LOW(TEMPSTART+BCDBIN2)
mov r6,#HIGH(TEMPSTART+BCDBIN2)
mov r5,#LOW(TEMPSTART+BIND1BUF)
mov r4,#HIGH(TEMPSTART+BIND1BUF)
lcall StrCopy ;送到第一操作数区
mov r7,#LOW(TEMPSTART+BCDD2BUF)
mov r6,#HIGH(TEMPSTART+BCDD2BUF)
mov r5,#LOW(TEMPSTART+BCDBIN1)
mov r4,#HIGH(TEMPSTART+BCDBIN1)
lcall StrCopy
lcall XBCD_BIN ;取第二操作数送到临时区转换为BIN
mov r7,#LOW(TEMPSTART+BCDBIN2)
mov r6,#HIGH(TEMPSTART+BCDBIN2)
mov r5,#LOW(TEMPSTART+BIND2BUF)
mov r4,#HIGH(TEMPSTART+BIND2BUF)
lcall StrCopy ;送到第二操作数区
ret
;*********************************
; 取结果送到临时区转换为BCD
; 并与极大值相比较
; IN : R3 -> 字符串长度
; OUT : R7=0(等) R7=1(小) R7=2(大)
;KEEP : R3
;*********************************
COMPTOMAX:
mov r7,#LOW(TEMPSTART+BIND1BUF)
mov r6,#HIGH(TEMPSTART+BIND1BUF)
COMPTOM_10:
mov r5,#LOW(TEMPSTART+BCDBIN1)
mov r4,#HIGH(TEMPSTART+BCDBIN1)
lcall StrCopy
lcall XBIN_BCD ;取结果送到临时区转换为 BCD
mov r7,#LOW(TEMPSTART+BCDBIN2)
mov r6,#HIGH(TEMPSTART+BCDBIN2)
mov r5,#LOW(TEMPSTART+MAXNUM)
mov r4,#HIGH(TEMPSTART+MAXNUM)
lcall XMEMCOMP ;与极大值相比较
ret
;************************************************
; 对计算结果的处理,判断整数及小数的长度
; IN: No
; OUT: R1 -> 整数位数 (<=#LENTH)
; R0 -> 实际小数位数 (<=#LENTH)
; B -> 需要四舍五入的标志(=0不需要,=1需要)
;************************************************
DORESULT:
mov r7,#LOW(TEMPSTART+BCDBIN2)
mov r6,#HIGH(TEMPSTART+BCDBIN2)
DORESU_10:
mov r5,#LOW(TEMPSTART+BCDD3BUF)
mov r4,#HIGH(TEMPSTART+BCDD3BUF)
lcall StrCopy ;将结果放入结果区域
ret
;DORESULT:
; mov r7,#LOW(TEMPSTART+BCDBIN2)
; mov r6,#HIGH(TEMPSTART+BCDBIN2)
;DORESU_10:
; mov r5,#LOW(TEMPSTART+BCDD3BUF)
; mov r4,#HIGH(TEMPSTART+BCDD3BUF)
; lcall StrCopy ;将结果放入结果区域
;
; mov r7,#LOW(TEMPSTART+BCDD3BUF)
; mov r6,#HIGH(TEMPSTART+BCDD3BUF)
;
; lcall CALBCDLEN ;整数BCD码长R1, 小数BCD码长R0
; lcall ACTDOTLEN ;截取有效小数位长R0 及 是否需要四舍五入处理的标志 R2(非0)
; ret
;*******************************************
; 计算整数部分的有效BCD码长度(自高位向低位数)
; 计算小数部分的有效BCD码长度(自低位向高位数)
; IN:
; R7 -> 字符串低位指针的低位
; R6 -> 字符串低位指针的高位
; R3 -> 字符串的长度
; OUT:
; R1 -> 整数部分BCD码的有效长度(<=#LENTH)
; R0 -> 小数部分BCD码的有效长度(<=#LENTH)
;CHANGE: A,B,R0,R1,R2,Cy
; KEEP: R3,R4~R7
;*******************************************
CALBCDLEN:
mov r0,#0
mov r1,#0
mov ar5,ar7
mov ar4,ar6 ;字符串的低位地址
mov a,r3
dec a
add a,r7
mov dpl,a
mov a,r6
addc a,#0
mov dph,a ;指向字符串的高位地址
clr c
mov a,r3
rr a
mov r2,a ;整数的长为全长的一半
mov b,a
CALBCDL10:
movx a,@dptr
jnz CALBCDL16 ;找到最高有效字节
lcall DPTRDEC1
djnz r2,CALBCDL10 ;如果a=0,继续
CALBCDL16:
clr c
mov a,r2
rl a
mov r1,a ;高位BCD字节数转为码的个数(此时的r1可能会多计一个,还需进一步判断最高有效字节的高字是否为零)
jz CALBCDL20 ;如果高位BCD全部为零,直接进入小数部分的计数
movx a,@dptr ;找出首个非零字节判断高字是否为零
anl a,#0f0h
jnz CALBCDL20
dec r1
ljmp CALBCDL20
CALBCDL20: ;开始小数部分
mov dpl,r5
mov dph,r4
mov r2,b
CALBCDL30:
movx a,@dptr
jnz CALBCDL35 ;找到最低有效字节
inc dptr
djnz r2,CALBCDL30 ;如果a=0,继续
CALBCDL35:
clr c
mov a,r2
rl a
mov r0,a ;低位BCD字节数转为码的个数(此时的r0可能会多计一个,还需进一步判断最低有效字节的低字是否为零)
jz CALBCDL100 ;如果低位BCD全部为零,结束
movx a,@dptr ;找出首个非零字节判断低字是否为零
anl a,#0fh
jnz CALBCDL100
dec r0
CALBCDL100:
ret
;******************************************************
; 计算结果的实际有效的小数位数 if(r0+r1>LENTH) r0=LENTH-r1
;
; IN: R1 -> 整数位数 (<=#LENTH)
; R0 -> 小数位数 (<=#LENTH)
; OUT: R0 -> 实际小数位数
; B -> 需要四舍五入的标志(=0不需要,=1需要)
;CHANGE: A,B,R0,Cy
; KEEP: R1
;*******************************************************
ACTDOTLEN:
mov b,#0
mov a,r0
add a,r1
cjne a,#LENTH,ACTDOTL10
sjmp ACTDOTL30
ACTDOTL10:
jc ACTDOTL30 ;<=LENTH
mov a,#LENTH
subb a,r1
mov r0,a
mov b,#1 ;将用于四舍五入的处理
ACTDOTL30:
ret
;*****************************************
; 结果的小数部分末位的四舍五入的处理
; IN:
; R0 -> 小数部分自低到高数有效的BCD码的个数
; R7 -> 字符串低位指针的低位
; R6 -> 字符串低位指针的高位
; R3 -> 字符串的长度
;CHANGE: A,B,R1,R2,R5,Cy
; KEEP: R0,R3,R6,R7
;*****************************************
DEL4SAVE5:
push ar3
push ar6
push ar7
clr c
mov a,r3
subb a,r0
mov b,#2 ;a为结果中小数部分自低到高数无效的BCD码的个数
jnz DEL4SAVE_1
ljmp DEL4SAVE_20 ;当小数部分全部有效时也无需四舍五入的处理
DEL4SAVE_1:
div ab ;out: a 为商数(即为无效字节长度), b 为余数
xch a,b
jnz DEL4SAVE_4 ;余数不为零
xch a,b
jz DEL4SAVE_5 ;if 无效字节长度=0
dec a
sjmp DEL4SAVE_5
DEL4SAVE_4:
xch a,b
DEL4SAVE_5:
mov r5,a ;无效字节长度保存
add a,r7
mov dpl,a
mov r7,a ;保存指针低位
mov a,r6
addc a,#0
mov dph,a
mov r6,a ;保存指针高位
movx a,@dptr
mov r2,a ;暂存
mov a,b
jz DEL4SAVE_6 ;如果 b(前面 div ab 产生的余数)为零,取该字节高4位的BCD
mov a,r2 ;否则取低字BCD
sjmp DEL4SAVE_7
DEL4SAVE_6:
mov a,r2
swap a
DEL4SAVE_7:
anl a,#0fh
cjne a,#4,DEL4SAVE_8
sjmp DEL4SAVE_13
DEL4SAVE_8:
jc DEL4SAVE_13 ;<=4,舍去
mov a,r3 ;>5 舍入
rr a
mov r3,a ;r3/2 四舍五入的字节长度
mov a,b
jz DEL4SAVE_10
mov a,r2
add a,#10h
da a
movx @dptr,a
sjmp DEL4SAVE_12
DEL4SAVE_10:
inc dptr
movx a,@dptr
add a,#01
DEL4SAVE_11:
da a
movx @dptr,a
djnz r3,DEL4SAVE_12
DEL4SAVE_13: ;将所有无效BCD码全部清为零
mov a,r7
mov dpl,a
mov a,r6
mov dph,a
mov a,b
jz DEL4SAVE_15
movx a,@dptr
anl a,#0f0h
sjmp DEL4SAVE_14a
DEL4SAVE_15:
mov a,#00h
DEL4SAVE_14a:
movx @dptr,a
DEL4SAVE_14:
lcall DPTRDEC1
mov a,r5
jz DEL4SAVE_20
dec r5
sjmp DEL4SAVE_15
DEL4SAVE_20:
pop ar7
pop ar6
pop ar3
ret
DEL4SAVE_12:
inc dptr
movx a,@dptr
addc a,#0
da a
movx @dptr,a
djnz r3,DEL4SAVE_12
sjmp DEL4SAVE_13
;*****************************
; 字符串拷贝
;IN: 源指针R7(低)R6(高)
; 目标指针R5(低)R4(高)
; 长度 R3
;OUT: NO
;CHANGE: R2,R4,R5,R6,R7,DPTR,A
; KEEP: R3,Cy
;*****************************
StrCopy:
mov ar2,ar3
StrCp_10:
mov dpl,r7
mov dph,r6
movx a,@dptr
lcall R7R6ADD1 ;指针加一
mov dpl,r5
mov dph,r4
movx @dptr,a
lcall R5R4ADD1 ;指针加一
djnz r2,StrCp_10 ;r3=LENGTH
ret
;void CALLDIV(uchar xdata *StringPt1,uchar xdata *StringPt2,uchar Length);
;-------------------------------------------------------------;
;Description: 多字节无符号 BCD 码除法 (不考虑余数,但计算四舍五入)
; 令被除数与除数等长,不足位在高位补零.
; OUT:
; A==除法益出标志. (A=0XFF, OVER; A=0, NOOVER)
;-------------------------------------------------------------;
;-------------------------------------------------------------;
;Description: 多字节无符号 BIN 码除法 (不考虑余数,但计算四舍五入)
; 令被除数与除数等长,不足位在高位补零.
; IN: R3-> 被除数的长度
;
; OUT:
; A=0xFE 被除数为零,除法结果为零标志
; A=0xFF 除数为零,除法益出标志.
; A=0x00 正常状况下
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -