176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; -*- fundamental -*- (asm-mode sucks)
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; ****************************************************************************
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;  memdisk.inc
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;  A program to emulate an INT 13h disk BIOS from a "disk" in extended
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;  memory.
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;   Copyright 2001-2009 H. Peter Anvin - All Rights Reserved
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;   Copyright 2009 Intel Corporation; author: H. Peter Anvin
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;   Portions copyright 2009 Shao Miller [El Torito code, mBFT, safe hook]
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;  This program is free software; you can redistribute it and/or modify
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;  it under the terms of the GNU General Public License as published by
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;  the Free Software Foundation, Inc., 53 Temple Place Ste 330,
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;  Boston MA 02111-1307, USA; either version 2 of the License, or
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;  (at your option) any later version; incorporated herein by reference.
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; ****************************************************************************
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%include "../version.gen"
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; %define DEBUG_TRACERS			; Uncomment to get debugging tracers
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG_TRACERS
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%macro TRACER	1
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call debug_tracer
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	db %1
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endmacro
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%macro WRITEHEX2 0-1 al
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifnidni %1,al
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	push ax
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	mov al,%1
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call writehex2
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	pop ax
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%else
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call writehex2
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endmacro
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%macro WRITEHEX4 0-1 ax
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifnidni %1,ax
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	push ax
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	mov ax,%1
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call writehex4
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	pop ax
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%else
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call writehex4
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endmacro
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%macro WRITEHEX8 0-1 eax
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifnidni %1,eax
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	push eax
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	mov eax,%1
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call writehex8
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	pop eax
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%else
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	call writehex8
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endmacro
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%else	; DEBUG_TRACERS
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%macro	TRACER	1
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endmacro
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%macro WRITEHEX2 0-1
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endmacro
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%macro WRITEHEX4 0-1
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endmacro
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%macro WRITEHEX8 0-1
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endmacro
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif	; DEBUG_TRACERS
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Flags we test our configuration against
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define CONFIG_READONLY	0x01
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define CONFIG_RAW	0x02
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define CONFIG_SAFEINT	0x04
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define CONFIG_BIGRAW	0x08		; MUST be 8!
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		org 0h
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define	SECTORSIZE	(1 << SECTORSIZE_LG2)
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Parameter registers definition; this is the definition
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; of the stack frame.
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_DS		word [bp+34]
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_ES		word [bp+32]
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_EAX		dword [bp+28]
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_HAX		word [bp+30]
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_AX		word [bp+28]
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_AL		byte [bp+28]
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_AH		byte [bp+29]
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_ECX		dword [bp+24]
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_HCX		word [bp+26]
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_CX		word [bp+24]
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_CL		byte [bp+24]
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_CH		byte [bp+25]
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_EDX		dword [bp+20]
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_HDX		word [bp+22]
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_DX		word [bp+20]
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_DL		byte [bp+20]
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_DH		byte [bp+21]
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_EBX		dword [bp+16]
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_HBX		word [bp+18]
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_HBXL		byte [bp+18]
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_BX		word [bp+16]
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_BL		byte [bp+16]
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_BH		byte [bp+17]
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_EBP		dword [bp+8]
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_BP		word [bp+8]
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_ESI		dword [bp+4]
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_SI		word [bp+4]
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_EDI		dword [bp]
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define		P_DI		word [bp]
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		section .text
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; These pointers are used by the installer and
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; must be first in the binary
12076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPointers:	dw Int13Start
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Int15Start
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw MemDisk_Info		; Portions are patched by installer
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw TotalSize
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw IretPtr
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanIretPtr		equ Int13Start.iret
12776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInt13Start:
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp strict near .SafeHookEnd ; 3-byte jump
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db '$INT13SF'		; Signature for "safe hook"
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db 'MEMDISK '		; Vendor ID
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dd 0			; SEG:OFF of previous INT 13h hook
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; Must be filled in by installer
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dd 0			; "Safe hook" flags
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; ---- "Safe hook" structure ends here ---
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; This next field should be guaranteed at this position after the
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; "safe hook" structure.  This allows for a MEMDISK OS driver to
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; immediately find out the particular parameters using the mBFT
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; and MDI structures.  This binary will have the offset to the mBFT
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; in this field to begin with, so the installer knows where the mBFT
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; is.  This is akin to the "Pointers" section above.  The installer
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; will refill this field with the physical address of the mBFT for
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; future consumers, such as OS drivers.
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dd mBFT			; Offset from hook to the mBFT
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.SafeHookEnd:
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp word [cs:Recursive],0
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne recursive
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Swap stack
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [cs:Stack],esp
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [cs:Stack+4],ss
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [cs:SavedAX],ax
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,cs
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ss,ax
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov sp,[cs:MyStack]
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%if ELTORITO
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp word [cs:SavedAX],4a00h	; El Torito function?
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jae our_drive			; We grab it
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; See if DL points to our class of device (FD, HD)
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push dx
16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push dx
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor dl,[cs:DriveNo]
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop dx
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		js .nomatch		; If SF=0, we have a class match here
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; 0x00 the sign bit for FD
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; 0x80 the sign bit for HD
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jz our_drive		; If ZF=1, we have an exact match
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp dl,[cs:DriveNo]
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jb .nomatch		; Drive < Our drive
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp dl,[cs:DriveShiftLimit]
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jae .nomatch		; Drive > The maximum drive
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; number that we will shift for.
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; This leaves any higher-up BIOS
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; drives alone, such as an optical
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; disc drive 0xA0 or 0xE0
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dec dl			; Drive > Our drive, adjust drive #
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.nomatch:
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER '!'
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		WRITEHEX2 dl
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER ','
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,[cs:SavedAX]
18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		WRITEHEX4
18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		inc word [cs:Recursive]
18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pushf
18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call far [cs:OldInt13]
18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pushf
19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dec word [cs:Recursive]
19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push bp
19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bp,sp
19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp byte [cs:SavedAX+1],08h	; Get drive params function?
19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je .norestoredl			; DL = number of drives
19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp byte [cs:SavedAX+1],15h	; Get disk type function?
19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne .restoredl
19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		test byte [bp+4],80h		; Hard disk?
19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnz .norestoredl		; CX:DX = size of device
19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.restoredl:
20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov dl,[bp+4]
20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.norestoredl:
20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push ax
20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push ebx
20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push ds
20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,[bp+2]		; Flags
20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		lds ebx,[cs:Stack]
20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [bx+4],al		; Arithmetic flags
20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ds
20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ebx
21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ax
21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop bp
21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		lss esp,[cs:Stack]
21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.iret:		iret
21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanrecursive:
21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER '@'
21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanjmp_oldint13:
21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp far [cs:OldInt13]
21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanour_drive:
22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Set up standard entry frame
22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push ds
22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push es
22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ds,ax
22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov es,ax
22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,[SavedAX]
22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pushad
22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bp,sp		; Point BP to the entry stack frame
22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'F'
23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		WRITEHEX4
23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Note: AX == P_AX here
23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp ah,Int13FuncsCnt-1
23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ja Invalid_jump
23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%if ELTORITO
23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov al,[CD_PKT.type]	; Check if we are in
23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp al,0		; El Torito no emulation mode
23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ja .emulation		; No.  We support the function
23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp ah,3fh		; Yes.  We must not support functions
23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jbe Invalid_jump	; 0 through 3Fh.  Check and decide
24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.emulation:
24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif
24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor al,al		; AL = 0 is standard entry condition
24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov di,ax
24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shr di,7		; Convert AH to an offset in DI
24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call [Int13Funcs+di]
24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDone:		; Standard routine for return
24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_AX,ax
24976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDoneWeird:
25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'D'
25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor bx,bx
25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov es,bx
25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bx,[StatusPtr]
25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [es:bx],ah		; Save status
25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and ah,ah
25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		lds ebx,[Stack]
25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; This sets the low byte (the arithmetic flags) of the
25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; FLAGS on stack to either 00h (no flags) or 01h (CF)
26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; depending on if AH was zero or not.
26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		setnz [bx+4]		; Set CF iff error
26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		popad
26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop es
26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ds
26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		lss esp,[cs:Stack]
26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		iret
26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReset:
26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Reset affects multiple drives, so we need to pass it on
27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'R'
27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor ax,ax		; Bottom of memory
27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov es,ax
27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		test dl,dl		; Always pass it on if we are
27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; resetting HD
27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		js .hard_disk		; Bit 7 set
27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Some BIOSes get very unhappy if we pass a reset floppy
27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; command to them and don't actually have any floppies.
27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; This is a bug, but we have to deal with it nontheless.
27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Therefore, if we are the *ONLY* floppy drive, and the
28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; user didn't request HD reset, then just drop the command.
28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; BIOS equipment byte, top two bits + 1 == total # of floppies
28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		test byte [es:0x410],0C0h
28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jz success
28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp .pass_on		; ... otherwise pass it to the BIOS
28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.hard_disk:
28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; ... same thing for hard disks, sigh ...
28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp byte [es:0x475],1	; BIOS variable for number of hard
28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; disks
28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jbe success
29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.pass_on:
29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ax			; Drop return address
29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		popad			; Restore all registers
29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop es
29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ds
29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		lss esp,[cs:Stack]	; Restore the stack
29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and dl,80h		; Clear all but the type bit
29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp jmp_oldint13
29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
30176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInvalid:
30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop dx			; Drop return address
30376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInvalid_jump:
30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'I'
30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ah,01h		; Unsupported function
30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp short Done
30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
30876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanGetDriveType:
30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		test byte [DriveNo],80h
31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bl,02h		; Type 02h = floppy with changeline
31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jz .floppy
31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Hard disks only!  DO NOT set CX:DX for floppies...
31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; it apparently causes Win98SE DOS to go into an loop
31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; resetting the drive over and over.  Sigh.
31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		inc bx			; Type = 03h
31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov dx,[DiskSize]	; Return the disk size in sectors
31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_DX,dx
31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov cx,[DiskSize+2]
31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_CX,cx
32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.floppy:
32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_AH,bl		; 02h floppy, 03h hard disk
32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ax			; Drop return address
32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor ax,ax		; Success...
32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp DoneWeird		; But don't stick it into P_AX
32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
32676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanGetStatus:
32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor ax,ax
32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov es,ax
32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bx,[StatusPtr]
33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ah,[bx]		; Copy last status
33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
33376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadMult:
33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'm'
33576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRead:
33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'R'
33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call setup_regs
33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmando_copy:
33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER '<'
34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call bcopy
34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER '>'
34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		movzx ax,P_AL		; AH = 0, AL = transfer count
34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
34576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanWriteMult:
34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'M'
34776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanWrite:
34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'W'
34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		test byte [ConfigFlags],CONFIG_READONLY
35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnz .readonly
35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call setup_regs
35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xchg esi,edi		; Opposite direction of a Read!
35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp short do_copy
35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.readonly:	mov ah,03h		; Write protected medium
35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Verify integrity; just bounds-check
35876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSeek:
35976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanVerify:
36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call setup_regs		; Returns error if appropriate
36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; And fall through to success
36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
36376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCheckIfReady:				; These are always-successful noop functions
36476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRecalibrate:
36576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInitWithParms:
36676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDetectChange:
36776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEDDDetectChange:
36876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEDDLock:
36976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSetMode:
37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansuccess:
37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor ax,ax		; Always successful
37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanGetParms:
37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'G'
37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov dl,[DriveCnt]	; Cached data
37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_DL,dl
37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		test byte [DriveNo],80h
37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnz .hd
38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_DI,DPT
38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_ES,cs
38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bl,[DriveType]
38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_BL,bl
38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.hd:
38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,[Cylinders]
38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dec ax			; We report the highest #, not the count
38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xchg al,ah
38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shl al,6
38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		or al,[Sectors]
39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_CX,ax
39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,[Heads]
39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dec ax
39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_DH,al
39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		;
39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Is this MEMDISK installation check?
39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		;
39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp P_HAX,'ME'
39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne .notic
40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp P_HCX,'MD'
40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne .notic
40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp P_HDX,'IS'
40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne .notic
40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp P_HBX,'K?'
40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne .notic
40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; MEMDISK installation check...
40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_HAX,'!M'
40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_HCX,'EM'
41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_HDX,'DI'
41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_HBX,'SK'
41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_ES,cs
41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_DI,MemDisk_Info
41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.notic:
41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor ax,ax
41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; EDD functions -- only if enabled
42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%if EDD
42276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEDDPresence:
42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'E'
42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'c'
42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp P_BX,55AAh
42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne Invalid
42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_BX,0AA55h		; EDD signature
42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_AX,03000h		; EDD 3.0
43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov P_CX,0007h		; Bit 0 - Fixed disk access subset
43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; Bit 1 - Locking and ejecting subset
43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; Bit 2 - EDD subset
43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ax			; Drop return address
43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor ax,ax		; Success
43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp DoneWeird		; Success, but AH != 0, sigh...
43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEDDRead:
43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'E'
43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'r'
44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call edd_setup_regs
44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call bcopy
44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor ax,ax
44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
44676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEDDWrite:
44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'E'
44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'w'
44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call edd_setup_regs
45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xchg esi,edi		; Opposite direction of a Read!
45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call bcopy
45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor ax,ax
45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEDDVerify:
45776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEDDSeek:
45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call edd_setup_regs	; Just bounds checking
45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor ax,ax
46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
46276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEDDGetParms:
46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'E'
46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'p'
46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov es,P_DS
46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov di,P_SI
46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov si,EDD_DPT
46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		lodsw			; Length of our DPT
47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov cx,[es:di]
47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp cx,26		; Minimum size
47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jb .overrun
47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp cx,ax
47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jb .oksize
47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov cx,ax
47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.oksize:
48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,cx
48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		stosw
48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dec cx
48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dec cx
48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		rep movsb
48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor ax,ax
48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.overrun:
49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,0100h
49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif ; EDD
49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Set up registers as for a "Read", and compares against disk
49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; size.
49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; WARNING: This fails immediately, even if we can transfer some
49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; sectors.  This isn't really the correct behaviour.
49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansetup_regs:
49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Convert a CHS address in P_CX/P_DH into an LBA in eax
50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; CH = cyl[7:0]
50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; CL[0:5] = sector (1-based)  CL[7:6] = cyl[9:8]
50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; DH = head
50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		movzx ecx,P_CX
50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		movzx ebx,cl		; Sector number
50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and bl,3Fh
50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dec ebx			; Sector number is 1-based
50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp bx,[Sectors]
50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jae .overrun
51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		movzx edi,P_DH		; Head number
51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		movzx eax,word [Heads]
51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp di,ax
51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jae .overrun
51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shr cl,6
51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xchg cl,ch		; Now (E)CX <- cylinder number
51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mul ecx			; eax <- Heads*cyl# (edx <- 0)
51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add eax,edi
51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mul dword [Sectors]
51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add eax,ebx
52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Now eax = LBA, edx = 0
52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		;
52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; setup_regs continues...
52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		;
52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Note: edi[31:16] and ecx[31:16] = 0 already
52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov di,P_BX		; Get linear address of target buffer
52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov cx,P_ES
52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shl ecx,4
52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add edi,ecx		; EDI = address to fetch to
53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		movzx ecx,P_AL		; Sector count
53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov esi,eax
53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add eax,ecx		; LBA of final sector + 1
53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shl esi,SECTORSIZE_LG2	; LBA -> byte offset
53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add esi,[DiskBuf]	; Get address in high memory
53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp eax,[DiskSize]	; Check the high mark against limit
53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ja .overrun
53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shl ecx,SECTORSIZE_LG2-2 ; Convert count to dwords
53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
54076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.overrun:	pop ax			; Drop setup_regs return address
54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,0200h		; Missing address mark
54276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret			; Return to Done
54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Set up registers as for an EDD Read, and compares against disk size.
54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%if EDD
54676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanedd_setup_regs:
54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push es
54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov si,P_SI		; DS:SI -> DAPA
54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov es,P_DS
55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
55176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov dx,[es:si]
55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp dx,16
55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jb .baddapa
55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
55576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp dword [es:si+4],-1
55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je .linear_address
55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		movzx ebx,word [es:si+4]	; Offset
55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		movzx edi,word [es:si+6]	; Segment
56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shl edi,4
56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add ebx,edi
56276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp .got_address
56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.linear_address:
56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp dx,24		; Must be large enough to hold
56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; linear address
56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jb .baddapa
56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp dword [es:si+20],0	; > 4 GB addresses not supported
57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,0900h		; "Data boundary error" - bogus, but
57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; no really better code available
57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne .error
57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ebx,[es:si+16]
57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.got_address:
57776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp dword [es:si+12],0		; LBA too large?
57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne .overrun
57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		movzx ecx, word [es:si+2]	; Sectors to transfer
58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov esi,[es:si+8]		; Starting sector
58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov eax,esi
58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add eax,ecx
58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jc .overrun
58576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp eax,[DiskSize]
58676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ja .overrun
58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shl ecx,SECTORSIZE_LG2-2	; Convert to dwords
58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shl esi,SECTORSIZE_LG2		; Convert to an offset
59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add esi,[DiskBuf]
59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov edi,ebx
59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop es
59376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.baddapa:
59676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,0100h		; Invalid command
59776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop es
59876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ax			; Drop setup_regs return address
59976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
60076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
60176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.overrun:
60276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,0200h		; "Address mark not found" =
60376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; LBA beyond end of disk
60476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.error:
60576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and word [es:si+2],0	; No sectors transferred
60676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop es
60776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ax
60876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
60976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
61076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEDDEject:
61176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,0B200h		; Volume Not Removable
61276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
61376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%if ELTORITO
61476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanElToritoTerminate:
61576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'T'
61676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,[cs:SavedAX]
61776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp al,1		; We only support query, not terminate
61876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne ElToritoErr		; Fail
61976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp dl,7fh		; Terminate all?
62076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je .doit
62176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp dl,[cs:DriveNo]	; Terminate our drive?
62276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je .doit
62376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp ElToritoErr		; Fail
62476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.doit:		mov es,P_DS		; Caller's DS:SI pointed to packet
62576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov di,P_SI		; We'll use ES:DI
62676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov si,CD_PKT.size	; First byte is packet size
62776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor cx,0		; Empty our count
62876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		;mov cl,[ds:si]		; We'll copy that many bytes
62976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov cl,13h
63076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		rep movsb		; Copy until CX is zero
63176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,0		; Success
63276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
63376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanElToritoEmulate:
63476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanElToritoBoot:
63576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanElToritoCatalog:
63676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanElToritoErr:
63776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER '!'
63876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,100h		; Invalid parameter
63976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
64076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif ; ELTORITO
64176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif ; EDD
64276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
64376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
64476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; INT 15h intercept routines
64576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
64676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint15_e820:
64776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp edx,534D4150h	; "SMAP"
64876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne oldint15
64976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp ecx,20		; Need 20 bytes
65076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jb err86
65176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push ds
65276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push cs
65376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ds
65476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push edx		; "SMAP"
65576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and ebx,ebx
65676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne .renew
65776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ebx,E820Table
65876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.renew:
65976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add bx,12		; Advance to next
66076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov eax,[bx-4]		; Type
66176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and eax,eax		; Null type?
66276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jz .renew		; If so advance to next
66376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [es:di+16],eax
66476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov eax,[bx-12]		; Start addr (low)
66576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov edx,[bx-8]		; Start addr (high)
66676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [es:di],eax
66776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [es:di+4],edx
66876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov eax,[bx]		; End addr (low)
66976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov edx,[bx+4]		; End addr (high)
67076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		sub eax,[bx-12]		; Derive the length
67176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		sbb edx,[bx-8]
67276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [es:di+8],eax	; Length (low)
67376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [es:di+12],edx	; Length (high)
67476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp dword [bx+8],-1	; Type of next = end?
67576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jne .notdone
67676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor ebx,ebx		; Done with table
67776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.notdone:
67876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop eax			; "SMAP"
67976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov edx,eax		; Some systems expect eax = edx = SMAP
68076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ecx,20		; Bytes loaded
68176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ds
68276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint15_success:
68376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov byte [bp+6], 02h	; Clear CF
68476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop bp
68576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		iret
68676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
68776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanerr86:
68876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov byte [bp+6], 03h	; Set CF
68976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ah,86h
69076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop bp
69176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		iret
69276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
69376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInt15Start:
69476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push bp
69576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bp,sp
69676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp ax,0E820h
69776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je near int15_e820
69876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp ax,0E801h
69976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je int15_e801
70076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp ax,0E881h
70176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je int15_e881
70276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp ah,88h
70376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		je int15_88
70476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanoldint15:	pop bp
70576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp far [cs:OldInt15]
70676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
70776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint15_e801:				; Get mem size for > 64 MB config
70876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,[cs:Mem1MB]
70976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov cx,ax
71076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bx,[cs:Mem16MB]
71176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov dx,bx
71276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp short int15_success
71376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
71476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint15_e881:				; Get mem size for > 64 MB config
71576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; 32-bit code
71676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov eax,[cs:Mem1MB]
71776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ecx,eax
71876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ebx,[cs:Mem16MB]
71976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov edx,ebx
72076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp short int15_success
72176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
72276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint15_88:				; Get extended mem size
72376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,[cs:MemInt1588]
72476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp short int15_success
72576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
72676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
72776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Routine to copy in/out of high memory
72876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; esi = linear source address
72976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; edi = linear target address
73076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; ecx = 32-bit word count
73176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
73276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Assumes cs = ds = es
73376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;
73476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanbcopy:
73576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push eax
73676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push ebx
73776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push edx
73876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push ebp
73976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
74076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bx, real_int15_stub
74176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
74276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		test byte [ConfigFlags], CONFIG_RAW|CONFIG_SAFEINT
74376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jz .anymode		; Always do the real INT 15h
74476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
74576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		smsw ax			; Unprivileged!
74676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		test al,01h
74776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnz .protmode		; Protmode -> do real INT 15h
74876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
74976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.realmode:
75076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Raw or Safeint mode, and we're in real mode...
75176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
75276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		test byte [ConfigFlags], CONFIG_SAFEINT
75376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnz .fakeint15
75476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
75576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.raw:
75676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'r'
75776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; We're in real mode, do it outselves
75876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
75976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pushfd			; <A>
76076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push ds			; <B>
76176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push es			; <C>
76276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
76376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cli
76476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cld
76576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
76676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor ebx,ebx
76776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bx,cs
76876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shl ebx,4
76976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		lea edx,[Shaker+ebx]
77076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [Shaker+2],edx
77176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
77276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Test to see if A20 is enabled or not
77376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor ax,ax
77476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ds,ax
77576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dec ax
77676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov es,ax
77776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
77876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,[0]
77976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bx,ax
78076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor bx,[es:10h]
78176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		not ax
78276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [0],ax
78376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov dx,ax
78476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		xor dx,[es:10h]
78576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		not ax
78676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [0],ax
78776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
78876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		or dx,bx
78976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push dx			; <D> Save A20 status
79076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnz .skip_a20e
79176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
79276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,2401h		; Enable A20
79376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int 15h
79476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.skip_a20e:
79576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov dl,[ConfigFlags]
79676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and dx,CONFIG_BIGRAW
79776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add dx,8
79876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; DX = 16 for BIGRAW, 8 for RAW
79976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		;  8 is selector for a 64K flat segment,
80076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; 16 is selector for a 4GB flat segment.
80176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
80276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		lgdt [cs:Shaker]
80376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov eax,cr0
80476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		or al,01h
80576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov cr0,eax
80676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
80776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bx,16		; Large flat segment
80876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ds,bx
80976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov es,bx
81076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
81176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		a32 rep movsd
81276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
81376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; DX has the appropriate value to put in
81476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; the registers on return
81576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ds,dx
81676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov es,dx
81776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
81876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and al,~01h
81976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov cr0,eax
82076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
82176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop dx			; <D> A20 status
82276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop es			; <C>
82376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ds			; <B>
82476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
82576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and dx,dx
82676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnz .skip_a20d
82776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ax,2400h		; Disable A20
82876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int 15h
82976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.skip_a20d:
83076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		popfd			; <A>
83176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp .done
83276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
83376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.fakeint15:
83476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; We're in real mode with CONFIG_SAFEINT, invoke the
83576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; original INT 15h vector.  We used to test for the
83676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; INT 15h vector being unchanged here, but that is
83776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; *us*; however, the test was wrong for years (always
83876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; negative) so instead of fixing the test do what we
83976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; tested and don't bother probing.
84076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bx, fake_int15_stub
84176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
84276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.protmode:
84376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		TRACER 'p'
84476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.anymode:
84576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
84676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.copy_loop:
84776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push esi
84876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push edi
84976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push ecx
85076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp ecx,4000h
85176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jna .safe_size
85276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ecx,4000h
85376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.safe_size:
85476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push ecx	; Transfer size this cycle
85576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov eax, esi
85676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [Mover_src1], si
85776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shr eax, 16
85876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [Mover_src1+2], al
85976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [Mover_src2], ah
86076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov eax, edi
86176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [Mover_dst1], di
86276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shr eax, 16
86376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [Mover_dst1+2], al
86476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov [Mover_dst2], ah
86576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov si,Mover
86676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ah, 87h
86776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		shl cx,1	; Convert to 16-bit words
86876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call bx		; INT 15h stub
86976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop eax		; Transfer size this cycle
87076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ecx
87176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop edi
87276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop esi
87376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jc .error
87476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		lea esi,[esi+4*eax]
87576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		lea edi,[edi+4*eax]
87676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		sub ecx, eax
87776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jnz .copy_loop
87876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; CF = 0
87976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.error:
88076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.done:
88176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ebp
88276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop edx
88376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop ebx
88476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop eax
88576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
88676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
88776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanreal_int15_stub:
88876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int 15h
88976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cli		; Some BIOSes enable interrupts on INT 15h
89076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
89176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
89276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanfake_int15_stub:
89376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pushf
89476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		call far [OldInt15]
89576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cli
89676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
89776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
89876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG_TRACERS
89976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmandebug_tracer:	pushad
90076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pushfd
90176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bp,sp
90276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bx,[bp+9*4]
90376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov al,[cs:bx]
90476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		inc word [bp+9*4]
90576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ah,0Eh
90676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bx,7
90776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int 10h
90876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		popfd
90976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		popad
91076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
91176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
91276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanwritehex2:	pushad
91376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pushfd
91476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov cx,2
91576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ror eax,4
91676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp writehex_common
91776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanwritehex4:	pushad
91876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pushfd
91976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov cx,4
92076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ror eax,12
92176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jmp writehex_common
92276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanwritehex8:	pushad
92376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pushfd
92476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov cx,8
92576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ror eax,28
92676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanwritehex_common:
92776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.loop:		push cx
92876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		push eax
92976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		and al,0Fh
93076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		cmp al,10
93176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		jb .isdec
93276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		add al,'a'-'0'-10
93376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.isdec:		add al,'0'
93476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov ah,0Eh
93576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		mov bx,7
93676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		int 10h
93776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop eax
93876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		rol eax,4
93976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pop cx
94076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		loop .loop
94176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		popfd
94276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		popad
94376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		ret
94476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif
94576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
94676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		section .data align=16
94776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		alignb 2
94876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInt13Funcs	dw Reset		; 00h - RESET
94976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw GetStatus		; 01h - GET STATUS
95076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Read			; 02h - READ
95176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Write		; 03h - WRITE
95276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Verify		; 04h - VERIFY
95376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 05h - FORMAT TRACK
95476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 06h - FORMAT TRACK AND SET BAD FLAGS
95576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 07h - FORMAT DRIVE AT TRACK
95676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw GetParms		; 08h - GET PARAMETERS
95776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw InitWithParms	; 09h - INITIALIZE CONTROLLER WITH
95876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					;	DRIVE PARAMETERS
95976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 0Ah
96076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 0Bh
96176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Seek			; 0Ch - SEEK TO CYLINDER
96276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Reset		; 0Dh - RESET HARD DISKS
96376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 0Eh
96476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 0Fh
96576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw CheckIfReady		; 10h - CHECK IF READY
96676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Recalibrate		; 11h - RECALIBRATE
96776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 12h
96876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 13h
96976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 14h
97076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw GetDriveType		; 15h - GET DRIVE TYPE
97176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw DetectChange		; 16h - DETECT DRIVE CHANGE
97276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%if EDD
97376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 17h
97476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 18h
97576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 19h
97676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 1Ah
97776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 1Bh
97876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 1Ch
97976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 1Dh
98076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 1Eh
98176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 1Fh
98276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 20h
98376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw ReadMult		; 21h - READ MULTIPLE
98476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw WriteMult		; 22h - WRITE MULTIPLE
98576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw SetMode		; 23h - SET CONTROLLER FEATURES
98676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw SetMode		; 24h - SET MULTIPLE MODE
98776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 25h - IDENTIFY DRIVE
98876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 26h
98976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 27h
99076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 28h
99176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 29h
99276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 2Ah
99376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 2Bh
99476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 2Ch
99576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 2Dh
99676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 2Eh
99776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 2Fh
99876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 30h
99976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 31h
100076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 32h
100176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 33h
100276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 34h
100376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 35h
100476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 36h
100576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 37h
100676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 38h
100776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 39h
100876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 3Ah
100976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 3Bh
101076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 3Ch
101176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 3Dh
101276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 3Eh
101376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 3Fh
101476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw Invalid		; 40h
101576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw EDDPresence		; 41h - EDD PRESENCE DETECT
101676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw EDDRead		; 42h - EDD READ
101776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw EDDWrite		; 43h - EDD WRITE
101876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw EDDVerify		; 44h - EDD VERIFY
101976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw EDDLock		; 45h - EDD LOCK/UNLOCK MEDIA
102076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw EDDEject		; 46h - EDD EJECT
102176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw EDDSeek		; 47h - EDD SEEK
102276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw EDDGetParms		; 48h - EDD GET PARAMETERS
102376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw EDDDetectChange	; 49h - EDD MEDIA CHANGE STATUS
102476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%if ELTORITO				; EDD El Torito Functions
102576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; ELTORITO _must_ also have EDD
102676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw ElToritoEmulate	; 4Ah - Initiate Disk Emulation
102776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw ElToritoTerminate	; 4Bh - Terminate Disk Emulation
102876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw ElToritoBoot		; 4Ch - Initiate Disk Emu. and Reboot
102976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw ElToritoCatalog	; 4Dh - Return Boot Catalog
103076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif ; ELTORITO
103176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif ; EDD
103276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
103376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInt13FuncsEnd	equ $
103476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInt13FuncsCnt	equ (Int13FuncsEnd-Int13Funcs) >> 1
103576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
103676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
103776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		alignb 8, db 0
103876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanShaker		dw ShakerEnd-$-1	; Descriptor table limit
103976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dd 0			; Pointer to self
104076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw 0
104176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
104276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanShaker_RMDS:	dd 0x0000ffff		; 64K data segment
104376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dd 0x00009300
104476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
104576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanShaker_DS:	dd 0x0000ffff		; 4GB data segment
104676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dd 0x008f9300
104776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
104876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanShakerEnd	equ $
104976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
105076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		alignb 8, db 0
105176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
105276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMover		dd 0, 0, 0, 0		; Must be zero
105376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw 0ffffh		; 64 K segment size
105476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMover_src1:	db 0, 0, 0		; Low 24 bits of source addy
105576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db 93h			; Access rights
105676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db 00h			; Extended access rights
105776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMover_src2:	db 0			; High 8 bits of source addy
105876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw 0ffffh		; 64 K segment size
105976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMover_dst1:	db 0, 0, 0		; Low 24 bits of target addy
106076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db 93h			; Access rights
106176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db 00h			; Extended access rights
106276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMover_dst2:	db 0			; High 8 bits of source addy
106376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMover_dummy2:	dd 0, 0, 0, 0		; More space for the BIOS
106476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
106576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		alignb 16, db 0
106676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanmBFT:
106776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Fields common to all ACPI tables
106876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dd '    '		; ACPI signature ("mBFT")
106976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; This is filled-in by the installer
107076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; to avoid an accidentally valid mBFT
107176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dd mBFT_Len		; ACPI table length
107276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db 1			; ACPI revision
107376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db 0			; ACPI table checksum
107476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db 'MEMDSK'		; ACPI OEM ID
107576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db 'Syslinux'		; ACPI OEM table ID
107676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dd 0			; ACPI OEM revision
107776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dd 0			; ACPI ASL compiler vendor ID
107876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dd 0			; ACPI ASL compiler revision
107976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; The next field is mBFT-specific and filled-in by the installer
108076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dd 0			; "Safe hook" physical address
108176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
108276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Note that the above ends on a DWORD boundary.
108376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; The MDI has always started at such a boundary.
108476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Portions of the MDI are patched by the installer
108576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMemDisk_Info	equ $			; Pointed to by installation check
108676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMDI_Bytes	dw MDI_Len		; Total bytes in MDI structure
108776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMDI_Version	db VERSION_MINOR, VERSION_MAJOR	; MEMDISK version
108876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
108976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDiskBuf		dd 0			; Linear address of high memory disk
109076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDiskSize	dd 0			; Size of disk in blocks
109176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCommandLine	dw 0, 0			; Far pointer to saved command line
109276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
109376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanOldInt13	dd 0			; INT 13h in chain
109476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanOldInt15	dd 0			; INT 15h in chain
109576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
109676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanOldDosMem	dw 0			; Old position of DOS mem end
109776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanBootLoaderID	db 0			; Boot loader ID from header
109876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db 0			; pad
109976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
110076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDPT_ptr		dw 0			; If nonzero, pointer to DPT
110176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; Original DPT pointer follows
110276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
110376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMDI_Len		equ $-MemDisk_Info
110476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanmBFT_Len	equ $-mBFT		; mBFT includes the MDI
110576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
110676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; ---- MDI structure ends here ---
110776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDriveShiftLimit	db 0ffh			; Installer will probe for
110876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; a range of contiguous drives.
110976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; Any BIOS drives above this region
111076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; shall not be impacted by our
111176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					; shifting behaviour
111276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		db 0			; pad to a DWORD
111376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw 0			; pad to a QWORD
111476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMemInt1588	dw 0			; 1MB-65MB memory amount (1K)
111576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
111676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCylinders	dw 0			; Cylinder count
111776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanHeads		dw 0			; Head count
111876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSectors		dd 0			; Sector count (zero-extended)
111976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
112076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMem1MB		dd 0			; 1MB-16MB memory amount (1K)
112176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMem16MB		dd 0			; 16MB-4G memory amount (64K)
112276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
112376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDriveNo		db 0			; Our drive number
112476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDriveType	db 0			; Our drive type (floppies)
112576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDriveCnt	db 0			; Drive count (from the BIOS)
112676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
112776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanConfigFlags	db 0			; Bit 0 - readonly
112876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
112976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMyStack		dw 0			; Offset of stack
113076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanStatusPtr	dw 0			; Where to save status (zeroseg ptr)
113176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
113276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDPT		times 16 db 0		; BIOS parameter table pointer (floppies)
113376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanOldInt1E	dd 0			; Previous INT 1E pointer (DPT)
113476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
113576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%if EDD
113676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEDD_DPT:
113776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.length		dw 30
113876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.info		dw 0029h
113976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Bit 0 - DMA boundaries handled transparently
114076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Bit 3 - Device supports write verify
114176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		; Bit 5 - Media is lockable
114276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.cylinders	dd 0			; Filled in by installer
114376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.heads		dd 0			; Filled in by installer
114476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.sectors	dd 0			; Filled in by installer
114576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.totalsize	dd 0, 0			; Filled in by installer
114676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.bytespersec	dw SECTORSIZE
114776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.eddtable	dw -1, -1		; Invalid DPTE pointer
114876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.dpikey		dw 0BEDDh		; Device Path Info magic
114976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.dpilen		db 2ch			; DPI len
115076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.res1		db 0			; Reserved
115176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.res2		dw 0			; Reserved
115276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.bustype	dd 'MEM '		; Host bus type (4 bytes, space padded)
115376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.inttype	dd 'MEMORY  '		; Interface type (8 bytes, spc. padded)
115476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.intpath	dd 0, 0			; Interface path
115576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.devpath	dd 0, 0, 0, 0		; Device path
115676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.res3		db 0			; Reserved
115776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.chksum		db 0			; DPI checksum
115876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
115976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%if ELTORITO
116076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; El Torito CD Specification Packet - mostly filled in by installer
116176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCD_PKT:
116276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.size		db 13h	; Packet size (19 bytes)
116376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.type		db 0	; Boot media type (flags)
116476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.driveno	db 0E0h	; INT 13h drive number
116576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.controller	db 0	; Controller index
116676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.start		dd 0	; Starting LBA of image
116776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.devno		dw 0	; Device number
116876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.user_buf	dw 0	; User buffer segment
116976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.load_seg	dw 0	; Load segment
117076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.sect_count	dw 0	; Emulated sectors to load
117176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.geom1		db 0	; Cylinders bits 0 thru 7
117276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.geom2		db 0	; Sects/track 0 thru 5, cyls 8, 9
117376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman.geom3		db 0	; Heads
117476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif ; ELTORITO
117576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
117676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif ; EDD
117776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
117876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; End patch area
117976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
118076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		alignb 4, db 0
118176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanStack		dd 0			; Saved SS:ESP on invocation
118276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		dw 0
118376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSavedAX		dw 0			; AX saved on invocation
118476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRecursive	dw 0			; Recursion counter
118576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
118676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		alignb 4, db 0		; We *MUST* end on a dword boundary
118776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
118876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanE820Table	equ $			; The installer loads the E820 table here
118976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanTotalSize	equ $			; End pointer
1190