Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 * Debugging boot sector.  Reads the first directory
3
 * sector from disk and displays it.
4
 *
5
 * It relies on the _volid field in the FAT header containing
6
 * the LBA of the root directory.
7
 */
8
#include "x16.h"
9
 
10
#define DIROFF		0x00200		/* where to read the root directory (offset) */
11
#define LOADSEG		(0x10000/16)	/* where to load code (64KB) */
12
#define LOADOFF		0
13
 
14
/*
15
 * FAT directory entry.
16
 */
17
#define Dname		0x00
18
#define Dext		0x08
19
#define Dattr		0x0B
20
#define Dtime		0x16
21
#define Ddate		0x18
22
#define Dstart		0x1A
23
#define Dlengthlo	0x1C
24
#define Dlengthhi	0x1E
25
 
26
#define Dirsz		0x20
27
 
28
/*
29
 * We keep data on the stack, indexed by rBP.
30
 */
31
#define Xdrive		0x00		/* boot drive, passed by BIOS in rDL */
32
#define Xrootlo		0x02		/* offset of root directory */
33
#define Xroothi		0x04
34
#define Xrootsz		0x06		/* file data area */
35
#define Xtotal		0x08		/* sum of allocated data above */
36
#define Xdap		0x00		/* disc address packet */
37
 
38
TEXT _magic(SB), $0
39
	BYTE $0xEB; BYTE $0x3C;		/* jmp .+ 0x3C  (_start0x3E) */
40
	BYTE $0x90			/* nop */
41
TEXT _version(SB), $0
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
47
	BYTE $0x00
48
TEXT _nresrv(SB), $0
49
	BYTE $0x00; BYTE $0x00
50
TEXT _nfats(SB), $0
51
	BYTE $0x00
52
TEXT _rootsize(SB), $0
53
	BYTE $0x00; BYTE $0x00
54
TEXT _volsize(SB), $0
55
	BYTE $0x00; BYTE $0x00
56
TEXT _mediadesc(SB), $0
57
	BYTE $0x00
58
TEXT _fatsize(SB), $0
59
	BYTE $0x00; BYTE $0x00
60
TEXT _trksize(SB), $0
61
	BYTE $0x00; BYTE $0x00
62
TEXT _nheads(SB), $0
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;
70
TEXT _driveno(SB), $0
71
	BYTE $0x00
72
TEXT _reserved0(SB), $0
73
	BYTE $0x00
74
TEXT _bootsig(SB), $0
75
	BYTE $0x00
76
TEXT _volid(SB), $0
77
	BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
78
TEXT _label(SB), $0
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
82
TEXT _type(SB), $0
83
	BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
84
	BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
85
 
86
_start0x3E:
87
	CLI
88
	CLR(rAX)
89
	MTSR(rAX, rSS)			/* 0000 -> rSS */
90
	MTSR(rAX, rDS)			/* 0000 -> rDS, source segment */
91
	MTSR(rAX, rES)
92
	LWI(_magic-Xtotal(SB), rSP)
93
	MW(rSP, rBP)			/* set the indexed-data pointer */
94
 
95
	SBPB(rDL, Xdrive)		/* save the boot drive */
96
 
97
	STI
98
 
99
	LWI(confidence(SB), rSI)	/* for that warm, fuzzy feeling */
100
	CALL(BIOSputs(SB))
101
 
102
	LBI(0x41, rAH)			/* check extensions present */
103
	LWI(0x55AA, rBX)
104
	LXB(Xdrive, xBP, rDL)		/* drive */
105
	SYSCALL(0x13)			/* CF set on failure */
106
	JCS _jmp01
107
	CMPI(0xAA55, rBX)
108
	JNE _jmp01
109
	ANDI(0x0001, rCX)
110
	JEQ _jmp01
111
 
112
					/* rCX contains 0x0001 */
113
	SBPWI(0x0010, Xdap+0)		/* reserved + packet size */
114
	SBPW(rCX, Xdap+2)		/* reserved + # of blocks to transfer */
115
 
116
	DEC(rCX)
117
	SBPW(rCX, Xdap+12)
118
	SBPW(rCX, Xdap+14)
119
 
120
/* BIOSread will do this 	CALL(dreset(SB)) */
121
 
122
_jmp00:
123
	LW(_volid(SB), rAX)		/* Xrootlo */
124
	LW(_volid+2(SB), rDX)		/* Xroothi */
125
 
126
	LWI(_magic+DIROFF(SB), rBX)
127
	CALL(BIOSread(SB))		/* read the root directory */
128
 
129
	CALL(printnl(SB))
130
	LWI(_magic+DIROFF(SB), rBX)
131
	LWI((512/2), rCX)
132
	CALL(printbuf(SB))
133
 
134
xloop:
135
	JMP xloop
136
 
137
 
138
_jmp01:
139
 
140
TEXT buggery(SB), $0
141
	LWI(error(SB), rSI)
142
	CALL(BIOSputs(SB))
143
 
144
xbuggery:
145
	JMP xbuggery
146
 
147
/*
148
 * Read a sector from a disc. On entry:
149
 *   rDX:rAX	sector number
150
 *   rES:rBX	buffer address
151
 */
152
TEXT BIOSread(SB), $0
153
	LWI(5, rDI)			/* retry count (ATAPI ZIPs suck) */
154
_retry:
155
	PUSHA				/* may be trashed by SYSCALL */
156
 
157
	SBPW(rBX, Xdap+4)		/* transfer buffer :offset */
158
	MFSR(rES, rDI)			/* transfer buffer seg: */
159
	SBPW(rDI, Xdap+6)
160
	SBPW(rAX, Xdap+8)		/* LBA (64-bits) */
161
	SBPW(rDX, Xdap+10)
162
 
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 */
167
	JCC _BIOSreadret
168
 
169
	POPA
170
	DEC(rDI)			/* too many retries? */
171
	JEQ _ioerror
172
 
173
	CALL(dreset(SB))
174
	JMP _retry
175
 
176
_ioerror:
177
	LWI(ioerror(SB), rSI)
178
	CALL(BIOSputs(SB))
179
	JMP xbuggery
180
 
181
_BIOSreadret:
182
	POPA
183
	RET
184
 
185
TEXT dreset(SB), $0
186
	PUSHA
187
	CLR(rAX)			/* rAH == 0 == reset disc system */
188
	LBPB(Xdrive, rDL)
189
	SYSCALL(0x13)
190
	ORB(rAH, rAH)			/* status (0 == success) */
191
	POPA
192
	JNE _ioerror
193
	RET
194
 
195
 
196
TEXT printsharp(SB), $0
197
	LWI(sharp(SB), rSI)
198
_doprint:
199
	CALL(BIOSputs(SB))
200
	RET
201
 
202
TEXT printspace(SB), $0
203
	LWI(space(SB), rSI)
204
	JMP _doprint
205
 
206
TEXT printnl(SB), $0
207
	LWI(nl(SB), rSI)
208
	JMP _doprint
209
 
210
/*
211
 * Output a string to the display.
212
 * String argument is in rSI.
213
 */
214
TEXT BIOSputs(SB), $0
215
	PUSHA
216
	CLR(rBX)
217
_BIOSputs:
218
	LODSB
219
	ORB(rAL, rAL)
220
	JEQ _BIOSputsret
221
 
222
	LBI(0x0E, rAH)
223
	SYSCALL(0x10)
224
	JMP _BIOSputs
225
 
226
_BIOSputsret:
227
	POPA
228
	RET
229
 
230
/*
231
 * Output a register to the display.
232
 */
233
TEXT printAX(SB), $0
234
	PUSHW(rAX)
235
	PUSHW(rBX)
236
	PUSHW(rCX)
237
	PUSHW(rDI)
238
 
239
	LWI(4, rCX)
240
	LWI(numbuf+4(SB), rSI)
241
 
242
_nextchar:
243
	DEC(rSI)
244
	MW(rAX, rBX)
245
	ANDI(0x000F, rBX)
246
	ADDI(0x30, rBX)	/* 0x30 = '0' */
247
	CMPI(0x39, rBX)	/* 0x39 = '9' */
248
	JLE _dowrite
249
	ADDI(0x07, rBX)	/* 0x07 = 'A'-(1+'9')*/
250
 
251
_dowrite:
252
	SXB(rBL, 0, xSI)
253
	SHRI(4, rAX)
254
 
255
	DEC(rCX)
256
	JNE _nextchar
257
 
258
	LWI(numbuf(SB), rSI)
259
	CALL(BIOSputs(SB))
260
 
261
	POPW(rDI)
262
	POPW(rCX)
263
	POPW(rBX)
264
	POPW(rAX)
265
 
266
	CALL(printspace(SB))
267
	RET
268
 
269
TEXT printDXAX(SB), $0
270
	PUSHW(rAX)
271
	MW(rDX, rAX)
272
	CALL(printAX(SB))
273
	POPW(rAX)
274
	CALL(printAX(SB))
275
	RET
276
 
277
TEXT printBX(SB), $0
278
	PUSHW(rAX)
279
	MW(rBX, rAX)
280
	CALL(printAX(SB))
281
	POPW(rAX)
282
	RET
283
 
284
/*
285
 * Output some number of words to the display
286
 * rDS:rDI - buffer
287
 * rCX: number of words
288
 */
289
TEXT printbuf(SB), $0
290
	PUSHW(rAX)
291
	PUSHW(rBX)
292
	PUSHW(rCX)
293
 
294
_nextword:
295
	LXW(0, xBX, rAX)
296
	CALL(printAX(SB))
297
	INC(rBX)
298
	INC(rBX)
299
	DEC(rCX)
300
	JNE _nextword
301
 
302
	POPW(rCX)
303
	POPW(rBX)
304
	POPW(rAX)
305
	RET
306
 
307
TEXT error(SB), $0
308
	BYTE $'E'; 
309
 
310
TEXT ioerror(SB), $0
311
	BYTE $'I'; 
312
 
313
TEXT nl(SB), $0
314
	BYTE $'\r';
315
	BYTE $'\n';
316
	BYTE $'\z';
317
 
318
TEXT numbuf(SB), $0
319
	BYTE $'X'; BYTE $'X'; BYTE $'X'; BYTE $'X';
320
	BYTE $'\z';
321
 
322
TEXT space(SB), $0
323
	BYTE $' ';
324
	BYTE $'\z';
325
 
326
TEXT sharp(SB), $0
327
	BYTE $'#'; BYTE $'\z';