SWTBUG.asm
crsjones_68Retro/6800-BUGS/SWTBUG/SWTBUG.asm
 NAM SWTBUG
*      VERSION 1.00

* OPT PAG
****************************************************
*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 $FFF8
 FDB IRQV IRQ VECTOR
 FDB SFE SOFTWARE INTERRUPT
 FDB NMIV NMI VECTOR
 FDB START RESTART VECTOR

*ORG $A048
*FDB START
 END
