Author: cwittich Date: Sun Aug 27 17:26:43 2006 New Revision: 23742
URL: http://svn.reactos.org/svn/reactos?rev=23742&view=rev Log: renamed isoboot_regtest.asm to isobtrt.asm to comply with ISO-9660 standard
Added: trunk/reactos/boot/freeldr/bootsect/isobtrt.asm - copied unchanged from r23740, trunk/reactos/boot/freeldr/bootsect/isoboot_regtest.asm Removed: trunk/reactos/boot/freeldr/bootsect/isoboot_regtest.asm Modified: trunk/reactos/boot/freeldr/bootsect/bootsect.rbuild
Modified: trunk/reactos/boot/freeldr/bootsect/bootsect.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/boots... ============================================================================== --- trunk/reactos/boot/freeldr/bootsect/bootsect.rbuild (original) +++ trunk/reactos/boot/freeldr/bootsect/bootsect.rbuild Sun Aug 27 17:26:43 2006 @@ -18,9 +18,9 @@ <bootstrap base="loader" nameoncd="isoboot.bin" /> <file>isoboot.asm</file> </module> -<module name="isoboot_regtest" type="bootsector"> - <bootstrap base="loader" nameoncd="isoboot_regtest.bin" /> - <file>isoboot_regtest.asm</file> +<module name="isobtrt" type="bootsector"> + <bootstrap base="loader" nameoncd="isobtrt.bin" /> + <file>isobtrt.asm</file> </module> <if property="ARCH" value="powerpc"> <module name="ofwldr" type="bootprogram" payload="freeldr">
Removed: trunk/reactos/boot/freeldr/bootsect/isoboot_regtest.asm URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/isobo... ============================================================================== --- trunk/reactos/boot/freeldr/bootsect/isoboot_regtest.asm (original) +++ trunk/reactos/boot/freeldr/bootsect/isoboot_regtest.asm (removed) @@ -1,1023 +1,0 @@ -; **************************************************************************** -; -; isolinux.asm -; -; A program to boot Linux kernels off a CD-ROM using the El Torito -; boot standard in "no emulation" mode, making the entire filesystem -; available. It is based on the SYSLINUX boot loader for MS-DOS -; floppies. -; -; Copyright (C) 1994-2001 H. Peter Anvin -; -; This program is free software; you can redistribute it and/or modify -; it under the terms of the GNU General Public License as published by -; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139, -; USA; either version 2 of the License, or (at your option) any later -; version; incorporated herein by reference. -; -; **************************************************************************** -; -; THIS FILE IS A MODIFIED VERSION OF ISOLINUX.ASM -; MODIFICATION DONE BY MICHAEL K TER LOUW -; LAST UPDATED 3-9-2002 -; SEE "COPYING" FOR INFORMATION ABOUT THE LICENSE THAT APPLIES TO THIS RELEASE -; -; **************************************************************************** -; -; This file is a modified version of ISOLINUX.ASM. -; Modification done by Eric Kohl -; Last update 04-25-2002 -; -; **************************************************************************** -; -; This file is a modified version of ISOLINUX.ASM. -; (for ReactOS regression testing) -; Modification done by Christoph von Wittich -; Last update 08-27-2006 -; -; **************************************************************************** - - -; Note: The Makefile builds one version with DEBUG_MESSAGES automatically. -;%define DEBUG_MESSAGES ; Uncomment to get debugging messages - -%define WAIT_FOR_KEY - - -; --------------------------------------------------------------------------- -; BEGIN THE BIOS/CODE/DATA SEGMENT -; --------------------------------------------------------------------------- - - absolute 0400h -serial_base resw 4 ; Base addresses for 4 serial ports - absolute 0413h -BIOS_fbm resw 1 ; Free Base Memory (kilobytes) - absolute 046Ch -BIOS_timer resw 1 ; Timer ticks - absolute 0472h -BIOS_magic resw 1 ; BIOS reset magic - absolute 0484h -BIOS_vidrows resb 1 ; Number of screen rows - -; -; Memory below this point is reserved for the BIOS and the MBR -; - absolute 1000h -trackbuf resb 8192 ; Track buffer goes here -trackbufsize equ $-trackbuf -; trackbuf ends at 3000h - - struc open_file_t -file_sector resd 1 ; Sector pointer (0 = structure free) -file_left resd 1 ; Number of sectors left - endstruc - - struc dir_t -dir_lba resd 1 ; Directory start (LBA) -dir_len resd 1 ; Length in bytes -dir_clust resd 1 ; Length in clusters - endstruc - - -MAX_OPEN_LG2 equ 2 ; log2(Max number of open files) -MAX_OPEN equ (1 << MAX_OPEN_LG2) -SECTORSIZE_LG2 equ 11 ; 2048 bytes/sector (El Torito requirement) -SECTORSIZE equ (1 << SECTORSIZE_LG2) -CR equ 13 ; Carriage Return -LF equ 10 ; Line Feed -retry_count equ 6 ; How patient are we with the BIOS? - - - - absolute 5000h ; Here we keep our BSS stuff - -DriveNo resb 1 ; CD-ROM BIOS drive number -DiskError resb 1 ; Error code for disk I/O -RetryCount resb 1 ; Used for disk access retries -TimeoutCount resb 1 ; Timeout counter -ISOFlags resb 1 ; Flags for ISO directory search -RootDir resb dir_t_size ; Root directory -CurDir resb dir_t_size ; Current directory -ISOFileName resb 64 ; ISO filename canonicalization buffer -ISOFileNameEnd equ $ - - - alignb open_file_t_size -Files resb MAX_OPEN*open_file_t_size - - - - section .text - org 7000h - -start: - cli ; Disable interrupts - xor ax, ax ; ax = segment zero - mov ss, ax ; Initialize stack segment - mov sp, start ; Set up stack - mov ds, ax ; Initialize other segment registers - mov es, ax - mov fs, ax - mov gs, ax - sti ; Enable interrupts - cld ; Increment pointers - - mov cx, 2048 >> 2 ; Copy the bootsector - mov si, 0x7C00 ; from 0000:7C00 - mov di, 0x7000 ; to 0000:7000 - rep movsd ; copy the program - jmp 0:relocate ; jump into relocated code - -relocate: - ; Display the banner and copyright -%ifdef DEBUG_MESSAGES - mov si, isolinux_banner ; si points to hello message - call writestr ; display the message - mov si,copyright_str - call writestr -%endif - - - ; Make sure the keyboard buffer is empty -%ifdef WAIT_FOR_KEY -.kbd_buffer_test: - call pollchar - jz .kbd_buffer_empty - call getchar - jmp .kbd_buffer_test -.kbd_buffer_empty: - - ; Check if there is harddisk - pusha - mov ax, 0800h - mov dx, 0080h - int 13h - popa - jmp .boot_cdrom - - ; Display the 'Press key' message and wait for a maximum of 5 seconds - call crlf - mov si, presskey_msg ; si points to 'Press key' message - call writestr ; display the message - - mov byte [TimeoutCount], 5 -.next_second: - mov eax, [BIOS_timer] ; load current tick counter - add eax, 19 ; - -.poll_again: - call pollchar - jnz .boot_cdrom - - mov ebx, [BIOS_timer] - cmp eax, ebx - jnz .poll_again - - mov si, dot_msg ; print '.' - call writestr - dec byte [TimeoutCount] ; decrement timeout counter - jz .boot_harddisk - jmp .next_second - -.boot_harddisk: - call crlf - - ; Boot first harddisk (drive 0x80) - mov ax, 0201h - mov dx, 0080h - mov cx, 0001h - mov bx, 7C00h - int 13h - jnc .go_hd - jmp kaboom -.go_hd: - mov ax, cs - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - mov dx, 0080h - - jmp 0:0x7C00 -%endif - -.boot_cdrom: -%ifdef WAIT_FOR_KEY - call crlf - call crlf -%endif - - ; Save and display the boot drive number - mov [DriveNo], dl -%ifdef DEBUG_MESSAGES - mov si, startup_msg - call writemsg - mov al, dl - call writehex2 - call crlf -%endif - - ; Now figure out what we're actually doing - ; Note: use passed-in DL value rather than 7Fh because - ; at least some BIOSes will get the wrong value otherwise - mov ax, 4B01h ; Get disk emulation status - mov dl, [DriveNo] - mov si, spec_packet - int 13h - jc near spec_query_failed ; Shouldn't happen (BIOS bug) - mov dl, [DriveNo] - cmp [sp_drive], dl ; Should contain the drive number - jne near spec_query_failed - -%ifdef DEBUG_MESSAGES - mov si, spec_ok_msg - call writemsg - mov al, byte [sp_drive] - call writehex2 - call crlf -%endif - -found_drive: - ; Get drive information - mov ah, 48h - mov dl, [DriveNo] - mov si, drive_params - int 13h - jnc params_ok - - ; mov si, nosecsize_msg No use in reporting this - ; call writemsg - -params_ok: - ; Check for the sector size (should be 2048, but - ; some BIOSes apparently think we're 512-byte media) - ; - ; FIX: We need to check what the proper behaviour - ; is for getlinsec when the BIOS thinks the sector - ; size is 512!!! For that, we need such a BIOS, though... -%ifdef DEBUG_MESSAGES - mov si, secsize_msg - call writemsg - mov ax, [dp_secsize] - call writehex4 - call crlf -%endif - - - ; - ; Clear Files structures - ; - mov di, Files - mov cx, (MAX_OPEN*open_file_t_size)/4 - xor eax, eax - rep stosd - - ; - ; Now, we need to sniff out the actual filesystem data structures. - ; mkisofs gave us a pointer to the primary volume descriptor - ; (which will be at 16 only for a single-session disk!); from the PVD - ; we should be able to find the rest of what we need to know. - ; -get_fs_structures: - mov eax, 16 ; Primary Volume Descriptor (sector 16) - mov bx, trackbuf - call getonesec - - mov eax, [trackbuf+156+2] - mov [RootDir+dir_lba],eax - mov [CurDir+dir_lba],eax -%ifdef DEBUG_MESSAGES - mov si, rootloc_msg - call writemsg - call writehex8 - call crlf -%endif - - mov eax,[trackbuf+156+10] - mov [RootDir+dir_len],eax - mov [CurDir+dir_len],eax -%ifdef DEBUG_MESSAGES - mov si, rootlen_msg - call writemsg - call writehex8 - call crlf -%endif - add eax,SECTORSIZE-1 - shr eax,SECTORSIZE_LG2 - mov [RootDir+dir_clust],eax - mov [CurDir+dir_clust],eax -%ifdef DEBUG_MESSAGES - mov si, rootsect_msg - call writemsg - call writehex8 - call crlf -%endif - - ; Look for the "REACTOS" directory, and if found, - ; make it the current directory instead of the root - ; directory. - mov di,isolinux_dir - mov al,02h ; Search for a directory - call searchdir_iso - jnz .dir_found - mov si,no_dir_msg - call writemsg - jmp kaboom - -.dir_found: - mov [CurDir+dir_len],eax - mov eax,[si+file_left] - mov [CurDir+dir_clust],eax - xor eax,eax ; Free this file pointer entry - xchg eax,[si+file_sector] - mov [CurDir+dir_lba],eax - - - mov di, isolinux_bin ; di points to Isolinux filename - call searchdir ; look for the file - jnz .isolinux_opened ; got the file - mov si, no_isolinux_msg ; si points to error message - call writemsg ; display the message - jmp kaboom ; fail boot - -.isolinux_opened: - mov di, si ; save file pointer - -%ifdef DEBUG_MESSAGES - mov si, filelen_msg - call writemsg - call writehex8 - call crlf -%endif - - mov ecx, eax ; calculate sector count - shr ecx, 11 - test eax, 0x7FF - jz .full_sector - inc ecx -.full_sector: - -%ifdef DEBUG_MESSAGES - mov eax, ecx - mov si, filesect_msg - call writemsg - call writehex8 - call crlf -%endif - - mov bx, 0x8000 ; bx = load address - mov si, di ; restore file pointer - mov cx, 0xFFFF ; load the whole file - call getfssec ; get the whole file - -%ifdef DEBUG_MESSAGES - mov si, startldr_msg - call writemsg - call crlf -%endif - - mov dl, [DriveNo] ; dl = boot drive - mov dh, 0 ; dh = boot partition - jmp 0:0x8000 ; jump into OSLoader - - - -; -; searchdir: -; -; Open a file -; -; On entry: -; DS:DI = filename -; If successful: -; ZF clear -; SI = file pointer -; DX:AX or EAX = file length in bytes -; If unsuccessful -; ZF set -; - -; -; searchdir_iso is a special entry point for ISOLINUX only. In addition -; to the above, searchdir_iso passes a file flag mask in AL. This is useful -; for searching for directories. -; -alloc_failure: - xor ax,ax ; ZF <- 1 - ret - -searchdir: - xor al,al -searchdir_iso: - mov [ISOFlags],al - call allocate_file ; Temporary file structure for directory - jnz alloc_failure - push es - push ds - pop es ; ES = DS - mov si,CurDir - cmp byte [di],'' ; If filename begins with slash - jne .not_rooted - inc di ; Skip leading slash - mov si,RootDir ; Reference root directory instead -.not_rooted: - mov eax,[si+dir_clust] - mov [bx+file_left],eax - mov eax,[si+dir_lba] - mov [bx+file_sector],eax - mov edx,[si+dir_len] - -.look_for_slash: - mov ax,di -.scan: - mov cl,[di] - inc di - and cl,cl - jz .isfile - cmp cl,'' - jne .scan - mov [di-1],byte 0 ; Terminate at directory name - mov cl,02h ; Search for directory - xchg cl,[ISOFlags] - push di - push cx - push word .resume ; Where to "return" to - push es -.isfile: - xchg ax,di - -.getsome: - ; Get a chunk of the directory - mov si,trackbuf - pushad - xchg bx,si - mov cx,1 ; load one sector - call getfssec - popad - -.compare: - movzx eax, byte [si] ; Length of directory entry - cmp al, 33 - jb .next_sector - mov cl, [si+25] - xor cl, [ISOFlags] - test cl, byte 8Eh ; Unwanted file attributes! - jnz .not_file - pusha - movzx cx, byte [si+32] ; File identifier length - add si, byte 33 ; File identifier offset - call iso_compare_names - popa - je .success -.not_file: - sub edx, eax ; Decrease bytes left - jbe .failure - add si, ax ; Advance pointer - -.check_overrun: - ; Did we finish the buffer? - cmp si, trackbuf+trackbufsize - jb .compare ; No, keep going - - jmp short .getsome ; Get some more directory - -.next_sector: - ; Advance to the beginning of next sector - lea ax, [si+SECTORSIZE-1] - and ax, ~(SECTORSIZE-1) - sub ax, si - jmp short .not_file ; We still need to do length checks - -.failure: -%ifdef DEBUG_MESSAGES - mov si, findfail_msg - call writemsg - call crlf -%endif - xor eax, eax ; ZF = 1 - mov [bx+file_sector], eax - pop es - ret - -.success: - mov eax, [si+2] ; Location of extent - mov [bx+file_sector], eax - mov eax, [si+10] ; Data length - push eax - add eax, SECTORSIZE-1 - shr eax, SECTORSIZE_LG2 - mov [bx+file_left], eax - pop eax - mov edx, eax - shr edx, 16 - and bx, bx ; ZF = 0 - mov si, bx - pop es - ret - -.resume: - ; We get here if we were only doing part of a lookup - ; This relies on the fact that .success returns bx == si - xchg edx, eax ; Directory length in edx - pop cx ; Old ISOFlags - pop di ; Next filename pointer - - mov byte [di-1], '' ; restore the backslash in the filename - - mov [ISOFlags], cl ; Restore the flags - jz .failure ; Did we fail? If so fail for real! - jmp .look_for_slash ; Otherwise, next level - -; -; allocate_file: Allocate a file structure -; -; If successful: -; ZF set -; BX = file pointer -; In unsuccessful: -; ZF clear -; -allocate_file: - push cx - mov bx, Files - mov cx, MAX_OPEN -.check: - cmp dword [bx], byte 0 - je .found - add bx, open_file_t_size ; ZF = 0 - loop .check - ; ZF = 0 if we fell out of the loop -.found: - pop cx - ret - -; -; iso_compare_names: -; Compare the names DS:SI and DS:DI and report if they are -; equal from an ISO 9660 perspective. SI is the name from -; the filesystem; CX indicates its length, and ';' terminates. -; DI is expected to end with a null. -; -; Note: clobbers AX, CX, SI, DI; assumes DS == ES == base segment -; -iso_compare_names: - ; First, terminate and canonicalize input filename - push di - mov di, ISOFileName -.canon_loop: - jcxz .canon_end - lodsb - dec cx - cmp al, ';' - je .canon_end - and al, al - je .canon_end - stosb - cmp di, ISOFileNameEnd-1 ; Guard against buffer overrun - jb .canon_loop -.canon_end: - cmp di, ISOFileName - jbe .canon_done - cmp byte [di-1], '.' ; Remove terminal dots - jne .canon_done - dec di - jmp short .canon_end -.canon_done: - mov [di], byte 0 ; Null-terminate string - pop di - mov si, ISOFileName -.compare: - lodsb - mov ah, [di] - inc di - and ax, ax - jz .success ; End of string for both - and al, al ; Is either one end of string? - jz .failure ; If so, failure - and ah, ah - jz .failure - or ax, 2020h ; Convert to lower case - cmp al, ah - je .compare -.failure: - and ax, ax ; ZF = 0 (at least one will be nonzero) -.success: - ret - - - - - - - -; -; getfssec: Get multiple clusters from a file, given the file pointer. -; -; On entry: -; ES:BX -> Buffer -; SI -> File pointer -; CX -> Cluster count; 0FFFFh = until end of file -; On exit: -; SI -> File pointer (or 0 on EOF) -; CF = 1 -> Hit EOF -; -getfssec: - cmp cx, [si+file_left] - jna .ok_size - mov cx, [si+file_left] - -.ok_size: - mov bp, cx - push cx - push si - mov eax, [si+file_sector] - call getlinsec - xor ecx, ecx - pop si - pop cx - - add [si+file_sector], ecx - sub [si+file_left], ecx - ja .not_eof ; CF = 0 - - xor ecx, ecx - mov [si+file_sector], ecx ; Mark as unused - xor si,si - stc - -.not_eof: - ret - - - -; INT 13h, AX=4B01h, DL=<passed in value> failed. -; Try to scan the entire 80h-FFh from the end. -spec_query_failed: - mov si,spec_err_msg - call writemsg - - mov dl, 0FFh -.test_loop: - pusha - mov ax, 4B01h - mov si, spec_packet - mov byte [si], 13 ; Size of buffer - int 13h - popa - jc .still_broken - - mov si, maybe_msg - call writemsg - mov al, dl - call writehex2 - call crlf - - cmp byte [sp_drive], dl - jne .maybe_broken - - ; Okay, good enough... - mov si, alright_msg - call writemsg - mov [DriveNo], dl -.found_drive: - jmp found_drive - - ; Award BIOS 4.51 apparently passes garbage in sp_drive, - ; but if this was the drive number originally passed in - ; DL then consider it "good enough" -.maybe_broken: - cmp byte [DriveNo], dl - je .found_drive - -.still_broken: - dec dx - cmp dl, 80h - jnb .test_loop - -fatal_error: - mov si, nothing_msg - call writemsg - -.norge: - jmp short .norge - - - - ; Information message (DS:SI) output - ; Prefix with "isolinux: " - ; -writemsg: - push ax - push si - mov si, isolinux_str - call writestr - pop si - call writestr - pop ax - ret - -; -; crlf: Print a newline -; -crlf: - mov si, crlf_msg - ; Fall through - -; -; writestr: write a null-terminated string to the console, saving -; registers on entry. -; -writestr: - pushfd - pushad -.top: - lodsb - and al, al - jz .end - call writechr - jmp short .top -.end: - popad - popfd - ret - - -; -; writehex[248]: Write a hex number in (AL, AX, EAX) to the console -; -writehex2: - pushfd - pushad - shl eax, 24 - mov cx, 2 - jmp short writehex_common -writehex4: - pushfd - pushad - shl eax, 16 - mov cx, 4 - jmp short writehex_common -writehex8: - pushfd - pushad - mov cx, 8 -writehex_common: -.loop: - rol eax, 4 - push eax - and al, 0Fh - cmp al, 10 - jae .high -.low: - add al, '0' - jmp short .ischar -.high: - add al, 'A'-10 -.ischar: - call writechr - pop eax - loop .loop - popad - popfd - ret - -; -; Write a character to the screen. There is a more "sophisticated" -; version of this in the subsequent code, so we patch the pointer -; when appropriate. -; - -writechr: - pushfd - pushad - mov ah, 0Eh - xor bx, bx - int 10h - popad - popfd - ret - -; -; Get one sector. Convenience entry point. -; -getonesec: - mov bp, 1 - ; Fall through to getlinsec - -; -; Get linear sectors - EBIOS LBA addressing, 2048-byte sectors. -; -; Note that we can't always do this as a single request, because at least -; Phoenix BIOSes has a 127-sector limit. To be on the safe side, stick -; to 32 sectors (64K) per request. -; -; Input: -; EAX - Linear sector number -; ES:BX - Target buffer -; BP - Sector count -; -getlinsec: - mov si,dapa ; Load up the DAPA - mov [si+4],bx - mov bx,es - mov [si+6],bx - mov [si+8],eax -.loop2: - push bp ; Sectors left - cmp bp,[MaxTransfer] - jbe .bp_ok - mov bp,[MaxTransfer] -.bp_ok: - mov [si+2],bp - push si - mov dl,[DriveNo] - mov ah,42h ; Extended Read - call xint13 - pop si - pop bp - movzx eax,word [si+2] ; Sectors we read - add [si+8],eax ; Advance sector pointer - sub bp,ax ; Sectors left - shl ax,SECTORSIZE_LG2-4 ; 2048-byte sectors -> segment - add [si+6],ax ; Advance buffer pointer - and bp,bp - jnz .loop2 - mov eax,[si+8] ; Next sector - ret - - ; INT 13h with retry -xint13: - mov byte [RetryCount], retry_count -.try: - pushad - int 13h - jc .error - add sp, byte 8*4 ; Clean up stack - ret -.error: - mov [DiskError], ah ; Save error code - popad - dec byte [RetryCount] - jz .real_error - push ax - mov al,[RetryCount] - mov ah,[dapa+2] ; Sector transfer count - cmp al,2 ; Only 2 attempts left - ja .nodanger - mov ah,1 ; Drop transfer size to 1 - jmp short .setsize -.nodanger: - cmp al,retry_count-2 - ja .again ; First time, just try again - shr ah,1 ; Otherwise, try to reduce - adc ah,0 ; the max transfer size, but not to 0 -.setsize: - mov [MaxTransfer],ah - mov [dapa+2],ah -.again: - pop ax - jmp .try - -.real_error: - mov si, diskerr_msg - call writemsg - mov al, [DiskError] - call writehex2 - mov si, ondrive_str - call writestr - mov al, dl - call writehex2 - call crlf - ; Fall through to kaboom - -; -; kaboom: write a message and bail out. Wait for a user keypress, -; then do a hard reboot. -; -kaboom: - mov ax, cs - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - sti - mov si, err_bootfailed - call writestr - call getchar - cli - mov word [BIOS_magic], 0 ; Cold reboot - jmp 0F000h:0FFF0h ; Reset vector address - -getchar: -.again: - mov ah, 1 ; Poll keyboard - int 16h - jz .again -.kbd: - xor ax, ax ; Get keyboard input - int 16h -.func_key: - ret - - -; -; pollchar: check if we have an input character pending (ZF = 0) -; -pollchar: - pushad - mov ah,1 ; Poll keyboard - int 16h - popad - ret - - - -isolinux_banner db CR, LF, 'Loading IsoBoot...', CR, LF, 0 -copyright_str db ' Copyright (C) 1994-2002 H. Peter Anvin', CR, LF, 0 -presskey_msg db 'Press any key to boot from CD', 0 -dot_msg db '.',0 - -%ifdef DEBUG_MESSAGES -startup_msg: db 'Starting up, DL = ', 0 -spec_ok_msg: db 'Loaded spec packet OK, drive = ', 0 -secsize_msg: db 'Sector size appears to be ', 0 -rootloc_msg: db 'Root directory location: ', 0 -rootlen_msg: db 'Root directory length: ', 0 -rootsect_msg: db 'Root directory length(sectors): ', 0 -fileloc_msg: db 'SETUPLDR.SYS location: ', 0 -filelen_msg: db 'SETUPLDR.SYS length: ', 0 -filesect_msg: db 'SETUPLDR.SYS length(sectors): ', 0 -findfail_msg: db 'Failed to find file!', 0 -startldr_msg: db 'Starting SETUPLDR.SYS', 0 -%endif - -nosecsize_msg: db 'Failed to get sector size, assuming 0800', CR, LF, 0 -spec_err_msg: db 'Loading spec packet failed, trying to wing it...', CR, LF, 0 -maybe_msg: db 'Found something at drive = ', 0 -alright_msg: db 'Looks like it might be right, continuing...', CR, LF, 0 -nothing_msg: db 'Failed to locate CD-ROM device; boot failed.', CR, LF, 0 -isolinux_str db 'IsoBoot: ', 0 -crlf_msg db CR, LF, 0 -diskerr_msg: db 'Disk error ', 0 -ondrive_str: db ', drive ', 0 -err_bootfailed db CR, LF, 'Boot failed: press a key to retry...' -isolinux_dir db '\LOADER', 0 -no_dir_msg db 'Could not find the LOADER directory.', CR, LF, 0 -isolinux_bin db 'SETUPLDR.SYS', 0 -no_isolinux_msg db 'Could not find SETUPLDR.SYS.', CR, LF, 0 - -; -; El Torito spec packet -; - align 8, db 0 -spec_packet: db 13h ; Size of packet -sp_media: db 0 ; Media type -sp_drive: db 0 ; Drive number -sp_controller: db 0 ; Controller index -sp_lba: dd 0 ; LBA for emulated disk image -sp_devspec: dw 0 ; IDE/SCSI information -sp_buffer: dw 0 ; User-provided buffer -sp_loadseg: dw 0 ; Load segment -sp_sectors: dw 0 ; Sector count -sp_chs: db 0,0,0 ; Simulated CHS geometry -sp_dummy: db 0 ; Scratch, safe to overwrite - -; -; EBIOS drive parameter packet -; - align 8, db 0 -drive_params: dw 30 ; Buffer size -dp_flags: dw 0 ; Information flags -dp_cyl: dd 0 ; Physical cylinders -dp_head: dd 0 ; Physical heads -dp_sec: dd 0 ; Physical sectors/track -dp_totalsec: dd 0,0 ; Total sectors -dp_secsize: dw 0 ; Bytes per sector -dp_dpte: dd 0 ; Device Parameter Table -dp_dpi_key: dw 0 ; 0BEDDh if rest valid -dp_dpi_len: db 0 ; DPI len - db 0 - dw 0 -dp_bus: times 4 db 0 ; Host bus type -dp_interface: times 8 db 0 ; Interface type -db_i_path: dd 0,0 ; Interface path -db_d_path: dd 0,0 ; Device path - db 0 -db_dpi_csum: db 0 ; Checksum for DPI info - -; -; EBIOS disk address packet -; - align 8, db 0 -dapa: dw 16 ; Packet size -.count: dw 0 ; Block count -.off: dw 0 ; Offset of buffer -.seg: dw 0 ; Segment of buffer -.lba: dd 0 ; LBA (LSW) - dd 0 ; LBA (MSW) - - alignb 4, db 0 -MaxTransfer dw 2 ;32 ; Max sectors per transfer - - times 2046-($-$$) db 0 ; Pad to file offset 2046 - dw 0aa55h ; BootSector signature