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