;	BIOS.MAC  VERSION 2.05  REV 0    8/1/78
;
;	this is original source in uppercase. only comments have been added in lowercase.
;	last edit: 11/29/14
;
;	org = 3DA5h for 16k system
;
;	IMDOS BASIC INPUT-OUTPUT SYSTEM
;
; THIS MODULE CONTAINS DRIVERS FOR NON-DISK DEVICES,
; LOGICAL DEVICE ROUTINES, AND SOME SYSTEM INITIALIZATION
; CODE.
;
;CHANGES IN LATEST VERSION:
;	MODIFY TO USE RELOCATIBLE ASSEMBLER
;
;
; COPYRIGHT (C) 1976, 1977
;	IMSAI MANUFACTURING CORP
;	   14860 WICKS BLVD, SAN LEANDO, CA 94577 USA
;
;

EXTRN	ENCCP,BDOSRE,WBOOT,VIOF,IOBYTE,OPTION
EXTRN	HOME,SELDIS,SELTRK,SELSEC,BCMD,DEX

PUBLIC	ENSYS,BIOS
PUBLIC	CONIF,CONRDY,CONOUT,PUNOUT,LSTOUT,READIN

;
;INITIAL I/O ASSIGNMENTS EQUATE:
;
	; MAY BE CHANGED BY USER TO PUT VALUE OTHER THAN
	; 0 INTO LST:, RDR:, AND PUN: IOBYTE FIELDS AT
	; COLD START.  CON: BITS (0 AND 1) SHOULD BE LEFT
	; 0 FOR CORRECT OPERATION OF "CONSOLE FINDER" IN
	; INITIALIZATION CODE NEAR END OF BIOS.
	; CHANGING INITIOBYTE IS NEVER ESSENTIAL, AS
	; DEVICES CAN BE ASSIGNED WITH THE "STAT"
	; COMMAND; THIS PROVIOSION FOR CHANGE IS
	; INTENDED AS A WAY TO MAKE A MORE CONVENIENT
	; SYSTEM ONLY.
	;EXAMPLE: TO MAKE SYSTEM COME UP WITH LST:=LPT:,
	; CHANGE INITIOBYTE TO 1000$0000B.
;
INITIOBYTE  EQU  0	;INITIAL IOBYTE (LEAVE 0 FOR CON:)
	PAGE	
FALSE	EQU	0
TRUE	EQU	NOT FALSE
;
;
;
; I/O PORT EQUATES
;
SER40A	EQU	FALSE	;TRUE FOR PRINTER ON SIO PORTS 4 & 5
SER40B	EQU	FALSE	;TRUE FOR PRINTER ON SIO PORTS 22 & 23
SER40	EQU	SER40A OR SER40B
;
TTY	EQU  02H
TTYS	EQU  03H
CRT	EQU  04H
CRTS	EQU  05H
SIOC	EQU  08H
;
;
; IMSAI PTR-300 LINE PRINTER
;
	IF NOT SER40	;IF PRINTER USES LIF
PRINTER	EQU  0F6H	;OUTPUT PORT, AND STATUS IN
PINIT	EQU  80H	;INITIALIZE COMMAND
;ANY DATA WITH B7=0 IS TAKEN AS ASCII CHAR TO PRINT.
	ENDIF
;
;
	IF SER40A
PTR	EQU	4
PTRS	EQU	5
	ENDIF
;
;
	IF SER40B
PTR	EQU	22H
PTRS	EQU	23H
	ENDIF
;
;
;
; IMSAI VIO VIDEO DISPLAY BOARD
VIOINIT EQU	0F800H	;CALL THIS ADDR TO INIT
VIOADR	EQU	0F803H	;CALL TO OUT CHAR (A)
	PAGE
;
; EQUATES FOR MPU-B TIMER INITAILIZATION
;
	IF SER40A	;ONLY SET TIMER ON MPU-B

			;FOR PTR ON SIO PORT 4 & 5
MPUIN	EQU	40H	;INSTALL MPU-B
MPUOUT	EQU	0C0H	;REMOVE FROM MEMORY SPACE
MEMCTL	EQU	0F3H	;PORT TO INSTALL/REMOVE MPU-B
MPUAT	EQU	0D000H	;ADDRESS OF MPU-B
MPUTSA	EQU MPUAT+800H	;ADDRESS OF SIGNATURE
MPUTST	EQU	3EH	;VALUE OF SIGNATURE
MPUTMC	EQU MPUAT+103H	;ADDRESS OF TIMER CONTROL PORT
MPUTV1	EQU	36H	;WHAT TO PUT THERE
MPUTIM	EQU MPUAT+100H	;ADDRESS OF TIMER PORT
MPUTV2	EQU	13	;WHAT TO PUT THERE
	ENDIF
;
;
; EQUATES FOR ASCII CHARACTERS
;
CTRLC	EQU  3
CTRLT	EQU	14H
TAB	EQU  9
LF	EQU  0AH
FF	EQU  0CH
CR	EQU  0DH
CTRLZ	EQU  1AH
UNDERLINE EQU 5FH
RUBOUT	EQU  7FH
;
	PAGE	
;
;CODE BEGINS HERE
;
;
; ENTRY POINT TABLE
;
;DO NOT REARRANGE THE FOLLOWING, AS PROGRAMS HAVE
;THESE ADDRESSES BUILT IN TO THEM
;

	CSEG
			;BOOT RETURNS HERE
BIOS:	JMP  WBOOT	;COME HERE FOR REBOOT (VIA 0)
    ;LOGICAL DEVICE ENTRIES: THESE ROUTINES GO TO THE
    ;CURRENTLY ASSIGNED PHYSICAL DEVICE PER IOBYTE.
	JMP  CONRDY	;CON: STATUS. NON-0 FOR CHR RDY
	JMP  CONIF	;CONSOLE IN TO A
	JMP  CONOUT	;CONSOLE OUT FROM C
	JMP  LSTOUT	;LIST OUT FROM C
	JMP  PUNOUT	;PUNCH OUT FROM C
	JMP  READIN	;READER IN TO A
    ;DISK FUNCTION ENTRIES: THESE NOW ARE PERFORMED IN
    ;BDOS; ENTRIES ARE MAINTAINED HERE FOR PROGRAMS THAT
    ;NEED TO ACCESS DISK VIA TRACK AND SECTOR ADDRESSES
    ;RATHER THAN VIA FILE STRUCTURE (E.G. SYSMOV, FORMAT)
	JMP  HOME	;RESTORE DRIVE
	JMP  SELDIS	;SELECT DRIVE (C)+1
	JMP  SELTRK	;SELECT TRACK (C)
	JMP  SELSEC	;SELECT SECTOR (C)
	JMP  SELDMA	;SET BUFFER ADDRESS (BC)
    ;READ DISK SECTOR
	MVI A,20H	;ENTRY FOR DISK READ
	DB 01		;CODE FOR LXI B,
    ;WRITE DISK SECTOR
	MVI A,10H	;ENTRY FOR DISK WRITE
	STA OPTION	;CLEAR ERROR CONTROL OPTIONS
	JMP DEX		;USE BDOS DISK I/O
    ;SIGNATURE
	DB 0,0,0FFH	;MAKE 2.02 UTILITIES INCOMPATIBLE
;
; SET DISK BUFFER ADDRESS IN BDOS
;
SELDMA:	PUSH B
	XTHL
	SHLD BCMD
	POP H
	RET
	PAGE	
;**********************************************
;
;	LOGICAL DEVICE ROUTINES
;
;   THESE ROUTINES USE VARIOUS PHYSICAL DEVICES
;   DEPENDING ON CONTENTS OF IOBYTE.
;
;   AN APPLICATION PROGRAM USUALLY CALLS THESE
;   ROUTINES VIA BDOS SYSTEM CALLS, BUT MAY CALL THE
;   BIOS ENTRY POINTS DIRECTLY.
;
;   ALL CLOBBER DE, SOME CLOBBER OTHER REGS.
;
;
; CONSOLE STATUS
;
CONRDY: CALL CONS	;GETS STAT OF SPECIFIC DEVICE
	ORA  A
	RZ		;IF NOT READY RETURN 0 IN A
	MVI  A,0FFH	;ELSE RETURN FF
	RET		;Z FLAG SET CORRESPONDINGLY
;
CONS:	CALL DISPATCH	;GO TO ONE OF 4 ADDRESSES PER IOBYTE
	 DB	1	;..BITS 1-0
	 DW  TTYSTAT	 ;00 - TTY:
	 DW  CRTSTAT	 ;01 - CRT:
	 DW  CRTSTAT	 ;10 - VK2:
	 DW  TTYSTAT	 ;11 - VK1:
;
; CONSOLE IN
;
CONIF:	CALL DISPATCH
	 DB	1	;USE IOBYTE BITS 1-0
	 DW  TTYIN	 ;00 - TTY:
	 DW  CRTIN	 ;01 - CRT:
	 DW  CRTIN	 ;10 - VK2:
	 DW  TTYIN	 ;11 - VK1:
;
; CONSOLE OUT
;
CONOUT:	CALL DISPATCH  ;GO TO ONE OF FOLLOWING ADDRS
	 DB	1	;USE BITS 1-0 OF IOBYTE
	 DW  TTYOUT	 ;BITS=00 - USE TTY AS CONSOLE
	 DW  CRTOUT	 ;01 - CRT:
	 DW  VIO$OUTPUT	 ;10 - VK2:
	 DW  VIO$OUTPUT	 ;11 - VK1:
;
; CAUTION:  LOGICAL DEVICE ROUTINES FOR CONSOLE (ABOVE)
;           AND CONSOLE FINDER (SEE LABEL 'FINCON') MUST
;	    CORRESPOND.
;
	PAGE	
;
; LIST OUT
;
LSTOUT:	CALL DISPATCH	;GO TO 1 OF 4 ADDRESSES PER
	 DB	3	 ;IOBYTE BITS 7-6
	 DW  TTYOUT	 ;00 - TTY:
	 DW  CRTOUT	 ;01 - CRT:
	 DW  LPTOUT	 ;10 - LINE PRINTER
	 DW  VIO$OUTPUT	 ;11 - VK2: (VIDEO OUTPUT)
;
; PUNCH OUT
;
PUNOUT:	CALL DISPATCH
	 DB	5	;USE IOBYTE BITS 5-4
	 DW  TTYOUT	 ;00 - TTY:
	 DW  PUNO	 ;01 - HIGH SPEED PUNCH
	 DW  CRTOUT	 ;10 - UP1: USES CRT:
	 DW  VIO$OUTPUT	 ;11 - VK1: (VIDEO OUTPUT)
;
; READER IN
;
READIN:	CALL DISPATCH
	 DB	7	;USE IOBYTE BITS 3-2
	 DW  TTYIN	 ;00 - TTY:
	 DW  RDRIN	 ;01 - HIGH SPEED READER
	 DW  CRTIN	 ;10 - UR1:  USES CRT: IN
	 DW  TTYIN	 ;11 - VK1:
;
;SUBROUTINE TO DISPATCH TO ONE OF 4 FOLLOWING ADDRESSES
;DEPENDING ON CONTENTS OF TWO BITS OF IOBYTE.  SPECIFIC
;BITS OF IOBYTE ARE SPECIFIED BY SHIFT COUNT FOLLOWING CALL.
;RETURNS TO SUBROUTINE CALL PRIOR TO CALL TO DISPATCH.
;
DISPATCH:
	XTHL		;SAVE CALLER'S H, GET TABLE ADDR
	MOV D,M		;SHIFT COUNT
	INX H		;POINT TABLE
	LDA IOBYTE	;GET IO ASSIGNMENTS BYTE
DSHFT:	RLC
	DCR D
	JNZ DSHFT 	;SHIFT TO POSITION BITS
	ANI 06H		;MASK BITS
	MOV E,A		;D ALREADY CLEAR
	DAD  D		;INDEX INTO TABLE
	MOV  A,M
	INX H		;TABLE WORD TO HL
	MOV  H,M
	MOV L,A	;..
	XTHL		;PUT ADDR OF ROUTINE, GET CALLER'S H
	RET		;GO TO ROUTINE 
	PAGE	
;
;*****************************************************
;
;	PHYSICAL DEVICE ROUTINES
;
; ACCESSED VIA LOGICAL DEVICE ROUTINES ABOVE
;
;
; TELETYPE INPUT
;
; USED FOR TTY: AND VK1: (KEYBOARD ON PORT 2)
; MUST PRESERVE B, D, E, H, L FOR CONSOLE FINDER
TTYIN:	CALL TTYSTAT
	JZ   TTYIN	;WAIT FOR A CHAR TO BE AVAILABLE
	IN   TTY	;INPUT IT
	ANI  7FH	;REMOVE PARITY
	RET
;
TTYSTAT:	;USED HERE AND IN CONSTAT ABOVE
	IN   TTYS	;GET STATUS
	ANI  02H	;MASK BIT
	RET		;A IS NON-0 IF CHAR AVAILABLE
;
; TELETYPE OUTPUT
;
;CLOBBERS DE. BOOT DEPENDS ON PRESERVING HL
;MUST PRESERVE HL FOR NXM, BOOTSTRAP
TTYOUT:	IN   TTYS	;STATUS
	RRC		;TEST BIT 0
	JNC  TTYOUT	;WAIT TILL READY TO ACCEPT CHAR
	MOV  A,C
	OUT TTY		;OUTPUT THE CHARACTER
;
; IF YOUR TERMINAL NEEDS A DELAY FOR CARRIAGE TO RETURN,
; ALTER THE FOLLOWING INSTRUCTION TO MVI D,28H FOR A
; DELAY OF ABOUT 100 MSEC.
	MVI D,0
	CPI CR
TTYWT0:	RNZ
TTYWT1:	DCX  D
	ORA  D		;DEPENDS ON A7=0 AT ENTRY 
	JP   TTYWT1	;LOOP TAKES 9.5 USEC PER COUNT
	RET
	PAGE	
;
;  CRT INPUT
;
; USED FOR CRT: AND VK2: (KKEYBOARD ON PORT 4).
; MUST PRESERVE B, D, E, H, L FOR CONSOLE FINDER
CRTIN:	CALL CRTSTAT
	JZ   CRTIN
	IN   CRT
	ANI  7FH
	RET
;
CRTSTAT: IN  CRTS
	ANI  02H
	RET
;
; CRT OUTPUT
;
;MUST PRESERVE HL FOR BOOT, NXM
;CLOBBERS DE
CRTOUT:	IN   CRTS
	RRC
	JNC  CRTOUT
	MOV  A,C
	OUT  CRT
;DELAY AFTER LINE FEED. THIS IS SO
;(1) IF THERE ARE SEVERAL BLANK LINES, PRECEDING
;OUTPUT DOESN'T DISSAPPEAR OFF SCREEN BEFORE YOU
;HAVE TIME TO HIT CTL-S, AND (2) TO GIVE CERTAIN
;"INTELLIGENT" TERMINALS TIME TO "THINK"
	MVI D,14H	;DELAY: APPROX 50 MSEC
	CPI LF		;IF WAIT AFTER CR IS REQUIRED
			;CHANGE INSTRUCTION TO "CPI CR"
	JMP TTYWT0	;USE TTY: WAIT CODE
;
;
;
; VIDEO OUTPUT (IMSAI VIO BOARD)
;
VIO$OUTPUT: LDA VIOF	;TEST FLAG THAT SAYS
	ORA A		;VIO IS PRESENT
	JNZ  TTYOUT	;IF NOT THERE, USE TTY INSTEAD.
	MOV A,C		;CHARACTER
	JMP VIOADR	;DO IT
	PAGE	
; LINE PRINTER OUT
;
LPTOU2: PUSH B		; ERROR RETRY FOR LPTOUT
	LXI D,PRINTMSG	;"LPT NOT READY"
	LXI B,9		;"PRINT" FUNCTION NUMBER
	CALL BDOSRE	;BDOS PRINT
	MVI C,1		;FCN NUMBER TO INPUT CHAR & ECHO
	CALL BDOSRE	;CALL BDOS
	CPI  CTRLC
	JZ   WBOOT	;IF ^C TYPED, REBOOT
	POP  B		;GET CHAR TO PRINT BACK
;
LPTOUT:		;ENTRY POINT FOR PRINTER OUTPUT
;
	IF NOT SER40
	MVI  B,0	;BUSY TIME-OUT COUNTER
LPTOU0: IN   PRINTER	;THIS GETS: FF, NO LPT INTERFACE,
	 ;F4: READY, F0: BUSY, NO PAPER, COVER OPEN, &C.
	CPI  0FFH
	JZ   LPTOU2	;NO PRINTER, USE "HUNG" MSG
	DCR  B		;ON TIME-OUT,
	JZ   LPTOU2	;PRINT MESSAGE AND AWAIT INPUT
	ANI  04H	;CHECK "READY" BIT
	JZ   LPTOU0	;IF NOT READY, TRY TILL TIME-OUT
	MOV  A,C	;THE CHARACTER
	OUT  PRINTER	;OUTPUT IT
	RET
	ENDIF
;
;
;
	IF SER40
	LXI D,0
LPTOU0:	DCX D		;CHECK TIMEOUT
	MOV A,D
	ORA E
	JZ LPTOU2	;JIF TIMEOUT
	IN PTRS		;CHECK STATUS PORT
	CPI 0FFH
	JZ LPTOU2	;JIF NOTHING THERE
	ANI 85H		;CHECK BOTH READY BITS
	CPI 85H
	JNZ LPTOU0	;LOOP IF NOT READY
	MOV A,C
	OUT PTR		;OUTPUT THE BYTE
	RET
	ENDIF
;
;
PRINTMSG: DB CR,LF,'LPT NOT RDY ',0
	PAGE
;
;
; NULL DEVICE, FOR UNDEFINED DEVICES.
;
;FOR UNASSIGNED AND AND UNIMPLEMENTED INPUT DEVICES,
;HERE IS AN INFINITE SOURCE OF EOF'S:
NULLI:	MVI  A,CTRLZ
	ORA A
	RET
;
;DON'T USE CRT FOR UNASS INPUT DEVICES CAUSE IF THERE
; IS NO CRT ON SYSTEM BUT INTERFACE BOARD IS PRESENT,
; SYSTEM WILL HANG.
;
;FOR UNUASS AND UNIMP OUTPUT DEVICES, USE CRT.
;  IF NO CRT IS PRESENT, THIS IS AN INFINITE DATA SINK.
NULLO	EQU  CRTOUT
;
; HERE IS A PLACE WHERE USER MAY ADD HIGH SPEED
; READER DRIVER
;
RDRIN	EQU  NULLI	;MEANWHILE, USE NULL DEVICE
;
; HERE IS A PLACE WHERE USER MAY ADD HIGH SPEED
; PUNCH DRIVER
;
PUNO	EQU  NULLO	;MEANWHILE, USE NULL DEVICE
;
;
;
;
;
; ******************************************************
;
; END OF CODE USED WHILE SYSTEM IS RUNNING
;
;	ALL CODE USED DURING SYSTEM EXECUTION
;	MUST PRECEDE THIS POINT -- FOLLOWING
;	CODE IS USED DURING SYSTEM INITIALIZATION
;	ONLY AND IS OVERLAID WITH STORAGE THEREAFTER.
;	MORE COMMENTS ON WHAT OVERLAYS INITIALIZATION
;	CODE ARE ON THE LAST TWO PAGES OF THIS LISTING.
;
	PAGE	
;
;*************************************************
;
;	SYSTEM INITIALIZATION, BIOS PORTION
;
; INITIALIZATION STARTS IN BOOT, CONTINUES HERE.
; CODE HERE SETS SYSTEM VIO AND DIO FLAGS,
; INTITIALIZES VIO VIDEO INTERFACE IF PRESENT,
; INITIALIZES LINE PRINTER IF PRESENT,
; AND, IF COLD START, FINDS CONSOLE AND INTIALIZES
;   IOBYTE.
; CONTROL IS THEN TRANSFERRED TO THE CCP, WHICH
; DOES ADDITIONAL INITIALIZATION INCLUDING TYPING
;  THE SYSTEM SIGN-ON.
;
;
ENSYS:
	;ENTRY FROM BOOT
	; ON ARRIVAL HERE
	;   IOBYTE = 0FFH IF IT NEEDS SETTING
;
	LXI SP,68H	;SET STACK
;
;
; INIT LINE PRINTER
;
;
;
	IF NOT SER40
	IN   PRINTER	;GET STATUS: FF NOT THERE,
			;F4 OK, F0 NOT READY (MIGHT 
			;HANG US IF WE OUTPUT TO IT
	ANI  04H	;MASK THE TELLING BIT
	JZ  NOPINIT	;BIT OFF, SKIP INIT
	MVI  A,PINIT
	OUT  PRINTER
NOPINIT:
	ENDIF
	PAGE
;
; IF SIO ON PORT 4 & 5, INIT MPU-B TIMER
;
	IF SER40A
	LXI H,TEST	;FIRST MOVE CODE DOWN TO 80H
	LXI D,80H	; SINCE BIOS MIGHT BE IN MPU LAND
	MOV B,E		;NUMBER OF BYTES TO MOVE (80H IS ENOUGH)
	CALL COPYHL	;USE BDOS COPY ROUTINE
	CALL 80H	;INIT TIMER IF THERE
	ENDIF
;
; INIT BOTH CHANNELS OF SIO
;   AND PRINTER IF ON SIO
;
	LXI H,INITST	;POINT INIT STRING
SIOLUP:	MOV A,M		;GET BYTE
	OUT TTYS	;CHANNEL 1
	INX H		;MUST LEAVE TIME BETWEEN TWO
	NOP		;NEEDS MORE TIME BETWEEN OUT'S TO SIO
	IF NOT SER40A	;SER4A USES THIS PORT FOR PTR
	OUT CRTS	;CHANNEL 2
	ENDIF
	IF SER40
	MOV B,A		;CHANGE A 37H TO 33H
	ANI 1
	ADD A
	ADD A
	XRA B
	OUT PTRS	;OUTPUT TO THE PTR CONTROL PORT
	ENDIF
	RAR		;ONLY LAST IS ODD
	JNC SIOLUP
	MOV A,M
	OUT SIOC
;
; ENTER CCP IF WARM START
;
	LDA IOBYTE	;TEST IOBYTE
	INR A
	JNZ ENCCP	;DONE IF WARM START:
			; GO TO CCP
	PAGE	
;SYSTEM INITIALIZATION, BIOS PORTION, COLD START
;
; INITIALIZE IOBYTE: LST:, RDR:, PUN: FIELDS TO
; 0 OR VALUE OF "INITIOBYTE" ASSEMBLY PARAMETER
; EQUATED ON PAGE 1; CONSOLE TO DEVICE "FOUND" BY
; FOLLOWING CODE
;
; CONSOLE FINDER:
;	CONSOLE INPUT IS FROM PORT 2 OR PORT 4,
;          WHICHEVER INPUTS A SPACE OR CONTROL-T
;	   CHARACTER FIRST, OR PORT 2 ON TIME-OUT.
;	CONSOLE OUTPUT IS TO VIO IF PRESENT AND
;	   SPACE TYPED OR TIME-OUT; TO SAME PORT
;	   AS INPUT IF FORCED BY TYPING CONTROL-T
;	   OR IF VIO NOT PRESENT.
;	THE ABOVE RULES DEFINE THE SELECTION OF
;	   ONE OF THE PHYSICAL DEVICES TTY:, CRT:,
;	   VK1:, OR VK2: FOR THE INITIAL CON:.
;	PORT NUMBERS AND DEVICES ACCESSED WILL
;	   CHANGE APPROPRIATELY IF USER CHANGES
;	   PHYSICAL DEVICE ROUTINES ABOVE, SINCE
;	   CONSOLE FINDER DOES ITS IO THRU PHYSICAL
;	   DEVICE ROUTINES.
;
; CAUTION:  IF YOU CHANGE THE CORRESPONDENCE BETWEEN
;   IOBYTE VALUES AND PHYSICAL DEVICES, OR ACCESS A
;   COMPLETELY DIFFERENT DDRIVER IN CON: LOGICAL
;   DEVICE ROUTINES, FOLLOWING CODE MAY REQUIRE CHANGES.
;
;
	LXI D,6000H	;TIME-OUT COUNTER
			;6000=ABOUT 3 SECS
FINCON:	;LOOP BACK HERE TIL INPUT OR TIL TIMEOUT
    ;TRY CRT PORT
	CALL CRTSTAT
	CNZ CRTIN	;GET BYTE IF READY
	LXI B,201H	;2 FOR VIO, 1 FOR NO VIO
	CALL TESTIN	;RETURN IF NOT SPACE OR ^T
    ;TRY TTY/KEYBOARD PORT LIKEWISE
	CALL TTYSTAT
	CNZ TTYIN	;GET BYTE IF READY
	LXI B,300H	;3 FOR VIO, 0 FOR NO VIO
	CALL TESTIN	;RETURN IF NOT SPACE OR ^T
	DCX D
	MOV A,D		;TEST TIME-OUT
	ORA E
	JNZ FINCON
	PAGE	
;
; OPERATOR HAS NOT RESPONDED WITH A SPACE OR CONTROL-T
; ON EITHER PORT 2 OR PORT 4.  SUPPLY ONE FOR HIM.
;
	MVI A,' '	;USE PORT 2
;
;
;
; ROUTINE TO TEST FOR SPACE BAR INPUT (USE VIO IF THERE)
; OR CONTROL-T (DON'T USE VIO) IN ACC.
; RETURNS ONLY IF ACC IS NOT SPACE OR CONTROL-T.
; OTHERWISE, FALLS THROUGH TO SET IOBYTE.
; ON ENTRY:
;	B = IOBYTE VALUE IF WANT TO USE VIO
;	C = IOBYTE VALUE TO SUPPRESS VIO
;
TESTIN:	CPI ' '
	JZ TSTIN1	;SPACE BAR GOOD
	CPI CTRLT
	RNZ		;NO CONTROL-T BAD
	MOV B,C		;SUPPRESS VIO
TSTIN1:	LHLD VIOF
	MOV A,C		;ASSUME NO VIO
	INR L
	DCR L		;TEST
	JNZ SETIOBYTE	;BRIF VIO NOT THERE
	CALL VIOINIT	;INIT IT
	MOV A,B		;MOVE MAGIC VALUE TO ACC
;
; AT THIS POINT THE IOBYTE FIELD FOR CONSOLE IS IN A:
;  0 - TTY: (PORT 2 INPUT AND OUTPUT)
;  3 - VK1: (PORT 2 INPUT, VIO OUTPUT)
;  1 - CRT: (PORT 4 INPUT AND OUTPUT)
;  2 - VK2: (PORT 4 INPUT, VIO OUTPUT)
;
SETIOBYTE:
; INITIALIZE IOBYTE. CONSOLE FIELD IS IN A.
	ORI INITIOBYTE	;OTHER FIELDS PER INITIOBYTE
			;EQUATE ON PAGE 1 (0 IF NOT
			;MODIFIED BY USER)
	STA IOBYTE	;SET IOBYTE
	
;
;EXIT FROM BIOS TO CCP COLD START ENTRY POINT
	JMP ENCCP	;CONTINUE IN CCP
;
;
;
INITST:	DB 0,0,0,40H,0AEH,37H,22H
;
; TEST FOR MPU-B AND SET TIMER IF THERE
;  THIS CODE IS MEANT TO BE EXECUTED AT 80H, NOT HERE
;
	IF SER40A	;ONLY IF PTR ON SIO PORT 4 & 5
TEST:	MVI A,MPUIN
	OUT MEMCTL	;INSTALL MPU-B AT D800H
	LXI H,MPUTSA	;ADDRESS OF MPU-B SIGNITURE
	MOV B,M		;SAVE WHAT'S THERE
	MVI A,0FFH-MPUTST ;COMPLEMENT OF WHAT SHOULD BE THERE
	MOV M,A		;TRY TO COMPLEMENT MEMORY
	XRA M		;0 IF RAM, 0FFH IF ROM
	INR A		;TEST FOR TRUE
	MOV M,B		;RESTORE IN CASE RAM
	JNZ TEST1-TEST+80H ;JIF NOT MPU-B
	LXI H,MPUTMC	;POINT TIMER CONTROL PORT
	MVI M,MPUTV1
	LXI H,MPUTIM	;TIMER PORT
	LXI D,MPUTV2	;VALUE FOR 9600 BAUD
	MOV M,E		;OUTPUT TO PORT
	MOV M,D
TEST1:	MVI A,MPUOUT	;REMOVE MPU-B FROM ADDRESS SPACE
	OUT MEMCTL
	RET
	ENDIF
;
	DB ' (C) 1976,1977'
;
;
;
;CAUTION: DO NOT ADD ROUTINES HERE UNLESS THEY ARE USED
;ONLY DURING SYSTEM INITIALIZATION.  PUT ADDED CODE USED
;DURING SYSTEM INITIALIZATION ABOVE "ENSYS".  READ COMMENTS
;ON PAGE 15.
;
	END
