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

📄 fp52.sdi

📁 proteus6.9 sp4 上
💻 SDI
📖 第 1 页 / 共 5 页
字号:
00AC,79 2E,,        MOV     R1,#FP_DIG78
00AE,7F 04,,        MOV     R7,#DIGIT       ;LOOP COUNT
,,,        ;
00B0,74 9A,FSUB5,FSUB5:  MOV     A,#9AH
00B2,97,,        SUBB    A,@R1
00B3,24 00,,        ADD     A,#0
00B5,D4,,        DA      A
00B6,F7,,        MOV     @R1,A
00B7,19,,        DEC     R1
00B8,B3,,        CPL     C
00B9,DF F5,,        DJNZ    R7,FSUB5        ;LOOP
,,,        ;
,,,        ; Now see how many zeros their are
,,,        ;
00BB,78 2B,FSUB6,FSUB6:  MOV     R0,#FP_DIG12
00BD,7F 00,,        MOV     R7,#0
,,,        ;
00BF,E6,FSUB7,FSUB7:  MOV     A,@R0
00C0,70 08,,        JNZ     FSUB8
00C2,0F,,        INC     R7
00C3,0F,,        INC     R7
00C4,08,,        INC     R0
00C5,B8 2F F7,,        CJNE    R0,#FP_SIGN,FSUB7
00C8,41 32,,        AJMP    ZERO_AND_EXIT
,,,        ;
00CA,B4 10 00,FSUB8,FSUB8:  CJNE    A,#10H,$+3
00CD,50 01,,        JNC     FSUB9
00CF,0F,,        INC     R7
,,,        ;
,,,        ; Now R7 has the number of leading zeros in the FP ACC
,,,        ;
00D0,E5 30,FSUB9,FSUB9:  MOV     A,FP_EXP        ;GET THE OLD EXPONENT
00D2,C3,,        CLR     C
00D3,9F,,        SUBB    A,R7            ;SUBTRACT FROM THE NUMBER OF ZEROS
00D4,60 0B,,        JZ      FSUB10
00D6,40 09,,        JC      FSUB10
,,,        ;
00D8,F5 30,,        MOV     FP_EXP,A        ;SAVE THE NEW EXPONENT
,,,        ;
00DA,51 7C,,        ACALL   LEFT1           ;SHIFT THE FP ACC
00DC,75 2A 00,,        MOV     FP_CARRY,#0
00DF,21 EA,,        AJMP    STORE_ALIGN_TEST_AND_EXIT
,,,        ;
00E1,41 2C,FSUB10,FSUB10: AJMP    UNDERFLOW_AND_EXIT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
00E3,,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
,,,        ;
,,,        ;***************************************************************
,,,        ;
00E3,51 F1,,        ACALL   MDES1           ;SET UP THE REGISTERS
00E5,E5 24,,        MOV     A,ARG_STACK
00E7,24 0C,,        ADD     A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
00E9,F5 24,,        MOV     ARG_STACK,A     ;POP THE STACK TWICE, CLEAR THE CARRY
00EB,EE,,        MOV     A,R6            ;CHECK OUT EXPONENTS
00EC,C2 D5,,        CLR     F0
00EE,C3,,        CLR     C
00EF,9F,,        SUBB    A,R7
00F0,60 0A,,        JZ      EXPONENTS_EQUAL
00F2,40 03,,        JC      ARG1_EXP_IS_LARGER
,,,        ;
,,,        ; Now the ARG2 EXPONENT is > ARG1 EXPONENT
,,,        ;
00F4,,SIGNS_DIFFERENT,SIGNS_DIFFERENT:
,,,        ;
00F4,EB,,        MOV     A,R3            ;SEE IF SIGN OF ARG2 IS POSITIVE
00F5,80 01,,        SJMP    $+3
,,,        ;
00F7,,ARG1_EXP_IS_LARGER,ARG1_EXP_IS_LARGER:
,,,        ;
00F7,EC,,        MOV     A,R4            ;GET THE SIGN OF ARG1 EXPONENT
00F8,60 01,,        JZ      $+3
00FA,B3,,        CPL     C
00FB,22,,        RET
,,,        ;
00FC,,EXPONENTS_EQUAL,EXPONENTS_EQUAL:
,,,        ;
,,,        ; First, test the sign, then the mantissa
,,,        ;
00FC,BD 00 F5,,        CJNE    R5,#0,SIGNS_DIFFERENT
,,,        ;
00FF,,BOTH_PLUS,BOTH_PLUS:
,,,        ;
00FF,7F 04,,        MOV     R7,#DIGIT       ;POINT AT MS DIGIT
0101,18,,        DEC     R0
0102,18,,        DEC     R0
0103,18,,        DEC     R0
0104,19,,        DEC     R1
0105,19,,        DEC     R1
0106,19,,        DEC     R1
,,,        ;
,,,        ; Now do the compare
,,,        ;
0107,E2,CLOOP,CLOOP:  MOVX    A,@R0
0108,FE,,        MOV     R6,A
0109,E3,,        MOVX    A,@R1
010A,9E,,        SUBB    A,R6
010B,70 EA,,        JNZ     ARG1_EXP_IS_LARGER
010D,08,,        INC     R0
010E,09,,        INC     R1
010F,DF F6,,        DJNZ    R7,CLOOP
,,,        ;
,,,        ; If here, the numbers are the same, the carry is cleared
,,,        ;
0111,D2 D5,,        SETB    F0
0113,22,,        RET                     ;EXIT WITH EQUAL
,,,        ;
,,,$EJECT
,,,;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
,,,;
0114,,FLOATING_MUL,FLOATING_MUL:   ; Floating point multiply
,,,;
,,,;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
,,,;
0114,51 EF,,        ACALL   MUL_DIV_EXP_AND_SIGN
,,,        ;
,,,        ; check for zero exponents
,,,        ;
0116,BE 00 02,,        CJNE    R6,#00,$+5      ;ARG 2 EXP ZERO?
0119,41 32,,        AJMP    ZERO_AND_EXIT
,,,        ;
,,,        ; calculate the exponent
,,,        ;
011B,8D 2F,FMUL1,FMUL1:  MOV     FP_SIGN,R5      ;SAVE THE SIGN, IN CASE OF FAILURE
,,,        ;
011D,EF,,        MOV     A,R7
011E,60 F9,,        JZ      FMUL1-2
0120,2E,,        ADD     A,R6            ;ADD THE EXPONENTS
0121,20 E7 05,,        JB      ACC.7,FMUL_OVER
0124,10 D7 06,,        JBC     CY,FMUL2        ;SEE IF CARRY IS SET
,,,        ;
0127,41 2C,,        AJMP    UNDERFLOW_AND_EXIT
,,,        ;
0129,,FMUL_OVER,FMUL_OVER:
,,,        ;
0129,50 02,,        JNC     FMUL2           ;OK IF SET
,,,        ;
012B,41 1B,FOV,FOV:    AJMP    OVERFLOW_AND_EXIT
,,,        ;
012D,94 81,FMUL2,FMUL2:  SUBB    A,#129          ;SUBTRACT THE EXPONENT BIAS
012F,FE,,        MOV     R6,A            ;SAVE IT FOR LATER
,,,        ;
,,,        ; Unpack and load R0
,,,        ;
0130,51 05,,        ACALL   UNPACK_R0
,,,        ;
,,,        ; Now set up for loop multiply
,,,        ;
0132,7B 04,,        MOV     R3,#DIGIT
0134,AC 01,,        MOV     R4,R1B0
,,,        ;
,,,$EJECT
,,,        ;
,,,        ; Now, do the multiply and accumulate the product
,,,        ;
0136,8C 01,FMUL3,FMUL3:  MOV     R1B0,R4
0138,E3,,        MOVX    A,@R1
0139,FA,,        MOV     R2,A
013A,51 B2,,        ACALL   MUL_NIBBLE
,,,        ;
013C,EA,,        MOV     A,R2
013D,C4,,        SWAP    A
013E,51 B2,,        ACALL   MUL_NIBBLE
0140,1C,,        DEC     R4
0141,DB F3,,        DJNZ    R3,FMUL3
,,,        ;
,,,        ; Now, pack and restore the sign
,,,        ;
0143,8E 30,,        MOV     FP_EXP,R6
0145,8D 2F,,        MOV     FP_SIGN,R5
0147,21 AA,,        AJMP    PACK            ;FINISH IT OFF
,,,        ;
,,,$EJECT
,,,        ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
,,,        ;
0149,,FLOATING_DIV,FLOATING_DIV:
,,,        ;
,,,        ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
,,,        ;
0149,51 F1,,        ACALL   MDES1
,,,        ;
,,,        ; Check the exponents
,,,        ;
014B,8D 2F,,        MOV     FP_SIGN,R5      ;SAVE THE SIGN
014D,BF 00 06,,        CJNE    R7,#0,DIV0      ;CLEARS THE CARRY
0150,51 1B,,        ACALL   OVERFLOW_AND_EXIT
0152,E4,,        CLR     A
0153,D2 E3,,        SETB    ACC.ZERO_DIVIDE
0155,22,,        RET
,,,        ;
0156,EE,DIV0,DIV0:   MOV     A,R6            ;GET EXPONENT
0157,60 C0,,        JZ      FMUL1-2         ;EXIT IF ZERO
0159,9F,,        SUBB    A,R7            ;DELTA EXPONENT
015A,20 E7 04,,        JB      ACC.7,D_UNDER
015D,50 04,,        JNC     DIV3
015F,41 2C,,        AJMP    UNDERFLOW_AND_EXIT
,,,        ;
0161,50 C8,D_UNDER,D_UNDER:JNC     FOV
,,,        ;
0163,24 81,DIV3,DIV3:   ADD     A,#129          ;CORRECTLY BIAS THE EXPONENT
0165,F5 30,,        MOV     FP_EXP,A        ;SAVE THE EXPONENT
0167,71 02,,        ACALL   LOADR1_MANTISSA ;LOAD THE DIVIDED
,,,        ;
0169,7A 34,,        MOV     R2,#FP_ACCC     ;SAVE LOCATION
016B,AB 00,,        MOV     R3,R0B0         ;SAVE POINTER IN R3
016D,75 2A 00,,        MOV     FP_CARRY,#0     ;ZERO CARRY BYTE
,,,        ;
0170,7D FF,DIV4,DIV4:   MOV     R5,#0FFH        ;LOOP COUNT
0172,D3,,        SETB    C
,,,        ;
0173,8B 00,DIV5,DIV5:   MOV     R0B0,R3         ;RESTORE THE EXTERNAL POINTER
0175,79 2E,,        MOV     R1,#FP_DIG78    ;SET UP INTERNAL POINTER
0177,7F 04,,        MOV     R7,#DIGIT       ;LOOP COUNT
0179,50 17,,        JNC     DIV7            ;EXIT IF NO CARRY
,,,        ;
017B,E2,DIV6,DIV6:   MOVX    A,@R0           ;DO ACCUMLATION
017C,FE,,        MOV     R6,A
017D,E4,,        CLR     A
017E,34 99,,        ADDC    A,#99H
0180,9E,,        SUBB    A,R6
0181,27,,        ADD     A,@R1
0182,D4,,        DA      A
0183,F7,,        MOV     @R1,A
0184,18,,        DEC     R0
0185,19,,        DEC     R1
0186,DF F3,,        DJNZ    R7,DIV6         ;LOOP
,,,        ;
0188,0D,,        INC     R5              ;SUBTRACT COUNTER
0189,40 E8,,        JC      DIV5            ;KEEP LOOPING IF CARRY
018B,E7,,        MOV     A,@R1           ;GET CARRY
018C,94 01,,        SUBB    A,#1            ;CARRY IS CLEARED
018E,F7,,        MOV     @R1,A           ;SAVE CARRY DIGIT
018F,B3,,        CPL     C
0190,80 E1,,        SJMP    DIV5            ;LOOP
,,,        ;
,,,        ; Restore the result if carry was found
,,,        ;
0192,11 92,DIV7,DIV7:   ACALL   ADDLP           ;ADD NUMBER BACK
0194,77 00,,        MOV     @R1,#0          ;CLEAR CARRY
0196,8A 00,,        MOV     R0B0,R2         ;GET SAVE COUNTER
0198,A6 05,,        MOV     @R0,5           ;SAVE COUNT BYTE
,,,        ;
019A,0A,,        INC     R2              ;ADJUST SAVE COUNTER
019B,7F 01,,        MOV     R7,#1           ;BUMP DIVIDEND
019D,51 7A,,        ACALL   LEFT
019F,BA 3E CE,,        CJNE    R2,#FP_ACC8+2,DIV4
,,,        ;
01A2,D5 30 02,,        DJNZ    FP_EXP,DIV8
01A5,41 2C,,        AJMP    UNDERFLOW_AND_EXIT
,,,        ;
01A7,75 2A 00,DIV8,DIV8:   MOV     FP_CARRY,#0
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
01AA,,PACK,PACK:   ; Pack the mantissa
,,,        ;
,,,        ;***************************************************************
,,,        ;
,,,        ; First, set up the pointers
,,,        ;
01AA,78 34,,        MOV     R0,#FP_ACCC
01AC,E6,,        MOV     A,@R0           ;GET FP_ACCC
01AD,FE,,        MOV     R6,A            ;SAVE FOR ZERO COUNT
01AE,60 03,,        JZ      PACK0           ;JUMP OVER IF ZERO
01B0,31 F9,,        ACALL   INC_FP_EXP      ;BUMP THE EXPONENT
01B2,18,,        DEC     R0
,,,        ;
01B3,08,PACK0,PACK0:  INC     R0              ;POINT AT FP_ACC1
,,,        ;
01B4,74 08,PACK1,PACK1:  MOV     A,#8            ;ADJUST NIBBLE POINTER
01B6,F9,,        MOV     R1,A
01B7,28,,        ADD     A,R0
01B8,F8,,        MOV     R0,A
01B9,B6 05 00,,        CJNE    @R0,#5,$+3      ;SEE IF ADJUSTING NEEDED
01BC,40 13,,        JC      PACK3+1
,,,        ;
01BE,D3,PACK2,PACK2:  SETB    C
01BF,E4,,        CLR     A
01C0,18,,        DEC     R0
01C1,36,,        ADDC    A,@R0
01C2,D4,,        DA      A
01C3,D6,,        XCHD    A,@R0           ;SAVE THE VALUE
01C4,30 E4 09,,        JNB     ACC.4,PACK3
01C7,D9 F5,,        DJNZ    R1,PACK2
,,,        ;
01C9,18,,        DEC     R0
01CA,76 01,,        MOV     @R0,#1
01CC,31 F9,,        ACALL   INC_FP_EXP
01CE,80 06,,        SJMP    PACK4
,,,        ;
01D0,19,PACK3,PACK3:  DEC     R1
01D1,E9,,        MOV     A,R1
01D2,C3,,        CLR     C
01D3,C8,,        XCH     A,R0
01D4,98,,        SUBB    A,R0
01D5,F8,,        MOV     R0,A
,,,        ;
01D6,79 2B,PACK4,PACK4:  MOV     R1,#FP_DIG12
,,,        ;
,,,        ; Now, pack
,,,        ;
01D8,E6,PLOOP,PLOOP:  MOV     A,@R0
01D9,C4,,        SWAP    A               ;FLIP THE DIGITS
01DA,08,,        INC     R0
01DB,D6,,        XCHD    A,@R0
01DC,42 06,,        ORL     6,A             ;ACCUMULATE THE OR'ED DIGITS
01DE,F7,,        MOV     @R1,A
01DF,08,,        INC     R0
01E0,09,,        INC     R1
01E1,B9 2F F4,,        CJNE    R1,#FP_SIGN,PLOOP
01E4,EE,,        MOV     A,R6
01E5,70 03,,        JNZ     STORE_ALIGN_TEST_AND_EXIT

⌨️ 快捷键说明

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