MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEEE转换,在上位机直接显示.

;这是本人使用的MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEEE转换,在上位机直接显示。
;本人还有热电阻和热电偶温度查表计算程序,有需要可EMAIL:[email protected]

; FLOATING PROGRAM
;
;##########################################
;##########################################
;-----------------------------------------------
; IEEE754 FLOAT CONVERT TO 4 BYTES FLOAT
; INPUT: ((R0))((R0)+1)((R0)+2)((R0)+3) IEEE-754 FLOAT
; OUTPUT: R4 R5R6R7    4 BYTES FLOAT
;-----------------------------------------------
IEE_F:MOV    A,@R0
    JNZ    CON_0
    INC    R0
    MOV    A,@R0
    JNZ    CON_1
    INC    R0
    MOV    A,@R0
    JNZ    CON_2
    INC    R0
    MOV    A,@R0
    JNZ    CON_3

    DEC    R0
    DEC    R0
    DEC    R0
    RET
CON_3:DEC    R0
CON_2:DEC    R0
CON_1:DEC    R0
CON_0:CLR    FLAG_0
    INC    R0
    MOV    A,@R0
    RLC    A
    MOV    R5,A
    DEC    R0
    MOV    A,@R0
    RLC    A
    MOV    R4,A
    JNC    SA_IE
    SETB    FLAG_0
SA_IE: CLR    C
    MOV    A,R4
    SUBB    A,#7FH
    CLR    C
    INC    A

    ,C
    MOV    C,FLAG_0
    ,C
    MOV    R4,A
    MOV    A,R5
    SETB    C
    RRC    A
    MOV    R5,A
    INC    R0
    INC    R0
    MOV    A,@R0
    MOV    R6,A
    INC    R0
    MOV    A,@R0
    MOV    R7,A
    DEC    R0
    DEC    R0
    DEC    R0
    RET
;---------------------------------------------
; 4 BYTES FLOAT CONVERT TO IEEE754 FLOAT
; INPUT: ((R0)) R2R3R4 4 BYTES FLOAT
; OUTPUT: ((R1)) ((R1)+1) ((R1)+2) ((R1)+3)
; IEEE-754 FLOAT
;---------------------------------------------
F_IEE:
    INC    R0
    MOV    A, @R0
    MOV    R2, A
    INC    R0
    MOV    A, @R0
    MOV    R3, A
    INC    R0
    MOV    A, @R0
    MOV    R4, A
    DEC    R0
    DEC    R0
    DEC    R0

    MOV    A,R2
    JZ    ZERO_IEE
    MOV    A,@R0

    MOV    FLAG_0,C
    CLR    ACC.

    JC    F_FF
    DEC    A
    CLR    C
    ADD    A,#7FH
    LJMP    F_TR
F_FF:    CLR    C
    SUBB    A,#02H
F_TR:    MOV    C,FLAG_0
    RRC    A
    MOV    @R1,A
    INC    R1
    MOV    A,R2
    ,C
    MOV    @R1,A
    INC    R1
    MOV    A,R3
    MOV    @R1,A
    INC    R1
    MOV    A,R4
    MOV    @R1,A
FIEE_OFF:DEC R1
    DEC    R1
    DEC    R1
    RET
ZERO_IEE:MOV @R1,A
    INC    R1
    MOV    @R1,A
    INC    R1
    MOV    @R1,A
    INC    R1
    MOV    @R1,A
    SJMP    FIEE_OFF
;==========================================
; 2 BYTE MUL
; 0.R2R3 * 0.R4R5→0.R2R3R7
;------------------------------------------
D2_MUL: MOV    A, R3
    MOV    B, R5
    MUL    AB
    MOV    R7, B
    MOV    A, R3
    MOV    B, R4
    MUL    AB
    ADD    A, R7
    MOV    R7, A
    CLR    A
    ADDC    A, B
    MOV    R3, A
    MOV    A, R2
    MOV    B, R5
    MUL    AB
    ADD    A, R7
    MOV    A, R3
    ADDC    A, B
    MOV    R3, A
    , c
    MOV    A, R2
    MOV    B, R4
    MUL    AB
    ADD    A, R3
    MOV    R3, A
    CLR    A
    ADDC    A, B

    ADDC    A, #
    MOV    R2, A
    RET

;------------------------------
; 2 BYTE DIV
; 0.R2R3R7R6 / 0.R4R5→0.R2R3
; INPUT 0.R2R3  < 0.R4R5
;------------------------------
D2_DIV: MOV    A, R1
    PUSH    ACC
    MOV    B, #10H
A2O:    CLR    C
    MOV    A, R6
    RLC    A
    MOV    R6, A
    MOV    A, R7
    RLC    A
    MOV    R7, A
    MOV    A, R3
    RLC    A
    MOV    R3, A
    XCH    A, R2
    RLC    A
    XCH    A, R2
    , C
    CLR    C
    SUBB    A, R5
    MOV    R1, A
    MOV    A, R2
    SUBB    A, R4
    , A2S
    JC    A2R
A2S:    MOV    R2, A
    MOV    A, R1
    MOV    R3, A
    INC    R6
A2R:    DJNZ    B, A2O
    POP    ACC
    MOV    R1, A
    MOV    A, R7
    MOV    R2, A
    MOV    A, R6
    MOV    R3, A
    RET

;--------------------------------------
; 3 BYTE FLOAT LOAD
; ((R0))→R6,((R0)+1)→R2,((R0)+2)→R3
; ((R1))→R7,((R1)+1)→R4,((R0)+2)→R5
;--------------------------------------
F3_MLD: MOV    A, @R0
    MOV    R6, A
    INC    R0
    MOV    A, @R0
    MOV    R2, A
    INC    R0
    MOV    A, @R0
    MOV    R3, A
    DEC    R0
    DEC    R0
    MOV    A, @R1
    MOV    R7, A
    INC    R1
    MOV    A, @R1
    MOV    R4, A
    INC    R1
    MOV    A, @R1
    MOV    R5, A
    DEC    R1
    DEC    R1
    RET

;--------------------------------------
; 3 BYTE FLOAT STANDED
;--------------------------------------
F3_SDT: JC    M3A
    MOV    C, FLAG39
    , M3B
    MOV    A, R2
    RRC    A
    MOV    R2, A
    MOV    A, R3
    RRC    A
    MOV    R3, A
    INC    R6
    RET
M3B:    MOV    A, R4
    RRC    A
    MOV    R4, A
    MOV    A, R5
    RRC    A
    MOV    R5, A
    INC    R7
    RET
M3A:    MOV    A, R2
    JNZ    M3C
    CJNE    R3, #, M3D
    MOV    R6, #41H
M3E:    RET
, M3E

    MOV    A, R3
    RLC    A
    MOV    R3, A
    MOV    A, R2
    RLC    A
    MOV    R2, A
    CLR    PSW.
    DEC    R6
    SJMP    M3A
    RET

;--------------------------------------
; 3 BYTE FLOAT ADD OR SUB
; R6R2R3 + R7R4R5→R4R2R3
; R6R2R3 - R7R4R5→R4R2R3
; FLAG3A = 0 ADD FLAG3A = 1 SUB
;--------------------------------------
F3_ABP: MOV    A, R6

    MOV    FLAG38, C
    XRL    A, R7
    , SQ
    CPL    FLAG3A
    MOV    A, R6

    , C
    MOV    R6, A
    MOV    A, R7

    , C
    MOV    R7, A
SQ:    CLR    C
    MOV    A, R6
    SUBB    A, R7
    JZ    ST
    CLR    PSW.
    CLR    FLAG39
    , SW
    CJNE    R4, #00H, SE
    CJNE    R5, #00H, SE
ST:    JB    FLAG3A, SY
    MOV    A, R3
    ADD    A, R5
    MOV    R3, A
    MOV    A, R2
    ADDC    A, R4
    MOV    R2, A
    JNC    SD
    SETB    FLAG39
    CLR    C

    LCALL    F3_SDT
SD:    MOV    A, R6
    MOV    C, FLAG38
    , C
    XCH    A, R4
    MOV    R6, A
    RET
SW:    CJNE    R2, #00H, SF
    CJNE    R3, #00H, SF
    MOV    A, R7
    MOV    R6, A
    SJMP    ST

    CLR    C
    LCALL    F3_SDT
    SJMP    SQ
SY:    MOV    A, R3
    CLR    C
    SUBB    A, R5
    MOV    R3, A
    MOV    A, R2
    SUBB    A, R4
    MOV    R2, A
    JNC    SL
    CLR    A
    CLR    C
    SUBB    A, R3
    MOV    R3, A
    CLR    A
    SUBB    A, R2
    MOV    R2, A
    CPL    FLAG38
SL:    SETB    C
    SJMP    SF

;--------------------------------------
;3 BYTE FLOAT ADD
; ((R0))((R0)+1)((R0)+2) + ((R1))((R1)+1)
;     ((R1)+2)→R4R2R3
; FLAG3A = 0
;--------------------------------------
F3_ADD: CLR    FLAG3A
    LCALL    F3_MLD
    LCALL    F3_ABP
    RET

;--------------------------------------
; 3 BYTE SUB
; ((R0))((R0)+1)((R0)+2) -
; ((R1))((R1)+1)((R1)+2)→R4R2R3
; FLAG3A =  1
;--------------------------------------
F3_SUB: SETB    FLAG3A
    LCALL    F3_MLD
    LCALL    F3_ABP
    RET

;--------------------------------------
; 3 BYTE FLOAT MUL
; ((R0))((R0)+1)((R0)+2) *
; ((R1))((R1)+1)((R1)+2)→R4R2R3
;--------------------------------------
F3_MUL: LCALL  F3_MLD
    MOV    A, R6
    XRL    A, R7

    MOV    FLAG38, C
    LCALL    D2_MUL
    MOV    A, R7

    , C
    MOV    A, @R0
    ADD    A, @R1
    MOV    R6, A
    SETB    C
    LCALL    F3_SDT
    MOV    A, R6
    MOV    C, FLAG38
    , C
    MOV    R4, A
    RET

;--------------------------------------
; 3 BYTE FLOAT DIV
; ((R0))((R0)+1)((R0)+2) /
; ((R1))((R1)+1)((R1)+2)→R4(阶)R2R3
; C = 0 NORMAL ,C = 1 DIV BY 0
;--------------------------------------
F3_DIV: LCALL    F3_MLD
    MOV    A, R6
    XRL    A, R7

    MOV    FLAG38, C
    CLR    A
    MOV    R6, A
    MOV    R7, A
    CJNE    R4, #00H, TY
    CJNE    R5, #00H, TY
    SETB    C
    RET
TY:    MOV    A, R3
    SUBB    A, R5
    MOV    A, R2
    SUBB    A, R4
    JC    TU
    CLR    PSW.
    CLR    FLAG39
    LCALL    F3_SDT
    MOV    A, R7
    RRC    A
    MOV    R7, A
    CLR    C
    SJMP    TY
TU:    CLR    A
    XCH    A, R6
    PUSH    ACC
    LCALL    D2_DIV
    POP    ACC
    ADD    A, @R0
    CLR    C
    SUBB    A, @R1
    MOV    C, FLAG38
    , C
    MOV    R4, A
    CLR    C
    RET

;-------------------------------
; 3BYTE FLOAT STORE
; R4R2R3 TO (R1)(R1+1)(R1+2)
;-------------------------------
F3_STR: MOV    A, R4
    MOV    @R1, A
    INC    R1
    MOV    A, R2
    MOV    @R1, A
    INC    R1
    MOV    A, R3
    MOV    @R1, A
    DEC    R1
    DEC    R1
    RET

;--------------------------------
; 3 BYTE FLOAT SQRT
; F0 = 0 NORMAL ,F0 = 1 ERROR
;--------------------------------
F3_SQRT:MOV    A, @R0
    , BV
    MOV    @R1, A
    INC    R0
    INC    R1
    MOV    A, @R0
    MOV    @R1, A
    INC    R0
    INC    R1
    MOV    A, @R0
    MOV    @R1, A
    DEC    R0
    DEC    R0
    DEC    R1
    DEC    R1
BM:    LCALL    F3_DIV
    MOV    R6, A
    MOV    A, @R1
    MOV    R7, A
    INC    R1
    MOV    A, @R1
    MOV    R4, A
    INC    R1
    MOV    A, @R1
    MOV    R5, A
    DEC    R1
    DEC    R1
    CLR    FLAG3A
    LCALL    F3_ABP
    DEC    R4
    CLR    PSW.
    MOV    A, R4
    MOV    B, R7
    CJNE    A, B, BN
    MOV    A, R5
    SUBB    A, R3
    ANL    A, #0FCH
    MOV    R7, A
    MOV    A, R6
    SUBB    A, R2
    JNZ    BN
    CJNE    R7, #00H, BN

BN:    LCALL    F3_STR
    , BM
    RET

    RET

;------------------------------------
; 3 BYTE BIN TO 4 BYTE FLOAT
; INPUT ADDRESS (R0),OUTPUT ADDRESS (R1)
;------------------------------------
F3_BTF:MOV    A, #10H
    MOV    R2, A
    MOV    A, @R0
    MOV    R3, A
    INC    R0
    MOV    A, @R0
    MOV    R4, A
    DEC    R0
    MOV    A, R3
    ORL    A, R4
    JNZ    FRLN1
    MOV    R2, A
    MOV    R3, A
    MOV    R4, A
    JMP    FRLN2
FRLN1:    MOV    A, R3
    , FRLN2
    LCALL    FRL1
    SJMP    FRLN1
FRLN2:    INC    R1
    INC    R1
    MOV    A, R4
    MOV    @R1, A
    DEC    R1
    MOV    A, R3
    MOV    @R1, A
    DEC    R1
    MOV    A, R2
    CLR    ACC.
    CLR    ACC.
    MOV    @R1, A
    RET

FRL1:    CLR    C
    MOV    A, R4
    RLC    A
    MOV    R4, A
    MOV    A, R3
    RLC    A
    MOV    R3, A
    DEC    R2
    MOV    A, R2
    XRL    A, #0C0H
    JNZ    FRL1E
    MOV    R2, A
    MOV    R3, A
    MOV    R4, A
FRL1E:    RET

;------------------------------------
; 3 BYTE FLOAT BIN TO DEC
; INPUT DATA: FLAG3E = 0 1 <= DATA < 10
; FLAG3E = 1 FLAG3F = 0 0.2 <= DATA < 2
; FLAG3E = 1 FLAG3F = 1 0.4 <= DATA < 4
;------------------------------------
F3_BTD: MOV    A, @R0

    MOV    FLAG3C, C

    , C
    MOV    R6, A
    INC    R0
    MOV    A, @R0
    MOV    R2, A
    INC    R0
    MOV    A, @R0
    MOV    R3, A
    DEC    R0
    DEC    R0
    CJNE    R2, #00H, PA
    CJNE    R3, #00H, PA
    CLR    A
    MOV    @R1, A
    INC    R1
    MOV    @R1, A
    INC    R1
    MOV    @R1, A
    INC    R1
    MOV    @R1, A
    INC    R1
    MOV    @R1, A
    INC    R1
    MOV    @R1, A
PL:    DEC    R1
    DEC    R1
    DEC    R1
    DEC    R1
    DEC    R1
    RET
PA:    MOV    @R1, #00H
    JB    FLAG3E, PB
    DEC    @R1
PB:    INC    R1
    MOV    @R1, #01H
    JNB    FLAG3E, PD
    INC    @R1
    JNB    FLAG3F, PD
    INC    @R1
PD:    MOV    A, R6
    CLR    C
    SUBB    A, @R1
    JZ    PX
    , PE
PM:    DEC    @R1
    DEC    @R1
    DEC    @R1
    DEC    @R1
PZ:    MOV    A, R6
    CLR    C
    SUBB    A, @R1
    JZ    PY
    , PF
PQ:    JNB    FLAG3E, PG
    DEC    R6
    JNB    FLAG3F, PG
    DEC    R6
PG:    CJNE    R6, #00H, PH
    MOV    R6, #05H
    JNB    FLAG3E, PI
    MOV    R7, #01H
    JNB    FLAG3F, PJ
    INC    R7
PJ:    CLR    A
    CLR    C
PK:    XCH    A, R3
    RLC    A
    XCH    A, R3
    XCH    A, R2
    RLC    A
    XCH    A, R2
    RLC    A
    DJNZ    R7, PK
    DEC    R6
    MOV    @R1, A
    INC    R1
PI:    MOV    A, R3
    MOV    B, #0AH
    MUL    AB
    MOV    R3, A
    MOV    R7,B
    MOV    A, R2
    MOV    B, #0AH
    MUL    AB
    ADD    A, R7
    MOV    R2, A
    CLR    A
    ADDC    A, B
    MOV    @R1, A
    INC    R1
    DJNZ    R6, PI
    SJMP    PL
PX:    MOV    A, R2
    SUBB    A, #80H
    JC    PM
PE:    MOV    R5, #0CDH
    MOV    R4, #0CCH
    LCALL    D2_MUL
    MOV    A, R2
    , PN
    MOV    A, R7

    ORL    C, ACC.
    MOV    A, R3
    RLC    A
    MOV    R3, A
    MOV    A, R2
    RLC    A
    MOV    R2, A
    DEC    R6
PT:    MOV    A, R6
    ADD    A, #0FDH
    MOV    R6, A
    DEC    R1
    INC    @R1
    INC    R1
    SJMP    PD
TPS:    SJMP    PZ
PH:    MOV    A, R2
    RRC    A
    MOV    R2, A
    MOV    A, R3
    RRC    A
    MOV    R3, A
    INC    R6
    SJMP    PG
PY:    MOV    A, #0CBH
    CLR    C
    SUBB    A, R3
    MOV    A, #0CCH
    SUBB    A, R2
    JC    PQ
PF:    MOV    R4, #0A0H
    MOV    R5, #00H
    LCALL    D2_MUL
    MOV    A, R2
    , PR
    MOV    A, R7

    ORL    C, ACC.
    MOV    A, R3
    RLC    A
    MOV    R3, A
    MOV    A, R2
    RLC    A
    MOV    R2, A
    DEC    R6
PU:    MOV    A, R6
    ADD    A, #04H
    MOV    R6, A
    DEC    R1
    DEC    @R1
    INC    R1
    SJMP    TPS
PN:    MOV    A, R7
    , PT
    MOV    A, R3
    ORL    A, #01H
    MOV    R3, A
    SJMP    PT
PR:    MOV    A, R7
    , PU
    MOV    A, R3
    ORL    A, #01H
    MOV    R3, A
    SJMP    PU

;-----------------------------------
; 4 BITE FLOAT MUL
;((R0))((R0)+1)((R0)+2)((R0)+3)*
; ((R1))((R1)+1)((R1)+2)((R1)+3)
; TO R4R5R6R7
;-----------------------------------
F4_MUL: LCALL F4_LD
    INC    R1
    MOV    A, R0
    PUSH    ACC
    LCALL    D3_MUL
    POP    ACC
    MOV    R0, A
    DEC    R1
    MOV    A, R2

    , C
    MOV    A, @R0
    XRL    A, @R1

    MOV    FLAG38, C
    MOV    A, @R0
    ADD    A, @R1
    XCH    A, R0
    PUSH    ACC
    SETB    C
    LCALL    F4_STD
    POP    ACC
    XCH    A, R0
    MOV    C, FLAG38
    , C
    MOV    R4, A
    RET

;-----------------------------------
; 4 BITE FLOAT DIV
;((R0))((R0)+1)((R0)+2)((R0)+3)/
; ((R1))((R1)+1)((R1)+2)((R1)+3)
; TO R4R5R6R7,
; C=0 NORMAL, C=1 DIV BY 0
;-----------------------------------
F4_DIV: LCALL  F4_LD
    MOV    A, @R0
    XRL    A, @R1

    MOV    FLAG38, C
    CLR    A
    MOV    R5, A
    MOV    R6, A
    MOV    R7, A
    INC    R1
    CJNE    @R1, #00H, L4A
    INC    R1
    CJNE    @R1, #00H, L4B
    INC    R1
    CJNE    @R1, #00H, L4C
    DEC    R1
    DEC    R1
    DEC    R1
    SETB    C
    RET
L4C:    DEC    R1
L4B:    DEC    R1
L4A:    DEC    R1
    MOV    A, @R0
    XCH    A, R0
    INC    R1
    PUSH    ACC
L4E:    MOV    A, R4
    INC    R1
    INC    R1
    SUBB    A, @R1
    MOV    A, R3
    DEC    R1
    SUBB    A, @R1
    MOV    A, R2
    DEC    R1
    SUBB    A, @R1
    JC    L4D
    CLR    PSW.
    CLR    FLAG39
    LCALL    F4_STD
    MOV    A, R5
    RRC    A
    MOV    R5, A
    CLR    C
    SJMP    L4E
L4D:    MOV    A, R0
    PUSH    ACC
    LCALL    D3_DIV
    POP    ACC
    DEC    R1
    XCH    A, R0
    POP    ACC
    XCH    A, R0
    CLR    C
    SUBB    A, @R1
    MOV    C, FLAG38
    , C
    MOV    R4, A
    CLR    C
    RET

;-----------------------------------------
; 4 BITE FLOAT  LOAD
; ((R0)+1)((R0)+2)((R0)+3) TO R2R3R4
;-----------------------------------------
F4_LD:    INC    R0
    MOV    A, @R0
    MOV    R2, A
    INC    R0
    MOV    A, @R0
    MOV    R3, A
    INC    R0
    MOV    A, @R0
    MOV    R4, A
    DEC    R0
    DEC    R0
    DEC    R0
    RET

;-----------------------------------------
; 4 BITE FLOAT  ADD OR SUB
; ((R0))(R2)(R3)(R4) + ((R1))((R1)+1)((R1)+2)
;      ((R1)+3) TO R4R5R6R7
; ((R0))(R2)(R3)(R4) - ((R1))((R1)+1)((R1)+2)
;      ((R1)+3) TO R4R5R6R7
; FLAG3A=0 ADD, FLAG3A=1 SUB
;-----------------------------------------
F4_AB:    INC    R1
    MOV    A, @R1
    MOV    R5, A
    INC    R1
    MOV    A, @R1
    MOV    R6, A
    INC    R1
    MOV    A, @R1
    MOV    R7, A
    DEC    R1
    DEC    R1
    DEC    R1
    MOV    A, @R0

    MOV    FLAG38, C
    XRL    A, @R1
    , F4_ABT
    CPL    FLAG3A
F4_ABT:MOV    A, R0
    PUSH    ACC
    MOV    A, @R0

    , C
    MOV    R0, A
    MOV    A, R1
    PUSH    ACC
    MOV    A, @R1

    , C
    MOV    R1, A
F4_SDT1:CLR    C
    MOV    A, R0
    SUBB    A, R1
    JZ    F4_ABTI
    CLR    PSW.
    CLR    FLAG39
    , F4_ABX
    CJNE    R5, #00H, F4_ABG
    CJNE    R6, #00H, F4_ABG
    CJNE    R7, #00H, F4_ABG
    MOV    A, R0
    MOV    R1, A
F4_ABTI:JB    FLAG3A, F4_ABS
    MOV    A, R4
    ADD    A, R7
    MOV    R7, A
    MOV    A, R3
    ADDC    A, R6
    MOV    R6, A
    MOV    A, R2
    ADDC    A, R5
    MOV    R5, A
    JNC    F4_ABA
    SETB    FLAG39
    CLR    C

F4_ABL: LCALL F4_STD
    MOV    A, R1
    MOV    R0, A
F4_ABA: POP    ACC
    MOV    R1, A
    POP    ACC
    XCH    A, R0
    MOV    C, FLAG38
    , C
    XCH    A, R4
    RET
F4_ABX: CJNE    R2, #00H, F4_ABG1
    CJNE    R3, #00H, F4_ABG1
    CJNE    R4, #00H, F4_ABG1
    MOV    A, R1
    MOV    R0, A
    SJMP    F4_ABTI

F4_ABG1:CLR    C
    LCALL    F4_STD
    SJMP    F4_SDT1
F4_ABS: CLR    C
    MOV    A, R4
    SUBB    A, R7
    MOV    R7, A
    MOV    A, R3
    SUBB    A, R6
    MOV    R6, A
    MOV    A, R2
    SUBB    A, R5
    MOV    R5, A
    JNC    F4_ABS1
    CLR    A
    CLR    C
    SUBB    A, R7
    MOV    R7, A
    CLR    A
    SUBB    A, R6
    MOV    R6, A
    CLR    A
    SUBB    A, R5
    MOV    R5, A
    CPL    FLAG38
F4_ABS1:SETB    C
    CLR    PSW.
    LCALL    F4_STD
    SJMP    F4_ABA

;-----------------------------------------
; 4 BITE FLOAT  ADD
; ((R0))(R2)(R3)(R4) + ((R1))((R1)+1)((R1)+2)
;      ((R1)+3) TO R4R5R6R7
; FLAG3A=0 ADD
;-----------------------------------------
F4_ADD: CLR    FLAG3A
    LCALL    F4_LD
    LCALL    F4_AB
    RET

;-----------------------------------------
; 4 BITE FLOAT   SUB
; ((R0))(R2)(R3)(R4) - ((R1))((R1)+1)((R1)+2)
;      ((R1)+3) TO R4R5R6R7
; FLAG3A=1 SUB
;-----------------------------------------
F4_SUB: SETB    FLAG3A
    LCALL    F4_LD
    LCALL    F4_AB
    RET

;-----------------------------------------
; 4 BITE FLOAT  STANDED
; F0=0 R0R2R3R4
; F0=1 R1R5R6R7
;-----------------------------------------
F4_STD: JC    F4A
    MOV    C, FLAG39
    , F4B
    MOV    A, R2
    RRC    A
    MOV    R2, A
    MOV    A, R3
    RRC    A
    MOV    R3, A
    MOV    A, R4
    RRC    A
    MOV    R4, A
    INC    R0
    RET
F4B:    MOV    A, R5
    RRC    A
    MOV    R5, A
    MOV    A, R6
    RRC    A
    MOV    R6, A
    MOV    A, R7
    RRC    A
    MOV    R7, A
    INC    R1
    RET
F4A:    MOV    A, R5
    JNZ    F4C
    CJNE    R6, #00H, F4D
    CJNE    R7, #00H, F4D
F4E:    RET
, F4E    ; 0E7H

    MOV    A, R7
    RLC    A
    MOV    R7, A
    MOV    A, R6
    RLC    A
    MOV    R6, A
    MOV    A, R5
    RLC    A
    MOV    R5, A
    CLR    PSW.
    DEC    R0
    SJMP    F4A

;-----------------------------------
; 4 BYTE FLOAT STORE
; R4R5R6R7 TO (R0)(R0+1)(R0+2)(R0+3)
;-----------------------------------
F4_STR: MOV    A, R4
    MOV    @R0, A
    INC    R0
    MOV    A, R5
    MOV    @R0, A
    INC    R0
    MOV    A, R6
    MOV    @R0, A
    INC    R0
    MOV    A, R7
    MOV    @R0, A
    DEC    R0
    DEC    R0
    DEC    R0
    RET

;-------------------------------------------
; 3 BYTE DIV
; 0.R2R3R4R5R6R7 / ((R1))((R1)+1)((R1)+2)
;    TO (R0)(R0+1)(R0+2)(R0+3)
;-------------------------------------------
D3_DIV: MOV    R0, #18H
    INC    R1
    INC    R1
S3D:    CLR    C
    MOV    A, R7
    RLC    A
    MOV    R7, A
    MOV    A, R6
    RLC    A
    MOV    R6, A
    MOV    A, R5
    RLC    A
    MOV    R5, A
    MOV    A, R4
    RLC    A
    MOV    R4, A
    XCH    A, R3
    RLC    A
    XCH    A, R3
    XCH    A, R2
    RLC    A
    XCH    A, R2
    , C
    CLR    C
    SUBB    A, @R1
    DEC    R1
    MOV    A, R3
    SUBB    A, @R1
    DEC    R1
    MOV    B, A
    MOV    A, R2
    SUBB    A, @R1
    INC    R1
    INC    R1
    , S3A
    JC    S3B
S3A:    CLR    C
    MOV    R2, A
    MOV    A, R4
    SUBB    A, @R1
    MOV    R4, A
    MOV    R3, B
    INC    R7
S3B:    DJNZ    R0, S3D
    DEC    R1
    DEC    R1
    RET

;---------------------------------------
; 3 BYTE MUL
; 0.R2R3R4 * 0.((R1))((R1)+1)((R1)+2)
; TO R5R6R2R3R4
;---------------------------------------
D3_MUL: MOV    R0, #19H
    CLR    C
    CLR    A
    MOV    R5, A
    MOV    R6, A
    MOV    R7, A
K3B:    MOV    A, R5
    RRC    A
    MOV    R5, A
    MOV    A, R6
    RRC    A
    MOV    R6, A
    MOV    A, R7
    RRC    A
    MOV    R7, A
    XCH    A, R2
    RRC    A
    XCH    A, R2
    XCH    A, R3
    RRC    A
    XCH    A, R3
    XCH    A, R4
    RRC    A
    XCH    A, R4
    DJNZ    R0, K3A
    RET
K3A:    JNC    K3B
    INC    R1
    INC    R1
    ADD    A, @R1
    MOV    R7, A
    MOV    A, R6
    DEC    R1
    ADDC    A, @R1
    MOV    R6, A
    MOV    A, R5
    DEC    R1
    ADDC    A, @R1
    MOV    R5, A
    SJMP    K3B

;-------------------------------------------
; 功能:以e为底的浮点指数函数
;入口条件:操作数在TMP0中。使用TMP0,TMP1,TMP2
;出口信息:OV=0时,结果仍在TMP0中,OV=1时,溢出。
;影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH  堆栈需求:6字节
;-------------------------------------------
F4_EXP:
    MOV    R1, #TMP1
    MOV    A, #01H        ; e(x) = 2(1.442695 * x)
    MOV    @R1, A
    INC    R1
    MOV    A, #0B8H
    MOV    @R1, A
    INC    R1
    MOV    A, #0AAH
    MOV    @R1, A
    INC    R1
    MOV    A, #3BH
    MOV    @R1, A

    MOV    R0, #TMP0
    MOV    R1, #TMP1
    LCALL    F4_MUL        ;进行加权运算
    MOV    R0, #TMP0
    LCALL    F4_STR

E20:
    MOV    R0, #TMP0
    MOV    A, @R0
    MOV    R4, A
    INC    R0
    MOV    A, @R0
    MOV    R5, A
    INC    R0
    MOV    A, @R0
    MOV    R6, A
    INC    R0
    MOV    A, @R0
    MOV    R7, A
    MOV    A, R5
    ORL    A, R6
    ORL    A, R7
    JNZ    EXP2
EXP1:
    MOV    R4, #01H        ;尾数为零,幂为1.000000
    MOV    R5, #80H
    MOV    R6, #00H
    MOV    R7, #00H
    CLR    OV
    RET
EXP2:
    MOV    R0, #TMP0
    MOV    A, @R0
    MOV    R4, A        ;将指数复制到工作区
    INC    R0
    MOV    A, @R0
    MOV    R5, A
    INC    R0
    MOV    A, @R0
    MOV    R6, A
    INC    R0
    MOV    A, @R0
    MOV    R7, A
    LCALL    INT
EXP4:
    MOV    A, R4
    , EXP5
    CLR    ACC.
    MOV    R0, A
    CLR    C
    MOV    R1, #00H
    MOV    A, R5
    PUSH    ACC
EXPJ1:    MOV    A, R5
    RLC    A
    MOV    R5, A
    MOV    A, R1
    RLC    A
    MOV    R1, A
    DJNZ    R0, EXPJ1
    POP    ACC
    MOV    R5, A
    MOV    A, R4
    , EXPJ2
    MOV    A, R1
    SJMP    EXP6
EXPJ2:    MOV    A, R1
    CPL    A
    INC    A
    SJMP    EXP6
EXP5:    MOV    A, #00H
EXP6:    PUSH    ACC    ;暂时保存之
    MOV    R0, #TMP1
    LCALL    F4_STR
    MOV    R0, #TMP0
    MOV    R1, #TMP1
    LCALL    F4_SUB    ;求指数的小数部分
    MOV    R0, #TMP0
    LCALL    F4_STR

    PUSH    DPH
    PUSH    DPL
    MOV    DPTR, #EXP_TABL
    MOV    TMP2, #41H
    , #00H
    , #00H
    , #00H
PLN1:    CLR    A        ;计算指数的小数部分的幂
    MOV    R0, #TMP1
    MOVC    A, @A+DPTR
    MOV    @R0, A
    INC    DPTR
    INC    R0
    CLR    A
    MOVC    A, @A+DPTR
    MOV    @R0, A
    INC    DPTR
    INC    R0
    CLR    A
    MOVC    A, @A+DPTR
    MOV    @R0, A
    INC    DPTR
    INC    R0
    CLR    A
    MOVC    A, @A+DPTR
    MOV    @R0, A
    INC    DPTR    ;指向下一个系数
    MOV    R0, #TMP2
    MOV    R1, #TMP1
    LCALL    F4_ADD    ;进行代数加法运算
    MOV    R0, #TMP2
    LCALL    F4_STR
    CLR    A    ;读取下一个系数的第一个字节
    MOVC    A, @A+DPTR
    CJNE    A, #40H, PLN2;是结束标志吗?
    POP    DPL
    POP    DPH
    POP    ACC        ;取出指数的整数部分
    ADD    A, R4        ;按补码加到幂的阶码上
    MOV    R4, A
    MOV    A, R4
    CLR    ACC.    ;幂的符号为正
    MOV    R4, A
    RET

PLN2:
    MOV    R0, #TMP0
    MOV    R1, #TMP2
    LCALL    F4_MUL    ;进行乘法运算
    MOV    R0, #TMP2
    LCALL    F4_STR
    LJMP    PLN1    ;继续下一项运算

EXP_TABL:
    DB    77H, 0B1H, 0C9H, 00H    ; 1.3564 * 10(-3)
    DB    7AH, 0A1H,  68H, 00H    ; 9.8514 * 10(-3)
    DB    7CH, 0E3H,  4FH, 00H    ; 0.055495
    DB    7EH, 0F5H, 0E7H, 00H    ; 0.24014
    DB    00H, 0B1H,  72H, 00H    ; 0.69315
    DB    01H,  80H,  00H, 00H    ; 1.000000
    DB    40H,  40H,  40H, 40H    ;结束
;-------------------------------------------
; (R4)R5R6R7
;-------------------------------------------
RLN:    MOV    A, R5        ;浮点数规格化
    ORL    A, R6        ;尾数为零否?
    ORL    A, R7
    JNZ    RLN1
    MOV    R4, #0C1H    ;阶码取最小值
    RET
RLN1:    MOV    A, R5
    , RLN2    ;尾数最高位为一否?
    CLR    C        ;不为一,左规一次
    LCALL    RL1
    SJMP    RLN        ;继续判断
RLN2:    CLR    OV        ;规格化结束
    RET
RL1:    MOV    A, R7        ;第一操作数左规一次
    RLC    A        ;尾数扩大一倍
    MOV    R7, A
    MOV    A, R6
    RLC    A
    MOV    R6, A
    MOV    A, R5
    RLC    A
    MOV    R5, A
    DEC    R4        ;阶码减一
    CJNE    R4, #0C0H, RL1E    ;阶码下溢否?
    CLR    A
    MOV    R5, A        ;阶码下溢,操作数以零计
    MOV    R6, A
    MOV    R7, A
    MOV    R4, #0C1H
RL1E:    CLR    OV
    RET
RR1:    MOV    A, R5    ;第一操作数右规一次
    RRC    A    ;尾数缩小一半
    MOV    R5, A
    MOV    A, R6
    RRC    A
    MOV    R6, A
    MOV    A, R7
    RRC    A
    MOV    R7, A
    INC    R4    ;阶码加一
    CLR    OV    ;清溢出标志
    CJNE    R4, #40H, RR1E    ;阶码上溢否?
    MOV    R4, #3FH    ;阶码溢出
    SETB    OV
RR1E:    RET

;-------------------------------------------
; 功能:浮点取整函数
;入口条件:操作数在[R0]中。
;出口信息:R4R5R6R7
;-------------------------------------------
FINT:
    MOV    A, @R0
    MOV    R4, A    ;阶存放在R4中
    INC    R0
    MOV    A, @R0    ;将尾数高字节存放在R5中
    MOV    R5, A
    INC    R0
    MOV    A, @R0    ;将尾数第二字节存放在R6中
    MOV    R4, A
    INC    R0
    MOV    A, @R0    ;将尾数第三字节存放在R7中
    MOV    R7, A
    DEC    R0    ;恢复数据指针
    DEC    R0
    DEC    R0
    LCALL    INT    ;在工作寄存器中完成取整运算
    RET

INT:    MOV    A, R5
    ORL    A, R6
    ORL    A, R7
    JNZ    INTA
    MOV    R4, #41H    ;尾数为零,阶码也清零,结束取整
    RET

INTA:    MOV    A, R4
    CLR    ACC.
    JZ    INTB    ;阶码为零否?
    , INTB;阶符为负否?
    CLR    ACC.
    CLR    C
    SUBB    A, #18H    ;阶码小于24否?
    JC    INTD
    RET        ;阶码大于24,已经是整数
INTB:    CLR    A      ;绝对值小于一,取整后正数为零,负数为负一
    MOV    R7, A
    MOV    R6, A
    MOV    R5, A
    MOV    R4, #41H
INTC:    RET

INTD:    CLR    F0    ;舍尾标志初始化
    MOV    A, R4
    CLR    ACC.
    MOV    R0, A
    CLR    A
    MOV    R1, A
    MOV    R2, A
    MOV    R3, A
    CLR    C
INTE:
    MOV    A, R7
    RLC    A
    MOV    R7, A
    MOV    A, R6
    RLC    A
    MOV    R6, A
    MOV    A, R5
    RLC    A
    MOV    R5, A
    MOV    A, R3
    RLC    A
    MOV    R3, A
    MOV    A, R2
    RLC    A
    MOV    R2, A
    MOV    A, R1
    RLC    A
    MOV    R1, A
    DJNZ    R0, INTE    ;阶码
    MOV    A, R4
    CLR    ACC.
    MOV    R0, A
    MOV    A, #18H
    CLR    C
    SUBB    A, R0
    MOV    R0, A
INTF:    CLR    C
    MOV    A, R3
    RLC    A
    MOV    R3, A
    MOV    A, R2
    RLC    A
    MOV    R2, A
    MOV    A, R1
    RLC    A
    MOV    R1, A
    DJNZ    R0, INTF
    MOV    A, R3
    MOV    R7, A
    MOV    A, R2
    MOV    R6, A
    MOV    A, R1
    MOV    R5, A
    RET
05-08 15:08