
	.Z80
;
;	MESSAGES
;
MSG1:	DEFB	CR,LF,BELL
	DEFB	'Bios Error: Boot Failure -- Hit any key to retry.'
	DEFB	CR,LF,0
;
;
MSG3:	DEFB	CR,LF
M21A:	DEFB	'Bios '
	DEFB	0
;
VTAB:	DEFB	' Error on '
VDRV:	DEFS	1
	DEFB	':'
	DEFB	CR,LF
	DEFB	'Track = '
VTRK:	DEFB	'999'
	DEFB	', Sector = '
VSEC:	DEFB	'99'
	DEFB	CR,LF
	DEFB	0
;
MSG5:	DEFB	'FDC status = '
FSCODE:	DEFS	2
	DEFB	'H'
CRLF:	DEFB	CR,LF
	DEFB	0
;		
;
MSGRC:	DEFB	'Read'
	DEFB	0
;
MSGWC:	DEFB	'Write'
	DEFB	0
;
MSGSC:	DEFB	'Restore'
	DEFB	0
;
MSGUC:	DEFB	'Unknown'
	DEFB	0
;
; 	DOOR MESSAGE TABLE
;
RDYMSG:	DEFB	CR,LF
	DEFM	'Check the disk in drive "'
VDRIVE:	DEFS	1
	DEFM	'", and close the door.'
	DEFB	CR,LF
	DEFB	0
;
	IF	TPCI
DRMSG:	DEFB	CR,LF,CR,LF
	DEFM	'Insert diskette '
	DEFB	'for drive '
DISKET:	DEFS	1
	DEFB	':  Press any key when ready.'
	DEFB	0
	ENDIF
;
	IF	USRCPM
;*
;*	M M M O S T   2 . 0
;*
;
; 	USER PROCESSOR ERROR AND SIGN ON MESSAGES
;
M11:	DB   	'BDOS ERR ON ',0
M11TAB:	DW   	M11A		;TABLE OF PSUEDO BDOS ERROR ADDRESSES
	DW	M11A
	DW   	M11B
	DW   	M11C
M11A:	DB   	': BAD SECTOR',0
M11B:	DB   	': FILE/DRIVE  R/O',0
M11C:	DB   	': SELECT',0
;
M22ATAB:DW	MSGRC		;TABLE OF BIOS ERROR CAUSES
	DW	MSGWC
	DW	M22AC
;
M22AC:	DB	'SELECT',0
M23A:	DB	' ERROR ON DRV=',0
M24A:	DB 	'; TRK=',0
M25A:	DB	'; SCTR=',0
M26A:	DB	'; WRT TYPE=',0
M27AB:	DB	'; RTN CODE=',0
;
M21B:	DB	'BDOS ERROR ON FUNC=',0
M22B:	DB	'; DRV=',0
M23B:	DB	'; FILE=',0
;
M3TAB:	DW	M3A
	DW	M3B
	DW	M3C
	DW	M3D
	DW	M3E
	DW	M3F
	DW	M3G
	DW	M3H
	DW	M3I		;CNGSEQ#1
;
M3A:	DB	'COMMAND FAULT ERROR',0
M3B:	DB	'WRITE PROTECT ERROR',0
M3C:	DB	'ILLEGAL FUNCTION CALL',0
M3D:	DB	'FILE STATUS INCONSISTENT WITH FUNCTION',0
M3E:	DB	'DRIVE TYPE ERROR',0
M3F:	DB	'TRANSFER OUT ERROR',0
M3G:	DB	'TRANSFER IN ERROR',0
M3H:	DB	'GENREV NO. INCONSISTENT WITH DPCPARMS.DAT. '
	DB	'TO CORRECT, RERUN CNFGUSER.',0
M3I:	DB	'NO SPACE',0	;CNGSEQ#1
;
;
;	BIOS/BDOS ACTIVITY TABLE, ONE BYTE PER FUNCTION WITH MEANINGS
; 	BIT0=1 PASS FUNC. TO MMMOST=0 PASS TO LOCAL BDOS
; 	BIT1=1 FILE CLOSED PRIOR TO CALL, =0 FILE OPEN PRIOR TO CALL
; 	BIT2=1 SEND 128 BYTES DATA AFTER REQ. BLK (WRITE), =0 DON'T SEND
; 	BIT3=1 READ 128 BYTES DATA AFTER FCB BLK READ (READ), =0 DON'T
; 	BIT4=1 ADD FILE TO OPEN LIST, =0 DON'T CHANGE OPEN STATUS
; 	BIT5=1 DELETE FILE FROM OPEN LIST, =0 DON'T DELETE
; 	BIT6=1 ERROR RETURN ~=00, =0 ERROR ON FF ONLY
; 	BIT7=1 DON'T CARE ON OPEN/CLOSE STATUS, =0 THEN CARE
;
BDOSTAB	EQU	$
FUN014:	DB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
FUN15:	DB	10010011B	;OPEN FUNCTION
FUN16:	DB	00100001B	;CLOSE FUNCTION
FUN17:	DB	00000001B	;SEARCH FIRST
FUN18:	DB	0
FUN19:	DB	10000011B	;DELETE
FUN20:	DB	01001001B	;READ SEQ.
FUN21:	DB	01000101B	;WRITE SEQ.
FUN22:	DB	00010011B	;MAKE
FUN23:	DB	10000011B	;RENAME
FUN2429:DB	0,0,0,0,0,0
FUN30:	DB	00000011B	;SET FILE ATTRIBUTES
FUN3132:DB	0,0
FUN33:	DB	01001001B	;READ RANDOM
FUN34:	DB	01000101B	;WRITE RANDOM
FUN35:	DB	10000001B	;COMPUTE FILE SIZE
FUN36:	DB	00000001B	;SET RANDOM RECORD
FUN3739:DB	0,0,0
FUN40:	DB	01000101B	;WRITE RANDOM, ZERO FILL
;
REALDOS:DS	2		;ADDRESS OF LOCAL BDOS ENTRY
FCBA:	DS	2		;FCB ADDRESS PASSED
CURFNCA:DS	1		;CURRENT ACTIVITY BYTE
;
BDRQBLK:DB	1		;START OF REQUEST (SOR)
	DB	'F'		;BDOS FUNCTION REQUEST CODE
LOGDRV:	DS	1		;LOGGED IN DRIVE FOR THIS CALL
BDOSFUN:DS	1		;CURRENT BDOS FUNCTION
USERCOD:DS	1		;USER CODE FOR CURRENT CALL
FILEN1:	DS	2		;FILE NUMBER INVOLVED IN CALL
;
CURBDSK:DS	1		;DRIVE OF FILE CURRENTLY BEING ACCESSED
CURBFNC:DS	1		;CURRENT BDOS FUNCTION
RETBUF	EQU	$
FILENO:	DS	2		;FILE NUMBER ASSIGNED
RTNCODE:DS	1		;RETURN CODE FROM BDOS
PRNTRTN:DS	1		;PRINT CONTROL RETURN BYTE
;
FILINDX:DS	2		;ADDRESS IN FILETAB OF CURRENT FILE
FILETAB:DS	TABLEN*14+1	;PLUS ONE FOR END OF TABLE FLAG
USTACK:	DS	2		;TEMPORARY STOARAGE OF USER'S SP
LCLSTCK:DS	20H		;LOCAL STACK
TOS	EQU	$
;
LRQBLK:	DB	SOR
LRQCOD:	DS	1
	DS	2
LBLNG:	DS	2
	DS	2
LSELCT:	DS	1
	DS	1
;*
;* 	END MMMOST 2.0
;*
;
SELDRV:	DB	0		;SELECTED DRIVER		MMMOST2.0
IRQBLK:	DB	SOR
IRQCOD:	DS	1
NODISK:	DS	1
TRK:	DS	1		;*** NOTE: DO NOT CHANGE 
SECT:	DS	2		;THE ORDER OF THESE BYTES ***
TRK16:	DS	2
	ENDIF
WRTYPE:	DS	1		;BDOS WRITE TYPE
	IF	USRCPM
SELFLG:	DS	1
ICKSUM:	DS	1
;
STABUF:	DS	4
SAVDPH:	DS	2
SAVBUF:	DS	1
ECOUNT: DS	1		;ERROR RETRY COUNTER
;
TEMP:	DS	1		;TEMPORARY STORAGE.
LBTIME:	DW	0		;				MMMOST2.0
FORCEF:	DB	0		;				MMMOST2.0
LBCNT:	DB	0		;LIST BUFFER CHAR COUNT
LBUFF:	DS	128		;LIST BUFFER
LFLCNT:	DW	0		;LIST FLUSH COUNTER
STATIC:	DB	0		;STATIC MEMORY FLAG(0-STATIC MEMORY EXISTS,
	                        ;                   TS-800)
	ENDIF
;
;       ********************************************** 
;	     CP/M LOGICAL DISKS TRANSLATE TABLE
; 	LOGICAL DISK # A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P
;       **********************************************
;
	IF	STDCPM
DISKTAB:
	DEFB	0,1
CTLTAB:	DEFB	2,2
	ENDIF
;
	IF	USRCPM
LDSKTB:	DEFB	0		;DRIVE 'M' TO DRIVE #0
	DEFB	0		;OF FLOPPY DISK
	IF	TS800 OR TS803 OR TPCI
	DEFB	1		;DRIVE 'N' TO DRIVE #1
	DEFB	0		;OF FLOPPY DISK
	ENDIF
	IF	TS803H
	DEFB	3		;DRIVE 'N' TO DRIVE #2
	DEFB	1		;OF HARD DISK
	DEFB	2		;DRIVE 'O' TO DRIVE #1
	DEFB	1		;OF HARD DISK
	DEFB	1		;DRIVE 'P' TO DRIVE #0
	DEFB	1		;OF HARD DISK
	ENDIF
;
REALDSK: DEFB	0		;REAL DISK NUMBER
	ENDIF		
;
	IF	TS803H	
;
;	Warm boot control flag is passed by 'BOOT' module
;	  = 0 if system cold boot from winchester drive
;	  = 1 if system cold boot from floppy drive.
;
WBFLAG:	DEFB	0
	ENDIF
;
NODRV:	DEFS	1		; STORAGE FOR # OF DRIVE FOR TELETOTE I
CURDRV:	DEFS	1		; CURRENT DRIVE SELECTED FOR TELETOTE I
CWFLAG:	DEFB	0		; COLD/WARMBOOT FLAG
;
SPTCPM:	DEFB	48H		; CP/M SECTOR PER TRACK
;
;	Storage for time and date
;
CLOCK:	DEFB	0		; 1/100 SEC COUNTER(BCD) 0 TO 59
SECOND:	DEFB	0		; SECOND (BCD) 0 TO 59
MINUTE:	DEFB	0		; MINUTE (BCD) 0 TO 59
HOUR:	DEFB	0		; HOUR   (BCD) 0 TO 23
DATE:	DEFB	1		; DATE   (BCD) 1 TO 31
MONTH:	DEFB	1		; MONTH  (BCD) 1 TO 12
YEAR:	DEFB	0		; YEAR   (BCD) 0 TO 99 LSB
	DEFB	0		; YEAR   (BCD) 0 TO 99 MSB
;
TINITF:	DEFB	1		; DATE AND TIME INITIALIZE FLAG
FDTIME:	DEFB	FDTOUT		; FLOP DISK TIMER(0=DISABLE MOTOR TIMEOUT)
FDMOT:	DEFB	0		; MOTOR ON/OFF FLAG (1=ON, 0=OFF)
;
;	Timer stack area 
;
;	DEFS	14
;LSTACK:	DEFS	2
;TUSTACK:
;	DEFS	2		; USER STACK
;
;	**********************
;	** DISK DEFINITIONS **
;	**********************
;
;	DISK PARAMETER HEADER
;
DPBH:
;
;	FLOPPY DISK 0 PARAMETER HEADER
;
DPFLP0:	DEFW	0
	DEFW	0
	DEFW	0
	DEFW	0
	IF	STDCPM
	DEFW	DIRBFR
	ENDIF
	IF	USRCPM	
DPF1:	DS	2
	ENDIF
	DEFW	DPRMB0
	DEFW	CHKSV0
	DEFW	ALOCV0
;
; 	FLOPPY DISK 1 PARAMETER HEADER
;
DPFLP1:	DEFW	0		; ADDR. OF SECTOR TRANSLATE TABLE FOR DISK 1
	DEFW	0		; BDOS SCRATCH WORDS
	DEFW	0		; THREE OF THEM
	DEFW	0
	IF	STDCPM
	DEFW	DIRBFR		; ADDR. OF DIRECTORY BUFFER FOR DISK 
	ENDIF
	IF	USRCPM
DPF2:	DS	2
	ENDIF
	DEFW	DPRMB1		; ADDR. OF DISK PARAMETER BLOCK 1
	DEFW	CHKSV1		; ADDR. OF CHECK SCRATCHPAD
	DEFW	ALOCV1		; ADDR. OF DISK ALLOCATION SCRATCHPAD
;
;       ********************
;	DISK PARAMETER BLOCK
;	********************
;
DPRMB0:
DPRMB1:
	DEFW	FSPT0
	DEFB	FBSH0
	DEFB	FBLM0
	DEFB	FEXM0
	DEFW	FDSM0
	DEFW	FDRM0
	DEFB	FALL0
	DEFB	FALH0
	DEFW	FCKS0
	DEFW	FOFF0
;
;	PROGRAM STORAGE
;
SECNT:	DEFS	1		; SECTOR COUNT (FOR WARMBOOT)
;
; 	TEMPORARY STORAGES FOR REGISTERS
;
TEMPBC:	DEFW	0
TEMPDE:	DEFW	0
TEMPHL:	DEFW	0
;
JMPSW:	DEFB	0		; FLAG FOR DOOR MESSAGE PRINT
;
;	*** DATA FOR FLOPPY DISK I/O MODULE ***
;
; 	DISK I/O COMMAND PARAMETERS
;
DRIVE:	DEFS	1		; CURRENTLY SELECTED DRIVE
COMAND:	DEFS	1		; CURRENT COMMAND
DSELCMD:
	DEFS	1		; DRIVE CONFIGURE
TSEC:	DEFS	1		; TEMP. READ/WRITE SECTOR VARIABLE.
FRETRY:	DEFS	1		; RETRY COUNT
UNMSTA:	DEFS	1		; UNMASKED VERSION OF ABOVE
;
;	UNITIALIZED RAM DATA AREAS
;
SECPTRK:
	DEFS	1		; SECTOR PER TRACK 
SECBLK:	DEFS	1		; SECTOR BLOCKING
SEKDSK:	DEFS	1		; SEEK DISK NUMBER
SEKTRK:	DEFS	2		; SEEK TRACK NUMBER
SEKSEC:	DEFS	1		; SEEK SECTOR NUMBER
;
HSTDSK: DEFS	1		; HOST DISK NUMBER
HSTTRK:	DEFS	2		; HOST TRACK NUMBER
HSTSEC:	DEFS	1		; HOST SECTOR NUMBER
;
SEKHST:	DEFS	1		; SEEK HOST SECTOR NUMBER
HSTACT:	DEFS	1		; HOST ACTIVE FLAG
HSTWRT:	DEFS	1		; HOST BUFFER WRITE PENDING FLAG
;
UNACNT:	DEFS	1		; UNALLOCATION SECTOR COUNT
UNADSK:	DEFS	1		; LAST UNALLOC DISK
UNATRK: DEFS	2		; LAST UNALLOC TRACK
UNASEC:	DEFS	1		; LAST UNALOCA SECTOR
;
ERFLAG:	DEFS	1		; ERROR REPORTING
RSFLAG:	DEFS	1		; PRE-READ SECTOR FLAG
READOP:	DEFS	1		; 0 IF WRITE OPERATION; 1 IF READ OPER.
DMAADR:	DEFS	2		; LAST DMA ADDRESS
LOGDSKN:
	DEFB	0		; 0/1 = LOGICAL DISK SELECT #0/#1	
;
;
;	             CONSOLE BUFFER
;	first 2 bytes are used as beg and end of buffer
;	and rest of 64 bytes are actual buffer
;
;CONBUF:	DEFS	66
BUFSIZ	EQU	64		; ACTUAL BUFFER SIZE
;
;
HSTBUF	EQU	$		; HOST BUFFER(OVERLAYED)
;
;	256-BYTE PARAMETER ARRAY AREA
;
PARMAR	EQU	HSTBUF+HSTSIZ	; ENTRY POINT AT 0FF00H
;
;	FLOPPY DISK DRIVE 0 STORAGE AREA
;
ALOCV0	EQU	PARMAR+256		; ALLOCATION VECTOR STORAGE
CHKSV0	EQU	ALOCV0+(FDSM0/8)+1	;CHECK VECTOR STORAGE

ALOCV1	EQU	CHKSV0+FCKS0	    ;ALLOCATION VECTOR STORAGE
CHKSV1	EQU	ALOCV1+(FDSM1/8)+1  ;CHECK VECTOR STORAGE
CONBUF	EQU	CHKSV1+FCKS1	    ;CONSOLE BUFFER STORAGE
LSTACK  EQU	CONBUF+86	    ;STORAGE FOR TIMER STACK 
TUSTACK EQU	LSTACK+2
MRX_BUFF   EQU	TUSTACK+2		;MODEM RECEIVER BUFFER STORAGE
MOUSTK     EQU	MRX_BUFF+144		;STORAGE FOR MOUSE STACK
	IF	STDCPM
DIRBFR	EQU	MOUSTK+2		;IF STDCPM SAVE 128 BYTE OF
IMAGEND	EQU	DIRBFR+128		;DIRECTORY BUFFER
	ENDIF
	IF	USRCPM			;IF USRCPM SHARE DIRECTRY BUFFER 
IMAGEND	EQU	MOUSTK+2		;WHICH WAS CREATED BY EXTERNAL DRIVES.
	ENDIF
;
;******************************************************************
;*               Boot is the cold boot loader.			  *
;*  All of CP/M has been loaded in when control is passed here.	  *
;*  Warning: 256 bytes of local storage are reserved from 0ff00h  *
;*           to 0ffffh for alpha and graphic drivers in page 0.   *
;*           Last address of bios must be less than 0ff00h.       *  
;******************************************************************
;
OVERLAY:			; Beginning of overlay area(max 256 bytes)
BOOT:	DI
	LD	SP,TPA		; Set up stack
;
	LD	A,(IODEF)	; Initialize CP/M iobyte
	LD	(IOBYTE),A	; Set iobyte
;
;	System Interrupt Vector Mode 2
;
	LD	HL,INTVEC
	LD	A,H
	LD	I,A
	IM	2
;
	IF	USRCPM
	LD	BC,6
	LD	DE,SMSG1	; DEFAULT SYSTEM TYPE MESSAGE(TS-803)
	IN	A,(IDSWITCH)
	BIT	3,A
	JR	NZ,HWINIT	; TS-803H
	BIT	5,A
	JR	Z,HWINIT	; TS-803
	LD	HL,SMSG3
	LDIR
	ENDIF
;
HWINIT:	
;
;	Get the baud rate for printer and modem from 
;	dip switch or user through the setup program.
;	Default baudrate for both of printer and modem
;	is 9600.
;
	LD	A,(PBAUD)	; GET PRINTER BAUD RATE FROM SYSTEXT
	OR	A		; USER REQUEST BAUDRATE?
	JR	NZ,PRNBDR	; YES
	CALL	GETDSW		; NO, GET IT FROM DIP SWITCH
PRNBDR:	LD	D,A		; D = PRINTER BAUD RATE CONSTANT
	LD	A,(MBAUD)	; GET MODEM BAUDRATE FROM SYSTEXT
	OR	A		; USER REQUEST BAUD RATE?
	JR	NZ,MODBDR	; YES
	CALL	GETDSW		; NO, GET IT FROM DIP SWITCH
MODBDR:	LD	E,A		; E = MODEM BAUD RATE CONSTANT
;
;	Initialize STI
;
	LD	A,6		; POINTER FOR DDR
	OUT	(PVR),A
	LD	A,00100100B	; DDR, DEFINE I/O PIN DIRECTION(0=IN, 1=OUT)
	OUT	(DDR),A
	LD	A,00000000B	; INITIAL HAND-SHAKE LINES
	OUT	(GPIP),A	; CHECK CTS BY I1
;
;	Initialize timer A,B,C and D
;
	LD	A,7		; POINTER FOR TIMERS C & D
	OUT	(PVR),A
	LD	A,10001000B	; RESET CHANNEL A & B 
	OUT	(TCDCR),A	; TCDCR: CONTROL REG FOR TIMER C & D
	LD	A,00000000B	; STOP TIMER A & B 
	OUT	(TABCR),A	; TABCR: CONTROL REG FOR TIMER A & B
;
	LD	A,D		; GET TIME CONSTANT FOR PRINTER PORT
	OUT	(PRTSTI),A	; INITIALIZE PRINTER BAUDRATE TO STI CHANNEL B
	LD	A,E             ; GET TIME CONSTANT FOR MODEM PORT
	OUT	(MODSTI),A	; INITIALIZE MODEM BAUD RATE TO STI CHANNEL A
	LD	A,00010001B	; TIMER A & B CONTROL WORD
	OUT	(TABCR),A
;
;	Initialize UART
;
	LD	A,(UARTCW)	; GET UART CONTROL WORD
	OUT	(MODMCP),A
	LD	A,00000001B	; RSR, ENABLE RECEIVER
	OUT	(MODRSR),A
	LD	A,00000101B	; TSR, ENABLE TRANSMITTER
	OUT	(MODTSR),A	
;
;	Initialize DART
;
	LD	HL,PRNTAB	; DART channel B for printer port
	CALL	PRTINI
	LD	HL,KBDTAB	; DART channel A for keyboard port
	CALL	PRTINI
;
	LD	HL,PARMAR	; Get Parameter Array Area entry point
	LD	(0FF00H),HL	; Set entry point at 0FF00H
;
;	Alpha driver and Printer buffer initialization
;
	LD	IX,0
	ADD	IX,SP		; Save old stack pointer
	LD	SP,LOCSTK	; Set new local stack pointer
	LD	HL,0
	LD	A,0		; Switch to memory bank 0
	OUT	(BANKSW),A
	LD	(INPUTOFF),HL	; Clear input offset of printer buffer
	LD	(OUTPUTOFF),HL	; Clear output offset of printer buffer
	PUSH	IX		; Save register
	CALL	ALINIT		; Call alpha driver initialization
	POP	IX		; Restore register
	LD	A,1		; Switch to memory bank 1
	OUT	(BANKSW),A
	LD	SP,IX		; Restore old stack pointer
;
	IF	TPCI
	LD	A,RSTOBE	; Initialize print control port
	OUT	(PARALCP),A
        XOR     A               ; TURN OFF HARDWARE MOUSE CURSOR
        OUT     (0CEH),A
        LD      (KYSTAT),A      ; INITIALIZE KEY STATUS AND KEY RELEASE
        LD      (KEYREL),A      ; BYTES
	LD	(KEYCLK),A	; SET KEYCLICK ON
	ENDIF
;
;	Clear out Keyboard Buffer
;
	CALL	FLSHKB
;	 			
	IF	TPCI
	LD	A,1			; Set number of drive to two drive
	LD	(NODRV),A		; system.
	LD	A,11010101B		; Select drive "B" 
	OUT	(DSELOP),A		; to check if it is single drive
	LD	A,00001000B		; system
	OUT	(FDCCMD),A
	LD	A,150			; Delay about 30usec
DELAY2:	DEC	A		
	JR	NZ,DELAY2	
DELAY3:	IN	A,(FDCCMD)		; Restore command accomplished?
	BIT	0,A			;
	JR	NZ,DELAY3		; 
	BIT	2,A			; If so, print two drive message,
	JR	NZ,TWODR
	XOR	A			; If not, set number of drive to one.
	LD	(NODRV),A		; Set current drive to "A"
	LD	(CURDRV),A
	IF	STDCPM
	LD	BC,15			; Select proper message for single
	LD	DE,MS1DR		; drive system
	LD	HL,MS2DR
	LDIR
	ENDIF
	ENDIF
;
TWODR:	
	IF	STDCPM
	LD	HL,SIGNON		; Prep for sending signon message
	CALL	PRNT			; Send the promt
	ENDIF
;
;	Floppy disk initialization 
;
	XOR	A		; Make logged drive zero
	LD	(HSTACT),A	; Reset disk buffer active flag
	LD	(HSTWRT),A	; Reset write pending data in buffer
	LD	(SECNT),A	; Reset sector counter
;
	IF	STDCPM
	LD	(DRIVE),A
	ENDIF
;
	IF	USRCPM
	DEC	A		
	LD	(DRIVE),A
	ENDIF
;
	LD	A,11100101B	; Set drive select configure
	LD	(DSELCMD),A	; Select drive 0, Dden, side 1 and motor on
	OUT	(DSELOP),A
	LD	A,RESCMD	; Restore head to track #0
	OUT	(FDCCMD),A
;
;	AUTOLOAD FILE AT COLDBOOT TIME
;
	LD	DE,COLDBEG
	LD	HL,COLDEND
	CALL	AUTOSETUP
;		
	XOR	A
	LD	(CWFLAG),A	; Reset Cold/Warm boot Flag
	LD	(CDISK),A	; Load Default Drive as 0
	LD	(ESCFLAG),A	; Reset esc flag for printer function
	LD	(XONXOFF),A	; Reset xonxoff flag
	INC	A
	LD	(P_EMPTY),A	; SET PRINTER BUFFER EMPTY
;
	IF	USRCPM
	LD	HL,(DPBASE+8)	;STORE DIRBUFF ADDRESS OF EXTERNAL SYSTEM
	LD	(DPF1),HL	;TO LOCAL SYSTEM DIRBUFF TO SHARE THE
	LD	(DPF2),HL	;DIRECTORY BUFFER AREA
	LD	(NODISK),A
	CALL	BDOSSET		;SET UP BDOS INTERCEPT IN BIOS	MMMOST2.0
	LD	A,(BIOS)
	RES	7,A		;CLEAR HIGH BIT OF THIS LOCATION
	LD	(BIOS),A	;INDICATE THIS IS MULTIUSER BIOS
.8080
	IN    	KBDDP		;CLEAR KEYBOARD
	LXI  	H,SMSG		;PRINT OPENING MESSAGE.
	CALL 	PRNT
;*
;*	MMMOST 2.0
;*
	MVI	A,COMCD		;REQUEST USER STATUS		MMMOST2.0
	STA	IRQCOD		;				MMMOST2.0
	MVI	A,'P'		;PRINT SPOOL DRIVE
	STA	TRK
	MVI	B,10
	LXI	H,IRQBLK
	CALL	PNXO
	MVI	B,128
	CALL	PNXO
	MVI	B,4
	LXI	H,STABUF

	CALL	PNXI
	LDA	STABUF
	STA	SPLDRV
	MVI	A,'S'		;WHICH IS DIRECT COMMAND	MMMOST2.0
	STA	TRK		;				MMMOST2.0
	MVI	B,10		;				MMMOST2.0
	LXI	H,IRQBLK        ;                               MMMOST2.0
	CALL	PNXO            ;                               MMMOST2.0
	MVI	B,128	;SEND DUMMY COMMAND RECORD              MMMOST2.0
	CALL	PNXO		;				MMMOST2.0
	MVI	B,4	;GET STATUS BACK			MMMOST2.0
	LXI	H,STABUF	;				MMMOST2.0
	CALL	PNXI		;				MMMOST2.0
	LDA	STABUF		;IF BIT 6 OF STABUF = 1
	ANI	40H		;THEN AUTOLOAD IS ENABLED
	JNZ	NPRCID
;
	XRA	A		;ELSE CLEAR COUNT OF CONSOLE
	STA	AUTOFLG		;INPUT BUFFER
NPRCID:	LDA	STABUF	;PRINT PROCESSOR ID IN SIGN ON MESSAGE	MMMOST2.0
	ANI	0FH	;ID = LS NYBBLE OF RETURN		MMMOST2.0
	STA	PROCID	;SET PROCESSOR ID		        MMMOST2.1
	INR	A	;CONVERT FROM REL. 0 TO REL. 1		MMMOST2.0
	CPI	0AH	;CONVERT TO BCD				MMMOST2.0
	JC	OKDIG		;				MMMOST2.0
	ADI	6	;CONVERT 0A-0F TO 10 TO 15		MMMOST2.0
OKDIG:	CALL	PBYTE	;CALL ROUTINE TO PRINT ACCUMULATOR	MMMOST2.0
	LXI	H,SMSG2	;PRINT ' <=> '
	CALL	PRNT
	LDA	STABUF		;PRINT PROCESSOR ID A-P
	ANI	0FH
	ADI	41H
	MOV	C,A
	CALL	CONOUT
	CALL	PCRLF		;PRINT CARRIAGE RETURN, LINE FEED
	MVI	A,'R'		;GET CURRENT GENREV NUMBER FROM MMMOST
	STA	TRK
	MVI	B,10		;MAKE REQUEST FOR GENREV
	LXI	H,IRQBLK
	CALL	PNXO
	MVI	B,128		;DUMMY DIRECT COMMAND BUFFER
	CALL	PNXO
	MVI	B,4		;READ IN GENREV NUMBER
	LXI	H,STABUF
	CALL	PNXI
	LDA	STABUF		;GET CURRENT GENREV
	LXI	H,GENREV
	CMP	M		;COMPARE CURRENT TO GENREV STORED AT LAST
	JZ	FUNKEY		;RUN OF CNFGUSER
	CALL	PCRLF		;PRINT CARRIAGE RETURN LINE FEED
	MVI	B,8		;PRINT ERROR MESSAGE IF NO MATCH
	CALL	PRNTERR
DIE:	JMP	DIE		;THEN HANG
	ENDIF
.Z80
;	
;	STORE DEFAULT FUNCTION KEY
;
FUNKEY:	LD	D,32		; SET FUNCTION KEY COUNTER
	LD	HL,DFKTAB	; GET DEFAULT FUNCTION KEY TABLE POINTER
LDDFKY:	LD	C,1BH		; ESC KEY
	CALL	STODFK
	LD	C,7CH		; | KEY
	CALL	STODFK
	LD	E,4		; SET TABLE ACCESS BYTE COUNTER
LUPDFK:	LD	A,(HL)		; GET BYTE VALUE
	LD	C,A
	CALL	STODFK
	DEC	E		; DECREMENT BYTE COUNTER
	INC	HL		; INCREMENT BYTE ADDRESS
	JR	NZ,LUPDFK
	LD	C,0DH		; CR KEY
	CALL	STODFK
	LD	C,19H		; ^Y KEY
	CALL	STODFK
	DEC	D		; DECREMENT LOOP COUNTER
	JR	NZ,LDDFKY
;
; 	Initialization for TIMER D to "Delay Mode/64 Prescale"
;       and time constant to be 192 for "Time and Date" routine
;
TIMER:	LD	A,00011000B	; UNMASK RCV/ERROR INTERRUPT
	OUT	(IMRA),A
	LD	A,00010000B	; UNMASK TIMER D INTERRUPT
	OUT	(IMRB),A
	LD	A,1		; POINTER FOR TDDR
	OUT	(PVR),A
	LD	A,192		; TIME CONSTANT FOR TIMER D
	OUT	(TDDR),A
	LD	A,7		; POINTER FOR TCDCR
	OUT	(PVR),A		; POINTER FOR TCDCR AND INITIALIZE INTERRUPT
			        ; VECTOR
	LD	A,00000101B	; DELAY MODE/64
	OUT	(TCDCR),A
;
	LD	A,5		; POINTER FOR IERA
	OUT	(PVR),A
	LD	A,00011000B	; ENABLE RCV_BUFF_FULL AND RCV_ERR INTERRUPTS
	OUT	(IERA),A
	LD	A,STIIVL+4	; SET LOW BYTE OF STI INTERRUPT VECTOR
	OUT	(PVR),A
	LD	A,00010000B	; ENABLE TIMER D INTERRUPT
	OUT	(IERB),A
;
	LD	A,0FFH
	OUT	(LED12),A	; Turn off all led
	OUT	(LED34),A
;
;	INITIALIZE MOUSE FUNCTION VARIABLES
;
	LD	B,13		; 
	LD	HL,MSCSTS-1	; POINT HL TO BEGINING OF VARIABLE
CLEAR:	INC	HL		; 
	LD	(HL),0		; INITIALIZE VARIABLES
	DJNZ	CLEAR
	LD	B,3
	LD	A,32
SETCL:	INC	HL
	LD	(HL),A
	INC	A
	DJNZ	SETCL
	INC	HL
	LD	(HL),5
;
	JP	GOCPM
;
STODFK:	PUSH	HL		; SAVE REGISTERS
	PUSH	DE
	CALL	CONOUT
	POP	DE		; RESTORE REGISTERS
	POP	HL
	RET
;
;	Read dip switch to get baudrate for printer and modem
;
GETDSW:	IN	A,(IDSWITCH)	; NO, READ DIP SWITCH
	AND	07H		; GET BAUDRATE BITS
	LD	B,A		
	LD	A,1
	RET	Z		; 9600 BAUD
LSHIFT:	SLA	A
	DJNZ	LSHIFT
	RET
;
;	**************************************
;       Signon message output during cold boot			
;       **************************************
;
	IF	STDCPM
	IF	TPCI
SIGNON:	DEFB	CR,LF 
	DEFB	'TeleVideo System TPC I V'
	DEFB	REVNUM/10+'0'		; Cbios revision number
	DEFB	'.'
	DEFB	(REVNUM MOD 10)+'0'
	DEFB	CR,LF
	DEFB	'(c) 1983 TeleVideo Systems, Inc.'
	DEFB	CR,LF
	DEFB	SMSIZE/10+'0' 		; CP/M memory size
	DEFB	(SMSIZE MOD 10)+'0'
	DEFB	'K CP/M version '		; CP/M version number
	DEFB	CPMREV/10+'0'
	DEFB	'.'
	DEFB	(CPMREV MOD 10)+'0'
MS1DR:	DEFB	' (double drive)'
	DEFB	CR,LF
	DEFB	0			; Termination
MS2DR:	DEFB	' (single drive)'
	ENDIF
	IF	TS803
SIGNON:	DEFB	CR,LF
	DEFB	'TeleVideo System TS 803 V'
	DEFB	REVNUM/10+'0'		; Cbios revision number
	DEFB	'.'
	DEFB	(REVNUM MOD 10)+'0'
	DEFB	CR,LF
	DEFB	'(c) 1983 TeleVideo Systems, Inc.'
	DEFB	CR,LF
	DEFB	SMSIZE/10+'0'		; CP/M memory size
	DEFB	(SMSIZE MOD 10)+'0'
	DEFB	'K CP/M version '		; CP/M version number
	DEFB	CPMREV/10+'0'
	DEFB	'.'
	DEFB	(CPMREV MOD 10)+'0'
	DEFB	CR,LF
	DEFB	0			; Termination
	ENDIF
	ENDIF
;
	IF	USRCPM
SMSG:	DB   	0BH,0DH,0AH,'TeleVideo Systems '
	DB	SMSIZE/10+'0' 		; CP/M memory size
	DB	(SMSIZE MOD 10)+'0'
	DB   	'K CP/M V2.2'
	DB   	0DH,0AH
	DB	'(c) 1983 TeleVideo Systems, Inc.'
	DB	0DH,0AH
	DB	'Distributed Processor '
;
SMSG1:	DB	'TPC I'
	DB	' Z'
	DB	REVNUM/10 + '0'	;BIOS REVISION NUMBER
	DB	'.'
	DB	(REVNUM MOD 10) + '0'
	DB   	0DH,0AH
;
	DB	'Processor ID  ',0
SMSG2:	DB	' <=> ',0
SMSG3:	DB	'TS 800'
	ENDIF
;
;
;
;
;	             DEFAULT FUNCTION KEY TABLE
;	in each function key, 4 bytes(function key value, full dplx mode
;	key=1, ^A, key char) preceded and followed by other control char. 
; 
DFKTAB:	DEFB	31H,31H,01H,40H	;unshifted func key F1  '1','1',^A,'@'
	DEFB	32H,31H,01H,41H	;                   F2  '2','1',^A,'A'
	DEFB	33H,31H,01H,42H	;		    F3  '3','1',^A,'B'
	DEFB	34H,31H,01H,43H	;		    F4  '4','1',^A,'C'
	DEFB	35H,31H,01H,44H ;		    F5	'5','1',^A,'D'
	DEFB	36H,31H,01H,45H ;		    F6	'6','1',^A,'E'
	DEFB	37H,31H,01H,46H ;		    F7	'7','1',^A,'F'
	DEFB	38H,31H,01H,47H ;		    F8	'8','1',^A,'G'
	DEFB	39H,31H,01H,48H ;		    F9	'9','1',^A,'H'
	DEFB	3AH,31H,01H,49H ;		    F10	':','1',^A,'I'
	DEFB	3BH,31H,01H,4AH ;		    F11	';','1',^A,'J'
	DEFB	47H,31H,01H,4BH	;		    F12	'G','1',^A,'K'
	DEFB	48H,31H,01H,4CH ;		    F13	'H','1',^A,'L'
	DEFB	49H,31H,01H,4DH ;		    F14	'I','1',^A,'M'
	DEFB	4AH,31H,01H,4EH	;		    F15	'J','1',^A,'N'
	DEFB	4BH,31H,01H,4FH	;		    F16	'K','1',^A,'O'
	DEFB	3CH,31H,01H,60H ;shifted func key   F1  '<','1',^A,'`'
	DEFB	3DH,31H,01H,61H ;		    F2	'=','1',^A,'a'
	DEFB	3EH,31H,01H,62H ;		    F3	'>','1',^A,'b'
	DEFB	3FH,31H,01H,63H ;		    F4	'?','1',^A,'c'
	DEFB	40H,31H,01H,64H ;		    F5	'@','1',^A,'d'
	DEFB	41H,31H,01H,65H ;		    F6	'A','1',^A,'e'
	DEFB	42H,31H,01H,66H ;		    F7	'B','1',^A,'f'
	DEFB	43H,31H,01H,67H	;		    F8	'C','1',^A,'g'
	DEFB	44H,31H,01H,68H ;		    F9	'D','1',^A,'h'
	DEFB	45H,31H,01H,69H ;		    F10	'E','1',^A,'i'
	DEFB	46H,31H,01H,6AH ;		    F11	'F','1',^A,'j'
	DEFB	4CH,31H,01H,6BH ;		    F12	'L','1',^A,'k'
	DEFB	4DH,31H,01H,6CH ;		    F13	'M','1',^A,'l'
	DEFB	4EH,31H,01H,6DH	;		    F14	'N','1',^A,'m'
	DEFB	4FH,31H,01H,6EH ;		    F15	'O','1',^A,'n'
	DEFB	50H,31H,01H,6FH	;		    F16	'P','1',^A,'o'
;
;	THIS ROUTINE SETS UP COMMAND BUFFER TO DO AN AUTOLOAD
;
;		DE = BEGINNING ADDRESS OF FILENAME
;		HL = ENDING ADDRESS OF FILENAME
;
AUTOSETUP:
	PUSH	DE		; SAVE START OF FILENAME
	OR	A		; CLEAR CARRY
	SBC	HL,DE		; COMPUTE LENGTH OF FILENAME
	INC	L		; ADD ONE
	LD	A,L
	LD	DE,CCP+7	; BEGINNING OF COMMAND BUFFER
	LD	(DE),A		; MOVE LENGTH OF FILENAME INTO BUFFER
	INC	DE
	POP	HL		; GET START OF FILENAME
	LD	B,0
	LD	C,A		; MOVE FILENAME INTO BUFFER
	LDIR
	RET
;
;
OVLYEND	EQU	$
	IF	IMAGEND	GT OVLYEND
	DEFS	IMAGEND-OVLYEND
	ENDIF
;
LAST:	DEFB	55H		; DEFINES END OF PROGRAM
;
	IF	USRCPM
;
;	THESE MUST BE LAST FOR AUTO GEN
;
ACONBF:	DEFW	CONBUF		;ADDRESS OF CONSOLE BUFFER AREA
PROCID:	DEFS	1		;PROCESSOR ID
SPLDRV:	DEFB	1		;SPOOL DRIVE                    MMMOST2.0
GENREV:	DEFB	0		;GENERATE VERSION NUMBER        MMMOST2.0
DRVTAB:	DEFW	4000H		;BIT STRING OF LEN. 16 WHERE 1  MMMOST2.0
	                        ;INDICATES BDOS INTERCEPT FOR   MMMOST2.0
	                        ;FILE ACCESS                    MMMOST2.0
NDISK:	DEFS	1		;FILLED IN BY AUTO GEN - NO. OF LOGICAL DRIVE
;
DPBASE:	DEFB	55H		;MARKER FOR 'CNFGUSER.COM' PROGRAM
	ENDIF
;
; END OF TPCIDATA.MAC

