7 BYTE $0xEB; BYTE $0x58; /* jmp .+ 0x58 (_start0x5A) */
10 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
11 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
12 TEXT _sectsize(SB), $0
13 BYTE $0x00; BYTE $0x00
14 TEXT _clustsize(SB), $0
17 BYTE $0x00; BYTE $0x00
20 TEXT _rootsize(SB), $0
21 BYTE $0x00; BYTE $0x00
23 BYTE $0x00; BYTE $0x00
24 TEXT _mediadesc(SB), $0
27 BYTE $0x00; BYTE $0x00
29 BYTE $0x00; BYTE $0x00
31 BYTE $0x00; BYTE $0x00
32 TEXT _nhiddenlo(SB), $0
33 BYTE $0x00; BYTE $0x00
34 TEXT _nhiddenhi(SB), $0
35 BYTE $0x00; BYTE $0x00;
36 TEXT _bigvolsize(SB), $0
37 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
38 /* FAT32 structure, starting @0x24 */
39 TEXT _fatsz32lo(SB), $0
40 BYTE $0x00; BYTE $0x00
41 TEXT _fatsz32hi(SB), $0
42 BYTE $0x00; BYTE $0x00
43 TEXT _extflags(SB), $0
44 BYTE $0x00; BYTE $0x00
46 BYTE $0x00; BYTE $0x00
47 TEXT _rootclust(SB), $0
48 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
50 BYTE $0x00; BYTE $0x00
52 BYTE $0x00; BYTE $0x00
53 TEXT _reserved0(SB), $0
54 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
55 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
56 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
59 TEXT _reserved1(SB), $0
64 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
66 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
67 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
68 BYTE $0x00; BYTE $0x00; BYTE $0x00
70 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
71 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
76 MTSR(rAX, rSS) /* 0000 -> rSS */
77 MTSR(rAX, rDS) /* 0000 -> rDS, source segment */
85 REP; MOVSL /* MOV DS:[(E)SI] -> ES:[(E)DI] */
91 BYTE $0xCB /* FAR RET */
99 STB(rDL, _driveno(SB))
102 LW(_fatsize(SB), rAX)
107 JNE _fatszok /* zero? it's FAT32 */
109 LW(_fatsz32hi(SB), rBX)
111 LW(_fatsz32lo(SB), rAX)
116 LW(_nhiddenlo(SB), rCX)
118 LW(_nhiddenhi(SB), rCX)
126 SW(rAX, _volid(SB)) /* save for later use */
127 SW(rBX, _volid+2(SB))
130 LW(_sectsize(SB), rCX)
136 CALL16(readsect16(SB))
137 LW(_sectsize(SB), rCX)
142 PUSHR(rSI) /* save for later if it matches */
143 LWI(bootname(SB), rDI)
144 LW(bootnamelen(SB), rCX)
160 LW(_rootsize(SB), rAX) /* calculate and save Xrootsz */
163 LW(_sectsize(SB), rCX)
168 POPR(rCX) /* _sectsize(SB) */
170 PUSHR(rAX) /* Xrootsz */
172 LXW(0x1a, xSI, rAX) /* starting sector address */
173 DEC(rAX) /* that's just the way it is */
175 LB(_clustsize(SB), rCL)
178 LW(_volid(SB), rCX) /* Xrootlo */
180 LW(_volid+2(SB), rCX) /* Xroothi */
182 POPR(rCX) /* Xrootsz */
186 PUSHR(rAX) /* calculate how many sectors to read */
190 LW(_sectsize(SB), rCX)
195 POPR(rCX) /* _sectsize(SB) */
202 PUSHR(rSI) /* entry */
205 CALL16(readsect16(SB))
207 LW(_sectsize(SB), rDX)
219 LB(_driveno(SB), rDL)
242 TEXT readsect16(SB), $0
247 PUSHR(rDX) /* qword lba */
252 PUSHR(rDX) /* dword buffer */
256 PUSHR(rDX) /* word # of sectors */
258 PUSHI(0x0010) /* byte reserved, byte packet size */
261 LB(_driveno(SB), rDL)
265 LWI((0x0E00|'!'), rAX)
271 LWI((0x0E00|'.'), rAX)
277 TEXT bootnamelen(SB), $0
279 TEXT bootname(SB), $0
280 BYTE $'9'; BYTE $'B'; BYTE $'O'; BYTE $'O';
281 BYTE $'T'; BYTE $'F'; BYTE $'A'; BYTE $'T';
285 BYTE $'p'; BYTE $'b'; BYTE $'s'; BYTE $0
287 BYTE $'o'; BYTE $'k'; BYTE $'\r'; BYTE $'\n';