1 /*        $NetBSD: bootsect.h,v 1.7 2021/08/09 21:38:05 andvar Exp $  */
2 
3 /*
4  * Written by Paul Popelka (paulp@uts.amdahl.com)
5  *
6  * You can do anything you want with this software, just don't say you wrote
7  * it, and don't remove this notice.
8  *
9  * This software is provided "as is".
10  *
11  * The author supplies this software to be publicly redistributed on the
12  * understanding that the author is not responsible for the correct
13  * functioning of this software in any circumstances and is not liable for
14  * any damages caused by this software.
15  *
16  * October 1992
17  */
18 #ifndef _MSDOSFS_BOOTSECT_H_
19 #define _MSDOSFS_BOOTSECT_H_
20 
21 /*
22  * Format of a boot sector.  This is the first sector on a DOS floppy disk
23  * or the first sector of a partition on a hard disk.  But, it is not the
24  * first sector of a partitioned hard disk.
25  */
26 struct bootsector33 {
27           uint8_t             bsJump[3];                    /* jump inst E9xxxx or EBxx90 */
28           int8_t              bsOemName[8];                 /* OEM name and version */
29           int8_t              bsBPB[19];                    /* BIOS parameter block */
30           int8_t              bsDriveNumber;                /* drive number (0x80) */
31           int8_t              bsBootCode[479];    /* pad so struct is 512b */
32           uint8_t             bsBootSectSig0;
33           uint8_t             bsBootSectSig1;
34 #define   BOOTSIG0  0x55
35 #define   BOOTSIG1  0xaa
36 };
37 
38 struct extboot {
39           int8_t              exDriveNumber;                /* drive number (0x80) */
40           int8_t              exReserved1;                  /* reserved */
41           int8_t              exBootSignature;    /* ext. boot signature (0x29) */
42 #define   EXBOOTSIG 0x29
43           int8_t              exVolumeID[4];                /* volume ID number */
44           int8_t              exVolumeLabel[11];  /* volume label */
45           int8_t              exFileSysType[8];   /* fs type (FAT12 or FAT16) */
46 };
47 
48 struct bootsector50 {
49           uint8_t             bsJump[3];                    /* jump inst E9xxxx or EBxx90 */
50           int8_t              bsOemName[8];                 /* OEM name and version */
51           int8_t              bsBPB[25];                    /* BIOS parameter block */
52           int8_t              bsExt[26];                    /* Bootsector Extension */
53           int8_t              bsBootCode[448];    /* pad so structure is 512b */
54           uint8_t             bsBootSectSig0;
55           uint8_t             bsBootSectSig1;
56 #define   BOOTSIG0  0x55
57 #define   BOOTSIG1  0xaa
58 };
59 
60 struct bootsector710 {
61           uint8_t             bsJump[3];                    /* jump inst E9xxxx or EBxx90 */
62           int8_t              bsOEMName[8];                 /* OEM name and version */
63           int8_t              bsBPB[53];                    /* BIOS parameter block */
64           int8_t              bsExt[26];                    /* Bootsector Extension */
65           int8_t              bsBootCode[420];    /* pad so structure is 512b */
66           uint8_t             bsBootSectSig0;
67           uint8_t             bsBootSectSig1;
68 #define   BOOTSIG0  0x55
69 #define   BOOTSIG1  0xaa
70 };
71 #ifdef    atari
72 /*
73  * The boot sector on a GEMDOS FS is a little bit different from the MSDOS FS
74  * format. Currently there is no need to declare a separate structure, the
75  * bootsector33 struct will do.
76  */
77 #if 0
78 struct bootsec_atari {
79           uint8_t             bsBranch[2];                  /* branch inst if auto-boot   */
80           int8_t              bsFiller[6];                  /* anything or nothing                  */
81           int8_t              bsSerial[3];                  /* serial no. for mediachange */
82           int8_t              bsBPB[19];                    /* BIOS parameter block                 */
83           int8_t              bsBootCode[482];    /* pad so struct is 512b      */
84 };
85 #endif
86 #endif /* atari */
87 
88 union bootsector {
89           struct bootsector33 bs33;
90           struct bootsector50 bs50;
91           struct bootsector710 bs710;
92 };
93 
94 #if 0
95 /*
96  * Shorthand for fields in the bpb.
97  */
98 #define   bsBytesPerSec       bsBPB.bpbBytesPerSec
99 #define   bsSectPerClust      bsBPB.bpbSectPerClust
100 #define   bsResSectors        bsBPB.bpbResSectors
101 #define   bsFATS              bsBPB.bpbFATS
102 #define   bsRootDirEnts       bsBPB.bpbRootDirEnts
103 #define   bsSectors bsBPB.bpbSectors
104 #define   bsMedia             bsBPB.bpbMedia
105 #define   bsFATsecs bsBPB.bpbFATsecs
106 #define   bsSectPerTrack      bsBPB.bpbSectPerTrack
107 #define   bsHeads             bsBPB.bpbHeads
108 #define   bsHiddenSecs        bsBPB.bpbHiddenSecs
109 #define   bsHugeSectors       bsBPB.bpbHugeSectors
110 #endif
111 
112 #endif /* _MSDOSFS_BOOTSECT_H_ */
113