?? ?
字號:
; 定點庫程序庫整理 1999-5-27 ;
;***************************************************;
;程序功能 程序名稱
;01.多字節BCD加法 BCDA
;02.多字節BCD減法 BCDB
;03.多字節BCD求補 BEG
;04.多字節BCD碼右移一位(乘10) BRLN
;05.多字節二進制無符號數乘法 MULD
;06.雙字節二進制無符號數平方 MUL2
;07.雙字節二進制無符號數除法 DIVD
;08.雙字節二進制無符號數除以單字節二進制數 D457
;09.三字節二進制無符號數除以單字節二進制數 DV31
;10.雙字節二進制有符號數乘法(補碼) MULS
;11.雙字節二進制有符號數除法(補碼) DIVS
;12.雙字節二進制無符號數開平方(快速) SH2
;13.四字節二進制無符號數開平方(快速) SH4
;14.單字節十六進制數轉換成雙字節ASCII碼 HASC
;15.ASCII碼轉換成十六進制數 ASCH
;16.單字節十六進制整數轉換成單字節BCD碼整數 HBCD
;17.雙字節十六進制整數轉換成雙字節BCD碼整數 HB2
;18.單字節十六進制小數轉換成單字節BCD碼小數 HBD
;19.雙字節十六進制小數轉換成雙字節BCD碼小數 HBD2
;20.單字節BCD碼整數轉換成單字節十六進制整數 BCDH
;21.雙字節BCD碼整數轉換成雙字節十六進制整數 BH2
;22.單字節BCD碼小數轉換成單字節十六進制小數 BHD
;23.雙字節BCD碼小數轉換成雙字節十六進制小數 BHD2
;24.求單字節十六進制無符號數據塊的極值 MM
;25.求單字節十六進制有符號數據塊的極值 MMS
;26.順序查找(ROM)單字節表格 FDS1
;27.順序查找(ROM)雙字節表格 FDS2
;28.對分查找(ROM)單字節無符號增序數據表格 FDD1
;29.對分查找(ROM)雙字節無符號增序數據表格 FDD2
;30.求單字節十六進制無符號數據塊的平均值 DDM1
;31.求雙字節十六進制無符號數據塊的平均值 DDM2
;32.求單字節數據塊的(異或)校驗和 XR1
;33.求雙字節數據塊的(異或)校驗和 XR2
;34.單字節無符號數據塊排序(增序) SORT
;****** [多字節BCD加法] BCDA ********************;
;
;入口條件: 字節數在R7中,被加數在[R0]中,加數在[R1]中。
;出口信息: 和在[R0]中,最高位進位在CY中。
;影響資源: PSW、A、R2 堆棧需求: 2字節 進位在 C 中
;調用子程序: 無
BCDA: MOV A,R7
MOV R2,A
ADD A,R0
MOV R0,A
MOV A,R2
ADD A,R1
MOV R1,A
CLR C
BCD1: DEC R0
DEC R1
MOV A,@R0
ADDC A,@R1
DA A
MOV @R0,A
DJNZ R2,BCD1
RET
;------------------------------------------------;
;****** [多字節BCD減法] BCDB ********************;
;入口條件: 字節數在R7中,被減數在[R0]中,減數在[R1]中。
;出口信息: 差在[R0]中,最高位借位在CY中。
;影響資源: PSW、A、R2、R3 堆棧需求: 6字節
;調用子程序: 1個 NEG 多字節求補程序
BCDB: LCALL NEG1 ;多字節BCD求補
LCALL BCDA ;多字節BCD加法
CPL C
MOV F0,C
LCALL NEG1 ;多字節BCD求補
MOV C,F0
RET
NEG1: MOV A,R0
XCH A,R1
XCH A,R0
LCALL NEG ;多字節BCD求補
MOV A,R0
XCH A,R1
XCH A,R0
RET
;------------------------------------------------;
;****** [多字節BCD求補] NEG *********************;
;入口條件: 字節數在R7中,操作數在[R0]中。
;出口信息: 結果仍在[R0]中。
;影響資源: PSW、A、R2、R3 堆棧需求: 2字節
;調用子程序: 無
NEG: MOV A,R7
DEC A
MOV R2,A
MOV A,R0
MOV R3,A
NEG0: CLR C
MOV A,#99H
SUBB A,@R0
MOV @R0,A
INC R0
DJNZ R2,NEG0
MOV A,#9AH
SUBB A,@R0
MOV @R0,A
MOV A,R3
MOV R0,A
RET
;------------------------------------------------;
;****** [多字節BCD碼左移十進制一位(乘十)] BRLN **;
;入口條件: 字節數在R7中,操作數在[R0]中。
;出口信息: 結果仍在[R0]中,移出的十進制最高位在R3中。
;影響資源: PSW、A、R2、R3 堆棧需求: 2字節
;調用子程序: 無
BRLN: MOV A,R7
MOV R2,A
ADD A,R0
MOV R0,A
MOV R3,#0
BRL1: DEC R0
MOV A,@R0
SWAP A
MOV @R0,A
MOV A,R3
XCHD A,@R0
MOV R3,A
DJNZ R2,BRL1
RET
;------------------------------------------------;
;****** [雙字節二進制無符號數乘法] MULD *********;
;入口條件: 被乘數在R2、R3中,乘數在R6、R7中。
;出口信息: 乘積在R2、R3、R4、R5中。
;影響資源: PSW、A、B、R2~R7 堆棧需求: 2字節
;調用子程序: 無
MULD: MOV A,R3
MOV B,R7
MUL AB
MOV R4,B
MOV R5,A
MOV A,R3
MOV B,R6
MUL AB
ADD A,R4
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2
MOV B,R7
MUL AB
ADD A,R4
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2
MOV B,R6
MUL AB
ADD A,R3
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
;------------------------------------------------;
;****** [雙字節二進制無符號數平方] MUL2 *********;
;入口條件: 待平方數在R2、R3中。
;出口信息: 結果在R2、R3、R4、R5中。
;影響資源: PSW、A、B、R2~R5 堆棧需求: 2字節
;調用子程序: 無
MUL2: MOV A,R3
MOV B,A
MUL AB
MOV R4,B
MOV R5,A
MOV A,R2
MOV B,A
MUL AB
XCH A,R3
XCH A,B
XCH A,R2
MUL AB
CLR C
RLC A
XCH A,B
RLC A
JNC MU20
INC R2
MU20: XCH A,B
ADD A,R4
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
ADDC A,R2
MOV R2,A
RET
;------------------------------------------------;
;****** [雙字節二進制無符號數除法] DIVD *********;
;入口條件: 被除數在R2、R3、R4、R5中,除數在R6、R7中。
;出口信息: OV=0 時,雙字節商在R2、R3中,OV=1 時溢出。
;影響資源: PSW、A、B、R1~R7 堆棧需求: 2字節
;調用子程序: 無
DIVD: CLR C
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV
RET
DVD1: MOV B,#10H
DVD2: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C
CLR C
SUBB A,R7
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0
JC DVD3
MOV R2,A
MOV A,R1
MOV R3,A
INC R5
DVD3: DJNZ B,DVD2
MOV A,R4
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV
RET
;------------------------------------------------;
;****** [雙字節二進制無符號數除以單字節二進制數] D457 ;
;入口條件: 被除數在R4、R5中,除數在R7中。
;出口信息: OV=0 時,單字節商在R3中,OV=1 時溢出。
;影響資源: PSW、A、R3~R7 堆棧需求: 2字節
;調用子程序: 無
D457: CLR C
MOV A,R4
SUBB A,R7
JC DV50
SETB OV
RET
DV50: MOV R6,#8
DV51: MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52: CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53: INC R3
DV54: CLR OV
RET
;------------------------------------------------;
;****** [三字節二進制無符號數除以單字節二進制數] DV31 ;
;入口條件: 被除數在R3、R4、R5中,除數在R7中。
;出口信息: OV=0 時,雙字節商在R4、R5中,OV=1 時溢出。
;影響資源: PSW、A、B、R2~R7 堆棧需求: 2字節
;調用子程序: 無
DV31: CLR C
MOV A,R3
SUBB A,R7
JC DV30
SETB OV
RET
DV30: MOV R2,#10H
DM23: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DM24
MOV R3,A
INC R5
DM24: DJNZ R2,DM23
MOV A,R3
ADD A,R3
JC DM25
SUBB A,R7
JC DM26
DM25: INC R5
MOV A,R5
JNZ DM26
INC R4
DM26: CLR OV
RET
;------------------------------------------------;
;****** [雙字節二進制有符號數乘法(補碼)] MULS ***;
;入口條件: 被乘數在R2、R3中,乘數在R6、R7中。
;出口信息: 乘積在R2、R3、R4、R5中。
;影響資源: PSW、A、B、R2~R7 堆棧需求: 4字節
;調用子程序: 3個,MDS MULD MDSE
MULS: MOV R4,#0
MOV R5,#0
ACALL MDS ;計算結果的符號和兩個操作數的絕對值
ACALL MULD ;計算兩個絕對值的乘積
ACALL MDSE ;用補碼表示結果
RET
;------------------------------------------------;
;****** [雙字節二進制有符號數除法(補碼)] DIVS ***;
;入口條件: 被除數在R2、R3、R4、R5中,除數在R6、R7中。
;出口信息: OV=0時商在R2、R3中,OV=1時溢出。
;影響資源: PSW、A、B、R1~R7 堆棧需求: 5字節
;調用子程序: 2個 MDS DIVD
DIVS: LCALL MDS ;計算結果的符號和兩個操作數的絕對值
PUSH PSW
LCALL DIVD ;計算兩個絕對值的商
JNB OV,DVS1
POP ACC
RET
DVS1: POP PSW
MOV R4,#0
MOV R5,#0
MDSE: JB F0,MDS2 ;用補碼表示結果
CLR OV
RET
MDS: CLR F0
MOV A,R6
JNB ACC.7,MDS1
CPL F0
XCH A,R7
CPL A
ADD A,#1
XCH A,R7
CPL A
ADDC A,#0
MOV R6,A
MDS1: MOV A,R2
JNB ACC.7,MDS3
CPL F0
MDS2: MOV A,R5
CPL A
ADD A,#1
MOV R5,A
MOV A,R4
CPL A
ADDC A,#0
MOV R4,A
MOV A,R3
CPL A
ADDC A,#0
MOV R3,A
MOV A,R2
CPL A
ADDC A,#0
MOV R2,A
MDS3: CLR OV
RET
;------------------------------------------------;
;****** [雙字節二進制無符號數開平方(快速)] SH2 **;
;入口條件: 被開方數在R2、R3中。
;出口信息: 平方根仍在R2、R3中,整數部分的位數為原數的一半,其余為小數。
;影響資源: PSW、A、B、R2~R7 堆棧需求: 4字節
;調用子程序: 1個 SQRH
SH2: MOV A,R2
ORL A,R3
JNZ SH20
RET
SH20: MOV R7,#0
MOV A,R2
SH22: ANL A,#0C0H
JZ SH33
ACALL SQRH
SH33: CLR C
MOV A,R3
RLC A
MOV F0,C
CLR C
RLC A
MOV R3,A
MOV A,R2
MOV ACC.7,C
MOV C,F0
RLC A
RLC A
MOV R2,A
INC R7
AJMP SH22
;------------------------------------------------;
;****** [四字節二進制無符號數開平方(快速)] SH4 **;
;入口條件: 被開方數在R2、R3、R4、R5中。
;出口信息: 平方根在R2、R3中,整數部分的位數為原數的一半,其余為小數。
;影響資源: PSW、A、B、R2~R7 堆棧需求: 2字節
;調用子程序: 無
SH4: MOV A,R2
ORL A,R3
ORL A,R4
ORL A,R5
JNZ SH40
RET
SH40: MOV R7,#0
MOV A,R2
SH41: ANL A,#0C0H
JNZ SQRH
MOV R6,#2
SH42: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,SH42
INC R7
AJMP SH41
SQRH: MOV A,R2
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H
MOV R4,#80H
AJMP SQR3
SQR1: MOV B,#0B2H
MOV R4,#0A0H
AJMP SQR3
SQR2: MOV B,#8DH
MOV R4,#0D0H
SQR3: MUL AB
MOV A,B
ADD A,R4
MOV R4,A
MOV B,A
MUL AB
XCH A,R3
CLR C
SUBB A,R3
MOV R3,A
MOV A,R2
SUBB A,B
MOV R2,A
SQR4: SETB C
MOV A,R4
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5
INC R4
MOV R2,A
MOV R3,B
AJMP SQR4
SQR5: MOV A,R4
XCH A,R2
RRC A
MOV F0,C
MOV A,R3
MOV R5,A
MOV R4,#8
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6
MOV A,R7
JZ SQRE
SQR9: CLR C
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
DJNZ R7,SQR9
SQRE: RET
;------------------------------------------------;
;****** [單字節十六進制數轉換成雙字節ASCII碼] HASC
;入口條件: 待轉換的單字節十六進制數在累加器A中。
;出口信息: 高四位的ASCII碼在A中,低四位的ASCII碼在B中。
;影響資源: PSW、A、B 堆棧需求: 4字節
;調用子程序: 1個 HAS1 內部
HASC: MOV B,A
ACALL HAS1
XCH A,B
SWAP A
HAS1: ANL A,#0FH
ADD A,#90H
DA A
ADDC A,#40H
DA A
RET
;------------------------------------------------;
;****** [ASCII碼轉換成十六進制數] ASCH **********;
;入口條件: 待轉換的ASCII碼(30H~39H或41H~46H)在A中。
;出口信息: 轉換后的十六進制數(00H~0FH)仍在累加器A中。
;影響資源: PSW、A 堆棧需求: 2字節
;調用子程序: 無
ASCH: CLR C
SUBB A,#30H
JNB ACC.4,ASH1
SUBB A,#7
ASH1: RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -