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 */
40 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
41 TEXT _extflags(SB), $0
42 BYTE $0x00; BYTE $0x00
44 BYTE $0x00; BYTE $0x00
45 TEXT _rootclust(SB), $0
46 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
48 BYTE $0x00; BYTE $0x00
50 BYTE $0x00; BYTE $0x00
51 TEXT _reserved0(SB), $0
52 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
53 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
54 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
57 TEXT _reserved1(SB), $0
62 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
64 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
65 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
66 BYTE $0x00; BYTE $0x00; BYTE $0x00
68 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
69 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
74 MTSR(rAX, rSS) /* 0000 -> rSS */
75 MTSR(rAX, rDS) /* 0000 -> rDS, source segment */
83 REP; MOVSL /* MOV DS:[(E)SI] -> ES:[(E)DI] */
90 BYTE $0xCB /* FAR RET */
102 LW(_volid(SB), rAX) /* Xrootlo */
103 LW(_volid+2(SB), rBX) /* Xroothi */
105 LW(_sectsize(SB), rCX)
112 CALL16(readsect16(SB))
116 LW(_sectsize(SB), rCX)
121 PUSHR(rSI) /* save for later if it matches */
122 LWI(bootname(SB), rDI)
123 LW(bootnamelen(SB), rCX)
142 LW(_rootsize(SB), rAX) /* calculate and save Xrootsz */
145 LW(_sectsize(SB), rCX)
150 POPR(rCX) /* _sectsize(SB) */
152 PUSHR(rAX) /* Xrootsz */
154 LXW(0x1a, xSI, rAX) /* starting sector address */
155 DEC(rAX) /* that's just the way it is */
157 LB(_clustsize(SB), rCL)
160 LW(_volid(SB), rCX) /* Xrootlo */
162 LW(_volid+2(SB), rCX) /* Xroothi */
164 POPR(rCX) /* Xrootsz */
168 PUSHR(rAX) /* calculate how many sectors to read */
172 LW(_sectsize(SB), rCX)
177 POPR(rCX) /* _sectsize(SB) */
190 CALL16(readsect16(SB))
197 LW(_sectsize(SB), rCX)
205 LWI(ioerror(SB), rSI)
229 TEXT readsect16(SB), $0
233 PUSHR(rCX) /* qword lba */
238 PUSHR(rCX) /* dword buffer */
242 PUSHR(rCX) /* word # of sectors */
244 PUSHI(0x0010) /* byte reserved, byte packet size */
261 TEXT bootnamelen(SB), $0
263 TEXT bootname(SB), $0
264 BYTE $'9'; BYTE $'B'; BYTE $'O'; BYTE $'O';
265 BYTE $'T'; BYTE $'F'; BYTE $'A'; BYTE $'T';
269 BYTE $'i'; BYTE $'/'; BYTE $'o'; BYTE $'-';
270 BYTE $'e'; BYTE $'r'; BYTE $'r'; BYTE $0
273 BYTE $'p'; BYTE $'b'; BYTE $'s'; BYTE $0
276 BYTE $'\r'; BYTE $'\n'; BYTE $0