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

📄 fp52.sdi

📁 proteus6.9 sp4 上
💻 SDI
📖 第 1 页 / 共 5 页
字号:
01E7,75 30 00,,        MOV     FP_EXP,#0       ;ZERO EXPONENT
,,,        ;
,,,        ;**************************************************************
,,,        ;
01EA,,STORE_ALIGN_TEST_AND_EXIT,STORE_ALIGN_TEST_AND_EXIT:      ;Save the number align carry and exit
,,,        ;
,,,        ;**************************************************************
,,,        ;
01EA,51 E5,,        ACALL   LOAD_POINTERS
01EC,89 24,,        MOV     ARG_STACK,R1    ;SET UP THE NEW STACK
01EE,78 30,,        MOV     R0,#FP_EXP
,,,        ;
,,,        ; Now load the numbers
,,,        ;
01F0,E6,STORE2,STORE2: MOV     A,@R0
01F1,F3,,        MOVX    @R1,A           ;SAVE THE NUMBER
01F2,18,,        DEC     R0
01F3,19,,        DEC     R1
01F4,B8 2A F9,,        CJNE    R0,#FP_CARRY,STORE2
,,,        ;
01F7,E4,,        CLR     A               ;NO ERRORS
,,,        ;
01F8,22,PRET,PRET:   RET                     ;EXIT
,,,        ;
,,,$EJECT
01F9,,INC_FP_EXP,INC_FP_EXP:
,,,        ;
01F9,05 30,,        INC     FP_EXP
01FB,E5 30,,        MOV     A,FP_EXP
01FD,70 F9,,        JNZ     PRET            ;EXIT IF NOT ZERO
01FF,D0 E0,,        POP     ACC             ;WASTE THE CALLING STACK
0201,D0 E0,,        POP     ACC
0203,41 1B,,        AJMP    OVERFLOW_AND_EXIT
,,,        ;
,,,;***********************************************************************
,,,;
0205,,UNPACK_R0,UNPACK_R0:      ; Unpack BCD digits and load into nibble locations
,,,;
,,,;***********************************************************************
,,,        ;
0205,C0 01,,        PUSH    R1B0
0207,79 32,,        MOV     R1,#FP_NIB8
,,,        ;
0209,E2,ULOOP,ULOOP:  MOVX    A,@R0
020A,54 0F,,        ANL     A,#0FH
020C,F7,,        MOV     @R1,A           ;SAVE THE NIBBLE
020D,E2,,        MOVX    A,@R0
020E,C4,,        SWAP    A
020F,54 0F,,        ANL     A,#0FH
0211,19,,        DEC     R1
0212,F7,,        MOV     @R1,A           ;SAVE THE NIBBLE AGAIN
0213,18,,        DEC     R0
0214,19,,        DEC     R1
0215,B9 2A F1,,        CJNE    R1,#FP_NIB1-1,ULOOP
,,,        ;
0218,D0 01,,        POP     R1B0
,,,        ;
021A,22,LOAD7,LOAD7:  RET
,,,        ;
,,,$EJECT
,,,        ;**************************************************************
,,,        ;
021B,,OVERFLOW_AND_EXIT,OVERFLOW_AND_EXIT:      ;LOAD 99999999 E+127,  SET OV BIT, AND EXIT
,,,        ;
,,,        ;**************************************************************
,,,        ;
021B,78 2E,,        MOV     R0,#FP_DIG78
021D,74 99,,        MOV     A,#99H
,,,        ;
021F,F6,OVE1,OVE1:   MOV     @R0,A
0220,18,,        DEC     R0
0221,B8 2A FB,,        CJNE    R0,#FP_CARRY,OVE1
,,,        ;
0224,75 30 FF,,        MOV     FP_EXP,#0FFH
0227,31 EA,,        ACALL   STORE_ALIGN_TEST_AND_EXIT
,,,        ;
0229,D2 E1,,        SETB    ACC.OVERFLOW
022B,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;**************************************************************
,,,        ;
022C,,UNDERFLOW_AND_EXIT,UNDERFLOW_AND_EXIT:     ;LOAD 0, SET UF BIT, AND EXIT
,,,        ;
,,,        ;**************************************************************
,,,        ;
022C,51 32,,        ACALL   ZERO_AND_EXIT
022E,E4,,        CLR     A
022F,D2 E0,,        SETB    ACC.UNDERFLOW
0231,22,,        RET
,,,        ;
,,,        ;**************************************************************
,,,        ;
0232,,ZERO_AND_EXIT,ZERO_AND_EXIT:          ;LOAD 0, SET ZERO BIT, AND EXIT
,,,        ;
,,,        ;**************************************************************
,,,        ;
0232,51 39,,        ACALL   FP_CLEAR
0234,31 EA,,        ACALL   STORE_ALIGN_TEST_AND_EXIT
0236,D2 E2,,        SETB    ACC.ZERO
0238,22,,        RET                     ;EXIT
,,,        ;
,,,        ;**************************************************************
,,,        ;
0239,,FP_CLEAR,FP_CLEAR:
,,,        ;
,,,        ; Clear internal storage
,,,        ;
,,,        ;**************************************************************
,,,        ;
0239,E4,,        CLR     A
023A,78 3D,,        MOV     R0,#FP_ACC8+1
,,,        ;
023C,F6,FPC1,FPC1:   MOV     @R0,A
023D,18,,        DEC     R0
023E,B8 29 FB,,        CJNE    R0,#FP_TEMP,FPC1
0241,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;**************************************************************
,,,        ;
0242,,RIGHT,RIGHT:  ; Shift ACCUMULATOR RIGHT the number of nibbles in R7
,,,        ; Save the shifted values in R4 if SAVE_ROUND is set
,,,        ;
,,,        ;**************************************************************
,,,        ;
0242,7C 00,,        MOV     R4,#0           ;IN CASE OF NO SHIFT
,,,        ;
0244,C3,RIGHT1,RIGHT1: CLR     C
0245,EF,,        MOV     A,R7            ;GET THE DIGITS TO SHIFT
0246,60 22,,        JZ      RIGHT5-1        ;EXIT IF ZERO
0248,94 02,,        SUBB    A,#2            ;TWO TO DO?
024A,50 1F,,        JNC     RIGHT5          ;SHIFT TWO NIBBLES
,,,        ;
,,,        ; Swap one nibble then exit
,,,        ;
024C,C0 00,RIGHT3,RIGHT3: PUSH    R0B0            ;SAVE POINTER REGISTER
024E,C0 01,,        PUSH    R1B0
,,,        ;
0250,79 2E,,        MOV     R1,#FP_DIG78    ;LOAD THE POINTERS
0252,78 2D,,        MOV     R0,#FP_DIG56
0254,EC,,        MOV     A,R4            ;GET THE OVERFLOW REGISTER
0255,D7,,        XCHD    A,@R1           ;GET DIGIT 8
0256,C4,,        SWAP    A               ;FLIP FOR LOAD
0257,FC,,        MOV     R4,A
,,,        ;
0258,E7,RIGHTL,RIGHTL: MOV     A,@R1           ;GET THE LOW ORDER BYTE
0259,D6,,        XCHD    A,@R0           ;SWAP NIBBLES
025A,C4,,        SWAP    A               ;FLIP FOR STORE
025B,F7,,        MOV     @R1,A           ;SAVE THE DIGITS
025C,18,,        DEC     R0              ;BUMP THE POINTERS
025D,19,,        DEC     R1
025E,B9 2A F7,,        CJNE    R1,#FP_DIG12-1,RIGHTL   ;LOOP
,,,        ;
0261,E7,,        MOV     A,@R1           ;ACC = CH8
0262,C4,,        SWAP    A               ;ACC = 8CH
0263,54 0F,,        ANL     A,#0FH          ;ACC = 0CH
0265,F7,,        MOV     @R1,A           ;CARRY DONE
0266,D0 01,,        POP     R1B0            ;EXIT
0268,D0 00,,        POP     R0B0            ;RESTORE REGISTER
026A,22,,        RET
,,,        ;
026B,FF,RIGHT5,RIGHT5: MOV     R7,A            ;SAVE THE NEW SHIFT NUMBER
026C,E4,,        CLR     A
026D,C5 2A,,        XCH     A,FP_CARRY      ;SWAP THE NIBBLES
026F,C5 2B,,        XCH     A,FP_DIG12
0271,C5 2C,,        XCH     A,FP_DIG34
0273,C5 2D,,        XCH     A,FP_DIG56
0275,C5 2E,,        XCH     A,FP_DIG78
0277,FC,,        MOV     R4,A            ;SAVE THE LAST DIGIT SHIFTED
0278,80 CB,,        SJMP    RIGHT1+1
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
027A,,LEFT,LEFT:   ; Shift ACCUMULATOR LEFT the number of nibbles in R7
,,,        ;
,,,        ;***************************************************************
,,,        ;
027A,7C 00,,        MOV     R4,#00H         ;CLEAR FOR SOME ENTRYS
,,,        ;
027C,C3,LEFT1,LEFT1:  CLR     C
027D,EF,,        MOV     A,R7            ;GET SHIFT VALUE
027E,60 22,,        JZ      LEFT5-1         ;EXIT IF ZERO
0280,94 02,,        SUBB    A,#2            ;SEE HOW MANY BYTES TO SHIFT
0282,50 1F,,        JNC     LEFT5
,,,        ;
0284,C0 00,LEFT3,LEFT3:  PUSH    R0B0            ;SAVE POINTER
0286,C0 01,,        PUSH    R1B0
0288,78 2A,,        MOV     R0,#FP_CARRY
028A,79 2B,,        MOV     R1,#FP_DIG12
,,,        ;
028C,E6,,        MOV     A,@R0           ;ACC=CHCL
028D,C4,,        SWAP    A               ;ACC = CLCH
028E,F6,,        MOV     @R0,A           ;ACC = CLCH, @R0 = CLCH
,,,        ;
028F,E7,LEFTL,LEFTL:  MOV     A,@R1           ;DIG 12
0290,C4,,        SWAP    A               ;DIG 21
0291,D6,,        XCHD    A,@R0
0292,F7,,        MOV     @R1,A           ;SAVE IT
0293,08,,        INC     R0              ;BUMP POINTERS
0294,09,,        INC     R1
0295,B8 2E F7,,        CJNE    R0,#FP_DIG78,LEFTL
,,,        ;
0298,EC,,        MOV     A,R4
0299,C4,,        SWAP    A
029A,D6,,        XCHD    A,@R0
029B,54 F0,,        ANL     A,#0F0H
029D,FC,,        MOV     R4,A
,,,        ;
029E,D0 01,,        POP     R1B0
02A0,D0 00,,        POP     R0B0            ;RESTORE
02A2,22,,        RET                     ;DONE
,,,        ;
02A3,FF,LEFT5,LEFT5:  MOV     R7,A            ;RESTORE COUNT
02A4,E4,,        CLR     A
02A5,CC,,        XCH     A,R4            ;GET THE RESTORATION BYTE
02A6,C5 2E,,        XCH     A,FP_DIG78      ;DO THE SWAP
02A8,C5 2D,,        XCH     A,FP_DIG56
02AA,C5 2C,,        XCH     A,FP_DIG34
02AC,C5 2B,,        XCH     A,FP_DIG12
02AE,C5 2A,,        XCH     A,FP_CARRY
02B0,80 CB,,        SJMP    LEFT1+1
,,,        ;
,,,$EJECT
02B2,,MUL_NIBBLE,MUL_NIBBLE:
,,,        ;
,,,        ; Multiply the nibble in R7 by the FP_NIB locations
,,,        ; accumulate the product in FP_ACC
,,,        ;
,,,        ; Set up the pointers for multiplication
,,,        ;
02B2,54 0F,,        ANL     A,#0FH          ;STRIP OFF MS NIBBLE
02B4,FF,,        MOV     R7,A
02B5,78 3C,,        MOV     R0,#FP_ACC8
02B7,79 32,,        MOV     R1,#FP_NIB8
02B9,E4,,        CLR     A
02BA,F5 33,,        MOV     FP_ACCX,A
,,,        ;
02BC,18,MNLOOP,MNLOOP: DEC     R0              ;BUMP POINTER TO PROPAGATE CARRY
02BD,26,,        ADD     A,@R0           ;ATTEMPT TO FORCE CARRY
02BE,D4,,        DA      A               ;BCD ADJUST
02BF,30 E4 03,,        JNB     ACC.4,MNL0      ;DON'T ADJUST IF NO NEED
02C2,18,,        DEC     R0              ;PROPAGATE CARRY TO THE NEXT DIGIT
02C3,06,,        INC     @R0             ;DO THE ADJUSTING
02C4,08,,        INC     R0              ;RESTORE R0
,,,        ;
02C5,D6,MNL0,MNL0:   XCHD    A,@R0           ;RESTORE INITIAL NUMBER
02C6,8F F0,,        MOV     B,R7            ;GET THE NUBBLE TO MULTIPLY
02C8,E7,,        MOV     A,@R1           ;GET THE OTHER NIBBLE
02C9,A4,,        MUL     AB              ;DO THE MULTIPLY
02CA,75 F0 0A,,        MOV     B,#10           ;NOW BCD ADJUST
02CD,84,,        DIV     AB
02CE,C5 F0,,        XCH     A,B             ;GET THE REMAINDER
02D0,26,,        ADD     A,@R0           ;PROPAGATE THE PARTIAL PRODUCTS
02D1,D4,,        DA      A               ;BCD ADJUST
02D2,30 E4 02,,        JNB     ACC.4,MNL1      ;PROPAGATE PARTIAL PRODUCT CARRY
02D5,05 F0,,        INC     B
,,,        ;
02D7,08,MNL1,MNL1:   INC     R0
02D8,D6,,        XCHD    A,@R0           ;SAVE THE NEW PRODUCT
02D9,18,,        DEC     R0
02DA,E5 F0,,        MOV     A,B             ;GET BACK THE QUOTIENT
02DC,19,,        DEC     R1
02DD,B9 2A DC,,        CJNE    R1,#FP_NIB1-1,MNLOOP
,,,        ;
02E0,25 33,,        ADD     A,FP_ACCX       ;GET THE OVERFLOW
02E2,D4,,        DA      A               ;ADJUST
02E3,F6,,        MOV     @R0,A           ;SAVE IT
02E4,22,,        RET                     ;EXIT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
02E5,,LOAD_POINTERS,LOAD_POINTERS:  ; Load the ARG_STACK into R0 and bump R1
,,,        ;
,,,        ;***************************************************************
,,,        ;
02E5,75 A0 01,,        MOV     P2,#ARG_STACK_PAGE
02E8,A8 24,,        MOV     R0,ARG_STACK
02EA,74 06,,        MOV     A,#FP_NUMBER_SIZE
02EC,28,,        ADD     A,R0
02ED,F9,,        MOV     R1,A
02EE,22,,        RET
,,,        ;
,,,        ;***************************************************************
,,,        ;
02EF,,MUL_DIV_EXP_AND_SIGN,MUL_DIV_EXP_AND_SIGN:
,,,        ;
,,,        ; Load the sign into R7, R6. R5 gets the sign for
,,,        ; multiply and divide.
,,,        ;
,,,        ;***************************************************************
,,,        ;
02EF,51 39,,        ACALL   FP_CLEAR        ;CLEAR INTERNAL MEMORY
,,,        ;
02F1,51 E5,MDES1,MDES1:  ACALL   LOAD_POINTERS   ;LOAD REGISTERS
02F3,E2,,        MOVX    A,@R0           ;ARG 1 EXP
02F4,FF,,        MOV     R7,A            ;SAVED IN R7
02F5,E3,,        MOVX    A,@R1           ;ARG 2 EXP
02F6,FE,,        MOV     R6,A            ;SAVED IN R6
02F7,18,,        DEC     R0              ;BUMP POINTERS TO SIGN
02F8,19,,        DEC     R1
02F9,E2,,        MOVX    A,@R0           ;GET THE SIGN
02FA,FC,,        MOV     R4,A            ;SIGN OF ARG1
02FB,E3,,        MOVX    A,@R1           ;GET SIGN OF NEXT ARG
02FC,FB,,        MOV     R3,A            ;SIGN OF ARG2
02FD,6C,,        XRL     A,R4            ;ACC GETS THE NEW SIGN
02FE,FD,,        MOV     R5,A            ;R5 GETS THE NEW SIGN
,,,        ;
,,,        ; Bump the pointers to point at the LS digit
,,,        ;
02FF,18,,        DEC     R0
0300,19,,        DEC     R1
,,,        ;
0301,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;***************************************************************

⌨️ 快捷键说明

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