;********************************************************
;*							*
;*	COLD START INITIALIZATION ROUTINE FOR		*
;*	CONFIGURING THE SYSTEM AFTER A POWER-ON		*
;*	OR PUSHBUTTON RESET.				*
;*				   18-Oct-80		*
;*							*
;********************************************************
;
;
;	-- MONITOR ENTRY POINT TABLE --
;
COLD:	JP	INIT		;MONITOR COLD ENTRY POINT
WARM:	JP	PROMPT		;MONITOR WARM ENTRY POINT
CONST:	JP	KBDST		;CONSOLE STATUS VECTOR
CONIN:	JP	KBDIN		;CONSOLE INPUT VECTOR
CONOUT:	JP	CRTOUT		;CONSOLE OUTPUT VECTOR
	JP	CRTOUT		;CRT OUTPUT VECTOR
	JP	SIOST		;SIO CHANEL B STATUS VECTOR
	JP	SIOIN		;SIO CHANEL B INPUT VECTOR
	JP	SIOOUT		;SIO CHANEL B OUTPUT VECTOR
	JP	SELECT		;DISK DRIVE SELECT
	JP	HOME		;HOME R/W HEAD
	JP	SEEK		;SEEK TO TRACK
	JP	READ		;READ SECTOR
	JP	WRITE		;WRITE SECTOR
;
;
;
;	DO A SHORT POST-RESET TIME DELAY. ALSO INITIALIZES THE
;	STACK POINTER AND FILLS THE MONITOR SCRATCH RAM WITH ZEROS.
;
INIT:	DI
	LD	HL,RAM		;POINT TO START OF MONITOR RAM
INIT1:	LD	(HL),0		;FILL 256 BYTE SPACE WITH ZEROS
	LD	SP,HL		;DO SOMETHING USEFUL TO ADD DELAY
	INC	L
	JR	NZ,INIT1-$	;LOOP TAKES ABOUT 4 MILLISECONDS
;
;	INITIALIZE THE Z-80 FOR INTERRUPT MODE #2

	LD	A,H
	LD	I,A		;LOAD I REG WITH MSB OF VECTOR TABLE
	IM	2		; AND SELECT INTERRUPT MODE 2
;
	CALL	CLRSCN		;FILL THE CRT MEMORY WITH BLANKS
;
;	STORE ANY NON-ZERO VALUES FOR VARIABLES IN MEMORY
;
	LD	HL,INTAB	;POINT TO DEFAULT VARIABLE TABLE
INIT2:	LD	B,0
	LD	C,(HL)		;BC=DATA BLOCK BYTECOUNT
	INC	HL
	LD	E,(HL)		;DE=DESTINATION FOR DATA
	INC	HL
	LD	D,(HL)
	INC	HL
	LDIR			;COPY DATA @ HL TO VARIABLES @ DE
	BIT	7,(HL)
	JR	Z,INIT2-$	;LOOP AGAIN IF NOT AT END OF TABLE
;
;	INITIALIZE THE PROGRAMMABLE I/O DEVICES
;
	INC	HL		;POINT TO I/O INIT DATA TABLE
INIT3:	LD	B,(HL)		;B=INIT LOOP BYTECOUNT
	INC	HL
	LD	C,(HL)		;C=DEVICE CONTROL PORT#
	INC	HL
	OTIR			;SEND DATA @ HL TO PORT @ C
	BIT	7,(HL)		;TEST FOR TABLE END MARKER
	JR	Z,INIT3-$	;LOOP AGAIN IF NOT AT END
;
;	DETERMINE IF CONSOLE I/O CONFIGURATION WILL BE FOR THE
;	ON-BOARD CRT AND KEYBOARD OR AN EXTERNAL SERIAL TERMINAL.
;
	IN	A,(C)		;TEST SIO READ REGISTER 2 TO DETERMINE
	CP	00000110B	; IF THE SIO IS INSTALLED IN THE BOARD
	JR	NZ,PARALL-$	;SKIP CONFIGURATION TEST IF NO SIO
	IN	A,(KBDDAT)	;MAKE SURE KBD PIO 'READY' IS RESET
	LD	B,00010000B	;B=RESET SIO EXTERNAL STATUS COMMAND  
DECIDE:	OUT	(C),B		;TEST FOR ARRIVAL OF A SERIAL
	IN	A,(C)		; INPUT CHARACTER START BIT
	BIT	4,A
	JR	NZ,BAUD-$	;EXIT LOOP IF START BIT DETECTED
	IN	A,(BITDAT)
	BIT	3,A		;TEST FOR DATA READY STROBE FROM
	JR	NZ,DECIDE-$	; PARALLEL KBD AND LOOP IF INACTIVE
PARALL:	IN	A,(KBDDAT)	;DISCARD FIRST KEYBOARD CHARACTER
	LD	A,10000011B
	OUT	(KBDCTL),A	;ENABLE INTERRUPTS FROM KBD PIO
	JR	SIGNON-$	;GO SIGNON WITH BULIT-IN CONSOLE I/O
;
;
;	AUTOMATIC BAUD RATE SETTING ROUTINE FOR SIO
;
BAUD:	XOR	A
BAUD1:	OUT	(C),B
	IN	D,(C)		;READ SIO STATUS REGISTER
	BIT	4,D		;TEST THE SYNC/HUNT BIT
	JR	Z,BAUD1-$	;LOOP UNTIL IT CHANGES STATE
BAUD2:	INC	A
	OUT	(C),B		;RESET REGISTER #0 FLAGS AGAIN
	IN	D,(C)		; AND LOOP TIMING THE SYNC/HUNT BIT
	BIT	4,D
	JR	NZ,BAUD2-$	;REPEAT UNTIL BIT CHANGES AGAIN
	LD	HL,RATES-1
BAUD3:	INC	HL		;INDEX INTO BAUD RATE TABLE
	RLA			; USING COUNT DERRIVED IN A
	JR	NC,BAUD3-$
	LD	A,(HL)		;GET BAUD RATE CONTROL BYTE FROM
	OUT	(BAUDB),A	; TABLE AND OUTPUT TO COM-8116 TIMER
	CALL	SIOIN		;DISARD FIRST SERIAL INPUT CHARACTER
	LD	A,1
	OUT	(SIOCPB),A	;RE-PROGRAM SIO B TO GENERATE
	LD	A,00011100B	; INTERRUPTS ON RECIEVED DATA,
	OUT	(SIOCPB),A	; PARITY DOES NOT AFFECT VECTOR
	LD	HL,SIOOUT
	LD	(CONOUT+1),HL	;RE-DIRECT CONSOLE OUTPUT TO SIO
;
;	PRINT SIGNON MESSAGE
;
SIGNON:	EI
	CALL	PNEXT
	DEFB	CR,LF
	DEFM	'... system monitor 3.3 ...'
	DEFB	CR,LF
	DEFB	EOT
	JP	WARM		;GO ENTER MONITOR
;
;
;
;	BAUD RATE CONSTANTS FOR COM 8116 BAUD RATE GENERATOR
;
RATES:	DEFB	0101B		;   300 BAUD
	DEFB	0110B		;   600 BAUD
	DEFB	0111B		;  1200 BAUD
	DEFB	1010B		;  2400 BAUD
	DEFB	1100B		;  4800 BAUD
	DEFB	1110B		;  9600 BAUD
	DEFB	1111B		; 19200 BAUD
	DEFB	1111B		; 19200 BAUD
;
;
INTAB	EQU	$		;INITIALIZATION DATA TABLES
;
;
;	INITIALIZE THE Z-80 'I' REGISTER INTERRUPT VECTOR TABLE
;
	DEFB	2
	DEFW	SYSVEC+2
	DEFW	KEYSRV		;PARALLEL KEYBOARD INTERRUPT VECTOR

	DEFB	2
	DEFW	CTCVEC+6
	DEFW	TIMER		;ONE SECOND TIMER INTERRUPT VECTOR

	DEFB	4
	DEFW	SIOVEC+4
	DEFW	SIOINT		;SIO RECIEVE INTERRUPT VECTOR
	DEFW	SIOERR		;SIO PARITY, OVERRUN & FRAMING ERROR
;
;	INITIALIZE DISK I/O DRIVER VARIABLES
;
	DEFB	8
	DEFW	UNIT
	DEFB	255		;FLAG ALL DRIVES AS DE-SELECTED
	DEFB	255,255,255,255	;CLEAR HEAD POSITION TABLE
	DEFB	00000000B	;SELECT FASTEST SEEK SPEED
	DEFB	128		;SELECT 128 BYTE SECTOR LENGTH
	DEFB	30		;SET MOTOR TURN-OFF TIMER
;
;	INITIALIZE THE CRT DISPLAY CURSOR
;
	DEFB	2
	DEFW	CHRSAV
	DEFB	' '
	DEFB	'_'		;USE NON-BLINKING UNDERSCORE
;
;	SET DEFAULT 'SOFTWARE' INTERRUPT VECTORS
;
	DEFB	6
	DEFW	TIKVEC
	DEFW	DSKTMR		;POINT 'TIKVEC' TO DISK MOTOR TIMER
	DEFW	STASH		;POINT 'PINVEC' TO FIFO INPUT ROUTINE
	DEFW	STASH		;POINT 'SINVEC' TO FIFO INPUT ROUTINE
;
;	SET FREE MEMORY POINTER
;
	DEFB	2
	DEFW	FREPTR
	DEFW	ROMEND		;POINT TO FIRST LOCATION AFTER MONITOR
;
;
	DEFB	-1		;END OF VARIABLE INIT TABLE
;
;
;
BAUDA	EQU	00H		;CHANEL A BAUD RATE GENETATOR
SIO	EQU	04H		;DUAL SERIAL I/O
GENPIO	EQU	08H		;GENERAL PURPOSE PARALLEL I/O
BAUDB	EQU	0CH		;CHANEL B BAUD RATE GENERATOR
WD1771	EQU	10H		;WESTERN DIGITAL DISK CONTROLLER
SCROLL	EQU	14H		;CRT SCROLL MEMORY SCROLL REGISTER
CTC	EQU	18H		;QUAD COUNTER/TIMER CIRCUIT
SYSPIO	EQU	1CH		;SYSTEM PARALLEL I/O
;
;	INITIALIZE SYSTEM PIO FOR USE AS BANK-SWITCH,
;	DISK DRIVE SELECT AND PARALLEL KEYBOARD INPUT
;
BITDAT	EQU	SYSPIO+0
BITCTL	EQU	SYSPIO+1
KBDDAT	EQU	SYSPIO+2
KBDCTL	EQU	SYSPIO+3

	DEFB	3,BITCTL
	DEFB	11001111B	;PUT SYSTEM PIO IN BIT MODE
	DEFB	00011000B	;MAKE BITS 4 AND 3 BE INPUTS
	DEFB	01000000B	;DISABLE INTERRUPTS
;
	DEFB	1,BITDAT
	DEFB	00000000B	;DE-SELECT ROMS, ENABLE DRIVE 0
;
	DEFB	2,KBDCTL
	DEFB	01001111B	;PUT KEYBOARD PORT IN INPUT MODE
	DEFB	SYSVEC+2	;LOAD KEYBOARD INTERRUPT VECTOR
;
;
;	INITIALIZE CHANELS 2 AND 3 OF THE CTC
;	TO GENERATE ONE SECOND INTERRUPTS FROM CTC3
;
CTC0	EQU	CTC+0		;CTC CHANEL 0 PORT#
CTC1	EQU	CTC+1		;CTC CHANEL 1
CTC2	EQU	CTC+2		;CTC CHANEL 2
CTC3	EQU	CTC+3		;CTC CHANEL 3

	DEFB	1,CTC0
	DEFB	CTCVEC		;BASE INTERRUPT VECTOR FOR CTC
;
	DEFB	2,CTC2
	DEFB	00100111B	;PUT CTC2 IN TIMER MODE
	DEFB	105		;CTC2 PERIOD=105*256*400 NANOSECONDS
;
	DEFB	2,CTC3
	DEFB	11000111B	;PUT CTC3 IN COUNTER MODE
	DEFB	93		;CTC3 PERIOD=999936 MICROSECONDS
;
;
;	INITIALIZE SIO CHANEL B FOR ASYNCHRONOUS SERIAL
;	INTERFACE TO PRINTER OR TERMINAL
;
SIODPA	EQU	SIO+0		;SIO DATA PORT A
SIODPB	EQU	SIO+1		;SIO DATA PORT B
SIOCPA	EQU	SIO+2		;SIO CONTROL/STATUS PORT A
SIOCPB	EQU	SIO+3		;SIO CONTROL/STATUS PORT B

	DEFB	1,BAUDB
	DEFB	0101B		;SET COM 8116 FOR 300 BAUD DEFAULT

	DEFB	11,SIOCPB
	DEFB	4		;SELECT REGISTER #4
	DEFB	01000101B	;16X CLOCK, 1 STOP BIT, ODD PARITY
	DEFB	1		;SELECT REGISTER #1
	DEFB	00000100B	;STATUS AFFECTS VECTOR, NO INTERRUPTS
	DEFB	3		;SELECT REGISTER #3
	DEFB	01000001B	;7 BITS/RX CHARACTER
	DEFB	5		;SELECT REGISTER #5
	DEFB	10101010B	;7 BITS/TX CHARACTER, ASSERT DTR
	DEFB	2		;SELECT REGISTER #2
	DEFB	SIOVEC		;LOAD INTERRUPT VECTOR BASE
	DEFB	2		;SELECT READ REG #2 FOR SIO TEST

	DEFB	-1		;END-OF-TABLE
;
;	INIT DONE
;
;
