[ros-diffs] [tkreuzer] 52147: [FAT32] Fix the "portable" version of the fat32 bootsector Its now mostly identical to the one we currently use, only a few encoding differences

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Wed Jun 8 12:45:56 UTC 2011


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/fat32.S?rev=52147&r1=52146&r2=52147&view=diff
==============================================================================
--- 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
 




More information about the Ros-diffs mailing list