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

📄 calc.sdi

📁 一个用仿真单片机为计算器的PROTEUS工程
💻 SDI
📖 第 1 页 / 共 5 页
字号:
0578,D1 51,USING0,USING0: ACALL   SS7             ;OUTPUT SPACES, IF NEED TO
057A,EA,,        MOV     A,R2            ;OUTPUT DIGITS
057B,FF,,        MOV     R7,A
057C,D1 13,,        ACALL   OUTR0
,,,        ;
057E,EB,USING1,USING1: MOV     A,R3
057F,54 0F,,        ANL     A,#0FH          ;GET THE NUMBER RIGHT OF DP
0581,FA,,        MOV     R2,A            ;SAVE IT
0582,60 BD,,        JZ      PMT1            ;EXIT IF ZERO
0584,D1 5A,,        ACALL   ROUT            ;OUTPUT DP
0586,D1 38,,        ACALL   NUM_RT
0588,B5 02 03,,        CJNE    A,2,USINGX      ;COMPARE A TO R2
,,,        ;
058B,EA,USINGY,USINGY: MOV     A,R2
058C,C1 48,,        AJMP    Z7R7
,,,        ;
058E,50 FB,USINGX,USINGX: JNC     USINGY
,,,        ;
0590,CA,USING2,USING2: XCH     A,R2
0591,C3,,        CLR     C
0592,9A,,        SUBB    A,R2
0593,CA,,        XCH     A,R2
0594,D1 48,,        ACALL   Z7R7            ;OUTPUT ZEROS IF NEED TO
0596,EA,,        MOV     A,R2
0597,FF,,        MOV     R7,A
0598,C1 13,,        AJMP    OUTR0
,,,        ;
,,,        ; First, force exponential output, if need to
,,,        ;
059A,EE,FREE,FREE:   MOV     A,R6            ;GET THE EXPONENT
059B,70 04,,        JNZ     FREE1           ;IF ZERO, PRINT IT
059D,D1 62,,        ACALL   SOUT
059F,C1 5E,,        AJMP    ZOUT
,,,        ;
05A1,7B F0,FREE1,FREE1:  MOV     R3,#0F0H        ;IN CASE EXP NEEDED
05A3,74 77,,        MOV     A,#80H-DIGIT-DIGIT-1
05A5,2E,,        ADD     A,R6
05A6,40 21,,        JC      EXPOUT
05A8,94 F7,,        SUBB    A,#0F7H
05AA,40 1D,,        JC      EXPOUT
,,,        ;
,,,        ; Now, just print the number
,,,        ;
05AC,D1 53,,        ACALL   SINOUT          ;PRINT THE SIGN OF THE NUMBER
05AE,D1 2F,,        ACALL   NUM_LT          ;GET THE NUMBER LEFT OF DP
05B0,B4 08 02,,        CJNE    A,#8,FREE4
05B3,C1 13,,        AJMP    OUTR0
,,,        ;
05B5,D1 13,FREE4,FREE4:  ACALL   OUTR0
05B7,D1 25,,        ACALL   ZTEST           ;TEST FOR TRAILING ZEROS
05B9,60 57,,        JZ      U_RET           ;DONE IF ALL TRAILING ZEROS
05BB,D1 5A,,        ACALL   ROUT            ;OUTPUT RADIX
,,,        ;
05BD,7F 01,FREE2,FREE2:  MOV     R7,#1           ;OUTPUT ONE DIGIT
05BF,D1 13,,        ACALL   OUTR0
05C1,70 4F,,        JNZ     U_RET
05C3,D1 25,,        ACALL   ZTEST
05C5,60 4B,,        JZ      U_RET
05C7,80 F4,,        SJMP    FREE2           ;LOOP
,,,        ;
05C9,D1 53,EXPOUT,EXPOUT: ACALL   SINOUT          ;PRINT THE SIGN
05CB,7F 01,,        MOV     R7,#1           ;OUTPUT ONE CHARACTER
05CD,D1 13,,        ACALL   OUTR0
05CF,D1 5A,,        ACALL   ROUT            ;OUTPUT RADIX
05D1,EB,,        MOV     A,R3            ;GET FORMAT
05D2,54 0F,,        ANL     A,#0FH          ;STRIP INDICATOR
05D4,60 06,,        JZ      EXPOTX
,,,        ;
05D6,FF,,        MOV     R7,A            ;OUTPUT THE NUMBER OF DIGITS
05D7,1F,,        DEC     R7              ;ADJUST BECAUSE ONE CHAR ALREADY OUT
05D8,D1 13,,        ACALL   OUTR0
05DA,80 02,,        SJMP    EXPOT4
,,,        ;
05DC,B1 BD,EXPOTX,EXPOTX: ACALL   FREE2           ;OUTPUT UNTIL TRAILING ZEROS
,,,        ;
05DE,D1 62,EXPOT4,EXPOT4: ACALL   SOUT            ;OUTPUT A SPACE
05E0,7D 45,,        MOV     R5,#'E'
05E2,D1 64,,        ACALL   SOUT1           ;OUTPUT AN E
05E4,EE,,        MOV     A,R6            ;GET THE EXPONENT
05E5,60 04,,        JZ      XOUT0           ;EXIT IF ZERO
05E7,14,,        DEC     A               ;ADJUST FOR THE DIGIT ALREADY OUTPUT
05E8,B4 80 05,,        CJNE    A,#80H,XOUT2    ;SEE WHAT IT IS
,,,        ;
05EB,D1 62,XOUT0,XOUT0:  ACALL   SOUT
05ED,E4,,        CLR     A
05EE,80 0C,,        SJMP    XOUT4
,,,        ;
05F0,40 06,XOUT2,XOUT2:  JC      XOUT3           ;NEGATIVE EXPONENT
05F2,7D 2B,,        MOV     R5,#'+'         ;OUTPUT A PLUS SIGN
05F4,D1 64,,        ACALL   SOUT1
05F6,80 04,,        SJMP    XOUT4
,,,        ;
05F8,D1 56,XOUT3,XOUT3:  ACALL   MOUT
05FA,F4,,        CPL     A               ;FLIP BITS
05FB,04,,        INC     A               ;BUMP
,,,        ;
05FC,C2 E7,XOUT4,XOUT4:  CLR     ACC.7
05FE,F8,,        MOV     R0,A
05FF,7A 00,,        MOV     R2,#0
0601,79 48,,        MOV     R1,#LOW CONVT   ;CONVERSION LOCATION
0603,7B 00,,        MOV     R3,#HIGH CONVT
0605,D1 BF,,        ACALL   CONVERT_BINARY_TO_ASCII_STRING
0607,78 48,,        MOV     R0,#LOW CONVT   ;NOW, OUTPUT EXPONENT
,,,        ;
0609,E2,EXPOT5,EXPOT5: MOVX    A,@R0           ;GET THE CHARACTER
060A,FD,,        MOV     R5,A            ;OUTPUT IT
060B,D1 64,,        ACALL   SOUT1
060D,08,,        INC     R0              ;BUMP THE POINTER
060E,E8,,        MOV     A,R0            ;GET THE POINTER
060F,B5 01 F7,,        CJNE    A,R1B0,EXPOT5   ;LOOP
,,,        ;
0612,22,U_RET,U_RET:  RET                     ;EXIT
,,,        ;
0613,,OUTR0,OUTR0:  ; Output the characters pointed to by R0, also bias ascii
,,,        ;
0613,EF,,        MOV     A,R7            ;GET THE COUNTER
0614,60 0E,,        JZ      OUTR            ;EXIT IF DONE
0616,E6,,        MOV     A,@R0           ;GET THE NUMBER
0617,44 30,,        ORL     A,#30H          ;ASCII BIAS
0619,08,,        INC     R0              ;BUMP POINTER AND COUNTER
061A,1F,,        DEC     R7
061B,FD,,        MOV     R5,A            ;PUT CHARACTER IN OUTPUT REGISTER
061C,D1 64,,        ACALL   SOUT1           ;OUTPUT THE CHARACTER
061E,E4,,        CLR     A               ;JUST FOR TEST
061F,B8 33 F1,,        CJNE    R0,#FP_NIB8+1,OUTR0
0622,74 55,,        MOV     A,#55H          ;KNOW WHERE EXIT OCCURED
,,,        ;
0624,22,OUTR,OUTR:   RET
,,,        ;
0625,A9 00,ZTEST,ZTEST:  MOV     R1,R0B0         ;GET POINTER REGISTER
,,,        ;
0627,E7,ZT0,ZT0:    MOV     A,@R1           ;GET THE VALUE
0628,70 04,,        JNZ     ZT1
062A,09,,        INC     R1              ;BUMP POINTER
062B,B9 33 F9,,        CJNE    R1,#FP_NIB8+1,ZT0
,,,        ;
062E,22,ZT1,ZT1:    RET
,,,        ;
062F,EE,NUM_LT,NUM_LT: MOV     A,R6            ;GET EXPONENT
0630,C3,,        CLR     C               ;GET READY FOR SUBB
0631,94 80,,        SUBB    A,#80H          ;SUB EXPONENT BIAS
0633,50 01,,        JNC     NL1             ;OK IF NO CARRY
0635,E4,,        CLR     A               ;NO DIGITS LEFT
,,,        ;
0636,FF,NL1,NL1:    MOV     R7,A            ;SAVE THE COUNT
0637,22,,        RET
,,,        ;
0638,C3,NUM_RT,NUM_RT: CLR     C               ;SUBB AGAIN
0639,74 80,,        MOV     A,#80H          ;EXPONENT BIAS
063B,9E,,        SUBB    A,R6            ;GET THE BIASED EXPONENT
063C,50 01,,        JNC     NR1
063E,E4,,        CLR     A
,,,        ;
063F,22,NR1,NR1:    RET                     ;EXIT
,,,        ;
0640,EF,SPACE7,SPACE7: MOV     A,R7            ;GET THE NUMBER OF SPACES
0641,60 FC,,        JZ      NR1             ;EXIT IF ZERO
0643,D1 62,,        ACALL   SOUT            ;OUTPUT A SPACE
0645,1F,,        DEC     R7              ;BUMP COUNTER
0646,80 F8,,        SJMP    SPACE7          ;LOOP
,,,        ;
0648,FF,Z7R7,Z7R7:   MOV     R7,A
,,,        ;
0649,EF,ZERO7,ZERO7:  MOV     A,R7            ;GET COUNTER
064A,60 F3,,        JZ      NR1             ;EXIT IF ZERO
064C,D1 5E,,        ACALL   ZOUT            ;OUTPUT A ZERO
064E,1F,,        DEC     R7              ;BUMP COUNTER
064F,80 F8,,        SJMP    ZERO7           ;LOOP
,,,        ;
0651,D1 40,SS7,SS7:    ACALL   SPACE7
,,,        ;
0653,EC,SINOUT,SINOUT: MOV     A,R4            ;GET THE SIGN
0654,60 0C,,        JZ      SOUT            ;OUTPUT A SPACE IF ZERO
,,,        ;
0656,7D 2D,MOUT,MOUT:   MOV     R5,#'-'
0658,80 0A,,        SJMP    SOUT1           ;OUTPUT A MINUS IF NOT
,,,        ;
065A,7D 2E,ROUT,ROUT:   MOV     R5,#'.'         ;OUTPUT A RADIX
065C,80 06,,        SJMP    SOUT1
,,,        ;
065E,7D 30,ZOUT,ZOUT:   MOV     R5,#'0'         ;OUTPUT A ZERO
0660,80 02,,        SJMP    SOUT1
,,,        ;
0662,7D 20,SOUT,SOUT:   MOV     R5,#' '         ;OUTPUT A SPACE
,,,        ;
0664,E1 40,SOUT1,SOUT1:  AJMP    R5OUT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
0666,,CONVERT_ASCII_STRING_TO_BINARY,CONVERT_ASCII_STRING_TO_BINARY:
,,,        ;
,,,        ;DPTR POINTS TO ASCII STRING
,,,        ;PUT THE BINARY NUMBER IN R2:R0, ERROR IF >64K
,,,        ;
,,,        ;***************************************************************
,,,        ;
0666,91 51,CASB,CASB:   ACALL   HEXSCAN         ;SEE IF HEX NUMBER
0668,92 33,,        MOV     ADD_IN,C        ;IF ADD_IN IS SET, THE NUMBER IS HEX
066A,F1 33,,        ACALL   GET_DIGIT_CHECK
066C,B3,,        CPL     C               ;FLIP FOR EXIT
066D,40 28,,        JC      RCASB
066F,7B 00,,        MOV     R3,#00H         ;ZERO R3:R1 FOR LOOP
0671,79 00,,        MOV     R1,#00H
0673,80 15,,        SJMP    CASB5
,,,        ;
0675,A3,CASB2,CASB2:  INC     DPTR
0676,89 00,,        MOV     R0B0,R1         ;SAVE THE PRESENT CONVERTED VALUE
0678,8B 02,,        MOV     R0B0+2,R3       ;IN R2:R0
067A,F1 33,,        ACALL   GET_DIGIT_CHECK
067C,40 0C,,        JC      CASB5
067E,30 33 16,,        JNB     ADD_IN,RCASB    ;CONVERSION COMPLETE
0681,91 71,,        ACALL   HEX_CHECK       ;SEE IF HEX NUMBER
0683,40 03,,        JC      CASB4           ;PROCEED IF GOOD
0685,A3,,        INC     DPTR            ;BUMP PAST H
0686,80 0F,,        SJMP    RCASB
,,,        ;
0688,24 09,CASB4,CASB4:  ADD     A,#9            ;ADJUST HEX ASCII BIAS
,,,        ;
068A,75 F0 0A,CASB5,CASB5:  MOV     B,#10
068D,30 33 03,,        JNB     ADD_IN,CASB6
0690,75 F0 10,,        MOV     B,#16           ;HEX MODE
,,,        ;
0693,D1 9E,CASB6,CASB6:  ACALL   MULNUM          ;ACCUMULATE THE DIGITS
0695,50 DE,,        JNC     CASB2           ;LOOP IF NO CARRY
,,,        ;
0697,E4,RCASB,RCASB:  CLR     A               ;RESET ACC
0698,92 E1,,        MOV     ACC.OVERFLOW,C  ;IF OVERFLOW, SAY SO
069A,22,,        RET                     ;EXIT
,,,        ;
,,,$EJECT
,,,        ;
069B,75 F0 0A,MULNUM10,MULNUM10:MOV    B,#10
,,,        ;
,,,        ;***************************************************************
,,,        ;
069E,,MULNUM,MULNUM: ; Take the next digit in the acc (masked to 0FH)
,,,        ; accumulate in R3:R1
,,,        ;
,,,        ;***************************************************************
,,,        ;
069E,C0 E0,,        PUSH    ACC             ;SAVE ACC
06A0,C0 F0,,        PUSH    B               ;SAVE MULTIPLIER
06A2,E9,,        MOV     A,R1            ;PUT LOW ORDER BITS IN ACC
06A3,A4,,        MUL     AB              ;DO THE MULTIPLY
06A4,F9,,        MOV     R1,A            ;PUT THE RESULT BACK
06A5,EB,,        MOV     A,R3            ;GET THE HIGH ORDER BYTE
06A6,AB F0,,        MOV     R3,B            ;SAVE THE OVERFLOW
06A8,D0 F0,,        POP     B               ;GET THE MULTIPLIER
06AA,A4,,        MUL     AB              ;DO IT
06AB,A2 D2,,        MOV     C,OV            ;SAVE OVERFLOW IN F0
06AD,92 D5,,        MOV     F0,C
06AF,2B,,        ADD     A,R3            ;ADD OVERFLOW TO HIGH RESULT
06B0,FB,,        MOV     R3,A            ;PUT IT BACK
06B1,D0 E0,,        POP     ACC             ;GET THE ORIGINAL ACC BACK
06B3,72 D5,,        ORL     C,F0            ;OR CARRY AND OVERFLOW
06B5,40 07,,        JC      MULX            ;NO GOOD IF THE CARRY IS SET
,,,        ;
06B7,54 0F,MUL11,MUL11:  ANL     A,#0FH          ;MASK OFF HIGH ORDER BITS
06B9,29,,        ADD     A,R1            ;NOW ADD THE ACC
06BA,F9,,        MOV     R1,A            ;PUT IT BACK
06BB,E4,,        CLR     A               ;PROPAGATE THE CARRY
06BC,3B,,        ADDC    A,R3
06BD,FB,,        MOV     R3,A            ;PUT IT BACK
,,,        ;
06BE,22,MULX,MULX:   RET                     ;EXIT WITH OR WITHOUT CARRY
,,,        ;
,,,        ;***************************************************************
,,,        ;
06BF,,CONVERT_BINARY_TO_ASCII_STRING,CONVERT_BINARY_TO_ASCII_STRING:
,,,        ;
,,,        ;R3:R1 contains the address of the string
,,,        ;R2:R0 contains the value to convert
,,,        ;DPTR, R7, R6, and ACC gets clobbered
,,,        ;
,,,        ;***************************************************************
,,,        ;
06BF,E4,,        CLR     A               ;NO LEADING ZEROS
06C0,90 27 10,,        MOV     DPTR,#10000     ;SUBTRACT 10000
06C3,D1 DC,,        ACALL   RSUB            ;DO THE SUBTRACTION
06C5,90 03 E8,,        MOV     DPTR,#1000      ;NOW 1000
06C8,D1 DC,,        ACALL   RSUB
06CA,90 00 64,,        MOV     DPTR,#100       ;NOW 100
06CD,D1 DC,,        ACALL   RSUB
06CF,90 00 0A,,        MOV     DPTR,#10        ;NOW 10
06D2,D1 DC,,        ACALL   RSUB
06D4,90 00 01,,        MOV     DPTR,#1         ;NOW 1
06D7,D1 DC,,        ACALL   RSUB
06D9,60 20,,        JZ      RSUB2           ;JUMP OVER RET
,,,        ;
06DB,22,RSUB_R,RSUB_R: RET
,,,        ;
06DC,7E FF,RSUB,RSUB:   MOV     R6,#-1          ;SET UP THE COUNTER
,,,        ;
06DE,0E,RSUB1,RSUB1:  INC     R6              ;BUMP THE COUNTER
06DF,CA,,        XCH     A,R2            ;DO A FAST COMPARE
06E0,B5 83 00,,        CJNE    A,DPH,$+3
06E3,CA,,        XCH     A,R2
06E4,40 12,,        JC      FAST_DONE
06E6,C8,,        XCH     A,R0            ;GET LOW BYTE
06E7,95 82,,        SUBB    A,DPL           ;SUBTRACT, CARRY IS CLEARED
06E9,C8,,        XCH     A,R0            ;PUT IT BACK
06EA,CA,,        XCH     A,R2            ;GET THE HIGH BYTE
06EB,95 83,,        SUBB    A,DPH           ;ADD THE HIGH BYTE
06ED,CA,,        XCH     A,R2            ;PUT IT BACK
06EE,50 EE,,        JNC     RSUB1           ;LOOP UNTIL CARRY
,,,        ;
06F0,C8,,        XCH     A,R0
06F1,25 82,,        ADD     A,DPL           ;RESTORE R2:R0
06F3,C8,,        XCH     A,R0
06F4,CA,,        XCH     A,R2
06F5,35 83,,        ADDC    A,DPH
06F7,CA,,        XCH     A,R2
,,,        ;
06F8,,FAST_DONE,FAST_DONE:
,,,        ;
06F8,4E,,  

⌨️ 快捷键说明

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