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

📄 calc.sdi

📁 实现简单的计算器功能,方便又实用,简单易懂,仅供参考
💻 SDI
📖 第 1 页 / 共 5 页
字号:
02F3,18,,        DEC     R0
,,,        ;
02F4,08,PACK0,PACK0:  INC     R0              ;POINT AT FP_ACC1
,,,        ;
02F5,74 08,PACK1,PACK1:  MOV     A,#8            ;ADJUST NIBBLE POINTER
02F7,F9,,        MOV     R1,A
02F8,28,,        ADD     A,R0
02F9,F8,,        MOV     R0,A
02FA,B6 05 00,,        CJNE    @R0,#5,$+3      ;SEE IF ADJUSTING NEEDED
02FD,40 13,,        JC      PACK3+1
,,,        ;
02FF,D3,PACK2,PACK2:  SETB    C
0300,E4,,        CLR     A
0301,18,,        DEC     R0
0302,36,,        ADDC    A,@R0
0303,D4,,        DA      A
0304,D6,,        XCHD    A,@R0           ;SAVE THE VALUE
0305,30 E4 09,,        JNB     ACC.4,PACK3
0308,D9 F5,,        DJNZ    R1,PACK2
,,,        ;
030A,18,,        DEC     R0
030B,76 01,,        MOV     @R0,#1
030D,71 3A,,        ACALL   INC_FP_EXP
030F,80 06,,        SJMP    PACK4
,,,        ;
0311,19,PACK3,PACK3:  DEC     R1
0312,E9,,        MOV     A,R1
0313,C3,,        CLR     C
0314,C8,,        XCH     A,R0
0315,98,,        SUBB    A,R0
0316,F8,,        MOV     R0,A
,,,        ;
0317,79 2B,PACK4,PACK4:  MOV     R1,#FP_DIG12
,,,        ;
,,,        ; Now, pack
,,,        ;
0319,E6,PLOOP,PLOOP:  MOV     A,@R0
031A,C4,,        SWAP    A               ;FLIP THE DIGITS
031B,08,,        INC     R0
031C,D6,,        XCHD    A,@R0
031D,42 06,,        ORL     6,A             ;ACCUMULATE THE OR'ED DIGITS
031F,F7,,        MOV     @R1,A
0320,08,,        INC     R0
0321,09,,        INC     R1
0322,B9 2F F4,,        CJNE    R1,#FP_SIGN,PLOOP
0325,EE,,        MOV     A,R6
0326,70 03,,        JNZ     STORE_ALIGN_TEST_AND_EXIT
0328,75 30 00,,        MOV     FP_EXP,#0       ;ZERO EXPONENT
,,,        ;
,,,        ;**************************************************************
,,,        ;
032B,,STORE_ALIGN_TEST_AND_EXIT,STORE_ALIGN_TEST_AND_EXIT:      ;Save the number align carry and exit
,,,        ;
,,,        ;**************************************************************
,,,        ;
032B,91 26,,        ACALL   LOAD_POINTERS
032D,89 24,,        MOV     ARG_STACK,R1    ;SET UP THE NEW STACK
032F,78 30,,        MOV     R0,#FP_EXP
,,,        ;
,,,        ; Now load the numbers
,,,        ;
0331,E6,STORE2,STORE2: MOV     A,@R0
0332,F3,,        MOVX    @R1,A           ;SAVE THE NUMBER
0333,18,,        DEC     R0
0334,19,,        DEC     R1
0335,B8 2A F9,,        CJNE    R0,#FP_CARRY,STORE2
,,,        ;
0338,E4,,        CLR     A               ;NO ERRORS
,,,        ;
0339,22,PRET,PRET:   RET                     ;EXIT
,,,        ;
,,,$EJECT
033A,,INC_FP_EXP,INC_FP_EXP:
,,,        ;
033A,05 30,,        INC     FP_EXP
033C,E5 30,,        MOV     A,FP_EXP
033E,70 F9,,        JNZ     PRET            ;EXIT IF NOT ZERO
0340,D0 E0,,        POP     ACC             ;WASTE THE CALLING STACK
0342,D0 E0,,        POP     ACC
0344,61 5C,,        AJMP    OVERFLOW_AND_EXIT
,,,        ;
,,,;***********************************************************************
,,,;
0346,,UNPACK_R0,UNPACK_R0:      ; Unpack BCD digits and load into nibble locations
,,,;
,,,;***********************************************************************
,,,        ;
0346,C0 01,,        PUSH    R1B0
0348,79 32,,        MOV     R1,#FP_NIB8
,,,        ;
034A,E2,ULOOP,ULOOP:  MOVX    A,@R0
034B,54 0F,,        ANL     A,#0FH
034D,F7,,        MOV     @R1,A           ;SAVE THE NIBBLE
034E,E2,,        MOVX    A,@R0
034F,C4,,        SWAP    A
0350,54 0F,,        ANL     A,#0FH
0352,19,,        DEC     R1
0353,F7,,        MOV     @R1,A           ;SAVE THE NIBBLE AGAIN
0354,18,,        DEC     R0
0355,19,,        DEC     R1
0356,B9 2A F1,,        CJNE    R1,#FP_NIB1-1,ULOOP
,,,        ;
0359,D0 01,,        POP     R1B0
,,,        ;
035B,22,LOAD7,LOAD7:  RET
,,,        ;
,,,$EJECT
,,,        ;**************************************************************
,,,        ;
035C,,OVERFLOW_AND_EXIT,OVERFLOW_AND_EXIT:      ;LOAD 99999999 E+127,  SET OV BIT, AND EXIT
,,,        ;
,,,        ;**************************************************************
,,,        ;
035C,78 2E,,        MOV     R0,#FP_DIG78
035E,74 99,,        MOV     A,#99H
,,,        ;
0360,F6,OVE1,OVE1:   MOV     @R0,A
0361,18,,        DEC     R0
0362,B8 2A FB,,        CJNE    R0,#FP_CARRY,OVE1
,,,        ;
0365,75 30 FF,,        MOV     FP_EXP,#0FFH
0368,71 2B,,        ACALL   STORE_ALIGN_TEST_AND_EXIT
,,,        ;
036A,D2 E1,,        SETB    ACC.OVERFLOW
036C,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;**************************************************************
,,,        ;
036D,,UNDERFLOW_AND_EXIT,UNDERFLOW_AND_EXIT:     ;LOAD 0, SET UF BIT, AND EXIT
,,,        ;
,,,        ;**************************************************************
,,,        ;
036D,71 73,,        ACALL   ZERO_AND_EXIT
036F,E4,,        CLR     A
0370,D2 E0,,        SETB    ACC.UNDERFLOW
0372,22,,        RET
,,,        ;
,,,        ;**************************************************************
,,,        ;
0373,,ZERO_AND_EXIT,ZERO_AND_EXIT:          ;LOAD 0, SET ZERO BIT, AND EXIT
,,,        ;
,,,        ;**************************************************************
,,,        ;
0373,71 7A,,        ACALL   FP_CLEAR
0375,71 2B,,        ACALL   STORE_ALIGN_TEST_AND_EXIT
0377,D2 E2,,        SETB    ACC.ZERO
0379,22,,        RET                     ;EXIT
,,,        ;
,,,        ;**************************************************************
,,,        ;
037A,,FP_CLEAR,FP_CLEAR:
,,,        ;
,,,        ; Clear internal storage
,,,        ;
,,,        ;**************************************************************
,,,        ;
037A,E4,,        CLR     A
037B,78 3D,,        MOV     R0,#FP_ACC8+1
,,,        ;
037D,F6,FPC1,FPC1:   MOV     @R0,A
037E,18,,        DEC     R0
037F,B8 29 FB,,        CJNE    R0,#FP_TEMP,FPC1
0382,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;**************************************************************
,,,        ;
0383,,RIGHT,RIGHT:  ; Shift ACCUMULATOR RIGHT the number of nibbles in R7
,,,        ; Save the shifted values in R4 if SAVE_ROUND is set
,,,        ;
,,,        ;**************************************************************
,,,        ;
0383,7C 00,,        MOV     R4,#0           ;IN CASE OF NO SHIFT
,,,        ;
0385,C3,RIGHT1,RIGHT1: CLR     C
0386,EF,,        MOV     A,R7            ;GET THE DIGITS TO SHIFT
0387,60 22,,        JZ      RIGHT5-1        ;EXIT IF ZERO
0389,94 02,,        SUBB    A,#2            ;TWO TO DO?
038B,50 1F,,        JNC     RIGHT5          ;SHIFT TWO NIBBLES
,,,        ;
,,,        ; Swap one nibble then exit
,,,        ;
038D,C0 00,RIGHT3,RIGHT3: PUSH    R0B0            ;SAVE POINTER REGISTER
038F,C0 01,,        PUSH    R1B0
,,,        ;
0391,79 2E,,        MOV     R1,#FP_DIG78    ;LOAD THE POINTERS
0393,78 2D,,        MOV     R0,#FP_DIG56
0395,EC,,        MOV     A,R4            ;GET THE OVERFLOW REGISTER
0396,D7,,        XCHD    A,@R1           ;GET DIGIT 8
0397,C4,,        SWAP    A               ;FLIP FOR LOAD
0398,FC,,        MOV     R4,A
,,,        ;
0399,E7,RIGHTL,RIGHTL: MOV     A,@R1           ;GET THE LOW ORDER BYTE
039A,D6,,        XCHD    A,@R0           ;SWAP NIBBLES
039B,C4,,        SWAP    A               ;FLIP FOR STORE
039C,F7,,        MOV     @R1,A           ;SAVE THE DIGITS
039D,18,,        DEC     R0              ;BUMP THE POINTERS
039E,19,,        DEC     R1
039F,B9 2A F7,,        CJNE    R1,#FP_DIG12-1,RIGHTL   ;LOOP
,,,        ;
03A2,E7,,        MOV     A,@R1           ;ACC = CH8
03A3,C4,,        SWAP    A               ;ACC = 8CH
03A4,54 0F,,        ANL     A,#0FH          ;ACC = 0CH
03A6,F7,,        MOV     @R1,A           ;CARRY DONE
03A7,D0 01,,        POP     R1B0            ;EXIT
03A9,D0 00,,        POP     R0B0            ;RESTORE REGISTER
03AB,22,,        RET
,,,        ;
03AC,FF,RIGHT5,RIGHT5: MOV     R7,A            ;SAVE THE NEW SHIFT NUMBER
03AD,E4,,        CLR     A
03AE,C5 2A,,        XCH     A,FP_CARRY      ;SWAP THE NIBBLES
03B0,C5 2B,,        XCH     A,FP_DIG12
03B2,C5 2C,,        XCH     A,FP_DIG34
03B4,C5 2D,,        XCH     A,FP_DIG56
03B6,C5 2E,,        XCH     A,FP_DIG78
03B8,FC,,        MOV     R4,A            ;SAVE THE LAST DIGIT SHIFTED
03B9,80 CB,,        SJMP    RIGHT1+1
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
03BB,,LEFT,LEFT:   ; Shift ACCUMULATOR LEFT the number of nibbles in R7
,,,        ;
,,,        ;***************************************************************
,,,        ;
03BB,7C 00,,        MOV     R4,#00H         ;CLEAR FOR SOME ENTRYS
,,,        ;
03BD,C3,LEFT1,LEFT1:  CLR     C
03BE,EF,,        MOV     A,R7            ;GET SHIFT VALUE
03BF,60 22,,        JZ      LEFT5-1         ;EXIT IF ZERO
03C1,94 02,,        SUBB    A,#2            ;SEE HOW MANY BYTES TO SHIFT
03C3,50 1F,,        JNC     LEFT5
,,,        ;
03C5,C0 00,LEFT3,LEFT3:  PUSH    R0B0            ;SAVE POINTER
03C7,C0 01,,        PUSH    R1B0
03C9,78 2A,,        MOV     R0,#FP_CARRY
03CB,79 2B,,        MOV     R1,#FP_DIG12
,,,        ;
03CD,E6,,        MOV     A,@R0           ;ACC=CHCL
03CE,C4,,        SWAP    A               ;ACC = CLCH
03CF,F6,,        MOV     @R0,A           ;ACC = CLCH, @R0 = CLCH
,,,        ;
03D0,E7,LEFTL,LEFTL:  MOV     A,@R1           ;DIG 12
03D1,C4,,        SWAP    A               ;DIG 21
03D2,D6,,        XCHD    A,@R0
03D3,F7,,        MOV     @R1,A           ;SAVE IT
03D4,08,,        INC     R0              ;BUMP POINTERS
03D5,09,,        INC     R1
03D6,B8 2E F7,,        CJNE    R0,#FP_DIG78,LEFTL
,,,        ;
03D9,EC,,        MOV     A,R4
03DA,C4,,        SWAP    A
03DB,D6,,        XCHD    A,@R0
03DC,54 F0,,        ANL     A,#0F0H
03DE,FC,,        MOV     R4,A
,,,        ;
03DF,D0 01,,        POP     R1B0
03E1,D0 00,,        POP     R0B0            ;RESTORE
03E3,22,,        RET                     ;DONE
,,,        ;
03E4,FF,LEFT5,LEFT5:  MOV     R7,A            ;RESTORE COUNT
03E5,E4,,        CLR     A
03E6,CC,,        XCH     A,R4            ;GET THE RESTORATION BYTE
03E7,C5 2E,,        XCH     A,FP_DIG78      ;DO THE SWAP
03E9,C5 2D,,        XCH     A,FP_DIG56
03EB,C5 2C,,        XCH     A,FP_DIG34
03ED,C5 2B,,        XCH     A,FP_DIG12
03EF,C5 2A,,        XCH     A,FP_CARRY
03F1,80 CB,,        SJMP    LEFT1+1
,,,        ;
,,,$EJECT
03F3,,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
,,,        ;
03F3,54 0F,,        ANL     A,#0FH          ;STRIP OFF MS NIBBLE
03F5,FF,,        MOV     R7,A
03F6,78 3C,,        MOV     R0,#FP_ACC8
03F8,79 32,,        MOV     R1,#FP_NIB8
03FA,E4,,        CLR     A
03FB,F5 33,,        MOV     FP_ACCX,A
,,,        ;
03FD,18,MNLOOP,MNLOOP: DEC     R0              ;BUMP POINTER TO PROPAGATE CARRY
03FE,26,,        ADD     A,@R0           ;ATTEMPT TO FORCE CARRY
03FF,D4,,        DA      A               ;BCD ADJUST
0400,30 E4 03,,        JNB     ACC.4,MNL0      ;DON'T ADJUST IF NO NEED
0403,18,,        DEC     R0              ;PROPAGATE CARRY TO THE NEXT DIGIT
0404,06,,        INC     @R0             ;DO THE ADJUSTING
0405,08,,        INC     R0              ;RESTORE R0
,,,        ;
0406,D6,MNL0,MNL0:   XCHD    A,@R0           ;RESTORE INITIAL NUMBER
0407,8F F0,,        MOV     B,R7            ;GET THE NUBBLE TO MULTIPLY
0409,E7,,        MOV     A,@R1           ;GET THE OTHER NIBBLE
040A,A4,,        MUL     AB              ;DO THE MULTIPLY
040B,75 F0 0A,,        MOV     B,#10           ;NOW BCD ADJUST
040E,84,,        DIV     AB
040F,C5 F0,,        XCH     A,B             ;GET THE REMAINDER
0411,26,,        ADD     A,@R0           ;PROPAGATE THE PARTIAL PRODUCTS
0412,D4,,        DA      A               ;BCD ADJUST
0413,30 E4 02,,        JNB     ACC.4,MNL1      ;PROPAGATE PARTIAL PRODUCT CARRY
0416,05 F0,,        INC     B
,,,        ;
0418,08,MNL1,MNL1:   INC     R0
0419,D6,,        XCHD    A,@R0           ;SAVE THE NEW PRODUCT
041A,18,,        DEC     R0
041B,E5 F0,,        MOV     A,B             ;GET BACK THE QUOTIENT
041D,19,,        DEC     R1
041E,B9 2A DC,,        CJNE    R1,#FP_NIB1-1,MNLOOP
,,,        ;
0421,25 33,,        ADD     A,FP_ACCX       ;GET THE OVERFLOW
0423,D4,,        DA      A               ;ADJUST
0424,F6,,        MOV     @R0,A           ;SAVE IT
0425,22,,        RET                     ;EXIT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************

⌨️ 快捷键说明

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