	NAM	PSYMON

*SYSTEM ADDRESS CONSTANTS
ROM1	EQU	$FC00
ROM2	EQU	$F800
RAM	EQU	$F380
FREE	EQU	$F000
TERMNL	EQU	$F7FE

*ASCII CHARACTER CONSTANTS
CR	EQU	$0D
LF	EQU	$0A
SP	EQU	$20

*ACIA CONTROL CONFIGURATIONS
RESET	EQU	$03
CONFIG	EQU	$51
RDRON	EQU	CONFIG-$40
RDROFF	EQU	CONFIG

*PSYMON DCB OFFSETS
DCBLNK	EQU	0
DCBDID	EQU	2
DCBDVR	EQU	4
DCBIOA	EQU	6
DCBERR	EQU	8
DCBEXT	EQU	9
DCBAPP	EQU	10

*PSYMON DCB FUNCTION CODES
READFN	EQU	1
WRITFN	EQU	2
STATFN	EQU	4
CNTLFN	EQU	8

*PSYMON RAM DEFINITIONS
	ORG	RAM
*PSYMON INTERNAL STACK AND REGISTER SPACE
	RMB	55
STACK	EQU	*
REGC	RMB	1
REGA	RMB	1
REGB	RMB	1
REGD	RMB	1
REGX	RMB	2
REGY	RMB	2
REGU	RMB	2
REGP	RMB	2

*PSYMON BREAKPOINT TABLE
BPTABL	RMB	15
BPTEND	EQU	*

*PSYMON WORK AREAS
MEMPTR	RMB	2
USRTBL	RMB	2
COMAND	RMB	1
CKSUM	RMB	1
BEGADD	RMB	2
ENDADD	RMB	2
STKPTR	RMB	2

*THE PSYMON CONSOLE DCB
CONDCB	RMB	10

*PSYMON DCB POINTERS
DCBCHN	RMB	2
CIDCB	RMB	2
CEDCB	RMB	2
CODCB	RMB	2
TPDCB	RMB	2

*PSYMON VECTORS
SWI3V	RMB	2
SWI2V	RMB	2
FIRQV	RMB	2
IRQV	RMB	2
SWIV	RMB	2
NMIV	RMB	2
FRERAM	RMB	2

*PSYMON ROM CODING
	ORG	ROM1

*PSYMON INITIALIZATION
INIT	LDS	#STACK
	TFR	S,X
INIT1	CLR	,X+
	CMPX	#CONDCB+2
	BNE	INIT1
	LDY	#RAMINT
INIT2	LDD	,Y++
	STD	,X++
	CMPX	#FRERAM+2
	BNE	INIT2
	LDX	#CONDCB
	LDD	#RESET*256+CNTLFN
	JSR	REQIO
	LDA	#CONFIG
	JSR	REQIO
	LDA	ROM2
	CMPA	#$7E
	BNE	MONENT
	JSR	ROM2

*PSYMON USER ENTRY
MONENT	STS	STKPTR

*GET COMMAND
GETCMD	LDX	#PROMPT
	JSR	PSTRNG
	JSR	INCHR
	BSR	LOOKUP
	BNE	GETCMD
	JSR	OUTSP
	JSR	[,X]
	BRA	GETCMD

PROMPT	FCB	CR,LF
	FCC	'==='
	FCB	$80+'>

*LOOKUP COMMAND	IN TABLE
LOOKUP	LDY	#COMAND
	STA	,Y
	LDX	USRTBL
	BEQ	LOOK1
	BSR	SEARCH
	BEQ	SERCHX
LOOK1	LDX	#CMDTBL

*GENERAL TABLE SEARCH
SEARCH	LDB	,X+
SERCH1	BSR	COMPAR
	ABX
	BEQ	SERCHX
	LEAX	2,X
	TST	0,X
	BPL	SERCH1
SERCHX	RTS

*GENERAL STRING COMPARE
COMPAR	PSHS	B,X,Y
COMP1	LDA	,X+
	CMPA	,Y+
	BNE	COMP2
	DECB
	BNE	COMP1
COMP2	PULS	B,X,Y,PC

*LOAD PROGRAM FROM TAPE
TLOAD	LDD	CIDCB
	LDX	CEDCB
	PSHS	A,B,X
	LDX	TPDCB
	CLRA
	CLRB
	STX	CIDCB
	STD	CEDCB
	LDD	#RDRON*256+CNTLFN
	JSR	REQIO
	BSR	LOAD
	LDD	#RDROFF*256+CNTLFN
	LDX	TPDCB
	JSR	REQIO
	PULS	A,B,X
	STD	CIDCB
	STX	CEDCB
	TST	CKSUM
	BEQ	LOADX

*DISPLAY TAPE ERROR INDICATOR
ERROR	LDA	#'?
	JMP	OUTCHR

*LOAD PROGRAM IN HEX FORMAT
LOAD	TFR	S,Y
LOAD1	JSR	INCHR
LOAD2	CMPA	#'S
	BNE	LOAD1
	JSR	INCHR
	CMPA	#'9
	BEQ	LOADX
	CMPA	#'1
	BNE	LOAD2
	CLR	CKSUM
	BSR	INBYTE
	SUBA	#2
	TFR	A,B
	BSR	INBYTE
	STA	,--S
	BSR	INBYTE
	STA	1,S
	PULS	X
LOAD3	BSR	INBYTE
	DECB
	BEQ	LOAD4
	STA	,X
	CMPA	,X+
	BNE	LOAD5
	BRA	LOAD3
LOAD4	INC	CKSUM
	BEQ	LOAD1
LOAD5	LDA	#$FF
	STA	CKSUM
	TFR	Y,S
LOADX	RTS

*INPUT 8-BIT BYTE
INBYTE	BSR	INHEX
	BEQ	LOAD4
	ASLA
	ASLA
	ASLA
	ASLA
	PSHS	A
	BSR	INHEX
	BEQ	LOAD4
	ADDA	0,S
	STA	0,S
	ADDA	CKSUM
	STA	CKSUM
	PULS	A,PC

*GET HEX NUMBER FROM CONSOLE
GETHEX	CLRB
	LDX	#0
GETHX1	BSR	INHEX
	BEQ	GETHX2
	EXG	D,X
	ASLB
	ROLA
	ASLB
	ROLA
	ASLB
	ROLA
	ASLB
	ROLA
	EXG	D,X
	LEAX	A,X
	INCB
	BRA	GETHX1
GETHX2	TSTB
	RTS

*GET HEX NYBBLE FROM CNSOLE
INHEX	BSR	INCHR
	PSHS	A
	SUBA	#$30
	BMI	INHEX2
	CMPA	#9
	BLS	INHEX1
	SUBA	#07
	CMPA	#10
	BLO	INHEX2
INHEX1	CMPA	#15
	BLS	INHEX3
INHEX2	LDA	0,S
INHEX3	CMPA	,S+
	RTS

*CONSOLE INPUT ROUTINE
INCHR	PSHS	B,X
	LDX	CIDCB
	LDB	#READFN
	BSR	REQIO
	ANDA	#$7F
	LDX	CEDCB
	PSHS	A
	BNE	OUTCH1
	PULS	A,B,X,PC

*CONSOLE OUTPUT ROUTINE
OUTCHR	PSHS	A,B,X
	LDX	CODCB
OUTCH1	LDB	#WRITFN
	BSR	REQIO
	PULS	A,B,X,PC

*PERFORM I/O REQUESTS
REQIO	PSHS	B,DP,X,Y,U
	JSR	[DCBDVR,X]
	PULS	B,DP,X,Y,U,PC

*DISPLAY DOUBLE BYTE
DSPDBY	BSR	OUTHEX
	EXG	A,B
	BSR	DSPSBY
	EXG	A,B
	RTS

*DISPLAY A BYTE AND A SPACE
DSPSBY	BSR	OUTHEX

*OUTPUT A SPACE TO THE CONSOLE
OUTSP	PSHS	A
	LDA	#SP

*OUTPUT CHARACTER, RESTORE A, & RETURN
OUTCHX	BSR	OUTCHR
	PULS	A,PC

*DISPLAY R(A) AS 2 HEX DIGITS
OUTHEX	PSHS	A
	LSRA
	LSRA
	LSRA
	LSRA
	BSR	OUTDIG
	LDA	0,S
	BSR	OUTDIG
	PULS	A,PC

*DISPLAY A HEX DIGIT
OUTDIG	ANDA	#$0F
	ADDA	#$30
	CMPA	#$39
	BLS	OUTCHR
	ADDA	#7
	BRA	OUTCHR

*PRINT A STRING TO THE CONSOLE
PSTRNG	LDA	0,X
	ANDA	#$7F
	BSR	OUTCHR
	TST	,X+
	BPL	PSTRNG
	RTS

*PRINT CR/LF ON CONSOLE
CRLF	PSHS	A
	LDA	#CR
	BSR	OUTCHR
	LDA	#LF
	BRA	OUTCHX

*SAVE A PROGRAM ON TAPE
TSAVE	BSR	GETHX
	BEQ	TSAVE2
	STX	BEGADD
	BSR	GETHX
	BNE	TSAVE1
	LDX	BEGADD
	INCB
TSAVE1	STX	ENDADD
TSAVE2	LDX	CODCB
	PSHS	A,X
	LDX	TPDCB
	STX	CODCB
	TSTB
	BEQ	TSAVE3
	BSR	SAVE
TSAVE3	PULS	A
	CMPA	#CR
	BNE	TSAVE4
	LDB	#'9
	BSR	OUTSN
TSAVE4	PULS	X
	STX	CODCB
	RTS

*GET HEX NUMBER INTO I(X)
GETHX	JMP	GETHEX

*SAVE A PROGRAM IN HEX
SAVE	LDX	BEGADD
SAVE1	LDB	#'1
	BSR	OUTSN
	CLR	CKSUM
	LDD	ENDADD
	PSHS	X
	SUBD	,S++
	TSTA
	BNE	SAVE2
	CMPB	#16
	BLO	SAVE3
SAVE2	LDB	#15
SAVE3	INCB
	TFR	B,A
	ADDA	#3
	BSR	OUTBYT
	PSHS	X
	PULS	A
	BSR	OUTBYT
	PULS	A
	BSR	OUTBYT
SAVE4	LDA	,X+
	BSR	OUTBYT
	DECB
	BNE	SAVE4
	LDA	CKSUM
	COMA
	BSR	OUTBYT
	LEAY	-1,X
	CMPY	ENDADD
	BNE	SAVE1
	RTS

*OUTPUT BYTE AS HEX AND ADD TO CHECKSUM
OUTBYT	JSR	OUTHEX
	ADDA	CKSUM
	STA	CKSUM
	RTS

*OUTPUT 'S' TAPE RECORD HEADERS
OUTSN	JSR	CRLF
	LDA	#'S
	BSR	OUTC
	TFR	B,A

*OUTPUT CHARACTER TO CONSOLE
OUTC	JMP	OUTCHR

*MEMORY EXAMINE AND CHANGE
MEMEC	BSR	GETHX
	BNE	MEMEC1
	LDX	MEMPTR
MEMEC1	STX	MEMPTR
	JSR	CRLF
	TFR	X,D
	JSR	DSPDBY
	LDA	,X+
	JSR	DSPSBY
	TFR	X,Y
	BSR	GETHX
	EXG	D,X
	BEQ	MEMEC2
	STB	-1,Y
	CMPB	-1,Y
	BEQ	MEMEC2
	JSR	ERROR
MEMEC2	TFR	X,D
	TFR	Y,X
	CMPA	#CR
	BEQ	MEMEC3
	CMPA	#'^
	BNE	MEMEC1
	LEAX	-2,X
	BRA	MEMEC1
MEMEC3	RTS

*GOTO ADDRESS
GO	LDS	STKPTR
	JSR	GETHEX
	BEQ	GO1
	STX	10,S
GO1	LDA	0,S
	ORA	#$80
	STA	0,S
INTRET	RTI

*BREAKPOINT (SOFTWARE INTERUPT) TRAP
BRKPNT	LDX	10,S
	LEAX	-1,X
	STX	10,S
	LDB	#$FF
	JSR	REMBK

*INTERUPT (HARDWARE/SOFTWARE) TRAP
TRAP	STS	STKPTR
	JSR	CRLF
	BSR	REGDMP
	JMP	GETCMD

*REGISTER EXAMINE AND CHANGE
REGEC	JSR	INCHR
	JSR	CRLF
	CLRB
	LDX	#REGIDS
REGEC1	CMPA	B,X
	BEQ	REGEC2
	INCB
	CMPB	#11
	BLS	REGEC1
	BRA	REGDMP
REGEC2	PSHS	B
	BSR	RDUMP
	JSR	GETHEX
	PULS	B
	BEQ	REGECX
	LEAY	B,Y
	CMPB	#3
	TFR	X,D
	BLS	REGEC3
	STA	,Y+
REGEC3	STB	0,Y
REGECX	RTS

REGIDS	FCC	'CABDXXYYUUPP'

*COMPLETE REGISTER DUMP
REGDMP	LDX	#REGIDS
	CLRB
RGDMP1	LDA	B,X
	BSR	RDUMP
	INCB
	CMPB	#11
	BLS	RGDMP1
	LDA	#'S
	BSR	DSPID
	LDY	#STKPTR-12
	BRA	RDUMP1

*DISPLAY REGISTER CONTENTS
RDUMP	BSR	DSPID
	LDY	STKPTR
	CMPB	#3
	BLS	RDUMP2
RDUMP1	LDA	B,Y
	JSR	OUTHEX
	INCB
RDUMP2	LDA	B,Y
	JMP	DSPSBY

*DISPLAY REGISTER ID
DSPID	BSR	OUTCH
	LDA	#'=

*OUTPUT CHARACTER TO CONSOLE
OUTCH	JMP	OUTCHR

*SET A BREAKPOINT
SETBK	JSR	GETHEX
	BEQ	DSPBK
	BSR	INITBP
SETBK1	LDD	0,Y
	BEQ	SETBK2
	BSR	NEXTBP
	BNE	SETBK1
	BRA	DSPBK
SETBK2	STX	0,Y
	BEQ	DSPBK
	LDA	0,X
	STA	2,Y
	LDA	#$3F
	STA	0,X

*DISPLAY ALL BREAKPOINTS
DSPBK	JSR	CRLF
	BSR	INITBP
DSPBK1	LDD	0,Y
	BEQ	DSPBK2
	JSR	DSPDBY
DSPBK2	BSR	NEXTBP
	BNE	DSPBK1
	RTS

*INITTIALIZE BREAKPOINT TABLE POINTER
INITBP	LDY	#BPTABL
	RTS

*ADVANCE BREAKPOINT TABLE POINTER
NEXTBP	LEAY	3,Y
	CMPY	#BPTEND
	RTS

*UNSET A BREAKPOINT
UNSBK	JSR	GETHEX

*REMOVE ONE OR MORE BREAKPOINTS
REMBK	BSR	INITBP
REMBK1	TSTB
	BEQ	REMBK2
	CMPX	0,Y
	BEQ	UNSET
	BRA	REMBK3
REMBK2	BSR	UNSET
REMBK3	BSR	NEXTBP
	BNE	REMBK1
	RTS

*REMOVE A BREAKPOINT
UNSET	LDX	0,Y
	BEQ	UNSET1
	LDA	2,Y
	STA	0,X
	CLR	0,Y
	CLR	1,Y
UNSET1	RTS

*TERMINAL DRIVER (ACIA)
TERMDR	CLR	DCBERR,X
	LDX	DCBIOA,X
	LSRB
	BCS	TERMRD
	LSRB
	BCS	TERMWT
	LSRB
	BCS	TERMST
	LSRB
	BCC	TERM1
	STA	0,X
TERM1	RTS

TERMRD	LDB	0,X
	LSRB
	BCC	TERMRD
	LDA	1,X
	RTS

TERMWT	LDB	0,X
	BITB	#2
	BEQ	TERMWT
	STA	1,X
	RTS

TERMST	LDA	0,X
	ANDA	#3
	RTS

*INTERUPT HANDLERS
SWI3	JMP	[SWI3V]
SWI2	JMP	[SWI2V]
FIRQ	JMP	[FIRQV]
IRQ	JMP	[IRQV]
SWI	JMP	[SWIV]
NMI	JMP	[NMIV]

*PSYMON COMMAND TABLE
CMDTBL	FCB	1
	FCB	'M
	FDB	MEMEC
	FCB	'G
	FDB	GO
	FCB	'L
	FDB	TLOAD
	FCB	'S
	FDB	TSAVE
	FCB	'R
	FDB	REGEC
	FCB	'B
	FDB	SETBK
	FCB	'U
	FDB	UNSBK
	FCB	$FF

*RAM INITIALIZATION DATA
RAMINT	FCC	'CN'
	FDB	TERMDR,TERMNL,0,CONDCB,CONDCB,CONDCB,CONDCB,CONDCB
	FDB	TRAP,TRAP,INTRET,TRAP,BRKPNT,TRAP,FREE
	FCB	-1,-1,-1,-1
	FDB	RAM,DSPSBY,DSPDBY,GETHEX,PSTRNG,INCHR,OUTCHR,REQIO,MONENT

*HARDWARE VECTORS
	FDB	INIT,SWI3,SWI2,FIRQ,IRQ,SWI,NMI,INIT

	END




                      