📄 isomaths.asm
字号:
ACALL LST
AJMP LP51
LPOVER: MOV A,R5
JNB NEGATIVE_FLAG,LPOVER1
SETB C
AJMP LPOVER2
LPOVER1: CLR C
LPOVER2: RRC A
MOV R5,A
JC LPOVER3
MOV A,R4
CLR ACC.7
MOV R4,A
LPOVER3: MOV R6,R8
MOV R7,R9
LCALL STORE
RET
LP6: ;特殊情况0,每办法规格化
MOV R5,#00
MOV R4,#00
MOV R3,#00
MOV R2,#00
MOV R6,R8
MOV R7,R9
LCALL STORE
RET
;****************************************************************
;双字节无符号整形转化成浮点数
;由R0,R1指向要转换的数,转化后的结果存到r6,r7所知的单元
;*************************************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BTOF: CLR NEGATIVE_FLAG
MOV DPL,R0
MOV DPH,R1
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOV R1,DPH
MOV R0,DPL
MOV A,R4
JNB ACC.7,UF0
SETB NEGATIVE_FLAG
CLR C
MOV A,R3
SUBB A,#1
CPL A
MOV R3,A
MOV A,R4
SUBB A,#0
CPL A
MOV R4,A
UF0: MOV R2,#0H
MOV R5,#0FH
MOV A,R4
UF1: JB ACC.7,UF2
ACALL LST
MOV A,R5
JZ UF4
MOV A,R4
AJMP UF1
UF2: MOV A,R5
ADD A,#127
JB NEGATIVE_FLAG,UF_NEG
CLR C
UF_NE1: RRC A
MOV R5,A
JC UF3
MOV A,R4
CLR ACC.7
MOV R4,A
UF3: LCALL STORE
RET
UF_NEG: SETB C
AJMP UF_NE1
UF4: MOV A,R4 ;特殊情况0,每办法规格化
JNZ UF2
MOV R5,#00
MOV R4,#00
MOV R3,#00
MOV R2,#00
LCALL STORE
RET
LST: CLR C
XCH A,R2
RLC A
XCH A,R2
XCH A,R3
RLC A
XCH A,R3
XCH A,R4
RLC A
XCH A,R4
DEC R5
RET
;*********************************
;将4字节浮点数村存入R6,R7所指向的单元
;
;*********************************
STORE: MOV DPL,R6
MOV DPH,R7
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R4
MOVX @DPTR,A
INC DPTR
MOV A,R5
MOVX @DPTR,A
INC DPTR
MOV R6,DPL
MOV R7,DPH
RET
;****************************************************************
;双字节无符号(隐含1位小数点)整形转化成浮点数
;由R0,R1指向要转换的数,转化后的结果存到r6,r7所知的单元
;*************************************************************
B4TOF: MOV R8,R6
MOV R9,R7
MOV FLOOP_COUNT,#32;移位32次
MOV R7,#00 ;QINGLING
MOV DPL,R0
MOV DPH,R1
MOVX A,@DPTR ;先取的为高位
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R10,A
INC DPTR
MOV R1,DPH
MOV R0,DPL
MOV A,R10 ;0不能规格化
JNZ B4F1
MOV A,R2
JNZ B4F1
MOV A,R3
JNZ B4F1
MOV A,R4
JNZ B4F1
MOV R5,#00H
MOV R6,R8
MOV R7,R9
LCALL STORE
RET
B4F1: ;以下是除10子程序,通过移位完成,入口R4高,R3底,被除数;出口R4高,R3底,商;R7用于移位,并存余数
CLR C
MOV A,R10 ; 为了和其它几个几个浮点程序一样的出入口及格式
RLC A
MOV R10,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R7
RLC A
MOV R7,A
B4F2: CLR C ;除以10分离出整数,和小数
MOV A,R7
SUBB A,#10 ;除10
JC B4FSMALL
MOV R7,A ;存余数
INC R10
SJMP b4F2
B4FSMALL: DJNZ FLOOP_COUNT,B4F1
MOV R6,#0
MOV FLOOP_COUNT,#8H ;以下将R7中的小数部分转化为二进制小数,放于R6,FLOOP_COUNT用于循环8次
B4F3: CLR C
MOV A,R7
ADDC A,R7
DA A
MOV B,A
ANL A,#0F0H ;分离出高4位,看是否有进位,由于除数是10 ,因此每次只能进位1位
JZ B4F4
SETB C
MOV A,R6
RLC A
MOV R6,A
AJMP B4F31
B4F4: CLR C
MOV A,R6
RLC A
MOV R6,A
B4F31: MOV A,B
ANL A,#0FH
MOV R7,A
DJNZ FLOOP_COUNT,B4F3
MOV R5,#158 ;31+127=158 阶码初始值
B4F5: MOV A,R4 ;以下是规格化此浮点数
JB ACC.7,B4FOVER
ACALL B4FLST
AJMP B4F5
B4FOVER: MOV A,R5
CLR C
RRC A
MOV R5,A
JC B4FOVER3
MOV A,R4
CLR ACC.7
MOV R4,A
B4FOVER3: MOV R6,R8
MOV R7,R9
LCALL STORE
RET
B4FLST: CLR C
XCH A,R6
RLC A
XCH A,R6
XCH A,R10
RLC A
XCH A,R10
XCH A,R2
RLC A
XCH A,R2
XCH A,R3
RLC A
XCH A,R3
XCH A,R4
RLC A
XCH A,R4
DEC R5
RET
;**********************************************
;外部数据RAM到外部RAM数据块复制
;R1(高)R0(底):原数据区首址
;R7(高)R6(底):目的数据区首址
; R2 :数据块长度
;**********************************************
COPY: MOV DPH,R1
MOV DPL,R0
MOVX A,@DPTR
INC DPTR
MOV R1,DPH
MOV R0,DPL
MOV DPH,R7
MOV DPL,R6
MOVX @DPTR,A
INC DPTR
MOV R6,DPL
MOV R7,DPH
DJNZ R2,COPY
RET
CLR_RAM: MOV DPTR,#ADDR_REAL-100
MOV R1,#4
MOV R2,#255
MOV A,#0
C1R: MOVX @DPTR,A
INC DPTR
DJNZ R2,C1R
DJNZ R1,C1R
RET
COPY_ALARM:MOV DPH,R1
MOV DPL,R0
MOVX A,@DPTR
INC DPTR
MOV R1,DPH
MOV R0,DPL
MOV DPH,R7
MOV DPL,R6
JZ NO_ALARM
JB ACC.7,NO_ALARM
MOV A,#0FFH
MOVX @DPTR,A
INC DPTR
MOV R6,DPL
MOV R7,DPH
DJNZ R2,COPY_ALARM
RET
NO_ALARM: MOV A,#0
MOVX @DPTR,A
INC DPTR
MOV R6,DPL
MOV R7,DPH
DJNZ R2,COPY_ALARM
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -