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

📄 fp-52.sdi

📁 proteus 仿真实例, 使用了proteus大部分元件
💻 SDI
📖 第 1 页 / 共 5 页
字号:
1E14,D1 9F,,        ACALL   ROUT            ;OUTPUT RADIX
1E16,EB,,        MOV     A,R3            ;GET FORMAT
1E17,54 0F,,        ANL     A,#0FH          ;STRIP INDICATOR
1E19,60 06,,        JZ      EXPOTX
,,,        ;
1E1B,FF,,        MOV     R7,A            ;OUTPUT THE NUMBER OF DIGITS
1E1C,1F,,        DEC     R7              ;ADJUST BECAUSE ONE CHAR ALREADY OUT
1E1D,D1 58,,        ACALL   OUTR0
1E1F,80 02,,        SJMP    EXPOT4
,,,        ;
1E21,D1 02,EXPOTX,EXPOTX: ACALL   FREE2           ;OUTPUT UNTIL TRAILING ZEROS
,,,        ;
1E23,D1 A7,EXPOT4,EXPOT4: ACALL   SOUT            ;OUTPUT A SPACE
1E25,7D 45,,        MOV     R5,#'E'
1E27,D1 A9,,        ACALL   SOUT1           ;OUTPUT AN E
1E29,EE,,        MOV     A,R6            ;GET THE EXPONENT
1E2A,60 04,,        JZ      XOUT0           ;EXIT IF ZERO
1E2C,14,,        DEC     A               ;ADJUST FOR THE DIGIT ALREADY OUTPUT
1E2D,B4 80 05,,        CJNE    A,#80H,XOUT2    ;SEE WHAT IT IS
,,,        ;
1E30,D1 A7,XOUT0,XOUT0:  ACALL   SOUT
1E32,E4,,        CLR     A
1E33,80 0C,,        SJMP    XOUT4
,,,        ;
1E35,40 06,XOUT2,XOUT2:  JC      XOUT3           ;NEGATIVE EXPONENT
1E37,7D 2B,,        MOV     R5,#'+'         ;OUTPUT A PLUS SIGN
1E39,D1 A9,,        ACALL   SOUT1
1E3B,80 04,,        SJMP    XOUT4
,,,        ;
1E3D,D1 9B,XOUT3,XOUT3:  ACALL   MOUT
1E3F,F4,,        CPL     A               ;FLIP BITS
1E40,04,,        INC     A               ;BUMP
,,,        ;
1E41,C2 E7,XOUT4,XOUT4:  CLR     ACC.7
1E43,F8,,        MOV     R0,A
1E44,7A 00,,        MOV     R2,#0
1E46,79 58,,        MOV     R1,#LOW CONVT   ;CONVERSION LOCATION
1E48,7B 00,,        MOV     R3,#HIGH CONVT
1E4A,F1 04,,        ACALL   CONVERT_BINARY_TO_ASCII_STRING
1E4C,78 58,,        MOV     R0,#LOW CONVT   ;NOW, OUTPUT EXPONENT
,,,        ;
1E4E,E2,EXPOT5,EXPOT5: MOVX    A,@R0           ;GET THE CHARACTER
1E4F,FD,,        MOV     R5,A            ;OUTPUT IT
1E50,D1 A9,,        ACALL   SOUT1
1E52,08,,        INC     R0              ;BUMP THE POINTER
1E53,E8,,        MOV     A,R0            ;GET THE POINTER
1E54,B5 01 F7,,        CJNE    A,R1B0,EXPOT5   ;LOOP
,,,        ;
1E57,22,U_RET,U_RET:  RET                     ;EXIT
,,,        ;
1E58,,OUTR0,OUTR0:  ; Output the characters pointed to by R0, also bias ascii
,,,        ;
1E58,EF,,        MOV     A,R7            ;GET THE COUNTER
1E59,60 0E,,        JZ      OUTR            ;EXIT IF DONE
1E5B,E6,,        MOV     A,@R0           ;GET THE NUMBER
1E5C,44 30,,        ORL     A,#30H          ;ASCII BIAS
1E5E,08,,        INC     R0              ;BUMP POINTER AND COUNTER
1E5F,1F,,        DEC     R7
1E60,FD,,        MOV     R5,A            ;PUT CHARACTER IN OUTPUT REGISTER
1E61,D1 A9,,        ACALL   SOUT1           ;OUTPUT THE CHARACTER
1E63,E4,,        CLR     A               ;JUST FOR TEST
1E64,B8 33 F1,,        CJNE    R0,#FP_NIB8+1,OUTR0
1E67,74 55,,        MOV     A,#55H          ;KNOW WHERE EXIT OCCURED
,,,        ;
1E69,22,OUTR,OUTR:   RET
,,,        ;
1E6A,A9 00,ZTEST,ZTEST:  MOV     R1,R0B0         ;GET POINTER REGISTER
,,,        ;
1E6C,E7,ZT0,ZT0:    MOV     A,@R1           ;GET THE VALUE
1E6D,70 04,,        JNZ     ZT1
1E6F,09,,        INC     R1              ;BUMP POINTER
1E70,B9 33 F9,,        CJNE    R1,#FP_NIB8+1,ZT0
,,,        ;
1E73,22,ZT1,ZT1:    RET
,,,        ;
1E74,EE,NUM_LT,NUM_LT: MOV     A,R6            ;GET EXPONENT
1E75,C3,,        CLR     C               ;GET READY FOR SUBB
1E76,94 80,,        SUBB    A,#80H          ;SUB EXPONENT BIAS
1E78,50 01,,        JNC     NL1             ;OK IF NO CARRY
1E7A,E4,,        CLR     A               ;NO DIGITS LEFT
,,,        ;
1E7B,FF,NL1,NL1:    MOV     R7,A            ;SAVE THE COUNT
1E7C,22,,        RET
,,,        ;
1E7D,C3,NUM_RT,NUM_RT: CLR     C               ;SUBB AGAIN
1E7E,74 80,,        MOV     A,#80H          ;EXPONENT BIAS
1E80,9E,,        SUBB    A,R6            ;GET THE BIASED EXPONENT
1E81,50 01,,        JNC     NR1
1E83,E4,,        CLR     A
,,,        ;
1E84,22,NR1,NR1:    RET                     ;EXIT
,,,        ;
1E85,EF,SPACE7,SPACE7: MOV     A,R7            ;GET THE NUMBER OF SPACES
1E86,60 FC,,        JZ      NR1             ;EXIT IF ZERO
1E88,D1 A7,,        ACALL   SOUT            ;OUTPUT A SPACE
1E8A,1F,,        DEC     R7              ;BUMP COUNTER
1E8B,80 F8,,        SJMP    SPACE7          ;LOOP
,,,        ;
1E8D,FF,Z7R7,Z7R7:   MOV     R7,A
,,,        ;
1E8E,EF,ZERO7,ZERO7:  MOV     A,R7            ;GET COUNTER
1E8F,60 F3,,        JZ      NR1             ;EXIT IF ZERO
1E91,D1 A3,,        ACALL   ZOUT            ;OUTPUT A ZERO
1E93,1F,,        DEC     R7              ;BUMP COUNTER
1E94,80 F8,,        SJMP    ZERO7           ;LOOP
,,,        ;
1E96,D1 85,SS7,SS7:    ACALL   SPACE7
,,,        ;
1E98,EC,SINOUT,SINOUT: MOV     A,R4            ;GET THE SIGN
1E99,60 0C,,        JZ      SOUT            ;OUTPUT A SPACE IF ZERO
,,,        ;
1E9B,7D 2D,MOUT,MOUT:   MOV     R5,#'-'
1E9D,80 0A,,        SJMP    SOUT1           ;OUTPUT A MINUS IF NOT
,,,        ;
1E9F,7D 2E,ROUT,ROUT:   MOV     R5,#'.'         ;OUTPUT A RADIX
1EA1,80 06,,        SJMP    SOUT1
,,,        ;
1EA3,7D 30,ZOUT,ZOUT:   MOV     R5,#'0'         ;OUTPUT A ZERO
1EA5,80 02,,        SJMP    SOUT1
,,,        ;
1EA7,7D 20,SOUT,SOUT:   MOV     R5,#' '         ;OUTPUT A SPACE
,,,        ;
1EA9,21 90,SOUT1,SOUT1:  AJMP    OUTPUT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
1EAB,,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
,,,        ;
,,,        ;***************************************************************
,,,        ;
1EAB,91 96,CASB,CASB:   ACALL   HEXSCAN         ;SEE IF HEX NUMBER
1EAD,92 23,,        MOV     ADD_IN,C        ;IF ADD_IN IS SET, THE NUMBER IS HEX
1EAF,F1 EB,,        ACALL   GET_DIGIT_CHECK
1EB1,B3,,        CPL     C               ;FLIP FOR EXIT
1EB2,40 28,,        JC      RCASB
1EB4,7B 00,,        MOV     R3,#00H         ;ZERO R3:R1 FOR LOOP
1EB6,79 00,,        MOV     R1,#00H
1EB8,80 15,,        SJMP    CASB5
,,,        ;
1EBA,A3,CASB2,CASB2:  INC     DPTR
1EBB,89 00,,        MOV     R0B0,R1         ;SAVE THE PRESENT CONVERTED VALUE
1EBD,8B 02,,        MOV     R0B0+2,R3       ;IN R2:R0
1EBF,F1 EB,,        ACALL   GET_DIGIT_CHECK
1EC1,40 0C,,        JC      CASB5
1EC3,30 23 16,,        JNB     ADD_IN,RCASB    ;CONVERSION COMPLETE
1EC6,91 B6,,        ACALL   HEX_CHECK       ;SEE IF HEX NUMBER
1EC8,40 03,,        JC      CASB4           ;PROCEED IF GOOD
1ECA,A3,,        INC     DPTR            ;BUMP PAST H
1ECB,80 0F,,        SJMP    RCASB
,,,        ;
1ECD,24 09,CASB4,CASB4:  ADD     A,#9            ;ADJUST HEX ASCII BIAS
,,,        ;
1ECF,75 F0 0A,CASB5,CASB5:  MOV     B,#10
1ED2,30 23 03,,        JNB     ADD_IN,CASB6
1ED5,75 F0 10,,        MOV     B,#16           ;HEX MODE
,,,        ;
1ED8,D1 E3,CASB6,CASB6:  ACALL   MULNUM          ;ACCUMULATE THE DIGITS
1EDA,50 DE,,        JNC     CASB2           ;LOOP IF NO CARRY
,,,        ;
1EDC,E4,RCASB,RCASB:  CLR     A               ;RESET ACC
1EDD,92 E1,,        MOV     ACC.OVERFLOW,C  ;IF OVERFLOW, SAY SO
1EDF,22,,        RET                     ;EXIT
,,,        ;
,,,$EJECT
,,,        ;
1EE0,75 F0 0A,MULNUM10,MULNUM10:MOV    B,#10
,,,        ;
,,,        ;***************************************************************
,,,        ;
1EE3,,MULNUM,MULNUM: ; Take the next digit in the acc (masked to 0FH)
,,,        ; accumulate in R3:R1
,,,        ;
,,,        ;***************************************************************
,,,        ;
1EE3,C0 E0,,        PUSH    ACC             ;SAVE ACC
1EE5,C0 F0,,        PUSH    B               ;SAVE MULTIPLIER
1EE7,E9,,        MOV     A,R1            ;PUT LOW ORDER BITS IN ACC
1EE8,A4,,        MUL     AB              ;DO THE MULTIPLY
1EE9,F9,,        MOV     R1,A            ;PUT THE RESULT BACK
1EEA,EB,,        MOV     A,R3            ;GET THE HIGH ORDER BYTE
1EEB,AB F0,,        MOV     R3,B            ;SAVE THE OVERFLOW
1EED,D0 F0,,        POP     B               ;GET THE MULTIPLIER
1EEF,A4,,        MUL     AB              ;DO IT
1EF0,A2 D2,,        MOV     C,OV            ;SAVE OVERFLOW IN F0
1EF2,92 D5,,        MOV     F0,C
1EF4,2B,,        ADD     A,R3            ;ADD OVERFLOW TO HIGH RESULT
1EF5,FB,,        MOV     R3,A            ;PUT IT BACK
1EF6,D0 E0,,        POP     ACC             ;GET THE ORIGINAL ACC BACK
1EF8,72 D5,,        ORL     C,F0            ;OR CARRY AND OVERFLOW
1EFA,40 07,,        JC      MULX            ;NO GOOD IF THE CARRY IS SET
,,,        ;
1EFC,54 0F,MUL11,MUL11:  ANL     A,#0FH          ;MASK OFF HIGH ORDER BITS
1EFE,29,,        ADD     A,R1            ;NOW ADD THE ACC
1EFF,F9,,        MOV     R1,A            ;PUT IT BACK
1F00,E4,,        CLR     A               ;PROPAGATE THE CARRY
1F01,3B,,        ADDC    A,R3
1F02,FB,,        MOV     R3,A            ;PUT IT BACK
,,,        ;
1F03,22,MULX,MULX:   RET                     ;EXIT WITH OR WITHOUT CARRY
,,,        ;
,,,        ;***************************************************************
,,,        ;
1F04,,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
,,,        ;
,,,        ;***************************************************************
,,,        ;
1F04,E4,,        CLR     A               ;NO LEADING ZEROS
1F05,90 27 10,,        MOV     DPTR,#10000     ;SUBTRACT 10000
1F08,F1 21,,        ACALL   RSUB            ;DO THE SUBTRACTION
1F0A,90 03 E8,,        MOV     DPTR,#1000      ;NOW 1000
1F0D,F1 21,,        ACALL   RSUB
1F0F,90 00 64,,        MOV     DPTR,#100       ;NOW 100
1F12,F1 21,,        ACALL   RSUB
1F14,90 00 0A,,        MOV     DPTR,#10        ;NOW 10
1F17,F1 21,,        ACALL   RSUB
1F19,90 00 01,,        MOV     DPTR,#1         ;NOW 1
1F1C,F1 21,,        ACALL   RSUB
1F1E,60 20,,        JZ      RSUB2           ;JUMP OVER RET
,,,        ;
1F20,22,RSUB_R,RSUB_R: RET
,,,        ;
1F21,7E FF,RSUB,RSUB:   MOV     R6,#-1          ;SET UP THE COUNTER
,,,        ;
1F23,0E,RSUB1,RSUB1:  INC     R6              ;BUMP THE COUNTER
1F24,CA,,        XCH     A,R2            ;DO A FAST COMPARE
1F25,B5 83 00,,        CJNE    A,DPH,$+3
1F28,CA,,        XCH     A,R2
1F29,40 12,,        JC      FAST_DONE
1F2B,C8,,        XCH     A,R0            ;GET LOW BYTE
1F2C,95 82,,        SUBB    A,DPL           ;SUBTRACT, CARRY IS CLEARED
1F2E,C8,,        XCH     A,R0            ;PUT IT BACK
1F2F,CA,,        XCH     A,R2            ;GET THE HIGH BYTE
1F30,95 83,,        SUBB    A,DPH           ;ADD THE HIGH BYTE
1F32,CA,,        XCH     A,R2            ;PUT IT BACK
1F33,50 EE,,        JNC     RSUB1           ;LOOP UNTIL CARRY
,,,        ;
1F35,C8,,        XCH     A,R0
1F36,25 82,,        ADD     A,DPL           ;RESTORE R2:R0
1F38,C8,,        XCH     A,R0
1F39,CA,,        XCH     A,R2
1F3A,35 83,,        ADDC    A,DPH
1F3C,CA,,        XCH     A,R2
,,,        ;
1F3D,,FAST_DONE,FAST_DONE:
,,,        ;
1F3D,4E,,        ORL     A,R6            ;OR THE COUNT VALUE
1F3E,60 E0,,        JZ      RSUB_R          ;RETURN IF ZERO
,,,        ;
1F40,74 30,RSUB2,RSUB2:  MOV     A,#'0'          ;GET THE ASCII BIAS
1F42,2E,,        ADD     A,R6            ;ADD THE COUNT
,,,        ;
1F43,8B A0,RSUB4,RSUB4:  MOV     P2,R3           ;SET UP P2
1F45,F3,,        MOVX    @R1,A           ;PLACE THE VALUE IN MEMORY
1F46,09,,        INC     R1
1F47,B9 00 01,,        CJNE    R1,#00H,RSUB3   ;SEE IF RAPPED AROUND
1F4A,0B,,        INC     R3              ;BUMP HIGH BYTE
,,,        ;
1F4B,22,RSUB3,RSUB3:  RET                     ;EXIT
,,,        ;
,,,$EJECT
,,,        ;***************************************************************
,,,        ;
1F4C,,HEXOUT,HEXOUT: ; Output the hex number in R3:R1, supress leading zeros, if set
,,,        ;
,,,        ;***************************************************************
,,,        ;
1F4C,D1 A7,,        ACALL   SOUT            ;OUTPUT A SPACE
1F4E,A2 36,,        MOV     C,ZSURP         ;GET ZERO SUPPRESSION BIT
1F50,92 23,,        MOV     ADD_IN,C
1F52,EB,,        MOV     A,R3            ;GET HIGH NIBBLE AND PRINT IT
1F53,F1 6F,,        ACALL   HOUTHI
1F55,EB,,        MOV     A,R3
1F56,F1 70,,        ACALL   HOUTLO
,,,        ;
1F58,C2 23,HEX2X,HEX2X:  CLR     ADD_IN          ;DON'T SUPPRESS ZEROS
1F5A,E9,,        MOV     A,R1            ;GET LOW NIBBLE AND PRINT IT
1F5B,F1 6F,,        ACALL   HOUTHI
1F5D,E9,,        MOV     A,R1
1F5E,F1 70,,        ACALL   HOUTLO
1F60,7D 48,,        MOV     R5,#'H'         ;OUTPUT H TO INDICATE HEX MODE
,,,        ;
1F62,C1 A9,SOUT_1,SOUT_1: AJMP    SOUT1
,,,        ;
1F64,C2 23,HOUT1,HOUT1:  CLR     ADD_IN          ;PRINTED SOMETHING, SO CLEAR ADD_IN
1F66,24 90,,        ADD     A,#90H          ;CONVERT TO ASCII
1F68,D4,,        DA      A
1F69,34 40,,        ADDC    A,#40H
1F6B,D4,,        DA      A               ;GOT IT HERE
1F6C,FD,,        MOV     R5,A            ;OUTPUT THE BYTE
1F6D,80 F3,,        SJMP    SOUT_1
,,,        ;
1F6F,C4,HOUTHI,HOUTHI: SWAP    A               ;SWAP TO OUTPUT HIGH NIBBLE
,,,        ;
1F70,54 0F,HOUTLO,HOUTLO: ANL     A,#0FH          ;STRIP
1F72,70 F0,,        JNZ     HOUT1           ;PRINT IF NOT ZERO
1F74,30 23 ED,,        JNB     ADD_IN,HOUT1    ;OUTPUT A ZERO IF NOT SUPRESSED
1F77,22,,        RET
,,,        ;
,,,$EJECT
,,,        ORG     1FEBH           ;FOR LINK COMPATABILITY
,,,        ;
,,,        ;
1FEB,,GET_DIGIT_CHECK,GET_DIGIT_CHECK:        ; Get a character, then check for digit
,,,        ;
1FEB,B1 6C,,        ACALL   GET_DPTR_CHARACTER
,,,        ;
1FED,,DIGIT_CHECK,DIGIT_CHECK:    ;CHECK FOR A VALID ASCII DIGIT, SET CARRY IF FOUND
,,,        ;
1FED,B4 3A 00,,        CJNE    A,#'9'+1,$+3    ;SEE IF ASCII 9 OR LESS
1FF0,40 

⌨️ 快捷键说明

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