📄 monplus.asm
字号:
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 + -