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

📄 fp-52.sdi

📁 proteus 仿真实例, 使用了proteus大部分元件
💻 SDI
📖 第 1 页 / 共 5 页
字号:
1C93,D0 00,,        POP     R0B0
1C95,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
1C96,,HEXSCAN,HEXSCAN:        ; Scan a string to determine if it is a hex number
,,,                ; set carry if hex, else carry = 0
,,,        ;
,,,        ;***************************************************************
,,,        ;
1C96,B1 6C,,        ACALL   GET_DPTR_CHARACTER
1C98,C0 83,,        PUSH    DPH
1C9A,C0 82,,        PUSH    DPL             ;SAVE THE POINTER
,,,        ;
1C9C,E0,HEXSC1,HEXSC1: MOVX    A,@DPTR         ;GET THE CHARACTER
1C9D,F1 ED,,        ACALL   DIGIT_CHECK     ;SEE IF A DIGIT
1C9F,40 12,,        JC      HS1             ;CONTINUE IF A DIGIT
1CA1,91 B6,,        ACALL   HEX_CHECK       ;SEE IF HEX
1CA3,40 0E,,        JC      HS1
,,,        ;
1CA5,C2 E5,,        CLR     ACC.5           ;NO LOWER CASE
1CA7,B4 48 03,,        CJNE    A,#'H',HEXDON
1CAA,D3,,        SETB    C
1CAB,80 01,,        SJMP    HEXDO1          ;NUMBER IS VALID HEX, MAYBE
,,,        ;
1CAD,C3,HEXDON,HEXDON: CLR     C
,,,        ;
1CAE,D0 82,HEXDO1,HEXDO1: POP     DPL             ;RESTORE POINTER
1CB0,D0 83,,        POP     DPH
1CB2,22,,        RET
,,,        ;
1CB3,A3,HS1,HS1:    INC     DPTR            ;BUMP TO NEXT CHARACTER
1CB4,80 E6,,        SJMP    HEXSC1          ;LOOP
,,,        ;
1CB6,,HEX_CHECK,HEX_CHECK:      ;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
,,,        ;
1CB6,C2 E5,,        CLR     ACC.5           ;WASTE LOWER CASE
1CB8,B4 47 00,,        CJNE    A,#'F'+1,$+3    ;SEE IF F OR LESS
1CBB,40 01,,        JC      HC1
1CBD,22,,        RET
,,,        ;
1CBE,B4 41 00,HC1,HC1:    CJNE    A,#'A',$+3      ;SEE IF A OR GREATER
1CC1,B3,,        CPL     C
1CC2,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;
1CC3,,PUSHR2R0,PUSHR2R0:
,,,        ;
1CC3,7B 00,,        MOV     R3,#HIGH CONVT  ;CONVERSION LOCATION
1CC5,79 58,,        MOV     R1,#LOW CONVT
1CC7,F1 04,,        ACALL   CONVERT_BINARY_TO_ASCII_STRING
1CC9,74 0D,,        MOV     A,#0DH          ;A CR TO TERMINATE
1CCB,F3,,        MOVX    @R1,A           ;SAVE THE CR
1CCC,90 00 58,,        MOV     DPTR,#CONVT
,,,        ;
,,,        ; Falls thru to FLOATING INPUT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
1CCF,,FLOATING_POINT_INPUT,FLOATING_POINT_INPUT:   ; Input a floating point number pointed to by
,,,                        ; the DPTR
,,,        ;
,,,        ;***************************************************************
,,,        ;
1CCF,71 BF,,        ACALL   FP_CLEAR        ;CLEAR EVERYTHING
1CD1,B1 6C,,        ACALL   GET_DPTR_CHARACTER
1CD3,B1 72,,        ACALL   PLUS_MINUS_TEST
1CD5,92 78,,        MOV     MSIGN,C         ;SAVE THE MANTISSA SIGN
,,,        ;
,,,        ; Now, set up for input loop
,,,        ;
1CD7,78 34,,        MOV     R0,#FP_ACCC
1CD9,7E 7F,,        MOV     R6,#7FH         ;BASE EXPONENT
1CDB,D2 D5,,        SETB    F0              ;SET INITIAL FLAG
,,,        ;
1CDD,F1 EB,INLOOP,INLOOP: ACALL   GET_DIGIT_CHECK
1CDF,50 07,,        JNC     GTEST           ;IF NOT A CHARACTER, WHAT IS IT?
1CE1,54 0F,,        ANL     A,#0FH          ;STRIP ASCII
1CE3,B1 45,,        ACALL   STDIG           ;STORE THE DIGITS
,,,        ;
1CE5,A3,INLPIK,INLPIK: INC     DPTR            ;BUMP POINTER FOR LOOP
1CE6,80 F5,,        SJMP    INLOOP          ;LOOP FOR INPUT
,,,        ;
1CE8,B4 2E 0C,GTEST,GTEST:  CJNE    A,#'.',GT1      ;SEE IF A RADIX
1CEB,20 51 63,,        JB      FOUND_RADIX,INERR
1CEE,D2 51,,        SETB    FOUND_RADIX
1CF0,B8 34 F2,,        CJNE    R0,#FP_ACCC,INLPIK
1CF3,D2 52,,        SETB    FIRST_RADIX     ;SET IF FIRST RADIX
1CF5,80 EE,,        SJMP    INLPIK          ;GET ADDITIONAL DIGITS
,,,        ;
1CF7,20 D5 57,GT1,GT1:    JB      F0,INERR        ;ERROR IF NOT CLEARED
1CFA,B4 65 02,,        CJNE    A,#'e',$+5      ;CHECK FOR LOWER CASE
1CFD,80 03,,        SJMP    $+5
1CFF,B4 45 33,,        CJNE    A,#'E',FINISH_UP
1D02,B1 6B,,        ACALL   INC_AND_GET_DPTR_CHARACTER
1D04,B1 72,,        ACALL   PLUS_MINUS_TEST
1D06,92 50,,        MOV     XSIGN,C         ;SAVE SIGN STATUS
1D08,F1 EB,,        ACALL   GET_DIGIT_CHECK
1D0A,50 45,,        JNC     INERR
,,,        ;
1D0C,54 0F,,        ANL     A,#0FH          ;STRIP ASCII BIAS OFF THE CHARACTER
1D0E,FD,,        MOV     R5,A            ;SAVE THE CHARACTER IN R5
,,,        ;
1D0F,A3,GT2,GT2:    INC     DPTR
1D10,F1 EB,,        ACALL   GET_DIGIT_CHECK
1D12,50 0D,,        JNC     FINISH1
1D14,54 0F,,        ANL     A,#0FH          ;STRIP OFF BIAS
1D16,CD,,        XCH     A,R5            ;GET THE LAST DIGIT
1D17,75 F0 0A,,        MOV     B,#10           ;MULTIPLY BY TEN
1D1A,A4,,        MUL     AB
1D1B,2D,,        ADD     A,R5            ;ADD TO ORIGINAL VALUE
1D1C,FD,,        MOV     R5,A            ;SAVE IN R5
1D1D,50 F0,,        JNC     GT2             ;LOOP IF NO CARRY
1D1F,7D FF,,        MOV     R5,#0FFH        ;FORCE AN ERROR
,,,        ;
1D21,ED,FINISH1,FINISH1:MOV     A,R5            ;GET THE SIGN
1D22,30 50 09,,        JNB     XSIGN,POSNUM    ;SEE IF EXPONENT IS POS OR NEG
1D25,C3,,        CLR     C
1D26,9E,,        SUBB    A,R6
1D27,F4,,        CPL     A
1D28,04,,        INC     A
1D29,40 09,,        JC      FINISH2
1D2B,74 01,,        MOV     A,#01H
1D2D,22,,        RET
,,,        ;
1D2E,2E,POSNUM,POSNUM: ADD     A,R6            ;ADD TO EXPONENT
1D2F,50 03,,        JNC     FINISH2
,,,        ;
1D31,74 02,POSNM1,POSNM1: MOV     A,#02H
1D33,22,,        RET
,,,        ;
1D34,CE,FINISH2,FINISH2:XCH     A,R6            ;SAVE THE EXPONENT
,,,        ;
1D35,,FINISH_UP,FINISH_UP:
,,,        ;
1D35,8E 30,,        MOV     FP_EXP,R6       ;SAVE EXPONENT
1D37,B8 34 02,,        CJNE    R0,#FP_ACCC,$+5
1D3A,71 BF,,        ACALL   FP_CLEAR        ;CLEAR THE MEMORY IF 0
1D3C,E5 09,,        MOV     A,ARG_STACK     ;GET THE ARG STACK
1D3E,C3,,        CLR     C
1D3F,94 0C,,        SUBB    A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
1D41,F5 09,,        MOV     ARG_STACK,A     ;ADJUST FOR STORE
1D43,61 30,,        AJMP    PACK
,,,        ;
1D45,C2 D5,STDIG,STDIG:  CLR     F0              ;CLEAR INITIAL DESIGNATOR
1D47,70 0B,,        JNZ     STDIG1          ;CONTINUE IF NOT ZERO
1D49,B8 34 08,,        CJNE    R0,#FP_ACCC,STDIG1
1D4C,30 52 04,,        JNB     FIRST_RADIX,RET_X
,,,        ;
1D4F,DE 02,DECX,DECX:   DJNZ    R6,RET_X
,,,        ;
1D51,74 FF,INERR,INERR:  MOV     A,#0FFH
,,,        ;
1D53,22,RET_X,RET_X:  RET
,,,        ;
1D54,20 53 02,STDIG1,STDIG1: JB      DONE_LOAD,FRTEST
1D57,C2 52,,        CLR     FIRST_RADIX
,,,        ;
1D59,20 52 F3,FRTEST,FRTEST: JB      FIRST_RADIX,DECX
,,,        ;
1D5C,20 51 01,FDTEST,FDTEST: JB      FOUND_RADIX,FDT1
1D5F,0E,,        INC     R6
,,,        ;
1D60,20 53 F0,FDT1,FDT1:   JB      DONE_LOAD,RET_X
1D63,B8 3D 02,,        CJNE    R0,#FP_ACC8+1,FDT2
1D66,D2 53,,        SETB    DONE_LOAD
,,,        ;
1D68,F6,FDT2,FDT2:   MOV     @R0,A           ;SAVE THE STRIPPED ACCUMULATOR
1D69,08,,        INC     R0              ;BUMP THE POINTER
1D6A,22,,        RET                     ;EXIT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
,,,        ; I/O utilities
,,,        ;
,,,        ;***************************************************************
,,,        ;
1D6B,,INC_AND_GET_DPTR_CHARACTER,INC_AND_GET_DPTR_CHARACTER:
,,,        ;
1D6B,A3,,        INC     DPTR
,,,        ;
1D6C,,GET_DPTR_CHARACTER,GET_DPTR_CHARACTER:
,,,        ;
1D6C,E0,,        MOVX    A,@DPTR         ;GET THE CHARACTER
1D6D,B4 20 16,,        CJNE    A,#' ',PMT1     ;SEE IF A SPACE
,,,        ;
,,,        ; Kill spaces
,,,        ;
1D70,80 F9,,        SJMP    INC_AND_GET_DPTR_CHARACTER
,,,        ;
1D72,,PLUS_MINUS_TEST,PLUS_MINUS_TEST:
,,,        ;
1D72,B4 E3 02,,        CJNE    A,#0E3H,$+5     ;SEE IF A PLUS, PLUS TOKEN FROM BASIC
1D75,80 0E,,        SJMP    PMT3
1D77,B4 2B 02,,        CJNE    A,#'+',$+5
1D7A,80 09,,        SJMP    PMT3
1D7C,B4 E5 02,,        CJNE    A,#0E5H,$+5     ;SEE IF MINUS, MINUS TOKEN FROM BASIC
1D7F,80 03,,        SJMP    PMT2
1D81,B4 2D 02,,        CJNE    A,#'-',PMT1
,,,        ;
1D84,D3,PMT2,PMT2:   SETB    C
,,,        ;
1D85,A3,PMT3,PMT3:   INC     DPTR
,,,        ;
1D86,22,PMT1,PMT1:   RET
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
1D87,,FLOATING_POINT_OUTPUT,FLOATING_POINT_OUTPUT:  ; Output the number, format is in location 23
,,,        ;
,,,        ; 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
,,,        ;
,,,        ;***************************************************************
,,,        ;
1D87,91 77,,        ACALL   MDES1           ;GET THE NUMBER TO OUTPUT, R0 IS POINTER
1D89,31 C9,,        ACALL   POP_AND_EXIT    ;OUTPUT POPS THE STACK
1D8B,EF,,        MOV     A,R7
1D8C,FE,,        MOV     R6,A            ;PUT THE EXPONENT IN R6
1D8D,71 8B,,        ACALL   UNPACK_R0       ;UNPACK THE NUMBER
1D8F,78 2B,,        MOV     R0,#FP_NIB1     ;POINT AT THE NUMBER
1D91,E5 17,,        MOV     A,FORMAT        ;GET THE FORMAT
1D93,FB,,        MOV     R3,A            ;SAVE IN CASE OF EXP FORMAT
1D94,60 49,,        JZ      FREE            ;FREE FLOATING?
1D96,B4 F0 00,,        CJNE    A,#0F0H,$+3     ;SEE IF EXPONENTIAL
1D99,50 73,,        JNC     EXPOUT
,,,        ;
,,,        ; If here, must be integer USING format
,,,        ;
1D9B,EE,,        MOV     A,R6            ;GET THE EXPONENT
1D9C,70 02,,        JNZ     $+4
1D9E,7E 80,,        MOV     R6,#80H
1DA0,EB,,        MOV     A,R3            ;GET THE FORMAT
1DA1,C4,,        SWAP    A               ;SPLIT INTEGER AND FRACTION
1DA2,54 0F,,        ANL     A,#0FH
1DA4,FA,,        MOV     R2,A            ;SAVE INTEGER
1DA5,D1 74,,        ACALL   NUM_LT          ;GET THE NUMBER OF INTEGERS
1DA7,CA,,        XCH     A,R2            ;FLIP FOR SUBB
1DA8,C3,,        CLR     C
1DA9,9A,,        SUBB    A,R2
1DAA,FF,,        MOV     R7,A
1DAB,50 06,,        JNC     $+8
1DAD,7D 3F,,        MOV     R5,#'?'         ;OUTPUT A QUESTION MARK
1DAF,D1 A9,,        ACALL   SOUT1           ;NUMBER IS TOO LARGE FOR FORMAT
1DB1,A1 DF,,        AJMP    FREE
1DB3,BA 00 07,,        CJNE    R2,#00,USING0   ;SEE IF ZERO
1DB6,1F,,        DEC     R7
1DB7,D1 96,,        ACALL   SS7
1DB9,D1 A3,,        ACALL   ZOUT            ;OUTPUT A ZERO
1DBB,80 06,,        SJMP    USING1
,,,        ;
1DBD,D1 96,USING0,USING0: ACALL   SS7             ;OUTPUT SPACES, IF NEED TO
1DBF,EA,,        MOV     A,R2            ;OUTPUT DIGITS
1DC0,FF,,        MOV     R7,A
1DC1,D1 58,,        ACALL   OUTR0
,,,        ;
1DC3,EB,USING1,USING1: MOV     A,R3
1DC4,54 0F,,        ANL     A,#0FH          ;GET THE NUMBER RIGHT OF DP
1DC6,FA,,        MOV     R2,A            ;SAVE IT
1DC7,60 BD,,        JZ      PMT1            ;EXIT IF ZERO
1DC9,D1 9F,,        ACALL   ROUT            ;OUTPUT DP
1DCB,D1 7D,,        ACALL   NUM_RT
1DCD,B5 02 03,,        CJNE    A,2,USINGX      ;COMPARE A TO R2
,,,        ;
1DD0,EA,USINGY,USINGY: MOV     A,R2
1DD1,C1 8D,,        AJMP    Z7R7
,,,        ;
1DD3,50 FB,USINGX,USINGX: JNC     USINGY
,,,        ;
1DD5,CA,USING2,USING2: XCH     A,R2
1DD6,C3,,        CLR     C
1DD7,9A,,        SUBB    A,R2
1DD8,CA,,        XCH     A,R2
1DD9,D1 8D,,        ACALL   Z7R7            ;OUTPUT ZEROS IF NEED TO
1DDB,EA,,        MOV     A,R2
1DDC,FF,,        MOV     R7,A
1DDD,C1 58,,        AJMP    OUTR0
,,,        ;
,,,        ; First, force exponential output, if need to
,,,        ;
1DDF,EE,FREE,FREE:   MOV     A,R6            ;GET THE EXPONENT
1DE0,70 04,,        JNZ     FREE1           ;IF ZERO, PRINT IT
1DE2,D1 A7,,        ACALL   SOUT
1DE4,C1 A3,,        AJMP    ZOUT
,,,        ;
1DE6,7B F0,FREE1,FREE1:  MOV     R3,#0F0H        ;IN CASE EXP NEEDED
1DE8,74 77,,        MOV     A,#80H-DIGIT-DIGIT-1
1DEA,2E,,        ADD     A,R6
1DEB,40 21,,        JC      EXPOUT
1DED,94 F7,,        SUBB    A,#0F7H
1DEF,40 1D,,        JC      EXPOUT
,,,        ;
,,,        ; Now, just print the number
,,,        ;
1DF1,D1 98,,        ACALL   SINOUT          ;PRINT THE SIGN OF THE NUMBER
1DF3,D1 74,,        ACALL   NUM_LT          ;GET THE NUMBER LEFT OF DP
1DF5,B4 08 02,,        CJNE    A,#8,FREE4
1DF8,C1 58,,        AJMP    OUTR0
,,,        ;
1DFA,D1 58,FREE4,FREE4:  ACALL   OUTR0
1DFC,D1 6A,,        ACALL   ZTEST           ;TEST FOR TRAILING ZEROS
1DFE,60 57,,        JZ      U_RET           ;DONE IF ALL TRAILING ZEROS
1E00,D1 9F,,        ACALL   ROUT            ;OUTPUT RADIX
,,,        ;
1E02,7F 01,FREE2,FREE2:  MOV     R7,#1           ;OUTPUT ONE DIGIT
1E04,D1 58,,        ACALL   OUTR0
1E06,70 4F,,        JNZ     U_RET
1E08,D1 6A,,        ACALL   ZTEST
1E0A,60 4B,,        JZ      U_RET
1E0C,80 F4,,        SJMP    FREE2           ;LOOP
,,,        ;
1E0E,D1 98,EXPOUT,EXPOUT: ACALL   SINOUT          ;PRINT THE SIGN
1E10,7F 01,,        MOV     R7,#1           ;OUTPUT ONE CHARACTER
1E12,D1 58,,        ACALL   OUTR0

⌨️ 快捷键说明

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