?? isomaths.asm
字號(hào):
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;位尋址區(qū):20h-->24h即(00-->27h)用語(yǔ)一些數(shù)制轉(zhuǎn)換計(jì)算,25H(28H-->2FH)用于標(biāo)志
;26h-->2Ah(即30H-->57H):用于上位機(jī)通信
;2Bh-->2Fh(即58h-->7fh)用于與設(shè)備通信標(biāo)志
;RAM 10H-->1FH用于上位機(jī)(即兩組寄存器)
;RAM 30H-->3FH及浮點(diǎn)數(shù)運(yùn)算
;RAM 40H-->4FH用于設(shè)備
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NEGATIVE_FLAG BIT 28H ;用于浮點(diǎn)數(shù)轉(zhuǎn)換
POINTER_FLAG BIT 29H ;用于小數(shù)點(diǎn)標(biāo)志
FLOOP_COUNT EQU 30H ;用于浮點(diǎn)數(shù)及程序中的循環(huán)
R8 EQU 31H ;浮點(diǎn)數(shù)轉(zhuǎn)化暫存地址
R9 EQU 32H ;用于浮點(diǎn)數(shù)
R10 EQU 33H ;用于浮點(diǎn)數(shù)
BCD_LEN EQU 34H ;用于BCD碼的轉(zhuǎn)換
REG_R0 EQU 35H ;暫存BCD碼轉(zhuǎn)化為浮點(diǎn)數(shù)的地址保護(hù)
REG_R1 EQU 36H
REG_R6 EQU 37H
REG_R7 EQU 38H
;以下是浮點(diǎn)數(shù)轉(zhuǎn)化程序,針對(duì)ISOVEL數(shù)據(jù)格式編寫
;***************************************
;四字節(jié)浮點(diǎn)數(shù)轉(zhuǎn)換成雙字節(jié)無(wú)符號(hào)整形(隱含1位小數(shù)點(diǎn))
;由R0,R1指向要轉(zhuǎn)換的數(shù),轉(zhuǎn)化后的結(jié)果存到r3(底位),r4(高位)
;R2(底位) R3 R4 R5(階碼)
;R3 R4
;***************************************
FTOB1: CLR NEGATIVE_FLAG
MOV DPL,R0 ;取數(shù)
MOV DPH,R1
MOVX A,@DPTR
MOV R2,A ;取底位
INC DPTR
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOV R0,DPL
MOV R1,DPH
MOV A,R5 ;特殊情況,0時(shí)此數(shù)位0
JNZ SIGB
MOV A,R2
JNZ SIGB
MOV A,R3
JNZ SIGB
MOV A,R4
JNZ SIGB
RET
SIGB: MOV A,R5 ;判正負(fù)
JNB ACC.7,SIGB0
SETB NEGATIVE_FLAG
SIGB0: CLR C
MOV A,R4
RLC A
MOV A,R5
RLC A
CLR C
SUBB A,#127
ADD A,#3 ;階碼加3相當(dāng)于*8
MOV R5,A
MOV A,R4
SETB ACC.7 ;恢復(fù)隱含的1
MOV R4,A
MOV R7,A
MOV A,R3
MOV R6,A
MOV A,R2
MOV 21H,A
CLR C
XCH A,R7
RRC A
XCH A,R7
XCH A,R6
RRC A
XCH A,R6
XCH A,21H
RRC A
XCH A,21H
CLR C
XCH A,R7
RRC A
XCH A,R7
XCH A,R6
RRC A
MOV R6,A
XCH A,21H
RRC A
CLR C
ADD A,R2
MOV A,R6
ADDC A,R3
MOV R3,A
MOV A,R7
ADDC A,R4
MOV R4,A
JC SIGB1
SIGB2: MOV A,R5
CLR C
CJNE A,#15,SIGB3 ;階碼15,則為原數(shù)
RET
SIGB1: INC R5
SETB C
XCH A,R4
RRC A
XCH A,R4
XCH A,R3
RRC A
XCH A,R3
LJMP SIGB2
SIGB3: JC SIGB4
MOV R3,#0FFH ;數(shù)據(jù)超出2字節(jié)范圍,簡(jiǎn)單的處理
MOV R4,#7FH
RET
SIGB4: MOV A,#15
CLR C
SUBB A,R5
MOV R5,A ;分離出右移次數(shù)
SIGB5: LCALL RIGHT
DJNZ R5,SIGB5 ;一位結(jié)束后R4,R3即為所得的數(shù)
JNB NEGATIVE_FLAG,SIGB6 ;
CLR C
MOV A,R3
CPL A
ADD A,#1
MOV R3,A
MOV A,R4
CPL A
ADDC A,#0
MOV R4,A
SIGB6: RET
;***************************************
;四字節(jié)浮點(diǎn)數(shù)轉(zhuǎn)換成雙字節(jié)無(wú)符號(hào)整形
;由R0,R1指向要轉(zhuǎn)換的數(shù),轉(zhuǎn)化后的結(jié)果存到r3(底位),r4(高位)
;R2 R3 R4 R5
;R2 R3
;***************************************
FTOB: CLR NEGATIVE_FLAG
MOV DPL,R0 ;取數(shù)
MOV DPH,R1
MOVX A,@DPTR
MOV R2,A ;取底位
INC DPTR
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOV R0,DPL
MOV R1,DPH
MOV A,R5
JNB ACC.7,FT_NEG0
SETB NEGATIVE_FLAG
FT_NEG0: MOV A,R5 ;特殊情況,0時(shí)此數(shù)位0
JNZ FT1
MOV A,R2
JNZ FT1
MOV A,R3
JNZ FT1
MOV A,R4
JNZ FT1
RET
FT1: CLR C
MOV A,R4
RLC A
MOV A,R5
RLC A
CLR C
SUBB A,#127
MOV R5,A
CLR C
CJNE A,#15,FI1 ;與15等,即不用移位,即為R4,R3,原數(shù)
RET
FI1: JC FI2
MOV R3,#0FFH ;數(shù)據(jù)超出2字節(jié)范圍,簡(jiǎn)單的處理
MOV R4,#7FH
RET
FI2: MOV A,R4 ;恢復(fù)隱含的1
SETB ACC.7
MOV R4,A
MOV A,#15
CLR C
SUBB A,R5
MOV R5,A ;分離出右移次數(shù)
FI3: LCALL RIGHT
DJNZ R5,FI3 ;一位結(jié)束后R4,R3即為所得的數(shù)
JB NEGATIVE_FLAG,FI_NEG
RET
FI_NEG: CLR C
MOV A,R3
CPL A
ADD A,#1
MOV R3,A
MOV A,R4
CPL A
ADDC A,#0
MOV R4,A
RET
RIGHT: CLR C
XCH A,R4
RRC A
XCH A,R4
XCH A,R3
RRC A
XCH A,R3
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
B1TOF: CLR NEGATIVE_FLAG
MOV R9,R7 ;為子程序出口統(tǒng)一,暫存R6,R7地址
MOV R8,R6
MOV R6,#10H ;除法移位次數(shù)
MOV R7,#0 ;移位積存器清零
MOV DPL,R0
MOV DPH,R1
MOVX A,@DPTR
MOV R4,A ;取高位
INC DPTR
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOV R0,DPL
MOV R1,DPH
MOV A,R4
JNB ACC.7,LP ;判斷正負(fù)
SETB NEGATIVE_FLAG
CLR C ;還原為原碼
MOV A,R3
SUBB A,#1
MOV R3,A
MOV A,R4
SUBB A,#0
CPL A
MOV R4,A
MOV A,R3
CPL A
MOV R3,A
;以下是除10子程序,通過(guò)移位完成,入口R4高,R3底,被除數(shù);出口R4高,R3底,商;R7用于移位,并存余數(shù)
LP: CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R7
RLC A
MOV R7,A
LP1: CLR C ;除以10分離出整數(shù),和小數(shù)
MOV A,R7
SUBB A,#10 ;除10
JC SMALL
MOV R7,A ;存余數(shù)
INC R3
SJMP LP1
SMALL: DJNZ R6,LP
MOV R2,#0
MOV R6,#8H ;以下將R7中的小數(shù)部分轉(zhuǎn)化為二進(jìn)制小數(shù),放于R2 ,R6用于循環(huán)8次
LP3: CLR C
MOV A,R7
ADDC A,R7
DA A
MOV B,A
ANL A,#0F0H ;分離出高4位,看是否有進(jìn)位,由于除數(shù)是10 ,因此每次只能進(jìn)位1位
JZ LP4
SETB C
MOV A,R2
RLC A
MOV R2,A
AJMP LP31
LP4: CLR C
MOV A,R2
RLC A
MOV R2,A
LP31: MOV A,B
ANL A,#0FH
MOV R7,A
DJNZ R6,LP3
MOV A,R2 ;0,不能規(guī)格化
JZ LP32
AJMP LP5
LP32: MOV A,R3
JZ LP33
SJMP LP5
LP33: MOV A,R4
JZ LP6
LP5: MOV R5,#142 ;15+127=142 階碼初始值
LP51: MOV A,R4 ;以下是規(guī)格化此浮點(diǎn)數(shù)
JB ACC.7,LPOVER
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -