;PAGE	78

;		 .TITLE	'MONITOR	***** MONITP.SRC ***** 3/9/79 *****	4:00:00 P
;
;
;
;	CONSTANT EQUATES
;
PUTTXT	=	$9		;"PUT TEXT RECORD" CIO COMMAND CODE
GETCAR	=	$7		;"GET CHARACTER" CIO COMMAND CODE
PUTCAR	=	$B		;"PUT CHARACTER" CIO COMMAND CODE
INIMLL	=	$00		;INITIAL MEM LO LOW BYTE
INIMLH	=	$07		;INITIAL MEM LO HIGH BYTE
; GOOD	=	$1		;GOOD STATUS CODE
; WRITE =	$57		;WRITE COMMAND
; READ	=	$52		;READ COMMAND
; STATC =	$53		;STATUS COMMAND
SEX	=	$0		;SCREEN EDITOR IOCB INDEX
CLS	=	$7D		;CLEAR SCREEN CODE
CTRLC	=	$92		;KEYBOARD CODE FOR 'CONTROL C'
EOF	=	$88		;CASSETTE END OF FILE CODE
LIRG	=	$0		;LONG IRG TYPE CODE
;
BUFFH	=	(CASBUF+3)/256
BUFFL	=	(-256)*BUFFH+CASBUF+3 ;BUFFER POINTER
;
;
;
; THE FOLLOWING EQUATES ARE IN THE CARTRIDGE ADDRESS SPACE.
;
;
; "B" CARTRIDGE ADDR'S ARE 8000-9FFF (36K CONFIG. ONLY)
; "A" CART. ADDR'S ARE A000-BFFF (36K CONFIG. ONLY)
;
; "A" CART. ADDR'S ARE B000-BFFF (48K CONFIG. ONLY)
;
	.ORG	$BFFA
CARTCS: .RES	2		;CARTRIDGE COLD START ADDRESS.
CART:	.RES	1		;CARTRIDGE AVAILABLE FLAG BYTE.
CARTFG: .RES	1		;CARTRIDGE FLAG BYTE. BIT0=FLAG1,
CARTAD: .RES	2		;2-BYTE CARTRIDGE START VECTOR
;
;
;	CARTRIDGE FLAG ACTION DEFINITIONS
;
;
;	BIT		ACTION IF SET
;
;	7		SPECIAL -- DON'T POWER-UP, JUST RUN CARTRIDGE
;	6-3		NONE
;	2		RUN CARTRIDGE
;	1		NONE
;	0		BOOT DOS
;
;
 

;PAGE	79

;	*****
;	NOTE
;	*****
;
;	1.IF BIT2 IS 0, GOTO BLACKBOARD MODE.
;	2.IF BIT0 SET, THE DISK WILL BE BOOTED BEFORE ANY
;	 OTHER ACTION.
;
;
;
;
;
;
;
;
;
;	POWER-UP VECTOR
;
;****************************
;	.ORG	$FFFC
;
; PVECT .WORD	PWRUP		POWER-UP VECTOR
;*************************
;
;
;
;
;
;	ENTRY POINT VECTOR
;
	.ORG	BLKBDV
;
	JMP	SIGNON		;BLACK BOARD VECTOR
;
	.ORG	WARMSV
;
	JMP	RESET		;WARM START VECTOR
;
	.ORG	COLDSV
;
	JMP	PWRUP		;COLD START VECTOR (9000 FOR RAM VECTOR WRIT
;
	.ORG	$9000
	JSR	$900C
	JMP	PWRUP		;(TO HANDLE RAM VECTOR WRITING)
	JSR	$900C
	JMP	RESET
;
;
;
	.ORG	MONORG
;
;
;
 

;PAGE	80

;
;	HANDLER TABLE ENTRIES
;
TBLENT: .BYTE	'P'
	.WORD	PRINTV
	.BYTE	'C'
	.WORD	CASETV
	.BYTE	'E'
	.WORD	EDITRV
	.BYTE	'S'
	.WORD	SCRENV
	.BYTE	'K'
	.WORD	KEYBDV

;
;
;TBLLEN	=	IDENT-TBLENT-1	HANDLER TABLE LENGTH.	"MOVED TO LINE 8
;
;	***** PRINT MESSAGES *****
;
;
;	IDENT:	.BYTE	CLS,'ATARI COMPUTER - MEMO PAD',CR	
; KH!!!
IDENT:	.BYTE	CLS,"ATARI COMPUTER - MEMO PAD",CR



;
IDENTH	=	IDENT/256
IDENTL	=	(-256)*IDENTH+IDENT ;SYSTEM I.D. MSG POINTER
;
TBLLEN	=	IDENT-TBLENT-1 ;HANDLER TABLE LENGTH
;DERR5:	.BYTE	'BOOT ERROR',CR
; KH!!!
DERR5:	.BYTE	"BOOT ERROR",CR

;
DERRH	=	DERR5/256
DERRL	=	(-256)*DERRH+DERR5 ;DISK ERROR MSG POINTER
;
;
;
;
;	DEVICE/FILENAME SPECIFICATIONS
;
;OPNEDT: .BYTE	'E:',CR ;"OPEN SCREEN EDITOR" DEVICE SPEC.
; KH!!!
OPNEDT: .BYTE	"E:",CR ;"OPEN SCREEN EDITOR" DEVICE SPEC.
;
OPNH	=	OPNEDT/256
OPNL	=(-256)*OPNH+OPNEDT ;SCREEN EDITOR OPEN POINTER
			;
;
;
;
;*****************************************************************
;PAGE	81

;	RESET BUTTON ROUTINE STARTS HERE
;*****************************************************************
;
RESET:	SEI			;DISABLE IRQ INTERRUPTS
	LDA	COLDST		;WERE WE IN MIDDLE OF COLDSTART?
	BNE	PWRUP		;YES, GO TRY IT AGAIN
	LDA	#$FF
	BNE	PWRUP1		;SET WARM START FLAG
;
;
;
;***************************************************************
;	POWER UP ROUTINES START HERE
;***************************************************************
;
PWRUP:	SEI			;DISABLE IRQ INTERRUPTS
	LDA	#0		;CLEAR WARMSTART FLAG
PWRUP1: STA	WARMST
	CLD			;CLEAR DECIMAL FLAG.
	LDX	#$FF
	TXS			;SET STACK POINTER
	JSR	SPECL		;CARTRIDGE SPECIAL CASE?
	JSR	HARDI		;DO HARDWARE INITIALIZATION
	LDA	WARMST		;IS IT WARMSTART?
	BNE	ZOSRAM		;YES, ONLY ZERO OS RAM
;
ZERORM: LDA	#0
	LDY	#WARMST
	STA	RAMLO
	STA	RAMLO+1		;INITIALIZE RAM POINTER
CLRRAM: STA	(RAMLO),Y	;CLEAR MEMORY LOC.
	INY
	CPY	#0		;AT END OF PAGE?
	BNE	CLRRAM
	INC	RAMLO+1		;YES, INCR PAGE POINTER
	LDX	RAMLO+1
	CPX	TRAMSZ		;AT END OF MEM?
	BNE	CLRRAM		;NO.
;
; INITIALIZE DOSVEC TO POINT TO SIGNON (BLACKBOARD)
	LDA	BLKBDV+1
	STA	DOSVEC		;USE BLACKBOARD VECTOR
	LDA	BLKBDV+2	;FOR DOSVEC
	STA	DOSVEC+1
	LDA	#$FF
	STA	COLDST		;SET TO SHOW IN MIDDLE OF COLDSTART
	BNE	ESTSCM		;GO AROUND ZOSRAM
;
; CLEAR OS RAM (FOR WARMSTART)
ZOSRAM: LDX	#0
	TXA
ZOSRM2: STA	$200,X		;CLEAR PAGES 2 AND 3
	STA	$300,X
	DEX
 
;PAGE	82

	BNE	ZOSRM2
	LDX	#INTZBS
ZOSRM3: STA	0,X		;CLEAR ZERO PAGE LOCATIONS INTZBS-7F
	INX
	BPL	ZOSRM3
;
; ESTABLISH SCREEN MARGINS
ESTSCM: LDA	#LEDGE
	STA	LMARGN
	LDA	#REDGE
	STA	RMARGN
;
;
; MOVE VECTOR TABLE FROM ROM TO RAM
OPSYS:	LDX	#$25
MOVVEC: LDA	VCTABL,X	;ROM TABLE
	STA	INTABS,X	;TO RAM
	DEX
	BPL	MOVVEC
	JSR	OSRAM		;DO O.S. RAM SETUP
	CLI			;ENABLE IRQ INTERRUPTS
;
;
;	LINK HANDLERS
;
	LDX	#TBLLEN
NXTENT: LDA	TBLENT,X	;READ HANDLER TABLE ENTRY
	STA	HATABS,X	;PUT IN TABLE
	DEX
	BPL	NXTENT		;DONE WITH ALL ENTRIES?
;
;
;
;
;
; INTERROGATE CARTRIDGE ADDR. SPACE TO SEE WHICH CARTRIDGES THERE ARE
;
	LDX	#0
	STX	TSTDAT		;CLEAR "B" CART. FLAG
	STX	TRAMSZ		;CLEAR "A" CART. FLAG
	LDX	RAMSIZ
	CPX	#$90		;RAM IN "B" CART. SLOT?
	BCS	ENDBCK
	LDA	CART-$2000	;NO,
	BNE	ENDBCK		;CART. PLUGGED INTO "B" SLOT?
	INC	TSTDAT		;YES, SET "B" CART.	FLAG
	JSR	CBINI		;INITIALIZE CARTRIDGE "B"
;
ENDBCK: LDX	RAMSIZ
	CPX	#$B0		;RAM IN "A" CART. SLOT?
	BCS	ENDACK
	LDX	CART		;NO,
	BNE	ENDACK		;CART. PLUGGED INTO "A" SLOT?
	INC	TRAMSZ		;YES, SET "A", CART. FLAG
 

;PAGE	83

	JSR	CAINI		;INITIALIZE CARTRIDGE "A"
;
;
; OPEN SCREEN EDITOR
;
ENDACK: LDA	#3
	LDX	#SEX
	STA	ICCOM,X		;OPEN I/O COMMAND
	LDA	#OPNL
	STA	ICBAL,X
	LDA	#OPNH
	STA	ICBAH,X		;SET BUFFER POINTER TO OPEN SCREEN EDITOR
	LDA	#$C
	STA	ICAX1,X		;SET UP OPEN FOR INPUT/OUTPUT
	JSR	CIOV
;
	BPL	SCRNOK		;BR IF NO ERROR
	JMP	PWRUP		;RETRY PWRUP IF ERROR (SHOULD NEVER HAPPEN!)
SCRNOK: INX			;SCREEN OK, SO WAIT FOR VBLANK TO
	BNE	SCRNOK		;BRING UP THE DISPLAY
	INY
	BPL	SCRNOK
;
;
; DO CASSETTE BOOT
	JSR	CSBOOT		;CHECK, BOOT, AND INIT
;
; CHECK TO SEE IF EITHER CARTRIDGE WANTS DISK BOOT
	LDA	TRAMSZ		;CHECK BOTH CARTRIDGES
	ORA	TSTDAT		;
	BEQ	NOCART		;NEITHER CARTRIDGE LIVES
	LDA	TRAMSZ		;"A" CART?
	BEQ	NOA1		;NO
	LDA	CARTFG		;GET CARTRIDGE MODE FLAG
NOA1:	LDX	TSTDAT		;"B" CART?
	BEQ	NOB1		;NO
	ORA	CARTFG-$2000 ;ADD OTHER FLAG
NOB1:	AND	#1		;DOES EITHER CART WANT BOOT_query
	BEQ	NOBOOT		;NO
;
; DO DISK BOOT
NOCART: JSR	BOOT		;CHECK, BOOT, AND INIT
;
; GO TO ONE OF THE CARTRIDGES IF THEY SO DESIRE
NOBOOT: LDA	#0
	STA	COLDST		;RESET TO SHOW DONE WITH COLDSTART
	LDA	TRAMSZ		;"A" CART?
	BEQ	NOA2		;NO
	LDA	CARTFG		;GET CARTRIDGE MODE FLAG
	AND	#4		;DOES IT WANT TO RUN?
	BEQ	NOA2		;NO
	JMP	(CARTCS)	;RUN "A" CARTRIDGE
NOA2:	LDA	TSTDAT		;"B" CART?
	BEQ	NOCAR2		;NO
 

;PAGE	84

	LDA	CARTFG-$2000	;GET "B" MODE FLAG
	AND	#4		;DOES IT WANT TO RUN?
	BEQ	NOCART		;NO
	JMP	(CARTCS-$2000)	;RUN "B" CARTRIDGE
;
; NO CARTRIDGES, OR NEITHER WANTS TO RUN,
; SO GO TO DOSVEC (DOS, CASSETTE, OR BLACKBOARD)
NOCAR2: JMP	(DOSVEC)
;
; PRINT SIGN-ON NESSAGE
SIGNON: LDX	#IDENTL
	LDY	#IDENTH
	JSR	PUTLIN		;GO PUT SIGN-ON MSG ON SCREEN
;
;
;
;	BLACKBOARD ROUTINE
BLACKB: JSR	BLKB2		;"JSR EGETCH"
	JMP	BLACKB		;FOREVER
BLKB2:	LDA	EDITRV+5	;HIGH BYTE
	PHA
	LDA	EDITRV+4	;LOW BYTE
	PHA
	RTS			;SIMULATES "JMP (EDITRV)"
;
;
; CARTRIDGE INITIALIZATION INDIRECT JUMPS
CAINI:	JMP	(CARTAD)
CBINI:	JMP	(CARTAD-$2000)
 

;PAGE	85

;	.PAGE
;
;
;
;
;
;
;		S U B R O U T I N E S
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; CHECK FOR HOW MUCH RAM & SPECIAL CARTRIDGE CASE.
; IF SPECIAL CARTRIDGE CASE, DON'T GO BACK -- GO TO CART.
;
SPECL:	LDA	CART		;CHECK FOR RAM OR CART
	BNE	ENSPE2		;GO IF NOTHING OR MAYBE RAM
	INC	CART		;NOW DO RAM CHECK
	LDA	CART		;IS IT ROM?
	BNE	ENSPEC		;NO
	LDA	CARTFG		;YES,
	BPL	ENSPEC		;BIT SET?
	JMP	(CARTAD)	;YES, GO RUN CARTRIDGE
;
; CHECK FOR AMOUNT OF RAM
;
;
ENSPEC: DEC	CART		;RESTORE RAM IF NEEDED
ENSPE2: LDY	#0
	STY	RAMLO+1
	LDA	#$10
	STA	TRAMSZ		;SET RAM POINTER TO 4K.
HOWMCH: LDA	(RAMLO+1),Y	;READ RAM LOCATION
	EOR	#$FF		;INVERT IT.
	STA	(RAMLO+1),Y	;WRITE INVERTED DATA.
	CMP	(RAMLO+1),Y	;READ RAM AGAIN
	BNE	ENDRAM
	EOR	#$FF		;CONVERT IT BACK
	STA	(RAMLO+1),Y	;RESTORE ORIGINAL RAM DATA
	LDA	TRAMSZ
 

;PAGE	86

	CLC
	ADC	#$10
	STA	TRAMSZ		;INCR. RAM POINTER BY 4K.
	BNE	HOWMCH		;GO FIND HOW MUCH RAM.
ENDRAM: RTS
;
;
;
;
;	HARDWARE INITIALIZATION
;
;
HARDI:	LDA	#0
	TAX
CLRCHP: STA	$D000,X
	STA	$D400,X
	STA	$D200,X
	STA	$D300,X
	INX
	BNE	CLRCHP
	RTS
;
;
;	O.S. RAM SETUP
;
OSRAM:	DEC	BRKKEY		;TURN OFF BREAK KEY FLAG
	LDA	#<BRKKY2
	STA	BRKKY
	LDA	#>BRKKY2
	STA	BRKKY+1
	LDA	TRAMSZ		;READ RAM SIZE IN TEMP. REG.
	STA	RAMSIZ		;SAVE IT IN RAM SIZE.
	STA	MEMTOP+1	; INIT. MEMTOP ADDR HI BYTE
	LDA	#0
	STA	MEMTOP		;INIT. MEMTOP ADDR LO BYTE
	LDA	#INIMLL
	STA	MEMLO
	LDA	#INIMLH
	STA	MEMLO+1		;INITIALIZE MEMLO ADDR VECTOR
	JSR	EDITRV+$C	;EDITOR INIT.
	JSR	SCRENV+$C	;SCREEN INIT.
	JSR	KEYBDV+$C	;KEYBOARD INIT.
	JSR	PRINTV+$C	;PRINTER HANDLER INIT
	JSR	CASETV+$C	;CASSETTE HANDLER INIT
	JSR	CIOINV		;CIO INIT.
	JSR	SIOINV		;SIO INIT.
	JSR	INTINV		;INTERRUPT HANDLER INIT.
	LDA	CONSOL
	AND	#$1
	BNE	NOKEY		;GAME START KEY DEPRESSED?
	INC	CKEY		;YES, SET KEY FLAG.
NOKEY:	RTS
;
;
 

;PAGE	87

; DO BOOT OF DISK
;
BOOT:	LDA	WARMST
	BEQ	NOWARM		;WARM START?
	LDA	BOOT_query	;YES,
	AND	#1
	BEQ	NOINIT		;VALID BOOT_query
	JSR	DINI		;YES, RE-INIT. DOS SOFTWARE
NOINIT: RTS
NOWARM: LDA	#1
	STA	DUNIT		;ASSIGN DISK DRIVE NO.
	LDA	#STATC
	STA	DCOMND		;SET UP STATUS COMMAND
	JSR	DSKINV		;GO DO DISK STATUS
	BPL	DOBOOT		;IS STATUS FROM SIO GOOD?
	RTS			;NO, GO BACK WITH BAD BOOT STATUS
;
DOBOOT: LDA	#0
	STA	DAUX2
	LDA	#1
	STA	DAUX1		;SET SECTOR # TO 1.
	LDA	#BUFFL
	STA	DBUFLO
	LDA	#BUFFH
	STA	DBUFHI		;SET UP BUFFER ADDR
SECT1:	JSR	GETSEC		;GET SECTOR
	BPL	ALLSEC		;STATUS O.K. ?
BADDSK: JSR	DSKRDE		;NO, GO PRINT DISK READ ERROR
	LDA	CASSBT
	BEQ	DOBOOT		;CASSETTE BOOT_query
	RTS			;YES, QUIT
ALLSEC: LDX	#3
RDBYTE: LDA	CASBUF+3,X	;READ A BUFFER BYTE
	STA	DFLAGS,X	;STORE IT
	DEX
	BPL	RDBYTE		;DONE WITH 4 BYTE TRANSFER ?
	LDA	BOOTAD		;YES,
	STA	RAMLO
	LDA	BOOTAD+1
	STA	RAMLO+1		;PUT BOOT ADDR INTO Z. PAGE RAM
	LDA	CASBUF+7
	STA	DOSINI		;ESTABLISH DOS INIT ADDRESS
	LDA	CASBUF+8
	STA	DOSINI+1
MVBUFF: LDY	#$7F		;YES, SET BYTE COUNT
MVNXB:	LDA	CASBUF+3,Y
	STA	(RAMLO),Y	;MOVE A BYTE FROM SECTOR BUFFER TO BOOT ADDR
	DEY
	BPL	MVNXB		;DONE ?
	CLC		;YES,
	LDA	RAMLO
	ADC	#$80
	STA	RAMLO
	LDA	RAMLO+1
 

;PAGE	88

	ADC	#0
	STA	RAMLO+1		;INCR BOOT LOADER BUFFER POINTER.
	DEC	DBSECT		;DECR # OF SECTORS.
	BEQ	ENBOOT		;MORE SECTORS ?
	INC	DAUX1		;YES, INCR SECTOR #
SECTX:	JSR	GETSEC		;GO GET SECTOR.
	BPL	MVBUFF		;STATUS O.K. ?
	JSR	DSKRDE		;NO, GO PRINT DISK READ ERROR
	LDA	CASSBT
	BNE	BADDSK		;IF CASSETTE, QUIT.
	BEQ	SECTX		;IF DISK, TRY SECTOR AGAIN.
ENBOOT: LDA	CASSBT
	BEQ	XBOOT		;CASSETTE BOOT ?
	JSR	GETSEC		;YES, GET EOF RECORD, BUT DON'T USE IT
XBOOT:	JSR	BLOAD		;GO EXECUTE BOOT LOADER
	BCS	BADDSK		;IF BAD BOOT, DO IT OVER AGAIN
	JSR	DINI		;GO INIT. SOFTWARE
	INC	BOOT_query	;SHOW BOOT SUCCESS
	RTS
BLOAD:	CLC
	LDA	BOOTAD
	ADC	#6
	STA	RAMLO
	LDA	BOOTAD+1
	ADC	#0
	STA	RAMLO+1		;PUT START ADDR OF BOOTLOADER INTO RAM
	JMP	(RAMLO)
DINI:	JMP	(DOSINI)
;
;
;
;
; DISPLAY DISK READ ERROR MSG
;
DSKRDE: LDX	#DERRL
	LDY	#DERRH
;
;
;
; PUT LINE ON SCREEN AT PRESENT CURSOR POSITION
;
;	X-REG -- LO BYTE, BEGIN ADDR OF LINE
;	Y-REG -- HI BYTE, BEGIN ADDR OF LINE
;
PUTLIN: TXA
	LDX	#SEX
	STA	ICBAL,X
	TYA
	STA	ICBAH,X		;SET UP ADDR OF BEGIN OF LINE
	LDA	#PUTTXT
	STA	ICCOM,X		;"PUT TEXT RECORD" COMMAND
	LDA	#$FF
	STA	ICBLL,X		;SET BUFFER LENGTH
	JSR	CIOV		;PUT LINE ON SCREEN
 

;PAGE	89

	RTS
;
;
;
;
; GET SECTOR FROM DISK 0
;
GETSEC: LDA	CASSBT
	BEQ	DISKM		;CASSETTE BOOT ?
	JMP	RBLOKV		;YES, GO TO READ BLOCK ROUTINE
DISKM:	LDA	#READ
	STA	DCOMND		;SET READ SECTOR COMMAND
	LDA	#1
	STA	DUNIT		;SET DRIVE NO. TO DRIVE 0
	JSR	DSKINV		;GET SECTOR
	RTS
;
;
;
; DO CHECK FOR CASSETTE BOOT & IF SO, DO BOOT
;
CSBOOT: LDA	WARMST		;WARMSTART?
	BEQ	CSBOT2		;NO
	LDA	BOOT_query	;GET BOOT FLAG
	AND	#2		;WAS CASSETTE BOOT SUCCESFULL?
	BEQ	NOCSB2		;NO
	JSR	CINI		;YES, INIT CASSETTE SOFTWARE
NOCSB2: RTS
;
CSBOT2: LDA	CKEY
	BEQ	NOCSBT		;"C" KEY FLAG SET ?
	LDA	#$80		;YES,
	STA	FTYPE		;SET LONG IRG TYPE
	INC	CASSBT		;SET CASSETTE BOOT FLAG
	JSR	CSOPIV		;OPEN CASSETTE FOR INPUT
	JSR	SECT1		;DO BOOT & INIT.
	LDA	#0
	STA	CASSBT		;RESET CASSETTE BOOT FLAG
	STA	CKEY		;CLEAR KEY FLAG
	ASL	BOOT_query	;SHIFT BOOT FLAG (NOW=2 IF SUCCESS)
	LDA	DOSINI
	STA	CASINI		;MOVE INIT ADDRESS FOR CASSETTE
	LDA	DOSINI+1
	STA	CASINI+1
NOCSBT: RTS
;
CINI:	JMP	(CASINI)	;INIT CASSETTE
;***********************************************************************
;
;
; SPARE BYTE OR MODULE TOO LONG FLAG
;
CRNTP7	=*
;
;PAGE	90

	.ORG	$14
MONSPR: .BYTE	KBDORG-CRNTP7 ;^GMONITP TOO LONG
;
