?? cpu01mon.sa
字號(hào):
**===========================================================================**
**
** D E B U G G E R CPU01 Debug Monitor
**
** www.OpenCores.Org - August 2003
** This software adheres to the GNU public license
**
** File name : cpu01mon.sa
**
** Purpose : Implements a built-in Debug monitor
** for the System6801 compatible CPU core
**
** Author : Michael L. Hasenfratz Sr.
**
**===========================================================================**
**
** Revision History:
**
** Date: Revision Author
**===========================================================================**
** 12 Oct 2003 0.1 Michael L. Hasenfratz Sr.
**
NAM CPU01MON
TTL Sunday, October 12, 2003 (mlh) DEBUG MONITOR FOR System6801
SPC 1
*
* This is a debug monitor for use with
* the OpenCore System6801 CPU
* Or MOTOROLA MC6800 MICROPROCESSORS
*
SPC 1
*
* PROGRAM START ADDRESS
*
ROMSTR EQU $F800 . ROM START ADDRESS
RAMSTR EQU $0080 . RAM START ADDRESS
RAMEND EQU $0100 . RAM END ADDRESS
IO$STR EQU $0000 . INTERNAL REGISTERS
SPC 1
*
* wb_acia (ACIA) SERIAL PORT ADDRESS DEFINITION
*
ACIA$S EQU IO$STR+$10 . Start of the ACIA
ACCTRL EQU ACIA$S+0 . ACIA CONTROL
ACSTAT EQU ACIA$S+0 . ACIA STATUS
RXDATA EQU ACIA$S+1 . RECEIVE DATA PORT
TXDATA EQU ACIA$S+1 . TRANSMIT DATA PORT
RDRF EQU %00000001 . RCV DATA REG FULL
TDRE EQU %00000010 . TX DATA REG EMPTY
SPC 1
*
* SOME ASCII CHARACTER DEFINITIONS
*
CR EQU $0D . <CR>
LF EQU $0A . <LF>
SPACE EQU $20 . <SPACE>
BELL EQU $07 . <BELL/BEEP>
SPC 1
*
* RAM LOCATIONS REQUIRED
*
ORG RAMSTR
VARSTR EQU *
USTACK RMB 2 . USER'S STACK POINTER
SPC 1
*
* VECTOR BUFFER
*
VECBUF EQU *
IRQSCI RMB 2 . 'SCI' VECTOR
IRQTOF RMB 2 . 'TOF' VECTOR
IRQOCF RMB 2 . 'OCF' VECTOR
IRQICF RMB 2 . 'ICF' VECTOR
IRQ$VC RMB 2 . IRQ VECTOR
SWI$VC RMB 2 . SWI #1 VECTOR
NMI$VC RMB 2 . NMI VECTOR
SPC 1
*
* MISC. REGISTERS
*
ADDRES RMB 2 . ADDRESS TEMPORARY STORAGE
AECHO RMB 1 . ECHO FLAG
BYTECT RMB 1 . BYTE COUNT (LOADER)
CHKSUM RMB 1 . CHECK-SUM (LOADER)
IRQFLG RMB 1 . IRQ FLAG 0=STOP IRQ
VFLAG RMB 1 . VALUE FLAG 0=NO ENTRY
VALUE RMB 2 . BINARY VALUE ENTERED
BRKPTS RMB 4*4 . 4 BREAK-POINTS MAY BE SET
OFFSET RMB 2 . OFFSET TO BE ADDED TO ADDRESSES
DB$STK RMB 2 . DEBUG STACK
BEGADR RMB 2 . BEGIN ADDRESS
ENDADR RMB 2 . END ADDRESS
TMP$00 RMB 2 . SOME TEMPORARY STORAGE
TMP$01 RMB 2
TMP$02 RMB 2
TMP$03 RMB 2
VAREND EQU *
SPC 1
U$STK EQU (VAREND+((RAMEND-VAREND)/2))-1 . USER'S STACK
STACK EQU RAMEND-1
SPC 1
*
* ROM START (JUMP TABLE)
*
ORG ROMSTR
JMP INCH . INPUT 1 CHAR FROM CONSOLE (W/PARITY)
JMP INCHNP . INPUT 1 CHAR FROM CONSOLE (WO/PARITY)
JMP OUTCH . OUTPUT 1 CHAR TO CONSOLE
JMP PDATA . PRINT <CR>,<LF>,<NULLS> & STRING (TO EOT)
JMP PDATA1 . PRINT STRING (TO EOT)
JMP PCRLF . PRINT <CR>,<LF>,<NULLS>
JMP GO$SB2 . RE-ENTER MONITOR (WO/INITIALIZATION)
JMP BEGEND . GET BEGIN/END ADDRESSES
JMP OUT2HS . PRINT 2 HEX CHARS & <SP>
JMP OUT4HS . PRINT 4 HEX CHARS & <SP>
SPC 1
*
* (wb_acia) ACIA INITIALIZATION VALUE
*
ACINIT FCB %00010101 . NO RCV IRQ, NO XMIT IRQ, 8 BIT, NO PARITY, 1 STOP, 9600 BAUD (CNTL)
SPC 1
*
* S T R I N G S A N D T H I N G S
*
HEADER FCC /CPU01MON Ver. 2.2/
FCB 4
PRMT FCB 0,0,0,0,'>,4
INVAL FCC / - INV/
FCB 4
BEGMSG FCC /BEG ADDR - /
FCB 4
ENDMSG FCC /END ADDR - /
FCB 4
MEMERR FCB $13 . READER OFF
FCC / - NO CHANGE/
WHAT FCB BELL,4
CMPMSG FCC /NO COMPARE @/
FCB BELL,4
CHKERR FCB $13 . READER OFF
FCC / - CHK SUM ERR/
FCB BELL,4
LOADER FCB $13 . READER OFF
FCC / - LOAD ERR/
FCB BELL,4
BRKSTG FCC / BREAK - POINTS/
CRLF FCB CR,LF,0,0,0,0,4
RTSSTR FCC /RETURN/
FCB 4
REGSTR FCC /REG/
FCB 4
IRQSTR FCC /IRQ/
FCB 4
SWISTR FCC /SWI/
FCB 4
NMISTR FCC /NMI/
FCB 4
BRKSTR FCC /BRK PNT/
FCB 4
DSPSTR FCC / - CC=/ . REGISTER DUMP STRING
FCB 4
FCC /B=/
FCB 4
FCC /A=/
FCB 4
FCC /X=/
FCB 4
FCC /PC=/
FCB 4
FCC /S=/
FCB 4
SPC 1
*
* R E S T A R T E N T R Y P O I N T
*
COLD$ LDS #STACK . SET THE STACK
SPC 1
*
* SET UP USERS STACK
*
LDX #U$STK . POINT AT THE USER'S STACK
STX USTACK . SET USER'S STACK
JSR IOSET . INIT THE PORTS
SPC 1
*
* RESET THE VECTORS
*
LDX #VECTBL . POINT AT THE TABLE
STX TMP$00 . SAVE THE SOURCE
LDX #VECBUF . POINT AT THE BUFFER
STX TMP$01 . SAVE THE DESTINATION
LDAB #2*7 . 14 BYTES TO MOVE
VCTLP0 LDX TMP$00 . GET THE POINTER
LDAA 0,X . GET A BYTE
INX
STX TMP$00
LDX TMP$01 . GET THE DESTINATION
STAA 0,X
INX
STX TMP$01
DECB
BNE VCTLP0 . LOOP UNTIL FULL
SPC 1
*
* CLEAR THE BREAK POINT TABLE
*
LDX #BRKPTS . POINT AT THE TABLE
LDAB #4*4
C$BRK CLR 0,X
INX
DECB
BNE C$BRK
LDAA #1 . SET THE IRQ BIT
STAA IRQFLG . CLR THE IRQ FLAG
CLR OFFSET . RESET THE ADDRESS OFFSET
CLR OFFSET+1
SPC 1
*
* PREPARE TO TALK TO THE USER
*
LDX #HEADER . SEND SIGN-ON MESSAGE
JSR PDATA
SPC 1
*
* CLEAR THE USER'S STACK
*
LDX USTACK
INX
LDAA #7
CL$STK CLR 0,X . CLEAR THIS BYTE
INX
DECA
BNE CL$STK
LDS USTACK . POINT AT USER'S STACK
SPC 1
*
* W A R M S T A R T E N T R Y P O I N T
*
WARM$ STS USTACK . SAVE THE USER'S STACK
SPC 1
*
* H O T S T A R T E N T R Y P O I N T
*
MON$ LDS #STACK . RESET MONITOR STACK
LDX #PRMT . SEND PROMPT TO USER
JSR PDATA
CLR AECHO . RESET THE ECHO FLAG
LDAB IRQFLG . SEE IF WE SHOULD SET/RESET IRQ BIT
ANDB #1 . ISOLATE THE BIT
ASLB
ASLB
ASLB
ASLB . PUT THE BIT IN IT'S PLACE
TPA . GET THE CC'S
ANDA #%11101111 . ISOLATE THE IRQ BIT
ABA . ADD THE BIT
TAP . RESTORE THE CC'S
LDX #CMDTBL . POINT AT TABLE OF COMMANDS
BSR GETCMD
BCS WHATER
LDX 1,X . DO THE COMMAND
JSR 0,X
BRA MON$
SPC 1
*
* SEND A 'WHAT' TO USER
*
WHATER LDX #WHAT
JSR PDATA1
JMP MON$
SPC 1
*
* GET USER'S REQUEST
*
GETCMD STX TMP$03 . SAVE TABLE ADDRESS
CMDLOP LDX #0 . ZERO OUT VALUE
STX VALUE
CLR VFLAG
CMDLP0 JSR INCHNP . GET A CHAR. FROM THE USER
JSR CHKHEX . IS IT A HEX CHAR
BCS CHKCM0 . CHECK FOR COMMAND
JSR ADDHEX . ADD TO 'VALUE' A HEX NUMBER
BRA CMDLP0 . RETURN TO LOOP
SPC 1
*
* CHECK FOR COMMAND
*
CHKCMD JSR INCHNP . GET A CHAR.
STX TMP$03 . SAVE THE POINTER
CHKCM0 LDX TMP$03 . POINT AT TABLE OF LEGAL COMMANDS
TST 0,X . SEE IF DUMMY TABLE
BEQ CHKDUM . JUST EXIT
CHKCL0 CMPA 0,X . THIS COMMAND?
BEQ CMD$DO . YES
INX . MOVE TO NEXT COMMAND
INX
INX
TST 0,X . END OF TABLE?
BNE CHKCL0 . NO KEEP GOING
CHKDUM SEC . SET FOR ILLEGAL COMMAND
RTS
SPC 1
*
* GOOD COMMAND
*
CMD$DO CLC . SET FOR LEGAL COMMAND RECEIVED
RTS
SPC 1
*
* TABLE OF LEGAL COMMANDS
*
CMDTBL FCB '/ . EXAMINE MEMORY
FDB EXAMIN
FCB '; . SUB-PROGRAM ROUTINE
FDB SUBPRG
FCB CR . DUMMY COMMAND (IGNORE)
FDB CHKDUM
FCB 0 . END OF TABLE
SPC 1
*
* CHECK CHARACTER IN 'A' FOR HEX
*
CHKHEX CMPA #'0 . SEE IF NUMERIC
BLT CHKHNO
CMPA #'9
BLS CISHEX
CMPA #'A . ALFA?
BLT CHKHNO
CMPA #'F
BLS CISHEX
CHKHNO SEC
RTS
SPC 1
*
CISHEX SUBA #'0
CMPA #9 . DONE?
BLS CHKHDN
SUBA #7 . ALFA
CHKHDN CLC
RTS
SPC 1
*
* ADD A HEX NUMBER IN 'A' TO 'VALUE'
*
ADDHEX ASL VALUE+1 . MULTIPLY VALUE BY 16
ROL VALUE
ASL VALUE+1
ROL VALUE
ASL VALUE+1
ROL VALUE
ASL VALUE+1
ROL VALUE
ADDA VALUE+1
STAA VALUE+1
BCC ADDONE
INC VALUE
ADDONE LDAA #1 . SET FLAG
STAA VFLAG
RTS
SPC 1
*
* INPUT 1 CHARACTER FROM ACIA WO/PARITY
*
INCHNP BSR INCH . GET A CHAR.
ANDA #$7F . REMOVE THE PARITY BIT
RTS
SPC 1
*
* INPUT 1 CHARACTER FROM ACIA W/PARITY
*
INCH LDAA ACSTAT . CHECK FOR RDRF
BITA #RDRF
BEQ INCH
LDAA RXDATA . GET THE CHAR.
TST AECHO . SHOULD WE ECHO THE CHAR.
BNE OUTRTS
SPC 1
*
* OUTPUT 1 CHARACTER
*
OUTCH PSHB . SAVE B REG
OUT$LP LDAB ACSTAT . WAIT FOR TDRE
BITB #TDRE
BEQ OUT$LP
STAA TXDATA . OUTPUT THE CHAR.
PULB . RESTORE THE REGS
OUTRTS RTS
SPC 1
*
* PRINT <CR><LF>'STRING'
*
PDATA BSR PCRLF . PRINT A <CR><LF>
PDATA1 LDAA 0,X . GET A CHAR.
INX . MOVE TO NEXT CHAR.
CMPA #4 . EOT?
BEQ P$DONE . YES
BSR OUTCH
BRA PDATA1
P$DONE RTS
SPC 1
*
* PRINT A <CR><LF>
*
PCRLF STX TMP$02 . SAVE THE XREG
LDX #CRLF
BSR PDATA1 . SEND THIS STRING
LDX TMP$02 . RESTORE THE XREG
RTS
SPC 1
*
* DISPLAY MPU REGISTERS
*
DSPRTS LDX #RTSSTR
BRA DSPRTN
SPC 1
*
DSPREG LDX #REGSTR
BRA DSPRTN
SPC 1
*
DSPSWI LDX #SWISTR
BRA DSPRTN
SPC 1
*
DSPIRQ LDX #IRQSTR
BRA DSPRTN
SPC 1
*
DSPBRK LDX #BRKSTR
BRA DSPRTN
SPC 1
*
DSPNMI LDX #NMISTR
BRA DSPRTN
SPC 1
*
* DISPLAY THE REGISTERS
*
DSPRTN JSR PDATA . PRINT THE STRING
LDX #DSPSTR
STX TMP$01
LDX USTACK . POINT AT THE USER'S STACK
INX
LDAB #3 . PRINT THE 3, 2 BYTE REGISTERS
BSR PRNT2B
LDAB #2 . PRINT THE 2, 4 BYTE REGISTERS
BSR PRNT4B
LDX #USTACK . POINT AT THE ADDRESS
LDAB #1 . PRINT THE STACK ADDRESS
SPC 1
*
* PRINT 4 BYTE REGISTER
*
PRNT4B STX TMP$00
LDX TMP$01
JSR PDATA1 . PRINT THE STRING
STX TMP$01 . SWAP THE REGISTERS
LDX TMP$00
JSR OUT4HS . PRINT VALUE
DECB
BNE PRNT4B
RTS
SPC 1
*
* PRINT 2 BYTE REGISTER
*
PRNT2B STX TMP$00
LDX TMP$01
JSR PDATA1 . PRINT THE STRING
STX TMP$01 . SWAP THE REGISTERS
LDX TMP$00
JSR OUT2HS . PRINT THE DATA
DECB
BNE PRNT2B
RTS
SPC 1
*
* OUTPUT HEX CHARS W/SPACE
*
OUT4HS BSR OUT2H
OUT2HS BSR OUT2H
OUTS LDAA #SPACE . OUTPUT A SPACE
JMP OUTCH
SPC 1
*
* OUTPUT 2 HEX CHAR.S
*
OUT2H LDAA 0,X . GET THE CHAR.
LSRA . MOVE MSN TO LSN
LSRA
LSRA
LSRA
BSR HEX$IT
LDAA 0,X . GET CHAR. AGAIN
INX
SPC 1
*
* CONVERT 'A' REG TO BINARY (LSN) TO ASCII
*
HEX$IT ANDA #%1111 . SAVE ONLY LSN
ORAA #'0 . MAKE ASCII
CMPA #'9
BLS OUTHX . OUTPUT THE CHAR
ADDA #7 . MAKE ALFA
OUTHX JMP OUTCH
SPC 1
*
* INPUT 4 HEX CHARS
*
IN4HEX BSR IN2HEX
BCS NO$IHX . WAS'NT HEX
PSHA . SAVE THE MSB
PSHA
BSR IN2HEX
TSX . POINT AT RESULT
STAA 1,X . SAVE THE LSB
LDX 0,X . GET THE RESULT
INS . FIX THE STACK
INS
RTS
SPC 1
*
* INPUT 2 HEX CHARS
*
IN2HEX BSR INHEX . GET THE MSN
BCS NO$IHX . NOT HEX
ASLA . PUT IT IN THE MS NIBBLE
ASLA
ASLA
ASLA
STAA TMP$00 . SAVE IT
BSR INHEX . GET THE LSN
BCS NO$IHX . NOT HEX
ADDA TMP$00 . ADD NIBBLES
STAA TMP$00 . SAVE IT
ADDA CHKSUM . ADD TO CHECK SUM
STAA CHKSUM
LDAA TMP$00 . GET THE CHAR.
CLC
RTS
SPC 1
*
* INPUT 1 HEX CHAR. IN A
*
INHEX JSR INCHNP . GET A BYTE FROM USER
JMP CHKHEX . CHECK AND CONVERT
SPC 1
*
* NOT HEX
*
NO$IHY INS . FIX THE STACK
NO$IHX SEC
RTS
SPC 1
*
* I/O INITIALIZATION
*
IOSET LDAA #%00000011 . TRASH THE ACIA
STAA ACCTRL
LDAA ACINIT . GET THE INIT VALUE
STAA ACCTRL
RTS
SPC 1
*
* EXAMINE MEMORY
*
EXAMIN LDAB VALUE . GET THE ADDRESS
LDAA VALUE+1
ADDA OFFSET+1 . ADD THE OFFSET
ADCB OFFSET
STAB ADDRES . SAVE THE VALUE
STAA ADDRES+1
SPC 1
*
EX$LP0 JSR PCRLF
LDX #ADDRES . POINT AT THE DATA ADDRESS
JSR OUT4HS . PRINT THE ADDRESS
EX$LP1 LDX ADDRES . POINT AT THE DATA
JSR OUT2HS . PRINT THE DATA
SPC 1
*
* WAIT FOR COMMAND
*
EX$LP2 LDX #EXMTBL . POINT AT TABLE OF COMMANDS
JSR GETCMD . GET A VALUE AND/OR A COMMAND
BCC EX$JMP . LEGAL?
JMP WHATER . NO!
SPC 1
*
* DO TO IT
*
EX$JMP LDX 1,X . GET TASK ADDRESS
JMP 0,X . DO THE REQUEST
SPC 1
*
* COMMAND TABLE
*
EXMTBL FCB '/ . DISPLAY SAME ADDRESS
FDB EX$SAM
FCB SPACE . DISPLAY NEXT ADDRESS
FDB EX$NXT
FCB LF . DISPLAY NEXT ADDRESS (ALT. METHOD)
FDB EX$NXT
FCB '^ . DISPLAY LAST ADDRESS
FDB EX$BAK
FCB CR . RETURN TO MONITOR
FDB EX$RTS
FCB '; . CALCULATE OFFSET
FDB EX$OFS
FCB 0
SPC 1
*
* DISPLAY NEXT ADDRESS
*
EX$NXT BSR EX$STR . TRY TO STORE VALUE
INX
STX ADDRES
BRA EX$LP0
SPC 1
*
* DISPLAY LAST ADDRESS
*
EX$BAK BSR EX$STR . TRY TO STORE THE CHAR.
DEX
STX ADDRES . SAVE THE NEW VALUE
BRA EX$LP0
SPC 1
*
* DISPLAY SAME ADDRESS
*
EX$SAM BSR EX$STR . TRY TO STORE THE CHAR.
BRA EX$LP1 . DON'T MOVE TO NEW LINE
SPC 1
*
* STORE THE VALUE
*
EX$STR LDX ADDRES . POINT AT MEMORY
TST VFLAG . SHOULD WE STORE IT?
BEQ EXNSTR . NO
LDAA VALUE+1 . GET THE VALUE
STAA 0,X . STORE IT
CMPA 0,X . SEE IF GOOD MEMORY
BNE EX$BEL . NO CHANGE
EXNSTR RTS
SPC 1
*
* NO CHANGE IN MEMORY
*
EX$BEL STX TMP$00 . SAVE ADDRESS
LDX #MEMERR . MEMORY ERROR
JSR PDATA1
LDX TMP$00 . RESTORE ADDRESS
RTS
SPC 1
*
* RETURN TO THE MONITOR
*
EX$RTS BSR EX$STR . TRY TO STORE THE VALUE
RTS . RETURN TO THE MONITOR
SPC 1
*
* CALCULATE OFFSET TO ADDRESS
*
EX$OFS JSR INCHNP . GET THE NEXT CHAR.
CMPA #'O . OFFSET?
BNE EX$OEX . NO
JSR OUTS . SEND A SPACE
LDAB VALUE . GET THE OFFSET VALUE
LDAA VALUE+1
SUBA ADDRES+1 . SUBTRACT THE CURRENT ADDRESS
SBCB ADDRES
SUBA #1 . SAME ADDRES =-1
SBCB #0
PSHA . SAVE IT ON THE STACK
TSX . POINT AT LONG VALUE
CMPB #0 . IF A <> $FF OR $00 THEN ILLEGAL BRANCH
BNE EX$SHX . MIGHT STILL BE GOOD
BITA #$80 . MSB MUST BE 0
BEQ EX$SHT . GOOD BRANCH
BRA EX$LNG . INVALID
EX$SHX CMPB #$FF
BNE EX$LNG . GOOD SHORT
BITA #$80 . MSB MUST BE 1
BNE EX$SHT . GOOD BRANCH
EX$LNG LDX #INVAL . INVALID BRANCH
JSR PDATA1
BRA EX$FST . GO FIX THE STACK
EX$SHT JSR OUT2HS . OUTPUT (SHORT) VALUE
EX$FST INS . FIX THE STACK
EX$OEX JMP EX$LP0
SPC 1
*
* SUB-COMMANDS
*
SUBPRG LDX #SUBTBL . POINT AT TABLE OF SUB-COMMANDS
JSR CHKCMD . GET THE REQUEST
BCC SB$JMP . LEGAL?
JMP WHATER . ILLEGAL COMMAND
SPC 1
*
* GO DO IT
*
SB$JMP LDX 1,X . GET THE TASK
JMP 0,X . GO TO IT.
SPC 1
*
* TABLE OF SUB-COMANDS
*
SUBTBL FCB 'R . DISPLAY REGISTERS
FDB DSPREG
FCB 'G . GO TO USER'S PROGRAM
FDB GO$USR
FCB 'S . GO TO USER'S SUB-ROUTINE
FDB GO$SUB
FCB 'V . SET/DISPLAY BREAK-POINTS
FDB SBKRTN
FCB 'U . CLEAR BREAK-POINTS
FDB CBKRTN
FCB 'D . DISPLAY MEMORY
FDB DSPMEM
FCB 'P . CONTINUE USER'S PROGRAM
FDB GO$CON
FCB 'F . FILL MEMORY WITH CHAR.
FDB FILMEM
FCB 'C . COMPARE MEMORY WITH CHAR.
FDB CMPMEM
FCB 'M . MOVE MEMORY
FDB MOVMEM
FCB 'I . SET/RESET/PRINT IRQ FLAG
FDB IRQ$RT
FCB 'O . SET OR RESET OFFSET
FDB OFS$RT
FCB 'L . 'S1' RECORD LOADER
FDB LOAD
FCB 0
SPC 1
*
* GO TO USER PROGRAM
*
GO$USR TST VFLAG . SEE IF VALID REQUEST
BEQ GO$BAD . CAN'T DO THAT
LDS USTACK . GET USER'S STACK
TSX
LDAB VALUE . GET NEW ADDRESS
LDAA VALUE+1
STAB 5,X . SET PC COUNTER
STAA 6,X
GOU$DO JSR SETBRK . GO SET THE BREAK POINTS
RTI
SPC 1
*
* GO TO USER'S SUB-ROUTINE
*
GO$SUB TST VFLAG . SEE IF ADDRESS SET
BEQ GO$BAD . CAN'T
LDS USTACK . GET USER'S STACK
SPC 1
*
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -