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

📄 fp-52.sdi

📁 proteus 仿真实例, 使用了proteus大部分元件
💻 SDI
📖 第 1 页 / 共 5 页
字号:
1B76,E6,STORE2,STORE2: MOV     A,@R0
1B77,F3,,        MOVX    @R1,A           ;SAVE THE NUMBER
1B78,18,,        DEC     R0
1B79,19,,        DEC     R1
1B7A,B8 2A F9,,        CJNE    R0,#FP_CARRY,STORE2
,,,        ;
1B7D,E4,,        CLR     A               ;NO ERRORS
,,,        ;
1B7E,22,PRET,PRET:   RET                     ;EXIT
,,,        ;
,,,$EJECT
1B7F,,INC_FP_EXP,INC_FP_EXP:
,,,        ;
1B7F,05 30,,        INC     FP_EXP
1B81,E5 30,,        MOV     A,FP_EXP
1B83,70 F9,,        JNZ     PRET            ;EXIT IF NOT ZERO
1B85,D0 E0,,        POP     ACC             ;WASTE THE CALLING STACK
1B87,D0 E0,,        POP     ACC
1B89,61 A1,,        AJMP    OVERFLOW_AND_EXIT
,,,        ;
,,,;***********************************************************************
,,,;
1B8B,,UNPACK_R0,UNPACK_R0:      ; Unpack BCD digits and load into nibble locations
,,,;
,,,;***********************************************************************
,,,        ;
1B8B,C0 01,,        PUSH    R1B0
1B8D,79 32,,        MOV     R1,#FP_NIB8
,,,        ;
1B8F,E2,ULOOP,ULOOP:  MOVX    A,@R0
1B90,54 0F,,        ANL     A,#0FH
1B92,F7,,        MOV     @R1,A           ;SAVE THE NIBBLE
1B93,E2,,        MOVX    A,@R0
1B94,C4,,        SWAP    A
1B95,54 0F,,        ANL     A,#0FH
1B97,19,,        DEC     R1
1B98,F7,,        MOV     @R1,A           ;SAVE THE NIBBLE AGAIN
1B99,18,,        DEC     R0
1B9A,19,,        DEC     R1
1B9B,B9 2A F1,,        CJNE    R1,#FP_NIB1-1,ULOOP
,,,        ;
1B9E,D0 01,,        POP     R1B0
,,,        ;
1BA0,22,LOAD7,LOAD7:  RET
,,,        ;
,,,$EJECT
,,,        ;**************************************************************
,,,        ;
1BA1,,OVERFLOW_AND_EXIT,OVERFLOW_AND_EXIT:      ;LOAD 99999999 E+127,  SET OV BIT, AND EXIT
,,,        ;
,,,        ;**************************************************************
,,,        ;
1BA1,78 2E,,        MOV     R0,#FP_DIG78
1BA3,74 99,,        MOV     A,#99H
,,,        ;
1BA5,F6,OVE1,OVE1:   MOV     @R0,A
1BA6,18,,        DEC     R0
1BA7,B8 2A FB,,        CJNE    R0,#FP_CARRY,OVE1
,,,        ;
1BAA,75 30 FF,,        MOV     FP_EXP,#0FFH
1BAD,71 70,,        ACALL   STORE_ALIGN_TEST_AND_EXIT
,,,        ;
1BAF,D2 E1,,        SETB    ACC.OVERFLOW
1BB1,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;**************************************************************
,,,        ;
1BB2,,UNDERFLOW_AND_EXIT,UNDERFLOW_AND_EXIT:     ;LOAD 0, SET UF BIT, AND EXIT
,,,        ;
,,,        ;**************************************************************
,,,        ;
1BB2,71 B8,,        ACALL   ZERO_AND_EXIT
1BB4,E4,,        CLR     A
1BB5,D2 E0,,        SETB    ACC.UNDERFLOW
1BB7,22,,        RET
,,,        ;
,,,        ;**************************************************************
,,,        ;
1BB8,,ZERO_AND_EXIT,ZERO_AND_EXIT:          ;LOAD 0, SET ZERO BIT, AND EXIT
,,,        ;
,,,        ;**************************************************************
,,,        ;
1BB8,71 BF,,        ACALL   FP_CLEAR
1BBA,71 70,,        ACALL   STORE_ALIGN_TEST_AND_EXIT
1BBC,D2 E2,,        SETB    ACC.ZERO
1BBE,22,,        RET                     ;EXIT
,,,        ;
,,,        ;**************************************************************
,,,        ;
1BBF,,FP_CLEAR,FP_CLEAR:
,,,        ;
,,,        ; Clear internal storage
,,,        ;
,,,        ;**************************************************************
,,,        ;
1BBF,E4,,        CLR     A
1BC0,78 3D,,        MOV     R0,#FP_ACC8+1
,,,        ;
1BC2,F6,FPC1,FPC1:   MOV     @R0,A
1BC3,18,,        DEC     R0
1BC4,B8 29 FB,,        CJNE    R0,#FP_TEMP,FPC1
1BC7,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;**************************************************************
,,,        ;
1BC8,,RIGHT,RIGHT:  ; Shift ACCUMULATOR RIGHT the number of nibbles in R7
,,,        ; Save the shifted values in R4 if SAVE_ROUND is set
,,,        ;
,,,        ;**************************************************************
,,,        ;
1BC8,7C 00,,        MOV     R4,#0           ;IN CASE OF NO SHIFT
,,,        ;
1BCA,C3,RIGHT1,RIGHT1: CLR     C
1BCB,EF,,        MOV     A,R7            ;GET THE DIGITS TO SHIFT
1BCC,60 22,,        JZ      RIGHT5-1        ;EXIT IF ZERO
1BCE,94 02,,        SUBB    A,#2            ;TWO TO DO?
1BD0,50 1F,,        JNC     RIGHT5          ;SHIFT TWO NIBBLES
,,,        ;
,,,        ; Swap one nibble then exit
,,,        ;
1BD2,C0 00,RIGHT3,RIGHT3: PUSH    R0B0            ;SAVE POINTER REGISTER
1BD4,C0 01,,        PUSH    R1B0
,,,        ;
1BD6,79 2E,,        MOV     R1,#FP_DIG78    ;LOAD THE POINTERS
1BD8,78 2D,,        MOV     R0,#FP_DIG56
1BDA,EC,,        MOV     A,R4            ;GET THE OVERFLOW REGISTER
1BDB,D7,,        XCHD    A,@R1           ;GET DIGIT 8
1BDC,C4,,        SWAP    A               ;FLIP FOR LOAD
1BDD,FC,,        MOV     R4,A
,,,        ;
1BDE,E7,RIGHTL,RIGHTL: MOV     A,@R1           ;GET THE LOW ORDER BYTE
1BDF,D6,,        XCHD    A,@R0           ;SWAP NIBBLES
1BE0,C4,,        SWAP    A               ;FLIP FOR STORE
1BE1,F7,,        MOV     @R1,A           ;SAVE THE DIGITS
1BE2,18,,        DEC     R0              ;BUMP THE POINTERS
1BE3,19,,        DEC     R1
1BE4,B9 2A F7,,        CJNE    R1,#FP_DIG12-1,RIGHTL   ;LOOP
,,,        ;
1BE7,E7,,        MOV     A,@R1           ;ACC = CH8
1BE8,C4,,        SWAP    A               ;ACC = 8CH
1BE9,54 0F,,        ANL     A,#0FH          ;ACC = 0CH
1BEB,F7,,        MOV     @R1,A           ;CARRY DONE
1BEC,D0 01,,        POP     R1B0            ;EXIT
1BEE,D0 00,,        POP     R0B0            ;RESTORE REGISTER
1BF0,22,,        RET
,,,        ;
1BF1,FF,RIGHT5,RIGHT5: MOV     R7,A            ;SAVE THE NEW SHIFT NUMBER
1BF2,E4,,        CLR     A
1BF3,C5 2A,,        XCH     A,FP_CARRY      ;SWAP THE NIBBLES
1BF5,C5 2B,,        XCH     A,FP_DIG12
1BF7,C5 2C,,        XCH     A,FP_DIG34
1BF9,C5 2D,,        XCH     A,FP_DIG56
1BFB,C5 2E,,        XCH     A,FP_DIG78
1BFD,FC,,        MOV     R4,A            ;SAVE THE LAST DIGIT SHIFTED
1BFE,80 CB,,        SJMP    RIGHT1+1
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
1C00,,LEFT,LEFT:   ; Shift ACCUMULATOR LEFT the number of nibbles in R7
,,,        ;
,,,        ;***************************************************************
,,,        ;
1C00,7C 00,,        MOV     R4,#00H         ;CLEAR FOR SOME ENTRYS
,,,        ;
1C02,C3,LEFT1,LEFT1:  CLR     C
1C03,EF,,        MOV     A,R7            ;GET SHIFT VALUE
1C04,60 22,,        JZ      LEFT5-1         ;EXIT IF ZERO
1C06,94 02,,        SUBB    A,#2            ;SEE HOW MANY BYTES TO SHIFT
1C08,50 1F,,        JNC     LEFT5
,,,        ;
1C0A,C0 00,LEFT3,LEFT3:  PUSH    R0B0            ;SAVE POINTER
1C0C,C0 01,,        PUSH    R1B0
1C0E,78 2A,,        MOV     R0,#FP_CARRY
1C10,79 2B,,        MOV     R1,#FP_DIG12
,,,        ;
1C12,E6,,        MOV     A,@R0           ;ACC=CHCL
1C13,C4,,        SWAP    A               ;ACC = CLCH
1C14,F6,,        MOV     @R0,A           ;ACC = CLCH, @R0 = CLCH
,,,        ;
1C15,E7,LEFTL,LEFTL:  MOV     A,@R1           ;DIG 12
1C16,C4,,        SWAP    A               ;DIG 21
1C17,D6,,        XCHD    A,@R0
1C18,F7,,        MOV     @R1,A           ;SAVE IT
1C19,08,,        INC     R0              ;BUMP POINTERS
1C1A,09,,        INC     R1
1C1B,B8 2E F7,,        CJNE    R0,#FP_DIG78,LEFTL
,,,        ;
1C1E,EC,,        MOV     A,R4
1C1F,C4,,        SWAP    A
1C20,D6,,        XCHD    A,@R0
1C21,54 F0,,        ANL     A,#0F0H
1C23,FC,,        MOV     R4,A
,,,        ;
1C24,D0 01,,        POP     R1B0
1C26,D0 00,,        POP     R0B0            ;RESTORE
1C28,22,,        RET                     ;DONE
,,,        ;
1C29,FF,LEFT5,LEFT5:  MOV     R7,A            ;RESTORE COUNT
1C2A,E4,,        CLR     A
1C2B,CC,,        XCH     A,R4            ;GET THE RESTORATION BYTE
1C2C,C5 2E,,        XCH     A,FP_DIG78      ;DO THE SWAP
1C2E,C5 2D,,        XCH     A,FP_DIG56
1C30,C5 2C,,        XCH     A,FP_DIG34
1C32,C5 2B,,        XCH     A,FP_DIG12
1C34,C5 2A,,        XCH     A,FP_CARRY
1C36,80 CB,,        SJMP    LEFT1+1
,,,        ;
,,,$EJECT
1C38,,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
,,,        ;
1C38,54 0F,,        ANL     A,#0FH          ;STRIP OFF MS NIBBLE
1C3A,FF,,        MOV     R7,A
1C3B,78 3C,,        MOV     R0,#FP_ACC8
1C3D,79 32,,        MOV     R1,#FP_NIB8
1C3F,E4,,        CLR     A
1C40,F5 33,,        MOV     FP_ACCX,A
,,,        ;
1C42,18,MNLOOP,MNLOOP: DEC     R0              ;BUMP POINTER TO PROPAGATE CARRY
1C43,26,,        ADD     A,@R0           ;ATTEMPT TO FORCE CARRY
1C44,D4,,        DA      A               ;BCD ADJUST
1C45,30 E4 03,,        JNB     ACC.4,MNL0      ;DON'T ADJUST IF NO NEED
1C48,18,,        DEC     R0              ;PROPAGATE CARRY TO THE NEXT DIGIT
1C49,06,,        INC     @R0             ;DO THE ADJUSTING
1C4A,08,,        INC     R0              ;RESTORE R0
,,,        ;
1C4B,D6,MNL0,MNL0:   XCHD    A,@R0           ;RESTORE INITIAL NUMBER
1C4C,8F F0,,        MOV     B,R7            ;GET THE NUBBLE TO MULTIPLY
1C4E,E7,,        MOV     A,@R1           ;GET THE OTHER NIBBLE
1C4F,A4,,        MUL     AB              ;DO THE MULTIPLY
1C50,75 F0 0A,,        MOV     B,#10           ;NOW BCD ADJUST
1C53,84,,        DIV     AB
1C54,C5 F0,,        XCH     A,B             ;GET THE REMAINDER
1C56,26,,        ADD     A,@R0           ;PROPAGATE THE PARTIAL PRODUCTS
1C57,D4,,        DA      A               ;BCD ADJUST
1C58,30 E4 02,,        JNB     ACC.4,MNL1      ;PROPAGATE PARTIAL PRODUCT CARRY
1C5B,05 F0,,        INC     B
,,,        ;
1C5D,08,MNL1,MNL1:   INC     R0
1C5E,D6,,        XCHD    A,@R0           ;SAVE THE NEW PRODUCT
1C5F,18,,        DEC     R0
1C60,E5 F0,,        MOV     A,B             ;GET BACK THE QUOTIENT
1C62,19,,        DEC     R1
1C63,B9 2A DC,,        CJNE    R1,#FP_NIB1-1,MNLOOP
,,,        ;
1C66,25 33,,        ADD     A,FP_ACCX       ;GET THE OVERFLOW
1C68,D4,,        DA      A               ;ADJUST
1C69,F6,,        MOV     @R0,A           ;SAVE IT
1C6A,22,,        RET                     ;EXIT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
1C6B,,LOAD_POINTERS,LOAD_POINTERS:  ; Load the ARG_STACK into R0 and bump R1
,,,        ;
,,,        ;***************************************************************
,,,        ;
1C6B,75 A0 01,,        MOV     P2,#ARG_STACK_PAGE
1C6E,A8 09,,        MOV     R0,ARG_STACK
1C70,74 06,,        MOV     A,#FP_NUMBER_SIZE
1C72,28,,        ADD     A,R0
1C73,F9,,        MOV     R1,A
1C74,22,,        RET
,,,        ;
,,,        ;***************************************************************
,,,        ;
1C75,,MUL_DIV_EXP_AND_SIGN,MUL_DIV_EXP_AND_SIGN:
,,,        ;
,,,        ; Load the sign into R7, R6. R5 gets the sign for
,,,        ; multiply and divide.
,,,        ;
,,,        ;***************************************************************
,,,        ;
1C75,71 BF,,        ACALL   FP_CLEAR        ;CLEAR INTERNAL MEMORY
,,,        ;
1C77,91 6B,MDES1,MDES1:  ACALL   LOAD_POINTERS   ;LOAD REGISTERS
1C79,E2,,        MOVX    A,@R0           ;ARG 1 EXP
1C7A,FF,,        MOV     R7,A            ;SAVED IN R7
1C7B,E3,,        MOVX    A,@R1           ;ARG 2 EXP
1C7C,FE,,        MOV     R6,A            ;SAVED IN R6
1C7D,18,,        DEC     R0              ;BUMP POINTERS TO SIGN
1C7E,19,,        DEC     R1
1C7F,E2,,        MOVX    A,@R0           ;GET THE SIGN
1C80,FC,,        MOV     R4,A            ;SIGN OF ARG1
1C81,E3,,        MOVX    A,@R1           ;GET SIGN OF NEXT ARG
1C82,FB,,        MOV     R3,A            ;SIGN OF ARG2
1C83,6C,,        XRL     A,R4            ;ACC GETS THE NEW SIGN
1C84,FD,,        MOV     R5,A            ;R5 GETS THE NEW SIGN
,,,        ;
,,,        ; Bump the pointers to point at the LS digit
,,,        ;
1C85,18,,        DEC     R0
1C86,19,,        DEC     R1
,,,        ;
1C87,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
1C88,,LOADR1_MANTISSA,LOADR1_MANTISSA:
,,,        ;
,,,        ; Load the mantissa of R0 into FP_Digits
,,,        ;
,,,        ;***************************************************************
,,,        ;
1C88,C0 00,,        PUSH    R0B0            ;SAVE REGISTER 1
1C8A,78 2E,,        MOV     R0,#FP_DIG78    ;SET UP THE POINTER
,,,        ;
1C8C,E3,LOADR1,LOADR1: MOVX    A,@R1
1C8D,F6,,        MOV     @R0,A
1C8E,19,,        DEC     R1
1C8F,18,,        DEC     R0
1C90,B8 2A F9,,        CJNE    R0,#FP_CARRY,LOADR1
,,,        ;

⌨️ 快捷键说明

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