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

📄 calc.sdi

📁 一个用仿真单片机为计算器的PROTEUS工程
💻 SDI
📖 第 1 页 / 共 5 页
字号:
,,,        ;
0426,,LOAD_POINTERS,LOAD_POINTERS:  ; Load the ARG_STACK into R0 and bump R1
,,,        ;
,,,        ;***************************************************************
,,,        ;
0426,75 A0 01,,        MOV     P2,#ARG_STACK_PAGE
0429,A8 24,,        MOV     R0,ARG_STACK
042B,74 06,,        MOV     A,#FP_NUMBER_SIZE
042D,28,,        ADD     A,R0
042E,F9,,        MOV     R1,A
042F,22,,        RET
,,,        ;
,,,        ;***************************************************************
,,,        ;
0430,,MUL_DIV_EXP_AND_SIGN,MUL_DIV_EXP_AND_SIGN:
,,,        ;
,,,        ; Load the sign into R7, R6. R5 gets the sign for
,,,        ; multiply and divide.
,,,        ;
,,,        ;***************************************************************
,,,        ;
0430,71 7A,,        ACALL   FP_CLEAR        ;CLEAR INTERNAL MEMORY
,,,        ;
0432,91 26,MDES1,MDES1:  ACALL   LOAD_POINTERS   ;LOAD REGISTERS
0434,E2,,        MOVX    A,@R0           ;ARG 1 EXP
0435,FF,,        MOV     R7,A            ;SAVED IN R7
0436,E3,,        MOVX    A,@R1           ;ARG 2 EXP
0437,FE,,        MOV     R6,A            ;SAVED IN R6
0438,18,,        DEC     R0              ;BUMP POINTERS TO SIGN
0439,19,,        DEC     R1
043A,E2,,        MOVX    A,@R0           ;GET THE SIGN
043B,FC,,        MOV     R4,A            ;SIGN OF ARG1
043C,E3,,        MOVX    A,@R1           ;GET SIGN OF NEXT ARG
043D,FB,,        MOV     R3,A            ;SIGN OF ARG2
043E,6C,,        XRL     A,R4            ;ACC GETS THE NEW SIGN
043F,FD,,        MOV     R5,A            ;R5 GETS THE NEW SIGN
,,,        ;
,,,        ; Bump the pointers to point at the LS digit
,,,        ;
0440,18,,        DEC     R0
0441,19,,        DEC     R1
,,,        ;
0442,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
0443,,LOADR1_MANTISSA,LOADR1_MANTISSA:
,,,        ;
,,,        ; Load the mantissa of R0 into FP_Digits
,,,        ;
,,,        ;***************************************************************
,,,        ;
0443,C0 00,,        PUSH    R0B0            ;SAVE REGISTER 1
0445,78 2E,,        MOV     R0,#FP_DIG78    ;SET UP THE POINTER
,,,        ;
0447,E3,LOADR1,LOADR1: MOVX    A,@R1
0448,F6,,        MOV     @R0,A
0449,19,,        DEC     R1
044A,18,,        DEC     R0
044B,B8 2A F9,,        CJNE    R0,#FP_CARRY,LOADR1
,,,        ;
044E,D0 00,,        POP     R0B0
0450,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
0451,,HEXSCAN,HEXSCAN:        ; Scan a string to determine if it is a hex number
,,,                ; set carry if hex, else carry = 0
,,,        ;
,,,        ;***************************************************************
,,,        ;
0451,B1 27,,        ACALL   GET_DPTR_CHARACTER
0453,C0 83,,        PUSH    DPH
0455,C0 82,,        PUSH    DPL             ;SAVE THE POINTER
,,,        ;
0457,E0,HEXSC1,HEXSC1: MOVX    A,@DPTR         ;GET THE CHARACTER
0458,F1 35,,        ACALL   DIGIT_CHECK     ;SEE IF A DIGIT
045A,40 12,,        JC      HS1             ;CONTINUE IF A DIGIT
045C,91 71,,        ACALL   HEX_CHECK       ;SEE IF HEX
045E,40 0E,,        JC      HS1
,,,        ;
0460,C2 E5,,        CLR     ACC.5           ;NO LOWER CASE
0462,B4 48 03,,        CJNE    A,#'H',HEXDON
0465,D3,,        SETB    C
0466,80 01,,        SJMP    HEXDO1          ;NUMBER IS VALID HEX, MAYBE
,,,        ;
0468,C3,HEXDON,HEXDON: CLR     C
,,,        ;
0469,D0 82,HEXDO1,HEXDO1: POP     DPL             ;RESTORE POINTER
046B,D0 83,,        POP     DPH
046D,22,,        RET
,,,        ;
046E,A3,HS1,HS1:    INC     DPTR            ;BUMP TO NEXT CHARACTER
046F,80 E6,,        SJMP    HEXSC1          ;LOOP
,,,        ;
0471,,HEX_CHECK,HEX_CHECK:      ;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
,,,        ;
0471,C2 E5,,        CLR     ACC.5           ;WASTE LOWER CASE
0473,B4 47 00,,        CJNE    A,#'F'+1,$+3    ;SEE IF F OR LESS
0476,40 01,,        JC      HC1
0478,22,,        RET
,,,        ;
0479,B4 41 00,HC1,HC1:    CJNE    A,#'A',$+3      ;SEE IF A OR GREATER
047C,B3,,        CPL     C
047D,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;
047E,,PUSHR2R0,PUSHR2R0:
,,,        ;
047E,7B 00,,        MOV     R3,#HIGH CONVT  ;CONVERSION LOCATION
0480,79 48,,        MOV     R1,#LOW CONVT
0482,D1 BF,,        ACALL   CONVERT_BINARY_TO_ASCII_STRING
0484,74 0D,,        MOV     A,#0DH          ;A CR TO TERMINATE
0486,F3,,        MOVX    @R1,A           ;SAVE THE CR
0487,90 00 48,,        MOV     DPTR,#CONVT
,,,        ;
,,,        ; Falls thru to FLOATING INPUT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
048A,,FLOATING_POINT_INPUT,FLOATING_POINT_INPUT:   ; Input a floating point number pointed to by
,,,                        ; the DPTR
,,,        ;
,,,        ;***************************************************************
,,,        ;
048A,71 7A,,        ACALL   FP_CLEAR        ;CLEAR EVERYTHING
048C,B1 27,,        ACALL   GET_DPTR_CHARACTER
048E,B1 2D,,        ACALL   PLUS_MINUS_TEST
0490,92 78,,        MOV     MSIGN,C         ;SAVE THE MANTISSA SIGN
,,,        ;
,,,        ; Now, set up for input loop
,,,        ;
0492,78 34,,        MOV     R0,#FP_ACCC
0494,7E 7F,,        MOV     R6,#7FH         ;BASE EXPONENT
0496,D2 D5,,        SETB    F0              ;SET INITIAL FLAG
,,,        ;
0498,F1 33,INLOOP,INLOOP: ACALL   GET_DIGIT_CHECK
049A,50 07,,        JNC     GTEST           ;IF NOT A CHARACTER, WHAT IS IT?
049C,54 0F,,        ANL     A,#0FH          ;STRIP ASCII
049E,B1 00,,        ACALL   STDIG           ;STORE THE DIGITS
,,,        ;
04A0,A3,INLPIK,INLPIK: INC     DPTR            ;BUMP POINTER FOR LOOP
04A1,80 F5,,        SJMP    INLOOP          ;LOOP FOR INPUT
,,,        ;
04A3,B4 2E 0C,GTEST,GTEST:  CJNE    A,#'.',GT1      ;SEE IF A RADIX
04A6,20 51 63,,        JB      FOUND_RADIX,INERR
04A9,D2 51,,        SETB    FOUND_RADIX
04AB,B8 34 F2,,        CJNE    R0,#FP_ACCC,INLPIK
04AE,D2 52,,        SETB    FIRST_RADIX     ;SET IF FIRST RADIX
04B0,80 EE,,        SJMP    INLPIK          ;GET ADDITIONAL DIGITS
,,,        ;
04B2,20 D5 57,GT1,GT1:    JB      F0,INERR        ;ERROR IF NOT CLEARED
04B5,B4 65 02,,        CJNE    A,#'e',$+5      ;CHECK FOR LOWER CASE
04B8,80 03,,        SJMP    $+5
04BA,B4 45 33,,        CJNE    A,#'E',FINISH_UP
04BD,B1 26,,        ACALL   INC_AND_GET_DPTR_CHARACTER
04BF,B1 2D,,        ACALL   PLUS_MINUS_TEST
04C1,92 50,,        MOV     XSIGN,C         ;SAVE SIGN STATUS
04C3,F1 33,,        ACALL   GET_DIGIT_CHECK
04C5,50 45,,        JNC     INERR
,,,        ;
04C7,54 0F,,        ANL     A,#0FH          ;STRIP ASCII BIAS OFF THE CHARACTER
04C9,FD,,        MOV     R5,A            ;SAVE THE CHARACTER IN R5
,,,        ;
04CA,A3,GT2,GT2:    INC     DPTR
04CB,F1 33,,        ACALL   GET_DIGIT_CHECK
04CD,50 0D,,        JNC     FINISH1
04CF,54 0F,,        ANL     A,#0FH          ;STRIP OFF BIAS
04D1,CD,,        XCH     A,R5            ;GET THE LAST DIGIT
04D2,75 F0 0A,,        MOV     B,#10           ;MULTIPLY BY TEN
04D5,A4,,        MUL     AB
04D6,2D,,        ADD     A,R5            ;ADD TO ORIGINAL VALUE
04D7,FD,,        MOV     R5,A            ;SAVE IN R5
04D8,50 F0,,        JNC     GT2             ;LOOP IF NO CARRY
04DA,7D FF,,        MOV     R5,#0FFH        ;FORCE AN ERROR
,,,        ;
04DC,ED,FINISH1,FINISH1:MOV     A,R5            ;GET THE SIGN
04DD,30 50 09,,        JNB     XSIGN,POSNUM    ;SEE IF EXPONENT IS POS OR NEG
04E0,C3,,        CLR     C
04E1,9E,,        SUBB    A,R6
04E2,F4,,        CPL     A
04E3,04,,        INC     A
04E4,40 09,,        JC      FINISH2
04E6,74 01,,        MOV     A,#01H
04E8,22,,        RET
,,,        ;
04E9,2E,POSNUM,POSNUM: ADD     A,R6            ;ADD TO EXPONENT
04EA,50 03,,        JNC     FINISH2
,,,        ;
04EC,74 02,POSNM1,POSNM1: MOV     A,#02H
04EE,22,,        RET
,,,        ;
04EF,CE,FINISH2,FINISH2:XCH     A,R6            ;SAVE THE EXPONENT
,,,        ;
04F0,,FINISH_UP,FINISH_UP:
,,,        ;
04F0,8E 30,,        MOV     FP_EXP,R6       ;SAVE EXPONENT
04F2,B8 34 02,,        CJNE    R0,#FP_ACCC,$+5
04F5,71 7A,,        ACALL   FP_CLEAR        ;CLEAR THE MEMORY IF 0
04F7,E5 24,,        MOV     A,ARG_STACK     ;GET THE ARG STACK
04F9,C3,,        CLR     C
04FA,94 0C,,        SUBB    A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
04FC,F5 24,,        MOV     ARG_STACK,A     ;ADJUST FOR STORE
04FE,41 EB,,        AJMP    PACK
,,,        ;
0500,C2 D5,STDIG,STDIG:  CLR     F0              ;CLEAR INITIAL DESIGNATOR
0502,70 0B,,        JNZ     STDIG1          ;CONTINUE IF NOT ZERO
0504,B8 34 08,,        CJNE    R0,#FP_ACCC,STDIG1
0507,30 52 04,,        JNB     FIRST_RADIX,RET_X
,,,        ;
050A,DE 02,DECX,DECX:   DJNZ    R6,RET_X
,,,        ;
050C,74 FF,INERR,INERR:  MOV     A,#0FFH
,,,        ;
050E,22,RET_X,RET_X:  RET
,,,        ;
050F,20 53 02,STDIG1,STDIG1: JB      DONE_LOAD,FRTEST
0512,C2 52,,        CLR     FIRST_RADIX
,,,        ;
0514,20 52 F3,FRTEST,FRTEST: JB      FIRST_RADIX,DECX
,,,        ;
0517,20 51 01,FDTEST,FDTEST: JB      FOUND_RADIX,FDT1
051A,0E,,        INC     R6
,,,        ;
051B,20 53 F0,FDT1,FDT1:   JB      DONE_LOAD,RET_X
051E,B8 3D 02,,        CJNE    R0,#FP_ACC8+1,FDT2
0521,D2 53,,        SETB    DONE_LOAD
,,,        ;
0523,F6,FDT2,FDT2:   MOV     @R0,A           ;SAVE THE STRIPPED ACCUMULATOR
0524,08,,        INC     R0              ;BUMP THE POINTER
0525,22,,        RET                     ;EXIT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
,,,        ; I/O utilities
,,,        ;
,,,        ;***************************************************************
,,,        ;
0526,,INC_AND_GET_DPTR_CHARACTER,INC_AND_GET_DPTR_CHARACTER:
,,,        ;
0526,A3,,        INC     DPTR
,,,        ;
0527,,GET_DPTR_CHARACTER,GET_DPTR_CHARACTER:
,,,        ;
0527,E0,,        MOVX    A,@DPTR         ;GET THE CHARACTER
0528,B4 20 16,,        CJNE    A,#' ',PMT1     ;SEE IF A SPACE
,,,        ;
,,,        ; Kill spaces
,,,        ;
052B,80 F9,,        SJMP    INC_AND_GET_DPTR_CHARACTER
,,,        ;
052D,,PLUS_MINUS_TEST,PLUS_MINUS_TEST:
,,,        ;
052D,B4 E3 02,,        CJNE    A,#0E3H,$+5     ;SEE IF A PLUS, PLUS TOKEN FROM BASIC
0530,80 0E,,        SJMP    PMT3
0532,B4 2B 02,,        CJNE    A,#'+',$+5
0535,80 09,,        SJMP    PMT3
0537,B4 E5 02,,        CJNE    A,#0E5H,$+5     ;SEE IF MINUS, MINUS TOKEN FROM BASIC
053A,80 03,,        SJMP    PMT2
053C,B4 2D 02,,        CJNE    A,#'-',PMT1
,,,        ;
053F,D3,PMT2,PMT2:   SETB    C
,,,        ;
0540,A3,PMT3,PMT3:   INC     DPTR
,,,        ;
0541,22,PMT1,PMT1:   RET
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
0542,,FLOATING_POINT_OUTPUT,FLOATING_POINT_OUTPUT:  ; Output the number, format is in location 25
,,,        ;
,,,        ; IF FORMAT = 00 - FREE FLOATING
,,,        ;           = FX - EXPONENTIAL (X IS THE NUMBER OF SIG DIGITS)
,,,        ;           = NX - N = NUM BEFORE RADIX, X = NUM AFTER RADIX
,,,        ;                  N + X = 8 MAX
,,,        ;
,,,        ;***************************************************************
,,,        ;
0542,91 32,,        ACALL   MDES1           ;GET THE NUMBER TO OUTPUT, R0 IS POINTER
0544,31 83,,        ACALL   POP_AND_EXIT    ;OUTPUT POPS THE STACK
0546,EF,,        MOV     A,R7
0547,FE,,        MOV     R6,A            ;PUT THE EXPONENT IN R6
0548,71 46,,        ACALL   UNPACK_R0       ;UNPACK THE NUMBER
054A,78 2B,,        MOV     R0,#FP_NIB1     ;POINT AT THE NUMBER
054C,E5 25,,        MOV     A,FORMAT        ;GET THE FORMAT
054E,FB,,        MOV     R3,A            ;SAVE IN CASE OF EXP FORMAT
054F,60 49,,        JZ      FREE            ;FREE FLOATING?
0551,B4 F0 00,,        CJNE    A,#0F0H,$+3     ;SEE IF EXPONENTIAL
0554,50 73,,        JNC     EXPOUT
,,,        ;
,,,        ; If here, must be integer USING format
,,,        ;
0556,EE,,        MOV     A,R6            ;GET THE EXPONENT
0557,70 02,,        JNZ     $+4
0559,7E 80,,        MOV     R6,#80H
055B,EB,,        MOV     A,R3            ;GET THE FORMAT
055C,C4,,        SWAP    A               ;SPLIT INTEGER AND FRACTION
055D,54 0F,,        ANL     A,#0FH
055F,FA,,        MOV     R2,A            ;SAVE INTEGER
0560,D1 2F,,        ACALL   NUM_LT          ;GET THE NUMBER OF INTEGERS
0562,CA,,        XCH     A,R2            ;FLIP FOR SUBB
0563,C3,,        CLR     C
0564,9A,,        SUBB    A,R2
0565,FF,,        MOV     R7,A
0566,50 06,,        JNC     $+8
0568,7D 3F,,        MOV     R5,#'?'         ;OUTPUT A QUESTION MARK
056A,D1 64,,        ACALL   SOUT1           ;NUMBER IS TOO LARGE FOR FORMAT
056C,A1 9A,,        AJMP    FREE
056E,BA 00 07,,        CJNE    R2,#00,USING0   ;SEE IF ZERO
0571,1F,,        DEC     R7
0572,D1 51,,        ACALL   SS7
0574,D1 5E,,        ACALL   ZOUT            ;OUTPUT A ZERO
0576,80 06,,        SJMP    USING1
,,,        ;

⌨️ 快捷键说明

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