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)
159 LW(_rootsize(SB), rAX) /* calculate and save Xrootsz */
162 LW(_sectsize(SB), rCX)
168 PUSHR(rAX) /* Xrootsz */
171 LXW(0x1a, xSI, rAX) /* start cluster low */
172 LXW(0x14, xSI, rBX) /* start cluster high */
173 SUBI(2, rAX) /* cluster -= 2 */
176 LB(_clustsize(SB), rCL) /* convert to sectors (AX:DX) */
181 LW(_volid(SB), rCX) /* Xrootlo */
183 LW(_volid+2(SB), rCX) /* Xroothi */
187 POPR(rCX) /* Xrootsz */
191 PUSHR(rAX) /* calculate how many sectors to read (CX) */
195 LW(_sectsize(SB), rCX)
206 PUSHR(rSI) /* entry */
209 CALL16(readsect16(SB))
211 LW(_sectsize(SB), rDX)
223 LB(_driveno(SB), rDL)
246 TEXT readsect16(SB), $0
251 PUSHR(rDX) /* qword lba */
256 PUSHR(rDX) /* dword buffer */
260 PUSHR(rDX) /* word # of sectors */
262 PUSHI(0x0010) /* byte reserved, byte packet size */
265 LB(_driveno(SB), rDL)
269 LWI((0x0E00|'!'), rAX)
275 LWI((0x0E00|'.'), rAX)
281 TEXT bootnamelen(SB), $0
283 TEXT bootname(SB), $0
284 BYTE $'9'; BYTE $'B'; BYTE $'O'; BYTE $'O';
285 BYTE $'T'; BYTE $'F'; BYTE $'A'; BYTE $'T';
289 BYTE $'p'; BYTE $'b'; BYTE $'s'; BYTE $0
291 BYTE $'o'; BYTE $'k'; BYTE $'\r'; BYTE $'\n';