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

📄 fp-52.sdi

📁 proteus 仿真实例, 使用了proteus大部分元件
💻 SDI
📖 第 1 页 / 共 5 页
字号:
,,,        ;
,,,        ; Now see how many zeros their are
,,,        ;
1A42,78 2B,FSUB6,FSUB6:  MOV     R0,#FP_DIG12
1A44,7F 00,,        MOV     R7,#0
,,,        ;
1A46,E6,FSUB7,FSUB7:  MOV     A,@R0
1A47,70 08,,        JNZ     FSUB8
1A49,0F,,        INC     R7
1A4A,0F,,        INC     R7
1A4B,08,,        INC     R0
1A4C,B8 2F F7,,        CJNE    R0,#FP_SIGN,FSUB7
1A4F,61 B8,,        AJMP    ZERO_AND_EXIT
,,,        ;
1A51,B4 10 00,FSUB8,FSUB8:  CJNE    A,#10H,$+3
1A54,50 01,,        JNC     FSUB9
1A56,0F,,        INC     R7
,,,        ;
,,,        ; Now R7 has the number of leading zeros in the FP ACC
,,,        ;
1A57,E5 30,FSUB9,FSUB9:  MOV     A,FP_EXP        ;GET THE OLD EXPONENT
1A59,C3,,        CLR     C
1A5A,9F,,        SUBB    A,R7            ;SUBTRACT FROM THE NUMBER OF ZEROS
1A5B,60 0B,,        JZ      FSUB10
1A5D,40 09,,        JC      FSUB10
,,,        ;
1A5F,F5 30,,        MOV     FP_EXP,A        ;SAVE THE NEW EXPONENT
,,,        ;
1A61,91 02,,        ACALL   LEFT1           ;SHIFT THE FP ACC
1A63,75 2A 00,,        MOV     FP_CARRY,#0
1A66,61 70,,        AJMP    STORE_ALIGN_TEST_AND_EXIT
,,,        ;
1A68,61 B2,FSUB10,FSUB10: AJMP    UNDERFLOW_AND_EXIT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
1A6A,,FLOATING_COMP,FLOATING_COMP:  ; Compare two floating point numbers
,,,                ; used for relational operations and is faster
,,,                ; than subtraction. ON RETURN, The carry is set
,,,                ; if ARG1 is > ARG2, else carry is not set
,,,                ; if ARG1 = ARG2, F0 gets set
,,,        ;
,,,        ;***************************************************************
,,,        ;
1A6A,91 77,,        ACALL   MDES1           ;SET UP THE REGISTERS
1A6C,E5 09,,        MOV     A,ARG_STACK
1A6E,24 0C,,        ADD     A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
1A70,F5 09,,        MOV     ARG_STACK,A     ;POP THE STACK TWICE, CLEAR THE CARRY
1A72,EE,,        MOV     A,R6            ;CHECK OUT EXPONENTS
1A73,C2 D5,,        CLR     F0
1A75,9F,,        SUBB    A,R7
1A76,60 0A,,        JZ      EXPONENTS_EQUAL
1A78,40 03,,        JC      ARG1_EXP_IS_LARGER
,,,        ;
,,,        ; Now the ARG2 EXPONENT is > ARG1 EXPONENT
,,,        ;
1A7A,,SIGNS_DIFFERENT,SIGNS_DIFFERENT:
,,,        ;
1A7A,EB,,        MOV     A,R3            ;SEE IF SIGN OF ARG2 IS POSITIVE
1A7B,80 01,,        SJMP    $+3
,,,        ;
1A7D,,ARG1_EXP_IS_LARGER,ARG1_EXP_IS_LARGER:
,,,        ;
1A7D,EC,,        MOV     A,R4            ;GET THE SIGN OF ARG1 EXPONENT
1A7E,60 01,,        JZ      $+3
1A80,B3,,        CPL     C
1A81,22,,        RET
,,,        ;
1A82,,EXPONENTS_EQUAL,EXPONENTS_EQUAL:
,,,        ;
,,,        ; First, test the sign, then the mantissa
,,,        ;
1A82,BD 00 F5,,        CJNE    R5,#0,SIGNS_DIFFERENT
,,,        ;
1A85,,BOTH_PLUS,BOTH_PLUS:
,,,        ;
1A85,7F 04,,        MOV     R7,#DIGIT       ;POINT AT MS DIGIT
1A87,18,,        DEC     R0
1A88,18,,        DEC     R0
1A89,18,,        DEC     R0
1A8A,19,,        DEC     R1
1A8B,19,,        DEC     R1
1A8C,19,,        DEC     R1
,,,        ;
,,,        ; Now do the compare
,,,        ;
1A8D,E2,CLOOP,CLOOP:  MOVX    A,@R0
1A8E,FE,,        MOV     R6,A
1A8F,E3,,        MOVX    A,@R1
1A90,9E,,        SUBB    A,R6
1A91,70 EA,,        JNZ     ARG1_EXP_IS_LARGER
1A93,08,,        INC     R0
1A94,09,,        INC     R1
1A95,DF F6,,        DJNZ    R7,CLOOP
,,,        ;
,,,        ; If here, the numbers are the same, the carry is cleared
,,,        ;
1A97,D2 D5,,        SETB    F0
1A99,22,,        RET                     ;EXIT WITH EQUAL
,,,        ;
,,,$EJECT
,,,;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
,,,;
1A9A,,FLOATING_MUL,FLOATING_MUL:   ; Floating point multiply
,,,;
,,,;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
,,,;
1A9A,91 75,,        ACALL   MUL_DIV_EXP_AND_SIGN
,,,        ;
,,,        ; check for zero exponents
,,,        ;
1A9C,BE 00 02,,        CJNE    R6,#00,$+5      ;ARG 2 EXP ZERO?
1A9F,61 B8,,        AJMP    ZERO_AND_EXIT
,,,        ;
,,,        ; calculate the exponent
,,,        ;
1AA1,8D 2F,FMUL1,FMUL1:  MOV     FP_SIGN,R5      ;SAVE THE SIGN, IN CASE OF FAILURE
,,,        ;
1AA3,EF,,        MOV     A,R7
1AA4,60 F9,,        JZ      FMUL1-2
1AA6,2E,,        ADD     A,R6            ;ADD THE EXPONENTS
1AA7,20 E7 05,,        JB      ACC.7,FMUL_OVER
1AAA,10 D7 06,,        JBC     CY,FMUL2        ;SEE IF CARRY IS SET
,,,        ;
1AAD,61 B2,,        AJMP    UNDERFLOW_AND_EXIT
,,,        ;
1AAF,,FMUL_OVER,FMUL_OVER:
,,,        ;
1AAF,50 02,,        JNC     FMUL2           ;OK IF SET
,,,        ;
1AB1,61 A1,FOV,FOV:    AJMP    OVERFLOW_AND_EXIT
,,,        ;
1AB3,94 81,FMUL2,FMUL2:  SUBB    A,#129          ;SUBTRACT THE EXPONENT BIAS
1AB5,FE,,        MOV     R6,A            ;SAVE IT FOR LATER
,,,        ;
,,,        ; Unpack and load R0
,,,        ;
1AB6,71 8B,,        ACALL   UNPACK_R0
,,,        ;
,,,        ; Now set up for loop multiply
,,,        ;
1AB8,7B 04,,        MOV     R3,#DIGIT
1ABA,AC 01,,        MOV     R4,R1B0
,,,        ;
,,,$EJECT
,,,        ;
,,,        ; Now, do the multiply and accumulate the product
,,,        ;
1ABC,8C 01,FMUL3,FMUL3:  MOV     R1B0,R4
1ABE,E3,,        MOVX    A,@R1
1ABF,FA,,        MOV     R2,A
1AC0,91 38,,        ACALL   MUL_NIBBLE
,,,        ;
1AC2,EA,,        MOV     A,R2
1AC3,C4,,        SWAP    A
1AC4,91 38,,        ACALL   MUL_NIBBLE
1AC6,1C,,        DEC     R4
1AC7,DB F3,,        DJNZ    R3,FMUL3
,,,        ;
,,,        ; Now, pack and restore the sign
,,,        ;
1AC9,8E 30,,        MOV     FP_EXP,R6
1ACB,8D 2F,,        MOV     FP_SIGN,R5
1ACD,61 30,,        AJMP    PACK            ;FINISH IT OFF
,,,        ;
,,,$EJECT
,,,        ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
,,,        ;
1ACF,,FLOATING_DIV,FLOATING_DIV:
,,,        ;
,,,        ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
,,,        ;
1ACF,91 77,,        ACALL   MDES1
,,,        ;
,,,        ; Check the exponents
,,,        ;
1AD1,8D 2F,,        MOV     FP_SIGN,R5      ;SAVE THE SIGN
1AD3,BF 00 06,,        CJNE    R7,#0,DIV0      ;CLEARS THE CARRY
1AD6,71 A1,,        ACALL   OVERFLOW_AND_EXIT
1AD8,E4,,        CLR     A
1AD9,D2 E3,,        SETB    ACC.ZERO_DIVIDE
1ADB,22,,        RET
,,,        ;
1ADC,EE,DIV0,DIV0:   MOV     A,R6            ;GET EXPONENT
1ADD,60 C0,,        JZ      FMUL1-2         ;EXIT IF ZERO
1ADF,9F,,        SUBB    A,R7            ;DELTA EXPONENT
1AE0,20 E7 04,,        JB      ACC.7,D_UNDER
1AE3,50 04,,        JNC     DIV3
1AE5,61 B2,,        AJMP    UNDERFLOW_AND_EXIT
,,,        ;
1AE7,50 C8,D_UNDER,D_UNDER:JNC     FOV
,,,        ;
1AE9,24 81,DIV3,DIV3:   ADD     A,#129          ;CORRECTLY BIAS THE EXPONENT
1AEB,F5 30,,        MOV     FP_EXP,A        ;SAVE THE EXPONENT
1AED,91 88,,        ACALL   LOADR1_MANTISSA ;LOAD THE DIVIDED
,,,        ;
1AEF,7A 34,,        MOV     R2,#FP_ACCC     ;SAVE LOCATION
1AF1,AB 00,,        MOV     R3,R0B0         ;SAVE POINTER IN R3
1AF3,75 2A 00,,        MOV     FP_CARRY,#0     ;ZERO CARRY BYTE
,,,        ;
1AF6,7D FF,DIV4,DIV4:   MOV     R5,#0FFH        ;LOOP COUNT
1AF8,D3,,        SETB    C
,,,        ;
1AF9,8B 00,DIV5,DIV5:   MOV     R0B0,R3         ;RESTORE THE EXTERNAL POINTER
1AFB,79 2E,,        MOV     R1,#FP_DIG78    ;SET UP INTERNAL POINTER
1AFD,7F 04,,        MOV     R7,#DIGIT       ;LOOP COUNT
1AFF,50 17,,        JNC     DIV7            ;EXIT IF NO CARRY
,,,        ;
1B01,E2,DIV6,DIV6:   MOVX    A,@R0           ;DO ACCUMLATION
1B02,FE,,        MOV     R6,A
1B03,E4,,        CLR     A
1B04,34 99,,        ADDC    A,#99H
1B06,9E,,        SUBB    A,R6
1B07,27,,        ADD     A,@R1
1B08,D4,,        DA      A
1B09,F7,,        MOV     @R1,A
1B0A,18,,        DEC     R0
1B0B,19,,        DEC     R1
1B0C,DF F3,,        DJNZ    R7,DIV6         ;LOOP
,,,        ;
1B0E,0D,,        INC     R5              ;SUBTRACT COUNTER
1B0F,40 E8,,        JC      DIV5            ;KEEP LOOPING IF CARRY
1B11,E7,,        MOV     A,@R1           ;GET CARRY
1B12,94 01,,        SUBB    A,#1            ;CARRY IS CLEARED
1B14,F7,,        MOV     @R1,A           ;SAVE CARRY DIGIT
1B15,B3,,        CPL     C
1B16,80 E1,,        SJMP    DIV5            ;LOOP
,,,        ;
,,,        ; Restore the result if carry was found
,,,        ;
1B18,51 19,DIV7,DIV7:   ACALL   ADDLP           ;ADD NUMBER BACK
1B1A,77 00,,        MOV     @R1,#0          ;CLEAR CARRY
1B1C,8A 00,,        MOV     R0B0,R2         ;GET SAVE COUNTER
1B1E,A6 05,,        MOV     @R0,5           ;SAVE COUNT BYTE
,,,        ;
1B20,0A,,        INC     R2              ;ADJUST SAVE COUNTER
1B21,7F 01,,        MOV     R7,#1           ;BUMP DIVIDEND
1B23,91 00,,        ACALL   LEFT
1B25,BA 3E CE,,        CJNE    R2,#FP_ACC8+2,DIV4
,,,        ;
1B28,D5 30 02,,        DJNZ    FP_EXP,DIV8
1B2B,61 B2,,        AJMP    UNDERFLOW_AND_EXIT
,,,        ;
1B2D,75 2A 00,DIV8,DIV8:   MOV     FP_CARRY,#0
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
1B30,,PACK,PACK:   ; Pack the mantissa
,,,        ;
,,,        ;***************************************************************
,,,        ;
,,,        ; First, set up the pointers
,,,        ;
1B30,78 34,,        MOV     R0,#FP_ACCC
1B32,E6,,        MOV     A,@R0           ;GET FP_ACCC
1B33,FE,,        MOV     R6,A            ;SAVE FOR ZERO COUNT
1B34,60 03,,        JZ      PACK0           ;JUMP OVER IF ZERO
1B36,71 7F,,        ACALL   INC_FP_EXP      ;BUMP THE EXPONENT
1B38,18,,        DEC     R0
,,,        ;
1B39,08,PACK0,PACK0:  INC     R0              ;POINT AT FP_ACC1
,,,        ;
1B3A,74 08,PACK1,PACK1:  MOV     A,#8            ;ADJUST NIBBLE POINTER
1B3C,F9,,        MOV     R1,A
1B3D,28,,        ADD     A,R0
1B3E,F8,,        MOV     R0,A
1B3F,B6 05 00,,        CJNE    @R0,#5,$+3      ;SEE IF ADJUSTING NEEDED
1B42,40 13,,        JC      PACK3+1
,,,        ;
1B44,D3,PACK2,PACK2:  SETB    C
1B45,E4,,        CLR     A
1B46,18,,        DEC     R0
1B47,36,,        ADDC    A,@R0
1B48,D4,,        DA      A
1B49,D6,,        XCHD    A,@R0           ;SAVE THE VALUE
1B4A,30 E4 09,,        JNB     ACC.4,PACK3
1B4D,D9 F5,,        DJNZ    R1,PACK2
,,,        ;
1B4F,18,,        DEC     R0
1B50,76 01,,        MOV     @R0,#1
1B52,71 7F,,        ACALL   INC_FP_EXP
1B54,80 06,,        SJMP    PACK4
,,,        ;
1B56,19,PACK3,PACK3:  DEC     R1
1B57,E9,,        MOV     A,R1
1B58,C3,,        CLR     C
1B59,C8,,        XCH     A,R0
1B5A,98,,        SUBB    A,R0
1B5B,F8,,        MOV     R0,A
,,,        ;
1B5C,79 2B,PACK4,PACK4:  MOV     R1,#FP_DIG12
,,,        ;
,,,        ; Now, pack
,,,        ;
1B5E,E6,PLOOP,PLOOP:  MOV     A,@R0
1B5F,C4,,        SWAP    A               ;FLIP THE DIGITS
1B60,08,,        INC     R0
1B61,D6,,        XCHD    A,@R0
1B62,42 06,,        ORL     6,A             ;ACCUMULATE THE OR'ED DIGITS
1B64,F7,,        MOV     @R1,A
1B65,08,,        INC     R0
1B66,09,,        INC     R1
1B67,B9 2F F4,,        CJNE    R1,#FP_SIGN,PLOOP
1B6A,EE,,        MOV     A,R6
1B6B,70 03,,        JNZ     STORE_ALIGN_TEST_AND_EXIT
1B6D,75 30 00,,        MOV     FP_EXP,#0       ;ZERO EXPONENT
,,,        ;
,,,        ;**************************************************************
,,,        ;
1B70,,STORE_ALIGN_TEST_AND_EXIT,STORE_ALIGN_TEST_AND_EXIT:      ;Save the number align carry and exit
,,,        ;
,,,        ;**************************************************************
,,,        ;
1B70,91 6B,,        ACALL   LOAD_POINTERS
1B72,89 09,,        MOV     ARG_STACK,R1    ;SET UP THE NEW STACK
1B74,78 30,,        MOV     R0,#FP_EXP
,,,        ;
,,,        ; Now load the numbers
,,,        ;

⌨️ 快捷键说明

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