;********************************************************
;*							*
;*	--  CUSTOM BIOS FOR CP/M VERSION 2.2  --	*
;*							*
;*	DOUBLE DENSITY CBIOS FOR BIGBOARD-II		*
;*							*
;*	COPYRIGHT (C) 1982 BY RUSSELL SMITH		*
;*			      818 WEST HICKORY		*
;*			      DENTON, TEXAS  76201	*
;*							*
;*	LAST EDIT DATE:	  21-AUGUST-82			*
;*							*
;********************************************************
;
	ASEG
	.SFCOND			;DON'T LIST FALSE CONDITIONALS
	.Z80			;USE ZILOG MNEMONICS
;
TRUE	EQU	1
FALSE	EQU	0
;
IOBYTE	EQU	0003H		;INTEL CONFIGURATION BYTE
USRDRV	EQU	00H		;USER/DRIVE TO LOG ON AFTER COLDSTART
SERIAL	EQU	FALSE		;DISABLE SIO/CRT CONSOLE COMBINATION
;
MSIZE	EQU	60		;MEMORY SIZE IN KBYTES (RANGE 20..60)
BASE	EQU	(MSIZE-20)*1024
CCP	EQU	3400H+BASE	;CONSOLE COMMAND PROCESSOR
BDOS	EQU	3C06H+BASE	;OPERATING SYSTEM ENTRY POINT
DBBUG	EQU	46D2H+BASE	;DEBLOCK BUG LOCATION IN BDOS
CBIOS	EQU	4A00H+BASE	;BASE OF CUSTOM BIOS
CPMSIZE	EQU	(CBIOS-CCP)/128	;NUMBER OF RECORDS NEEDED FOR CCP+BDOS
	
MONITR	EQU	0F000H		;BASE OF SYSTEM MONITOR
SYSRAM	EQU	0FF00H		;BASE OF SYSTEM VARIABLES
SCRATCH	EQU	0F880H		;RAM AREA FOR BIOS/CPM BUFFERS
;
;
;	... DEFINE HOW MANY DRIVES IN SYSTEM ...
;
WINCH	EQU	0		;NUMBER OF WINCHESTERS (0..1) IN SYSTEM
NFLOPPY	EQU	2		;NUMBER OF FLOPPYS (1..4) IN SYSTEM
DOUBLE	EQU	TRUE		;SINGLE/DOUBLE SIDED DRIVE ENABLE
FIVE	EQU	FALSE
EIGHT	EQU	TRUE		;SELECT 8 INCH FLOPPYS
;
;
;
;	... DEFINE TRACK/SECTOR PARAMS FOR STANDARD FLOPPYS ...
;
;
	IF	FIVE
NSECTS	EQU	18		;SINGLE DENSITY SECTORS PER TRACK
NTRAKS	EQU	40		;NUMBER OF TRACKS PER SURFACE
RESERV	EQU	3		;NUMBER OF RESERVED TRACKS
BLS	EQU	2		;DOUBLE DENSITY BLOCKSIZE IN KBYTES
	IF	DOUBLE
ALLMAX	EQU	((5*NTRAKS*2)/BLS)/8
DIRSIZ	EQU	64
	ELSE
ALLMAX	EQU	((5*NTRAKS)/BLS)/8
DIRSIZ	EQU	64
	ENDIF
	ENDIF
;
	IF	EIGHT
NSECTS	EQU	26		;SINGLE DENSITY SECTORS PER TRACK
NTRAKS	EQU	77		;NUMBER OF TRACKS PER SURFACE
RESERV	EQU	2		;NUMBER OF RESERVED TRACKS
BLS	EQU	2		;DOUBLE DENSITY BLOCKSIZE IN KBYTES
	IF	DOUBLE
ALLMAX	EQU	((9*NTRAKS*2)/BLS)/8
DIRSIZ	EQU	128
	ELSE
ALLMAX	EQU	((9*NTRAKS)/BLS)/8
DIRSIZ	EQU	128
	ENDIF
	ENDIF
;
;
;
	.XLIST
	INCLUDE	MACROS.MAC	;ASSEMBLE WITH MACRO DEFINITIONS
	.LIST
;
;
;	... EQUATES FOR PRINTER DRIVER PORTS/HANDSHAKE MODE ...
;
LSTDAT	EQU	80H		;SIO CHANNEL A DATA PORT#
LSTCTL	EQU	81H		;SIO CHANNEL A CONTROL PORT#
LSTBAUD	EQU	89H		;SIO CHANNEL A BAUDRATE CTC PORT#

XONXOFF	EQU	TRUE		;ENABLE XON-XOFF HANDSHAKE

CTS	EQU	00100000B	;CLEAR-TO-SEND BIT POSITION IN SIO RR0
SYNC	EQU	00010000B	;SYNC/HUNT BIT
DCD	EQU	00001000B	;DATA-CARRIER-DETECT BIT
TBE	EQU	00000100B	;TRANSMIT-BUFFER-EMPTY BIT

TXMASK	EQU	DCD+TBE		;LOOP UNTIL DCD AND TBE BITS ARE TRUE
;
;
;
	PAGE
	ORG	CBIOS-256
	.PHASE	0080H
	INCLUDE	ONESECT.MAC	;ONE SECTOR LOADER
	.DEPHASE
;
;
	PAGE
	ORG	CBIOS-128
;
;
;	... CREATE SIGNON MESSAGE FOR SELECTED MEMORY SIZE CPM ...
;
M1	EQU	(MSIZE / 10) OR '0'	;TENS DIGIT OF MSIZE IN ASCII
M2	EQU	(MSIZE MOD 10) OR '0'	;ONES DIGIT
;
	DEFB	CR,LF
	DEFB	'.... Cal-Tex Computers ',M1,M2,'K CP/M version 2.2 ....'
	DEFB	CR,LF
	DEFB	'......... release date 15-September-82 .........'
	DEFB	CR,LF
	DEFB	NULL
;
	PAGE
;
;
;	... BIOS CODE STARTS HERE WITH JUMP VECTORS ...
;
	ORG	CBIOS
;
	JP	BOOT
	JP	WBOOT
	JP	CONST
IVEC:	JP	CONIN
OVEC:	JP	CONOUT
	JP	LIST
	JP	CONOUT		;PUNCH VECTOR SAME AS CONOUT
	JP	CONIN		;READER VECTOR SAME AS CONIN
	JP	HOME
	JP	SELENTRY	;'SELDISK' WITH LOCAL STACK
	JP	SETTRACK
	JP	SETSECT
	JP	SETDMA
	JP	RDENTRY		;'READDB' WITH LOCAL STACK
	JP	WRTENTRY	;'WRITEDB' WITH LOCAL STACK
	JP	LISTST
	JP	SECTRAN
;
;
;
;	... ENTRY POINTS FOR COMPLEX DISK ROUTINES ...
;
SELENTRY:
	LD	(SPSAVE),SP
	LD	SP,BIOSTK
	PUSH	IX
	CALL	SELDISK
	POP	IX
	LD	SP,(SPSAVE)
	RET
;
;
;
RDENTRY:
	LD	(SPSAVE),SP
	LD	SP,BIOSTK
	PUSH	IX
	CALL	READDB
	POP	IX
	LD	SP,(SPSAVE)
	RET
;
;
;
WRTENTRY:
	LD	(SPSAVE),SP
	LD	SP,BIOSTK
	PUSH	IX
	CALL	WRITEDB
	POP	IX
	LD	SP,(SPSAVE)
	RET
;
;
;
;
;	... COLD BOOT ROUTINE ...
;
BOOT:
	DEFB	0,0,0,0		;PUT EXTRA COLDSTART INITIALIZATION
	DEFB	0,0,0,0		; CODE HERE IF NEEDED. BE SURE TO TAKE
	DEFB	0,0,0,0		; UP AT LEAST 40 BYTES OF MEMORY IN ANY
	DEFB	0,0,0,0		; CASE TO MAKE ROOM FOR THE BIOS
	DEFB	0,0,0,0		; SELECT/READ/WRITE LOCAL STACK AREA
	DEFB	0,0,0,0
	DEFB	0,0,0,0
	DEFB	0,0,0,0
	DEFB	0,0,0,0
	DEFB	0,0,0,0
	JR	WBOOT2
BIOSTK	EQU	$		;BIOS STACK OVERLAYS COLDSTART CODE
;
SPSAVE:	DEFS	2		;USER SP SAVE FOR COMPLEX BIOS ENTRYS
;
;
;
;	... WARM BOOT ROUTINE ...
;
WBOOT:
	LD	SP,0080H
	CALL	FLUSH		;FINISH ANY DEFERRED DISK I/O
WBOOT2:	LD	HL,DPHTAB	;SET PARAM POINTER FOR DRIVE ZERO
	LD	(DPHPTR),HL	; FORMAT DESCRIPTOR STUFF
	XOR	A
	LD	(DISK),A
	INC	A
	LD	(TRACK),A
	CALL	PARAMS		;SELECT A: AND FIND TRACK #1 FORMAT
	JR	NZ,BOMB		;EXIT IF PERMANENT ERROR

	LD	HL,DPHTAB+SPT	;GET LOGICAL SECTORS-PER-TRACK PARAM
	LD	A,(HL)
	CP	NSECTS+1
	JR	C,BOMB		;ERROR IF TRACK IS SINGLE DENSITY
	CP	CPMSIZE
	JR	NC,WBOOT3	;JUMP IF CCP+BDOS FITS ON ONE TRACK

	LD	B,(HL)		;LOAD B WITH # OF SECTORS ON TRACK #1
	LD	A,CPMSIZE
	SUB	B		;COMPUTE # OF EXTRA SECTORS FROM TRACK #2
	JR	WBOOT4
;
WBOOT3:	LD	B,CPMSIZE	;GET ALL OF CP/M FROM TRACK #1
	XOR	A		;READ ZERO SECTORS FROM TRACK #2
WBOOT4:	LD	HL,CCP
	PUSH	AF
	CALL	RTRACK		;READ CCP+BDOS FROM DOUBLE DENSITY
	POP	BC
	INC	B
	DEC	B
	CALL	NZ,RTRACK	;CONDITIONAL READ FROM TRACK #2

GOCPM:	LD	HL,MEMTAB	;PREPARE TO STORE VECTORS & BDOS PATCH
	LD	B,0
GOCPM2:	LD	C,(HL)		;BC=BYTECOUNT
	INC	HL
	LD	E,(HL)
	INC	HL
	LD	D,(HL)		;DE=DESTINATION POINTER
	INC	HL
	LDIR			;COPY POOP INTO MEMORY
	LD	A,(HL)
	OR	A		;TEST FOR END OF TABLE
	JR	NZ,GOCPM2

	LD	A,(IOBYTE+1)	;DO AUTO LOG-ON THING THAT PEOPLE LIKE
	AND	00001111B
	CP	NFLOPPY+WINCH
	JR	C,GOCPM3
	XOR	A		;LOG-ON A: IF DRIVE# IS ILLEGALY LARGE
GOCPM3:	LD	C,A
	LD	HL,CCP
	LD	A,(HL)		;PEEK AT FIRST OPCODE IN CCP
	CP	0C3H
	JR	NZ,BOMB		;ABORT IF NOT A JUMP INSTRUCTION
	JP	(HL)		;ELSE JUMP INTO CCP TO START CPM
;
;
;
;
RTRACK:
	LD	C,1		;READ TRACK FROM LOGICAL SECTOR #1
RTRK2:	PUSH	HL
	PUSH	BC
	LD	(POINTR),HL
	LD	A,C
	LD	(SECTOR),A	;SET LOGICAL SECTOR NUMBER FOR READ
	CALL	READDB		;LOAD NEXT 128 BYTES OF CP/M
	POP	BC
	POP	HL
	JR	NZ,BOMB		;EXIT IF PERMANENT ERROR
	LD	DE,128
	ADD	HL,DE
	INC	C
	DJNZ	RTRK2		;BUMP SECTOR# AND LOAD ADDRESS TILL B=0

	LD	A,(TRACK)
	INC	A		;BUMP TRACK# AFTER LAST SECTOR IS READ
	LD	(TRACK),A
	RET
;
;
BOMB:	LD	HL,DEAD
	CALL	PMSG
	JP	MONITR+3
;
DEAD:	DEFB	'  cannot boot'
	DEFB	NULL
;
;
;	... ASSORTED CONSTANTS AND WHERE TO PLUG THEM IN ...
;
MEMTAB:
	DEFB	3		;WARMSTART VECTOR
	DEFW	0000H
	JP	CBIOS+3

	DEFB	3		;BDOS VECTOR
	DEFW	0005H
	JP	BDOS

	DEFB	3		;BREAKPOINT VECTOR
	DEFW	0038H
	JP	MONITR+3

	DEFB	5		;CP/M 2.2 PATCH 01  3/31/81
	DEFW	DBBUG
	NOP
	NOP
	LD	HL,0

	DEFB	2		;DEFAULT DISK I/O POINTER
	DEFW	POINTR
	DEFW	0080H

	DEFB	0		;END OF TABLE
;
;
	PAGE
;
;	... CHARACTER I/O ROUTINES FOR BIOS ...
;
;
CONST:	JP	MONITR+6	;MONITOR CONSOLE STATUS ENTRY POINT
;
;
CONIN:  JP      MONITR+9        ;MONITOR CONSOLE INPUT ENTRY POINT
;
;
CONOUT:	LD	A,C
	JP	MONITR+12	;MONITOR CONSOLE OUTPUT ENTRY POINT
;
;
;
LISTST:
	LD	A,00010000B
	OUT	(LSTCTL),A	;DO SIO CLEAR STATUS/INTERRUPT CMD
	IN	A,(LSTCTL)
	AND	TXMASK		;DISCARD BITS NOT BEING TESTED
	CP	TXMASK
	LD	A,255
	RET	Z		;RETURN WITH A=255 IF PRINTER READY

	XOR	A
	RET			;ELSE RETURN WITH A=0
;
;
;
LIST:
	CALL	LISTST
	OR	A
	JR	Z,LIST		;LOOP TILL SIO CAN SEND A CHARACTER

	LD	A,C
	OUT	(LSTDAT),A	;OUTPUT ASCII TO SIO

	IF	XONXOFF
	IN	A,(LSTCTL)
	BIT	0,A		;TEST SIO RX DATA AVAILABLE
	RET	Z		;EXIT IF NO INPUT FROM PRINTER

	IN	A,(LSTDAT)	;ELSE GET CHARACTER AND TEST FOR
	RES	7,A		; 'XOFF' CHARACTER (CONTROL-S)
	CP	'S'-64
	RET	NZ

LIST2:	IN	A,(LSTCTL)
	BIT	0,A
	JR	Z,LIST2		;LOOP TILL NEXT HANDSHAKE CHARACTER

	IN	A,(LSTDAT)	;INPUT AND DISCARD 'XON' CHARACTER
	ENDIF

	RET
;
;
;
	INCLUDE	DEBLOCK.MAC	;DEBLOCKING DISK DRIVERS
;
	IF	WINCH
	INCLUDE	XEBEC.MAC	;DISK DRIVERS FOR XEBEC CONTROLLER
	ENDIF
;
;
	IF	$ GE MONITR
	.PRINTX	/OVERLAYING SYSTEM MONITOR/
	ENDIF
;
BIOSLEN	EQU	(($ AND -128)+128)-CBIOS   ;LENGTH OF CBIOS MOD 128
;
	PAGE
;********************************************************
;*							*
;*	DISK I/O BUFFERS FOR BDOS FILE HANDLER		*
;*							*
;********************************************************
;
;
;
	ORG	SCRATCH

DIRBUF:	DEFS	128		;SCRATCH DIRECTORY BUFFER
BIGBUF:	DEFS	1024		;HOST SECTOR BUFFER FOR DEBLOCKING
;
;
;
DPH	MACRO
	LOCAL	BASE
BASE:	DEFS	16		;;DISK PARAMETER HEADER
	DEFS	15		;;DISK PARAMETER BLOCK
	DEFS	4		;;DEBLOCK PARAMETERS
	DEFS	1		;;DEBLOCK FLAGS
	DEFS	DIRSIZ/4	;;CHECK VECTOR
	DEFS	ALLMAX		;;ALLOCATION VECTOR
	ENDM
;
;
;
DPHTAB	EQU	$
	REPT	NFLOPPY		;CREATE FLOPPY DISK DATA AREAS
	DPH
	ENDM
DPHSIZ	EQU	($-DPHTAB)/NFLOPPY
;
;
	IF	WINCH

	DEFS	16		;DISK PARAMETER HEADER
	DEFS	15		;DISK PARAMETER BLOCK
	DEFS	4		;DEBLOCK PARAMETERS
	DEFS	1		;DEBLOCK FLAGS
	DEFS	MAXBLK/8	;ALLOCATION VECTOR

	ENDIF
;
;
;
NEW	EQU	$
SECTOR:	DEFS	1		;BIOS SECTOR NUMBER
TRACK:	DEFS	2		;BIOS TRACK NUMBER
DISK:	DEFS	1		;BIOS DISK NUMBER
POINTR:	DEFS	2		;BIOS DMA POINTER
;
;
HOST	EQU	$
HSTSEC:	DEFS	1		;HOST SECTOR NUMBER
HSTTRK:	DEFS	2		;HOST TRACK NUMBER
HSTDSK:	DEFS	1		;HOST DISK NUMBER
HSTPTR:	DEFS	2
;
HSTDPH:	DEFS	2		;HOST DISK PARAMETER POINTER
;
NEXT	EQU	$
NXTSEC:	DEFS	1		;NEXT SECTOR NUMBER
NXTTRK:	DEFS	2		;NEXT TRACK NUMBER
;
RCOUNT:	DEFS	1		;UNALLOCATED RECORD COUNT
SECTMP:	DEFS	1		;HOST EQUIVALENT OF SECTOR#
RDACT:	DEFS	1		;READ BUFFER ACTIVE FLAG
WRTACT:	DEFS	1		;WRITE BUFFER ACTIVE FLAG
DIR:	DEFS	1		;DIR FOR DEFERRED RD/WRT (1=READ)
RWFLAG:	DEFS	1		;DIR FOR HOST RD/WRT (1=READ)
;
;
DPHPTR:	DEFS	2		;POINTER TO DPH ENTRY
PRMPTR:	DEFS	2		;POINTER TO DISK PARAMS
IDBUFF:	DEFS	8		;BUFFER FOR ID RECORDS ON SIDE #0
IDTOP:	DEFS	8		;BUFFER FOR ID RECORDS ON SIDE #1

SCRLEN	EQU	$-SCRATCH
;
;
	IF	$ GE SYSRAM
	.PRINTX	/BIOS OVERLAYING SYSTEM VARIABLES/
	ENDIF
;
;
	.XLIST			;TURN OFF LISTING
	.PHASE	SYSRAM
	INCLUDE	MEMDEF.MAC	;ASSEMBLE SYSTEM VARIABLES IN CASE THEY
	.DEPHASE		; ARE REFERENCED ANYWHERE IN CBIOS
;
;
	END
