;********************************************************
;*							*
;*	COLD START INITIALIZATION ROUTINE FOR		*
;*	CONFIGURING THE SYSTEM AFTER A POWER-ON		*
;*	OR PUSHBUTTON RESET.				*
;*							*
;********************************************************
;
;
;
INIT:	DI
	LD	SP,TSTSTK
	LD	DE,0
	LD	A,10H
	CALL	CRCGEN		;VERIFY CRC IN FIRST 4K ROM
INIT1:	JR	NZ,$		;LOOP FOREVER IF BAD CRC
;
;
;	PERFORM READ/WRITE TEST OF MONITOR AND GLOBAL VARIABLES RAM
;
RAMTST:	LD	HL,MONITR
	LD	DE,RAM
	LD	A,1
RTST1:	LD	B,8
RTST2:	LD	(HL),A		;WRITE TEST BYTE INTO MONITOR/GLOBALS
	LD	(DE),A
	RLCA			;ROTATE BIT PATTERN IN A
	INC	HL
	INC	E		;BUMP E TO DO INNER LOOP 256 TIMES
	JR	NZ,RTST2
	DJNZ	RTST2		;REPEAT 8 TIMES FOR 2048 BYTES

	LD	C,8
RTST3:	DEC	HL
	DEC	E
	RRCA
	CP	(HL)		;VERIFY THAT TEST PATTERN IS WRITTEN
	JR	NZ,$		;STICK FOREVER IF MONITOR RAM FAILURE
	EX	DE,HL
	CP	(HL)
	EX	DE,HL
	JR	NZ,$		;STICK FOREVER IF GLOBAL RAM FAILURE
	DJNZ	RTST3
	DEC	C
	JR	NZ,RTST3

	ADD	A,A
	JR	NZ,RTST1	;DO 8 PASSES OVER MEMORY BLOCKS
;
;
	LD	SP,STACK	;LOAD STACK POINTER NOW THAT IT IS SAFE
;
;
;	MOVE COPY OF RAM-RESIDENT ROUTINES TO HIGH MEMORY
;
	LD	HL,MONCOPY
	LD	DE,MONITR
	LD	BC,MONLEN
	LDIR
;
;	MOVE COPY OF INITIALIZED GLOBAL VARIABLES TO HIGH MEMORY
;
	LD	HL,RAMCOPY
	LD	DE,RAM
	LD	BC,RAMLEN
	LDIR
;
;
;	INITIALIZE Z80 FAMILY PROGRAMMABLE I/O DEVICES
;
	LD	HL,IOTAB	;POINT TO I/O INIT 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
;
;
;	FIRE-UP CRT DISPLAY
;
	LD	HL,M1TAB
	IN	A,(SENSE)	;TEST SENSE SWITCHES FOR 5*7 OR 7*9
	BIT	4,A		; FONT AND PROGRAM 6845 ACCORDINGLY
	JR	Z,SKIP1
	LD	HL,M2TAB
SKIP1:	CALL	INITCRT		;PROGRAM 6845 CONFIGURATION REGISTERS
	CALL	CLRALL		;CLEAR VIDEO DISPLAY MEMORY
;
;	SET DISK PARAMETERS FOR 5 OR 8 INCH DRIVES
;
	IN	A,(SENSE)
	BIT	5,A		;TEST DISK-TYPE SENSE SWITCH INPUT
	JR	Z,SKIP2		; AND JUMP IF 8 INCH DRIVES INDICATED
	LD	A,00000011B
	LD	(DSKTYP),A	;SET DISK TYPE FOR MINI-FLOPPIES
	LD	A,15
	LD	(NREVS),A	;REQUIRE 15 REVOLUTIONS BEFORE READY
	LD	A,5*20
	LD	(NSTOP),A	;STOP MOTORS AFTER 20 SECONDS
SKIP2:	CALL	FLIPDENS	;SET SMC DATA SEPRARATOR INITAL VALUE
;
;	INITIALIZE THE Z-80 FOR INTERRUPT MODE #2

	LD	HL,RAM
	LD	A,H
	LD	I,A		;LOAD I REG WITH MSB OF VECTOR TABLE
	IM	2		; AND SELECT INTERRUPT MODE 2
;
;
;	DETERMINE IF CONSOLE I/O CONFIGURATION WILL BE FOR THE
;	ON-BOARD CRT AND KEYBOARD OR AN EXTERNAL SERIAL TERMINAL.
;
	IF	CRCK OR CKSUM
		LD	DE,1000H
		LD	A,18H
		CALL	CRCGEN		;CHECK CRC OR CKSUM OF SECOND ROM
	ELSE
		LD	A,(1000H)
		CP	0C3H		;HAVE A JUMP THERE?
		JR	NZ,FOO

		LD	A,(1003H)	;TRY NEXT ENTRY TOO
		CP	0C3H
	FOO	EQU	$
		ENDIF

	CALL	Z,1000H		;EXECUTE SECOND ROM IF TEST PASSES

	CALL	BELL		;BEEP THE BUZZER TO SAY WE ARE ALIVE
	LD	BC,200H
RINGIT:	DJNZ	RINGIT		;NOW DELAY 200mS
	DEC	C
	JR	NZ,RINGIT	;CAUSE NO INTERRUPT TO TURN IT OFF YET
	LD	A,BUZZER+OFF
	OUT	(PORT0),A	;TURN OFF THE BELL

	IN	A,(SENSE)
	AND	00001011B
	LD	C,A		;SAVE STATE OF SENSE INPUT PORT
DECIDE:	IN	A,(SENSE)
	AND	00001011B	;TEST FOR ARRIVAL OF A START BIT OR
	XOR	C		; A CHANGE IN THE KEYBOARD STROBE
	JR	Z,DECIDE
	BIT	3,A
	JR	NZ,PARALL	;JUMP IF INPUT IF FROM KEYBOARD
;
;	AUTOMATIC BAUD RATE SETTING ROUTINE FOR SIO
;
BAUD:	AND	00000011B
	LD	C,A		;GET MASK BIT FOR SIO CHANNEL A/B
	LD	B,0
BAUD1:	IN	A,(SENSE)	;READ SENSE INPUT PORT
	AND	C		;TEST SIO RECEIVE INPUT BIT
	JR	Z,BAUD1		;LOOP UNTIL IT CHANGES STATE
BAUD2:	EX	(SP),HL		;DELAY A BIT
	EX	(SP),HL
	INC	B
	IN	A,(SENSE)	;LOOP TO MEASURE THE START BIT TIME
	AND	C
	JR	NZ,BAUD2
	LD	DE,RATES-1
BAUD3:	INC	DE		;INDEX INTO BAUD RATE TABLE
	RL	B		; USING COUNT DERRIVED IN B
	JR	NC,BAUD3

	LD	HL,SIOATAB	;POINT TO SIO CHANNEL A INIT STUFF
	BIT	0,C		;TEST IF USING SIO CHANNEL A OR B
	JR	NZ,BAUD4	;JUMP IF USING CHANNEL A
	LD	HL,SIOBTAB	;ELSE POINT TO OTHER INIT DATA TABLE
BAUD4:	LD	C,(HL)		;GET BAUDRATE CTC PORT# FROM TABLE
	INC	HL
	LD	A,01000111B
	OUT	(C),A		;PUT BAUDRATE CTC IN COUNTER MODE
	LD	A,(DE)
	OUT	(C),A		;SET DIVIDE RATIO FOR SELECTED RATE
	LD	E,(HL)		;LOAD E WITH SIO A/B CONTROL PORT#
	INC	HL
	LD	D,(HL)		;LOAD D WITH SIO A/B DATA PORT#
	INC	HL
	LD	(SIOADR),DE	;SAVE SIO CONTROL/DATA PORT NUMBERS
	LD	C,E
BAUD5:	IN	A,(C)		;LOOP UNTIL SIO CHANNEL RECEIVES
	BIT	0,A		; GARBLED FIRST CHARACTER
	JR	Z,BAUD5
	LD	C,D
	IN	A,(C)		;THEN READ AND DISCARD THE CHARACTER
	LD	C,E
	LD	A,1
	OUT	(C),A		;RE-PROGRAM SIO CHANNEL TO GENERATE
	LD	A,00011100B	; INTERRUPTS ON RECIEVED DATA,
	OUT	(C),A		; PARITY DOES NOT AFFECT VECTOR
	LD	A,(HL)
	LD	(CONNUM),A	;STORE NUMBER OF CONSOLE DEVICE
	LD	HL,SIOOUT
	LD	(CONOUT+1),HL	;RE-DIRECT CONSOLE OUTPUT TO SIO
	JR	SIGNON
;
;	DIVIDE RATIO TABLE FOR CTC-DERRIVED BAUD RATES
;
RATES:	DEFB	128		;   300 BAUD
	DEFB	64		;   600 BAUD
	DEFB	32		;  1200 BAUD
	DEFB	16		;  2400 BAUD
	DEFB	8		;  4800 BAUD
	DEFB	4		;  9600 BAUD
	DEFB	2		; 19200 BAUD
	DEFB	2		; 19200 BAUD
;
;
SIOATAB:
	DEFB	CTCB1		;SIO CHANNEL A BAUDRATE CTC
	DEFB	SIOCPA		; CONTROL PORT
	DEFB	SIODPA		; DATA PORT
	DEFB	1		; CONSOLE#
;
SIOBTAB:
	DEFB	CTCB0		;SIO CHANNEL B BAUDRATE CTC
	DEFB	SIOCPB		; CONTROL PORT
	DEFB	SIODPB		; DATA PORT
	DEFB	2		; CONSOLE#
;
;
;
;	DETERMINE KEYBOARD STROBE POLARITY AND PROGRAM INTERRUPTS
;
PARALL:	IN	A,(SENSE)
	XOR	C
	BIT	3,A
	JR	NZ,PARALL	;WAIT UNTIL STROBE GOES AWAY
PARL3:	LD	A,11000111B	;PROGRAM CTCA0 FOR KBD INTERRUPT
	BIT	3,C
	JR	NZ,PARL4	;DETERMINE SENSE OF KBD STROBE
	SET	4,A
PARL4:	OUT	(CTCA0),A
	LD	A,1
	OUT	(CTCA0),A	;COUNT STROBES MODULO 1
SIGNON:	EI
	CALL	PNEXT
	DEFB	CR,LF,LF
	DEFB	'... Bigboard_II System Monitor  7-July-82 ...'
	DEFB	CR,LF,LF
	DEFB	EOT
	JP	PROMPT		;GO ENTER MONITOR
;
;
;
;	DUMMY STACK FOR POWER-UP CRC CHECK
;
	DEFW	INIT1		;RETURN POINT FOR FIRST CRC CHECK
TSTSTK	EQU	$
;
;
;
;	COMPUTE CRC16 OVER CONTENTS OF ROM TO VERIFY ROM INTEGRITY
;
CRCGEN	EQU	$
	IF	CKSUM
		NOP		;PUT CKSUM CODE HERE
		LD	HL,0
		XOR	A
	ELSE
		IF	CRCK
;
	LD	HL,-1		;SET CRC16 ACCUMULATOR TO ALL ONES
CRCG1:	LD	B,8		;PREPARE TO RUN ROM BYTE THRU CRC GEN
	EX	AF,AF'
	LD	A,(DE)
	LD	C,A
CRCG2:	LD	A,C
	XOR	H		;XOR DATA BIT WITH MSB OF CRC
	RLCA
	ADC	HL,HL		;SHIFT RESULTING BIT LEFT INTO CRC
	RRCA
	JR	NC,CRCG3	;JUMP IF BIT WAS A ZERO
	LD	A,H
	XOR	00010000B	;ELSE XOR CRC WITH POLY COEFFICIENTS
	LD	H,A
	LD	A,L
	XOR	00100000B
	LD	L,A
CRCG3:	RL	C		;ADVANCE TO NEXT DATA BIT
	DJNZ	CRCG2
	EX	AF,AF'
	INC	DE
	CP	D		;TEST FOR ENDING PAGE NUMBER
	JR	NZ,CRCG1
	LD	A,H
	OR	L		;HL SHOULD=0 IF VALID CRC16

		ELSE
		LD	HL,0	;FAKE A GOOD RESPONSE
		XOR	A
		ENDIF
	ENDIF
	RET
;
;
;
;
INITCRT:
	LD	B,16		;WRITE TO 16 REGISTERS IN 6845
	LD	C,0
INCRT1:	LD	A,C
	OUT	(CRTADD),A	;OUTPUT REGISTER NUMBER TO CRTC
	LD	A,(HL)
	INC	HL
	OUT	(CRTDAT),A	;OUTPUT DATA TO SELECTED REGISTER
	INC	C
	DJNZ	INCRT1
	RET
;
;
;
;
	PAGE
;
;
;	... INPUT/OUTPUT PORT EQUATES AND INITIALIZATION TABLES ...
;
;
SIO	EQU	80H		;DUAL SERIAL I/O
CTCA	EQU	84H		;CTC FOR KEYBOARD/FDC/SIO INTERRUPTS
CTCB	EQU	88H		;CTC FOR BAUDRATES AND TIMERS
DMA	EQU	8CH		;Z80 DMA CONTROLLER
PORT3	EQU	0C0H		;MEMORY CONTROL 74LS259
SENSE	EQU	0C4H		;SENSE INPUTS 74LS244
PORT0	EQU	0C8H		;MISC CONTROL BITS 74LS259
SELMUX	EQU	0CCH		;DRIVE SELECT/DMA MUX 74LS273
KBD	EQU	0D0H		;KEYBOARD INPUTS 74LS373
WD179X	EQU	0D4H		;WESTERN DIGITAL DISK CONTROLLER
GENPIO	EQU	0D8H		;GENERAL PURPOSE PARALLEL PORTS
CRTC	EQU	0DCH		;6845 CRT CONTROLLER
;
;
SIODPA	EQU	SIO+0		;SIO DATA PORT A
SIOCPA	EQU	SIO+1		;SIO CONTROL/STATUS PORT A
SIODPB	EQU	SIO+2		;SIO DATA PORT B
SIOCPB	EQU	SIO+3		;SIO CONTROL/STATUS PORT B
;
;
CTCA0	EQU	CTCA		;CTC A CHANNEL 0 (KEYBOARD STROBE)
CTCA1	EQU	CTCA+1		;CTC A CHANNEL 1 (INDEX PULSE COUNT)
CTCA2	EQU	CTCA+2		;CTC A CHANNEL 2 (SIO A SYNC INTERRUPT)
CTCA3	EQU	CTCA+3		;CTC A CHANNEL 3 (VSYNC INTERRUPT)
;
;
CTCB0	EQU	CTCB		;CTC B CHANNEL 0 (SIO A BAUDRATE)
CTCB1	EQU	CTCB+1		;CTC B CHANNEL 1 (SIO B BAUDRATE)
CTCB2	EQU	CTCB+2		;CTC B CHANNEL 2 (1 MILLISECOND TIMER)
CTCB3	EQU	CTCB+3		;CTC B CHANNEL 3 (CLOCK INTERRUPT)
;
;
;
ON	EQU	00001000B
OFF	EQU	00000000B
;
;	BIT ASSIGNMENTS FOR LATCH 'U14'
;
BUZZER	EQU	7
MOTOR	EQU	6
HLDTIM	EQU	5
DDEN	EQU	4
SMC2	EQU	3
SMC1	EQU	2
SIDSEL	EQU	1
DYSTAT	EQU	0
;
;
;	BIT ASSIGNMENTS FOR LATCH 'U41'
;
ATTEN	EQU	7		;ATTRIBUTE ENABLE PIN
FDCRST	EQU	6		;DISK CONTROLLER RESET
STDBB	EQU	5		;STD/BETTERBOARD BANK SELECT
VPP	EQU	4		;PROM VPP ENABLE
PGM	EQU	3		;PROM PGM ENABLE
OEVPP	EQU	2		;PROM OE/VPP SWITCH
DECODE	EQU	1		;BYTEWIDE MEMORY DECODE CONTROL
OUTEN	EQU	0		;BYTEWIDE MEMORY /OE CONTROL
;
;
;
;
IOTAB	EQU	$		;I/O INITIALIZATION TABLE
;
;	INITIALIZATION FOR TTL BIT LATCHES
;
	DEFB	2,PORT3
	DEFB	ATTEN+ON	;ATTRIBUTE ENABLE ON
	DEFB	FDCRST+ON	;179X RESET PIN HIGH

	DEFB	1,SELMUX
	DEFB	00001010B	;ALL DRIVES OFF, /TEST=1, DRQ->RDY
;
;
;	DO SOFTWARE RESET OF DMA AS RECOMENDED BY ZILOG
;
	DEFB	6,DMA
	DEFB	11000011B
	DEFB	11000011B
	DEFB	11000011B
	DEFB	11000011B
	DEFB	11000011B
	DEFB	11000011B
;
;
;	PROGRAM CTC A AND B FOR VARIOUS INTERRUPT
;	AND TIMING FUNCTIONS
;
	DEFB	1,CTCA0
	DEFB	CTCAV		;BASE INTERRUPT VECTOR FOR CTC A

	DEFB	2,CTCA1
	DEFB	01000111B	;PUT CTC1 IN COUNTER MODE
	DEFB	0		;COUNT INDEX PULSES MODULO-256
;
;
	DEFB	1,CTCB0
	DEFB	CTCBV		;BASE INTERRUPT VECTOR FOR CTC B

	DEFB	2,CTCB0
	DEFB	01000111B	;PUT CTC0 IN COUNTER MODE
	DEFB	128		;DIVIDE BY 128 GIVES 300 BAUD FOR SIO B

	DEFB	2,CTCB1
	DEFB	01000111B	;PUT CTC1 IN COUNTER MODE
	DEFB	128		;DIVIDE BY 128 GIVES 300 BAUD FOR SIO A

	DEFB	2,CTCB2
	DEFB	00000111B	;PUT CTC2 IN TIMER MODE
	DEFB	250		;PULSE EVERY 250*4 MICROSECONDS

	DEFB	2,CTCB3
	DEFB	11000111B	;PUT CTC3 IN COUNTER MODE
	DEFB	250		;INTERRUPT EVERY 250 MILLISECONDS
;
;
;	INITIALIZE SIO CHANNEL A AND B FOR ASYNCHRONOUS SERIAL
;	INTERFACE TO PRINTER OR TERMINAL
;
	DEFB	10,SIOCPB
	DEFB	4		;SELECT REGISTER #4
	DEFB	01000101B	;16X CLOCK, 1 STOP BIT
	DEFB	1		;SELECT REGISTER #1
	DEFB	00000100B	;STATUS AFFECTS VECTOR
	DEFB	3		;SELECT REGISTER #3
	DEFB	01000001B	;7 BITS/RX CHARACTER
	DEFB	5		;SELECT REGISTER #5
	DEFB	10101010B	;7 BITS/TX CHARACTER
	DEFB	2		;SELECT REGISTER #2
	DEFB	SIOVEC		;BASE SIO INTERRUPT VECTOR

	DEFB	8,SIOCPA
	DEFB	4		;SELECT REGISTER #4
	DEFB	01000101B	;16X CLOCK, 1 STOP BIT
	DEFB	1		;SELECT REGISTER #1
	DEFB	00000000B	;INTERRUPTS OFF
	DEFB	3		;SELECT REGISTER #3
	DEFB	01000001B	;7 BITS/RX CHARACTER
	DEFB	5		;SELECT REGISTER #5
	DEFB	10101010B	;7 BITS/TX CHARACTER
;
;
	DEFB	-1		;END-OF-TABLE
;
;
;
	PAGE
;
;
;	... EQUATES AND INITIALIZATION TABLES FOR 6845 CRTC ...
;
;
CHRMEM	EQU	6000H		;2K BYTE CHARACTER MEMORY
ATTMEM	EQU	7000H		;2K BYTE ATTRIBUTE MEMORY
;
CRTADD	EQU	CRTC		;6845 ADDRESS REGISTER
CRTDAT	EQU	CRTC+1		;6845 DATA REGISTER

BLINK	EQU	01000000B	;BLINK ATTRIBUTE BIT
REVERSE	EQU	00010000B	;REVERSE VIDEO
UNDLINE	EQU	00001000B	;UNDERLINE
STRIKE	EQU	00000100B	;STRIKETHRU
;
;	INITIALIZATION FOR 80*24 DISPLAY USING 11 MHZ CLOCK
;	AND 7 DOT BY 10 RASTER CHARACTER CELL SIZE
;
M1TAB:	DEFB	99		;HORIZ TOTAL-1
	DEFB	80		;HORIZ DISPLAYED
	DEFB	82		;HORIZ SYNC POSITION-1
	DEFB	28H		;VERT/HORIZ SYNC WIDTH
	DEFB	25		;VERT TOTAL-1
	DEFB	2		;VERT TOTAL ADJUST
	DEFB	24		;VERT DISPLAYED
	DEFB	25		;VERT SYNC POSITION-1
	DEFB	00000000B	;INTERLACE AND SKEW
	DEFB	9		;MAX RASTER ADDRESS
	DEFB	00100000B	;CURSOR START RASTER
	DEFB	0		;CURSOR END RASTER
	DEFB	0		;START ADDRESS MSB
	DEFB	0		;START ADDRESS LSB
	DEFB	0		;CURSOR ADDRESS MSB
	DEFB	0		;CURSOR ADDRESS LSB
;
;
;	INITIALIZATION FOR 80*24 DISPLAY USING 16 Mhz CLOCK
;	AND 9 DOT BY 12 RASTER CHARACTER CELL SIZE
;
M2TAB:	DEFB	96		;HORIZ TOTAL-1
	DEFB	80		;HORIZ DISPLAYED
	DEFB	71		;HORIZ SYNC POSITION-1
	DEFB	28H		;VERT/HORIZ SYNC WIDTH
	DEFB	25		;VERT TOTAL-1
	DEFB	16		;VERT TOTAL ADJUST
	DEFB	24		;VERT DISPLAYED
	DEFB	26		;VERT SYNC POSITION-1
	DEFB	00000010B	;INTERLACE AND SKEW
	DEFB	11		;MAX RASTER ADDRESS
	DEFB	00100000B	;CURSOR START RASTER
	DEFB	0		;CURSOR END RASTER
	DEFB	0		;START ADDRESS MSB
	DEFB	0		;START ADDRESS LSB
	DEFB	0		;CURSOR ADDRESS MSB
	DEFB	0		;CURSOR ADDRESS LSB
;
;
;
;
