📄 em78math.inc
字号:
;**********************************************************************;
; Title: EM78Math Macros Define ;
; Description: The Maths for EM78x447xxx ;
; Company: Elan Corp.Inc ;
; Author: Bin.Ren ;
; Date: 5/26/2004 ;
; Version: 1.0 ;
;**********************************************************************;
;
IFNDEF STATUS
STATUS == 0x03
ENDIF
;{
IFNDEF Z
Z == 0x02
ENDIF
IFNDEF C
C == 0x00
ENDIF
;}
IFNDEF reg_acc
reg_acc == 0x20
ENDIF
IFNDEF R20
R20 == 0x20
ENDIF
IFNDEF reg_acc1
reg_acc1 == 0x21
ENDIF
IFNDEF R21
R21 == 0x21
ENDIF
IFNDEF reg_acc2
reg_acc2 == 0x22
ENDIF
IFNDEF R22
R22 == 0x22
ENDIF
IFNDEF reg_acc3
reg_acc3 == 0x23
ENDIF
IFNDEF R23
R23 == 0x23
ENDIF
IFNDEF reg_acc4
reg_acc4 == 0x24
ENDIF
IFNDEF R24
R24 == 0x24
ENDIF
IFNDEF reg_acc5
reg_acc5 == 0x25
ENDIF
IFNDEF R25
R25 == 0x25
ENDIF
IFNDEF reg_acc6
reg_acc6 == 0x26
ENDIF
IFNDEF R26
R26 == 0x26
ENDIF
IFNDEF reg_acc7
reg_acc7 == 0x27
ENDIF
IFNDEF R27
R27 == 0x27
ENDIF
IFNDEF reg_acc8
reg_acc8 == 0x28
ENDIF
IFNDEF R28
R28 == 0x28
ENDIF
IFNDEF reg_acc9
reg_acc9 == 0x29
ENDIF
IFNDEF R29
R29 == 0x29
ENDIF
IFNDEF reg_acca
reg_acca == 0x2A
ENDIF
IFNDEF R2A
R2A == 0x2A
ENDIF
IFNDEF reg_accb
reg_accb == 0x2B
ENDIF
IFNDEF R2B
R2B == 0x2B
ENDIF
IFNDEF reg_accc
reg_accc == 0x2C
ENDIF
IFNDEF R2C
R2C == 0x2C
ENDIF
IFNDEF reg_accd
reg_accd == 0x2D
ENDIF
IFNDEF R2D
R2D == 0x2D
ENDIF
;
;**********************************************************************;
; Title: 1 Byte Binary Code Transform BCD Code ;
; Description: Hundred Bigit Of Bcd Cade Storage In Low Bigit Of ;
; reg_acc3,Entries Bigit Of Bcd Cade Storage In High ;
; Bigit Of reg_acc2, Binary Data Storage In reg_acc1 ;
; Arithmetic: BCD==100*a+10*b+c ;
; Input: reg_acc1 ;
; Output: reg_acc3, reg_acc2 ;
; Variable Register:None ;
; Register Changed: R3, 0 ;ACC ;
;**********************************************************************;
;
mBinToBcd1 MACRO reg_acc1, reg_acc3, reg_acc2
;
CLR reg_acc2 ;clear BCD data register
CLR reg_acc3
MOV A, reg_acc1
$Bin_Bcd1:
ADD A, @156 ;subtract 100 from binary that is transform
JBS STATUS, C ;borrow bigit?
JMP $Bin_Bcd2 ;borrow bigit jump to Bin_Bcd2
INC reg_acc3 ;if don't borrow bigit then hundred bigit adding 1
JMP $Bin_Bcd1 ;backing out
$Bin_Bcd2:
ADD A, @100 ;有借位,则加回被减去的数100
MOV reg_acc1, A
$Bin_Bcd3:
ADD A, @246 ;余下的被减数再减10
JBS STATUS, C ;有借位吗?
JMP $Bin_Bcd4 ;有借位,则跳出
INC reg_acc2 ;无借位,则BCD码的十位寄存器加1
JMP $Bin_Bcd3
$Bin_Bcd4:
ADD A, @10 ;有借位,则加回被减去的数10
SWAP reg_acc2 ;将BCD码的十位存到reg_acc2的高半字节
ADD reg_acc2, A ;将BCD码的个位存到reg_acc2的低半字节
ENDM
;
;**********************************************************************;
; Title: 2 Byte Binary Code Transform BCD Code ;
; Description: Highest Bigit Of Bcd Storage In Low Byte Of reg_acc5, ;
; Lowest Bigit Of Bcd Storage In Low Byte Of reg_acc3, ;
; High Bigit Of Binary Storage In reg_acc1, ;
; Low Bigit Of Binart Storage In reg_acc2, ;
; Input: reg_acc1, reg_acc2 ;
; Output: reg_acc3, reg_acc4, reg_acc5 ;
; Variable Register:reg_acc, reg_accd ;
; Register Changed: R3, 0; ACC ;
; Status: 1 ;
;**********************************************************************;
;
mBinToBcd2 MACRO reg_acc2, reg_acc1, reg_acc5, reg_acc4, reg_acc3
;
MOV A, @16 ;设定移位字节长度(其值=byte*8)
MOV reg_acc, A
CLR reg_acc5 ;清BCD码寄存器
CLR reg_acc4
CLR reg_acc3
BC STATUS, C ;清R3标志位C
$Bin_Bcd1:
RLC reg_acc1 ;左移被转换的字节的最低位寄存器
RLC reg_acc2 ;左移被转换的字节的最高位寄存器
RLC reg_acc3 ;左移BCD码的最低位寄存器
RLC reg_acc4
RLC reg_acc5 ;左移BCD码的最高位寄存器
DJZ reg_acc ;移位完成了吗?
JMP $Bin_Bcd2 ;未完,进行BCD码调整
JMP $Bin_Bcd3 ;移位完,跳出
$Bin_Bcd2:
MOV A, reg_acc3 ;对reg_acc3进行BCD码调整
CALL $bcdadj ;调BCD码调整子程序
MOV reg_acc3, A ;
MOV A, reg_acc4 ;对reg_acc4进行BCD码调整
CALL $BCDADJ
MOV reg_acc4, A
MOV A, reg_acc5 ;对reg_acc5进行BCD码调整
CALL $BCDADJ
MOV reg_acc5, A
JMP $Bin_Bcd1 ;返回,继续进行移位处理
;-------BCD Code Adjust Subprogram---------------
$BCDADJ:
ADD A, @51
MOV reg_accd, A
JBS reg_accd, 3
ADD A, @253
JBS reg_accd, 7
ADD A, @208
RET
$Bin_Bcd3:
ENDM
;
;**********************************************************************;
; Title: 3 Byte Binary Code Transform Bcd Code ;
; Description:reg_acc7的高半字节存放BCD码的最高位, ;
; reg_acc4的低半字节存放BCD码的最低位, ;
; reg_acc3存放被转换字节的最高位, ;
; reg_acc1存放被转换字节的最低位。 ;
; Input: reg_acc1, reg_acc2, reg_acc3 ;
; Output: reg_acc4, reg_acc5, reg_acc6, reg_acc7 ;
; Variable Register:reg_acc, reg_accd ;
; Register Changed: R3, 0;ACC ;
; stack: 1 ;
;**********************************************************************;
;
mBinToBcd3 MACRO reg_acc3, reg_acc2, reg_acc1, reg_acc7, reg_acc6, reg_acc5, reg_acc4
;
MOV A, @24 ;设定移位字节长度(其值=byte*8)
MOV reg_acc, A
CLR reg_acc4
CLR reg_acc5
CLR reg_acc6
CLR reg_acc7
BC STATUS, C ;清R3标志位C
$Bin_Bcd1:
RLC reg_acc1 ;左移被转换字节数的最低位寄存器
RLC reg_acc2
RLC reg_acc3 ;左移被转换字节数的最高位寄存器
RLC reg_acc4 ;左移BCD码的最低位寄存器
RLC reg_acc5
RLC reg_acc6
RLC reg_acc7 ;左移BCD码的最高位寄存器
DJZ reg_acc ;移位完成了吗?
JMP $Bin_Bcd2 ;未完,进行BCD码调整
JMP $Bin_Bcd3 ;移位完,跳出
$Bin_Bcd2:
MOV A, reg_acc4 ;对reg_acc4进行BCD码调整
CALL $BCDADJ ;调BCD码调整子程序
MOV reg_acc4, A
MOV A, reg_acc5 ;对reg_acc5进行BCD码调整
CALL $BCDADJ
MOV reg_acc5, A
MOV A, reg_acc6 ;对reg_acc6进行BCD码调整
CALL $BCDADJ
MOV reg_acc6, A
MOV A, reg_acc7 ;对reg_acc7进行BCD码调整
CALL $BCDADJ
MOV reg_acc7, A
JMP $Bin_Bcd1 ;移位未完,返回,继续进行移位处理
;-------BCD Code Adjust Subprogram---------------
$BCDADJ:
ADD A, @51
MOV reg_accd, A
JBS reg_accd, 3
ADD A, @253
JBS reg_accd, 7
ADD A, @208
RET
$Bin_Bcd3:
ENDM
;
;**********************************************************************;
; Title: 4 Byte Binary Code Transform Bcd Code ;
; Description:reg_acc9的高半字节存放BCD码的最高位, ;
; reg_acc5的低半字节存放BCD码的最低位, ;
; reg_acc4存放被转换字节的最高位, ;
; reg_acc1存放被转换字节的最低位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -