@@ -128,7 +128,7 @@ int makeFsFat(const FormatParams ¶ms, BufferedFsWriter &dev, const std::stri
128128 if (res != 0 ) return res;
129129
130130 // Prepare label.
131- char labelBuf[12 ] = " NO NAME " ;
131+ char labelBuf[12 ] = EBPB_VOL_LAB_NO_NAME ;
132132 if (!label.empty ())
133133 {
134134 memset (labelBuf, ' ' , 11 ); // Padding must be spaces.
@@ -137,65 +137,63 @@ int makeFsFat(const FormatParams ¶ms, BufferedFsWriter &dev, const std::stri
137137 memcpy (labelBuf, label.c_str (), labelLen);
138138 }
139139
140- // Volume Boot Record (VBR).
141- Vbr vbr{};
142- vbr.jmpBoot [0 ] = 0xEB ;
143- vbr.jmpBoot [1 ] = 0x00 ;
144- vbr.jmpBoot [2 ] = 0x90 ;
145- memcpy (vbr.oemName , " MSWIN4.1" , 8 ); // SDFormatter hardcodes this.
140+ // Boot sector.
141+ BootSec bs{};
142+ memcpy (bs.jmpBoot , " \xEB\x00\x90 " , 3 ); // Doesn't jump to bootCode but it's what SDFormatter uses.
143+ memcpy (bs.oemName , BS_DEFAULT_OEM_NAME, 8 );
146144
147145 // BIOS Parameter Block (BPB).
148146 const u32 secPerClus = params.secPerClus ;
149147 const u32 rsvdSecCnt = params.rsvdSecCnt ;
150148 const u8 fatBits = params.fatBits ;
151149 const u32 partSectors = static_cast <u32 >(params.totSec - partStart);
152150 const u32 secPerFat = params.secPerFat ;
153- vbr .bytesPerSec = bytesPerSec;
154- vbr .secPerClus = secPerClus;
155- vbr .rsvdSecCnt = rsvdSecCnt;
156- vbr .numFats = 2 ;
157- vbr .rootEntCnt = (fatBits == 32 ? 0 : 512 );
158- vbr .totSec16 = (partSectors > 0xFFFF || fatBits == 32 ? 0 : partSectors); // Not used for FAT32.
159- vbr .media = 0xF8 ;
160- vbr .fatSz16 = (secPerFat > 0xFFFF || fatBits == 32 ? 0 : secPerFat); // Not used for FAT32.
161- vbr .secPerTrk = params.secPerTrk ;
162- vbr .numHeads = params.heads ;
163- vbr .hiddSec = partStart;
164- vbr .totSec32 = (partSectors > 0xFFFF || fatBits == 32 ? partSectors : 0 );
165- vbr .sigWord = 0xAA55 ;
151+ bs .bytesPerSec = bytesPerSec;
152+ bs .secPerClus = secPerClus;
153+ bs .rsvdSecCnt = rsvdSecCnt;
154+ bs .numFats = 2 ;
155+ bs .rootEntCnt = (fatBits == 32 ? 0 : 512 );
156+ bs .totSec16 = (partSectors > 0xFFFF || fatBits == 32 ? 0 : partSectors); // Not used for FAT32.
157+ bs .media = BPB_DEFAULT_MEDIA ;
158+ bs .fatSz16 = (secPerFat > 0xFFFF || fatBits == 32 ? 0 : secPerFat); // Not used for FAT32.
159+ bs .secPerTrk = params.secPerTrk ;
160+ bs .numHeads = params.heads ;
161+ bs .hiddSec = partStart;
162+ bs .totSec32 = (partSectors > 0xFFFF || fatBits == 32 ? partSectors : 0 );
163+ bs .sigWord = EBPB_SIG_WORD ;
166164
167165 if (fatBits < 32 )
168166 {
169167 // Extended BIOS Parameter Block FAT12/FAT16.
170- vbr. fat16 .drvNum = 0x80 ;
171- vbr. fat16 .bootSig = 0x29 ;
172- vbr. fat16 .volId = makeVolId ();
173- memcpy (vbr. fat16 .volLab , labelBuf, 11 );
174- memcpy (vbr. fat16 .filSysType , (fatBits == 12 ? " FAT12 " : " FAT16 " ), 8 );
175- memset (vbr. fat16 .bootCode , 0xF4 , sizeof (vbr. fat16 .bootCode ));
176-
177- // Write Vbr .
178- res = dev.write (reinterpret_cast <u8 *>(&vbr ), sizeof (Vbr ));
168+ bs. ebpb .drvNum = EBPB_DEFAULT_DRV_NUM ;
169+ bs. ebpb .bootSig = EBPB_BOOT_SIG ;
170+ bs. ebpb .volId = makeVolId ();
171+ memcpy (bs. ebpb .volLab , labelBuf, 11 );
172+ memcpy (bs. ebpb .filSysType , (fatBits == 12 ? EBPB_FIL_SYS_TYPE_FAT12 : EBPB_FIL_SYS_TYPE_FAT16 ), 8 );
173+ memset (bs. ebpb .bootCode , 0xF4 , sizeof (bs. ebpb .bootCode )); // Fill with x86 hlt instructions.
174+
175+ // Write boot sector .
176+ res = dev.write (reinterpret_cast <u8 *>(&bs ), sizeof (BootSec ));
179177 if (res != 0 ) return res;
180178 }
181179 else
182180 {
183181 // Extended BIOS Parameter Block FAT32.
184- vbr. fat32 .fatSz32 = secPerFat;
185- vbr. fat32 .extFlags = 0 ;
186- vbr. fat32 .fsVer = 0 ; // 0.0.
187- vbr. fat32 .rootClus = 2 ; // 2 or the first cluster not marked as defective.
188- vbr. fat32 .fsInfoSector = 1 ;
189- vbr. fat32 .bkBootSec = 6 ;
190- vbr. fat32 .drvNum = 0x80 ;
191- vbr. fat32 .bootSig = 0x29 ;
192- vbr. fat32 .volId = makeVolId ();
193- memcpy (vbr. fat32 .volLab , labelBuf, 11 );
194- memcpy (vbr. fat32 .filSysType , " FAT32 " , 8 );
195- memset (vbr. fat32 .bootCode , 0xF4 , sizeof (vbr. fat32 .bootCode ));
196-
197- // Write Vbr .
198- res = dev.write (reinterpret_cast <u8 *>(&vbr ), sizeof (Vbr ));
182+ bs. ebpb32 .fatSz32 = secPerFat;
183+ bs. ebpb32 .extFlags = 0 ;
184+ bs. ebpb32 .fsVer = 0 ; // 0.0.
185+ bs. ebpb32 .rootClus = 2 ; // 2 or the first cluster not marked as defective.
186+ bs. ebpb32 .fsInfoSector = 1 ;
187+ bs. ebpb32 .bkBootSec = 6 ;
188+ bs. ebpb32 .drvNum = EBPB_DEFAULT_DRV_NUM ;
189+ bs. ebpb32 .bootSig = EBPB_BOOT_SIG ;
190+ bs. ebpb32 .volId = makeVolId ();
191+ memcpy (bs. ebpb32 .volLab , labelBuf, 11 );
192+ memcpy (bs. ebpb32 .filSysType , EBPB_FIL_SYS_TYPE_FAT32 , 8 );
193+ memset (bs. ebpb32 .bootCode , 0xF4 , sizeof (bs. ebpb32 .bootCode )); // Fill with x86 hlt instructions.
194+
195+ // Write boot sector .
196+ res = dev.write (reinterpret_cast <u8 *>(&bs ), sizeof (BootSec ));
199197 if (res != 0 ) return res;
200198
201199 // There are apparently drivers based on wrong documentation stating the
@@ -205,50 +203,46 @@ int makeFsFat(const FormatParams ¶ms, BufferedFsWriter &dev, const std::stri
205203 if (bytesPerSec > 512 )
206204 {
207205 tmpOffset = curOffset + bytesPerSec - 2 ;
208- res = dev.fillAndWrite (reinterpret_cast <u8 *>(&vbr .sigWord ), tmpOffset, 2 );
206+ res = dev.fillAndWrite (reinterpret_cast <u8 *>(&bs .sigWord ), tmpOffset, 2 );
209207 if (res != 0 ) return res;
210208 }
211209
212210 // Write FSInfo.
213211 FsInfo fsInfo{};
214- fsInfo.leadSig = 0x41615252 ;
215- fsInfo.strucSig = 0x61417272 ;
212+ fsInfo.leadSig = FS_INFO_LEAD_SIG ;
213+ fsInfo.strucSig = FS_INFO_STRUC_SIG ;
216214 fsInfo.freeCount = params.maxClus - 1 ;
217215 fsInfo.nxtFree = 3 ;
218- fsInfo.trailSig = 0xAA550000 ;
216+ fsInfo.trailSig = FS_INFO_TRAIL_SIG ;
219217 res = dev.write (reinterpret_cast <u8 *>(&fsInfo), sizeof (FsInfo));
220218 if (res != 0 ) return res;
221219
222- // TODO: FSInfo sector signature word needed?
223-
224220 // The FAT spec says there is actually a third boot sector with just a signature word.
225221 tmpOffset = curOffset + (2 * bytesPerSec) + bytesPerSec - 2 ;
226- res = dev.fillAndWrite (reinterpret_cast <u8 *>(&vbr .sigWord ), tmpOffset, 2 );
222+ res = dev.fillAndWrite (reinterpret_cast <u8 *>(&bs .sigWord ), tmpOffset, 2 );
227223 if (res != 0 ) return res;
228224
229- // Write copy of Vbr .
225+ // Write copy of boot sector .
230226 tmpOffset += 2 + (3 * bytesPerSec);
231- res = dev.fillAndWrite (reinterpret_cast <u8 *>(&vbr ), tmpOffset, sizeof (Vbr ));
227+ res = dev.fillAndWrite (reinterpret_cast <u8 *>(&bs ), tmpOffset, sizeof (BootSec ));
232228 if (res != 0 ) return res;
233229
234- // Write sector signature word of VBR copy.
230+ // Write sector signature word of boot sector copy.
235231 if (bytesPerSec > 512 )
236232 {
237233 tmpOffset += bytesPerSec - 2 ;
238- res = dev.fillAndWrite (reinterpret_cast <u8 *>(&vbr .sigWord ), tmpOffset, 2 );
234+ res = dev.fillAndWrite (reinterpret_cast <u8 *>(&bs .sigWord ), tmpOffset, 2 );
239235 if (res != 0 ) return res;
240236 }
241237
242- // Free cluster count is 0xFFFFFFFF ( unknown) for FSInfo copy.
243- fsInfo.freeCount = 0xFFFFFFFF ;
238+ // Free cluster count is unknown for FSInfo copy.
239+ fsInfo.freeCount = FS_INFO_UNK_FREE_COUNT ;
244240 res = dev.write (reinterpret_cast <u8 *>(&fsInfo), sizeof (FsInfo));
245241 if (res != 0 ) return res;
246242
247- // TODO: FSInfo sector signature word needed?
248-
249243 // Write copy of third sector signature word.
250244 tmpOffset = curOffset + (8 * bytesPerSec) + bytesPerSec - 2 ;
251- res = dev.fillAndWrite (reinterpret_cast <u8 *>(&vbr .sigWord ), tmpOffset, 2 );
245+ res = dev.fillAndWrite (reinterpret_cast <u8 *>(&bs .sigWord ), tmpOffset, 2 );
252246 if (res != 0 ) return res;
253247 }
254248
@@ -258,14 +252,15 @@ int makeFsFat(const FormatParams ¶ms, BufferedFsWriter &dev, const std::stri
258252 if (fatBits < 32 )
259253 {
260254 // Reserve first 2 FAT entries.
261- *fat = (fatBits == 16 ? 0xFFFFFFF8 : 0x00FFFFF8 );
255+ u32 rsvdEnt = (fatBits == 16 ? FAT16_EOF<<16 | FAT16_EOF : FAT12_EOF<<12 | FAT12_EOF);
256+ *fat = (rsvdEnt & ~0xFFu ) | BPB_DEFAULT_MEDIA;
262257 }
263258 else
264259 {
265260 // Reserve first 2 FAT entries. A third entry for the root directory cluster.
266- fat[0 ] = 0x0FFFFFF8 ;
267- fat[1 ] = 0x0FFFFFFF ;
268- fat[2 ] = 0x0FFFFFFF ;
261+ fat[0 ] = (FAT32_EOF & ~ 0xFFu ) | BPB_DEFAULT_MEDIA ;
262+ fat[1 ] = FAT32_EOF ;
263+ fat[2 ] = FAT32_EOF ;
269264 rsvdEntrySize = 3 * 4 ;
270265 }
271266
@@ -284,7 +279,7 @@ int makeFsFat(const FormatParams ¶ms, BufferedFsWriter &dev, const std::stri
284279 {
285280 FatDir dir{}; // Make sure all other fields are zero.
286281 memcpy (dir.name , labelBuf, 11 );
287- dir.attr = 0x08 ; // ATTR_VOLUME_ID.
282+ dir.attr = DIR_ATTR_VOLUME_ID;
288283
289284 curOffset += secPerFat * bytesPerSec;
290285 res = dev.fillAndWrite (reinterpret_cast <u8 *>(&dir), curOffset, sizeof (FatDir));
0 commit comments