
;**********************************************************
;*                 Bios Jump Table                        *
;*  This is where CP/M calls whenever it needs to do any  *
;*  input/output operation. User program may also needs   *
;*  these entry points, but note that the location of     *
;*  this vector changes with different memory size.       *
;**********************************************************

BIOS:	JP	BOOT
	JP	WBOOT
	JP	CONST
	JP	CONIN
	JP	CONOUT
	JP	LIST
	JP	PUNCH
	JP	READER
	JP	HOME
	JP	SELDSK
	JP	SETTRK
	JP	SETSEC
	JP	SETDMA
	JP	READ
	JP	WRITE
	JP	LISTST
	JP	SECTRN
	JP	UNUSED
	JP	UNUSED
	JP	UNUSED
	JP	UNUSED
	JP	UNUSED

;	INITIIAL VALUE OF IOBYTE

IODEF:	DEFB	00010101B	; VALUE OF INITIAL IOBYTE

	DEFS	11		; RESERVED FOR NEW CP/M

MSECNT:	DEFB	0		; LSB
	DEFB	0		; MSB 16-BIT COUNTER INCREMENT EVERY 10 MS
 
;
;	SYSTEM INTERRUPT VECTORS
;

INTVEC:
DMAI0:	DEFW	RETURN		; DMA INTERRUPT ON READY
DMAI1:	DEFW	RETURN		; DMA INTERRUPT ON MATCH
DMAI2:	DEFW	RETURN		; DMA INTERRUPT ON END OF BLOCK
DMAI3:	DEFW	RETURN		; DMA INTERRUPT ON MATCH & END OF BLOCK

CTCI0:	DEFW	RETURN		; CTC CH #0 INTERRUPT (TIMER)
CTCI1:	DEFW	RETURN		; CTC CH #1 INTERRUPT (TIMER)
CTCI2:	DEFW	RETURN		; CTC CH #2 INTERRUPT (TIMER/FDC)
CTCI3: 	DEFW	TCOUNT		; CTC CH #3 INTERRUPT (TIMER/WDC)

SIOI00:	DEFW	RETURN		; SIO #0 CH B TXMT BUFF EMPTY(INT TERMINAL)
SIOI01:	DEFW	RETURN		;        CH B EXT/STAT CHANGE
SIOI02:	DEFW	RETURN	        ;        CH B RECEIVE CHAR AVAIL
SIOI03:	DEFW	RETURN		;        CH B SPECIAL RECEIVE COND
SIOI04:	DEFW	RETURN		; 	 CH A TXMT BUFF EMPTY(RS-422)
SIOI05:	DEFW	RETURN		;        CH A EXT/STAT CHANGE
SIOI06:	DEFW	RETURN		;        CH A RECEIVE CHAR AVAIL
SIOI07:	DEFW	RETURN		;        CH A SPECIAL RECEIVE COND

SIOI10:	DEFW	RETURN		; SIO #1 CH B TXMT BUFF EMPTY(RS-232 PORT2)
SIOI11:	DEFW	RETURN		;        CH B EXT/STAT CHANGE
SIOI12:	DEFW	RETURN		;        CH B RECEIVE CHAR AVAIL
SIOI13:	DEFW	RETURN		;        CH B SPECIAL RECEIVE COND
SIOI14:	DEFW	RETURN		;        CH A TXMT BUFF EMPTY(RS-232 PORT2)
SIOI15:	DEFW	RETURN		;        CH A EXT/STAT CHANGE
SIOI16:	DEFW	RETURN		;        CH A RECEIVE CHAR AVAIL
SIOI17:	DEFW	RETURN		;        CH A SPECIAL RECEIVE COND

;PIOI01: DEFW	RETURN		; PIO PORT #A INTERRUPT
;PIOI02: DEFW	RETURN		; PIO PORT #B INTERRUPT

;	NOT IMPLEMENTED INTERRUPTS

RETURN:	RETI
     
;	AUX JUMP TABLE

WTSERV:	DEFB	0
	JP	UNUSED
	JP	UNUSED
	JP	UNUSED
	JP	UNUSED
	JP	UNUSED
	JP	UNUSED
	JP	TOD		; GET/SET TIME AND DATE
	JP	INTADD		; GET INTERRUPT TABLE ADDRESS IN DE

;	NOT USED JUMP VECTORS

UNUSED: RET			; JUST RETURN

;	COPYRIGHT STATEMENT

	DEFM	'(C) 1981, TELEVIDEO SYSTEMS INC.'

;	VERSION AND REVISION NUMBER

VER:	DEFB	2
REV:	DEFB	1

; 	COME HERE FROM COLDSTART LOADER

BOOT:	DI
	OUT	(PROMSW),A	; SHUT PROM OFF (DEBUG)
	LD	SP,CPMBUF+80H	; INITIALIZE STACK POINTER

	LD	A,(IODEF)	; INITIALIZE IOBYTE
	LD	(IOBYTE),A

	XOR	A		; MAKE LOGGED DRIVE 0
	LD	(DRIVE),A	; SAVE IT FOR LATER
	LD	(LOGDRV),A

;	SYSTEM INTERRUPT VECTOR MODE 2

	LD	HL,INTVEC
	LD	A,H
	LD	I,A
	IM	2

	CALL	HDWINI		; INITIALIZE SYSTEM HARDWARE

	EI

	LD	HL,SIGNON	; PRINT SIGNON MESSAGE
	CALL	PRTMSG

	JP	GOCPM		; DO MORE INITIALIZATION

; 	WE JUMP TO HERE WHENEVER THE USER WANTS
; 	TO RESTART THE SYSTEM, I. E., REREAD CP/M
; 	WITHOUT MODIFYING THE BIOS

WBOOT:	LD	SP,CPMBUF+80H	; INITIALIZE STACK POINTER

	XOR	A		; PREVENT BUFFER FLUSH
	LD	(HSTACT),A	; CONDITION ON WRITE ERROR

WBOO10:	CALL	RESDSK		; RESET DISK SUBSYSTEM

; 	INITIALIZE THE TRANSFER PARAMETERS

WBOO11:	LD	C,0		; SELECT DRIVE ZERO
	CALL	SELDSK		; FROM WHICH TO BOOT
	LD	HL,CPMBAS	; INITIAL DMA ADDRESS
	LD	DE,0002H	; D=INITIAL TRACK, E=INITIAL SECTOR
	LD	B,BDOSLN/RECLEN	; LENGTH OF TRANSFER, IN SECTORS

WBOO20:	PUSH	BC		; SAVE REGISTERS
	PUSH	HL
	PUSH	DE
	LD	C,L		; MOVE TRANSFER ADDRESS TO BC
	LD	B,H
	CALL	SETDMA		; SET DATA TRANSFER ADDRESS
	LD	C,D
	CALL	SETTRK		; SET TRACK REGISTER TO D
	LD	C,E
	CALL	SETSEC		; SET SECTOR REGISTER TO E	
	CALL	READ		; READ A SECTOR
	JR	Z,WBOO30	; READ SUCCESSFUL
	POP	DE		; ELSE RETORE REGISTERS
	POP	HL
	POP	BC
	LD	HL,BOOMSG	; PRINT BOOT ERROR MESSAGE
	CALL	PRTMSG
	CALL	CONIN		; WAIT FOR INPUT FROM OPERATOR
	CALL	CRLF
	JR	WBOO11	

WBOO30:	POP	DE		; ADJUST TRACK AND SECTOR
	INC	E		; BUMP SECTOR NO.
	LD	A,E
	CP	SPT0		; END OF CURRENT TRACK?
	JR	C,WBOO40	; NO.
	LD	E,0		; CYCLE THE SECTOR NO.
	INC	D		; AND INCREMENT THE TRACK

WBOO40:	POP	HL		; RECALL THE TRANSFER ADDRESS
	LD	BC,RECLEN	; ADD IN A SECTOR
	ADD	HL,BC
	POP	BC		; RESTORE SECTOR COUNT
	DJNZ	WBOO20		; GO READ NEXT SECTOR.	

; 	CODE SHARED BY BOTH WARM AND COLD STARTS

GOCPM:	LD	BC,CPMBUF	; INITIALIZE DMA ADDRESS
	CALL	SETDMA
	LD	A,JP		; INITIALIZE LOW MEMORY
	LD	(0000H),A
	LD	HL,BIOS+3	; WARM BOOT JUMP ENTRY
	LD	(0001H),HL	; STORE IT
	LD	(0005H),A
	LD	HL,BDOS		; BDOS ENTRY POINT
	LD	(0006H),HL	; STORE IT
	LD	HL,WTSERV
	LD	(1BH),HL	; PROVIDE ENTRY FOR TIME AND DATE
	XOR	A		; CLEAR SERIAL PRINTER BUFFER COUNT
	LD	(UL1CNT),A	; ON COLD OR WARM START
	LD	(UNACNT),A	; UNALLOCATED SECTOR COUNT
	LD	(HSTACT),A	; BUFFER INACTIVE
	LD	A,(LOGDRV)	; PASS LOGGED DRIVE NO.
	CP	MAXDRV+1	; CHECK IF LOG DRIVE IS LEGAL
	JR	C,GOCPM1	; JUMP IF LEGAL
	XOR	A		; IF NOT, SELECT DRIVE A:
GOCPM1:	LD	C,A		; IN REG-C
	JP	CPMBAS		; TO CCP

; END OF 802FBOOT.MAC
