ORG 00H

        ; Version 0.5 alpha
        ; This code tested under MSDOS 6.22 only.
        ; This file intended to be installed sector 6
        ; My installation done using DISKEDIT from NU8.


	; Ports for normal IDE/ATA are
	; 0x1F0 Primary 	Irq 14
	; 0x170 Secondary	Irq 15
	; 0x1E8 Tertiary	Irq 11
	; 0x168 Quaternary	Irq 10

	; Secondary status register at Base+0x206 not used
	; because register not present on many ISA add-in 
	; cards and sound cards.

	; For the meaning of the remainder of the ID block
	; sent by devices in responce to the command please goto
	; http://www.t13.org and look up ATAPI4 or later.

BASEOFPORT	EQU	0168H
;BASEOFPORT	EQU	0170H

	; Check 0x168 for whether there is an HD present.

		CALL SAVEREGS
		CALL LF
		PUSH DS
		XOR AX,AX
		MOV DS,AX
		MOV AX,[04EH]
		CMP AX,[CS:CS_IN]
		JNE RUNONE

		MOV AX,040H
		MOV DS,AX
		MOV AL,[075H]
		DEC AL
		MOV [075H],AL

RUNONE		MOV DX,[CS:DRIVEHEAD]
		IN  AL,DX
		AND AL,0EFH
		OUT DX,AL
		CALL DELAY
		IN  AL,DX
		CMP AL,0FFH
		JNE  TESTHERE
		JMP NOTHERE
TESTHERE	MOV AL,0A5H
		MOV DX,[CS:SECTORCOUNT]
		OUT DX,AL
		IN  AL,DX
		CMP AL,0FFH
		JNE GOID
		JMP NOTHERE

GOID		CALL IDDRIVE
		CMP AL,00H
		JE NODRVS

		PUSH DS
		XOR AX,AX
		MOV DS,AX
		MOV AX,[04CH]
		MOV DX,[04EH]
		MOV [CS:OFS13],AX
		MOV [CS:SEG13],DX

		MOV AX,L13
		PUSH CS
		POP DX

		MOV [04CH],AX
		MOV [04EH],DX

		PUSH DX
		CALL LF
		MOV DX,OLD13
		CALL PRN_DX
		MOV DX,[CS:SEG13]
		MOV [CS:PRNWORD],DX
		CALL PRN_WORD
		CALL LF
		CALL PRN_SEG
		CALL PRN_FN
		MOV DX,MYMODIN
		CALL PRN_DX
		POP DX
;FIRST THE HD COUNT 40:75 NEEDS TO INC'D THEN ATTACH OUR INT 13 HANDLE	R
		MOV AX,040H
		MOV DS,AX
		MOV AL,[075H]
		OR AL,080H
		MOV [CS:OURDRIVE],AL
		INC BYTE [075H]
		POP DS

;	THIS IS WHERE THE REAL PARTITION SECTOR GETS LOADED AND JUMPED TO

NODRVS		CALL LF
		XOR AX,AX
		MOV ES,AX
		MOV BX,07C00H
		MOV DL,80H
		MOV DH,00H
		MOV CL,02H
		MOV CH,00H
		MOV AL,01H
		MOV AH,02H
		INT 013H		

		CALL	RTNREGS

		DB	0EAH
		DW	07C00H
		DW	00H

			JMP QUIT

MYMODIN		DB	'BO BIOS MOD INSTALLED',0DH,0AH,'$'

NOTHERE 	MOV DX,NTHR
		CALL PRN_DX
		JMP NODRVS
; 		LOCAL INT 13 WORK BEGINS HERE

WEBUSY		DB	00H
OLDMS		DB	00H
THISFUNC	DB	00H
THISAX		DW	00H

L13		CMP DL,[CS:OURDRIVE]
		JE ISOURS
		JMP NOTOURS
ISOURS		CLI
		MOV [CS:THISFUNC],AH
		MOV [CS:THISAX],AX
		CALL SAVEREGS
		PUSH AX
		MOV AX,01681H
		INT 02FH
		POP AX
		PUSH AX
		PUSH BX
		PUSH DI
		MOV BL,AH
		XOR BH,BH
		MOV DI,FUNCBUF
		MOV AL,[CS:BX+DI]
INC_AL		INC AL
		CMP AL,00H
		MOV [CS:BX+DI],AL
		CMP AL,00H
		JNE BUSYLOOP
		JMP INC_AL
BUSYLOOP	MOV AL,[CS:WEBUSY]
		CMP AL,00H
		JE NOTBUSY

		PUSH DX
		MOV DX,DRVBSY
		CALL LF
		CALL PRN_DX
		CALL DELAY
		POP DX
                PUSH AX
                XOR AX,AX
                INC AH
                INT 016H
                JZ NOKEY
                CMP AL,01BH
                JNE NOKEY
                DEC BYTE [CS:WEBUSY]

NOKEY		JMP BUSYLOOP

NOTBUSY		INC AL
		MOV [CS:WEBUSY],AL
		POP DI
		POP BX
		POP AX

		PUSH AX
		PUSH DX
		MOV DX,[CS:DRIVEHEAD]
		IN AL,DX
		MOV [CS:OLDMS],AL
		
L_UNDER80	POP DX
		POP AX

		CMP AH,00H
		JE L_1300	
		CMP AH,01H
		JE L_1301
		CMP AH,02H
		JE L_1302
		CMP AH,03H
		JE L_1303
		CMP AH,04H
		JE L_1304
		CMP AH,08H
		JE L_1308
		CMP AH,09H
		JE L_1309
		CMP AH,0AH
		JE L_130A
		CMP AH,0BH
		JE L_130B
		CMP AH,0CH
		JE L_130C
		CMP AH,0DH
		JE L_1300
		CMP AH,010H
		JE L_1300
		CMP AH,015H
		JE L_1315
		CMP AH,016H
		JE L_1300

		CMP AH,025H
		JE L_1325

		CMP AH,041H
		JE L_1341
		CMP AH,042H
		JE L_1342
		CMP AH,043H
		JE L_1343
		CMP AH,044H
		JE L_1344
		CMP AH,047H
		JE L_1347
		CMP AH,048H
		JE L_1348
		CMP AH,0FFH
		JE L_13FF

		MOV AH,01H
		JMP INTDONE


NOTOURS		NOP

		DB	0EAH
OFS13:		DW	00H
SEG13:		DW	00H

		JMP QUIT

L_1300		JMP L1300

L_1301		JMP L1301

L_1302		JMP L1302

L_1303		JMP L1303

L_1304		JMP L1304

L_1308		JMP L1308

L_1309		JMP L1309

L_130A		JMP L130A

L_130B		JMP L130B

L_130C		JMP L130C

L_1315		JMP L1315

L_1325		JMP L1325

L_1341		JMP L1341

L_1342		JMP L1342

L_1343		JMP L1343

L_1344		JMP L1344

L_1347		JMP L1347

L_1348		JMP L1348

L_13FF		JMP L13FF


INTDONE		MOV [CS:AH_IN],AH
		MOV DX,[CS:DRIVEHEAD]
		MOV AL,[CS:OLDMS]
		OUT DX,AL
		CALL DELAY
		CALL BSY0
		OUT DX,AL
		CALL DELAY
		CALL BSY0
		MOV AL,[CS:WEBUSY]
		DEC AL
		MOV [CS:WEBUSY],AL
		CLC
		CMP BYTE [CS:AH_IN],00H
		JNE INTDONEREGS
		STC
INTDONEREGS	PUSH AX
		MOV AX,01682H
		INT 02FH
		POP AX
		CALL RTNREGS
		CLC
		CMP BYTE [CS:THISFUNC],041H
		JE NOERREXIT
		CMP AH,00H
		JE NOERREXIT
		STC
NOERREXIT	STI
		PUSHF
		MOV [CS:TEMPAX],AX
		POP AX
		MOV [CS:TEMPFLG],AX
		POP AX
		MOV [CS:TEMPOFS],AX
		POP AX
		MOV [CS:TEMPSEG],AX
		POP AX
		MOV AX,[CS:TEMPFLG]
		PUSH AX
		MOV AX,[CS:TEMPSEG]
		PUSH AX
		MOV AX,[CS:TEMPOFS]
		PUSH AX
		MOV AX,[CS:TEMPAX]
		IRET

TEMPAX:		DW	00H
TEMPOFS:	DW	00H
TEMPSEG:	DW	00H
TEMPFLG:	DW	00H


L1300                          ; Reset Hard Disk
		JMP L130D

L1301				   ; Drive Status
		CLC
		MOV AH,[CS:ERRORBYTE]
		JMP INTDONE

WAITCOUNT:	DW	00H

L1302CMDERR:	DB	'READ COMMAND TIMEOUT ERROR',0DH,0AH,'$'

L1302ERR:	DB	00H

L1342		   ; Extended read

		CALL PARSEPACKET
		JC L1342ERRDONE
		JMP L1302CMD
L1342ERRDONE	JMP L1302ERRDONE

; MAYBE MAKE A GENERIC READ CALLABLE BLOCK
 		

L1302		; Read Sectors
		CALL RWSETUP
L1302CMD	CMP BYTE [CS:THISFUNC],042H
		JNE L1302GO
		NOP
;		MOV AX,[CS:THISAX]
;		MOV [CS:PRNWORD],AX
;		CALL LF
;		CALL LF
;		CALL LF
;		CALL PRN_WORD
;		CALL SPC
;		CALL PRN_WORD
;		CALL LF
;		CALL LF
;		CALL LF
;		MOV AH,0
;		INT 016H

L1302GO		MOV BYTE [CS:L1302ERR],00H		
		MOV DX,[CS:COMMAND]
		MOV AL,020H
		OUT DX,AL
		CALL BSY0

L1302CONTINUE	MOV AL,[CS:XFERCOUNT]
		CBW
		MOV DI,AX
		MOV DX,[CS:XFERSEG]
		MOV ES,DX
		MOV DX,[CS:DATAREG]
		MOV BX,[CS:XFEROFS]
L1302MULTLOOP	MOV SI,00H
		MOV WORD [CS:WAITCOUNT],00H

;		CALL DRQ1

L1302DRQ	CALL DRQ
		JC L1302SECLOOP
		MOV AL,[CS:STATBYTE]
		MOV [CS:PRNBYTE],AL
		INC WORD [CS:WAITCOUNT]
		CMP WORD [CS:WAITCOUNT],00H
		JE L1302TIMEOUT
		JMP L1302DRQ

L1302TIMEOUT	MOV AH,04H
		MOV AL,01H
		JMP L1302ERRDONE

L1302SECLOOP	IN AX,DX
		MOV [ES:BX+SI],AX
		INC SI
		INC SI
		CMP SI,0200H
		JL L1302SECLOOP
		ADD BX,0200H
		DEC DI
		CMP DI,00H
		JNE L1302MULTLOOP
		XOR AH,AH
		CMP BYTE [CS:THISFUNC],042H
		JE L1342DONE
		MOV AL,[CS:AL_IN]
L1302ERRDONE	MOV BYTE [CS:L1302ERR],00H
		MOV [CS:AL_IN],AL
		JMP INTDONE
L1342DONE       JMP L1302ERRDONE



L1303CMDERR	DB	'WRITE COMMAND TIMEOUT ERROR',0DH,0AH,'$'


L1343		   ; Extended read

		CALL PARSEPACKET
		JMP L1303CMD

; MAYBE MAKE A GENERIC WRITE CALLABLE BLOCK
 		

L1303		   ; Write Sectors
		CALL RWSETUP
L1303CMD	MOV DX,[CS:COMMAND]
		MOV AL,030H
		OUT DX,AL
		CALL BSY0DRQ1
		JNC L1303CONTINUE
		PUSH DX
		MOV DX,L1303CMDERR
		CALL PRN_DX
		POP DX
		JMP L1303TIMEOUT

L1303CONTINUE	MOV WORD [CS:WAITCOUNT],00H
		MOV AL,[CS:XFERCOUNT]
		CBW
		MOV DI,AX
		MOV DX,[CS:XFERSEG]
		MOV ES,DX
		MOV DX,[CS:DATAREG]
		MOV BX,[CS:XFEROFS]
L1303MULTLOOP	MOV SI,00H
		MOV WORD [CS:WAITCOUNT],00H

;		CALL DRQ1

L1303DRQ	CALL BSY0DRQ1
		JNC L1303LOOP
		MOV AL,[CS:STATBYTE]
		MOV [CS:PRNBYTE],AL
		CALL SPC
		CALL PRN_BYTE
		CALL SPC
		CALL DELAY
		INC WORD [CS:WAITCOUNT]
		CMP WORD [CS:WAITCOUNT],00H
		JE L1303TIMEOUT
		JMP L1303DRQ

L1303TIMEOUT	MOV AH,04H
		MOV AL,01H
		JMP L1303ERRDONE

L1303LOOP	MOV AX,[ES:BX+SI]
		OUT DX,AX
		INC SI
		INC SI
		CMP SI,0200H
		JL L1303LOOP
		ADD BX,0200H
		DEC DI
		CMP DI,00H
		JNE L1303MULTLOOP
		XOR AH,AH
		MOV AL,[CS:AL_IN]

L1303ERRDONE	MOV [CS:AL_IN],AL
		JMP INTDONE

L1344		   ; Extended read

		CALL PARSEPACKET
		JMP L1304CMD

; MAYBE MAKE A GENERIC READ CALLABLE BLOCK
 		


L1304		   ; Verify Sectors
		CALL RWSETUP
L1304CMD	MOV DX,[CS:COMMAND]
		MOV AL,040H
		OUT DX,AL
		CALL DELAY
		CALL BSY0
		JC L1304TIMEOUT
		MOV DX,[CS:STATUS]
		XOR AH,AH
		INC AH
		IN AL,DX
		AND AL,01H
		CMP AL,01H
		JE VERERR
		XOR AL,AL
		DEC AH
VERERR		JMP INTDONE
L1304TIMEOUT	MOV AH,04H
		MOV BYTE [CS:AL_IN],01H
		JMP VERERR


L1308				   ; Drive Parms
		PUSH DS
		MOV AX,040H
		MOV DS,AX
		MOV DL,[075h]
		MOV [CS:DL_IN],DL
		POP DS
		XOR AX,AX
		XOR BX,BX
		MOV CX,[CS:MYCYLINDERS]
		XCHG CL,CH
		SHL CL,1
		SHL CL,1
		SHL CL,1
		SHL CL,1
		SHL CL,1
		SHL CL,1
		ADD CL,[CS:MYSECTORS]
		MOV DH,[CS:MYHEADS]
		DEC DH
		XOR AX,AX
		XOR BX,BX
		MOV [CS:AX_IN],AX
		MOV [CS:BX_IN],BX
		MOV [CS:CX_IN],CX
		MOV [CS:DX_IN],DX
		MOV [CS:AH_IN],AH
		MOV [CS:BH_IN],BH
		MOV [CS:CH_IN],CH
		MOV [CS:DH_IN],DH
		MOV [CS:AL_IN],AL
		MOV [CS:BL_IN],BL
		MOV [CS:CL_IN],CL
		MOV [CS:DL_IN],DL

		JMP INTDONE


L1309				   ; 	initialize device parms? done for spinrite.
		MOV BYTE [AH_IN],00H
			CLC
		JMP INTDONE


L130ACMDERR:	DB	'READ LONG COMMAND TIMEOUT ERROR',0DH,0AH,'$'

L130AERR:	DB	00H

L130A		; Read Sectors
		MOV BYTE [CS:L130AERR],00H		
		CALL RWSETUP
		MOV DX,[CS:COMMAND]
		MOV AL,022H
		OUT DX,AL
		CALL BSY0DRQ1
		JNC L130ACONTINUE
		INC BYTE [CS:L130AERR]
		PUSH DX
		MOV DX,L130ACMDERR
		CALL PRN_DX
		POP DX
		JMP L130ATIMEOUT

L130ACONTINUE	MOV AL,01H
		CBW
		MOV DI,AX
		MOV DX,[CS:XFERSEG]
		MOV ES,DX
		MOV DX,[CS:DATAREG]
		MOV BX,[CS:XFEROFS]
L130AMULTLOOP	MOV SI,00H
		MOV WORD [CS:WAITCOUNT],00H

;		CALL DRQ1

L130ADRQ	CALL DRQ
		JC L130ASECLOOP
		MOV AL,[CS:STATBYTE]
		MOV [CS:PRNBYTE],AL
		INC WORD [CS:WAITCOUNT]
		CMP WORD [CS:WAITCOUNT],00H
		JE L130ATIMEOUT
		JMP L130ADRQ

L130ATIMEOUT	MOV AH,04H
		MOV AL,01H
		JMP L130AERRDONE

L130ASECLOOP	IN AX,DX
		MOV [ES:BX+SI],AX
		INC SI
		INC SI
		CMP SI,0204H
		JL L130ASECLOOP
		ADD BX,0204H
		DEC DI
		CMP DI,00H
		JNE L130AMULTLOOP
		XOR AH,AH
		MOV AL,[CS:AL_IN]
L130AERRDONE	MOV BYTE [CS:L130AERR],00H
		MOV [CS:AL_IN],AL
		JMP INTDONE

L130BCMDERR	DB	'WRITE LONG COMMAND TIMEOUT ERROR',0DH,0AH,'$'

L130B		; Write Sectors
		CALL RWSETUP
		MOV DX,[CS:COMMAND]
		MOV AL,032H
		OUT DX,AL
		CALL BSY0DRQ1
		JNC L130BCONTINUE
		PUSH DX
		MOV DX,L130BCMDERR
		CALL PRN_DX
		POP DX
		JMP L130BTIMEOUT

L130BCONTINUE	MOV WORD [CS:WAITCOUNT],00H
		MOV AL,1
		CBW
		MOV DI,AX
		MOV DX,[CS:XFERSEG]
		MOV ES,DX
		MOV DX,[CS:DATAREG]
		MOV BX,[CS:XFEROFS]
L130BMULTLOOP	MOV SI,00H
		MOV WORD [CS:WAITCOUNT],00H

;		CALL DRQ1

L130BDRQ	CALL BSY0DRQ1
		JNC L130BLOOP
		MOV AL,[CS:STATBYTE]
		MOV [CS:PRNBYTE],AL
		CALL SPC
		CALL PRN_BYTE
		CALL SPC
		CALL DELAY
		INC WORD [CS:WAITCOUNT]
		CMP WORD [CS:WAITCOUNT],00H
		JE L130BTIMEOUT
		JMP L130BDRQ

L130BTIMEOUT	MOV AH,04H
		MOV AL,01H
		JMP L130BERRDONE

L130BLOOP	MOV AX,[ES:BX+SI]
		OUT DX,AX
		INC SI
		INC SI
		CMP SI,0204H
		JL L130BLOOP
		ADD BX,0204H
		DEC DI
		CMP DI,00H
		JNE L130BMULTLOOP
		XOR AH,AH
		MOV AL,[CS:AL_IN]

L130BERRDONE	MOV [CS:AL_IN],AL
		JMP INTDONE


L130D           CALL SETMSLBA
                CMP WORD [CS:ISREM],00H
                JNE L130DNOREM
                MOV DX,[CS:COMMAND]
                MOV AL,0DEH
                OUT DX,AL
                CALL BSY1
                CALL BSY0
L130DNOREM      MOV DX,[CS:SECTORCOUNT]
                MOV AH,[CS:ISLBA]
                OUT DX,AL    ;+2
                INC DX
                MOV AL,00H
                OUT DX,AL    ; +3
                INC DX
                OUT DX,AL    ; +4
                INC DX
                OUT DX,AL    ; +5
                INC DX
                IN AL,DX
                AND AL,0F0H
                OUT DX,AL    ; +6
                INC DX
                MOV AL,010H
                OUT DX,AL    ; +7
                CALL BSY1
                CALL BSY0
L130DDONE       MOV AH,00H
                CLC
                JMP INTDONE


;           MOV DX,[CS:DATAREG]
;                ADD DX,0206H
;                MOV AL,04H
;                OUT DX,AL
;                CALL DELAY
;                CALL DELAY
;                CALL DELAY
;                CALL BSY1
;                CALL DELAY
;                CALL DELAY
;                CALL DELAY
;                MOV AL,00H
;                OUT DX,AL
;                CALL BSY0
;                MOV AH,00H
;                JMP INTDONE


L1347		CALL PARSEPACKET
		JMP L130CCMD

L130C		   ; Seek to Cyl
		CALL RWSETUP
L130CCMD	MOV DX,[CS:COMMAND]
		MOV AL,070H
		OUT DX,AL
		CALL DELAY
		CALL BSY0DRDY1
		MOV AL,[CS:STATBYTE]
		AND AL,01H
		CMP AL,01H
		JNE L130CGOOD		
		MOV AH,04H
L130CGOOD	JMP INTDONE
		

MYCYLHDAX:	DW	00H
MYCYLHDDX:	DW	00H

L1315		MOV AX,[CS:MYCYLINDERS]
		MOV BL,[CS:MYHEADS]
		XOR BH,BH
		MUL BX
		MOV [CS:MYCYLHDAX],AX
		MOV [CS:MYCYLHDDX],DX
		MOV BX,[CS:MYSECTORS]
		MUL BX
		MOV [CS:DX_IN],AX
		MOV [CS:CX_IN],DX
		MOV AX,[CS:MYCYLHDDX]
		MUL BX
		ADD [CS:CX_IN],AX
		MOV CX,[CS:CX_IN]
		MOV DX,[CS:DX_IN]
		MOV [CS:CL_IN],CL
		MOV [CS:CH_IN],CH
		MOV [CS:DL_IN],DL
		MOV [CS:DH_IN],DH

		JMP INTDONE


L1325		; Identify Drive
		MOV BX,[CS:ES_IN]
		MOV ES,BX
		MOV BX,[CS:BX_IN]
		MOV DI,BX
		MOV SI,MYBUFFER
		XOR BX,BX
L1325LOOP	MOV AX,[CS:SI+BX]
		MOV [ES:DI+BX],AX
		INC BX
		INC BX
		CMP BX,0200H
		JL L1325LOOP
		MOV AH,00H
		JMP INTDONE

L1341		   ; Extended info
		CMP WORD [CS:ISLBA],00H
		JE L1341ERROR
		CALL RTNREGS
		MOV BX,0AA55H
		MOV CX,00H
		MOV AL,00H
		MOV AH,01H
		CALL SAVEREGS
		JMP INTDONE

L1341ERROR	JMP L1302ERR


L1348		   ; Extended get parms
;		CALL PRN_FN
		CMP WORD [CS:ISLBA],00H
		JE L1348ERROR
		CALL RTNREGS
		CMP BYTE [SI],01AH
		JL L1348ERROR
		CMP BYTE [SI],01EH
		JL L1348_1A
		MOV WORD [SI],01AH
		JMP L1348_GO
L1348_1A	MOV WORD [SI],01AH
L1348_GO	MOV AX,[CS:MYBUFFER+06CH]
		MOV [SI+04H],AX
		MOV AX,[CS:MYBUFFER+06EH]
		MOV [SI+08H],AX
		MOV AX,[CS:MYBUFFER+070H]
		MOV [SI+0CH],AX

		MOV WORD [SI+06H],00H
		MOV WORD [SI+0AH],00H
		MOV WORD [SI+0EH],00H

		MOV AX,[CS:MYBUFFER+078H]
		MOV [SI+010H],AX
		MOV AX,[CS:MYBUFFER+07AH]
		MOV [SI+012H],AX

		MOV WORD [SI+14H],00H
		MOV WORD [SI+16H],00H

		MOV WORD [SI+018H],0200H
;		MOV WORD [SI+01AH],0FFFFH
;		MOV WORD [SI+01CH],0FFFFH
		MOV WORD [SI+02H],00H
		MOV AH,00H
		JMP INTDONE


L1348ERROR	MOV AH,01H
		JMP INTDONE

L13FF           MOV SI,FUNCBUF
                PUSH CS
                MOV [CS:SI_IN],SI
                POP SI
                MOV [CS:DS_IN],SI
                JMP INTDONE


;SETMSLBA	MOV DX,[CS:DRIVEHEAD]
;                IN AL,DX
;		AND AL,0A0H
;		OUT DX,AL
;		CALL DELAY
;		CALL BSY0
;		MOV BX,[CS:ISLBA]
;		CMP BX,00H
;		JNE NOTLBA
;		OR AL,040H
;		OUT DX,AL
;NOTLBA		CALL DELAY
;		CALL BSY0
;		RET

SETMSLBA    MOV DX,[CS:DRIVEHEAD]
            IN AL,DX
            AND AL,0A0H
            OUT DX,AL
            CALL DELAY
;       CALL BSY0
            CMP WORD [CS:ISLBA],00H
            JE NOLBA
            OR AL,0E0H
            OUT DX,AL
            CALL DELAY
;       CALL BSY0
NOLBA      RET







RWSETUP		; PREPARE FOR READING/WRITING/VERIFYING OF SECTORS
		CALL SETMSLBA
;		PUSH AX

;		CALL LF

;		MOV AX,[CS:AX_IN]
;		MOV [CS:PRNWORD],AX
;		CALL PRN_WORD
;		CALL SPC

;		MOV AX,[CS:BX_IN]
;		MOV [CS:PRNWORD],AX
;		CALL PRN_WORD
;		CALL SPC

;		MOV AX,[CS:CX_IN]
;		MOV [CS:PRNWORD],AX
;		CALL PRN_WORD
;		CALL SPC

;		MOV AX,[CS:DX_IN]
;		MOV [CS:PRNWORD],AX
;		CALL PRN_WORD
;		CALL SPC

;		CALL SPC
;		CALL LF
;		POP AX

		MOV AX,[CS:ES_IN]
		MOV [CS:XFERSEG],AX
		MOV AX,[CS:BX_IN]
		MOV [CS:XFEROFS],AX

		MOV AL,[CS:AL_IN]
		MOV [CS:XFERCOUNT],AL
		MOV DX,[CS:SECTORCOUNT]
		OUT DX,AL
		MOV DX,[CS:ISLBA]
		CMP DX,1
		JE RWLBA
RWCHS		MOV AL,[CS:CL_IN]
		AND AL,03FH
		MOV DX,[CS:SECTORNUMBER]
		OUT DX,AL
		MOV AL,[CS:CL_IN]
		SHR AL,1
		SHR AL,1
		SHR AL,1
		SHR AL,1
		SHR AL,1
		SHR AL,1
		MOV DX,[CS:CYLINDERHIGH]
		OUT DX,AL
		MOV DX,[CS:CYLINDERLOW]
		MOV AL,[CS:CH_IN]
		OUT DX,AL

		MOV DX,[CS:DRIVEHEAD]
		MOV BL,[CS:DH_IN]
		IN AL,DX
		AND AL,0F0H
		AND BL,0FH
		OR AL,BL
		OUT DX,AL
		
		JMP RWSETUPDONE		

CYLHDAX		DW	00H
CYLHDDX		DW	00H
CYLSECAX1	DW	00H
CYLSECDX1	DW	00H
CYLSECAX2	DW	00H
CYLSECDX2	DW	00H

LBA0007		DB	00H
LBA080F		DB	00H
LBA1017		DB	00H
LBA181B		DB	00H

RWLBA

;		FIRST	CYLINDER*HEADS
		XOR AX,AX
		XOR BX,BX
		XOR CX,CX
		XOR DX,DX
		MOV AL,[CS:CH_IN]
		MOV AH,[CS:CL_IN]		; Upper two(2) bits of cylinder 
		SHR AH,1		; number in bits 7-6
		SHR AH,1
		SHR AH,1
		SHR AH,1
		SHR AH,1
		SHR AH,1
		MOV BL,[CS:MYHEADS]
		MOV BH,00H
		MUL BX	
					; Multiply by total heads
					; Total goes in DX:AX 
					; DX=0 IF UNDER 8 GIG

;				THEN	ADD HEADS

		MOV BL,[CS:DH_IN]		; Add selected head number
		XOR BH,BH
		ADD AX,BX
		ADC DX,0		; Add with carry from Add AX,BX
		MOV [CS:CYLHDAX],AX
		MOV [CS:CYLHDDX],DX

;				THEN	* SECTORS/TRK

		MOV AX,[CS:CYLHDAX]
		MOV BL,[CS:MYSECTORS]
		MOV BH,00H
		MUL BX
		MOV [CS:CYLSECAX1],AX
		MOV [CS:CYLSECDX1],DX

		MOV AX,[CS:CYLHDDX]
		MOV BL,[CS:MYSECTORS]
		MOV BH,00H
		MUL BX
		MOV [CS:CYLSECAX2],AX
		MOV [CS:CYLSECDX2],DX

		MOV AX,[CS:CYLSECAX1]
		MOV DX,[CS:CYLSECDX1]
		MOV BX,[CS:CYLSECAX2]
		ADD DX,BX

;				THEN	ADD SECTOR#

		MOV BL,[CS:CL_IN]
		AND BL,03FH
		XOR BH,BH
		ADD AX,BX
		ADC DX,00H

;				THEN 	-1

		DEC AX
		SBB DX,00H

		MOV [CS:LBA0007],AL
		MOV [CS:LBA080F],AH
		MOV [CS:LBA1017],DL
		MOV [CS:LBA181B],DH

		MOV DX,[CS:LBA_00_07]
		MOV AL,[CS:LBA0007]
		OUT DX,AL

		MOV DX,[CS:LBA_08_0F]
		MOV AL,[CS:LBA080F]
		OUT DX,AL

		MOV DX,[CS:LBA_10_17]
		MOV AL,[CS:LBA1017]
		OUT DX,AL

		MOV DX,[CS:LBA_18_1B]
		MOV BL,[CS:LBA181B]
		IN AL,DX
		AND AL,0F0H
		AND BL,0FH
		OR AL,BL
		OUT DX,AL

RWSETUPDONE	RET

PARSEPACKET	NOP
		CALL SETMSLBA
		CMP BYTE [SI],010H
		JGE SIZEGOOD
		MOV AH,07H
		STC
		JMP PARSERROR

SIZEGOOD;	CALL LF

		MOV DX,[CS:LBA_00_07]
		MOV AL,[SI+08H]
		OUT DX,AL
;		MOV [CS:PRNBYTE],AL
;		CALL PRN_BYTE
;		CALL SPC

		MOV DX,[CS:LBA_08_0F]
		MOV AL,[SI+09H]
		OUT DX,AL
;		MOV [CS:PRNBYTE],AL
;		CALL PRN_BYTE
;		CALL SPC

		MOV DX,[CS:LBA_10_17]
		MOV AL,[SI+0AH]
		OUT DX,AL
;		MOV [CS:PRNBYTE],AL
;		CALL PRN_BYTE
;		CALL SPC

		MOV DX,[CS:LBA_18_1B]
		MOV BL,[SI+0BH]
		IN AL,DX
		AND AL,0F0H
		AND BL,0FH
		OR AL,BL
		OUT DX,AL
;		MOV [CS:PRNBYTE],AL
;		CALL PRN_BYTE
;		CALL SPC

		MOV AX,[SI+04H]
		MOV [CS:XFEROFS],AX
;		MOV [CS:PRNWORD],AX
;		CALL PRN_WORD
;		CALL SPC

		MOV AX,[SI+06H]
		MOV [CS:XFERSEG],AX
;		MOV [CS:PRNWORD],AX
;		CALL PRN_WORD
;		CALL SPC

		MOV DX,[CS:SECTORCOUNT]
		MOV AL,[SI+2]
		MOV [CS:XFERCOUNT],AL
;		MOV [CS:PRNBYTE],AL
;		CALL PRN_BYTE
;		CALL SPC
;		PUSH AX
;		MOV AH,00
;		INT 016H
;		POP AX
;		CALL LF
;		CALL LF
		CLC
PARSERROR	RET

IDDRVSTR:
	DB	'PLEASE BE PATIENT FOR A MOMENT WHILE I CHECK FOR HARDDRIVE'
	DB	0AH,0DH
	DB	'AND IDENTIFY IT. MODEL NUMBER WILL BE DISPLAYED BELOW IF FOUND'
	DB	0AH,0DH,'$'

IDDRIVE		PUSH DX
		MOV DX,IDDRVSTR
		CALL PRN_DX
		POP DX
;		CALL DELAY
;		CALL BSY0		; Wait for BSY to clear
;		CALL DRDY1		; Check for Drive Rdy Bit being set
		CALL BSY0DRDY1
		MOV DX,[CS:DRIVEHEAD]
		IN AL,DX
		AND AL,0EFH
		OUT DX,AL
;		CALL DELAY
;		CALL BSY0		; Wait for BSY to clear
;		CALL DRDY1		; Check for Drive Rdy Bit being set
		CALL BSY0DRDY1
		MOV DX,[CS:COMMAND]
		MOV AL,0ECH		; ID Ata device (Non Packet)
		OUT DX,AL
;		CALL DELAY
GOODID		CALL BSY0DRDY1
;		CALL BSY0		; Wait for BSY to clear
;		CALL DRQ1		; Check for Drive Rdy Bit being set

		MOV SI,00H			  ;This is a read loop
		MOV DX,[CS:DATAREG]
IDLOOP		MOV BX,MYBUFFER
		IN  AX,DX
		MOV [CS:BX+SI],AX
		INC SI
		INC SI
		CMP SI,200H
		JL  IDLOOP	; At 0x200 the whole block has been read.

		CALL LF
		MOV SI,MYBUFFER
		MOV DI,01BH
MDLLOOP		MOV BX,DI
		SHL BX,1
		MOV CX,[CS:SI+BX]
		MOV AL,CH
		CALL PRN_AL
		MOV AL,CL
		CALL PRN_AL
		INC DI
		CMP DI,46
		JLE MDLLOOP
		CALL LF

		MOV AX,[CS:MYBUFFER+00H]
		AND AX,08000H
		CMP AX,08000H
		JNE ISATA
		JMP QUIT

ISATA		
                MOV AX,[CS:MYBUFFER]
                AND AX,080H
                CMP AX,080H
                JNE NOTREM
                MOV AX,01H
                MOV [CS:ISREM],DX

NOTREM		MOV AX,[CS:MYBUFFER+062H]
		AND AX,0200H
		CMP AX,0200H
		JE GOLBA
		MOV DX,[CS:MYBUFFER+02H]		
		DEC DX
		MOV [CS:MYCYLINDERS],DX
		MOV DX,[CS:MYBUFFER+06H]		
		XOR DH,DH
		MOV [CS:MYHEADS],DL
		MOV DX,[CS:MYBUFFER+0CH]		
		XOR DH,DH
		MOV [CS:MYSECTORS],DL
		JMP IDDONE		

GOLBA
		MOV DX,01H
		MOV [CS:ISLBA],DX
		MOV DX,[CS:DRIVEHEAD]
		IN AL,DX
		OR AL,040H
		OUT DX,AL
		CALL BSY0DRDY1

		MOV DX,[CS:MYBUFFER+02H]
		CMP DX,03FFFH
		JL  NOTOVERCHS
		MOV DX,[CS:MYBUFFER+06H]
		XOR DH,DH
		CMP DX,010H
		JL  NOTOVERCHS
		MOV DX,[CS:MYBUFFER+0CH]
		CMP DX,03FH
		JL  NOTOVERCHS

		MOV DX,03FFH
		MOV [CS:MYCYLINDERS],DX
		MOV DX,0FFH
		MOV [CS:MYHEADS],DL
		MOV DX,03FH
		XOR DH,DH
		MOV [CS:MYSECTORS],DL
		JMP IDDONE

NOTOVERCHS	
		MOV DX,[CS:MYBUFFER+02H]		
		DEC DX
		MOV [CS:MYCYLINDERS],DX
		MOV DX,[CS:MYBUFFER+06H]		
		XOR DH,DH
		MOV [CS:MYHEADS],DL
		MOV DX,[CS:MYBUFFER+0CH]		
		XOR DH,DH
		MOV [CS:MYSECTORS],DL

LBAADJUST
		MOV DX,[CS:MYCYLINDERS]
		CMP DX,03FFH
		JLE IDDONE
		SHR DX,1
		MOV [CS:MYCYLINDERS],DX
		MOV DL,[CS:MYHEADS]
		SHL DL,1
		MOV [CS:MYHEADS],DL
		JMP LBAADJUST

IDDONE		MOV DX,USETHIS
		CALL PRN_DX

DRVYN		MOV AH,00H
		INT 016H
		CMP AL,'Y'
		JE DRVKEY
		CMP AL,'y'
		JE DRVKEY
		CMP AL,'N'
		JE DRVKEY
		CMP AL,'n'
		JE DRVKEY
		CMP AL,01BH
		JNE DRVYN
BADID		MOV AL,'N'
		JMP CHOSEN
DRVKEY		MOV [CS:DRVANS],AL
		CALL PRN_AL

;	CONTINUE TO CHECK KEY CODES FOR YyNn - BckSpc - Esc
;	ONLY ACCEPT LAST TWO IN SECOND HALF OF CHECK.

DRVKEYCHK	MOV AH,00H
		INT 016H
		CMP AL,0DH
		JE CHOSEN
		CMP AL,08H
		JNE DRVKEYCHK
		CALL PRN_AL
		MOV AL,' '
		CALL PRN_AL
		MOV AL,08H
		CALL PRN_AL
		JMP DRVYN
CHOSEN		MOV DL,[CS:DRVANS]
		XOR AL,AL
		CMP DL,'N'
		JE ISNN
		CMP DL,'n'
		JE ISNN
		INC AL

ISNN		NOP
		CALL LF
			RET

DRVANS:		DB	00H

QUIT		CALL LF
		CALL LF
		RETF


VIDINFO:	DW	00H

PRN_AL		PUSH AX
		PUSH BX
		PUSH CX
		MOV AH,0EH
		MOV BX,[CS:VIDINFO]
		MOV CX,1
		INT 010H
		POP CX
		POP BX
		POP AX
		RET

PRN_DX		PUSH AX
		PUSH BX
		PUSH DI
		MOV DI,DX
		MOV AH,0FH
		INT 010H
		MOV BL,0
		MOV [CS:VIDINFO],BX
PRNLOOP		MOV AL,[CS:DI]
		CMP AL,'$'
		JE PRNDONE
		CMP AL,00H
		JE PRNDONE
CALL		PRN_AL
		INC DI
		JMP PRNLOOP
PRNDONE		POP DI
		POP BX
		POP AX
		RET

LF		PUSH DX	  
		MOV DX,LFSTR
			CALL PRN_DX
		POP DX
		RET

SPC		PUSH DX	  
		MOV DX,PRNSPC
			CALL PRN_DX
		POP DX
		RET

PRNBYTE		DB	00H
PRNWORD		DW	00H

PRN_LO		PUSH AX
		PUSH DX
		PUSH DI
		AND DL,0FH
		MOV DI,DX
		MOV AL,[CS:HEXSET+DI]
		CALL PRN_AL
		POP DI
		POP DX
		POP AX
		RET

PRN_HI		PUSH AX
		PUSH DX
		PUSH DI
		AND DL,0F0H
		SHR DL,4
		MOV DI,DX
		MOV AL,[CS:HEXSET+DI]
		CALL PRN_AL
		POP DI
		POP DX
		POP AX
		RET

PRN_BYTE	PUSH DX
		XOR DX,DX
		MOV DL,[CS:PRNBYTE]
		CALL PRN_HI
		MOV DL,[CS:PRNBYTE]
		CALL PRN_LO
		POP DX
		RET

PRN_WORD	PUSH BX
		MOV BX,[CS:PRNWORD]
		MOV [CS:PRNBYTE],BH
		CALL PRN_BYTE
		MOV [CS:PRNBYTE],BL
		CALL PRN_BYTE
		CALL SPC
		POP BX
		RET

CSEQS:		DB	'INSTALLED AT CS=$'

PRN_SEG		PUSH DX
		MOV DX,CSEQS
		CALL PRN_DX
		PUSH CS
		POP DX
		MOV [CS:PRNWORD],DX
		POP DX
		CALL PRN_WORD
		CALL LF
		RET 

FNEQS:		DB	'FUNCBUF AT FN=$'

PRN_FN		PUSH DX
		MOV DX,FNEQS
		CALL PRN_DX
		MOV DX,FUNCBUF
		MOV [CS:PRNWORD],DX
		CALL PRN_WORD
		CALL LF
		POP DX
		RET

;delayloop
DELAY		PUSH DX
		PUSH AX
		MOV DX,[CS:ERRORREG]
		IN  AL,DX
		MOV [CS:ERRORBYTE],AL
;		IN  AL,DX
		IN   AL,0ECh
		OUT  0ECh,AL
		IN   AL,0ECh
		OUT  0ECh,AL
		IN   AL,0ECh
		OUT  0ECh,AL
		IN   AL,0ECh
		OUT  0ECh,AL
		IN   AL,0ECh
		POP AX
		POP DX
		RET		; DELAYED FOR 4 READS OF ERROR PORT ENOUGH?

BSYDRQCOUNT	DD	00H

BSY0DRQ1	MOV DWORD [CS:BSYDRQCOUNT],00H
		PUSH DX
		PUSH AX
BSY0DRQ1LOOP	INC DWORD [CS:BSYDRQCOUNT]
		CMP DWORD [CS:BSYDRQCOUNT],010000H
		JE BSYDRQTIMEOUT
		CALL DELAY
		MOV DX,[CS:STATUS]		   ;bsy clr loop1
		IN  AL,DX
		MOV [CS:STATBYTE],AL
		AND AL,88H
		CMP AL,08H
		JNE BSY0DRQ1LOOP
		CLC
BSYDRQDONE	POP AX
		POP DX
			RET
BSYDRQTIMEOUT	STC
		JMP BSYDRQDONE

BSYDRDYCOUNT	DD	00H

BSY0DRDY1	MOV DWORD [CS:BSYDRDYCOUNT],00H
		PUSH DX
		PUSH AX
BSYDRDYLOOP	INC DWORD [CS:BSYDRDYCOUNT]
		CMP DWORD [CS:BSYDRDYCOUNT],010000H
		JE BSYDRDYTIMEOUT
		CALL DELAY
		MOV DX,[CS:STATUS]		   ;bsy clr loop1
		IN  AL,DX
		MOV [CS:STATBYTE],AL
		AND AL,01H
		CMP AL,01H
		JE BSYDRDYTIMEOUT
		MOV AL,[CS:STATBYTE]
		AND AL,88H
		CMP AL,08H
		JNE BSYDRDYLOOP
		CLC
BSYDRDYDONE	POP AX
		POP DX
			RET
BSYDRDYTIMEOUT	STC
		JMP BSYDRDYDONE

BSYCOUNT:	DW	00H

BSYERRORSTR:	DB	'BSY ERROR',0DH,0AH,'$'

BSY		PUSH DX
		PUSH AX
		CALL DELAY
		MOV DX,[CS:STATUS]		   ;bsy clr loop1
		IN  AL,DX	
		MOV [CS:STATBYTE],AL
		CLC
		AND AL,80H
		CMP AL,00H
		JE BSYCLR
		STC
BSYCLR		POP AX
		POP DX
		RET


BSY0		PUSH DX
		PUSH AX
		MOV WORD [CS:BSYCOUNT],0
BSY0LOOP	INC WORD [CS:BSYCOUNT]
		CALL DELAY
		CMP WORD [CS:BSYCOUNT],00H
		JE BSY0TIMEOUT
		MOV DX,[CS:STATUS]		   ;bsy clr loop1
		IN  AL,DX
		MOV [CS:STATBYTE],AL
		AND AL,01H
		CMP AL,01H
		JE BSY0TIMEOUT
		MOV AL,[CS:STATBYTE]
		
		AND AL,080H
		CMP AL,00H
		JNE BSY0LOOP
		CLC
BSY0DONE	POP AX
		POP DX
		RET

BSY0TIMEOUT	PUSH DX
;		MOV DX,BSYERRORSTR
;		CALL PRN_DX
		POP AX
		STC
		JMP BSY0DONE

BSY1		PUSH DX
		PUSH AX
		MOV WORD [CS:BSYCOUNT],0
BSY1LOOP	INC WORD [CS:BSYCOUNT]
		CALL DELAY
		CMP WORD [CS:BSYCOUNT],00H
		JE BSY1TIMEOUT
		MOV DX,[CS:STATUS]		   ;bsy clr loop1
		IN  AL,DX
		MOV [CS:STATBYTE],AL
		AND AL,80H
		CMP AL,80H
		JNE BSY1LOOP
		CLC
BSY1DONE	POP AX
		POP DX
		RET

BSY1TIMEOUT	PUSH DX
		MOV DX,BSYERRORSTR
		CALL PRN_DX
		POP DX
		POP AX
		POP DX
		STC
		RET

DRQERRORSTR:	DB	'DRQ ERROR',0DH,0AH,'$'

DRQ		PUSH DX
		PUSH AX
		MOV DX,[CS:STATUS]
		IN  AL,DX
		IN  AL,DX	
		MOV [CS:STATBYTE],AL
		CLC
		AND AL,08H
		CMP AL,00H
		JE DRQCLR
		STC		; DRQ SET
DRQCLR		POP AX
		POP DX
		RET		; DRQ CLR

DRQCOUNT:	DW	00H

DRQ0		PUSH DX
		PUSH AX
		MOV WORD [CS:DRQCOUNT],0
DRQ0LOOP	INC WORD [CS:DRQCOUNT]
		CALL DELAY
		CMP WORD [CS:DRQCOUNT],00H
		JE DRQ0TIMEOUT
		MOV DX,[CS:STATUS]		   ;bsy clr loop1
		IN  AL,DX
		MOV [CS:STATBYTE],AL
		AND AL,08H
		CMP AL,00H
		JNE DRQ0LOOP
		CLC
DRQ0DONE	POP AX
		POP DX 
			RET
DRQ0TIMEOUT	PUSH DX
		MOV DX,DRQERRORSTR
		CALL PRN_DX
		POP DX
		STC
		JMP DRQ0DONE

DRQ1		PUSH DX
		PUSH AX
		MOV WORD [CS:DRQCOUNT],0
DRQ1LOOP	INC WORD [CS:DRQCOUNT]
		CALL DELAY
		CMP WORD [CS:DRQCOUNT],00H
		JE DRQ1TIMEOUT
		MOV DX,[CS:STATUS]		   ;bsy clr loop1
		IN  AL,DX
		MOV [CS:STATBYTE],AL
		AND AL,08H
		CMP AL,08H
		JNE DRQ1LOOP
		CLC
DRQ1DONE	POP AX
		POP DX 
		RET
DRQ1TIMEOUT	PUSH DX
		MOV DX,DRQERRORSTR
		CALL PRN_DX
		POP DX
		STC
		JMP DRQ1DONE

DRDYERRORSTR:	DB	'DRDY ERROR',0DH,0AH,'$'

DRDY		PUSH DX
		PUSH AX
		MOV DX,[CS:STATUS]
		IN  AL,DX
		IN  AL,DX	
		MOV [CS:STATBYTE],AL
		CLC
		AND AL,40H
		CMP AL,00H
		JE DRDYCLR
		STC		
DRDYCLR		POP AX
		POP DX
		RET		


DRDYCOUNT:	DW	00H

DRDY0		PUSH DX
		PUSH AX
		MOV WORD [CS:DRDYCOUNT],0
DRDY0LOOP	INC WORD [CS:DRDYCOUNT]
		CALL DELAY
		CMP WORD [CS:DRDYCOUNT],00H
		JE DRDY0TIMEOUT
		MOV DX,[CS:STATUS]
		IN  AL,DX
		MOV [CS:STATBYTE],AL
		AND AL,040H
		CMP AL,00H
		JNE DRDY0LOOP
		CLC
DRDY0DONE	POP AX
		POP DX
			RET
DRDY0TIMEOUT	PUSH DX
		MOV DX,DRDYERRORSTR
		CALL PRN_DX
		POP DX
		STC
		JMP DRDY0DONE


DRDY1		PUSH DX
		PUSH AX
		MOV WORD [CS:DRDYCOUNT],0
DRDY1LOOP	INC WORD [CS:DRDYCOUNT]
		CALL DELAY
		CMP WORD [CS:DRDYCOUNT],00H
		JE DRDY1TIMEOUT
		MOV DX,[CS:STATUS]
		IN  AL,DX
		MOV [CS:STATBYTE],AL
		AND AL,040H
		CMP AL,00H
		JNE DRDY1LOOP
		CLC
DRDY1DONE	POP AX
		POP DX 
		RET
DRDY1TIMEOUT	PUSH DX
		MOV DX,DRDYERRORSTR
		CALL PRN_DX
		POP DX
		STC
		JMP DRDY1DONE

SAVEREGS	MOV [CS:AX_IN],AX
		MOV [CS:OLD_AX],AX
		MOV [CS:BX_IN],BX
		MOV [CS:CX_IN],CX
		MOV [CS:DX_IN],DX
		MOV [CS:AH_IN],AH
		MOV [CS:BH_IN],BH
		MOV [CS:CH_IN],CH
		MOV [CS:DH_IN],DH
		MOV [CS:AL_IN],AL
		MOV [CS:BL_IN],BL
		MOV [CS:CL_IN],CL
		MOV [CS:DL_IN],DL
		MOV [CS:SI_IN],SI
		MOV [CS:DI_IN],DI
		MOV [CS:BP_IN],BP
		PUSH CS
		PUSH DS
		PUSH ES
		POP AX
		MOV [CS:ES_IN],AX
		POP AX
		MOV [CS:DS_IN],AX
		POP AX
		MOV [CS:CS_IN],AX
		MOV AX,[CS:AX_IN]
		RET

RTNREGS
		MOV AX,[CS:DS_IN]
		MOV DS,AX
		MOV AX,[CS:ES_IN]
		MOV ES,AX
		MOV AH,[CS:AH_IN]
		MOV BH,[CS:BH_IN]
		MOV CH,[CS:CH_IN]
		MOV DH,[CS:DH_IN]
		MOV AL,[CS:AL_IN]
		MOV BL,[CS:BL_IN]
		MOV CL,[CS:CL_IN]
		MOV DL,[CS:DL_IN]
		MOV SI,[CS:SI_IN]
		MOV DI,[CS:DI_IN]
		MOV BP,[CS:BP_IN]
		RET

DONESTATUS:	DB	00H
STATBYTE:	DB	020H
ERRORBYTE:	DB	030H
OURDRIVE	DB	0FFH
ISLBA:		DW	00H
ISREM:		DW	00H

BASE:		DW	BASEOFPORT+0H	
DATAREG:	DW	BASEOFPORT+0H
ERRORREG:	DW	BASEOFPORT+01H
SECTORCOUNT:	DW	BASEOFPORT+02H

SECTORNUMBER:	DW	BASEOFPORT+03H
LBA_00_07:	DW	BASEOFPORT+03H	 ; Lba Bits 00 - 07

CYLINDERLOW:	DW	BASEOFPORT+04H
LBA_08_0F:	DW	BASEOFPORT+04H	 ; Lba Bits 08 - 0F

CYLINDERHIGH:	DW	BASEOFPORT+05H
LBA_10_17:	DW	BASEOFPORT+05H	 ; Lba Bits 10 - 17

DRIVEHEAD:	DW	BASEOFPORT+06H
LBA_18_1B:	DW	BASEOFPORT+06H	 ; Lba Bits 18 - 1B

COMMAND:	DW	BASEOFPORT+07H
STATUS:		DW	BASEOFPORT+07H

MYCYLINDERS:	DW	00H
MYHEADS:	DB	00H
MYSECTORS:	DB	00H

AX_IN:		DW	00H
BX_IN:		DW	00H
CX_IN:		DW	00H
DX_IN:		DW	00H
AH_IN:		DB	00H
BH_IN:		DB	00H
CH_IN:		DB	00H
DH_IN:		DB	00H
AL_IN:		DB	00H
BL_IN:		DB	00H
CL_IN:		DB	00H
DL_IN:		DB	00H
SI_IN:		DW	00H
DI_IN:		DW	00H
DS_IN:		DW	00H
ES_IN:		DW	00H
BP_IN:		DW	00H
CS_IN:		DW	00H
OLD_AX:		DW	00H
XFERCOUNT	DB	00H
XFERSEG:	DW	00H
XFEROFS:	DW	00H
LFSTR:		DB	0DH,0AH,'$'
OLD13:		DB	'OLD INT 13 WAS AT ->$'
DRVBSY:		DB	'THE DRIVER IS BUSY ','$'
UNKNOWN:	DB	'UNKNOWN ERROR',0DH,0AH,'$'
USETHIS:	DB	0DH,0AH
		DB	'THIS IS TEST PRE-DOS BOOT CODE',0DH,0AH
		DB	'DO YOU WANT TO USE THIS DRIVE Y/N -> ','$'
NTHR:		DB	'DEVICE OR PORT NOT PRESENT ','$'
HEXSET		DB	'0123456789ABCDEF $'
PRNSPC		DB	'  $'
		DB	0FFH
FUNCBUF:	RESB	0100H
		DB	0FFH
MYBUFFER:	   RESW	0100H
