;BIOS.ASM  VERSION 2.02  REV 0    12/07/77
;
;	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:
;	DISK-RELATED ROUTINES MOVED OUT OF BIOS
;	IOBYTE INITIALIZED WITHOUT USING SWITCHES
;	PROVISIONS FOR VIO (DEVICES VK1: AND VK2:)
;	PROVISIONS FOR MULTIPLES DISK DRIVES


; COPYRIGHT (C) 1976, 1977
;	IMSAI MANUFACTURING CORP
;	   14860 WICKS BLVD, SAN LEANDO, CA 94577 USA


;
; EQUATES OF PARTICULAR INTEREST TO USER-MODIFIER
;

	;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

;EQUATES OF PARTICULAR INTEREST TO USER, CONTINUED

	;SYSTEM SIZE AND LOCATION EQUATES: "MEMTOP" AND
	;"EMS" MUST BE SET TO EXACTLY MATCH THE WAY THE
	;SYSTEM INTO WHICH THE MODIFIED BIOS IS TO BE 
	;INSTALLED HAS BEEN RELOCATED WITH THE "RELOC"
	;COMMAND.  "MEMTOP" MUST MATCH THE NUMBER
	;OF K FOR WHICH THE SYSTEM IS RELOCATED; "EMS" MUST
	;MATCH THE NUMBER OF "M" OPTIONS USED WITH THE "RELOC"
	;COMMAND TO GET ADDTIONAL MOUNT SPACE OR SPACE FOR
	;EXPANSION OF BIOS.  VALUES IN FILE ON
	;DISTRIBUTION DISKETTE ARE FOR 16K SYSTEM WITH
	;NO M'S.

MEMTOP	EQU 4000H
		;TOP OF MEMORY FOR WHICH SYSTEM HAS BEEN
		;RELOCATED WITH "RELOC" COMMAND.
		;EXAMPLES: MAKE MEMTOP 6000H FOR 24K,
		;8000H FOR 32K, 0E000H FOR 60K, 0 FOR 64K.

EMS	EQU 0
		;NUMBER OF "M" OPTIONS GIVEN IN "RELOC" CMND.
		;EACH "M" ADDS 100H BYTES FOR MOUNT SPACE
		;AND/OR BIOS EXPANSION.
		;EXAMPLE VALUES: 1, 2.

;BIOSLEN EQU SYSTOP-BIOS
		;BIOSLEN IS NOT AN INDEPENDENT VARIABLE.
		;IT IS LISTED HERE AS A REMINDER THAT IF A
		;USER BIOS IS MODIFIED SUCH THAT BIOSLEN
		;CHANGES, BIOSLEN IN BOOT MUST BE CHANGED
		;TO CORRESPOND TO THE NEW VALUE.


;FOLLOWING EQUATES ARE DERIVED FROM THOSE ABOVE AND SHOULD
;NOT BE CHANGED.
;
;EQUATES FOR LOCATIONS OF THE VARIOUS MODULES OF IMDOS
;
SYSBOTTOM EQU	MEMTOP - 1800H - 100H*(EMS+1)
		;SYSTEM BEGINS AT MEMORY TOP, LESS
		;SYSTEM LENGTH, LESS MOUNT SPACE LENGTH
CCP	EQU	SYSBOTTOM	;CONSOLE COMMAND PROCESSOR
BDOS	EQU	SYSBOTTOM+900H	;BASIC DISK OPERATING SYSTEM
BIOS	EQU	SYSBOTTOM+1600H ;BASIC I/O SYSTEM - THIS.

;SYSTOP			;END OF BIOS CODE ROUNDED UPWARDS
			;TO EVEN 100H BOUNDARY.  EQUATE
			;IS LOCATED NEAR THE LISTING END.

	;PAGE

;
; OTHER EQUATES RELATING TO SYSTEM RAM LAYOUT
;
;WHERE TO ENTER IMDOS AFTER BOOT:
CCPC	EQU	CCP	;AFTER COLD BOOT
CCPW	EQU	CCPC+3	;AFTER WARM BOOT

IOBYTE	EQU  3		;I/O STATUS (ASSIGNMENTS) BYTE
LOGDISK	EQU  4		;WHERE CCP PUTS LOGGED DISK #
;NOTE: CODE BELOW ASSUMES LOGDISK=IOBYTE+1

;
; I/O PORT EQUATES
;
TTY	EQU  02H
TTYS	EQU  03H
CRT	EQU  04H
CRTS	EQU  05H

;
; IMSAI PTR-300 LINE PRINTER
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.


; IMSAI VIO VIDEO DISPLAY BOARD
VIOINIT EQU	0F800H	;CALL THIS ADDR TO INIT
VIOADR	EQU	0F803H	;CALL TO OUT CHAR (A)
VIOTSTADR EQU	0FFFDH	;ADDRESS TO TEST FOR CONAINING
VIOTST	EQU	'V'	;..THIS VALUE IN ROM
	;PAGE

;
; 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

;
; EQUATES FOR FUNCTIONS LOCATED IN BDOS
;
;MOST OF THESE ARE ADDRESSES IN BDOS'S ENTRY POINT
;TABLE. MANY ARE NEEDED HERE ONLY BECAUSE A BIOS ENTRY
;POINT ACCESSES THEM (FUNCTIONS FORMERLY IN BIOS)
BDOSRE	EQU BDOS+9H	;CALL BDOS REENTRANT. THIS IS THE
		;SAME AS "CALL BDOS" IN A USER PROGRAM
		;EXCEPT IT WORKS WHEN CALLED FROM BIOS
		;EVEN IF BIOS WAS CALLED FROM BDOS,
		;BECAUSE IT USES CALLER'S STACK AND
		;DIFFERENT REGISTER SAVE LOCATIONS.
WBOOT	EQU BDOS+15H	;INITIATE WARM BOOT
HOME	EQU BDOS+18H	;RESTORE DRIVE (C)
SELDSK	EQU BDOS+1BH	;SELECT DISK (C)+1
SETTRK	EQU BDOS+1EH	;SELECT TRACK (C)
SETSEC	EQU BDOS+21H	;SELECT SECTOR (C)
SETDMA	EQU BDOS+24H	;SET BUFFER ADDRESS (BC)
READ	EQU BDOS+27H	;READ SECTOR
WRITE	EQU BDOS+2AH	;WRITE SECTOR
PTABLE	EQU BDOS+31H	;PRESERVE TABLE LOCATION
VIOF	EQU BDOS+32H	;LOCATION IN BDOS PRESERVE TABLE
		;WHICH IS 0 IF SYSTEM CONTAINS A VIO
		;CODE BELOW ASSUMES DIOF
		;(# DIOS, 0, 1, OR 2) IS AT VIOF+1

	;PAGE

;CODE BEGINS HERE

	ORG  BIOS	;ORIGIN EQUATED ABOVE
;
; ENTRY POINT TABLE
;
;DO NOT REARRANGE THE FOLLOWING, AS PROGRAMS HAVE
;THESE ADDRESSES BUILT IN TO THEM

	JMP  INIT	;CONTINUE BOOTSTRAP, WARM AND COLD
			;BOOT RETURNS HERE
	JMP  WBOOT	;COME HERE FOR REBOOT (VIA 0)
    ;LOGICAL DEVICE ENTRIES: THESE ROUTINES GO TO THE
    ;CURRENTLY ASSIGNED PHYSICAL DEVICE PER IOBYTE.
	JMP  CONSTAT	;CON: STATUS. NON-0 FOR CHR RDY
	JMP  CONIN	;CONSOLE IN TO A
	JMP  CONOUT	;CONSOLE OUT FROM C
	JMP  LIST	;LIST OUT FROM C
	JMP  PUNCH	;PUNCH OUT FROM C
	JMP  READER	;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  SELDSK	;SELECT DRIVE (C)+1
	JMP  SETTRK	;SELECT TRACK (C)
	JMP  SETSEC	;SELECT SECTOR (C)
	JMP  SETDMA	;SET BUFFER ADDRESS (BC)
	JMP  READ	;READ SECTOR, RET A=0 IF OK
	JMP  WRITE	;WRITE SECTOR
    ;GENERAL AND MISCELLANEOUS
	JMP $		;EMPTY NOW
	JMP  SYSTOP	;POINTER TO WHERE BOOT STASHED
			;PRESERVE TABLE WHILE BOOTING
	DB   2,02,0	;SIGNATURE - DO NOT CHANGE
    ;POINTERS TO MEMORY AREAS, NOT ENTRY POINTS:
	JMP  PTABLE	;POINTER TO WARM BOOT PRESERVE TABLE
			;PROGRAMS USE THIS TO ACCESS TABLE
	JMP  FREE	;MOUNT SPACE POINTER, USED BY BDOS

	;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.  NOTE THAT BDOS
;   SOMETIMES PERFORMS ADDITIONAL FUNCTIONS, SUCH AS
;   ECHOING CONSOLE CHARACTERS.
;
;   ALL CLOBBER DE, SOME CLOBBER OTHER REGS.

;
; CONSOLE STATUS
;
CONSTAT: 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
;
CONIN:	CALL DISPATCH
	 DB	1	;USE IOBYTE BITS 1-0
	 DW  TTYIN	 ;00 - TTY:
	 DW  LSCRTIN	 ;01 - CRT:
	 ;CHANGE TO 'CRTIN' TO GET RID OF SPECIAL FEATURE
	 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
;
LIST:	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
;
PUNCH:	CALL DISPATCH
	 DB	5	;USE IOBYTE BITS 5-4
	 DW  TTYOUT	 ;00 - TTY:
	 DW  PUNO	 ;01 - HIGH SPEED PUNCH
			    ;(USER IMPLEMENTED)
	 DW  CRTOUT	 ;10 - UP1: USES CRT:
		;IN LIEU OF USER-IMPLEMENTED DRIVER
	 DW  VIO$OUTPUT	 ;11 - VK1: (VIDEO OUTPUT)
;
; READER IN
;
READER:	CALL DISPATCH
	 DB	7	;USE IOBYTE BITS 3-2
	 DW  TTYIN	 ;00 - TTY:
	 DW  RDRIN	 ;01 - HIGH SPEED READER
			    ;(USER IMPLEMENTED)
	 DW  CRTIN	 ;10 - UR1:  USES CRT: IN
		;LIEU OF USER-IMPLEMENTED DRIVER
	 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 (VIA LSCRTIN) FOR CRT:,
;    ALSO USED FOR 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
;
;MORE CONVENIENT CRT INPUT FOR LEAR-SIEGLER ADM-3
LSCRTIN:
	CALL CRTIN	;GET CHAR FROM REGULAR ROUTINE
;IGNORE BREAK KEY - ITS EASY TO FUMBLE AND HIT IT
	JZ   LSCRTIN
;TO CONVERT UNDERLINE (ARROW ON OLD KEYBOARDS) TO RUBOUT
;SO IT ISN'T NECESSARY TO USE SHIFT KEY TO CORRECT ERRS
;INSERT THESE INSTRUCTIONS:
	;CPI UNDERLINE
	;RNZ
	;MVI A,RUBOUT
	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
	;PAGE
;
; 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
	PUSH H		;PRESERVE HL FOR CONOMSG SUBR
	LXI H,0
	DAD SP		;GET CALLER'S STACK POINTER
	LXI SP,VIOSTACK	;SET UP OUR OWN
	PUSH H		;SAVE CALLER'S
	CALL VIOADR	;DO IT!
	POP H
	SPHL
	POP H
	RET
;
; LINE PRINTER OUT
;
LPTOUT2: PUSH B		; ERROR RETRY FOR LPTOUT
	LXI D,PRINTMSG	;"LPT NOT READY"
	MVI C,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

	MVI  B,0		;BUSY TIME-OUT COUNTER
LPTOUT0: IN   PRINTER	;THIS GETS: FF, NO LPT INTERFACE,
	 ;F4: READY, F0: BUSY, NO PAPER, COVER OPEN, &C.
	CPI  0FFH
	JZ   LPTOUT2	;NO PRINTER, USE "HUNG" MSG
	DCR  B		;ON TIME-OUT,
	JZ   LPTOUT2	;PRINT MESSAGE AND AWAIT INPUT
	ANI  04H	;CHECK "READY" BIT
	JZ   LPTOUT0	;IF NOT READY, TRY TILL TIME-OUT
	MOV  A,C	;THE CHARACTER
	OUT  PRINTER	;OUTPUT IT!
	RET

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.


INIT:	;ENTRY FROM BOOT.

	; ON ARRIVAL HERE, REGISTERS CONTAIN:
	;    B = 0 IF VIO PRESENT
	;    C = FF IF COLD START
	;    D = # DIO'S (0, 1, OR 2)

	MOV E,B		;MOVE VIO FLAG TO E
	XCHG		;MOVE FLAGS TO HL
	SHLD VIOF	;SET VIOF (L) AND DIOF (H)

; INIT LINE PRINTER

	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:
	INR C
	JNZ CCPW	;DONE IF WARM START:
			; GO TO CCP
	;PAGE

;SYSTEM INITIALIZATION, BIOS PORTION, CONTINUED.

; GET HERE AFTER COLD START ONLY.
; H=# DIOS, L=ZERO IF VIO PRESENT

; 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:	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 CCPC	;CONTINUE IN CCP


	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 "INIT".  READ COMMENTS
;3 PAGES BACK.

BIOSEND:
	;PAGE

;IF USER-ADDED CODE CAUSES "BIOSLEN" (BELOW) TO BE OTHER
; THAN "BIOSLEN" DEFINED IN "BOOT" (SEE LISTING THEREOF)
; THEN THE BIOSLEN IN BOOT MUST BE CHANGED, AND THE
; NEW BOOT INCORPORATED IN THE SYSTEM, IN ORDER
; TO CAUSE ALL OF BIOS TO LOAD WHEN THE SYSTEM IS BOOTED.


SYSTOP	EQU	(BIOSEND+0FFH) AND 0FF00H
BIOSLEN EQU	SYSTOP-BIOS

;ALSO NOTE THAT THERE MUST BE AT LEAST 100H BYTES OF PHYSICAL
; RAM ABOVE THE END OF BIOS, AS DEFINED BY THE "SYSTOP"
; EQUATE.  THIS RAM IS USED BY BOOT TO STORE THE
; "PRESERVE TABLE" WHILE REBOOTING.  THIS REQUIREMENT
; GENERALLY MEANS THAT IF BIOSLEN IS INCREASED, THE SYSTEM
; MUST BE RELOCATED DOWNWARD BEFORE MODIFICATION BY GIVING
; AND ADDITIONAL "M" OPTION IN THE "RELOC" COMMAND, AND
; BY ADJUSTING "MEMTOP" AND "EMS" IN BOOT.ASM AND
; BIOS.ASM TO CORRESPOND.


; ******************************************************
;
; STORAGE AREAS USED AFTER INITIALIZATION, OVERLAYING
; AND EXTENDING BEYOND INITIALIZATION CODE:
;
;    1) STARTING AT THE LABEL "INIT", BDOS USES:
;	A) 128-BYTE SYSTEM BUFFER
;	B) MOUNT SPACE, FOLLOWING SYSTEM BUFFER
;
; THE LOCATION OF THESE AREAS IS OBTAINED BY BDOS FROM THE
; "JMP FREE" AT BIOS+39 ON PAGE 5 OF THIS LISTING.
; "FREE" IS DEFINED HERE:

FREE	EQU	INIT+128

;    2) ALSO THE SAME AREA CONTAINING BDOS'S SYSTEM
;       BUFFER IS USED AS A STACK WHEN BIOS IS OUTPUTTING
;       TO THE VIO, BECAUSE THE VIO USES MORE STACK THAN
;       IT IS REASONABLE TO ASSUME THE CALLING PROGRAM
;       CONTAINS.

VIOSTACK EQU   INIT+128


;    3) ANOTHER USE OF RAM ABOVE "INIT" IS BY BOOT TO
;       SAVE THE "PRESERVE TABLE", AS MENTIONED IN
;	VARIOUS COMMENTS ELSEWHERE.

	;PAGE

;THE MOUNT SPACE WHICH BEGINS AT "FREE" EXTENDS TO THE
;  ACTUAL END OF PHYSICAL MEMORY, WHICH IS NORMALLY
;  THE SAME AS "MEMTOP" BUT NOTHING FORCES IT TO BE.
;ASSUMING PHYSICAL MEMORY DOES END AT MEMTOP, THE
;  FOLLOWING EQUATE CAUSES THE AMOUNT OF MOUNT SPACE
;  TO BE COMPUTED AND PRINTED ON THE ASSEMBLY LISTING:

XXX	EQU	MEMTOP - FREE

;APPROXIMATE MOUNT SPACE REQUIREMENTS:
;  PER DUAL DENSITY DISK MOUNTED: 4BH BYTES
;  PER SINGLE DENS DISK MOUNTED:  4AH BYTES
;  PER MINIFLOPPY MOUNTED:        34H BYTES
;THE SYSTEM WILL NOT COME UP WITH LESS THAN ONE
;  DRIVE'S WORTH OF MOUNT SPACE;  THE RECOMMENDED
;  AMOUNT IS ENOUGH FOR ALL YOUR DRIVES, OR,
;  IF YOU HAVE A LARGE NUMBER OF DRIVES, ENOUGH FOR
;  THE MAXIMUM NUMBER YOU WILL EVER WANT
;  TO ACCESS SIMULTANEIOUSLY.


	END
