	NAM	SWTBUG
*	VERSION 1.00

****************************************************
*REPLACEMENT FOR MIKBUG ROM
*FOR SWTPC 6800 COMPUTER SYSTEM
*COPYRIGHT 1977
*SOUTHWEST TECHNICAL PROD. CORP.
*AUGUST, 1977
****************************************************

	ORG	$A000
IRQ	RMB	2	IRQ POINTER
BEGA	RMB	2	BEGINNING ADDR PNCH
ENDA	RMB	2	ENDING ADDR PNCH
NMI	RMB	2	NMI INTERRUPT VECTOR
SP	RMB	1	S HIGH
	RMB	1	S LOW
PORADD	RMB	2	PORT ADDRESS
PORECH	RMB	1	ECHO ON/OFF FLAG
XHI	RMB	1	XREG HIGH
XLOW	RMB	1	XREG LOW
CKSM	RMB	1	CHECKSUM
XTEMP	RMB	2	X-REG TEMP STGE
SWIJMP	RMB	2	SWI JUMP VECTOR
TW	EQU	$A044	TEMPORARY STORAGE
TEMP	EQU	$A046	TEMPORARY STORAGE
BYTECT	EQU	$A047	BYTECT AND MCONT TEMP.
CTLPOR	EQU	$8004	CONTROL PORT ADDRESS
PROM	EQU	$C000	JUMP TO PROM ADDRESS
BKPT	RMB	2	BREAKPOINT ADDRESS
BKLST	RMB	1	BREAKPOINT DATA

	ORG	$A042
STACK	RMB	1	SWTBUG STACK

	ORG	$E000

*I/O INTERRUPT SEQUENCE
IRQV	LDX	IRQ
	JMP	0,X

*JUMP TO USER PROGRAM
JUMP	BSR	BADDR
	JMP	0,X

CURSOR	FCB	$10,$16,4	CT-1024 CURSOR CONTROL

*ASCII LOADING ROUTINE
LOAD	JSR	RDON	READER ON, DIS ECHO, GET P#
LOAD3	BSR	INCH
	CMPA	#'S
	BNE	LOAD3	1ST CHAR NOT S
	BSR	INCH	READ CHAR
	CMPA	#'9
	BEQ	LOAD21
	CMPA	#'1
	BNE	LOAD3	2ND CHAR NOT 1
	CLR	CKSM	ZERO CHECKSUM
	BSR	BYTE	READ BYTE
	SUBA	#2
	STAA	BYTECT	BYTE COUNT
*BUILD ADDRESS
	BSR	BADDR
*STORE DATA
LOAD11	BSR	BYTE
	DEC	BYTECT
	BEQ	LOAD15	ZERO BYTE COUNT
	STAA	0,X	STORE DATA
	CMPA	0,X	DATA STORED?
	BNE	LOAD19
	INX
	BRA	LOAD11
LOAD15	INC	CKSM
	BEQ	LOAD3
LOAD19	LDAA	#'?
	BSR	OUTCH
LOAD21	JMP	RDOFF1

*BUILD ADDRESS
BADDR	BSR	BYTE	READ 2 FRAMES
	STAA	XHI
	BSR	BYTE
	STAA	XLOW
	LDX	XHI	LOAD IXR WITH NUMBER
	RTS

*INPUT BYTE (TWO FRAMES)
BYTE	BSR	INHEX	GET HEX CHAR
BYTE1	ASLA
	ASLA
	ASLA
	ASLA
	TAB
	BSR	INHEX
	ABA
	TAB
	ADDB	CKSM
	STAB	CKSM
	RTS

OUTHL	LSRA	OUT	HEX LEFT BCD DIGIT
	LSRA
	LSRA
	LSRA
OUTHR	ANDA	#$F	OUT HEX RIGHT BCD DIGIT
	ADDA	#$30
	CMPA	#$39
	BLS	OUTCH
	ADDA	#$7

*OUTPUT ONE CHAR
OUTCH	JMP	OUTEEE
INCH	JMP	INEEE

*PRINT DATA POINTED TO BY X REG
PDATA2	BSR	OUTCH
	INX
PDATA1	LDAA	0,X
	CMPA	#4
	BNE	PDATA2
	RTS	STOP	ON HEX 04

C1	JMP	SWTCTL

*MEMORY EXAMINE AND CHANGE
CHANGE	BSR	BADDR
CHA51	LDX	#MCL
	BSR	PDATA1	C/R L/F
	LDX	#XHI
	BSR	OUT4HS	PRINT ADDRESS
	LDX	XHI
	BSR	OUT2HS	PRINT OLD DATA
	BSR	OUTS	OUTPUT SPACE
ANOTH	BSR	INCH	INPUT CHAR
	CMPA	#$20
	BEQ	ANOTH
	CMPA	#$D
	BEQ	C1
	CMPA	#'^	UP ARROW?
	BRA	AL3	BRANCH FOR ADJUSTMENT
	NOP

*INPUT HEX CHARACTER
INHEX	BSR	INCH
INHEX1	SUBA	#$30
	BMI	C3
	CMPA	#$9
	BLE	IN1HG
	CMPA	#$11
	BMI	C3	NOT HEX
	CMPA	#$16
	BGT	C3	NOT HEX
	SUBA	#7
IN1HG	RTS

OUT2H	LDAA	0,X	OUTPUT 2 HEX CHAR
OUT2HA	BSR	OUTHL	OUT LEFT HEX CHAR
	LDAA	0,X
	INX
	BRA	OUTHR	OUTPUT RIGHT HEX CHAR

OUT4HS	BSR	OUT2H	OUTPUT 4 HEX CHAR + SPACE
OUT2HS	BSR	OUT2H	OUTPUT 2 HEX CHAR + SPACE

OUTS	LDAA	#$20	SPACE
	BRA	OUTCH	(BSR & TRS)

*ENTER POWER ON SEQUENCE
START	LDS	#STACK
	BRA	AL1	BRANCH FOR ADDRESS COMPATIBIL

********************************************
*PART OF MEMORY EXAMINE AND CHANGE
AL3	BNE	SK1
	DEX
	DEX
	STX	XHI
	BRA	CHA51
SK1	STX	XHI
	BRA	AL4

EOE3	BRA	CONTRL	BRANCH FOR MIKBUG EQUIV. CONT

AL4	CMPA	#$30
	BCS	CHA51
	CMPA	#$46
	BHI	CHA51
	BSR	INHEX1
	JSR	BYTE1
	DEX
	STAA	0,X	CHANGE MEMORY
	CMPA	0,X
	BEQ	CHA51	DID CHANGE
	JMP	LOAD19	DIDN'T CHANGE
C3	LDS	SP
	BRA	SWTCTL
**************************************************

*CONTINUE POWER UP SEQUENCE
AL1	STS	SP	INIT TARGET STACK PTR.
	LDAA	#$FF
	JSR	SWISET
*CONFIGURE FOR PIA AND SEE IF OK
	LDX	#CTLPOR
	JSR	PIAINI	INIT PIA
	LDAA	0,X
	CMPA	2,X
	BRA	AL2

	BRA	PRINT	BRA FOR BILOAD

AL2	BNE	CONTRL

*INITIALIZE AS ACIA
	LDAA	#3	ACIA MASTER RESET
	STAA	0,X
	LDAA	#$11
	STAA	0,X
	BRA	CONTRL

*ENTER FROM SOFTWARE INTERRUPT
SF0	NOP
SFE1	STS	SP	SAVE TARGETS STACK POINTER
*DECREMENT P COUNTER
	TSX
	TST	6,X
	BNE	*+4
	DEC	5,X
	DEC	6,X
*PRINT CONTENTS OF STACK.
PRINT	LDX	#MCL
	JSR	PDATA1
	LDX	SP
	INX
	BSR	OUT2HS	COND CODES
	BSR	OUT2HS	ACC B
	BSR	OUT2HS	ACC A
	BSR	OUT4HS	IXR
	BSR	OUT4HS	PGM COUNTER
	LDX	#SP
	JSR	OUT4HS	STACK POINTER
SWTCTL	LDX	SWIJMP
	CPX	#SF0
	BEQ	CONTR1

CONTRL	LDS	#STACK	SET CONTRL STACK POINTER
	LDX	#CTLPOR	RESET TO CONTROL PORT
	STX	PORADD
	CLR	PORECH	TURN ECHO ON
	BSR	SAVGET	GET PORT # AND TYPE
	BEQ	POF1
	JSR	PIAECH	SET PIA ECHO ON IF MP-C INTER
POF1	JSR	PNCHOF	TURN PUNCH OFF
	JSR	RDOFF	TURN READER OFF
CONTR1	LDX	#MCLOFF
	JSR	PDATA1	PRINT DATA STRING
	BSR	INEEE	READ COMMAND CHARACTER

*COMMAND LOOKUP ROUTINE
LOOK	LDX	#TABLE
OVER	CMPA	0,X
	BNE	SK3
	JSR	OUTS	SKIP SPACE
	LDX	1,X
	JMP	0,X
SK3	INX
	INX
	INX
	CPX	#TABEND+3
	BNE	OVER
SWTL1	BRA	SWTCTL

*SOFTWARE INTERRUPT ENTRY POINT
SFE	LDX	SWIJMP	JUMP TO VECTORED SOFTWARE INT
	JMP	0,X

S9	FCB	'S,'9,4	END OF TAPE

***************************************************
MTAPE1	FCB	$D,$A,$15,0,0,0,'S,'1,4	PUNCH FORMAT

MCLOFF	FCB	$13	READER OFF
MCL	FCB	$D,$A,$15,0,0,0,'$,4

EIA5	BRA	BILD	BINARY LOADER INPUT
***************************************************


*NMI SEQUENCE
NMIV	LDX	NMI	GET NMI VECTOR
	JMP	0,X

INEEE	BRA	INEEE1

*BYTE SEARCH ROUTINE
SEARCH	JSR	BADDR	GET TOP ADDRESS
	STX	ENDA
	JSR	BADDR	GET BOTTOM ADDRESS
	JSR	BYTE	GET BYTE TO SEARCH FOR
	TAB
OVE	LDAA	0,X
	STX	XHI
	CBA
	BEQ	PNT
	BRA	INCR1
PNT	LDX	#MCL
	JSR	PDATA1
	LDX	#XHI
	BRA	SKP0
***************************************************

*GO TO USER PROGRAM ROUTINE
GOTO	RTI
OUTEEE	BRA	OUTEE1



*SAVE IXR AND LOAD IXR WITH CORRECT
*PORT NUMBER AND TEST FOR TYPE
SAVGET	STX	XTEMP	STORE INDEX REGISTER
GETPT1	LDX	PORADD
ISACIA	PSHB
	LDAB	1,X
	CMPB	3,X
	PULB
	RTS
***************************************************

*CONTINUATION OF SEARCH ROUTINE
SKP0	JSR	OUT4HS
	LDX	XHI
INCR1	CPX	ENDA
	BEQ	SWTL1
	INX
	BRA	OVE

INEEE1	BSR	INCH8	INPUT 8 BIT CHARACTER
	ANDA	#%01111111	GET RID OF PARITY BIT
	RTS

BILD	INS	FIX UP STACK WHEN USING
	INS	BINARY LOADER ON SWTPC TAPES
	INS

*INPUT ONE CHAR INTO ACC B
INCH8	PSHB		SAVE ACC B
	BSR	SAVGET	SAVE IXR, GET PORT# AND TYPE
	BNE	IN1	INPUT FROM PIA IF NOT
	LDAA	#$15	RECONFIG FOR 8 BIT, 1 SB
	STAA	0,X
ACIAIN	LDAA	0,X
	ASRA
	BCC	ACIAIN	NOT READY
	LDAA	1,X	LOAD CHAR
	LDAB	PORECH
	BEQ	ACIOUT	ECHO
	BRA	RES	DON'T ECHO

*OUTPUT ONE CHARACTER
OUTEE1	PSHB		SAVE ACC B
	BSR	SAVGET
	BNE	IOUT

ACIOUT	LDAB	#$11
	STAB	0,X
ACIOU1	LDAB	0,X
	ASRB
	ASRB
	BCC	ACIOU1	ACIA NOT READY
	STAA	1,X	OUTPUT CHARACTER
RES	PULB		RESTORE ACC B
	LDX	XTEMP
	RTS

*PIA INPUT ROUTINE
IN1	LDAA	0,X	LOOK FOR START BIT
	BMI	IN1
	BSR	DDL	DELAY HALF BIT TIME
	LDAB	#4	SET DEL FOR FULL BIT TIME
	STAB	2,X
	ASLB		SET UP CNTR WITH 8
IN3	BSR	DEL	WAIT ONE CHAR TIME
	SEC
	ROL	0,X
	RORA
	DECB
	BNE	IN3
	BSR	DEL	WAIT FOR STOP BIT
	LDAB	PORECH	IS ECHO DESIRED?
	BEQ	IOUT2	ECHO
	BRA	RES	RESTORE IXR,ACCB
*PIA OUTPUT ROUTINE
IOUT	BSR	DDL1	DELAY ONE HALF BIT TIME
	LDAB	#$A	SET UP COUNTER
	DEC	0,X	SET START BIT
	BSR	DE	START TIMER
OUT1	BSR	DEL	DELAY ONE BIT TIME
	STAA	0,X	PUT OUT ONE DATA BIT
	SEC
	RORA	SHIFT	IN NEXT BIT
	DECB		DECREMENT COUNTER
	BNE	OUT1	TEST FOR 0
IOUT2	LDAB	2,X	TEST FOR STOP BITS
	ASLB	SHIFT	BIT TO SIGN
	BPL	RES	BRA FOR 1 STOP BIT
	BSR	DEL	DELAY FOR STOP BITS
	BRA	RES
DEL	TST	2,X	IS TIME UP
	BPL	DEL
DE	INC	2,X	RESET TIMER
	DEC	2,X
	RTS

DDL	CLR	2,X	HALF BIT DELAY
DDL1	BSR	DE
	BRA	DEL


*OPTIONAL PORT ROUTINE
OPTL	BSR	INEEE1
	TAB
	CLR	PORADD+1	SET I/O ADDRESS FOR $8000
	LDX	PORADD
	BSR	PIAINI	INITIALIZE PIA
	BSR	PIAECH	SET ECHO
	LDX	#TABLE1	P, L OR E
	TBA
	JMP	OVER	LOOK AT TABLE FOR E, L OR P

PIAECH	LDAA	#$34	SET DDR
	STAA	3,X
	STAA	2,X
NOOPT	RTS

*PIA INITIALIZATION ROUTINE
PIAINI	INC	0,X	SET DDR
	LDAA	#$7
	STAA	1,X
	INC	0,X
	STAA	2,X
	RTS

*MINIFLOPPY DISK BOOT
DISK	CLR	$8014
	BSR	DELAY
	LDAB	#$0B
	BSR	RETT2
LOOP1	LDAB	4,X
	BITB	#1
	BNE	LOOP1
	CLR	6,X
	BSR	RETURN
	LDAB	#$9C
	BSR	RETT2
	LDX	#$2400
LOOP2	BITB	#2
	BEQ	LOOP3
	LDAA	$801B
	STAA	0,X
	INX
LOOP3	LDAB	$8018
	BITB	#1
	BNE	LOOP2
	JMP	$2400
RETT2	STAB	4,X
RETURN	BSR	RETT1
RETT1	RTS

*GENERAL PURPOSE DELAY LOOP
DELAY	LDX	#$FFFF
DELAY1	DEX
	CPX	#$8014	STOP AT 8014
DUM	BNE	DELAY1
	RTS


*CLRAR SCREEN FOR CT-1024 TYPE TERMINALS
CLEAR	LDX	#CURSOR
	JSR	PDATA1
	BSR	DELAY1	DELAY
RDOFF1	JSR	RDOFF
	BRA	C4

*BREAKPOINT ENTERING ROUTINE
BREAK	LDX	#SF0
	CPX	SWIJMP	BREAKPOINTS ALREADY IN USE?
	BEQ	INUSE
	INX
BREAK0	BSR	STO1
	JSR	BADDR
	STX	BKPT
	LDAA	0,X
	STAA	BKLST
	LDAA	#$3F
	STAA	0,X
	LDX	#SF0
	BSR	STO1
	JMP	CONTR1
INUSE	LDX	BKPT
	LDAA	BKLST
	STAA	0,X
	LDX	#SFE1
	BRA	BREAK0

SWISET	STAA	STACK+1	FIX POWER UP INTERRUPT
	LDX	SWIJMP
	CPX	#SF0
	BEQ	STORTN
STO	LDX	#SFE1
STO1	STX	SWIJMP
STORTN	RTS

PUNCH1	BSR	PUNCH
	BRA	POFC4

*FORMAT END OF TAPE WITH PGM. CTR. AND S9
PNCHS9	LDX	#$A049
	STX	ENDA
	DEX
	BSR	PUNCH2
	LDX	#S9
PDAT	JSR	PDATA1
POFC4	BSR	PNCHOF
	BSR	DELAY
C4	JMP	CONTRL

RDON	COM	PORECH	DISABLE ECHO FOR ACIA
	LDAA	#$11	RON CHAR.
	LDAB	#$20	STROBE CHAR
	BSR	STROBE
	JSR	ISACIA	CHECK TO SEE IF PIA
	BEQ	RTNN
	LDAA	#$3C	DISABLE PIA ECHO IF PIA
	STAA	3,X
RTNN	RTS

RDOFF	LDAA	#$13	TURN READER OFF
	LDAB	#$10
	BRA	STROBE

PNCHON	LDAA	#$12
	LDAB	#4
	BRA	STROBE

PNCHOF	LDAA	#$14
	LDAB	#$8

*PIA STROBING ROUTINE FOR PUNCH/READ ON/OFF
STROBE	JSR	OUTCH
	JSR	GETPT1
	BEQ	RTN1
	LDAA	#2
	ORAB	#1
	BSR	STR2
	BSR	STR1
	LDAA	#2
	LDAB	#1
	STAB	0,X
	BSR	STR2
STR1	LDAA	#6
STR2	STAA	1,X
	STAB	0,X
RTN1	RTS

*PUNCH FROM BEGINNING ADDRESS (BEGA) THRU
*ENDING ADDRESS (ENDA)
PUNCH	LDX	BEGA
PUNCH2	STX	TW
	BSR	PNCHON
PUN11	LDAA	ENDA+1
	SUBA	TW+1
	LDAB	ENDA
	SBCB	TW
	BNE	PUN22
	CMPA	#16
	BCS	PUN23
PUN22	LDAA	#15
PUN23	ADDA	#4
	STAA	BYTECT
	SUBA	#3
	STAA	TEMP
*PUNCH C/R L/F NULLS S1
	LDX	#MTAPE1
	JSR	PDATA1
	CLRB
*PUNCH FRAME COUNT
	LDX	#BYTECT
	BSR	PUNT2	PUNCH 2 HEX CHARACTERS
*PUNCH ADDRESS
	LDX	#TW
	BSR	PUNT2
	BSR	PUNT2
*PUNCH DATA
	LDX	TW
PUN32	BSR	PUNT2	PUNCH ONE BYTE
	DEC	TEMP
	BNE	PUN32
	STX	TW
	COMB
	PSHB
	TSX
	BSR	PUNT2	PUNCH CHECKSUM
	PULB	RESTORE	STACK
	LDX	TW
	DEX
	CPX	ENDA
	BNE	PUN11
RTN5	RTS

*PUNCH 2 HEX CHAR, UPDATE CHECKSUM
PUNT2	ADDB	0,X
	JMP	OUT2H	OUTPUT 2 HEX CHAR AND RTS

*COMMAND TABLE
TABLE	FCB	'G	GOTO
	FDB	GOTO
	FCB	'Z	GOTO PROM
	FDB	PROM
	FCB	'M	MEMORY EXAM AND CHANGE
	FDB	CHANGE
	FCB	'F	BYTE SEARCH
	FDB	SEARCH
	FCB	'R	REGISTER DUMP
	FDB	PRINT
	FCB	'J	JUMP
	FDB	JUMP
	FCB	'C	CLEAR SCREEN
	FDB	CLEAR
	FCB	'D	DISK BOOT
	FDB	DISK
	FCB	'B	BREAKPOINT
	FDB	BREAK
	FCB	'O	OPTIONAL PORT
	FDB	OPTL
TABLE1	FCB	'P	ASCII PUNCH
	FDB	PUNCH1
	FCB	'L	ASCII LOAD
	FDB	LOAD
TABEND	FCB	'E	END OF TAPE
	FDB	PNCHS9

	ORG	$E3F8
	FDB	IRQV	IRQ VECTOR
	FDB	SFE	SOFTWARE INTERRUPT
	FDB	NMIV	NMI VECTOR
	FDB	START	RESTART VECTOR

*	ORG	$A048
*	FDB	START
	END

