Author: pschweitzer Date: Sat Dec 26 17:44:07 2015 New Revision: 70426
URL: http://svn.reactos.org/svn/reactos?rev=70426&view=rev Log: [BOOTSECT] fatx.S isn't for the FATX filesystem, it's just a generic naming, so pick up the next variable
Added: trunk/reactos/boot/freeldr/bootsect/faty.S - copied unchanged from r70425, trunk/reactos/boot/freeldr/bootsect/fatx.S Removed: trunk/reactos/boot/freeldr/bootsect/fatx.S Modified: trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt
Modified: trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/CMake... ============================================================================== --- trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt [iso-8859-1] (original) +++ trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt [iso-8859-1] Sat Dec 26 17:44:07 2015 @@ -7,15 +7,15 @@ CreateBootSectorTarget(fat ${CMAKE_CURRENT_SOURCE_DIR}/fat.S ${CMAKE_CURRENT_BINARY_DIR}/fat.bin 7c00) CreateBootSectorTarget(fat32 ${CMAKE_CURRENT_SOURCE_DIR}/fat32.S ${CMAKE_CURRENT_BINARY_DIR}/fat32.bin 7c00)
- ## New versions using FATX.S (experimental) + ## New versions using FATY.S (experimental) # add_definitions(-DFAT12) - # CreateBootSectorTarget(fat_new ${CMAKE_CURRENT_SOURCE_DIR}/fatx.S ${CMAKE_CURRENT_BINARY_DIR}/fat_new.bin 7c00) + # CreateBootSectorTarget(fat_new ${CMAKE_CURRENT_SOURCE_DIR}/faty.S ${CMAKE_CURRENT_BINARY_DIR}/fat_new.bin 7c00) # remove_definitions(-DFAT12) # add_definitions(-DFAT16) - # CreateBootSectorTarget(fat16_new ${CMAKE_CURRENT_SOURCE_DIR}/fatx.S ${CMAKE_CURRENT_BINARY_DIR}/fat16_new.bin 7c00) + # CreateBootSectorTarget(fat16_new ${CMAKE_CURRENT_SOURCE_DIR}/faty.S ${CMAKE_CURRENT_BINARY_DIR}/fat16_new.bin 7c00) # remove_definitions(-DFAT16) # add_definitions(-DFAT32) - # CreateBootSectorTarget(fat32_new ${CMAKE_CURRENT_SOURCE_DIR}/fatx.S ${CMAKE_CURRENT_BINARY_DIR}/fat32_new.bin 7c00) + # CreateBootSectorTarget(fat32_new ${CMAKE_CURRENT_SOURCE_DIR}/faty.S ${CMAKE_CURRENT_BINARY_DIR}/fat32_new.bin 7c00) # remove_definitions(-DFAT32)
CreateBootSectorTarget(isoboot ${CMAKE_CURRENT_SOURCE_DIR}/isoboot.S ${CMAKE_CURRENT_BINARY_DIR}/isoboot.bin 7000)
Removed: trunk/reactos/boot/freeldr/bootsect/fatx.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/fatx.... ============================================================================== --- trunk/reactos/boot/freeldr/bootsect/fatx.S [iso-8859-1] (original) +++ trunk/reactos/boot/freeldr/bootsect/fatx.S (removed) @@ -1,589 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Bootsector - * FILE: boot/freeldr/bootsect/fatx.S - * PURPOSE: Combined FAT16 and FAT32 boot sector - * PROGRAMMERS: Brian Palmer - * Timo Kreuzer - */ - -#define DISKREADBUFFER HEX(8E000) - -/* - * Layout of a FAT volume: - * - * |--------------------------------------------------------- - * | * BootSector | - * | * FS Information Sector (FAT32 only) | ReservedSectors - * | * ... more reserved sectors ... | - * |-------------------------------------------------------- - * | * FAT 1 | NumberOfFats - * | * FAT 2 | * - * | * [more FATs] | SectorsPerFat - * |--------------------------------------------------------- - * | * Root Directory (FAT12/FAT16 only) | MaxRootEntries / 16 - * |--------------------------------------------------------- - * | * File data | - * | .... | - * |---------------------------------------- - */ - -/* INCLUDES ******************************************************************/ - -#include <asm.inc> -#include <freeldr/include/arch/pc/x86common.h> - -#define ADDRESS_FOR_DIRENTRIES HEX(10000) - -SizeOfDataArea = 32 - -/* Put the stack below the data area */ -BootSectorStackTop = (HEX(7c00) - SizeOfDataArea) - -/* Data area offsets for uninitialized data */ -DataAreaStart = BootSectorStackTop + 0 /* dword */ -#ifndef FAT32 -RootDirStartSector = BootSectorStackTop + 4 /* dword */ -#endif -BiosCHSDriveSize = BootSectorStackTop + 8 /* dword */ -LBASectorsRead = BootSectorStackTop + 12 /* dword */ -ReadSectorsOffset = BootSectorStackTop + 16 /* word */ -ReadClusterOffset = BootSectorStackTop + 18 /* word */ -PutCharsOffset = BootSectorStackTop + 20 /* word */ - -/* Macro for bp relative memory access to reduce code size */ -#define BP_REL(x) ss:[bp + x - BootSectorStackTop] - -/* The code starts at 0x7c00 */ -// org 7c00h - -.code16 - -/****************************************************************************** - * BIOS Parameter Block (BPB) * - ******************************************************************************/ -/* We have 3 bytes at the entry point to jump over the data area */ -start: - jmp short main // FIXME: When compiling FAT32, assembler will complain - // that the label is too far... Need investigation! - nop - -/* Here starts the BIOS Parameter Block (BPB) data. - The real data will be copied during install */ -OEMName: - .ascii "FrLdr1.0" -BytesPerSector: - .word 512 -SectorsPerCluster: - .byte 0 -ReservedSectors: - .word 32 -NumberOfFats: - .byte 2 -MaxRootEntries: - .word 0 // Always zero for FAT32 volumes -TotalSectors: - .word 0 // Always zero for FAT32 volumes -MediaDescriptor: - .byte HEX(0f8) -SectorsPerFat: - .word 0 // Always zero for FAT32 volumes -SectorsPerTrack: - .word 0 -NumberOfHeads: - .word 0 -HiddenSectors: - .long 0 -TotalSectorsBig: - .long 0 - -/* Extra data for FAT32 volumes */ -#ifdef FAT32 -SectorsPerFatBig: - .long 0 -ExtendedFlags: - .word 0 -FSVersion: - .word 0 -RootDirStartCluster: - .long 0 -FSInfoSector: - .word 0 -BackupBootSector: - .word 6 -Reserved1: - .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -#endif // FAT32 - -BootDrive: - .byte 0 -Reserved: - .byte 0 -ExtendSig: - .byte HEX(29) -SerialNumber: - .long 0 -VolumeLabel: - .ascii "NO NAME " -FileSystem: - .ascii "FATxx " - - -/****************************************************************************** - * String data * - ******************************************************************************/ - -filename: - .ascii "FREELDR SYS" - -msgBootFailure: - .ascii "Load failed!", CR, LF, NUL - -msgAnyKey: - .ascii "Press any key to reboot...", NUL - - -/****************************************************************************** - * Main code entry * - * Input: DL = Boot drive * - ******************************************************************************/ -main: - /* First setup the segment registers */ - xor ax, ax - mov ds, ax - mov ss, ax - - /* Load the stack pointer */ - mov sp, BootSectorStackTop - - /* Load bp for relative memory access, which saves us some bytes of code - size, when used with 32 bit instructions */ - mov bp, sp - - /* Load the boot drive from the BPB into al */ - mov al, byte ptr ds:[BootDrive] - - /* Check if it's valid */ - cmp al, HEX(0ff) - je .SaveBootDrive - - /* Copy it into dl */ - mov dl, al - -.SaveBootDrive: - /* Save the bootdrive in the BPB */ - mov byte ptr ds:[BootDrive], dl - - -/****************************************************************************** - * Get drive parameters * - ******************************************************************************/ - - /* Call INT 13 to get the drive parameters: - AH = 08h - DL = drive (bit 7 set for hard disk) - ES:DI = 0000h:0000h to guard against BIOS bugs */ - xor di, di - mov ah, 8 - int HEX(13) - - /* Return from INT 13h/08h: - CF set on error -> AH = status (07h) - CF clear if successful -> AH = 00h - AL = 00h on at least some BIOSes - BL = drive type (AT/PS2 floppies only) - CH = low eight bits of maximum cylinder number - CL = bits 0:5 maximum sector number, bits 7:8 high two bits of maximum cylinder number - DH = maximum head number - DL = number of drives - ES:DI -> drive parameter table (floppies only) */ - - /* Check for failure */ - jc BootFailure - - -/****************************************************************************** - * Calculate drive size * - ******************************************************************************/ - - movzx ebx, ch // Put the low 8-bits of the cylinder count into EBX - mov bh, cl // Put the high 2-bits in BH - shr bh, 6 // Shift them into position, now BX contains the cylinder count - - and cl, HEX(3f) // Mask off cylinder bits from sector count - movzx ecx, cl // Move the sectors per track into ECX - - movzx eax, dh // Move the heads into EAX - - inc eax // Make it one based because the bios returns it zero based - inc ebx // Make the cylinder count one based also - mul ecx // Multiply heads with the sectors per track, result in edx:eax - mul ebx // Multiply the cylinders with (heads * sectors) [stored in edx:eax already] - - // We now have the total number of sectors as reported - // by the bios in eax, so store it in our variable - mov dword ptr BP_REL(BiosCHSDriveSize), eax - - -/****************************************************************************** - * Load the FAT * - ******************************************************************************/ - - /* Load the number of first sector of the FAT into eax */ - movzx eax, word ptr BP_REL(ReservedSectors) - add eax, dword ptr BP_REL(HiddenSectors) - - /* Load sector count into ecx */ -#ifdef FAT32 - mov ecx, dword ptr BP_REL(SectorsPerFatBig) -#else - movzx ecx, word ptr BP_REL(SectorsPerFat) -#endif - - /* Save FAT sector and size for later use */ - pushad - - /* Point ES:DI to the memory that is later the disk read buffer for freeldr. - This way we cannot overwrite our FAT with freeldr data */ - mov bx, DISKREADBUFFER / 16 - mov es,bx - xor di, di - - /* Read the sectors */ - call ReadSectors - - /* Restore FAT sector and size */ - popad - - -/****************************************************************************** - * Get root directory / data area start * - ******************************************************************************/ - - /* Copy reserved + hidden sectors to EBX */ - mov ebx, eax - - /* Calculate (NumberOfFats * SectorsPerFat) */ - movzx eax, byte ptr BP_REL(NumberOfFats) - mul ecx - - /* Add reserved sectors and hidden sectors */ - add eax, ebx - -#ifndef FAT32 - /* Save the starting sector of the root directory */ - mov dword ptr BP_REL(RootDirStartSector), eax - - /* Calculate number of sectors for the root dir: - sectors = MaxRootEntries * 32 / 512 (rounded up!) */ - movzx ebx, word ptr BP_REL(MaxRootEntries) - add ebx, 15 - shr ebx, 4 - - /* Add the root dir start sector and save it as DataAreaStart */ - add ebx, eax - mov dword ptr BP_REL(DataAreaStart), ebx -#else - mov dword ptr BP_REL(DataAreaStart), eax - - /* On FAT32 volumes the root dir start cluster is stored in the BPB */ - mov eax, dword ptr BP_REL(RootDirStartCluster) -#endif - - -/****************************************************************************** - * Search the root directory for freeldr * - ******************************************************************************/ -.SearchForFreeldr: - - /* Load ES with the segment where we put the dir entries */ - mov bx, ADDRESS_FOR_DIRENTRIES / 16 - mov es, bx - - /* Set the address offset to 0 */ - xor di, di - -#ifdef FAT32 - /* Read the dir cluster. This loads the next cluster into EAX */ - call ReadCluster - - /* Calculate the numer of dir entries in this cluster: - dx = SectorsPerCluster * 512 / 32 */ - movzx dx, byte ptr ds:[SectorsPerCluster] - shl dx, 4 -#else - /* Set the number of sectors to read to 1 */ - xor cx, cx - inc cx - - /* Read the sector, but preserve ES */ - push es - call ReadSectors - pop es - - /* Set entry count to entries per sector */ - mov dx, (512 / 32) -#endif - - /* Load the start offset of the dir entries into ebx */ - xor bx, bx - -.CheckDirEntry: - /* Load the address of the name into di */ - mov di, bx - - /* If the first byte of the entry is 0 then we have reached the end */ - cmp byte ptr es:[di], ch - jz BootFailure - - /* Compare with freeldr file name */ - mov si, offset filename - mov cx, 11 - repe cmpsb - - /* Check if we found the file */ - jz .FoundFreeLoader - - /* File didn't match, go to next entry */ - add bx, 32 - - /* Decrement entry count and check if we reached the end */ - dec dx - jnz .CheckDirEntry - -#ifdef FAT32 - /* Check to see if this was the last cluster in the chain */ - cmp eax, HEX(0ffffff8) - jnb BootFailure -#endif - - /* Repeat the search process with the next sector / cluster. - eax is already incremented in ReadSectors / ReadCluster */ - jmp .SearchForFreeldr - - -/****************************************************************************** - * Load freeldr * - ******************************************************************************/ -.FoundFreeLoader: - - /* Load the cluster number of freeldr into eax */ -#ifdef FAT32 -#error unsupported -#else - movzx eax, word ptr es:[bx + HEX(1A)] -#endif - - /* Load es:di with the freeldr start address */ - mov dx, FREELDR_BASE / 16 - mov es, dx - xor di, di - -.LoadNextCluster: - /* Load the cluster to the current address. EAX is adjusted to the next - cluster and ES is adjusted for the next read */ - call ReadCluster - - /* Check if this is the last cluster in the chain */ -#if defined(FAT32) - cmp eax, HEX(0ffffff8) -#elif defined(FAT12) - cmp ax, HEX(0ff8) -#else - cmp ax, HEX(0fff8) -#endif - jb .LoadNextCluster - - /* Load boot drive into DL, boot partition into DH */ - mov dl, byte ptr ds:[BootDrive] - mov dh, byte ptr ds:[BootPartition] - - /* Now the complete freeldr imag is loaded. - Jump to the realmode entry point. */ - ljmp16 0, FREELDR_BASE - - - -BootFailure: - mov si, offset msgBootFailure - call PutChars - - -Reboot: - /* Output "Press any key to reboot" message */ - mov si, offset msgAnyKey - call PutChars - - /* Wait for a keypress */ - xor ax, ax - int HEX(16) - - /* Reboot */ - int HEX(19) - - -/****************************************************************************** - * PROCEDURE ReadCluster * - * Input: EAX = Cluster number, ES:DI = Target * - * Modifies: EAX (next cluster number), BX, DX (undefined) * - ******************************************************************************/ -ReadCluster: - - pushad - - // StartSector = ((Cluster - 2) * SectorsPerCluster) + SectorsForFat + ReservedSectors + HiddenSectors - // StartSector = ((Cluster - 2) * SectorsPerCluster) + DataAreaStart - - /* Substract 2 */ - dec eax - dec eax - - /* Multiply with SectorsPerCluster */ - movzx ecx, byte ptr BP_REL(SectorsPerCluster) - mul ecx - - /* Add DataAreaStart */ - add eax, dword ptr BP_REL(DataAreaStart) - - /* Call ReadSectors. EAX = SectorNumber, ECX = SectorsPerCluster */ - call ReadSectors - - /* Restore the cluster number */ - popad - - /* Save ES */ - push es - -#if defined(FAT32) -#error FAT32 not implemented -#elif defined(FAT12) -#error FAT12 not implemented -#else - /* DX:AX = AX * 2 (since FAT16 entries are 2 bytes) */ - mov bx, 2 - mul bx - - /* Shift DX, so that it is the segment offset: DX = DX * (64K / 16) */ - shl dx, 12 - - /* Put segment address of FAT into ES */ - add dx, DISKREADBUFFER / 16 - mov es, dx - - /* Put the FAT entry offset into EBX for indirect mov */ - mov bx, ax - - /* Put the content of the FAT entry into AX */ - mov ax, es:[bx] -#endif - - /* Restore ES and return */ - pop es - ret - - -/****************************************************************************** - * PROCEDURE ReadSectors * - * Input: EAX = Sector start number, ECX = number of sectors, ES:DI = Target * - * Modifies: EAX (incremented by sector count), CX = 0, ES (incremented), * - * EBX undefined * - ******************************************************************************/ -ReadSectors: - /* We could possibly also implement CHS, but it's currently unimplemented */ -//jmp $ -ReadSectorsLBA: - - /* Copy number of sectors to ebx */ - movzx ebx, cx - - /* Since the LBA calls only support 0x7F sectors at a time, - we will limit ourselves to 64 */ - cmp bx, 64 - jbe .ReadSectorsLBA2 - mov bx, 64 - -.ReadSectorsLBA2: - - /* Save logical sector number & sector count */ - pushad - - /* Setup the disk address packet on the stack */ - .byte HEX(66) // size overwrite prefix for next push - push 0 // Put 64-bit logical block address (high part) on stack - push eax // Put 64-bit logical block address (low part) on stack - push es // Put transfer segment on stack - push di // Put transfer offset on stack - push bx // Set transfer count (for this round) - push 16 // Set size of packet to 16 - - /* Point si to the disk address packet on stack */ - mov si, sp - - /* Set the drive number */ - mov dl, byte ptr ds:[BootDrive] -//jmp $ - /* Call INT 13h, AH = 42h - Extended Read - Input: ... - Modifies: ... */ - mov ah, HEX(42) - int HEX(13) -//jmp $ - /* Check for failure */ - jc BootFailure - - /* Remove disk address packet from stack */ - add sp, 16 - - /* Adjust ES to point to the next sector */ - shl bx, 5 - mov ax, es - add ax, bx - mov es, ax - - /* Restore sector count & logical sector number */ - popad - - /* Adjust the sector number to the next sector we need to read - by adding the number of sectors that we read */ - add eax, ebx - - /* Adjust remaining sectors */ - sub cx, bx - jnz ReadSectorsLBA - - /* return */ - ret - - - -/****************************************************************************** - * PROCEDURE PutChars * - * Input: ESI = Points to string to be printed * - * Modifies: AL, AH, SI * - ******************************************************************************/ -PutChars2: - mov ah, HEX(0e) - mov bx, 7 - int HEX(10) -PutChars: - lodsb - or al, al - jnz short PutChars2 - ret - - -/****************************************************************************** - * Padding and boot sector signature * - ******************************************************************************/ - /* Pad to 509 bytes */ - .org 509 - -BootPartition: - .byte 0 - -BootSignature: - .word HEX(0aa55) // BootSector signature - -.endcode16 - -END