176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;-----------------------------------------------------------------------------
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; ElTorito.asm
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; El Torito Bootable CD-ROM driver which does not reset the CD-ROM drive upon
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; loading, but instead accesses the drive through BIOS system calls
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; MIT License
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; (c) 2000 by Gary Tong
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; (c) 2001-2009 by Bart Lagerweij
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Permission is hereby granted, free of charge, to any person obtaining a copy
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; of this software and associated documentation files (the "Software"), to deal
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; in the Software without restriction, including without limitation the rights
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; copies of the Software, and to permit persons to whom the Software is
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; furnished to do so, subject to the following conditions:
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; The above copyright notice and this permission notice shall be included in
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; all copies or substantial portions of the Software.
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; THE SOFTWARE.
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;-----------------------------------------------------------------------------
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; To assemble and link, use these commands with NASM 2.x:
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;   nasm -Ox -f bin -o eltorito.sys eltorito.asm
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; To enable Trace markers uncomment the line below
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; DEBUG_TRACERS=1
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; To enable debug info uncomment the line below
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; DEBUG=1
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG_TRACERS
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman %macro	TRACER	1
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call debug_tracer
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	db %1
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman %endmacro
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%else
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman %macro	TRACER	1
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman %endmacro
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif	; DEBUG_TRACERS
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define	Ver	'1.5'
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define CR	0DH, 0Ah
5476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRPolyH		equ	0EDB8h
5576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRPolyL		equ	08320h
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		section .text align=16
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		org	0
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCdrom:
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNextDriver	dd	-1			;-+
6576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanAttributes	dw	0C800h			; |
6676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPointers	dw	Strategy		; |
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Commands		; |   MSCDEX requires this
6876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDeviceName	db	'ELTORITO'		; |  data in these locations
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	0			; |
7076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDriveLetter	db	0			; |
7176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNumUnitsSupp	db	1			;-+
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDriverName	db	'El-Torito CD-ROM Device Driver',0
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		align 4, db 0
7576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReqHdrLoc	dd	0
7676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanXferAddr	dd	0
7776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanChecksum	dd	-1
7876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDriveNumber	db	0
7976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadBytes	db	0			;0 --> 2048 bytes/sector
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;1 --> 1024 bytes/sector
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;2 -->  512 bytes/sector
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRoutines	dw	Init		;Init		;0
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;MediaCheck	;1
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;BuildBPB	;2
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	IoctlInput	;IoctlInput	;3
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;Input		;4
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;NonDesInput	;5
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;InputStatus	;6
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;InputFlush	;7
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;Output		;8
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;OutputVerify	;9
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;OutputStatus	;10
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;OutputFlush	;11
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	IoctlOutput	;IoctlOutput	;12
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	DoNothing	;DeviceOpen	;13
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	DoNothing	;DeviceClose	;14
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	ReadL		;ReadL		;128
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanIoctlICtrl	dw	Raddr		;Raddr		;0
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;LocHead	;1
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;(Reserved)	;2
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;ErrStat	;3
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	Unsupported	;AudInfo	;4
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	DrvBytes		;DrvBytes	;5
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	DevStat		;DevStat	;6
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	SectSize		;SectSize	;7
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	VolSize		;VolSize	;8
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw	MedChng		;MedChng	;9
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSpecPkt		times	19	db	0	; offset 77h in 1.4
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		times	13	db	0	; unknown extra 00s in 1.4
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanGreeting	db	'El-Torito Bootable CD-ROM Driver for Dos v',Ver,', http://www.nu2.nu/eltorito/',CR
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db	'  (c) 2000 by Gary Tong',CR
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db	'  (c) 2001-2002 by Bart Lagerweij',CR,0
11776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDblSpace	db	'  ',0
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanStrategy:
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [cs:ReqHdrLoc],bx
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [cs:ReqHdrLoc+2],es
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retf
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCommands:
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	ax
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	bx
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	cx
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	dx
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	si
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	di
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	bp
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		pushad
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	ds
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	es
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'C'
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cld				;Clear direction
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		sti				;Enable interrupts
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax, cs			;ds=cs
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ds, ax
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		les	bx,[ReqHdrLoc]	;seg:offset ptr into es:bx
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor	ax,ax
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al,[es:bx+2]		;Get Command code
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_hex8
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	al,15
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jb	Mult2			;If 0-14
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	al,128
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jb 	UnknownCmd		;If 15-127
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	al,129
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jb	ShiftDown		;If 128
16276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanUnknownCmd:	mov	al,121			;8 = Unsupported (Reserved)
16376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanShiftDown:	sub	al,113			;128 --> 15, 121 --> 8
16476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMult2:		shl	al,1			;Convert into offset (*2)
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	di,Routines
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add	di,ax
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call 	word [di]		;Execute desired command
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		or	ax,100h			;Set Return Status's Done bit
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		lds	bx,[ReqHdrLoc]		;seg:offset ptr into ds:bx
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	[bx+3],ax		;Save Status
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	byte [cs:buffer+2048], 96h
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je	buffer_ok
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al, '!'
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_char
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp	$
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanbuffer_ok:
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'c'
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	es
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	ds
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		popad
18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	bp
18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	di
18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	si
18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	dx
18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	cx
19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	bx
19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	ax
19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retf
19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanUnsupported:			;Unsupported Command
19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,8003h		;Set Status Error bit,
20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'U'
20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'C'
20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn				;   Error 3 = Unknown Command
20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanIoctlInput:			;IOCTL Input Routine
20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	di,[es:bx+14]		;es:bx --> Request Header
21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	es,[es:bx+16]		;Get Xfer Address into es:di
21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor	ax,ax			;Get Control Block Code
21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al,[es:di]
21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG
21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	TRACER 'I'
21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	TRACER 'O'
21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call	print_hex8
21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif
21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	al,10
21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jb	UnkIoctlI		;If 0-9
22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al,2			;Map to Unsupported
22176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanUnkIoctlI:	shl	al,1			;Convert into offset (*2)
22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,IoctlICtrl
22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add	si,ax
22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call 	word [si]		;Execute desired command
22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRaddr:			;Return Device Header Address
23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'A'
23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [es:di+1],0
23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	[es:di+3],cs
23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor	ax, ax			;Set Return Status = success
23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'a'
23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDrvBytes:			;Read Drive Bytes
24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'B'
24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	di			;Save original Xfer Addr
24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add	di,2			;Point to 1st dest byte
24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,Greeting	;Point to Greeting
24876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDrvB:		movsb				;Copy over a byte
24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	byte [si],13	;Is next char a CR?
25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne	DrvB			;Loop if not
25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		sub	di,2			;Get #bytes copied into ax
25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,di
25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	di			;Retrieve original Xfer Addr
25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		sub	ax,di
25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	byte [es:di+1],al	;and save it
25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,0			;Set Return Status = success
25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'b'
25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDevStat:			;Return Device Status
26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'D'
26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [es:di+1],202h	;Door closed
26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [es:di+3],0	;Door unlocked
26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;Supports only cooked reading
27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;Read only
27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;Data read only
27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;No interleaving
27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;No prefetching
27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;No audio channel manipulation
27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;Supports both HSG and Redbook
27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;  addressing modes
27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor	ax, ax			;Set Return Status = success
27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'd'
28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSectSize:			;Return Sector Size
28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'S'
28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [es:di+2],2048
28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,0			;Set Return Status = success
29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 's'
29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanVolSize:			;Return Volume Size
29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'V'
29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	PriVolDesc		;Get and Check Primary Volume
30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;  Descriptor
30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,800Fh		;Assume Invalid Disk Change
30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jc	VolExit			;If Read Failure
30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,word [Buffer+80]	;Read Successful
30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [es:di+1],ax	;Copy over Volume Size
30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,word [Buffer+82]
30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [es:di+3],ax
30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,0			;Set Return Status = success
30976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanVolExit:
31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'v'
31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMedChng:			;Return Media Changed Status
31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'M'
31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	PriVolDesc		;Get and Check Primary Volume
32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;  Descriptor
32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	byte [es:di+1],-1	;Assume Media Changed
32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,800Fh		;  and Invalid Disk Change
32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jc	MedExit			;If Media Changed or Bad
32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	byte [es:di+1],1	;Media has not changed
32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,0			;Set Return Status = success
32776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMedExit:
32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'm'
32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
33476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriVolDesc:			;Get and Check Primary Volume
33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;  Descriptor
33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'P'
33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,cs			;Set ds:si --> SpecPkt
33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ds,ax
33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	cx, 5
34176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriVolAgain:
34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	byte [SpecPkt],16	;SpecPkt Size
34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	byte [SpecPkt+1],0	;Reserved
34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+2],1	;Transfer one 2048-byte sector
34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	cx
34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	cl,byte [ReadBytes]	;Multiply by 4 if reading 512
34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shl	word [SpecPkt+2],cl	;  bytes at a time
34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	cx
34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+6],cs	;Into our Buffer
35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+4], Buffer
35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+8],16	;From CD Sector 16
35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+10],0
35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+12],0
35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+14],0
35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si, SpecPkt
35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	dl, [DriveNumber]
35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ah, 42h			;Extended Read
35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int	13h
36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnc	PriVolPass		;If success
36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		TRACER '1'
36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; read error
36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		loop	PriVolAgain
36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER '2'
36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; read retries exhausted
36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; flow into below
36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp	PriReadErr
37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriVolPass:
37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,Buffer	;Point input to Buffer
37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,-1			;Init Checksum registers
37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	bx,ax			;  bx,ax = 0FFFFFFFFh
37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jc	PriNew			;If Read Failure
37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	di			;Read Successful,
37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;  so Calculate Checksum
37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	di,1024			;Init Word counter
38076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriWord:	mov	dx,[cs:si]		;Grab next word from buffer
38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	cx,16			;Init bit counter
38276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriBit:		shr	dx,1			;Shift everything right 1 bit
38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		rcr	bx,1
38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		rcr	ax,1
38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnc	NoMult			;If a zero shifted out
38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor	bx,RPolyH		;A one shifted out, so XOR
38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor	ax,RPolyL		;  Checksum with RPoly
38976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNoMult:
39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		loop	PriBit
39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add	si,2			;Inc Word Pointer
39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dec	di
39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ja	PriWord
39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER '3'
39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	di			;Checksum calculation complete
39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	bx,[Checksum+2]		;Has Checksum changed?
39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne	PriNew			;If Checksum Changed
40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	ax,[Checksum]
40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne	PriNew			;If Checksum Changed
40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		clc				;Checksum not changed, CF=0
40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,0			;Status = success
40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp	PriOld
40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriReadErr:
40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	WORD [Checksum+2],bx		;Save New Checksum
41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	[Checksum],ax		;  or 0FFFFFFFFh if bad read
41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		stc				;Checksum change, CF=1
41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax, 800bh		;Status = read fault
41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp	PriOld
41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
41576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriNew:		mov	WORD [Checksum+2],bx		;Save New Checksum
41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	[Checksum],ax		;  or 0FFFFFFFFh if bad read
41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		stc				;Checksum Changed, CF=1
41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,800Fh		;Status = Invalid Media Change
41976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriOld:
42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'p'
42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanIoctlOutput:			;IOCTL Output Routine
42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'O'
42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	di,[es:bx+14]		;es:bx --> Request Header
43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	es,[es:bx+16]		;Get Xfer Address into es:di
43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor	ax,ax			;Get Control Block Code
43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al,[es:di]
43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	al,2
43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne	UnkIoctlO		;If not 2 (ResetDrv)
43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	DoNothing		;Reset Drive
43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp	IoctlODone
43776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanUnkIoctlO:
43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	Unsupported		;Unsupported command
43976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanIoctlODone:
44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'o'
44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
44676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDoNothing:			;Do Nothing Command
44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,0			;Set Return Status = success
44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadL:			;Read Long Command
45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'R'
45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,cs			;Set ds=cs
45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ds,ax
45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;es:bx --> Request Header
46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	byte [es:bx+24],0	;Check Data Read Mode
46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne	ReadLErr		;If Cooked Mode
46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	byte [es:bx+13],2	;Check Addressing Mode
46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jb	ReadLOK			;If HSG or Redbook Mode
46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
46676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLErr:
46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER '8'
46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,8003h		;Set Return Status = Unknown
46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp	ReadLExit		;  Command Error and exit
47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLOK:
47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,[es:bx+20]		;Get Starting Sector Number,
47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	dx,[es:bx+22]		;  Assume HSG Addressing Mode
47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	byte [es:bx+13],0	;Check Addressing Mode again
47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je	ReadLHSG		;If HSG Addressing Mode
47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER '7'
47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		;Using Redbook Addressing Mode.  Convert to HSG format
47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al,dl			;Get Minutes
48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	dl,60
48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mul	dl			;ax = Minutes * 60
48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add	al,byte [es:bx+21]	;Add in Seconds
48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		adc	ah,0
48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	dx,75			;dx:ax =
48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mul	dx			;  ((Min * 60) + Sec) * 75
48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add	al,byte [es:bx+20]	;Add in Frames
48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		adc	ah,0
48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		adc	dx,0
48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		sub	ax,150			;Subtract 2-Second offset
49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		sbb	dx,0			;dx:ax = HSG Starting Sector
49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLHSG:
49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+8], ax	;Store Starting
49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+10], dx	;  Sector Number
49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+12], 0	;  (HSG Format)
49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+14], 0
49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,[es:bx+14]		;Get Transfer Address
49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+4],ax
50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,[es:bx+16]
50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+6],ax
50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	byte [SpecPkt],16	;Size of Disk Address Packet
50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	byte [SpecPkt+1],0	;Reserved
50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	cx, 5
50776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLAgain:
50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,[es:bx+18]		;Get number of sectors to read
50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+2],ax
51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	ax, 3FFFh		;Too large?
51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ja	ReadLBad		;If yes
51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	cx
51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	cl,byte [ReadBytes]	;Multiply by 4 if reading 512
51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shl	word [SpecPkt+2],cl	;  bytes at a time
51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	cx
51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG
51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	ax
52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	cx
52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	si
52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	cx, 16
52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,SpecPkt
52476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadDump:	mov	al, ' '
52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_char
52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al, byte [si]	;Hexdump a SpecPkt byte
52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_hex8
52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		inc	si			;Point to next byte
52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		loop	ReadDump
53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	si
53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	cx
53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	ax
53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif
53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,SpecPkt
53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	dl,[DriveNumber]
53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ah,42h			;Extended Read
53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int	13h
53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnc	ReadLGd			;If success
53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
54076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;hang:
54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		jmp	hang
54276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		TRACER '1'
54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		loop	ReadLAgain
54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER '2'
54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp short ReadLBad
54676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLGd:
54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER '3'
54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor	ax, ax 			;Status 0 = success
54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp short ReadLExit
55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
55176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLBad:
55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER '9'
55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax, 800Bh		;Set Read Fault Error
55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; flow into ReadLExit
55576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLExit:
55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'r'
55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG_TRACERS
56276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmandebug_tracer:	pushad
56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pushfd
56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al, '['
56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ah,0Eh			;BIOS video teletype output
56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor	bh, bh
56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int	10h			;Print it
56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	bp,sp
57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	bx,[bp+9*4]		; Get return address
57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al,[cs:bx]		; Get data byte
57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		inc	word [bp+9*4]	; Return to after data byte
57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ah,0Eh			;BIOS video teletype output
57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor	bh, bh
57776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int	10h			;Print it
57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al, ']'
58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ah,0Eh			;BIOS video teletype output
58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor	bh, bh
58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int	10h			;Print it
58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		popfd
58576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		popad
58676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif
58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;-----------------------------------------------------------------------------
59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; PRINT_HEX4
59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;-----------------------------------------------------------------------------
59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print a 4 bits integer in hex
59376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Input:
59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;	AL - 4 bits integer to print (low)
59676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
59776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Output: None
59876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
59976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Registers destroyed: None
60076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
60176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_hex4:
60276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
60376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	push	ax
60476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	and	al, 0fh		; we only need the first nibble
60576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	cmp	al, 10
60676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	jae	hex_A_F
60776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	add	al, '0'
60876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	jmp	hex_0_9
60976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanhex_A_F:
61076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	add	al, 'A'-10
61176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanhex_0_9:
61276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call	print_char
61376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	pop	ax
61476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	retn
61576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
61676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
61776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;-----------------------------------------------------------------------------
61876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print_hex8
61976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;-----------------------------------------------------------------------------
62076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print	a 8 bits integer in hex
62176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
62276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Input:
62376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;	AL - 8 bits integer to print
62476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
62576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Output: None
62676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
62776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Registers destroyed: None
62876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
62976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_hex8:
63076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
63176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	push	ax
63276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	push	bx
63376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
63476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	mov	ah, al
63576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	shr	al, 4
63676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call	print_hex4
63776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
63876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	mov	al, ah
63976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	and	al, 0fh
64076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call	print_hex4
64176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
64276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	pop	bx
64376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	pop	ax
64476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	retn
64576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
64676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
64776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
64876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print_hex16 - print a 16 bits integer in hex
64976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
65076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Input:
65176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;	AX - 16 bits integer to print
65276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
65376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Output: None
65476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
65576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Registers destroyed: None
65676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
65776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_hex16:
65876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
65976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	push	ax
66076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	push	bx
66176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	push	cx
66276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
66376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	mov	cx, 4
66476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_hex16_loop:
66576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	rol	ax, 4
66676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call	print_hex4
66776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	loop	print_hex16_loop
66876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
66976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	pop	cx
67076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	pop	bx
67176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	pop	ax
67276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	retn
67376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
67476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
67576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print_hex32 - print a 32 bits integer in hex
67676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
67776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Input:
67876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;	EAX - 32 bits integer to print
67976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
68076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Output: None
68176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
68276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Registers destroyed: None
68376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
68476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_hex32:
68576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
68676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	push	eax
68776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	push	bx
68876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	push	cx
68976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
69076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	mov	cx, 8
69176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_hex32_loop:
69276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	rol	eax, 4
69376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call	print_hex4
69476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	loop	print_hex32_loop
69576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
69676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	pop	cx
69776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	pop	bx
69876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	pop	eax
69976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	retn
70076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
70176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
70276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print_string - print string at current cursor location
70376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
70476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Input:
70576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;	DS:SI - ASCIIZ string to print
70676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
70776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Output: None
70876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
70976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Registers destroyed: None
71076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
71176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_string:
71276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	ax
71376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	si
71476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
71576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_string_again:
71676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al, [si]
71776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		or	al, al
71876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jz	print_string_exit
71976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_char
72076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		inc	si
72176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp	print_string_again
72276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
72376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_string_exit:
72476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	si
72576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	ax
72676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
72776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
72876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;-----------------------------------------------------------------------------
72976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; PRINT_CHAR
73076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;-----------------------------------------------------------------------------
73176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Print's a character at current cursor position
73276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
73376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Input:
73476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;	AL - Character to print
73576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
73676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Output: None
73776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
73876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Registers destroyed: None
73976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
74076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_char:
74176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
74276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	ax
74376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	bx
74476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
74576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ah,0Eh			;BIOS video teletype output
74676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor	bh, bh
74776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int	10h			;Print it
74876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
74976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_char_exit:
75076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	bx
75176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	ax
75276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
75376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
75476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
75576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
75676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
75776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;This space is used as a 2048-byte read buffer plus one test byte.
75876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;The 96h data is used for testing the number of bytes returned by an Extended
75976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;  CD-ROM sector read
76076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
76176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		align	16, db 0
76276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanBuffer		times	2049	db	96h
76376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
76476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
76576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
76676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInit:			;Initialization Routine
76776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
76876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'I'
76976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,cs			;ds=cs
77076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ds,ax
77176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
77276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG
77376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print CS value (load segment)
77476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_hex16
77576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif
77676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
77776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si, Greeting	;Display Greeting
77876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
77976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
78076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,Unsupported	;Init is executed only once
78176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	[Routines],ax
78276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
78376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax, 5400h
78476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int	13h			; Get diskemu status
78576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jc	FindBoot		; If CF=1 no diskemu loaded
78676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
78776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	[DriveNumber], cl		; Store drive number
78876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
78976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	keyflag
79076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and	al, 8			; alt key ?
79176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jz	extread
79276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
79376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si, DrvNumMsg	; Display "drive number="
79476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
79576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al, [DriveNumber]
79676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_hex8
79776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si, LineEnd	; CR/LF
79876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
79976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp	extread
80076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
80176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Diskemu is not loaded
80276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; so loop to find drive number
80376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; *** start of 1.4 changes ***
80476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; ??? mov dl, 0ffh		;Start at Drive 0xff
80576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; *** FindBoot at c47 in 1.4, at c0c in 1.3 ***
80676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFindBoot:	call	ScanDrives		; call new helper in 1.4
80776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnc	FoundBoot		; ded*df3
80876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		mov	si,offset SpecPkt	;Locate booted CD-ROM drive
80976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		mov	[SpecPkt],0		;Clear 1st byte of SpecPkt
81076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		mov	ax,4B01h		;Get Bootable CD-ROM Status
81176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		int	13h
81276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		jnc	FindPass		;If booted CD found
81376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
81476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Carry is not cleared in buggy Dell BIOSes,
81576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; so I'm checking packet size byte
81676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; some bogus bioses (Dell Inspiron 2500) returns packet size 0xff when failed
81776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Dell Dimension XPsT returns packet size 0x14 when OK
81876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
81976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		cmp	[SpecPkt], 0
82076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		jne	FoundBoot
82176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
82276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		cmp	[SpecPkt], 13h	; anything between 13h and 20h should be OK
82376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		jb	FindFail
82476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		cmp	[SpecPkt], 20h
82576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		ja	FindFail
82676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		jmp	short FoundBoot
82776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
82876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; FindFail:
82976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		dec	dl			;Next drive
83076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		cmp	dl, 80h
83176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		jae	FindBoot		;Check from ffh..80h
83276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; *** end of 1.4 changes ***
83376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
83476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,NoBootCD	;No booted CD found,
83576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
83676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp	NoEndAddr		;Do not install driver
83776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
83876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFoundBoot:
83976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;		mov	dl, [SpecPkt+2]		; 1.4 change
84076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; *** next line at c57 in 1.4, at c3d in 1.3 ***
84176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	[DriveNumber],dl		;Booted CD-ROM found,
84276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;  so save Drive #
84376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
84476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	keyflag
84576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and	al, 8			; alt key ?
84676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jz	extread
84776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
84876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si, CDStat
84976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
85076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si, SpecPkt	;Point to returned CD SpecPkt
85176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	cx, 19			;  containing 19 bytes
85276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanStatDump:	mov	al, ' '			;Print a space
85376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_char
85476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al, byte [si]	;Hexdump a SpecPkt byte
85576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_hex8
85676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		inc	si			;Point to next byte
85776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		loop	StatDump
85876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
85976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si, LineEnd	;Print a CR/LF
86076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
86176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
86276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextread:
86376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;See how many CD Sector bytes are returned by an Extended Read
86476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	byte [SpecPkt],16	;SpecPkt Size
86576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	byte [SpecPkt+1],0	;Reserved
86676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+2],1	;Transfer one sector
86776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+6],cs	;Into our Buffer
86876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+4],Buffer
86976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+8],16	;From CD Sector 16
87076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+10],0
87176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+12],0
87276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	word [SpecPkt+14],0
87376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
87476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si, SpecPkt	;Set ds:si --> SpecPkt
87576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	dl, [DriveNumber]
87676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ah, 42h			;Extended Read
87776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int	13h
87876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnc	SecSize			;If success
87976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
88076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ah, 42h			;Always make 2 read attempts
88176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int	13h
88276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						;How many bytes did we get?
88376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSecSize:	std				;Count down
88476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,cs			;Point to end of Buffer
88576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	es,ax
88676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	di,Buffer+2047	;Find end of read data
88776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,Buffer+2048
88876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	cx,2049
88976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		repe	cmpsb			;cx = number of bytes read
89076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
89176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cld				;Restore count direction to up
89276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,CDBytes	;Display number of bytes read
89376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
89476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
89576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al, [DriveNumber]
89676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_hex8
89776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
89876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,CDBytesA	;Remainder A of message
89976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
90076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
90176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al,ch			;Hex-dump cx
90276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and	al,0Fh			;Second nibble
90376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_hex8		;  (don't need the First)
90476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	al,cl
90576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_hex8		;  (don't need the First)
90676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
90776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,CDBytesB	;Remainder B of message
90876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
90976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
91076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	cx,2048			;Did we read 2048 bytes?
91176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je	ParseParm		;If yes <-- O.K.
91276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
91376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	byte [ReadBytes],1
91476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	cx,1024			;Did we read 1024 bytes?
91576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je	ParseParm		;If yes <-- O.K.
91676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
91776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	byte [ReadBytes],2
91876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	cx,512			;Did we read 512 bytes?
91976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne	NoEndAddr		;If not, do not load driver
92076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
92176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanParseParm:	mov	bx,word [cs:ReqHdrLoc]	;Parse command line
92276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	es,word [cs:ReqHdrLoc+2]	;  parameters
92376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,[es:bx+18]		;Get BPB array ptr into DS:SI
92476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ds,[es:bx+20]
92576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFindParm:	inc	si
92676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFindParm1:	cmp	byte [si],0Dh	;CR? (End of parameters)
92776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je	EndOfParms
92876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
92976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	byte [si],0Ah	;LF?
93076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je	EndOfParms
93176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
93276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	byte [si],'/'	;A parameter?
93376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne	FindParm
93476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
93576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		inc	si
93676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	byte [si],'D'	;Device Name parameter?
93776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne	FindParm1
93876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
93976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		inc	si
94076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	byte [si],':'
94176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne	FindParm1
94276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
94376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;bbb
94476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	si
94576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si, DevName	;Device Name is at ds:si
94676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	ds			;Keep ptr to Device Name
94776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax, cs
94876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ds, ax
94976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
95076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	ds			;Retrieve Device Name ptr
95176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	si
95276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	cx, 8			;Get next 8 chars
95376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		inc	si			;  = Device Name
95476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax, cs
95576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	es, ax
95676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	di, DeviceName
95776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNextChar:	cmp	byte [si],' '
95876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ja	AboveSpace
95976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
96076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,cs			;Pad end of Device Name with
96176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ds,ax			;  spaces if necessary
96276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,DblSpace	;A space
96376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanAboveSpace:	mov	al, [si]
96476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_char
96576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		movsb				;ds:[si] --> es:[di]
96676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		loop 	NextChar
96776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
96876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,LineEnd
96976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,cs
97076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ds,ax
97176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
97276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
97376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,Init-2	;Last byte of driver to keep
97476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp	EndAddr			;Install driver
97576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
97676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEndOfParms:
97776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax, cs			; Restore segment registers (fix)
97876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ds, ax
97976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	es, ax
98076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
98176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si,NoDevName	;No Device Name Found
98276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
98376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
98476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNoEndAddr:	mov	ax,0			;Do not install driver
98576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
98676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEndAddr:	mov	es,[ReqHdrLoc+2]		;Write End Address
98776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	bx,[ReqHdrLoc]
98876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	[es:bx+14],ax
98976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	[es:bx+16],cs
99076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	bx,ax			;Hold onto install status
99176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
99276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si, DrvInst	;Display driver install status
99376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
99476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si, DrvInst1	;Assume driver installed
99576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	bx,0			;Was driver installed?
99676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne	DrvStatus		;If yes
99776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si, NoDrvInst	;Driver not installed
99876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDrvStatus:	call	print_string
99976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
100076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,0			;Set Return Status = success
100176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	bx,0			;Was INIT successful?
100276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne	InitStat		;If yes
100376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,800Ch		;Status = General Failure
100476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInitStat:
100576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	ax			;Save Return Status
100676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
100776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	keyflag
100876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and	al, 8			; alt key ?
100976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jz	InitExit
101076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
101176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanWaitHere:
101276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	si, WaitMsg	;Display Halted message
101376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	print_string
101476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
101576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanAltWait:
101676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	keyflag
101776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and	al, 8			; Alt key?
101876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnz	AltWait			; Pressed? yes -> wait
101976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
102076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInitExit:
102176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	ax			;Retrieve Return Status
102276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'i'
102376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn				;That's it for Init!
102476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
102576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; *** start 1.4 changes at ded ***
102676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSpecGo:		mov	si,SpecPkt
102776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int	13h
102876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
102976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
103076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanScanDrives:	push	ax		; at df3 in 1.4
103176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push	si
103276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov dl, 7fh		;Start at Drive 0x80
103376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNextDrv:	inc	dl
103476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		clc
103576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	ax,4B01h	;Get Bootable CD-ROM Status
103676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov	BYTE [SpecPkt],0	;Clear 1st byte of SpecPkt
103776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call	SpecGo
103876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Carry is not cleared in buggy Dell BIOSes,
103976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; so I'm checking packet size byte
104076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; some bogus bioses (Dell Inspiron 2500) returns packet size 0xff when failed
104176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Dell Dimension XPsT returns packet size 0x14 when OK
104276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
104376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	BYTE [SpecPkt], 13h	; anything between 13h and 20h should be OK
104476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jb	FindFail
104576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp	BYTE [SpecPkt], 20h
104676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ja	FindFail	; in 1.4 at e16
104776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp	short SendFound	; in 1.4 at e26
104876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
104976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFindFail:	cmp	dl, 0ffh
105076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je	SendFail		; Check from 80h..ffh
105176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp	short NextDrv		;Next drive
105276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSendFail:	xor	dl,dl
105376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		stc
105476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp	short ThingDone
105576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSendFound:	mov	dl, [SpecPkt+2]
105676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		clc
105776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanThingDone:	pop	si
105876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop	ax
105976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		retn
106076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; *** end 1.4 changes ***
106176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
106276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
106376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
106476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;------------------------------------------------------------
106576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; keyboard flags - return keyboard flags in AL
106676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; bit 3 = ALT key
106776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmankeyflag:	; at dbc in 1.3, at e2e in 1.4
106876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	push	bx
106976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	mov	ah, 2
107076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	int	16h
107176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	pop	bx
107276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	retn
107376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
107476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
107576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
107676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDrvNumMsg	db	'  Diskemxx.bin returned drive number=', 0
107776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNoBootCD	db	'  No booted CD-ROM found.',CR,0
107876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
107976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCDStat		db	'  INT 13h / AX=4B01h Specification Packet for '
108076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db	'Booted CD-ROM:',CR,'     ', 0
108176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
108276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCDBytes		db	'  Drive ', 0
108376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCDBytesA	db	' returns ', 0
108476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCDBytesB	db	'h bytes per Sector.',CR,0
108576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
108676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDevName		db	'  Device Name: ', 0
108776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNoDevName	db	'  No Device Name found. '
108876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db	'Usage: device=eltorito.sys /D:<DevName>',CR,0
108976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
109076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDrvInst		db	'  Driver ', 0
109176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNoDrvInst	db	7,'not '		;7 = Ctrl-G = Beep
109276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDrvInst1	db	'installed',CR,0
109376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
109476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanWaitMsg		db	'  Alt pressed, waiting...', CR, 0
109576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;ContMsg		db	'  Continuing...'
109676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLineEnd		db	CR,0
109776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
109876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
109976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;=============================================================================
1100