📄
字号:
;***************************************************;
; 大型浮点库整理 1999-5-27 ;
;01.浮点数格式化 FSDT
;02.浮点数加法 FADD
;03.浮点数减法 FSUB
;04.浮点数乘法 FMUL
;05.浮点数除法 FDIV
;06.浮点数代数值比较(不影响待比较操作数) FCMP
;07.浮点绝对值函数 FABS
;08.浮点倒数函数 FRCP
;09.浮点数平方 FSQU
;10.浮点数开平方(快速逼近算法) FSQR
;11.双字节十六进制定点数转换成格式化浮点数 DTOF
;12.格式化浮点数转换成双字节定点数 FTOD
;13.浮点BCD码转换成格式化浮点数 BTOF
;14.格式化浮点数转换成浮点BCD码 FTOB
;15.浮点数清零 FCLR
;16.浮点数判零 FZER
;17.浮点数传送 FMOV
;18.浮点数压栈 FPUS
;19.浮点数出栈 FPOP
;20.浮点数符号函数 FSGN
;21.浮点取整函数 FINT
;22.浮点数多项式计算 FPLN
;23.以10为底的浮点对数函数 FLOG
;24.以e为底的浮点对数函数 FLN
;25.以10为底的浮点指数函数 FE10
;26.以e为底的浮点指数函数 FEXP
;27.以2为底的浮点指数函数 FE2
;28.浮点余弦函数 FCOS
;29.浮点正弦函数 FSIN
;30.浮点反正切函数 FATN
;31.浮点弧度数转换成浮点度数 RTOD
;32.浮点度数转换成浮点弧度数 DTOR
;****** [浮点数格式化] FSDT *********************;
;入口条件: 待格式化浮点操作数在[R0]中。
;出口信息: 已格式化浮点操作数仍在[R0]中。
;影响资源: PSW、A、R2、R3、R4、位1FH 堆栈需求: 6字节
;调用子程序: 3个 MVR0 RLN MOV0
FSDT: ACALL MVR0 ;将待格式化操作数传送到第一工作区中
ACALL RLN ;通过左规完成格式化
ACALL MOV0 ;通过左规完成格式化
RET
;------------------------------------------------;
;****** [浮点数加法] FADD ***********************;
;入口条件: 被加数在[R0]中,加数在[R1]中。
;出口信息: OV=0时,和仍在[R0]中,OV=1时,溢出。
;影响资源: PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 6字节
;调用子程序: 4个
FADD: CLR F0
ACALL AS ;计算代数和
RET
;------------------------------------------------;
;****** [浮点数减法] FSUB ***********************;
;入口条件: 被减数在[R0]中,减数在[R1]中。
;出口信息: OV=0时,差仍在[R0]中,OV=1时,溢出。
;影响资源: PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节
;调用子程序: 4个
FSUB: SETB F0
AS: ACALL MVR1
MOV C,F0
RRC A
XRL A,@R1
MOV C,ACC.7
ASN: MOV 1EH,C
XRL A,@R0
RLC A
MOV F0,C
ACALL MVR0
ACALL AS1
MOV0: INC R0
INC R0
MOV A,R4
MOV @R0,A
DEC R0
MOV A,R3
MOV @R0,A
DEC R0
MOV A,R2
MOV C,1FH
MOV ACC.7,C
MOV @R0,A
CLR ACC.7
CLR OV
CJNE A,#3FH,MV01
SETB OV
MV01: MOV A,@R0
RET
MVR0: MOV A,@R0
MOV C,ACC.7
MOV 1FH,C
MOV C,ACC.6
MOV ACC.7,C
MOV R2,A
INC R0
MOV A,@R0
MOV R3,A
INC R0
MOV A,@R0
MOV R4,A
DEC R0
DEC R0
RET
MVR1: MOV A,@R1
MOV C,ACC.7
MOV 1EH,C
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
INC R1
MOV A,@R1
MOV R6,A
INC R1
MOV A,@R1
MOV R7,A
DEC R1
DEC R1
RET
AS1: MOV A,R6
ORL A,R7
JZ AS2
MOV A,R3
ORL A,R4
JNZ EQ
MOV A,R6
MOV R3,A
MOV A,R7
MOV R4,A
MOV A,R5
MOV R2,A
MOV C,1EH
MOV 1FH,C
AS2: RET
EQ: MOV A,R2
XRL A,R5
JZ AS4
JB ACC.7,EQ3
MOV A,R2
CLR C
SUBB A,R5
JC EQ4
EQ2: CLR C
MOV A,R6
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
INC R5
ORL A,R6
JNZ EQ
MOV A,R2
MOV R5,A
SJMP AS4
EQ3: MOV A,R2
JNB ACC.7,EQ2
EQ4: CLR C
ACALL RR1
ORL A,R3
JNZ EQ
MOV A,R5
MOV R2,A
AS4: JB F0,AS5
MOV A,R4
ADD A,R7
MOV R4,A
MOV A,R3
ADDC A,R6
MOV R3,A
JNC AS2
AJMP RR1
AS5: CLR C
MOV A,R4
SUBB A,R7
MOV B,A
MOV A,R3
SUBB A,R6
JC AS6
MOV R4,B
MOV R3,A
AJMP RLN
AS6: CPL 1FH
CLR C
MOV A,R7
SUBB A,R4
MOV R4,A
MOV A,R6
SUBB A,R3
MOV R3,A
RLN: MOV A,R3
ORL A,R4
JNZ RLN1
MOV R2,#0C1H
RET
RLN1: MOV A,R3
JB ACC.7,RLN2
CLR C
ACALL RL1
SJMP RLN
RLN2: CLR OV
RET
RL1: MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2
CJNE R2,#0C0H,RL1E
CLR A
MOV R3,A
MOV R4,A
MOV R2,#0C1H
RL1E: CLR OV
RET
RR1: MOV A,R3
RRC A
MOV R3,A
MOV A,R4
RRC A
MOV R4,A
INC R2
CLR OV
CJNE R2,#40H,RR1E
MOV R2,#3FH
SETB OV
RR1E: RET
;------------------------------------------------;
;****** [浮点数乘法] FMUL ***********************;
;入口条件: 被乘数在[R0]中,乘数在[R1]中。
;出口信息: OV=0时,积仍在[R0]中,OV=1时,溢出。
;影响资源: PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节
;调用子程序: 3个
FMUL: ACALL MVR0
MOV A,@R0
XRL A,@R1
RLC A
MOV 1FH,C
ACALL MUL0
AJMP MOV0
MUL0: ACALL MVR1
MUL1: MOV A,R3
ORL A,R4
JZ MUL6
MOV A,R6
ORL A,R7
JZ MUL5
MOV A,R7
MOV B,R4
MUL AB
MOV A,B
XCH A,R7
MOV B,R3
MUL AB
ADD A,R7
MOV R7,A
CLR A
ADDC A,B
XCH A,R4
MOV B,R6
MUL AB
ADD A,R7
MOV R7,A
MOV A,B
ADDC A,R4
MOV R4,A
CLR A
RLC A
XCH A,R3
MOV B,R6
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
JB ACC.7,MUL2
MOV A,R7
RLC A
MOV R7,A
ACALL RL1
MUL2: MOV A,R7
JNB ACC.7,MUL3
INC R4
MOV A,R4
JNZ MUL3
INC R3
MOV A,R3
JNZ MUL3
MOV R3,#80H
INC R2
MUL3: MOV A,R2
ADD A,R5
MD: MOV R2,A
JB ACC.7,MUL4
JNB ACC.6,MUL6
MOV R2,#3FH
SETB OV
RET
MUL4: JB ACC.6,MUL6
MUL5: CLR A
MOV R3,A
MOV R4,A
MOV R2,#41H
MUL6: CLR OV
RET
;------------------------------------------------;
;****** [浮点数除法] FDIV ***********************;
;入口条件: 被除数在[R0]中,除数在[R1]中。
;出口信息: OV=0时,商仍在[R0]中,OV=1时,溢出。
;影响资源: PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节
;调用子程序: 2个
FDIV: INC R0
MOV A,@R0
INC R0
ORL A,@R0
DEC R0
DEC R0
JNZ DIV1
MOV @R0,#41H
CLR OV
RET
DIV1: INC R1
MOV A,@R1
INC R1
ORL A,@R1
DEC R1
DEC R1
JNZ DIV2
SETB OV
RET
DIV2: ACALL MVR0
MOV A,@R0
XRL A,@R1
RLC A
MOV 1FH,C
ACALL MVR1
ACALL DIV3
AJMP MOV0
DIV3: CLR C
MOV A,R4
SUBB A,R7
MOV A,R3
SUBB A,R6
JC DIV4
ACALL RR1
SJMP DIV3
DIV4: CLR A
XCH A,R0
PUSH ACC
CLR A
XCH A,R1
PUSH ACC
MOV A,R2
PUSH ACC
MOV B,#10H
DIV5: CLR C
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
MOV A,R4
RLC A
MOV R4,A
XCH A,R3
RLC A
XCH A,R3
MOV F0,C
CLR C
SUBB A,R7
MOV R2,A
MOV A,R3
SUBB A,R6
ANL C,/F0
JC DIV6
MOV R3,A
MOV A,R2
MOV R4,A
INC R1
DIV6: DJNZ B,DIV5
MOV A,R6
CLR C
RRC A
SUBB A,R3
CLR A
ADDC A,R1
MOV R4,A
CLR A
ADDC A,R0
MOV R3,A
POP ACC
MOV R2,A
POP ACC
MOV R1,A
POP ACC
MOV R0,A
MOV A,R2
CLR C
SUBB A,R5
ACALL MD
ACALL RLN
RET
; 以上是小型浮点库 可单独使用 ;
;------------------------------------------------;
; 以下是中型浮点库 可单独使用 ;
;****** [浮点数代数值比较(不影响待比较操作数)] FCMP ;
;入口条件: 待比较操作数分别在[R0]和[R1]中。
;出口信息: 若CY=1,则[R0] < [R1],若CY=0且A=0则 [R0] = [R1],否则[R0] > [R1]。
;影响资源: A、B、PSW 堆栈需求: 2字节
;调用子程序: 无
FCMP: MOV A,@R0
XRL A,@R1
JNB ACC.7,CMP2
MOV A,@R0
RLC A
MOV A,#0FFH
RET
CMP2: MOV A,@R1
MOV C,ACC.6
MOV ACC.7,C
MOV B,A
MOV A,@R0
MOV C,ACC.7
MOV F0,C
MOV C,ACC.6
MOV ACC.7,C
CLR C
SUBB A,B
JZ CMP6
RLC A
JNB F0,CMP5
CPL C
CMP5: MOV A,#0FFH
RET
CMP6: INC R0
INC R0
INC R1
INC R1
CLR C
MOV A,@R0
SUBB A,@R1
MOV B,A
DEC R0
DEC R1
MOV A,@R0
SUBB A,@R1
DEC R0
DEC R1
ORL A,B
JZ CMP7
JNB F0,CMP7
CPL C
CMP7: RET
;------------------------------------------------;
;****** [浮点绝对值函数] FABS *******************;
;入口条件: 操作数在[R0]中。
;出口信息: 结果仍在[R0]中。
;影响资源: A 堆栈需求: 2字节
;调用子程序: 无
FABS: MOV A,@R0
CLR ACC.7
MOV @R0,A
RET
;------------------------------------------------;
;****** [浮点倒数函数] FRCP *********************;
;入口条件: 操作数在[R0]中。
;出口信息: OV=0时,结果仍在[R0]中,OV=1时,溢出。
;影响资源: PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节
;调用子程序: 2个
FRCP: MOV A,@R0
MOV C,ACC.7
MOV 1FH,C
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
INC R0
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
DEC R0
DEC R0
ORL A,R6
JNZ RCP
SETB OV
RET
RCP: MOV A,R6
JB ACC.7,RCP2
CLR C
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
DEC R5
AJMP RCP
RCP2: MOV R2,#1
MOV R3,#80H
MOV R4,#0
LCALL DIV3
LCALL MOV0
RET
;------------------------------------------------;
;****** [浮点数平方] FSQU ***********************;
;入口条件: 操作数在[R0]中。
;出口信息: OV=0时,平方值仍然在[R0]中,OV=1时溢出。
;影响资源: PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 9字节
;调用子程序:
FSQU: MOV A,R0
XCH A,R1
PUSH ACC
LCALL FMUL
POP ACC
MOV R1,A
RET
;------------------------------------------------;
;****** [浮点数开平方(快速逼近算法)] FSQR *******;
;入口条件: 操作数在[R0]中。
;出口信息: OV=0时,平方根仍在[R0]中,OV=1时,负数开平方出错。
;影响资源: PSW、A、B、R2~R7 堆栈需求: 2字节
;调用子程序: 无
FSQR: MOV A,@R0
JNB ACC.7,SQR
SETB OV
RET
SQR: INC R0
INC R0
MOV A,@R0
DEC R0
ORL A,@R0
DEC R0
JNZ SQ
MOV @R0,#41H
CLR OV
RET
SQ: MOV A,@R0
MOV C,ACC.6
MOV ACC.7,C
INC A
CLR C
RRC A
MOV @R0,A
INC R0
JC SQR0
MOV A,@R0
RRC A
MOV @R0,A
INC R0
MOV A,@R0
RRC A
MOV @R0,A
DEC R0
SQR0: MOV A,@R0
JZ SQR9
MOV R2,A
INC R0
MOV A,@R0
MOV R3,A
MOV A,R2
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H
MOV R4,#80H
SJMP SQR3
SQR1: MOV B,#0B2H
MOV R4,#0A0H
SJMP 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,B
XCH A,R2
SUBB A,R2
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
SJMP 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,R3
MOV @R0,A
DEC R0
MOV A,R2
MOV @R0,A
SQR9: DEC R0
CLR OV
RET
;------------------------------------------------;
;****** [双字节十六进制定点数转换成格式化浮点数] DTOF ;
;入口条件: 双字节定点数的绝对值在[R0]中,数符在位1FH中,整数部分的位数在A中。
;出口信息: 转换成格式化浮点数在[R0]中(三字节)。
;影响资源: PSW、A、R2、R3、R4、位1FH 堆栈需求: 6字节
;调用子程序: 2个
DTOF: MOV R2,A
MOV A,@R0
MOV R3,A
INC R0
MOV A,@R0
MOV R4,A
DEC R0
LCALL RLN
LCALL MOV0
RET
;------------------------------------------------;
;****** [格式化浮点数转换成双字节定点数] FTOD ***;
;入口条件: 格式化浮点操作数在[R0]中。
;出口信息: OV=1时溢出,OV=0时转换成功:定点数的绝对值在[R0]中(双字节),数符
; 在位1FH中,F0=1 时为整数,CY=1时为一字节整数一字节小数,否则为纯小数。
;影响资源: PSW、A、B、R2、R3、R4、位1FH 堆栈需求: 6字节
;调用子程序: 2个
FTOD: LCALL MVR0
MOV A,R2
JZ FTD4
JB ACC.7,FTD4
SETB C
SUBB A,#10H
JC FTD1
SETB OV
RET
FTD1: SETB C
MOV A,R2
SUBB A,#8
JC FTD3
FTD2: MOV B,#10H
LCALL FTD8
SETB F0
CLR C
CLR OV
RET
FTD3: MOV B,#8
LCALL FTD8
SETB C
CLR F0
CLR OV
RET
FTD4: MOV B,#0
LCALL FTD8
CLR OV
CLR F0
CLR C
RET
FTD8: MOV A,R2
CJNE A,B,FTD9
MOV A,R3
MOV @R0,A
INC R0
MOV A,R4
MOV @R0,A
DEC R0
RET
FTD9: CLR C
LCALL RR1
AJMP FTD8
;------------------------------------------------;
;****** [浮点BCD码转换成格式化浮点数] BTOF ******;
;入口条件: 浮点BCD码操作数在[R0]中。
;出口信息: 转换成的格式化浮点数仍在[R0]中。
;影响资源: PSW、A、B、R2~R7、位1DH~1FH 堆栈需求:6字节
;调用子程序: 2个
BTOF: INC R0
INC R0
MOV A,@R0
MOV R7,A
DEC R0
MOV A,@R0
MOV R6,A
DEC R0
ORL A,R7
JNZ BTF0
MOV @R0,#41H
RET
BTF0: MOV A,@R0
MOV C,ACC.7
MOV 1DH,C
CLR 1FH
MOV C,ACC.6
MOV ACC.7,C
MOV @R0,A
JNC BTF1
ADD A,#19
JC BTF2
MOV @R0,#41H
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
DEC R0
DEC R0
RET
BTF1: SUBB A,#19
JC BTF2
MOV A,#3FH
MOV C,1DH
MOV ACC.7,C
MOV @R0,A
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
DEC R0
DEC R0
RET
BTF2: CLR A
MOV R4,A
MOV R3,A
MOV R2,#10H
BTF3: MOV A,R7
ADD A,R7
DA A
MOV R7,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2
JNB ACC.7,BTF3
MOV A,R6
ADD A,#0B0H
CLR A
ADDC A,R4
MOV R4,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -