⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fp-52.sdi

📁 proteus 仿真实例
💻 SDI
📖 第 1 页 / 共 5 页
字号:
,,,;************************************************************
,,,;
,,,; This is a complete BCD floating point package for the 8051 micro-
,,,; controller. It provides 8 digits of accuracy with exponents that
,,,; range from +127 to -127. The mantissa is in packed BCD, while the
,,,; exponent is expressed in pseudo-twos complement. A ZERO exponent
,,,; is used to express the number ZERO. An exponent value of 80H or
,,,; greater than means the exponent is positive, i.e. 80H = E 0,
,,,; 81H = E+1, 82H = E+2 and so on. If the exponent is 7FH or less,
,,,; the exponent is negative, 7FH = E-1, 7EH = E-2, and so on.
,,,; ALL NUMBERS ARE ASSUMED TO BE NORMALIZED and all results are
,,,; normalized after calculation. A normalized mantissa is >=.10 and
,,,; <=.99999999.
,,,;
,,,; The numbers in memory assumed to be stored as follows:
,,,;
,,,; EXPONENT OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE
,,,; SIGN OF ARGUMENT 2       =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-1
,,,; DIGIT 78 OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-2
,,,; DIGIT 56 OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-3
,,,; DIGIT 34 OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-4
,,,; DIGIT 12 OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-5
,,,;
,,,; EXPONENT OF ARGUMENT 1   =   VALUE OF ARG_STACK
,,,; SIGN OF ARGUMENT 1       =   VALUE OF ARG_STACK-1
,,,; DIGIT 78 OF ARGUMENT 1   =   VALUE OF ARG_STACK-2
,,,; DIGIT 56 OF ARGUMENT 1   =   VALUE OF ARG_STACK-3
,,,; DIGIT 34 OF ARGUMENT 1   =   VALUE OF ARG_STACK-4
,,,; DIGIT 12 OF ARGUMENT 1   =   VALUE OF ARG_STACK-5
,,,;
,,,; The operations are performed thusly:
,,,;
,,,; ARG_STACK+FP_NUMBER_SIZE = ARG_STACK+FP_NUMBER_SIZE # ARG_STACK
,,,;
,,,; Which is ARGUMENT 2 = ARGUMENT 2 # ARGUMENT 1
,,,;
,,,; Where # can be ADD, SUBTRACT, MULTIPLY OR DIVIDE.
,,,;
,,,; Note that the stack gets popped after an operation.
,,,;
,,,; The FP_COMP instruction POPS the ARG_STACK TWICE and returns status.
,,,;
,,,;**********************************************************************
,,,;
,,,$EJECT
,,,;**********************************************************************
,,,;
,,,; STATUS ON RETURN - After performing an operation (+, -, *, /)
,,,;                    the accumulator contains the following status
,,,;
,,,; ACCUMULATOR - BIT 0 - FLOATING POINT UNDERFLOW OCCURED
,,,;
,,,;             - BIT 1 - FLOATING POINT OVERFLOW OCCURED
,,,;
,,,;             - BIT 2 - RESULT WAS ZER0
,,,;
,,,;             - BIT 3 - DIVIDE BY ZERO ATTEMPTED
,,,;
,,,;             - BIT 4 - NOT USED, 0 RETURNED
,,,;
,,,;             - BIT 5 - NOT USED, 0 RETURNED
,,,;
,,,;             - BIT 6 - NOT USED, 0 RETURNED
,,,;
,,,;             - BIT 7 - NOT USED, 0 RETURNED
,,,;
,,,; NOTE: When underflow occures, a ZERO result is returned.
,,,;       When overflow or divide by zero occures, a result of
,,,;       .99999999 E+127 is returned and it is up to the user
,,,;       to handle these conditions as needed in the program.
,,,;
,,,; NOTE: The Compare instruction returns F0 = 0 if ARG 1 = ARG 2
,,,;       and returns a CARRY FLAG = 1 if ARG 1 is > ARG 2
,,,;
,,,;***********************************************************************
,,,;
,,,$EJECT
,,,;***********************************************************************
,,,;
,,,; The following values MUST be provided by the user
,,,;
,,,;***********************************************************************
,,,;
,,,ARG_STACK       EQU     9       ;ARGUMENT STACK POINTER
,,,ARG_STACK_PAGE  EQU     1
,,,FORMAT          EQU     23      ;LOCATION OF OUTPUT FORMAT BYTE
,,,OUTPUT          EQU     1990H   ;CALL LOCATION TO OUTPUT A CHARACTER
,,,CONVT           EQU     58H     ;LOCATION TO CONVERT NUMBERS
,,,INTGRC          BIT     25      ;BIT SET IF INTGER ERROR
,,,ZSURP           BIT     54      ;ZERO SUPRESSION FOR HEX PRINT
,,,;
,,,;***********************************************************************
,,,;
,,,; The following equates are used internally
,,,;
,,,;***********************************************************************
,,,;
,,,FP_NUMBER_SIZE  EQU     6
,,,DIGIT           EQU     FP_NUMBER_SIZE-2
,,,R0B0            EQU     0
,,,R1B0            EQU     1
,,,UNDERFLOW       EQU     0
,,,OVERFLOW        EQU     1
,,,ZERO            EQU     2
,,,ZERO_DIVIDE     EQU     3
,,,;
,,,;***********************************************************************
,,,$EJECT
,,,        ;**************************************************************
,,,        ;
,,,        ; The following internal locations are used by the math pack
,,,        ; ordering is important and the FP_DIGITS must be bit
,,,        ; addressable
,,,        ;
,,,        ;***************************************************************
,,,        ;
,,,FP_STATUS       EQU     28H             ;NOT USED
,,,FP_TEMP         EQU     FP_STATUS+1     ;NOT USED
,,,FP_CARRY        EQU     FP_STATUS+2     ;USED FOR BITS
,,,ADD_IN          BIT     35              ;DCMPXZ IN BASIC BACKAGE
000B,,,XSIGN           BIT     FP_CARRY.0
000B,,,FOUND_RADIX     BIT     FP_CARRY.1
000B,,,FIRST_RADIX     BIT     FP_CARRY.2
000B,,,DONE_LOAD       BIT     FP_CARRY.3
,,,FP_DIG12        EQU     FP_CARRY+1
,,,FP_DIG34        EQU     FP_CARRY+2
,,,FP_DIG56        EQU     FP_CARRY+3
,,,FP_DIG78        EQU     FP_CARRY+4
,,,FP_SIGN         EQU     FP_CARRY+5
000B,,,MSIGN           BIT     FP_SIGN.0
,,,FP_EXP          EQU     FP_CARRY+6
,,,FP_NIB1         EQU     FP_DIG12
,,,FP_NIB2         EQU     FP_NIB1+1
,,,FP_NIB3         EQU     FP_NIB1+2
,,,FP_NIB4         EQU     FP_NIB1+3
,,,FP_NIB5         EQU     FP_NIB1+4
,,,FP_NIB6         EQU     FP_NIB1+5
,,,FP_NIB7         EQU     FP_NIB1+6
,,,FP_NIB8         EQU     FP_NIB1+7
,,,FP_ACCX         EQU     FP_NIB1+8
,,,FP_ACCC         EQU     FP_NIB1+9
,,,FP_ACC1         EQU     FP_NIB1+10
,,,FP_ACC2         EQU     FP_NIB1+11
,,,FP_ACC3         EQU     FP_NIB1+12
,,,FP_ACC4         EQU     FP_NIB1+13
,,,FP_ACC5         EQU     FP_NIB1+14
,,,FP_ACC6         EQU     FP_NIB1+15
,,,FP_ACC7         EQU     FP_NIB1+16
,,,FP_ACC8         EQU     FP_NIB1+17
,,,FP_ACCS         EQU     FP_NIB1+18
,,,        ;
,,,$EJECT
,,,        ORG     1993H
,,,        ;
,,,        ;**************************************************************
,,,        ;
,,,        ; The floating point entry points and jump table
,,,        ;
,,,        ;**************************************************************
,,,        ;
1993,21 B7,,        AJMP    FLOATING_ADD
1995,21 AD,,        AJMP    FLOATING_SUB
1997,41 6A,,        AJMP    FLOATING_COMP
1999,41 9A,,        AJMP    FLOATING_MUL
199B,41 CF,,        AJMP    FLOATING_DIV
199D,81 96,,        AJMP    HEXSCAN
199F,81 CF,,        AJMP    FLOATING_POINT_INPUT
19A1,A1 87,,        AJMP    FLOATING_POINT_OUTPUT
19A3,E1 04,,        AJMP    CONVERT_BINARY_TO_ASCII_STRING
19A5,C1 AB,,        AJMP    CONVERT_ASCII_STRING_TO_BINARY
19A7,C1 E0,,        AJMP    MULNUM10
19A9,E1 4C,,        AJMP    HEXOUT
19AB,81 C3,,        AJMP    PUSHR2R0
,,,        ;
,,,$EJECT
,,,        ;
19AD,,FLOATING_SUB,FLOATING_SUB:
,,,        ;
19AD,75 A0 01,,        MOV     P2,#ARG_STACK_PAGE
19B0,A8 09,,        MOV     R0,ARG_STACK
19B2,18,,        DEC     R0              ;POINT TO SIGN
19B3,E2,,        MOVX    A,@R0           ;READ SIGN
19B4,B2 E0,,        CPL     ACC.0
19B6,F2,,        MOVX    @R0,A
,,,        ;
,,,        ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
,,,        ;
19B7,,FLOATING_ADD,FLOATING_ADD:
,,,        ;
,,,        ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
,,,        ;
,,,        ;
19B7,91 77,,        ACALL   MDES1           ;R7=TOS EXP, R6=TOS-1 EXP, R4=TOS SIGN
,,,                                ;R3=TOS-1 SIGN, OPERATION IS R1 # R0
,,,        ;
19B9,EF,,        MOV     A,R7            ;GET TOS EXPONENT
19BA,60 0D,,        JZ      POP_AND_EXIT    ;IF TOS=0 THEN POP AND EXIT
19BC,BE 00 12,,        CJNE    R6,#0,LOAD1     ;CLEAR CARRY EXIT IF ZERO
,,,        ;
,,,        ;**************************************************************
,,,        ;
19BF,,SWAP_AND_EXIT,SWAP_AND_EXIT:  ; Swap external args and return
,,,        ;
,,,        ;**************************************************************
,,,        ;
19BF,91 6B,,        ACALL   LOAD_POINTERS
19C1,7F 06,,        MOV     R7,#FP_NUMBER_SIZE
,,,        ;
19C3,E2,SE1,SE1:    MOVX    A,@R0           ;SWAP THE ARGUMENTS
19C4,F3,,        MOVX    @R1,A
19C5,18,,        DEC     R0
19C6,19,,        DEC     R1
19C7,DF FA,,        DJNZ    R7,SE1
,,,        ;
19C9,,POP_AND_EXIT,POP_AND_EXIT:
,,,        ;
19C9,E5 09,,        MOV     A,ARG_STACK     ;POP THE STACK
19CB,24 06,,        ADD     A,#FP_NUMBER_SIZE
19CD,F5 09,,        MOV     ARG_STACK,A
19CF,E4,,        CLR     A
19D0,22,,        RET
,,,        ;
,,,        ;
19D1,9E,LOAD1,LOAD1:  SUBB    A,R6            ;A = ARG 1 EXP - ARG 2 EXP
19D2,8F 30,,        MOV     FP_EXP,R7       ;SAVE EXPONENT AND SIGN
19D4,8C 2F,,        MOV     FP_SIGN,R4
19D6,50 09,,        JNC     LOAD2           ;ARG1 EXPONENT IS LARGER OR SAME
19D8,8E 30,,        MOV     FP_EXP,R6
19DA,8B 2F,,        MOV     FP_SIGN,R3
19DC,F4,,        CPL     A
19DD,04,,        INC     A               ;COMPENSATE FOR EXP DELTA
19DE,C8,,        XCH     A,R0            ;FORCE R0 TO POINT AT THE LARGEST
19DF,C9,,        XCH     A,R1            ;EXPONENT
19E0,C8,,        XCH     A,R0
,,,        ;
19E1,FF,LOAD2,LOAD2:  MOV     R7,A            ;SAVE THE EXPONENT DELTA IN R7
19E2,C2 23,,        CLR     ADD_IN
19E4,BD 00 02,,        CJNE    R5,#0,$+5
19E7,D2 23,,        SETB    ADD_IN
,,,        ;
,,,$EJECT
,,,        ; Load the R1 mantissa
,,,        ;
19E9,91 88,,        ACALL   LOADR1_MANTISSA ;LOAD THE SMALLEST NUMBER
,,,        ;
,,,        ; Now align the number to the delta exponent
,,,        ; R4 points to the string of the last digits lost
,,,        ;
19EB,BF 0B 00,,        CJNE    R7,#DIGIT+DIGIT+3,$+3
19EE,40 02,,        JC      $+4
19F0,7F 0A,,        MOV     R7,#DIGIT+DIGIT+2
,,,        ;
19F2,75 2A 00,,        MOV     FP_CARRY,#00    ;CLEAR THE CARRY
19F5,71 C8,,        ACALL   RIGHT           ;SHIFT THE NUMBER
,,,        ;
,,,        ; Set up for addition and subtraction
,,,        ;
19F7,7F 04,,        MOV     R7,#DIGIT       ;LOOP COUNT
19F9,79 2E,,        MOV     R1,#FP_DIG78
19FB,74 9E,,        MOV     A,#9EH
19FD,C3,,        CLR     C
19FE,9C,,        SUBB    A,R4
19FF,D4,,        DA      A
1A00,CC,,        XCH     A,R4
1A01,70 01,,        JNZ     $+3
1A03,FC,,        MOV     R4,A
1A04,B4 50 00,,        CJNE    A,#50H,$+3      ;TEST FOR SUBTRACTION
1A07,30 23 18,,        JNB     ADD_IN,SUBLP    ;DO SUBTRACTION IF NO ADD_IN
1A0A,B3,,        CPL     C               ;FLIP CARRY FOR ADDITION
1A0B,51 19,,        ACALL   ADDLP           ;DO ADDITION
,,,        ;
1A0D,50 08,,        JNC     ADD_R
1A0F,05 2A,,        INC     FP_CARRY
1A11,7F 01,,        MOV     R7,#1
1A13,71 C8,,        ACALL   RIGHT
1A15,71 7F,,        ACALL   INC_FP_EXP      ;SHIFT AND BUMP EXPONENT
,,,        ;
1A17,61 70,ADD_R,ADD_R:  AJMP    STORE_ALIGN_TEST_AND_EXIT
,,,        ;
1A19,E2,ADDLP,ADDLP:  MOVX    A,@R0
1A1A,37,,        ADDC    A,@R1
1A1B,D4,,        DA      A
1A1C,F7,,        MOV     @R1,A
1A1D,18,,        DEC     R0
1A1E,19,,        DEC     R1
1A1F,DF F8,,        DJNZ    R7,ADDLP        ;LOOP UNTIL DONE
1A21,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;
1A22,E2,SUBLP,SUBLP:  MOVX    A,@R0           ;NOW DO SUBTRACTION
1A23,FE,,        MOV     R6,A
1A24,E4,,        CLR     A
1A25,34 99,,        ADDC    A,#99H
1A27,97,,        SUBB    A,@R1
1A28,2E,,        ADD     A,R6
1A29,D4,,        DA      A
1A2A,F7,,        MOV     @R1,A
1A2B,18,,        DEC     R0
1A2C,19,,        DEC     R1
1A2D,DF F3,,        DJNZ    R7,SUBLP
1A2F,40 11,,        JC      FSUB6
,,,        ;
,,,$EJECT
,,,        ;
,,,        ; Need to complement the result and sign because the floating
,,,        ; point accumulator mantissa was larger than the external
,,,        ; memory and their signs were equal.
,,,        ;
1A31,B2 78,,        CPL     FP_SIGN.0
1A33,79 2E,,        MOV     R1,#FP_DIG78
1A35,7F 04,,        MOV     R7,#DIGIT       ;LOOP COUNT
,,,        ;
1A37,74 9A,FSUB5,FSUB5:  MOV     A,#9AH
1A39,97,,        SUBB    A,@R1
1A3A,24 00,,        ADD     A,#0
1A3C,D4,,        DA      A
1A3D,F7,,        MOV     @R1,A
1A3E,19,,        DEC     R1
1A3F,B3,,        CPL     C
1A40,DF F5,,        DJNZ    R7,FSUB5        ;LOOP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -