*TITLE	'DOSPLUS - MODEL II OPERATING SYSTEM'
;
;	K. Watt 	05/82, for Breeze/Qsd Inc.
;	S. Pagliarulo	05/82, for Micro-Systems SOFT Inc.
*SPACE	1
;	Copyright (c)	05/82, MicroPower Inc.
*SPACE	3
;
;	RESIDENT FIXED ADDRESSES
;
PAGE0	EQU	000H		;PAGE ADDRESS
PAGE1	EQU	100H		;PAGE ADDRESS
PAGE2	EQU	200H		;PAGE ADDRESS
PAGE3	EQU	300H		;PAGE ADDRESS
SIOABUF EQU	1900H		;SIO channel A buffer
SIOBBUF EQU	1904H		;SIO channel B buffer
PRTBUFF EQU	1908H		;printer spooler buffer
KBDBUFF EQU	190AH		;keyboard type-ahead buffer
DEBBUFF EQU	1930H		;debug breakpoint storage
DSTACK	EQU	1980H		;display driver stack
STACK	EQU	1A00H		;START STACK AREA
UBUFER	EQU	1A00H		;USER I/O BUFFER
BUFFER	EQU	1B00H		;SYSTEM I/O BUFFER
;
;	ASCII CHARACTER EQUIVALENCES
;
CR	EQU	13		;CARRIAGE RETURN
NUL	EQU	0		;NULL CHARACTER
ETX	EQU	3		;END TEXT
BK	EQU	8		;CTL-H
LF	EQU	10		;LINE FEED
FF	EQU	12		;FORM FEED
;
*EJECT
;	IO PORT VALUES CPU MODULE
;
CTC0	EQU	0F0H		;CTC CHANNEL 0
CTC1	EQU	0F1H		;CTC CHANNEL 1
CTC2	EQU	0F2H		;CTC CHANNEL 2
CTC3	EQU	0F3H		;CTC CHANNEL 3
SIOAD	EQU	0F4H		;SIO CHANNEL A DATA
SIOBD	EQU	0F5H		;SIO CHANNEL B DATA
SIOAC	EQU	0F6H		;SIO CHANNEL A CMD/STAT
SIOBC	EQU	0F7H		;SIO CHANNEL B CMD/STAT
DMA	EQU	0F8H		;DMA COMMAND/STATUS
ROME	EQU	0F9H		;ROM ENABLE/DISABLE
;
;	IO PORT VALUES FDC-PRINTER
;
PIOAD	EQU	0E0H		;PRINTER & FDC INT STAT
PIOBD	EQU	0E1H		;PRINTER DATA (OUTPUT)
PIOAC	EQU	0E2H		;CONFIGURING PORT A
PIOBC	EQU	0E3H		;CONFIGURING PORT B
FDCC	EQU	0E4H		;FDC COMMAND/STATUS
FDCT	EQU	0E5H		;FDC TRACK REGISTER
FDCS	EQU	0E6H		;FDC SECTOR REGISTER
FDCD	EQU	0E7H		;FDC DATA REGISTER
DRSL	EQU	0EFH		;DRIVE,MODE,SIDE SEL
;
;	IO PORT VALUES KEYBOARD/VIDEO
;
RDKBD	EQU	0FCH		;READ KEYBOARD DATA
LCRTA	EQU	0FCH		;LOAD CRTC ADD REG
RCTRD	EQU	0FDH		;READ CRTC DATA REG
LCTRD	EQU	0FDH		;LOAD CTRC DATA REG
RDRTC	EQU	0FEH		;CLEAR RTC INTERRUPT
RDNMI	EQU	0FFH		;READ NMI/INT REG
LBANK	EQU	0FFH		;LOAD BANK SEL REG
;
;	MACHINE INSTRUCTIONS
;
LDBC	EQU	01H		;LD	BC,NNNN
JP	EQU	0C3H		;JP	ADD
;
*TITLE	'SYSTEM I/O DRIVERS - 1.0'
;	GENERAL PURPOSE I/O DRIVERS:
;
;	     $KBD	- READ KEYBOARD CHARACTER
;	     $DSP	- WRITE CHARACTER TO DISPLAY
;	     $PRT	- WRITE CHARACTER PRINTER
;	     $KBDW	- READ KEYBOARD W/WAIT
;	     $PRTS	- READ PRINTER STATUS
;	     $CLAI	- READ CHAR FROM COMM LINE A
;	     $CLAO	- WRITE CHAR TO COMM LINE A
;	     $CLBI	- READ CHAR FROM COMM LINE B
;	     $CLBO	- WRITE CHAR TO COMM LINE B
;	     $CLAW	- READ CHAR COMM LINE A & WAIT
;	     $CLBW	- READ CHAR COMM LINE B & WAIT
;
*EJECT
;	Z80 RST'S AND CHAR I/O
;
	ORG	PAGE0
;
RST00	JP	JP2DOS		;DOS WARM ENTRY
KBD	LD	A,1<5+0 	;KBD INPUT
	JR	RESOL		;GO!
	DEFS	1
;
RST08	JP	EXSVC		;SVC EXECUTER
DSP	LD	A,2<5+1 	;DISPLAY OUTPUT
	JR	RESOL		;GO!
	DEFS	1
;
RST10	JP	DISKIO		;DISK I/O MANAGER
PRT	LD	A,2<5+2 	;PRINTER OUTPUT
	JR	RESOL		;GO!
	DEFS	1
;
RST18	JP	OVERLY		;OVERLAY LOADER
KBDW	LD	A,5<5+0 	;KBD INPUT/WAIT
	JR	RESOL		;GO!
	DEFS	1
;
RST20	RET			;Z80 RST
	NOP
	NOP
PRTS	LD	A,4<5+2 	;PRINTER STATUS
	JR	RESOL		;GO!
	DEFS	1
;
RST28	RET			;Z80 RST
	NOP
	NOP
CLAI	LD	A,1<5+3 	;COMM LINE A INPUT
	JR	RESOL		;GO!
	DEFS	1
;
RST30	RET			;Z80 RST
	NOP
	NOP
CLAO	LD	A,2<5+3 	;COMM LINE A OUTPUT
	JR	RESOL		;GO!
	DEFS	1
;
RST38	JP	DEBUG		;Z80 RST
;
CLBI	LD	A,1<5+4 	;COMM LINE B INPUT
	JR	RESOL		;GO!
CLBO	LD	A,2<5+4 	;COMM LINE B OUTPUT
	JR	RESOL		;GO!
CLAW	LD	A,5<5+3 	;COMM LINE A INPUT/WAIT
	JR	RESOL		;GO!
CLBW	LD	A,5<5+4 	;COMM LINE B INPUT/WAIT
;
*EJECT
;	RESOLVE DCB ADDRESS
;
;	ENT	 A =	MASK,DCB#
;
;	EXT	 A =	DEVICE MASK
;		IX =>	DEVICE DCB
;
RESOL	PUSH	IX		;SAVE
	PUSH	AF		;SAVE MASK
	AND	0FH		;A = DEVICE NUMBER
	CALL	LOCDCB		;LOCATE DCB
	POP	AF		;GET MASK
	RLCA
	RLCA
	RLCA			;TO BITS 0-2
	AND	07H		;MASK ONLY
	JR	CHIO		;SKIP
;
;	GENERAL PURPOSE CHAR I/O
;
;	ENT	 A =	I/O TYPE
;		 B =	CHARACTER
;		DE =>	DEVICE DCB
;
GET	LD	A,5		;I/O TYPE
	JR	GIO		;SKIP
PUT	LD	A,2		;I/O TYPE
;
GIO	PUSH	IX		;SAVE
	PUSH	DE
	POP	IX		;IX => DCB
	JR	CHIO		;SKIP
;
*EJECT
;	NON-MASKABLE INT VECTOR
;
	ORG	PAGE0+66H
;
NMIVC	JP	NMICODE 	;NMI HANDLER
;
;	TABLE OF IM-2 ROUTINES
;
	ORG	PAGE0+70H
;
M2IVC	DEFW	-1		;SIO B TX
	DEFW	-1		;SIO B EXTL
	DEFW	RSINTB		;SIO B RX
	DEFW	RSINTB		;SIO B SPCL
;
	DEFW	-1		;SIO A TX
	DEFW	-1		;SIO A EXTL
	DEFW	RSINTA		;SIO A RX
	DEFW	RSINTA		;SIO A SPCL
;
	DEFW	-1		;CTC 0
	DEFW	-1		;CTC 1
	DEFW	-1		;CTC 2
	DEFW	KBDTASK 	;CTC 3 - KEYBOARD
;
;	TABLE OF INT TASK DRIVERS
;
	DEFW	CLKTASK 	;CLOCK TASK
	DEFW	TRCTASK 	;TRACE TASK
	DEFW	ALVTASK 	;ALIVE TASK
;
*EJECT
;	DEVICE CHARACTER I/O DRIVER
;	HANDLES DCB,NIL,ROUTE,LINK,CTL
;
;	ENT	 A =	I/O TYPE
;		IX =>	DEVICE DCB
;
CHIO	PUSH	HL		;SAVE REG
	PUSH	DE
CIO0	PUSH	AF		;SAVE TYPE
	PUSH	IX		;SAVE DCB
	LD	HL,CIO8 	;RETURN ADD
	PUSH	HL		;TO STACK
;
CIO1	LD	E,(IX+0)	;GET DCB TYPE
	LD	D,A		;D = I/O TYPE
	BIT	7,E		;FILE?
	JP	NZ,CIOF 	;GO!
	LD	L,(IX+3)
	LD	H,(IX+4)	;ROUTE/LINK DCB
	BIT	4,E		;ROUTE?
	JR	NZ,CIO4 	;GO!
	BIT	5,E		;LINK?
	JR	Z,CIO2		;IF NOT
;
	PUSH	AF		;I/O TYPE TO STACK
	PUSH	HL		;LINK DCB TO STACK
	LD	HL,CIO5 	;LINK ADD
	PUSH	HL		;TO STACK
;
CIO2	BIT	3,E		;NIL?
	JR	NZ,CIO3 	;GO!
	LD	A,E		;GET DCB TYPE
	AND	D		;MASK TYPE
	CP	D		;DEVICE SUPPORT?
	JR	NZ,CIO3 	;IF NOT
	LD	L,(IX+1)
	LD	H,(IX+2)	;HL => DRIVER
	CP	2		;INPUT?
	JP	(HL)		;GO!
;
;	NIL DEVICE HANDLER
;
CIO3	LD	A,D		;GET I/O TYPE
	AND	1		;INPUT?
	RET	Z		;IF OUTPUT
	LD	A,2		;NO CHAR AVAIL
	RET
;
;	ROUTED DEVICE HANDLER
;
CIO4	PUSH	HL
	POP	IX		;IX => ROUTE DCB
	JR	CIO1		;GO!
;
;	LINKED DEVICE HANDLER
;
CIO5	POP	IX		;IX => LINK DCB
	POP	DE		;D = I/O TYPE
	JR	NZ,CIO6 	;IF ERROR
	BIT	0,D		;OUTPUT?
	JR	Z,CIO6+4	;DO LINK
	CP	A		;NO ERROR
	RET			;DONE!
;
CIO6	BIT	0,D		;OUTPUT
	JR	Z,CIO7		;IF YES
	LD	A,D		;A = I/O TYPE
	JR	CIO1		;DO LINK
CIO7	OR	A		;STATUS
	RET
;
;	DEVICE I/O TERMINATION
;
CIO8	POP	IX		;GET DCB
	POP	DE		;GET TYPE
	JR	Z,CIO9		;NO ERROR
	CP	2		;NOT AVAIL?
	JR	NZ,CIO9 	;IF NOT
	BIT	2,D		;CTL?
	JR	Z,CIOA		;IF NOT
	LD	A,D		;GET TYPE
	JR	CIO0		;TRY AGAIN
;
CIOA	OR	A		;NZ STATUS
CIO9	POP	DE		;RESTORE REG
	POP	HL
	POP	IX
	RET
;
*EJECT
;	DCB/DCT LOCATION TABLE
;
;	OFFSET	+00-01 DCB/DCT ADDRESS
;		+02-03 DCB/DCT NAME 2 CHAR
;
	ORG	PAGE1
;
DCBTBL	DEFW	KDCB		;DEVICE 0
	DEFM	'KI'
	DEFW	DDCB		;DEVICE 1
	DEFM	'DO'
	DEFW	PDCB		;DEVICE 2
	DEFM	'PR'
	DEFW	CADCB		;DEVICE 3
	DEFM	'CA'
	DEFW	CBDCB		;DEVICE 4
	DEFM	'CB'
	DEFW	USER1		;DEVICE 5
	DEFM	'U1'
	DEFW	USER2		;DEVICE 6
	DEFM	'U2'
	DEFW	USER3		;DEVICE 7
	DEFM	'U3'
	DEFW	DCT0		;DEVICE 8
	DEFM	'0 '
	DEFW	DCT1		;DEVICE 9
	DEFM	'1 '
	DEFW	DCT2		;DEVICE 10
	DEFM	'2 '
	DEFW	DCT3		;DEVICE 11
	DEFM	'3 '
	DEFW	DCT4		;DEVICE 12
	DEFM	'4 '
	DEFW	DCT5		;DEVICE 13
	DEFM	'5 '
	DEFW	DCT6		;DEVICE 14
	DEFM	'6 '
	DEFW	DCT7		;DEVICE 15
	DEFM	'7 '
;
*INCL	DOSDATAK		;DATA
*INCL	DOSDATAS		;DATA
*EJECT
;	TABLE OF SUPERVISOR CALLS
;
	ORG	PAGE2
;
SVCTBL	DEFW	INITIO		;0 - INITIALIZE I/O
	DEFW	KBINIT		;1 - KEYBOARD INITIALIZE
	DEFW	SETUSR		;2 - SET-UP USER SVC
	DEFW	SETBRK		;3 - SET UP BREAK PROCESSING
	DEFW	KBD		;4 - KEYBOARD CHARACTER
	DEFW	KBLINE		;5 - KEYBOARD LINE
	DEFW	DELAY		;6 - DELAY PROGRAM EXECUTION
	DEFW	VDINIT		;7 - VIDEO INITIALIZE
	DEFW	DSP		;8 - VIDEO CHARACTER
	DEFW	VDLINE		;9 - VIDEO LINE
	DEFW	VDGRAF		;10 - VIDEO GRAPHICS
	DEFW	VDREAD		;11 - VIDEO READ
	DEFW	VIDKEY		;12 - VIDEO/KEYBOARD
	DEFW	SVBAD		;13 - UNDEFINED
	DEFW	SVBAD		;14 - UNDEFINED
	DEFW	DISKID		;15 - READ DISKETTE ID
	DEFW	SVBAD		;16 - UNDEFINED
	DEFW	PRINIT		;17 - PRINTER INITIALIZE
	DEFW	PRT		;18 - PRINTER CHARACTER
	DEFW	PRLINE		;19 - PRINTER LINE
	DEFW	RANDOM		;20 - RANDOM NUMBER GEN
	DEFW	BINDEC		;21 - BINARY/DECIMAL CONV
	DEFW	STCMP		;22 - STRING COMPARE
	DEFW	MPYDIV		;23 - MULTIPLY/DIVIDE
	DEFW	BINHEX		;24 - BINARY/HEX CONV
	DEFW	TIMER		;25 - TIMER TO INTERRUPT
	DEFW	CURSOR		;26 - CURSOR CONTROL
	DEFW	SCROLL		;27 - SCROLL PROTECT VIDEO
	DEFW	LOOKUP		;28 - TABLE LOOKUP ROUTINE
	DEFW	HLDKEY		;29 - PROCESS HOLD KEY
	DEFW	KBPUT		;30 - CHAR TO TYPE AHEAD
	DEFW	JPINIT		;31 - INITIO & JP2DOS
	DEFW	SVBAD		;32 - OVERLAY LOADER
	DEFW	LOCATE		;33 - LOCATE RECORD
	DEFW	READNX		;34 - READ NEXT RECORD
	DEFW	DIRRD		;35 - DIRECT RECORD READ
	DEFW	JP2DOS		;36 - @ ABORT DOS ENTRY
	DEFW	DOSCMD		;37 - DOS CMD & EXIT
	DEFW	RETCMD		;38 - DOS CMD & RETURN
	DEFW	ERROR		;39 - DISPLAY ERROR NUMBER
	DEFW	OPEN		;40 - OPEN DEVICE/FILE
	DEFW	KILL		;41 - KILL DEVICE/FILE
	DEFW	CLOSE		;42 - CLOSE DEVICE/FILE
	DEFW	WRITNX		;43 - WRITE NEXT RECORD
	DEFW	DIRWR		;44 - DIRECT RECORD WRITE
	DEFW	DATE		;45 - FETCH CURR TIME/DATE
	DEFW	PARSER		;46 - PARSE COMMAND LINE
	DEFW	RENAME		;47 - RENAME FILE ROUTINE
	DEFW	REWD		;48 - REWIND FILE
	DEFW	STSCAN		;49 - STRING SCAN ROUTINE
	DEFW	SVBAD		;50 - UNDEFINED
	DEFW	WILD		;51 - WILD CARD PARSER
	DEFW	ERRMSG		;52 - RETURN ERROR MESSAGE
	DEFW	RAMDIR		;53 - RAM DIRECTORY
	DEFW	RDDIR		;54 - READ DIRECTORY
	DEFW	RS232C		;55 - RS-232-C INITIALIZE
	DEFW	SORT		;56 - SORT RAM ROUTINE
	DEFW	CLRXIT		;57 - CLEAR RAM & EXIT DOS
	DEFW	FILPTR		;58 - GET FILE POINTERS
	DEFW	SVBAD		;59 - UNDEFINED
	DEFW	SVBAD		;60 - UNDEFINED
	DEFW	SVBAD		;61 - UNDEFINED
	DEFW	SVBAD		;62 - UNDEFINED
	DEFW	SVBAD		;63 - UNDEFINED
	DEFW	SVBAD		;64 - UNDEFINED
	DEFW	SVBAD		;65 - UNDEFINED
	DEFW	SVBAD		;66 - UNDEFINED
	DEFW	SVBAD		;67 - UNDEFINED
	DEFW	SVBAD		;68 - UNDEFINED
	DEFW	SVBAD		;69 - UNDEFINED
	DEFW	SVBAD		;70 - UNDEFINED
	DEFW	SVBAD		;71 - UNDEFINED
	DEFW	SVBAD		;72 - UNDEFINED
	DEFW	KBDW		;73 - KBD INPUT W/WAIT
	DEFW	PRTS		;74 - PRINTER STATUS
	DEFW	CLAW		;75 - COMM LINE A WAIT
	DEFW	CLBW		;76 - COMM LINE B WAIT
	DEFW	GET		;77 - INPUT BYTE DEVICE
	DEFW	PUT		;78 - OUTPUT BYTE DEVICE
	DEFW	POSN		;79 - POSN TO LOGICAL REC
	DEFW	BKSP		;80 - BKSP LOGICAL RECORD
	DEFW	REWD		;81 - REWIND FILE
	DEFW	PEOF		;82 - POSN TO EOF
	DEFW	EVAL		;83 - EVALUATE CMD LINE
	DEFW	FSPEC		;84 - FETCH FILE SPEC
	DEFW	RUN		;85 - LOAD & RUN PROGRAM
	DEFW	LOAD		;86 - LOAD PROGRAM
	DEFW	PARAM		;87 - FETCH OPTIONAL PARAMS
	DEFW	FEXT		;88 - PLACE FILE EXTENSION
	DEFW	VALUE		;89 - FETCH NUMERIC VALUE
	DEFW	SVBAD		;90 - UNDEFINED
	DEFW	SCREEN		;91 - SCREEN PRINT
	DEFW	NMICTL		;92 - ADD/KILL NMI VECTOR
	DEFW	SVBAD		;93 - UNDEFINED
	DEFW	VIDRAM		;94 - VIDEO/RAM TRANSFER
	DEFW	PRCTRL		;95 - PRINTER CONTROL
	DEFW	CLAI		;96 - CHANNEL A RECEIVE
	DEFW	CLAO		;97 - CHANNEL A TRANSMIT
	DEFW	CLBI		;98 - CHANNEL B RECEIVE
	DEFW	CLBO		;99 - CHANNEL B TRANSMIT
	DEFW	ACTRL		;100 - CHANNEL A CONTROL
	DEFW	BCTRL		;101 - CHANNEL B CONTROL
	DEFW	SVBAD		;102 - UNDEFINED
	DEFW	SVBAD		;103 - UNDEFINED
	DEFW	SVBAD		;104 - UNDEFINED
	DEFW	SVBAD		;105 - UNDEFINED
	DEFW	SVBAD		;106 - UNDEFINED
	DEFW	SVBAD		;107 - UNDEFINED
	DEFW	SVBAD		;108 - UNDEFINED
	DEFW	SVBAD		;109 - UNDEFINED
	DEFW	SVBAD		;110 - UNDEFINED
	DEFW	SVBAD		;111 - UNDEFINED
	DEFW	SVBAD		;112 - UNDEFINED
	DEFW	SVBAD		;113 - UNDEFINED
	DEFW	SVBAD		;114 - UNDEFINED
	DEFW	SVBAD		;115 - UNDEFINED
	DEFW	SVBAD		;116 - UNDEFINED
	DEFW	SVBAD		;117 - UNDEFINED
	DEFW	SVBAD		;118 - UNDEFINED
	DEFW	SVBAD		;119 - UNDEFINED
	DEFW	SVBAD		;120 - UNDEFINED
	DEFW	SVBAD		;121 - UNDEFINED
	DEFW	SVBAD		;122 - UNDEFINED
	DEFW	SVBAD		;123 - UNDEFINED
	DEFW	SVBAD		;124 - UNDEFINED
	DEFW	SVBAD		;125 - UNDEFINED
	DEFW	SVBAD		;126 - UNDEFINED
	DEFW	SVBAD		;127 - UNDEFINED
;
*EJECT
;	VECTORS TO MISC ROUTINES
;
	ORG	PAGE3
;
JPINIT$ JP	JPINIT		;INITIO & JP2DOS
REGSAV$ JP	REGSAV		;SAVE REGISTERS
SAVERN$ JP	SAVERN		;SET-UP FOR FCB ACTIVITY
SAVER$	JP	SAVER		;SET-UP FOR FCB ACTIVITY
SMULT$	JP	SMULT		;8 X 8 MULTIPLY
SDIVD$	JP	SDIVD		;8 X 8 DIVIDE
DMULT$	JP	DMULT		;8 X 16 MULTIPLY
DDIVD$	JP	DDIVD		;8 X 16 DIVIDE
TMULT$	JP	TMULT		;8 X 24 MULTIPLY
TTIVD$	JP	TDIVD		;8 X 24 DIVIDE
UCASE$	JP	UCASE		;CASE CONVERSION
DBLOCK$ JP	DBLOCK		;WRITE RESIDUAL DATA
DIRRED$ JP	DIRRED		;READ DIR FOR FILE
DIRWRT$ JP	DIRWRT		;WRITE DIR FOR FILE
LOCDCB$ JP	LOCDCB		;LOCATE DEVICE DCB
LOCDCT$ JP	LOCDCT		;LOCATE DRIVE DCT
FETMEM$ JP	FETMEM		;FETCH AVAIL MEMORY
RECMEM$ JP	RECMEM		;RECLAIM MEMORY
VIDON$	JP	VDSEL		;SELECT VIDEO
VIDOFF$ JP	VDOFF		;DE-SELECT VIDEO
BRKVEC	JP	JP2DOS		;SYSTEM BREAK VECTOR
;
*EJECT
;	DEVICE CONTROL BLOCKS HERE
;
;	definition of common DCB data
;
;+00	7 - File DCB	- 1=YES, 0=NO
;	6 - DCT/DCB	- 1=DCT, 0=DCB
;	5 - Linked	- 1=YES, 0=NO
;	4 - Routed	- 1=YES, 0=NO
;	3 - Nil 	- 1=YES, 0=NO
;	2 - @CTL	- 1=YES, 0=NO
;	1 - @GET	- 1=YES, 0=NO
;	0 - @PUT	- 1=YES, 0=NO
;
;+01,02 - DCB address
;+03,04 - linked/routed DCB address
;
;+05	7 - available
;	6 - available
;	5 - available
;	4 - available
;	3 - available
;	2 - available
;	1 - available
;	0 - Translate - 1=ON, 0=OFF
;
;+06,07 - Translation Table Address
;+08	- Translation Table Length
;
;+09,10 - Buffer Start Address
;+11,12 - Buffer Size
;+13,14 - Add to Buffer Offset
;+15,16 - Take from Buffer Offset
;
*EJECT
; definition of keyboard DCB (extensions)
;
;+05 -	7 - unused		- 1=YES, 0=NO
;	6 - BREAK off switch	- 1=YES, 0=NO
;	5 - BREAK processor	- 1=YES, 0=NO
;	4 - HOLD processor	- 1=YES, 0=NO
;	3 - BREAK in buffer	- 1=YES, 0=NO
;	2 - HOLD in buffer	- 1=YES, 0=NO
;	1 - Active CHAIN	- 1=YES, 0=NO
;	0 - Translation 	- 1=ON, 0=OFF
;
KDCB	DEFB	5		;input/ctrl
	DEFW	KBDCODE 	;driver address
	DEFW	0		;linker/router
	DEFB	0		;operation flag
	DEFW	0		;translate table
	DEFB	0		;table length
	DEFW	KBDBUFF 	;type buffer
	DEFW	38		;buff size
	DEFW	0		;add offset
	DEFW	0		;take offset
	DEFW	0		;DO FCB location
	DEFW	0		;BREAK processor
;
*EJECT
; definition of display DCB (extensions)
;
;+09	- char mode mask
;+10	- line length
;+11,12 - cursor location
;+13,14 - start scroll
;+15,16 - end scroll+1
;+17,18 - scroll count
;
DDCB	DEFB	6		;output/ctl
	DEFW	DSPCODE 	;driver address
	DEFW	0		;linker,router DCB
	DEFB	0		;misc flags
	DEFB	0		;xlate table len
	DEFW	0		;xlate table add
	DEFB	0		;char mode rev/nrm
	DEFB	80		;line length
	DEFW	VIDEO		;cursor location
	DEFW	VIDEO		;start scroll area
	DEFW	VIDEO+1920	;end scroll area
	DEFW	1840		;scroll count
;
*EJECT
; definition of printer DCB (extensions)
;
;+05	7 - p/s 	- 1=serial, 0=parallel
;	6 - LF on CR	- 1=ON, 0=OFF
;	5 - INT flag	- 1=ON, 0=OFF
;	4 - locase	- 1=YES,0=NO
;	3 - transparent - 1=ON, 0=OFF
;	2 - form feeds	- 1=REAL, 0=TRANSLATED
;	1 - tabs	- 1=REAL, 0=TRANSLATED
;	0 - tranlation	- 1=ON, 0=OFF
;
;+17	- printed lines/page
;+18	- page length
;+19	- line counter
;+20	- max chars/line
;+21	- char counter
;
PDCB	DEFB	6		;output/ctl
	DEFW	PRTCODE 	;driver address
	DEFW	0		;linker/router DCB
	DEFB	0		;operation flag
	DEFW	0		;xlate table addr
	DEFB	0		;table length
	DEFW	PRTBUFF 	;buffer pointer
	DEFW	2		;buffer length
	DEFW	0		;adder offset
	DEFW	0		;taker offset
	DEFB	60		;printed lines/page
	DEFB	66		;page length
	DEFB	0		;line counter
	DEFB	132		;max chars/line
	DEFB	0		;char counter
;
*EJECT
; definition of SIO DCB'S (extensions)
;
;+05	7 - unused
;	6 - unused
;	5 - unused
;	4 - unused
;	3 - unused
;	2 - unused
;	1 - channel initialized - 1=NO, 0=YES
;	0 - translation 	- 1=ON, 0=OFF
;
;+17	- Base Port SIO (command/status)
;+18	- CTC port #1
;+19	- CTC port #2
;+20	- Word Length Mask
;+21	- stops config
;+22	- CTC R5 Mask (for PRCTRL call)
;
;+23	7 - reserved
;	6 - baud config 	- high
;	5 - baud config 	- next
;	4 - baud config 	- low
;	3 - word config 	- high
;	2 - word config 	- low
;	1 - parity even/odd	- 0=ODD, 1=EVEN
;	0 - parity on/off	- 0=OFF, 1=YES
;
;	definition of COMM LINE A
;
CADCB	DEFB	7		;input/output/ctl
	DEFW	SIOCODE 	;driver address
	DEFW	0		;linking/routing DCB
	DEFB	0		;channel active
	DEFW	0		;translation
	DEFB	0		;translate length
	DEFW	SIOABUF 	;input buffer
	DEFW	2		;buffer size
	DEFW	0		;add offset
	DEFW	0		;take offset
	DEFB	SIOAC		;base port
	DEFB	CTC0		;CTC #1
	DEFB	CTC1		;CTC #2
	DEFB	0FFH		;word length mask
	DEFB	1		;stops
	DEFB	0		;CTC R5 mask
	DEFB	2CH		;baud/word/parity
;
*EJECT
;	definition of COMM LINE B
;
CBDCB	DEFB	7		;input/output/ctl
	DEFW	SIOCODE 	;driver address
	DEFW	0		;linker/router
	DEFB	0		;channel active
	DEFW	0		;translate address
	DEFB	0		;translate length
	DEFW	SIOBBUF 	;buffer address
	DEFW	2		;buffer length
	DEFW	0		;add offset
	DEFW	0		;take offset
	DEFB	SIOBC		;base port
	DEFB	CTC2		;CTC #1
	DEFB	0		;CTC #2 (dummy)
	DEFB	0FFH		;word length mask
	DEFB	1		;stops
	DEFB	0		;CTC R5 mask
	DEFB	2CH		;baud/word/parity
;
*EJECT
;	definition of USER DCB
;
USER1	DEFB	8		;type flag (NIL)
	DEFW	0		;driver address
	DEFW	0		;linker/router
	DEFW	0		;xlate table
	DEFB	0		;xlat length
	DEFB	0		;reserved
	DEFB	0		;reserved
	DEFB	0		;reserved
	DEFB	0		;reserved
;
;	definition of USER DCB
;
USER2	DEFB	8		;type flag (NIL)
	DEFW	0		;driver address
	DEFW	0		;linker/router
	DEFW	0		;xlate table
	DEFB	0		;xlat length
	DEFB	0		;reserved
	DEFB	0		;reserved
	DEFB	0		;reserved
	DEFB	0		;reserved
;
;	definition of USER DCB
;
USER3	DEFB	8		;type flag (NIL)
	DEFW	0		;driver address
	DEFW	0		;linker/router
	DEFW	0		;xlate table
	DEFB	0		;xlat length
	DEFB	0		;reserved
	DEFB	0		;reserved
	DEFB	0		;reserved
	DEFB	0		;reserved
;
*EJECT
;	DRIVE CONTROL TABLES HERE
;
;	DEFINITION OF COMMON DCT DATA
;
;+00	7 - FILE DCB	- 1=YES, 0=NO
;	6 - DCT/DCB	- 1=DCT, 0=DCB
;	5 - LINKED	- NOT IMPLEMENTED
;	4 - ROUTED	- NOT IMPLEMENTED
;	3 - NIL 	- 1=YES, 0=NO
;	2 - RESERVED
;	1 - RESERVED
;	0 - RESERVED
;
;+01,02 - DRIVER ADDRESS
;+03,04 - LINKING DCT (NOT IMPLEMENTED)
;
;+05	7 - 5"/8" FLAG	- 0=8", 1=5"
;	6 - SOFTWARE WP - 0=NO, 1=YES
;	5 - HARD/FLOPPY - 0=FP, 1=HRD
;	4 - MOTOR DELAY - 0=NO, 1=YES
;	3 - HEAD LOAD	- 0=NO, 1=YES
;	2 - SKIP DRIVE	- 0=NO, 1=YES
;	1 - FIXED/REM	- 0=NO, 1=YES
;	0 - DISK LOG	- 0=NO, 1=YES
;
;+06	- STEP RATE
;+07	- HEAD OFFSET
;+08,09 - CYLINDER OFFSET
;+10	- SECTOR OFFSET
;+11	- HEAD LOCATION
;+12	- BINARY DRIVE
;
;	DEFINITION PERISHABLE DCT DATA
;
;+13	7 - SINGLE/DOUBLE DENSITY
;	6 - DIRECTORY PROTECTED
;
;+14	-  SURFACE COUNT
;+15	-  CYLINDER COUNT
;+16	-  SECTORS/TRACK
;+17	-  DIRECTORY LENGTH
;+18	-  DIRECTORY LOCATION
;+19	-  SECTORS/GRAN
;+20	-  GRANULES/CYLINDER
;+21,22 -  SECTORS/CYLINDER
;
*EJECT
;	FLOPPY DCT-0 DEFAULT
;
DCT0	DEFB	40H		;DCT DEVICE
	DEFW	FHCODE		;DRIVER ADDRESS
	DEFW	0		;LINKING DCT
	DEFB	08H		;FLAGS
	DEFB	02H		;STEP RATE
	DEFB	0		;HEAD OFFSET
	DEFW	0		;CYL OFFSET
	DEFB	0		;SECTOR OFFSET
	DEFB	0		;HEAD LOCATION
	DEFB	0		;BINARY DRIVE
;
	DEFB	0C0H		;FLAGS
	DEFB	1		;SURFACE COUNT
	DEFB	77		;CYLINDER COUNT
	DEFB	30		;SECTORS/TRACK
	DEFB	30		;DIRECTORY LENGTH
	DEFB	38		;DIRECTORY LOCATION
	DEFB	5		;SECTORS/GRAN
	DEFB	6		;GRANULES/CYLINDER
	DEFW	30		;SECTORS/CYLINDER
;
;	FLOPPY DCT-1 DEFAULT
;
DCT1	DEFB	40H		;DCT DEVICE
	DEFW	FHCODE		;DRIVER ADDRESS
	DEFW	0		;LINKING DCT
	DEFB	09H		;FLAGS,NO LOG
	DEFB	02H		;STEP RATE
	DEFB	0		;HEAD OFFSET
	DEFW	0		;CYL OFFSET
	DEFB	0		;SECTOR OFFSET
	DEFB	0		;HEAD LOCATION
	DEFB	1		;BINARY DRIVE
;
	DEFB	0C0H		;FLAGS
	DEFB	1		;SURFACE COUNT
	DEFB	77		;CYLINDER COUNT
	DEFB	30		;SECTORS/TRACK
	DEFB	30		;DIRECTORY LENGTH
	DEFB	38		;DIRECTORY LOCATION
	DEFB	5		;SECTORS/GRAN
	DEFB	6		;GRANULES/CYLINDER
	DEFW	30		;SECTORS/CYLINDER
;
*EJECT
;	FLOPPY DCT-2 DEFAULT
;
DCT2	DEFB	40H		;DCT DEVICE
	DEFW	FHCODE		;DRIVER ADDRESS
	DEFW	0		;LINKING DCT
	DEFB	09H		;FLAGS,NO LOG
	DEFB	02H		;STEP RATE
	DEFB	0		;HEAD OFFSET
	DEFW	0		;CYL OFFSET
	DEFB	0		;SECTOR OFFSET
	DEFB	0		;HEAD LOCATION
	DEFB	2		;BINARY DRIVE
;
	DEFB	0C0H		;FLAGS
	DEFB	1		;SURFACE COUNT
	DEFB	77		;CYLINDER COUNT
	DEFB	30		;SECTORS/TRACK
	DEFB	30		;DIRECTORY LENGTH
	DEFB	38		;DIRECTORY LOCATION
	DEFB	5		;SECTORS/GRAN
	DEFB	6		;GRANULES/CYLINDER
	DEFW	30		;SECTORS/CYLINDER
;
;	FLOPPY DCT-3 DEFAULT
;
DCT3	DEFB	40H		;DCT DEVICE
	DEFW	FHCODE		;DRIVER ADDRESS
	DEFW	0		;LINKING DCT
	DEFB	09H		;FLAGS, NO LOG
	DEFB	02H		;STEP RATE
	DEFB	0		;HEAD OFFSET
	DEFW	0		;CYL OFFSET
	DEFB	0		;SECTOR OFFSET
	DEFB	0		;HEAD LOCATION
	DEFB	3		;BINARY DRIVE
;
	DEFB	0C0H		;FLAGS
	DEFB	1		;SURFACE COUNT
	DEFB	77		;CYLINDER COUNT
	DEFB	30		;SECTORS/TRACK
	DEFB	30		;DIRECTORY LENGTH
	DEFB	38		;DIRECTORY LOCATION
	DEFB	5		;SECTORS/GRAN
	DEFB	6		;GRANULES/CYLINDER
	DEFW	30		;SECTORS/CYLINDER
;
*EJECT
;	RIGID DCT-4 DEFAULT
;
DCT4	DEFB	48H		;DCT,NIL
	DEFW	FHCODE		;DRIVER ADDRESS
	DEFW	0		;LINKING DCT
	DEFB	21H		;FLAGS,HD,NO LOG
	DEFB	07H		;STEP RATE
	DEFB	0		;HEAD OFFSET
	DEFW	0		;CYL OFFSET
	DEFB	0		;SECTOR OFFSET
	DEFB	0		;HEAD LOCATION
	DEFB	0		;BINARY DRIVE
;
	DEFB	0		;FLAGS
	DEFB	4		;SURFACE COUNT
	DEFB	200		;CYLINDER COUNT
	DEFB	34		;SECTORS/TRACK
	DEFB	34		;DIRECTORY LENGTH
	DEFB	0		;DIRECTORY LOCATION
	DEFB	17		;SECTORS/GRAN
	DEFB	8		;GRANULES/CYLINDER
	DEFW	136		;SECTORS/CYLINDER
;
;	RIGID DCT-5 DEFAULT
;
DCT5	DEFB	48H		;DCT,NIL
	DEFW	FHCODE		;DRIVER ADDRESS
	DEFW	0		;LINKING DCT
	DEFB	21H		;FLAGS,HD,NO LOG
	DEFB	07H		;STEP RATE
	DEFB	0		;HEAD OFFSET
	DEFW	0		;CYL OFFSET
	DEFB	0		;SECTOR OFFSET
	DEFB	0		;HEAD LOCATION
	DEFB	1		;BINARY DRIVE
;
	DEFB	0		;FLAGS
	DEFB	4		;SURFACE COUNT
	DEFB	200		;CYLINDER COUNT
	DEFB	34		;SECTORS/TRACK
	DEFB	34		;DIRECTORY LENGTH
	DEFB	0		;DIRECTORY LOCATION
	DEFB	17		;SECTORS/GRAN
	DEFB	8		;GRANULES/CYLINDER
	DEFW	136		;SECTORS/CYLINDER
;
*EJECT
;	RIGID DCT-6 DEFAULT
;
DCT6	DEFB	48H		;DCT,NIL
	DEFW	FHCODE		;DRIVER ADDRESS
	DEFW	0		;LINKING DCT
	DEFB	21H		;FLAGS,HD,NO LOG
	DEFB	07H		;STEP RATE
	DEFB	0		;HEAD OFFSET
	DEFW	0		;CYL OFFSET
	DEFB	0		;SECTOR OFFSET
	DEFB	0		;HEAD LOCATION
	DEFB	2		;BINARY DRIVE
;
	DEFB	0		;FLAGS
	DEFB	4		;SURFACE COUNT
	DEFB	200		;CYLINDER COUNT
	DEFB	34		;SECTORS/TRACK
	DEFB	34		;DIRECTORY LENGTH
	DEFB	0		;DIRECTORY LOCATION
	DEFB	17		;SECTORS/GRAN
	DEFB	8		;GRANULES/CYLINDER
	DEFW	136		;SECTORS/CYLINDER
;
;	RIGID DCT-7 DEFAULT
;
DCT7	DEFB	48H		;DCT,NIL
	DEFW	FHCODE		;DRIVER ADDRESS
	DEFW	0		;LINKING DCT
	DEFB	21H		;FLAGS,HD,NO LOG
	DEFB	07H		;STEP RATE
	DEFB	0		;HEAD OFFSET
	DEFW	0		;CYL OFFSET
	DEFB	0		;SECTOR OFFSET
	DEFB	0		;HEAD LOCATION
	DEFB	3		;BINARY DRIVE
;
	DEFB	0		;FLAGS
	DEFB	4		;SURFACE COUNT
	DEFB	200		;CYLINDER COUNT
	DEFB	34		;SECTORS/TRACK
	DEFB	34		;DIRECTORY LENGTH
	DEFB	0		;DIRECTORY LOCATION
	DEFB	17		;SECTORS/GRAN
	DEFB	8		;GRANULES/CYLINDER
	DEFW	136		;SECTORS/CYLINDER
;
*EJECT
;	EXECUTE SUPERVISOR CALL
;
EXSVC	ADD	A,A		;DOUBLE FOR TABLE
	JR	NC,SVCOK	;OK (0-127)
SVBAD	LD	A,1		;BAD SVC
	OR	A		;NZ STATUS
	RET
;
SVCOK	PUSH	HL		;SAVE
	LD	L,A
	LD	H,PAGE2<-8	;HL => ENTRY
	LD	A,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,A		;HL => ROUTINE
	EX	(SP),HL 	;RESTORE
	RET			;GO!
;
;	LOCATE DRIVE CTL TABLE
;
;	ENT	 C =	DRIVE NUMBER
;
;	EXT	 IY =>	DRIVE CTL TABLE
;
LOCDCT	PUSH	HL		;SAVE
	LD	A,C		;GET DRIVE
	ADD	A,8		;CORRECT
	CALL	LOCTBL		;LOCATE DCT
	PUSH	HL
	POP	IY		;IY => DCT
	POP	HL		;RESTORE
	RET
;
;	LOCATE DEVICE CTL TABLE
;
;	ENT	 A =	DEVICE NUMBER
;
;	EXT	IX =>	DEVICE CTL TABLE
;
LOCDCB	PUSH	HL		;SAVE
	CALL	LOCTBL		;LOCATE DCB
	PUSH	HL
	POP	IX		;IX => DCB
	POP	HL		;RESTORE
	RET
;
;	LOCATE DCT/DCB TABLES
;
LOCTBL	LD	H,PAGE1<-8	;H = MSB
	ADD	A,A		;* 2
	ADD	A,A		;* 4
	LD	L,A		;HL => ENTRY
	LD	A,(HL)		;A = LSB DCT
	INC	HL
	LD	H,(HL)		;H = MSB DCT
	LD	L,A		;HL => DCT
	RET
;
*EJECT
;	GENERAL PURPOSE REGISTER SAVE
;
REGSAV	EX	AF,AF'          ;SAVE AF
	POP	AF		;GET CALLER
	PUSH	IY		;SAVE REGISTERS
	PUSH	IX
	PUSH	HL
	PUSH	DE
	PUSH	BC
;
	PUSH	HL		;TO STACK
	LD	HL,REGSV1	;UNSTACKER
	EX	(SP),HL 	;TO RET ADD
	PUSH	AF		;CALLER TO STACK
	EX	AF,AF'          ;RESTORE AF
	RET
;
REGSV1	POP	BC		;RESTORE REG
	POP	DE
	POP	HL
	POP	IX
	POP	IY
	RET
;
*INCL	RTC			;RTC SERVICES
*INCL	DOS3A			;KEYBOARD DRIVER
*INCL	DOS3B			;PRINTER DRIVER
*INCL	DOS3D			;RS232 DRIVERS
*INCL	DISP2			;DISPLAY DRIVERS
*INCL	DISKIO2 		;DISK I/O MANAGER
*INCL	DOS5			;SYSTEM ROUTINES
*INCL	DOSMISC 		;MISC ROUTINES
*INCL	OVERLAY 		;OVERLAY LOADER
*INCL	FILE2			;FILE I/O MANAGEMENT
*INCL	GETPDA			;GRANULE MANAGEMENT
*INCL	INIT			;COLD INIT ROUTINES
;
	END	START
 