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

📄 fp52.sdi

📁 proteus6.9 sp4 上
💻 SDI
📖 第 1 页 / 共 5 页
字号:
,,,        ;
0302,,LOADR1_MANTISSA,LOADR1_MANTISSA:
,,,        ;
,,,        ; Load the mantissa of R0 into FP_Digits
,,,        ;
,,,        ;***************************************************************
,,,        ;
0302,C0 00,,        PUSH    R0B0            ;SAVE REGISTER 1
0304,78 2E,,        MOV     R0,#FP_DIG78    ;SET UP THE POINTER
,,,        ;
0306,E3,LOADR1,LOADR1: MOVX    A,@R1
0307,F6,,        MOV     @R0,A
0308,19,,        DEC     R1
0309,18,,        DEC     R0
030A,B8 2A F9,,        CJNE    R0,#FP_CARRY,LOADR1
,,,        ;
030D,D0 00,,        POP     R0B0
030F,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
0310,,HEXSCAN,HEXSCAN:        ; Scan a string to determine if it is a hex number
,,,                ; set carry if hex, else carry = 0
,,,        ;
,,,        ;***************************************************************
,,,        ;
0310,71 E6,,        ACALL   GET_DPTR_CHARACTER
0312,C0 83,,        PUSH    DPH
0314,C0 82,,        PUSH    DPL             ;SAVE THE POINTER
,,,        ;
0316,E0,HEXSC1,HEXSC1: MOVX    A,@DPTR         ;GET THE CHARACTER
0317,B1 F4,,        ACALL   DIGIT_CHECK     ;SEE IF A DIGIT
0319,40 12,,        JC      HS1             ;CONTINUE IF A DIGIT
031B,71 30,,        ACALL   HEX_CHECK       ;SEE IF HEX
031D,40 0E,,        JC      HS1
,,,        ;
031F,C2 E5,,        CLR     ACC.5           ;NO LOWER CASE
0321,B4 48 03,,        CJNE    A,#'H',HEXDON
0324,D3,,        SETB    C
0325,80 01,,        SJMP    HEXDO1          ;NUMBER IS VALID HEX, MAYBE
,,,        ;
0327,C3,HEXDON,HEXDON: CLR     C
,,,        ;
0328,D0 82,HEXDO1,HEXDO1: POP     DPL             ;RESTORE POINTER
032A,D0 83,,        POP     DPH
032C,22,,        RET
,,,        ;
032D,A3,HS1,HS1:    INC     DPTR            ;BUMP TO NEXT CHARACTER
032E,80 E6,,        SJMP    HEXSC1          ;LOOP
,,,        ;
0330,,HEX_CHECK,HEX_CHECK:      ;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
,,,        ;
0330,C2 E5,,        CLR     ACC.5           ;WASTE LOWER CASE
0332,B4 47 00,,        CJNE    A,#'F'+1,$+3    ;SEE IF F OR LESS
0335,40 01,,        JC      HC1
0337,22,,        RET
,,,        ;
0338,B4 41 00,HC1,HC1:    CJNE    A,#'A',$+3      ;SEE IF A OR GREATER
033B,B3,,        CPL     C
033C,22,,        RET
,,,        ;
,,,$EJECT
,,,        ;
033D,,PUSHR2R0,PUSHR2R0:
,,,        ;
033D,7B 00,,        MOV     R3,#HIGH CONVT  ;CONVERSION LOCATION
033F,79 48,,        MOV     R1,#LOW CONVT
0341,B1 7E,,        ACALL   CONVERT_BINARY_TO_ASCII_STRING
0343,74 0D,,        MOV     A,#0DH          ;A CR TO TERMINATE
0345,F3,,        MOVX    @R1,A           ;SAVE THE CR
0346,90 00 48,,        MOV     DPTR,#CONVT
,,,        ;
,,,        ; Falls thru to FLOATING INPUT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
0349,,FLOATING_POINT_INPUT,FLOATING_POINT_INPUT:   ; Input a floating point number pointed to by
,,,                        ; the DPTR
,,,        ;
,,,        ;***************************************************************
,,,        ;
0349,51 39,,        ACALL   FP_CLEAR        ;CLEAR EVERYTHING
034B,71 E6,,        ACALL   GET_DPTR_CHARACTER
034D,71 EC,,        ACALL   PLUS_MINUS_TEST
034F,92 78,,        MOV     MSIGN,C         ;SAVE THE MANTISSA SIGN
,,,        ;
,,,        ; Now, set up for input loop
,,,        ;
0351,78 34,,        MOV     R0,#FP_ACCC
0353,7E 7F,,        MOV     R6,#7FH         ;BASE EXPONENT
0355,D2 D5,,        SETB    F0              ;SET INITIAL FLAG
,,,        ;
0357,B1 F2,INLOOP,INLOOP: ACALL   GET_DIGIT_CHECK
0359,50 07,,        JNC     GTEST           ;IF NOT A CHARACTER, WHAT IS IT?
035B,54 0F,,        ANL     A,#0FH          ;STRIP ASCII
035D,71 BF,,        ACALL   STDIG           ;STORE THE DIGITS
,,,        ;
035F,A3,INLPIK,INLPIK: INC     DPTR            ;BUMP POINTER FOR LOOP
0360,80 F5,,        SJMP    INLOOP          ;LOOP FOR INPUT
,,,        ;
0362,B4 2E 0C,GTEST,GTEST:  CJNE    A,#'.',GT1      ;SEE IF A RADIX
0365,20 51 63,,        JB      FOUND_RADIX,INERR
0368,D2 51,,        SETB    FOUND_RADIX
036A,B8 34 F2,,        CJNE    R0,#FP_ACCC,INLPIK
036D,D2 52,,        SETB    FIRST_RADIX     ;SET IF FIRST RADIX
036F,80 EE,,        SJMP    INLPIK          ;GET ADDITIONAL DIGITS
,,,        ;
0371,20 D5 57,GT1,GT1:    JB      F0,INERR        ;ERROR IF NOT CLEARED
0374,B4 65 02,,        CJNE    A,#'e',$+5      ;CHECK FOR LOWER CASE
0377,80 03,,        SJMP    $+5
0379,B4 45 33,,        CJNE    A,#'E',FINISH_UP
037C,71 E5,,        ACALL   INC_AND_GET_DPTR_CHARACTER
037E,71 EC,,        ACALL   PLUS_MINUS_TEST
0380,92 50,,        MOV     XSIGN,C         ;SAVE SIGN STATUS
0382,B1 F2,,        ACALL   GET_DIGIT_CHECK
0384,50 45,,        JNC     INERR
,,,        ;
0386,54 0F,,        ANL     A,#0FH          ;STRIP ASCII BIAS OFF THE CHARACTER
0388,FD,,        MOV     R5,A            ;SAVE THE CHARACTER IN R5
,,,        ;
0389,A3,GT2,GT2:    INC     DPTR
038A,B1 F2,,        ACALL   GET_DIGIT_CHECK
038C,50 0D,,        JNC     FINISH1
038E,54 0F,,        ANL     A,#0FH          ;STRIP OFF BIAS
0390,CD,,        XCH     A,R5            ;GET THE LAST DIGIT
0391,75 F0 0A,,        MOV     B,#10           ;MULTIPLY BY TEN
0394,A4,,        MUL     AB
0395,2D,,        ADD     A,R5            ;ADD TO ORIGINAL VALUE
0396,FD,,        MOV     R5,A            ;SAVE IN R5
0397,50 F0,,        JNC     GT2             ;LOOP IF NO CARRY
0399,7D FF,,        MOV     R5,#0FFH        ;FORCE AN ERROR
,,,        ;
039B,ED,FINISH1,FINISH1:MOV     A,R5            ;GET THE SIGN
039C,30 50 09,,        JNB     XSIGN,POSNUM    ;SEE IF EXPONENT IS POS OR NEG
039F,C3,,        CLR     C
03A0,9E,,        SUBB    A,R6
03A1,F4,,        CPL     A
03A2,04,,        INC     A
03A3,40 09,,        JC      FINISH2
03A5,74 01,,        MOV     A,#01H
03A7,22,,        RET
,,,        ;
03A8,2E,POSNUM,POSNUM: ADD     A,R6            ;ADD TO EXPONENT
03A9,50 03,,        JNC     FINISH2
,,,        ;
03AB,74 02,POSNM1,POSNM1: MOV     A,#02H
03AD,22,,        RET
,,,        ;
03AE,CE,FINISH2,FINISH2:XCH     A,R6            ;SAVE THE EXPONENT
,,,        ;
03AF,,FINISH_UP,FINISH_UP:
,,,        ;
03AF,8E 30,,        MOV     FP_EXP,R6       ;SAVE EXPONENT
03B1,B8 34 02,,        CJNE    R0,#FP_ACCC,$+5
03B4,51 39,,        ACALL   FP_CLEAR        ;CLEAR THE MEMORY IF 0
03B6,E5 24,,        MOV     A,ARG_STACK     ;GET THE ARG STACK
03B8,C3,,        CLR     C
03B9,94 0C,,        SUBB    A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
03BB,F5 24,,        MOV     ARG_STACK,A     ;ADJUST FOR STORE
03BD,21 AA,,        AJMP    PACK
,,,        ;
03BF,C2 D5,STDIG,STDIG:  CLR     F0              ;CLEAR INITIAL DESIGNATOR
03C1,70 0B,,        JNZ     STDIG1          ;CONTINUE IF NOT ZERO
03C3,B8 34 08,,        CJNE    R0,#FP_ACCC,STDIG1
03C6,30 52 04,,        JNB     FIRST_RADIX,RET_X
,,,        ;
03C9,DE 02,DECX,DECX:   DJNZ    R6,RET_X
,,,        ;
03CB,74 FF,INERR,INERR:  MOV     A,#0FFH
,,,        ;
03CD,22,RET_X,RET_X:  RET
,,,        ;
03CE,20 53 02,STDIG1,STDIG1: JB      DONE_LOAD,FRTEST
03D1,C2 52,,        CLR     FIRST_RADIX
,,,        ;
03D3,20 52 F3,FRTEST,FRTEST: JB      FIRST_RADIX,DECX
,,,        ;
03D6,20 51 01,FDTEST,FDTEST: JB      FOUND_RADIX,FDT1
03D9,0E,,        INC     R6
,,,        ;
03DA,20 53 F0,FDT1,FDT1:   JB      DONE_LOAD,RET_X
03DD,B8 3D 02,,        CJNE    R0,#FP_ACC8+1,FDT2
03E0,D2 53,,        SETB    DONE_LOAD
,,,        ;
03E2,F6,FDT2,FDT2:   MOV     @R0,A           ;SAVE THE STRIPPED ACCUMULATOR
03E3,08,,        INC     R0              ;BUMP THE POINTER
03E4,22,,        RET                     ;EXIT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
,,,        ; I/O utilities
,,,        ;
,,,        ;***************************************************************
,,,        ;
03E5,,INC_AND_GET_DPTR_CHARACTER,INC_AND_GET_DPTR_CHARACTER:
,,,        ;
03E5,A3,,        INC     DPTR
,,,        ;
03E6,,GET_DPTR_CHARACTER,GET_DPTR_CHARACTER:
,,,        ;
03E6,E0,,        MOVX    A,@DPTR         ;GET THE CHARACTER
03E7,B4 20 16,,        CJNE    A,#' ',PMT1     ;SEE IF A SPACE
,,,        ;
,,,        ; Kill spaces
,,,        ;
03EA,80 F9,,        SJMP    INC_AND_GET_DPTR_CHARACTER
,,,        ;
03EC,,PLUS_MINUS_TEST,PLUS_MINUS_TEST:
,,,        ;
03EC,B4 E3 02,,        CJNE    A,#0E3H,$+5     ;SEE IF A PLUS, PLUS TOKEN FROM BASIC
03EF,80 0E,,        SJMP    PMT3
03F1,B4 2B 02,,        CJNE    A,#'+',$+5
03F4,80 09,,        SJMP    PMT3
03F6,B4 E5 02,,        CJNE    A,#0E5H,$+5     ;SEE IF MINUS, MINUS TOKEN FROM BASIC
03F9,80 03,,        SJMP    PMT2
03FB,B4 2D 02,,        CJNE    A,#'-',PMT1
,,,        ;
03FE,D3,PMT2,PMT2:   SETB    C
,,,        ;
03FF,A3,PMT3,PMT3:   INC     DPTR
,,,        ;
0400,22,PMT1,PMT1:   RET
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
0401,,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
,,,        ;
,,,        ;***************************************************************
,,,        ;
0401,51 F1,,        ACALL   MDES1           ;GET THE NUMBER TO OUTPUT, R0 IS POINTER
0403,11 42,,        ACALL   POP_AND_EXIT    ;OUTPUT POPS THE STACK
0405,EF,,        MOV     A,R7
0406,FE,,        MOV     R6,A            ;PUT THE EXPONENT IN R6
0407,51 05,,        ACALL   UNPACK_R0       ;UNPACK THE NUMBER
0409,78 2B,,        MOV     R0,#FP_NIB1     ;POINT AT THE NUMBER
040B,E5 25,,        MOV     A,FORMAT        ;GET THE FORMAT
040D,FB,,        MOV     R3,A            ;SAVE IN CASE OF EXP FORMAT
040E,60 49,,        JZ      FREE            ;FREE FLOATING?
0410,B4 F0 00,,        CJNE    A,#0F0H,$+3     ;SEE IF EXPONENTIAL
0413,50 73,,        JNC     EXPOUT
,,,        ;
,,,        ; If here, must be integer USING format
,,,        ;
0415,EE,,        MOV     A,R6            ;GET THE EXPONENT
0416,70 02,,        JNZ     $+4
0418,7E 80,,        MOV     R6,#80H
041A,EB,,        MOV     A,R3            ;GET THE FORMAT
041B,C4,,        SWAP    A               ;SPLIT INTEGER AND FRACTION
041C,54 0F,,        ANL     A,#0FH
041E,FA,,        MOV     R2,A            ;SAVE INTEGER
041F,91 EE,,        ACALL   NUM_LT          ;GET THE NUMBER OF INTEGERS
0421,CA,,        XCH     A,R2            ;FLIP FOR SUBB
0422,C3,,        CLR     C
0423,9A,,        SUBB    A,R2
0424,FF,,        MOV     R7,A
0425,50 06,,        JNC     $+8
0427,7D 3F,,        MOV     R5,#'?'         ;OUTPUT A QUESTION MARK
0429,B1 23,,        ACALL   SOUT1           ;NUMBER IS TOO LARGE FOR FORMAT
042B,81 59,,        AJMP    FREE
042D,BA 00 07,,        CJNE    R2,#00,USING0   ;SEE IF ZERO
0430,1F,,        DEC     R7
0431,B1 10,,        ACALL   SS7
0433,B1 1D,,        ACALL   ZOUT            ;OUTPUT A ZERO
0435,80 06,,        SJMP    USING1
,,,        ;
0437,B1 10,USING0,USING0: ACALL   SS7             ;OUTPUT SPACES, IF NEED TO
0439,EA,,        MOV     A,R2            ;OUTPUT DIGITS
043A,FF,,        MOV     R7,A
043B,91 D2,,        ACALL   OUTR0
,,,        ;
043D,EB,USING1,USING1: MOV     A,R3
043E,54 0F,,        ANL     A,#0FH          ;GET THE NUMBER RIGHT OF DP
0440,FA,,        MOV     R2,A            ;SAVE IT
0441,60 BD,,        JZ      PMT1            ;EXIT IF ZERO
0443,B1 19,,        ACALL   ROUT            ;OUTPUT DP
0445,91 F7,,        ACALL   NUM_RT
0447,B5 02 03,,        CJNE    A,2,USINGX      ;COMPARE A TO R2
,,,        ;
044A,EA,USINGY,USINGY: MOV     A,R2
044B,A1 07,,        AJMP    Z7R7
,,,        ;
044D,50 FB,USINGX,USINGX: JNC     USINGY
,,,        ;
044F,CA,USING2,USING2: XCH     A,R2
0450,C3,,        CLR     C
0451,9A,,        SUBB    A,R2
0452,CA,,        XCH     A,R2
0453,B1 07,,        ACALL   Z7R7            ;OUTPUT ZEROS IF NEED TO
0455,EA,,        MOV     A,R2
0456,FF,,        MOV     R7,A
0457,81 D2,,        AJMP    OUTR0
,,,        ;
,,,        ; First, force exponential output, if need to
,,,        ;
0459,EE,FREE,FREE:   MOV     A,R6            ;GET THE EXPONENT
045A,70 04,,        JNZ     FREE1           ;IF ZERO, PRINT IT
045C,B1 21,,        ACALL   SOUT
045E,A1 1D,,        AJMP    ZOUT
,,,        ;
0460,7B F0,FREE1,FREE1:  MOV     R3,#0F0H        ;IN CASE EXP NEEDED
0462,74 77,,        MOV     A,#80H-DIGIT-DIGIT-1
0464,2E,,        ADD     A,R6
0465,40 21,,        JC      EXPOUT
0467,94 F7,,        SUBB    A,#0F7H
0469,40 1D,,        JC      EXPOUT
,,,        ;
,,,        ; Now, just print the number
,,,        ;
046B,B1 12,,        ACALL   SINOUT          ;PRINT THE SIGN OF THE NUMBER
046D,91 EE,,        ACALL   NUM_LT          ;GET THE NUMBER LEFT OF DP

⌨️ 快捷键说明

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