?? 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 + -