2 * Debugging boot sector. Reads the first directory
3 * sector from disk and displays it.
5 * It relies on the _volid field in the FAT header containing
6 * the LBA of the root directory.
10 #define DIROFF 0x00200 /* where to read the root directory (offset) */
11 #define LOADSEG (0x10000/16) /* where to load code (64KB) */
15 * FAT directory entry.
23 #define Dlengthlo 0x1C
24 #define Dlengthhi 0x1E
29 * We keep data on the stack, indexed by rBP.
31 #define Xdrive 0x00 /* boot drive, passed by BIOS in rDL */
32 #define Xrootlo 0x02 /* offset of root directory */
34 #define Xrootsz 0x06 /* file data area */
35 #define Xtotal 0x08 /* sum of allocated data above */
36 #define Xdap 0x00 /* disc address packet */
39 BYTE $0xEB; BYTE $0x3C; /* jmp .+ 0x3C (_start0x3E) */
42 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
43 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
44 TEXT _sectsize(SB), $0
45 BYTE $0x00; BYTE $0x00
46 TEXT _clustsize(SB), $0
49 BYTE $0x00; BYTE $0x00
52 TEXT _rootsize(SB), $0
53 BYTE $0x00; BYTE $0x00
55 BYTE $0x00; BYTE $0x00
56 TEXT _mediadesc(SB), $0
59 BYTE $0x00; BYTE $0x00
61 BYTE $0x00; BYTE $0x00
63 BYTE $0x00; BYTE $0x00
64 TEXT _nhiddenlo(SB), $0
65 BYTE $0x00; BYTE $0x00
66 TEXT _nhiddenhi(SB), $0
67 BYTE $0x00; BYTE $0x00;
68 TEXT _bigvolsize(SB), $0
69 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
72 TEXT _reserved0(SB), $0
77 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
79 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
80 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
81 BYTE $0x00; BYTE $0x00; BYTE $0x00
83 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
84 BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
89 MTSR(rAX, rSS) /* 0000 -> rSS */
90 MTSR(rAX, rDS) /* 0000 -> rDS, source segment */
92 LWI(_magic-Xtotal(SB), rSP)
93 MW(rSP, rBP) /* set the indexed-data pointer */
95 SBPB(rDL, Xdrive) /* save the boot drive */
99 LWI(confidence(SB), rSI) /* for that warm, fuzzy feeling */
102 LBI(0x41, rAH) /* check extensions present */
104 LXB(Xdrive, xBP, rDL) /* drive */
105 SYSCALL(0x13) /* CF set on failure */
112 /* rCX contains 0x0001 */
113 SBPWI(0x0010, Xdap+0) /* reserved + packet size */
114 SBPW(rCX, Xdap+2) /* reserved + # of blocks to transfer */
120 /* BIOSread will do this CALL(dreset(SB)) */
123 LW(_volid(SB), rAX) /* Xrootlo */
124 LW(_volid+2(SB), rDX) /* Xroothi */
126 LWI(_magic+DIROFF(SB), rBX)
127 CALL(BIOSread(SB)) /* read the root directory */
130 LWI(_magic+DIROFF(SB), rBX)
148 * Read a sector from a disc. On entry:
149 * rDX:rAX sector number
150 * rES:rBX buffer address
152 TEXT BIOSread(SB), $0
153 LWI(5, rDI) /* retry count (ATAPI ZIPs suck) */
155 PUSHA /* may be trashed by SYSCALL */
157 SBPW(rBX, Xdap+4) /* transfer buffer :offset */
158 MFSR(rES, rDI) /* transfer buffer seg: */
160 SBPW(rAX, Xdap+8) /* LBA (64-bits) */
163 MW(rBP, rSI) /* disk address packet */
164 LBI(0x42, rAH) /* extended read */
165 LBPB(Xdrive, rDL) /* form drive */
166 SYSCALL(0x13) /* CF set on failure */
170 DEC(rDI) /* too many retries? */
177 LWI(ioerror(SB), rSI)
187 CLR(rAX) /* rAH == 0 == reset disc system */
190 ORB(rAH, rAH) /* status (0 == success) */
196 TEXT printsharp(SB), $0
202 TEXT printspace(SB), $0
211 * Output a string to the display.
212 * String argument is in rSI.
214 TEXT BIOSputs(SB), $0
231 * Output a register to the display.
240 LWI(numbuf+4(SB), rSI)
246 ADDI(0x30, rBX) /* 0x30 = '0' */
247 CMPI(0x39, rBX) /* 0x39 = '9' */
249 ADDI(0x07, rBX) /* 0x07 = 'A'-(1+'9')*/
269 TEXT printDXAX(SB), $0
285 * Output some number of words to the display
287 * rCX: number of words
289 TEXT printbuf(SB), $0
319 BYTE $'X'; BYTE $'X'; BYTE $'X'; BYTE $'X';
327 BYTE $'#'; BYTE $'\z';