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

📄 calc.sdi

📁 实现简单的计算器功能,方便又实用,简单易懂,仅供参考
💻 SDI
📖 第 1 页 / 共 5 页
字号:
01B9,D4,,        DA      A
01BA,CC,,        XCH     A,R4
01BB,70 01,,        JNZ     $+3
01BD,FC,,        MOV     R4,A
01BE,B4 50 00,,        CJNE    A,#50H,$+3      ;TEST FOR SUBTRACTION
01C1,30 33 18,,        JNB     ADD_IN,SUBLP    ;DO SUBTRACTION IF NO ADD_IN
01C4,B3,,        CPL     C               ;FLIP CARRY FOR ADDITION
01C5,31 D3,,        ACALL   ADDLP           ;DO ADDITION
,,,        ;
01C7,50 08,,        JNC     ADD_R
01C9,05 2A,,        INC     FP_CARRY
01CB,7F 01,,        MOV     R7,#1
01CD,71 83,,        ACALL   RIGHT
01CF,71 3A,,        ACALL   INC_FP_EXP      ;SHIFT AND BUMP EXPONENT
,,,        ;
01D1,61 2B,ADD_R,ADD_R:  AJMP    STORE_ALIGN_TEST_AND_EXIT
,,,        ;
01D3,E2,ADDLP,ADDLP:  MOVX    A,@R0
01D4,37,,        ADDC    A,@R1
01D5,D4,,        DA      A
01D6,F7,,        MOV     @R1,A
01D7,18,,        DEC     R0
01D8,19,,        DEC     R1
01D9,DF F8,,        DJNZ    R7,ADDLP        ;LOOP UNTIL DONE
01DB,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;
01DC,E2,SUBLP,SUBLP:  MOVX    A,@R0           ;NOW DO SUBTRACTION
01DD,FE,,        MOV     R6,A
01DE,E4,,        CLR     A
01DF,34 99,,        ADDC    A,#99H
01E1,97,,        SUBB    A,@R1
01E2,2E,,        ADD     A,R6
01E3,D4,,        DA      A
01E4,F7,,        MOV     @R1,A
01E5,18,,        DEC     R0
01E6,19,,        DEC     R1
01E7,DF F3,,        DJNZ    R7,SUBLP
01E9,40 11,,        JC      FSUB6
,,,        ;
,,,$EJECT
,,,        ;
,,,        ; Need to complement the result and sign because the floating
,,,        ; point accumulator mantissa was larger than the external
,,,        ; memory and their signs were equal.
,,,        ;
01EB,B2 78,,        CPL     FP_SIGN.0
01ED,79 2E,,        MOV     R1,#FP_DIG78
01EF,7F 04,,        MOV     R7,#DIGIT       ;LOOP COUNT
,,,        ;
01F1,74 9A,FSUB5,FSUB5:  MOV     A,#9AH
01F3,97,,        SUBB    A,@R1
01F4,24 00,,        ADD     A,#0
01F6,D4,,        DA      A
01F7,F7,,        MOV     @R1,A
01F8,19,,        DEC     R1
01F9,B3,,        CPL     C
01FA,DF F5,,        DJNZ    R7,FSUB5        ;LOOP
,,,        ;
,,,        ; Now see how many zeros their are
,,,        ;
01FC,78 2B,FSUB6,FSUB6:  MOV     R0,#FP_DIG12
01FE,7F 00,,        MOV     R7,#0
,,,        ;
0200,E6,FSUB7,FSUB7:  MOV     A,@R0
0201,70 08,,        JNZ     FSUB8
0203,0F,,        INC     R7
0204,0F,,        INC     R7
0205,08,,        INC     R0
0206,B8 2F F7,,        CJNE    R0,#FP_SIGN,FSUB7
0209,61 73,,        AJMP    ZERO_AND_EXIT
,,,        ;
020B,B4 10 00,FSUB8,FSUB8:  CJNE    A,#10H,$+3
020E,50 01,,        JNC     FSUB9
0210,0F,,        INC     R7
,,,        ;
,,,        ; Now R7 has the number of leading zeros in the FP ACC
,,,        ;
0211,E5 30,FSUB9,FSUB9:  MOV     A,FP_EXP        ;GET THE OLD EXPONENT
0213,C3,,        CLR     C
0214,9F,,        SUBB    A,R7            ;SUBTRACT FROM THE NUMBER OF ZEROS
0215,60 0B,,        JZ      FSUB10
0217,40 09,,        JC      FSUB10
,,,        ;
0219,F5 30,,        MOV     FP_EXP,A        ;SAVE THE NEW EXPONENT
,,,        ;
021B,71 BD,,        ACALL   LEFT1           ;SHIFT THE FP ACC
021D,75 2A 00,,        MOV     FP_CARRY,#0
0220,61 2B,,        AJMP    STORE_ALIGN_TEST_AND_EXIT
,,,        ;
0222,61 6D,FSUB10,FSUB10: AJMP    UNDERFLOW_AND_EXIT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
0224,,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
,,,        ;
,,,        ;***************************************************************
,,,        ;
0224,91 32,,        ACALL   MDES1           ;SET UP THE REGISTERS
0226,E5 24,,        MOV     A,ARG_STACK
0228,24 0C,,        ADD     A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
022A,F5 24,,        MOV     ARG_STACK,A     ;POP THE STACK TWICE, CLEAR THE CARRY
022C,EE,,        MOV     A,R6            ;CHECK OUT EXPONENTS
022D,C2 D5,,        CLR     F0
022F,C3,,        CLR     C
0230,9F,,        SUBB    A,R7
0231,60 0A,,        JZ      EXPONENTS_EQUAL
0233,40 03,,        JC      ARG1_EXP_IS_LARGER
,,,        ;
,,,        ; Now the ARG2 EXPONENT is > ARG1 EXPONENT
,,,        ;
0235,,SIGNS_DIFFERENT,SIGNS_DIFFERENT:
,,,        ;
0235,EB,,        MOV     A,R3            ;SEE IF SIGN OF ARG2 IS POSITIVE
0236,80 01,,        SJMP    $+3
,,,        ;
0238,,ARG1_EXP_IS_LARGER,ARG1_EXP_IS_LARGER:
,,,        ;
0238,EC,,        MOV     A,R4            ;GET THE SIGN OF ARG1 EXPONENT
0239,60 01,,        JZ      $+3
023B,B3,,        CPL     C
023C,22,,        RET
,,,        ;
023D,,EXPONENTS_EQUAL,EXPONENTS_EQUAL:
,,,        ;
,,,        ; First, test the sign, then the mantissa
,,,        ;
023D,BD 00 F5,,        CJNE    R5,#0,SIGNS_DIFFERENT
,,,        ;
0240,,BOTH_PLUS,BOTH_PLUS:
,,,        ;
0240,7F 04,,        MOV     R7,#DIGIT       ;POINT AT MS DIGIT
0242,18,,        DEC     R0
0243,18,,        DEC     R0
0244,18,,        DEC     R0
0245,19,,        DEC     R1
0246,19,,        DEC     R1
0247,19,,        DEC     R1
,,,        ;
,,,        ; Now do the compare
,,,        ;
0248,E2,CLOOP,CLOOP:  MOVX    A,@R0
0249,FE,,        MOV     R6,A
024A,E3,,        MOVX    A,@R1
024B,9E,,        SUBB    A,R6
024C,70 EA,,        JNZ     ARG1_EXP_IS_LARGER
024E,08,,        INC     R0
024F,09,,        INC     R1
0250,DF F6,,        DJNZ    R7,CLOOP
,,,        ;
,,,        ; If here, the numbers are the same, the carry is cleared
,,,        ;
0252,D2 D5,,        SETB    F0
0254,22,,        RET                     ;EXIT WITH EQUAL
,,,        ;
,,,$EJECT
,,,;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
,,,;
0255,,FLOATING_MUL,FLOATING_MUL:   ; Floating point multiply
,,,;
,,,;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
,,,;
0255,91 30,,        ACALL   MUL_DIV_EXP_AND_SIGN
,,,        ;
,,,        ; check for zero exponents
,,,        ;
0257,BE 00 02,,        CJNE    R6,#00,$+5      ;ARG 2 EXP ZERO?
025A,61 73,,        AJMP    ZERO_AND_EXIT
,,,        ;
,,,        ; calculate the exponent
,,,        ;
025C,8D 2F,FMUL1,FMUL1:  MOV     FP_SIGN,R5      ;SAVE THE SIGN, IN CASE OF FAILURE
,,,        ;
025E,EF,,        MOV     A,R7
025F,60 F9,,        JZ      FMUL1-2
0261,2E,,        ADD     A,R6            ;ADD THE EXPONENTS
0262,20 E7 05,,        JB      ACC.7,FMUL_OVER
0265,10 D7 06,,        JBC     CY,FMUL2        ;SEE IF CARRY IS SET
,,,        ;
0268,61 6D,,        AJMP    UNDERFLOW_AND_EXIT
,,,        ;
026A,,FMUL_OVER,FMUL_OVER:
,,,        ;
026A,50 02,,        JNC     FMUL2           ;OK IF SET
,,,        ;
026C,61 5C,FOV,FOV:    AJMP    OVERFLOW_AND_EXIT
,,,        ;
026E,94 81,FMUL2,FMUL2:  SUBB    A,#129          ;SUBTRACT THE EXPONENT BIAS
0270,FE,,        MOV     R6,A            ;SAVE IT FOR LATER
,,,        ;
,,,        ; Unpack and load R0
,,,        ;
0271,71 46,,        ACALL   UNPACK_R0
,,,        ;
,,,        ; Now set up for loop multiply
,,,        ;
0273,7B 04,,        MOV     R3,#DIGIT
0275,AC 01,,        MOV     R4,R1B0
,,,        ;
,,,$EJECT
,,,        ;
,,,        ; Now, do the multiply and accumulate the product
,,,        ;
0277,8C 01,FMUL3,FMUL3:  MOV     R1B0,R4
0279,E3,,        MOVX    A,@R1
027A,FA,,        MOV     R2,A
027B,71 F3,,        ACALL   MUL_NIBBLE
,,,        ;
027D,EA,,        MOV     A,R2
027E,C4,,        SWAP    A
027F,71 F3,,        ACALL   MUL_NIBBLE
0281,1C,,        DEC     R4
0282,DB F3,,        DJNZ    R3,FMUL3
,,,        ;
,,,        ; Now, pack and restore the sign
,,,        ;
0284,8E 30,,        MOV     FP_EXP,R6
0286,8D 2F,,        MOV     FP_SIGN,R5
0288,41 EB,,        AJMP    PACK            ;FINISH IT OFF
,,,        ;
,,,$EJECT
,,,        ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
,,,        ;
028A,,FLOATING_DIV,FLOATING_DIV:
,,,        ;
,,,        ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
,,,        ;
028A,91 32,,        ACALL   MDES1
,,,        ;
,,,        ; Check the exponents
,,,        ;
028C,8D 2F,,        MOV     FP_SIGN,R5      ;SAVE THE SIGN
028E,BF 00 06,,        CJNE    R7,#0,DIV0      ;CLEARS THE CARRY
0291,71 5C,,        ACALL   OVERFLOW_AND_EXIT
0293,E4,,        CLR     A
0294,D2 E3,,        SETB    ACC.ZERO_DIVIDE
0296,22,,        RET
,,,        ;
0297,EE,DIV0,DIV0:   MOV     A,R6            ;GET EXPONENT
0298,60 C0,,        JZ      FMUL1-2         ;EXIT IF ZERO
029A,9F,,        SUBB    A,R7            ;DELTA EXPONENT
029B,20 E7 04,,        JB      ACC.7,D_UNDER
029E,50 04,,        JNC     DIV3
02A0,61 6D,,        AJMP    UNDERFLOW_AND_EXIT
,,,        ;
02A2,50 C8,D_UNDER,D_UNDER:JNC     FOV
,,,        ;
02A4,24 81,DIV3,DIV3:   ADD     A,#129          ;CORRECTLY BIAS THE EXPONENT
02A6,F5 30,,        MOV     FP_EXP,A        ;SAVE THE EXPONENT
02A8,91 43,,        ACALL   LOADR1_MANTISSA ;LOAD THE DIVIDED
,,,        ;
02AA,7A 34,,        MOV     R2,#FP_ACCC     ;SAVE LOCATION
02AC,AB 00,,        MOV     R3,R0B0         ;SAVE POINTER IN R3
02AE,75 2A 00,,        MOV     FP_CARRY,#0     ;ZERO CARRY BYTE
,,,        ;
02B1,7D FF,DIV4,DIV4:   MOV     R5,#0FFH        ;LOOP COUNT
02B3,D3,,        SETB    C
,,,        ;
02B4,8B 00,DIV5,DIV5:   MOV     R0B0,R3         ;RESTORE THE EXTERNAL POINTER
02B6,79 2E,,        MOV     R1,#FP_DIG78    ;SET UP INTERNAL POINTER
02B8,7F 04,,        MOV     R7,#DIGIT       ;LOOP COUNT
02BA,50 17,,        JNC     DIV7            ;EXIT IF NO CARRY
,,,        ;
02BC,E2,DIV6,DIV6:   MOVX    A,@R0           ;DO ACCUMLATION
02BD,FE,,        MOV     R6,A
02BE,E4,,        CLR     A
02BF,34 99,,        ADDC    A,#99H
02C1,9E,,        SUBB    A,R6
02C2,27,,        ADD     A,@R1
02C3,D4,,        DA      A
02C4,F7,,        MOV     @R1,A
02C5,18,,        DEC     R0
02C6,19,,        DEC     R1
02C7,DF F3,,        DJNZ    R7,DIV6         ;LOOP
,,,        ;
02C9,0D,,        INC     R5              ;SUBTRACT COUNTER
02CA,40 E8,,        JC      DIV5            ;KEEP LOOPING IF CARRY
02CC,E7,,        MOV     A,@R1           ;GET CARRY
02CD,94 01,,        SUBB    A,#1            ;CARRY IS CLEARED
02CF,F7,,        MOV     @R1,A           ;SAVE CARRY DIGIT
02D0,B3,,        CPL     C
02D1,80 E1,,        SJMP    DIV5            ;LOOP
,,,        ;
,,,        ; Restore the result if carry was found
,,,        ;
02D3,31 D3,DIV7,DIV7:   ACALL   ADDLP           ;ADD NUMBER BACK
02D5,77 00,,        MOV     @R1,#0          ;CLEAR CARRY
02D7,8A 00,,        MOV     R0B0,R2         ;GET SAVE COUNTER
02D9,A6 05,,        MOV     @R0,5           ;SAVE COUNT BYTE
,,,        ;
02DB,0A,,        INC     R2              ;ADJUST SAVE COUNTER
02DC,7F 01,,        MOV     R7,#1           ;BUMP DIVIDEND
02DE,71 BB,,        ACALL   LEFT
02E0,BA 3E CE,,        CJNE    R2,#FP_ACC8+2,DIV4
,,,        ;
02E3,D5 30 02,,        DJNZ    FP_EXP,DIV8
02E6,61 6D,,        AJMP    UNDERFLOW_AND_EXIT
,,,        ;
02E8,75 2A 00,DIV8,DIV8:   MOV     FP_CARRY,#0
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
02EB,,PACK,PACK:   ; Pack the mantissa
,,,        ;
,,,        ;***************************************************************
,,,        ;
,,,        ; First, set up the pointers
,,,        ;
02EB,78 34,,        MOV     R0,#FP_ACCC
02ED,E6,,        MOV     A,@R0           ;GET FP_ACCC
02EE,FE,,        MOV     R6,A            ;SAVE FOR ZERO COUNT
02EF,60 03,,        JZ      PACK0           ;JUMP OVER IF ZERO
02F1,71 3A,,        ACALL   INC_FP_EXP      ;BUMP THE EXPONENT

⌨️ 快捷键说明

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