📄 emc_mult_div.c
字号:
;input-----a 单字节十六进制转成BCD
;output-----b0_bcdall
;translate hex to bcd.
hextobcd_trans:
mov b0_bcdall, a
clr b0_bcd
hextobcd_loop:
mov a, @10
sub a, b0_bcdall
jbs r3, _c
jmp hextobcd_out
mov b0_bcdall, a
inc b0_bcd
jmp hextobcd_loop
hextobcd_out:
swapa b0_bcd
add b0_bcdall, a
ret
sub_getbcdHL: ;input:b0_bcdall output:b0_bcdL,b0_bcdH
mov a, b0_bcdall
and a, @0x0f
mov b0_bcdL, a
swapa b0_bcdall
and a, @0x0f
mov b0_bcdH, a
RET
;(17) 标号: HB2 功能:双字节十六进制整数转换成双字节BCD码整数
;低地址存高位数据。
;;入口条件:待转换的双字节十六进制整数在R26、R27中。
;出口信息:转换后的三字节BCD码整数在R23、R24、R25中。
;影响资源:PSW、A、R22~R27 堆栈需求: 2字节
TwoByteHEXToBCD: ;BANK1 R22~R27
BANK1
CLRA; ;BCD码初始化
MOV b1_R23,A
MOV b1_R24,A
MOV b1_R25,A
MOVRK b1_R22,@10H; ;转换双字节十六进制整数 ;.........CH
HB3: MOV A,b1_R27; ;从高端移出待转换数的一位到CY中
MOV r_backup,a
RLCA r_backup
MOV b1_R27,A
MOV A,b1_R26
MOV r_backup,a
RLCA r_backup
MOV b1_R26,A
MOV A,b1_R25; ;BCD码带进位自身相加,相当于乘2
JBC STATUS,_C
INC b1_R25
ADD A,b1_R25
;ADDC A,b1_R25 ;.............CH
DAA ; ;十进制调整 ;............CH
MOV b1_R25,A
MOV A,b1_R24
JBC STATUS,_C
INC b1_R24
ADD A,b1_R24
;ADDC A,b1_R24
DAA ;............CH
MOV b1_R24,A
MOV A,b1_R23
JBC STATUS,_C
INC b1_R23
ADD A,b1_R23
;ADDC A,b1_R23
MOV b1_R23,A ;;双字节十六进制数的万位数不超过6,不用调整
;DJNZ b1_R22,HB3 ;处理完16bit ;..........CH
DJZ b1_R22
JMP HB3
RET
mult_8bit: ;只适用于单字节乘以单字节( 运算过程中乘机的高低位恰与计算结果的高低位反,故得到结果后从新存一次到指定的存贮。
BANK1
movrk b1_BitMult,@8
clr b1_productl
clr b1_producth
loop8_mult:
bc status,_c
rrc b1_ActiveMult
jbs status,_c
jmp jmpproductshift
; jp nc,jmpproductshift
mov a,b1_PassMult
add b1_productl,a
jbc status,_c
inc b1_producth
; adc b1_producth,@0
jmpproductshift:
bc status,_c
rrc b1_productl
rrc b1_producth
DEC b1_BitMult
jbs status,_Z
jmp loop8_mult
; JP NZ,loop8_mult
; movrr b1_ProducthFinish,b1_productl
; movrr b1_ProductlFinish,b1_producth
ret
mult_24bit: ;适用于双字节乘以单字节、单乘以单字节。
BANK1
; movrk b1_ActiveMulth,@00h
; movrk b1_ActiveMult,@0f0h
; movrk b1_PassMult,@0ch
movrk b1_BitMult,@25
clr b1_producth
clr b1_productm
clr b1_productl
clr b1_Cstore
loop24_mult:
;rcf
bc status,_C
rrc b1_ActiveMulth
rrc b1_ActiveMult
;jp nc,jmpproductshift24
JBS status,_C
JMP jmpproductshift24
; rcf
bc status,_C
bc status,_Z
; add r_product5,pass_mult2
MOV A,b1_PassMult
ADD b1_productl,A
; adc r_product4,pass_mult1
JBS status,_C
JMP jmpproductshift24
INC b1_productm
JBC STATUS,_Z
INC b1_producth
jmpproductshift24:
; TM b1_Cstore,@00000001B
; JP NZ,jmpcset
; rcf
; jr jmp_rrcp_com
JBC b1_Cstore,0
JMP jmpcset
BC STATUS,_C
JMP jmp_rrcp_com
jmpcset:
; scf
bs status,_C
jmp_rrcp_com:
rrc b1_producth
rrc b1_productm
rrc b1_productl
; jp c,jmporcstore
JBC STATUS,_C
JMP jmporcstore
movrk b1_Cstore,@00h
; jr jmpc_com
JMP jmpc_com
jmporcstore:
movrk b1_Cstore,@01h
jmpc_com:
DJZ b1_BitMult
JMP loop24_mult
ret
mult_32bit: ;适用于三字节乘以单字节,双字节乘以单字节、单乘以单字节。
BANK1
; movrk b1_ActiveMulth,@00h
; movrk b1_ActiveMultm,@00h
; movrk b1_ActiveMult,@034h
; movrk b1_PassMult,@0ch
movrk b1_BitMult,@33 ;4*8
clr b1_producth
clr b1_productmh
clr b1_productml
clr b1_productl
clr b1_Cstore
loop32_mult:
;rcf
bc status,_C
rrc b1_ActiveMulth
rrc b1_ActiveMultm
rrc b1_ActiveMult
;jp nc,jmpproductshift24
JBS status,_C
JMP jmpproductshift32
; rcf
bc status,_C
bc status,_Z
; add r_product5,pass_mult2
MOV A,b1_PassMult
ADD b1_productl,A
; adc r_product4,pass_mult1
JBS status,_C
JMP jmpproductshift32
INC b1_productml
JBC STATUS,_Z
INC b1_productmh
JBC STATUS,_Z
INC b1_producth
jmpproductshift32:
; TM b1_Cstore,@00000001B
; JP NZ,jmpcset
; rcf
; jr jmp_rrcp_com
JBC b1_Cstore,0
JMP jmpcset32
BC STATUS,_C
JMP jmp_rrcp_com32
jmpcset32:
; scf
bs status,_C
jmp_rrcp_com32:
rrc b1_producth
rrc b1_productmh
rrc b1_productml
rrc b1_productl
; jp c,jmporcstore
JBC STATUS,_C
JMP jmporcstore32
movrk b1_Cstore,@00h
; jr jmpc_com
JMP jmpc_com32
jmporcstore32:
movrk b1_Cstore,@01h
jmpc_com32:
DJZ b1_BitMult
JMP loop32_mult
ret
div_32bit: ;(四节除以两节、四字街除以单字节、三字节除以两字节、适合于双字节除以双字节、双字节除以单字节、单字节除以单子节)
bank1
; MOVRK b1_ActiveDivh,@0fh ; 出口: b1_quoutienth,r_quoutientm,b1_quoutientl,b1_remainderh,b1_remainderl
; MOVRK b1_ActiveDivmh,@00h
; MOVRK b1_ActiveDivml,@0f0h
; MOVRK b1_ActiveDivl,@0fh
; MOVRK b1_PassDivh,@30h
; MOVRK b1_PassDivl,@10h
CLR b1_remainderh
clr b1_remainderl
CLR b1_quoutienth
clr b1_quoutientmh
clr b1_quoutientml
clr b1_quoutientl
MOVRK b1_BitDiv,@32
;MOV pass_div,@4
;MOV active_div,@36 ;;min ;The number must decibe,can get r_remainder=5,r_quoutient=4.not @45h\\\\\\\\\\\\\\\\\
loop32:
;RCF
BC STATUS,_C
RLC b1_quoutientl
rlc b1_quoutientml
rlc b1_quoutientmh
rlc b1_quoutienth
;RCF
BC STATUS,_C
RLC b1_remainderl
rlc b1_remainderh
;RCF
BC STATUS,_C
RLC b1_ActiveDivl
rlc b1_ActiveDivml
rlc b1_ActiveDivmh
rlc b1_ActiveDivh
;JP NC,mod_cmp_pass32
JBS STATUS,_C
JMP mod_cmp_pass32
ORRK b1_remainderl,@01h
mod_cmp_pass32:
;cp b1_remainderh,b1_PassDivh
;jp c,finish_or32
;jp nz,jmpsub32
;CP b1_remainderl,b1_PassDivl
; JP C,finish_or32 ;C is 1,r_remainder<=pass_div
movrr r_backup,b1_remainderh
MOV A,b1_PassDivh
sub a,r_backup ;注:SUB A,R 和 SUB R,A 都是R-A,只是结果存放不同
jbs status,_C
JMP finish_or32
JBS status,_Z
JMP jmpsub32
MOVRR r_backup,b1_remainderl
MOV A,b1_PassDivl
SUB A,r_backup
JBS STATUS,_C
JMP finish_or32
jmpsub32:
;rcf
BC STATUS,_C
; SUB b1_remainderl,b1_PassDivl
MOV A,b1_PassDivl
SUB b1_remainderl,A
; sbc b1_remainderh,b1_PassDivh
JBS STATUS,_C
DEC b1_remainderh
jmpsubhigh:
MOV A,b1_PassDivh
SUB b1_remainderh,A
ORRK b1_quoutientl,@01h
finish_or32:
; DEC b1_BitDiv
;JP NZ,loop32
DJZ b1_BitDiv
JMP loop32
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -