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

📄 monplus.asm

📁 MSC1210单片机的一个监控程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        PUSH    ACC
        MOV     A,R0
        PUSH    ACC
        MOV     A,BKFLAG
        ANL     A,#BK1MASK      ;IF BK1 NOT SET,SKIP
        JZ      RSTB2
        MOV     R0,#BRKPT1
        ACALL   RSTBP
RSTB2:  MOV     A,BKFLAG
        ANL     A,#BK2MASK      ;IF BK2 NOT SET, SKIP
        JZ      RSTB3
        MOV     R0,#BRKPT2
        ACALL   RSTBP
RSTB3:  MOV     A,BKFLAG
        ANL     A,#BK3MASK      ;IF BK3 NOT SET, SKIP
        JZ      RSTB4
        MOV     R0,#BRKPT3
        ACALL   RSTBP
RSTB4:  MOV     A,BKFLAG
        ANL     A,#BK4MASK      ;IF BK4 NOT SET, SKIP
        JZ      RSTX
        MOV     R0,#BRKPT4
        ACALL   RSTBP
RSTX:   POP     ACC             ;RESTORE THE REGISTERS
        MOV     R0,A
        POP     ACC
        POP     DPL
        POP     DPH
        RET

        .eject

SETBP:  PUSH    ACC             ;SAVE THE ACCUMULATOR
        MOV     A,@R0           ;(RE)SET A BREAKPOINT
        MOV     DPH,A
        INC     R0              ;R0 POINTS TO THE BREAKPOINT RECORD
        MOV     A,@R0
        MOV     DPL,A
        INC     R0
        PUSH    DPH             ;SAVE DPTR FOR LATER
        PUSH    DPL
        MOVX    A,@DPTR         ;GET FIRST CODE BYTE
        MOV     @R0,A
        INC     DPTR
        INC     R0
        MOVX    A,@DPTR         ;GET SECOND CODE BYTE
        MOV     @R0,A
        INC     DPTR
        INC     R0
        MOVX    A,@DPTR         ;GET THIRD CODE BYTE
        MOV     @R0,A
        POP     DPL             ;RETRIEVE DPTR
        POP     DPH
SETCODE:                        ;SETUP JUMP TO BP HANDLER
        MOV     A,#0x12         ;LCALL OPCODE
        MOVX    @DPTR,A
        INC     DPTR
        MOV     A,#BPHLR_HI     ;HIGH BYTE OF BPT HANDLER ADDRESS
        MOVX    @DPTR,A
        INC     DPTR
        MOV     A,#BPHLR_LO     ;LOW BYTE OF BREAKPOINT HANDLER
        MOVX    @DPTR,A
        POP     ACC             ;RESTORE ACCUMULATOR
        RET

        .eject

SETALL: PUSH    DPH             ;SAVE THE REGISTERS
        PUSH    DPL
        PUSH    ACC
        MOV     A,R0
        PUSH    ACC
        MOV     A,BKFLAG
        ANL     A,#BK1MASK      ;IF BK1 NOT SET,SKIP
        JZ      SETB2
        MOV     R0,#BRKPT1
        ACALL   SETBP
SETB2:  MOV     A,BKFLAG
        ANL     A,#BK2MASK      ;IF BK2 NOT SET, SKIP
        JZ      SETB3
        MOV     R0,#BRKPT2
        ACALL   SETBP
SETB3:  MOV     A,BKFLAG
        ANL     A,#BK3MASK      ;IF BK3 NOT SET, SKIP
        JZ      SETB4
        MOV     R0,#BRKPT3
        ACALL   SETBP
SETB4:  MOV     A,BKFLAG
        ANL     A,#BK4MASK      ;IF BK4 NOT SET, SKIP
        JZ      SETX
        MOV     R0,#BRKPT4
        ACALL   SETBP
SETX:   POP     ACC             ;RESTORE THE REGISTERS
        MOV     R0,A
        POP     ACC
        POP     DPL
        POP     DPH
        RET

BPHLR:  ACALL   SAVEREG         ;SAVE THE REGISTERS,RESTORE THE CODE
        ACALL   CRLF            ;PUT IT ON A NEW LINE
        MOV     A,#'B'          ;SEND "B=" MESSAGE
        ACALL   PUTC
        MOV     A,#'='
        ACALL   PUTC
        POP     ADHI            ;GET THE PROGRAM COUNTER
        POP     ACC
        CLR     C
        SUBB    A,#0x03         ;SUBTRACT 3 TO MAKE IT RIGHT
        MOV     ADLO,A
        MOV     A,ADHI
        SUBB    A,#0x00
        MOV     ADHI,A
        ACALL   WRBYTE          ;DISPLAY THE ADDRESS
        MOV     A,ADLO
        ACALL   WRBYTE
        AJMP    GETCMD

        .eject
        
BPDISP: PUSH    DPH             ;SAVE USED REGISTERS
        PUSH    DPL
        PUSH    TEMP1
        PUSH    ACC
        MOV     A,R0            ;INCLUDING R0
        PUSH    ACC
BPDISS: ACALL   GETC            ;GET THE NEXT CHARACTER
        CJNE    A,#' ',BPDIS1   ;NOT A SPACE SO CONTINUE
        SJMP    BPDISS          ;SPACE DOESN'T MEAN ANYTHING SO LOOP
BPDIS1: CJNE    A,#'1',BPDIS2   ;IF ITS NOT BP #1, CONTINUE
        MOV     TEMP1,#BK1MASK  ;SET UP BIT MASK FOR CLEAR
        MOV     R0,#BRKPT1      ;POINT TO FIRST BREAKPOINT
        SJMP    BPCON           ;CONTINUE
BPDIS2: CJNE    A,#'2',BPDIS3   ;IF ITS NOT BP #2, CONTINUE
        MOV     TEMP1,#BK2MASK  ;SET UP BIT MASK FOR CLEAR
        MOV     R0,#BRKPT2      ;POINT TO SECOND BREAKPOINT
        SJMP    BPCON           ;CONTINUE
BPDIS3: CJNE    A,#'3',BPDIS4   ;IF ITS NOT BP #3, CONTINUE
        MOV     TEMP1,#BK3MASK  ;SET UP BIT MASK FOR CLEAR
        MOV     R0,#BRKPT3      ;POINT TO THIRD BREAKPOINT
        SJMP    BPCON           ;CONTINUE
BPDIS4: CJNE    A,#'4',BPEX     ;IF ITS NOT BP #4, EXIT
        MOV     TEMP1,#BK4MASK  ;SET UP BIT MASK FOR CLEAR
        MOV     R0,#BRKPT4      ;POINT TO FOURTH BREAKPOINT
BPCON:  ACALL   GETC            ;GET THE NEXT CHARACTER
        CJNE    A,#' ',BPCON2   ;NOT A SPACE SO CONTINUE
        SJMP    BPCON           ;SPACE DOESN'T MEAN ANYTHING SO LOOP
BPCON2: CJNE    A,#'-',BPSET    ;IF ITS A '-' THEN CLEAR A BREAKPOINT
        ACALL   RSTBP           ;RESTORE THE CODE
        MOV     A,BKFLAG        ;SET UP TO CLEAR THE APPROPRIATE BIT
        XRL     TEMP1,#0xFF     ;FLIP THE BITS IN TEMP1
        ANL     A,TEMP1         ;TEMP1 CONTAINS THE MASK
        MOV     BKFLAG,A
        SJMP    BPEX            ;AND EXIT
BPSET:  ACALL   RDHX1           ;ELSE ASSUME ITS A BREAKPOINT TO SET
        MOV     DPH,A           ;AND GET THE ADDRESS
        MOV     @R0,A
        INC     R0
        ACALL   RDHEX
        MOV     DPL,A
        MOV     @R0,A
        MOV     A,BKFLAG        ;GET READY TO ENABLE THE BREAKPOINT
        ORL     A,TEMP1
        MOV     BKFLAG,A        ;AND ENABLE IT
BPEX:   POP     ACC             ;RESTORE R0
        MOV     R0,A
        POP     ACC             ;AND THE OTHER REGISTERS
        POP     TEMP1
        POP     DPL
        POP     DPH
        RET

        .eject

REGSTR: PUSH    DPH             ;SAVE DPTR (FOR WHEN WE CALL INTRAM LATER)
        PUSH    DPL
        ACALL   SPACE           ;OUTPUT A SPACE
REGST1: ACALL   GETC            ;GET THE CHARACTER
        CJNE    A,#' ',REGST2   ;SPACE DOESN'T MEAN ANYTHING
        SJMP    REGST1          ;SO LOOP
REGST2: CJNE    A,#'A',REGST3   ;IF ITS NOT 'A', CONTINUE
        MOV     A,#ASAVE        ;POINT TO ACCUMULATOR SAVE AREA
        AJMP    RAMENT          ;USE INTRAM CODE
REGST3: CJNE    A,#'B',REGST4   ;IF ITS NOT 'B', CONTINUE
        MOV     A,#BSAVE        ;POINT TO B REGISTER SAVE AREA
        AJMP    RAMENT          ;USE INTRAM CODE
REGST4: CJNE    A,#'H',REGST5   ;IF ITS NOT 'H', CONTINUE
        MOV     A,#DPHSAVE      ;POINT TO DPH SAVE AREA
        AJMP    RAMENT          ;USE INTRAM CODE
REGST5: CJNE    A,#'L',REGST6   ;IF ITS NOT 'L', CONTINUE
        MOV     A,#DPLSAVE      ;POINT TO DPL SAVE AREA
        AJMP    RAMENT          ;USE INTRAM CODE
REGST6: CJNE    A,#'S',REGST7   ;IF ITS NOT 'S', CONTINUE
        MOV     A,#PSWSAVE      ;POINT TO PSW SAVE AREA
        AJMP    RAMENT          ;USE INTRAM CODE
REGST7: ACALL   ASC2HEX         ;ASSUME ITS R0-R7, CONVERT R NUMBER
        ANL     A,#0x07         ;MAKE SURE ITS 0-7
        PUSH    B               ;SAVE THE B REGISTER
        MOV     B,A             ;SAVE THE R NUMBER IN B
        MOV     A,PSWSAVE       ;GET THE BITS INDICATING REGISTER SET
        ANL     A,#0x18         ;MASK OFF EVERYTHING ELSE
        ORL     A,B             ;BUILD THE POINTER VALUE
        POP     B               ;RESTORE REGISTER B
        AJMP    RAMENT          ;USE THE INTRAM CODE

        .eject

; READS TWO ASCII CHARACTERS FROM THE SERIAL PORT AND
; CONVERTS THEM INTO A BYTE RETURNED IN A.
;
RDHEX:  ACALL   GETC            ;GET THE FIRST CHARACTER
        CJNE    A,#' ',RDHX1    ;SKIP LEADING SPACES
        SJMP    RDHEX
RDHX1:  PUSH    TEMP1           ;SAVE TEMP1
        ACALL   ASC2HEX         ;CONVERT TO HEX NIBBLE
        SWAP    A               ;HIGH ORDER NIBBLE IS FIRST ONE
        MOV     TEMP1,A         ;SAVE THE HIGH ORDER NIBBLE
RDHX2:  ACALL   GETC            ;GET LOW ORDER CHARACTER
        CJNE    A,#' ',RDHX3    ;SKIP LEADING SPACES
        SJMP    RDHX2
RDHX3:  ACALL   ASC2HEX         ;CHANGE TO HEX NIBBLE
        ORL     A,TEMP1         ;PUT NIBBLES TOGETHER IN A
        POP     TEMP1           ;RESTORE TEMP1
        RET

; WRITES BYTE IN A TO THE SERIAL PORT AS TWO ASCII CHARACTERS.
;
WRBYTE: PUSH    TEMP1           ;SAVE TEMP1
        MOV     TEMP1,A
        SWAP    A
        ACALL   HEX2ASC
        ACALL   PUTC
        MOV     A,TEMP1
        ACALL   HEX2ASC
        ACALL   PUTC
        POP     TEMP1           ;RESTORE TEMP1
        RET

; CONVERTS AN ASCII CHARACTER IN A TO ITS HEX EQUIVALENT.
; RETURNS VALUE IN LOWER NIBBLE, UPPER NIBBLE ZEROS
;
ASC2HEX: PUSH   B
        CLR     C
        SUBB    A,#'0'
        MOV     B,A
        SUBB    A,#0x0A
        JC      A2LT10
        MOV     A,B
        SUBB    A,#0x07
        MOV     B,A
A2LT10: MOV     A,B
        POP     B
        RET

        .eject

; CONVERTS THE LOWER NIBBLE IN A TO AN ASCII CHARACTER RETURNED IN A
;
HEX2ASC: PUSH   B
        ANL     A,#0x0F
        MOV     B,A
        CLR     C
        SUBB    A,#0x0A
        MOV     A,B
        JC      H2LT10
        ADD     A,#0x07
H2LT10: ADD     A,#0x30
        POP     B
        RET

; PUTS SENDS THE TEXT STRING POINTED TO BY DPTR TO THE SERIAL PORT.
; THE TEXT STRING MUST END WITH A NULL CHARACTER
;
PUTS:   PUSH    ACC             ;SAVE THE ACCUMULATOR
PUTS1:  CLR     A               ;(ZERO OFFSET)
        MOVC    A,@A+DPTR       ;FETCH NEXT CHAR IN STRING
        JNZ     PUTS2           ;IF NOT NULL, SEND IT
        POP     ACC             ;ELSE RESTORE THE ACCUMULATOR
        RET                     ;AND RETURN
PUTS2:  ACALL   PUTC            ;SEND THE CHARACTER
        INC     DPTR            ;BUMP POINTER
        SJMP    PUTS1           ;BACK FOR MORE

; SPACE OUTPUTS A SPACE TO THE SERIAL PORT
;
SPACE:  PUSH    ACC
        MOV     A,#' '
        ACALL   PUTC
        POP     ACC
        RET

; CRLF SENDS A CARRIAGE RETURN AND LINE FEED OUT THE SERIAL PORT
;
CRLF:   PUSH    ACC
        MOV     A,#CR
        ACALL   PUTC
        MOV     A,#LF
        ACALL   PUTC
        POP     ACC
        RET

        .eject

; GETC READS A CHARACTER INTO A FROM THE SERIAL PORT AND
; ECHOS THE CHARACTER BACK TO THE SERIAL PORT
;
GETC:   ACALL   SERIN
        ANL     A,#0x7F
        CJNE    A,#ESC,GETC2    ;IF ESC, ABORT CURRENT COMMAND
        AJMP    GETCMD
GETC2:  CJNE    A,#'a',GETC3    ;IF <'a', DON'T CHANGE IT
GETC3:  JC      GETC5           ;DITTO
        CJNE    A,#'z',GETC4    ;IF >'z', DON'T CHANGE IT
GETC4:  JNC     GETC5           ;DITTO
        ANL     A,#0xDF         ;ELSE MAKE IT UPPER CASE
GETC5:  ACALL   PUTC            ;ECHO IT
        RET

; SERIN READS THE SERIAL PORT AND RETURNS THE VALUE IN A
;
SERIN:  JNB     RI,*
        CLR     RI
        MOV     A,SBUF
        RET

; PUTC SENDS THE CHARACTER IN A OUT THE SERIAL PORT(MUST BE AN ASCII CHARACTER)
;
PUTC:   JNB     TI,*
        CLR     TI
        MOV     SBUF,A
        RET

; DELAY PAUSES FOR 1 MILLISECOND TIMES THE VALUE IN A.
;
DELAY:  PUSH    B
        MOV     B,#0xF0         ;12 MHz, CHANGE TO 0xC9 FOR 11.0592
        DJNZ    B,*
        DJNZ    B,*             ;NO, THIS ISN'T A MISTAKE
        POP     B
        DJNZ    ACC,DELAY
        RET

⌨️ 快捷键说明

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