rev |
line source |
pascal@18140
|
1 BOOTSEG = 0x07C0 /* original address of boot-sector */
|
pascal@18140
|
2 SYSSEG = 0x1000 /* historical load address >> 4 */
|
pascal@18140
|
3 INITSEG = 0x9000 /* boot address >> 4 */
|
pascal@18140
|
4 SETUPSEG = 0x9020 /* setup address >> 4 */
|
pascal@18140
|
5 ASK_VGA = -3
|
pascal@18140
|
6
|
pascal@18140
|
7 #ifndef SVGA_MODE
|
pascal@18140
|
8 #define SVGA_MODE ASK_VGA
|
pascal@18140
|
9 #endif
|
pascal@18140
|
10
|
pascal@18140
|
11 #ifndef RAMDISK
|
pascal@18140
|
12 #define RAMDISK 0
|
pascal@18140
|
13 #endif
|
pascal@18140
|
14
|
pascal@18140
|
15 #ifndef ROOT_RDONLY
|
pascal@18140
|
16 #define ROOT_RDONLY 1
|
pascal@18140
|
17 #endif
|
pascal@18140
|
18
|
pascal@18140
|
19 /* some extra features */
|
pascal@18140
|
20 #define CMDLINE kernel >= 2.4
|
pascal@18140
|
21 #define OLDCMDLINE kernel < 2.4
|
pascal@18140
|
22 #define HELP display version for ? argument
|
pascal@18140
|
23 #define MORETHAN16M up to 4Gb RAM, not 16Mb
|
pascal@18140
|
24 #define KEYBOARDLESS_SUPPORT scan floppy swap each 5 seconds
|
pascal@18140
|
25
|
pascal@18140
|
26 #define EDIT_CMDLINE
|
pascal@18140
|
27 #define CMDLINE_SUPPORT
|
pascal@18140
|
28 #define MOVE_CMDLINE
|
pascal@18140
|
29 #define INITRD_SUPPORT
|
pascal@18140
|
30 #define INITRD_AUTOADDR
|
pascal@18140
|
31 #define MULTI_INITRD many in one support
|
pascal@18140
|
32
|
pascal@18140
|
33 .code16
|
pascal@18140
|
34 .org 0
|
pascal@18140
|
35
|
pascal@18140
|
36 bootsect_start:
|
pascal@18140
|
37
|
pascal@18140
|
38 cur_initrd_size_ofs = 494
|
pascal@18140
|
39 ramdisk_image_ofs = 0x218
|
pascal@18140
|
40 ramdisk_image = bootsect_start+ramdisk_image_ofs
|
pascal@18140
|
41 ramdisk_size_ofs = 0x21C
|
pascal@18140
|
42 ramdisk_size = bootsect_start+ramdisk_size_ofs
|
pascal@18140
|
43 cmd_line_ptr_ofs = 0x228
|
pascal@18140
|
44 cmd_line_ptr = bootsect_start+cmd_line_ptr_ofs
|
pascal@18140
|
45 setup_sects = bootsect_start+497
|
pascal@18140
|
46 syssize = bootsect_start+500
|
pascal@18140
|
47 boot_flag_ofs = 510
|
pascal@18140
|
48 boot_flag = bootsect_start+boot_flag_ofs
|
pascal@18140
|
49
|
pascal@18140
|
50
|
pascal@18140
|
51 stacktop = 0x9E00 # in 0x8000 .. 0xA000
|
pascal@18140
|
52 zeroed = 48+10 # gdt + zeroed registers
|
pascal@18140
|
53 .macro INIT_REGS
|
pascal@18140
|
54 movw $stacktop-zeroed, %di # stacktop is an arbitrary value >=
|
pascal@18140
|
55 # length of bootsect + length of
|
pascal@18140
|
56 # setup + room for stack;
|
pascal@18140
|
57 # 12 is disk parm size.
|
pascal@18140
|
58 pushw $INITSEG
|
pascal@18140
|
59 popw %ss # %ss contain INITSEG
|
pascal@18140
|
60 movw %di, %sp # put stack at INITSEG:stacktop-...
|
pascal@18140
|
61 pushw %ss
|
pascal@18140
|
62 popw %es # %es = %ss = INITSEG
|
pascal@18140
|
63 xorw %ax, %ax # %ax = 0
|
pascal@18140
|
64 #if defined(CMDLINE)
|
pascal@18140
|
65 movw $zeroed+1, %cx # clear gdt + offset, %ds, limits, cmdline=""
|
pascal@18140
|
66 rep # don't worry about cld
|
pascal@18140
|
67 stosb # already done above
|
pascal@18145
|
68 //decw %di
|
pascal@18140
|
69 #else
|
pascal@18140
|
70 movw $zeroed/2, %cx # clear gdt + offset, %ds, limits
|
pascal@18140
|
71 rep # don't worry about cld
|
pascal@18140
|
72 stosw # already done above
|
pascal@18140
|
73 #endif
|
pascal@18140
|
74 popw %bx # offset = 0
|
pascal@18140
|
75 .endm
|
pascal@18140
|
76
|
pascal@18140
|
77 LOADSEG = 0x8000 # 0x1000 multiple, up to 512K zImage
|
pascal@18140
|
78 LOADSZ = 0x10000
|
pascal@18140
|
79
|
pascal@18140
|
80 # bootsect_start:
|
pascal@18140
|
81 INIT_REGS
|
pascal@18140
|
82 popw %ds # %ds = 0
|
pascal@18140
|
83 movb setup_sects+0x7C00, %al # read bootsector + setup
|
pascal@18140
|
84 incw %ax # %ax = setup_sects+bootsect
|
pascal@18140
|
85 popw %fs # %fs = 0
|
pascal@18140
|
86
|
pascal@18140
|
87 # Many BIOS's default disk parameter tables will not recognize
|
pascal@18140
|
88 # multi-sector reads beyond the maximum sector number specified
|
pascal@18140
|
89 # in the default diskette parameter tables - this may mean 7
|
pascal@18140
|
90 # sectors in some cases.
|
pascal@18140
|
91 #
|
pascal@18140
|
92 # Since single sector reads are slow and out of the question,
|
pascal@18140
|
93 # we must take care of this by creating new parameter tables
|
pascal@18140
|
94 # (for the first disk) in RAM. We can set the maximum sector
|
pascal@18140
|
95 # count to 36 - the most we will encounter on an ED 2.88.
|
pascal@18140
|
96 #
|
pascal@18140
|
97 # High doesn't hurt. Low does. Let's use the max: 63
|
pascal@18140
|
98
|
pascal@18145
|
99 cli
|
pascal@18140
|
100 ldsw 0x78(%bx), %si # %ds:%bx+0x78 is parameter table address
|
pascal@18140
|
101 popw %di
|
pascal@18140
|
102 pushw %es
|
pascal@18140
|
103 pushw %di
|
pascal@18140
|
104 #ifdef CMDLINE_SUPPORT
|
pascal@18140
|
105 movw $0, %bp # patched by installer (7C22)
|
pascal@18140
|
106 skipcmdline:
|
pascal@18140
|
107 #define cmd_line_ptr 0x22
|
pascal@18140
|
108 #endif
|
pascal@18140
|
109 movb $6, %cl # copy 12 bytes
|
pascal@18140
|
110 rep # don't worry about cld
|
pascal@18140
|
111 movsw # already done above
|
pascal@18140
|
112 pushw %ss
|
pascal@18140
|
113 popw %ds # now %ds = %es = %ss = INITSEG
|
pascal@18140
|
114 popl %fs:0x78(%bx) # update parameter table address
|
pascal@18140
|
115 movb $63, 0x4-12(%di) # patch sector count, %di = stacktop
|
pascal@18140
|
116
|
pascal@18140
|
117 xchg %ax, %di # sector count
|
pascal@18140
|
118 popw %ax # limits = 0
|
pascal@18140
|
119 incw %cx # cylinder 0, sector 1, clear Z
|
pascal@18140
|
120 call read_first_sectors # read setup
|
pascal@18140
|
121 loadsys:
|
pascal@18140
|
122 movw $0x200,%si
|
pascal@18140
|
123 type_of_loader = 0x10
|
pascal@18140
|
124 loadflags = 0x11
|
pascal@18140
|
125 heap_end_ptr = 0x24
|
pascal@18140
|
126 orw $0x8020, type_of_loader(%si) # loader type = 0x20 = bootsect-loader
|
pascal@18140
|
127 movb $(stacktop-0x300)/256, heap_end_ptr+1(%si)
|
pascal@18140
|
128 call puts_version # show which kernel we are loading
|
pascal@18140
|
129
|
pascal@18140
|
130 #ifdef CMDLINE_SUPPORT
|
pascal@18140
|
131 # The cmdline can be entered and modifed at boot time.
|
pascal@18140
|
132 # Only characters before the cursor are passed to the kernel.
|
pascal@18140
|
133
|
pascal@18140
|
134 xorw %si, %si
|
pascal@18140
|
135 orw cmd_line_ptr-7(%bx), %si
|
pascal@18140
|
136 jz nocmdline
|
pascal@18140
|
137 #ifdef OLDCMDLINE
|
pascal@18140
|
138 movw $0xA33F, cmd_line_ptr-2-7(%bx)
|
pascal@18140
|
139 #endif
|
pascal@18140
|
140 call puts
|
pascal@18140
|
141 #ifdef EDIT_CMDLINE
|
pascal@18140
|
142 cmdlp:
|
pascal@18140
|
143 movb $0x20, %al # clear end of line
|
pascal@18140
|
144 cmdlpz:
|
pascal@18140
|
145 call putc # with Space
|
pascal@18140
|
146 subb $0x18, %al # and BackSpace
|
pascal@18140
|
147 jnc cmdlpz
|
pascal@18140
|
148 decw %si
|
pascal@18140
|
149 cmdget:
|
pascal@18140
|
150 #ifdef KEYBOARDLESS_SUPPORT
|
pascal@18140
|
151 call wait4key
|
pascal@18140
|
152 #else
|
pascal@18140
|
153 int $0x16
|
pascal@18140
|
154 #endif
|
pascal@18140
|
155 cbw # %ah = 0, get keyboard character
|
pascal@18140
|
156 cmpb $8, %al # BackSpace ?
|
pascal@18140
|
157 je cmdbs
|
pascal@18140
|
158 movb %al, (%si) # store char
|
pascal@18140
|
159 lodsw # %si += 2
|
pascal@18140
|
160 cmdbs:
|
pascal@18140
|
161 cmpw %si, cmd_line_ptr-7(%bx)
|
pascal@18140
|
162 je cmdget
|
pascal@18140
|
163 call putc
|
pascal@18140
|
164 cmpb $10, %al # Enter/linefeed ?
|
pascal@18140
|
165 jne cmdlp
|
pascal@18140
|
166 movb %bh,-2(%si) # set end of string and remove CR
|
pascal@18140
|
167 endcmdline:
|
pascal@18140
|
168 #endif
|
pascal@18140
|
169 #ifdef MOVE_CMDLINE
|
pascal@18140
|
170 pushw %ss
|
pascal@18140
|
171 popw %es
|
pascal@18140
|
172 movw $0x8000, %di
|
pascal@18140
|
173 movw %di, %si
|
pascal@18140
|
174 xchgw %si, cmd_line_ptr-7(%bx)
|
pascal@18140
|
175 movb $0x2, %ch
|
pascal@18140
|
176 rep
|
pascal@18140
|
177 movsb
|
pascal@18140
|
178 #endif
|
pascal@18140
|
179 nocmdline:
|
pascal@18140
|
180 #endif
|
pascal@18140
|
181
|
pascal@18140
|
182 # This routine loads the system at address LOADSEG, making sure
|
pascal@18140
|
183 # no 64kB boundaries are crossed. We try to load it as fast as
|
pascal@18140
|
184 # possible, loading whole tracks whenever we can.
|
pascal@18140
|
185
|
pascal@18140
|
186 .macro autoaddr base
|
pascal@18140
|
187 #ifdef INITRD_AUTOADDR
|
pascal@18140
|
188 movb $0x88, %ah
|
pascal@18140
|
189 int $0x15
|
pascal@18140
|
190 //jc NeedMoreRAM # error code 80 or 86
|
pascal@18145
|
191 cmpw $0xB000, %ax # more than 45M ?
|
pascal@18140
|
192 jb NeedMoreRAM
|
pascal@18140
|
193 movb %ch, bootsect_dst_base_hi(%si) # initramfs @ 32M
|
pascal@18140
|
194 movb %ch, ramdisk_image_ofs+3-\base
|
pascal@18140
|
195 NeedMoreRAM:
|
pascal@18140
|
196 #endif
|
pascal@18140
|
197 .endm
|
pascal@18140
|
198
|
pascal@18140
|
199 bootsect_src_limit = 16
|
pascal@18140
|
200 bootsect_dst_limit = 24
|
pascal@18140
|
201 bootsect_src_base = 18
|
pascal@18140
|
202 bootsect_dst_base = 26 # bits 0..23
|
pascal@18140
|
203 bootsect_dst_base_hi = 31 # bits 24..31
|
pascal@18140
|
204 popw %bx # clear %bx
|
pascal@18140
|
205 movw %sp, %si # for bootsect_gdt
|
pascal@18140
|
206 init_gdt:
|
pascal@18140
|
207 decw bootsect_src_limit(%bx,%si) # max 64Kb
|
pascal@18140
|
208 movw $0x9300+(LOADSEG/0x1000), bootsect_src_base+2(%bx,%si)
|
pascal@18140
|
209 xorb $bootsect_dst_limit-bootsect_src_limit, %bl
|
pascal@18140
|
210 jne init_gdt
|
pascal@18140
|
211 #ifdef INITRD_SUPPORT
|
pascal@18140
|
212 movw $syssize, %bx
|
pascal@18140
|
213 movb $5, %cl
|
pascal@18140
|
214 code32_start = 0x214
|
pascal@18140
|
215 movw code32_start+1, %ax # destination = 0x00100000 or 0x00010000
|
pascal@18140
|
216 initrdlp:
|
pascal@18140
|
217 movl (%bx), %ebx
|
pascal@18140
|
218 decl %ebx
|
pascal@18140
|
219 shrl %cl, %ebx
|
pascal@18140
|
220 #else
|
pascal@18140
|
221 code32_start = 0x214
|
pascal@18140
|
222 movw code32_start+1, %ax # destination = 0x00100000 or 0x00010000
|
pascal@18140
|
223 movl syssize, %ebx
|
pascal@18140
|
224 decl %ebx
|
pascal@18140
|
225 shrl $5, %ebx
|
pascal@18140
|
226 #endif
|
pascal@18140
|
227 #ifdef MORETHAN16M
|
pascal@18140
|
228 incl %ebx
|
pascal@18140
|
229 #else
|
pascal@18140
|
230 incw %bx
|
pascal@18140
|
231 #endif
|
pascal@18140
|
232 syslp:
|
pascal@18140
|
233 movw %ax, bootsect_dst_base+1(%si)
|
pascal@18140
|
234 #ifdef MORETHAN16M
|
pascal@18140
|
235 movl $LOADSZ/512, %edi # size in sectors
|
pascal@18140
|
236 subl %edi, %ebx
|
pascal@18140
|
237 #else
|
pascal@18140
|
238 movw $LOADSZ/512, %di # size in sectors
|
pascal@18140
|
239 subw %di, %bx
|
pascal@18140
|
240 #endif
|
pascal@18140
|
241 pushf
|
pascal@18140
|
242 jnc not_last
|
pascal@18140
|
243 addw %bx, %di
|
pascal@18140
|
244 not_last:
|
pascal@18140
|
245 #ifdef MULTI_INITRD
|
pascal@18140
|
246 pushw %di
|
pascal@18140
|
247 #endif
|
pascal@18140
|
248 pushw %ax
|
pascal@18140
|
249 pushw %bx
|
pascal@18140
|
250 pushw %si
|
pascal@18140
|
251 xorw %bx,%bx
|
pascal@18140
|
252 pushw $LOADSEG
|
pascal@18140
|
253 popw %es
|
pascal@18140
|
254 patchcall:
|
pascal@18140
|
255 call read_sectors # update %bp
|
pascal@18140
|
256 popw %si
|
pascal@18140
|
257 popw %bx
|
pascal@18140
|
258 movw %es, %cx # word count = LOADSZ/2 (= LOADSEG)
|
pascal@18140
|
259 movb $0x87, %ah
|
pascal@18140
|
260 pushw %ss
|
pascal@18140
|
261 popw %es # restore es
|
pascal@18140
|
262 int $0x15 # max 16M, maybe more...
|
pascal@18140
|
263 popw %ax
|
pascal@18140
|
264 #ifdef MULTI_INITRD
|
pascal@18140
|
265 popw %di
|
pascal@18140
|
266 shlw $1,%di # sectors to pages
|
pascal@18140
|
267 addw %di, %ax
|
pascal@18140
|
268 #ifdef MORETHAN16M
|
pascal@18140
|
269 adcb %cl, bootsect_dst_base_hi(%si) # breaks 16M limit ?
|
pascal@18140
|
270 #endif
|
pascal@18140
|
271 #else
|
pascal@18140
|
272 #ifdef MORETHAN16M
|
pascal@18140
|
273 addw $0x100, %ax # next dest (ax+=LOADSZ/256)
|
pascal@18140
|
274 adcb %cl, bootsect_dst_base_hi(%si) # breaks 16M limit ?
|
pascal@18140
|
275 #else
|
pascal@18140
|
276 incb %ah # next dest (ax+=LOADSZ/256)
|
pascal@18140
|
277 #endif
|
pascal@18140
|
278 #endif
|
pascal@18140
|
279 popf
|
pascal@18140
|
280 ja syslp
|
pascal@18140
|
281 #ifdef INITRD_SUPPORT
|
pascal@18140
|
282 initrdlp2:
|
pascal@18140
|
283 #ifdef INITRD_AUTOADDR
|
pascal@18140
|
284 movw $0x209, %cx
|
pascal@18140
|
285 #else
|
pascal@18140
|
286 movb $9, %cl
|
pascal@18140
|
287 #endif
|
pascal@18140
|
288 #ifdef MULTI_INITRD
|
pascal@18140
|
289 movw $cur_initrd_size_ofs, %di
|
pascal@18140
|
290 movw (%di), %bx
|
pascal@18140
|
291 addw $4, (%di)
|
pascal@18140
|
292 shrw %cl, boot_flag_ofs-cur_initrd_size_ofs(%di)
|
pascal@18140
|
293 je nextInitrd
|
pascal@18140
|
294 orw %bx, %bx
|
pascal@18140
|
295 je bootit # no initrd
|
pascal@18140
|
296 autoaddr cur_initrd_size_ofs(%di)
|
pascal@18140
|
297 movw ramdisk_image+1,%ax
|
pascal@18140
|
298 jmp initrdlp
|
pascal@18140
|
299 nextInitrd:
|
pascal@18140
|
300 pushw %bx
|
pascal@18140
|
301 movl -4(%bx), %ebx
|
pascal@18140
|
302 addl %ebx, ramdisk_size_ofs-cur_initrd_size_ofs(%di)
|
pascal@18145
|
303 movb $swap_floppy2-0x100, %cs:dpy_swap_floppy-2+0x7C00
|
pascal@18140
|
304 popw %bx
|
pascal@18140
|
305 cmpb 2(%di), %bl
|
pascal@18140
|
306 jb initrdlp
|
pascal@18140
|
307 #else
|
pascal@18140
|
308 movw $ramdisk_size, %bx
|
pascal@18140
|
309 autoaddr ramdisk_size_ofs(%bx)
|
pascal@18140
|
310 movw ramdisk_image+1,%ax
|
pascal@18140
|
311 #ifdef MORETHAN16M
|
pascal@18140
|
312 cmpb %cl, ramdisk_image+2-ramdisk_size(%bx)
|
pascal@18140
|
313 jb bootit
|
pascal@18140
|
314 shrw %cl, boot_flag-ramdisk_size(%bx)
|
pascal@18140
|
315 jne initrdlp
|
pascal@18140
|
316 #else
|
pascal@18140
|
317 cmpw %ax, bootsect_dst_base+1(%si)
|
pascal@18140
|
318 jb initrdlp
|
pascal@18140
|
319 #endif
|
pascal@18140
|
320 #endif
|
pascal@18140
|
321 #endif
|
pascal@18140
|
322 #ifdef MULTI_INITRD
|
pascal@18140
|
323 bootit:
|
pascal@18140
|
324 jcxz read_sectorslp
|
pascal@18140
|
325 #endif
|
pascal@18140
|
326
|
pascal@18140
|
327 # This procedure turns off the floppy drive motor, so
|
pascal@18140
|
328 # that we enter the kernel in a known state, and
|
pascal@18140
|
329 # don't have to worry about it later.
|
pascal@18140
|
330
|
pascal@18140
|
331 kill_motor:
|
pascal@18140
|
332 xchgw %ax, %di # reset FDC (%di < 128)
|
pascal@18140
|
333 int $0x13
|
pascal@18140
|
334
|
pascal@18140
|
335 # After that (everything loaded), we jump to the setup-routine
|
pascal@18140
|
336 # loaded directly after the bootblock:
|
pascal@18140
|
337 # Segments are as follows: %ds = %ss = INITSEG
|
pascal@18140
|
338
|
pascal@18140
|
339 ljmp $SETUPSEG, $0
|
pascal@18140
|
340
|
pascal@18140
|
341 # read_sectors reads %di sectors into %es:0 buffer.
|
pascal@18140
|
342 # %es:0 is updated to the next memory location.
|
pascal@18140
|
343 # First, sectors are read sector by sector until
|
pascal@18140
|
344 # sector per track count is known. Then they are
|
pascal@18140
|
345 # read track by track.
|
pascal@18140
|
346 # Assume no error on first track.
|
pascal@18140
|
347
|
pascal@18140
|
348 #define FLOPPY_CYLINDERS 80
|
pascal@18140
|
349 #define FLOPPY_HEADS 2
|
pascal@18140
|
350
|
pascal@18140
|
351 check_limits:
|
pascal@18140
|
352 popw %dx
|
pascal@18140
|
353 cmpb %al, %cl # max sector known ?
|
pascal@18140
|
354 ja next_head # no -> store it
|
pascal@18140
|
355 pushaw
|
pascal@18140
|
356 int $0x13 # reset controler
|
pascal@18140
|
357 stc
|
pascal@18140
|
358 call putcdot # print '-'
|
pascal@18140
|
359 read_sectorslp:
|
pascal@18140
|
360 popaw
|
pascal@18140
|
361 bdendlp:
|
pascal@18140
|
362 pushw %dx # some bios break dx...
|
pascal@18140
|
363 pushw %ax # limits
|
pascal@18140
|
364 subb %cl, %al # sectors remaining in track
|
pascal@18140
|
365 ja tolastsect
|
pascal@18140
|
366 movb $1, %al # 1 sector mini
|
pascal@18140
|
367 tolastsect:
|
pascal@18140
|
368 cmpw %di, %ax
|
pascal@18140
|
369 jb more1trk
|
pascal@18140
|
370 movw %di, %ax # sectors to read
|
pascal@18140
|
371 more1trk:
|
pascal@18140
|
372 pushw %ax # save context
|
pascal@18140
|
373 movb $2, %ah # cmd: read chs
|
pascal@18140
|
374 int $0x13
|
pascal@18140
|
375 popw %dx # save %ax
|
pascal@18140
|
376 popw %ax # limits
|
pascal@18140
|
377 jc check_limits
|
pascal@18140
|
378 xchgw %ax, %bp
|
pascal@18140
|
379 addw %dx,%cx # next sector
|
pascal@18140
|
380 movw %cx, %gs
|
pascal@18140
|
381 addb %dl,%bh
|
pascal@18140
|
382 addb %dl,%bh # next location
|
pascal@18140
|
383 subw %dx,%di # update sector counter
|
pascal@18140
|
384 popw %dx
|
pascal@18140
|
385 jz putcdot
|
pascal@18140
|
386 read_sectors:
|
pascal@18140
|
387 movw %gs, %cx
|
pascal@18140
|
388 # al is last sector+1
|
pascal@18140
|
389 # ah is 0
|
pascal@18140
|
390 xchgw %ax, %bp
|
pascal@18140
|
391 cmpb %al,%cl # reach sector limit ?
|
pascal@18140
|
392 jne bdendlp
|
pascal@18140
|
393 next_head:
|
pascal@18140
|
394 movb %cl,%al
|
pascal@18140
|
395 movb $1, %cl # first sector
|
pascal@18140
|
396 inc_head:
|
pascal@18140
|
397 xorb %cl, %dh # next head
|
pascal@18140
|
398 jne bdendlp # reach head limit ?
|
pascal@18140
|
399 incb %ch # next cylinder
|
pascal@18140
|
400 read_first_sectors:
|
pascal@18140
|
401 cmpb $FLOPPY_CYLINDERS,%ch # reach cylinder limit ?
|
pascal@18140
|
402 jne bdendlp
|
pascal@18140
|
403 next_floppy:
|
pascal@18140
|
404 movb $0,%ch # first cylinder
|
pascal@18140
|
405 pushaw
|
pascal@18140
|
406 movw $swap_floppy,%si
|
pascal@18145
|
407 dpy_swap_floppy:
|
pascal@18140
|
408 #ifdef KEYBOARDLESS_SUPPORT
|
pascal@18140
|
409 pushw %bx
|
pascal@18140
|
410 call puts
|
pascal@18140
|
411 popw %bx
|
pascal@18140
|
412 movw %si, %bp
|
pascal@18140
|
413 waitfloppy:
|
pascal@18140
|
414 call wait
|
pascal@18140
|
415 jne waitfloppydone
|
pascal@18140
|
416 #ifdef MULTI_INITRD
|
pascal@18140
|
417 decb (%si) # max_timeouts
|
pascal@18145
|
418 gobootit:
|
pascal@18145
|
419 //movw ramdisk_size+2-max_timeouts(%si), %cx
|
pascal@18145
|
420 .byte 0x8B, 0x4C, ramdisk_size+2-max_timeouts
|
pascal@18145
|
421 jz bootit
|
pascal@18140
|
422 #endif
|
pascal@18140
|
423 pushw %dx # some bios break dx...
|
pascal@18140
|
424 cbw
|
pascal@18140
|
425 int $0x13 # reset FDC
|
pascal@18140
|
426 movw $0x201,%ax
|
pascal@18140
|
427 int $0x13 # read first sector
|
pascal@18140
|
428 popw %dx
|
pascal@18140
|
429 rclb $1,%ah # floppy changed 06=>0D no error 00
|
pascal@18140
|
430 cmpb -2(%bp), %ah # 0D then 00
|
pascal@18140
|
431 jne waitfloppy # no => try again
|
pascal@18140
|
432 incw %bp
|
pascal@18140
|
433 decw %ax # was 0001 ?
|
pascal@18140
|
434 jne waitfloppy
|
pascal@18140
|
435 waitfloppydone:
|
pascal@18140
|
436 #else
|
pascal@18140
|
437 call puts
|
pascal@18140
|
438 cbw # %ah = 0, get keyboard character
|
pascal@18140
|
439 int $0x16
|
pascal@18140
|
440 #endif
|
pascal@18140
|
441 #ifdef MULTI_INITRD
|
pascal@18140
|
442 orb $0x20, %al
|
pascal@18140
|
443 cmp $'b', %al
|
pascal@18145
|
444 jz gobootit
|
pascal@18145
|
445 #endif
|
pascal@18140
|
446 jmp read_sectorslp
|
pascal@18140
|
447
|
pascal@18140
|
448 putcdot:
|
pascal@18140
|
449 movb $'.'+3, %al // . = success, - = failure
|
pascal@18140
|
450 putclf:
|
pascal@18140
|
451 sbbb $3, %al
|
pascal@18140
|
452 putc:
|
pascal@18140
|
453 movb $0xe, %ah
|
pascal@18140
|
454 movw $7, %bx # one dot each 64k
|
pascal@18140
|
455 int $0x10
|
pascal@18140
|
456 cmp $0xd, %al # CR ?
|
pascal@18140
|
457 je putclf
|
pascal@18140
|
458 ret
|
pascal@18140
|
459
|
pascal@18140
|
460 #ifdef KEYBOARDLESS_SUPPORT
|
pascal@18140
|
461 clock = 0x46C
|
pascal@18140
|
462 wait:
|
pascal@18140
|
463 wait4key:
|
pascal@18140
|
464 movw $clock, %di
|
pascal@18140
|
465 #define DELAY 5
|
pascal@18140
|
466 movb $257-(DELAY*182)/10, %fs:(%di)
|
pascal@18140
|
467 waitkbd:
|
pascal@18140
|
468 movw $0x10D, %ax # test keyboard, timeout => CR
|
pascal@18140
|
469 cmpb %fs:(%di),%ah
|
pascal@18140
|
470 je waitdone
|
pascal@18140
|
471 int $0x16
|
pascal@18140
|
472 jz waitkbd
|
pascal@18140
|
473 cbw
|
pascal@18140
|
474 int $0x16 # eat char
|
pascal@18140
|
475 movw %di, %fs # disable timeout
|
pascal@18140
|
476 incw %di # clear Z
|
pascal@18140
|
477 waitdone:
|
pascal@18140
|
478 ret
|
pascal@18140
|
479 #endif
|
pascal@18140
|
480
|
pascal@18140
|
481 #define kernel_version_offset 0xE
|
pascal@18140
|
482 puts_version:
|
pascal@18140
|
483 addw kernel_version_offset(%si),%si # starting protocol 2.00, Kernel 1.3.73
|
pascal@18140
|
484 puts:
|
pascal@18140
|
485 movb $0xd, %al # CR
|
pascal@18140
|
486 putcs:
|
pascal@18140
|
487 call putc
|
pascal@18140
|
488 lodsb
|
pascal@18140
|
489 cmpb $0, %al # end of string is any byte <= 0
|
pascal@18140
|
490 jg putcs
|
pascal@18140
|
491 ret
|
pascal@18140
|
492
|
pascal@18140
|
493 #ifdef MULTI_INITRD
|
pascal@18145
|
494 swap_floppy2:
|
pascal@18140
|
495 .ascii "B or "
|
pascal@18140
|
496 #endif
|
pascal@18145
|
497 swap_floppy:
|
pascal@18140
|
498 .ascii "Next!"
|
pascal@18140
|
499 .byte 7,13,0 # swap detection needs 13, 0
|
pascal@18140
|
500 #ifdef MULTI_INITRD
|
pascal@18140
|
501 max_timeouts:
|
pascal@18140
|
502 .byte 20
|
pascal@18140
|
503 table:
|
pascal@18140
|
504 .org cur_initrd_size_ofs
|
pascal@18140
|
505 cur_initrd_size:
|
pascal@18140
|
506 .word table
|
pascal@18140
|
507 .byte table+4-256
|
pascal@18140
|
508 #endif
|
pascal@18140
|
509 .org 0x1F1
|