Author: tkreuzer
Date: Wed Jun 8 12:45:56 2011
New Revision: 52147
URL:
http://svn.reactos.org/svn/reactos?rev=52147&view=rev
Log:
[FAT32]
Fix the "portable" version of the fat32 bootsector
Its now mostly identical to the one we currently use, only a few encoding differences
Modified:
trunk/reactos/boot/freeldr/bootsect/fat32.S
Modified: trunk/reactos/boot/freeldr/bootsect/fat32.S
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/fat3…
==============================================================================
--- trunk/reactos/boot/freeldr/bootsect/fat32.S [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/bootsect/fat32.S [iso-8859-1] Wed Jun 8 12:45:56 2011
@@ -10,6 +10,8 @@
#include <asm.inc>
+#define BP_REL(x) [bp+x-offset start]
+
.code16
//ORG HEX(7c00)
@@ -21,59 +23,59 @@
OEMName:
.ASCII "FrLdr1.0"
BytesPerSector:
- dw 512
+ .word 512
SectsPerCluster:
- db 0
+ .byte 0
ReservedSectors:
- dw 32
+ .word 32
NumberOfFats:
- db 2
+ .byte 2
MaxRootEntries:
- dw 0 // Always zero for FAT32 volumes
+ .word 0 // Always zero for FAT32 volumes
TotalSectors:
- dw 0 // Always zero for FAT32 volumes
+ .word 0 // Always zero for FAT32 volumes
MediaDescriptor:
- db HEX(0f8)
+ .byte HEX(0f8)
SectorsPerFat:
- dw 0 // Always zero for FAT32 volumes
+ .word 0 // Always zero for FAT32 volumes
SectorsPerTrack:
- dw 0
+ .word 0
NumberOfHeads:
- dw 0
+ .word 0
HiddenSectors:
- dd 0
+ .long 0
TotalSectorsBig:
- dd 0
+ .long 0
// FAT32 Inserted Info
SectorsPerFatBig:
- dd 0
+ .long 0
ExtendedFlags:
- dw 0
+ .word 0
FSVersion:
- dw 0
+ .word 0
RootDirStartCluster:
- dd 0
+ .long 0
FSInfoSector:
- dw 0
+ .word 0
BackupBootSector:
- dw 6
+ .word 6
Reserved1:
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
// End FAT32 Inserted Info
BootDrive:
- db 0
+ .byte 0
Reserved:
- db 0
+ .byte 0
ExtendSig:
- db HEX(29)
+ .byte HEX(29)
SerialNumber:
- dd 0
+ .long 0
VolumeLabel:
- db "NO NAME "
+ .ascii "NO NAME "
FileSystem:
- db "FAT32 "
+ .ascii "FAT32 "
main:
xor ax,ax // Setup segment registers
@@ -83,27 +85,27 @@
mov bp, HEX(7c00)
mov sp, HEX(7c00) // Setup a stack
- cmp byte ptr ds:[BootDrive], HEX(0ff) // If they have specified a boot drive then use
it
+ cmp byte ptr BP_REL(BootDrive), HEX(0ff) // If they have specified a boot drive then
use it
jne CheckSectorsPerFat
- mov byte ptr ds:[BootDrive], dl // Save the boot drive
+ mov byte ptr BP_REL(BootDrive), dl // Save the boot drive
CheckSectorsPerFat:
- cmp word ptr [SectorsPerFat], 0 // Check the old 16-bit value of SectorsPerFat
+ cmp word ptr BP_REL(SectorsPerFat), 0 // Check the old 16-bit value of
SectorsPerFat
jnz CheckFailed // If it is non-zero then exit with an
error
CheckTotalSectors: // Check the old 16-bit value of
TotalSectors & MaxRootEntries
- cmp word ptr [MaxRootEntries], 0// by comparing the DWORD at offset MaxRootEntries
to zero
+ cmp dword ptr BP_REL(MaxRootEntries), 0// by comparing the DWORD at offset
MaxRootEntries to zero
jnz CheckFailed // If it is non-zero then exit with an
error
CheckFileSystemVersion:
- cmp word ptr [FSVersion], 0 // Check the file system version word
+ cmp word ptr BP_REL(FSVersion), 0 // Check the file system version word
jna GetDriveParameters // It is zero, so continue
CheckFailed:
jmp PrintFileSystemError // If it is not zero then exit with an error
GetDriveParameters:
mov ax, HEX(0800)
- mov dl, byte ptr [BootDrive] // Get boot drive in dl
+ mov dl, byte ptr BP_REL(BootDrive) // Get boot drive in dl
int HEX(13) // Request drive parameters from the
bios
jnc CalcDriveSize // If the call succeeded then calculate
the drive size
@@ -137,7 +139,7 @@
// First we have to load our extra boot code at
// sector 14 into memory at [0000:7e00h]
mov eax, HEX(0e)
- add eax, dword ptr ds:[HiddenSectors] // Add the number of hidden sectors
+ add eax, dword ptr BP_REL(HiddenSectors) // Add the number of hidden sectors
mov cx, 1
xor bx, bx
mov es, bx // Read sector to [0000:7e00h]
@@ -160,7 +162,7 @@
CheckInt13hExtensions: // Now check if this computer supports
extended reads
mov ah, HEX(41) // AH = 41h
mov bx, HEX(55aa) // BX = 55AAh
- mov dl, byte ptr ds:[BootDrive] // DL = drive (80h-FFh)
+ mov dl, byte ptr BP_REL(BootDrive) // DL = drive (80h-FFh)
int HEX(13) // IBM/MS INT 13 Extensions -
INSTALLATION CHECK
jc ReadSectorsCHS // CF set on error (extensions not
supported)
cmp bx, HEX(0aa55) // BX = AA55h if installed
@@ -179,7 +181,7 @@
ReadSectorsSetupDiskAddressPacket:
mov word ptr ds:[LBASectorsRead],cx
- push 0
+ push 0 // push large 0 ?
push eax // Put 64-bit logical block address on stack
push es // Put transfer segment on stack
push bx // Put transfer offset on stack
@@ -187,7 +189,7 @@
push 16 // Set size of packet to 10h
mov si, sp // Setup disk address packet on stack
- mov dl, byte ptr ds:[BootDrive] // Drive number
+ mov dl, byte ptr BP_REL(BootDrive) // Drive number
mov ah, HEX(42) // Int 13h, AH = 42h - Extended Read
int HEX(13) // Call BIOS
jc PrintDiskError // If the read failed then abort
@@ -211,7 +213,7 @@
ret
LBASectorsRead:
- dd 0
+ .long 0
// Reads logical sectors into [ES:BX]
@@ -223,15 +225,15 @@
ReadSectorsCHSLoop:
pushad
xor edx, edx
- movzx ecx, word ptr ds:[SectorsPerTrack]
+ movzx ecx, word ptr BP_REL(SectorsPerTrack)
div ecx // Divide logical by SectorsPerTrack
inc dl // Sectors numbering starts at 1 not 0
mov cl, dl // Sector in CL
mov edx, eax
shr edx, 16
- div word ptr ds:[NumberOfHeads] // Divide logical by number of heads
+ div word ptr BP_REL(NumberOfHeads) // Divide logical by number of heads
mov dh, dl // Head in DH
- mov dl, byte ptr ds:[BootDrive] // Drive number in DL
+ mov dl, byte ptr BP_REL(BootDrive) // Drive number in DL
mov ch, al // Cylinder in CX
ror ah, 1 // Low 8 bits of cylinder in CH, high 2
bits
ror ah, 1 // in CL shifted to bits 6 & 7
@@ -267,7 +269,7 @@
// Displays a file system error message
// And reboots
PrintFileSystemError:
- mov si,msgFileSystemError // FreeLdr not found message
+ mov si, offset msgFileSystemError // FreeLdr not found message
call PutChars // Display it
Reboot:
@@ -286,27 +288,26 @@
int HEX(10)
jmp short PutChars
Done:
- retn
+ ret
BiosCHSDriveSize:
- dd 0
+ .long 0
msgDiskError:
- db "Disk error", 13, 10, 0
+ .asciz "Disk error\r\n"
msgFileSystemError:
- db "File system error", 13, 10, 0
+ .asciz "File system error\r\n"
msgAnyKey:
- db "Press any key to restart", 13, 10, 0
-
-// times 509-($-$$) db 0 // Pad to 509 bytes
+ .asciz "Press any key to restart\r\n"
+
.org 509 // Pad to 509 bytes
BootPartition:
- db 0
+ .byte 0
BootSignature:
- dw 0aa55h // BootSector signature
+ .word HEX(0aa55) // BootSector signature
// End of bootsector
//
@@ -323,7 +324,7 @@
StartSearch:
// Now we must get the first cluster of the root directory
- mov eax, dword ptr ds:[RootDirStartCluster]
+ mov eax, dword ptr BP_REL(RootDirStartCluster)
cmp eax, HEX(0ffffff8) // Check to see if this is the last cluster in the chain
jb ContinueSearch // If not continue, if so then we didn't find
freeldr.sys
jmp PrintFileNotFound
@@ -336,7 +337,7 @@
// Now we have to find our way through the root directory to
// The OSLOADER.SYS file
xor bx,bx
- mov bl, byte ptr ds:[SectsPerCluster]
+ mov bl, byte ptr BP_REL(SectsPerCluster)
shl bx, 4 // BX = BX * 512 / 32
mov ax, HEX(2000) // We loaded at 2000:0000
mov es, ax
@@ -362,9 +363,9 @@
jnz FindFile // Last entry?
// Get the next root dir cluster and try again until we run out of clusters
- mov eax, dword ptr ds:[RootDirStartCluster]
+ mov eax, dword ptr BP_REL(RootDirStartCluster)
call GetFatEntry
- mov dword ptr ds:[RootDirStartCluster], eax
+ mov dword ptr BP_REL(RootDirStartCluster), eax
jmp StartSearch
FoundFile:
@@ -374,9 +375,9 @@
xor di, di // ES:DI has dir entry
xor dx, dx
- mov ax, word ptr es:[di+14h] // Get start cluster high word
+ mov ax, word ptr es:[di+20] // Get start cluster high word
shl eax, 16
- mov ax, word ptr es:[di+1ah] // Get start cluster low word
+ mov ax, word ptr es:[di+26] // Get start cluster low word
CheckStartCluster:
cmp eax, 2 // Check and see if the start cluster starts at cluster
2 or above
@@ -401,7 +402,7 @@
pop es
xor bx, bx
- mov bl, byte ptr ds:[SectsPerCluster]
+ mov bl, byte ptr BP_REL(SectsPerCluster)
shl bx, 5 // BX = BX * 512 / 16
mov ax, es // Increment the load address by
add ax, bx // The size of a cluster
@@ -415,7 +416,7 @@
jmp LoadFile // Load the next cluster (if any)
LoadFileDone:
- mov dl, byte ptr ds:[BootDrive] // Load boot drive into DL
+ mov dl, byte ptr BP_REL(BootDrive) // Load boot drive into DL
mov dh, byte ptr ds:[BootPartition] // Load boot partition into DH
push 0 // push segment (0x0000)
@@ -432,12 +433,12 @@
shl eax, 2 // EAX = EAX * 4 (since FAT32 entries are 4
bytes)
mov ecx, eax // Save this for later in ECX
xor edx, edx
- movzx ebx, word ptr ds:[BytesPerSector]
+ movzx ebx, word ptr BP_REL(BytesPerSector)
push ebx
div ebx // FAT Sector Number = EAX / BytesPerSector
- movzx ebx, word ptr ds:[ReservedSectors]
+ movzx ebx, word ptr BP_REL(ReservedSectors)
add eax, ebx // FAT Sector Number += ReservedSectors
- mov ebx, dword ptr ds:[HiddenSectors]
+ mov ebx, dword ptr BP_REL(HiddenSectors)
add eax, ebx // FAT Sector Number += HiddenSectors
pop ebx
dec ebx
@@ -449,15 +450,15 @@
// to see which FAT is the active one
// and use it, or if they are mirrored then
// no worries
- movzx ebx, word ptr ds:[ExtendedFlags] // Get extended flags and put into ebx
+ movzx ebx, word ptr BP_REL(ExtendedFlags) // Get extended flags and put into ebx
and bx, HEX(0f) // Mask off upper 8 bits, now we have active
fat in bl
jz LoadFatSector // If fat is mirrored then skip fat calcs
- cmp bl, byte ptr ds:[NumberOfFats] // Compare bl to number of fats
+ cmp bl, byte ptr BP_REL(NumberOfFats) // Compare bl to number of fats
jb GetActiveFatOffset
jmp PrintFileSystemError // If bl is bigger than numfats exit with
error
GetActiveFatOffset:
push eax // Save logical FAT sector number
- mov eax, dword ptr ds:[SectorsPerFatBig] // Get the number of sectors occupied
by one fat in eax
+ mov eax, dword ptr BP_REL(SectorsPerFatBig) // Get the number of sectors
occupied by one fat in eax
mul ebx // Multiplied by the active FAT index we
have in ebx
pop edx // Get logical FAT sector number
add eax, edx // Add the current FAT sector offset
@@ -486,7 +487,7 @@
ret
FatSectorInCache: // This variable tells us which sector
we currently have in memory
- dd 0ffffffffh // There is no need to re-read the
same sector if we don't have to
+ .long HEX(0ffffffff) // There is no need to re-read the
same sector if we don't have to
// Reads cluster number in EAX into [ES:0000]
@@ -496,19 +497,19 @@
dec eax
dec eax
xor edx, edx
- movzx ebx, byte ptr ds:[SectsPerCluster]
+ movzx ebx, byte ptr BP_REL(SectsPerCluster)
mul ebx
push eax
xor edx, edx
- movzx eax, byte ptr ds:[NumberOfFats]
- mul dword ptr ds:[SectorsPerFatBig]
- movzx ebx, word ptr ds:[ReservedSectors]
+ movzx eax, byte ptr BP_REL(NumberOfFats)
+ mul dword ptr BP_REL(SectorsPerFatBig)
+ movzx ebx, word ptr BP_REL(ReservedSectors)
add eax, ebx
- add eax, dword ptr ds:[HiddenSectors]
+ add eax, dword ptr BP_REL(HiddenSectors)
pop ebx
add eax, ebx // EAX now contains the logical sector number of the
cluster
xor bx, bx // We will load it to [ES:0000], ES loaded before
function call
- movzx cx, byte ptr ds:[SectsPerCluster]
+ movzx cx, byte ptr BP_REL(SectsPerCluster)
call ReadSectors
ret
@@ -523,15 +524,15 @@
jmp Reboot
msgFreeLdr:
- db "freeldr.sys not found", 13, 10, 0
+ .asciz "freeldr.sys not found\r\n"
filename:
- db "FREELDR SYS"
+ .ascii "FREELDR SYS"
msgLoading:
- db "Loading FreeLoader...", 13, 10, 0
-
- //times 1022-($-$$) db 0 // Pad to 1022 bytes
-
- dw 0aa55h // BootSector signature
+ .asciz "Loading FreeLoader...\r\n"
+
+.org 1022 // Pad to 1022 bytes
+
+ .word HEX(0aa55) // BootSector signature
.endcode16