rev |
line source |
pascal@13691
|
1 .text
|
pascal@13691
|
2 .code16
|
pascal@19828
|
3 .arch i8086
|
pascal@13691
|
4 .org 0
|
pascal@13691
|
5
|
pascal@13691
|
6 CODESZ = 0x8000 // 16 sectors = 32Kb
|
pascal@13972
|
7 #define EXEADRS(x) x+0xC0
|
pascal@14261
|
8 #define EXELOC(x) x-0x40
|
pascal@14261
|
9 #define EXESTR(x) x-0x7F40
|
pascal@13691
|
10
|
pascal@13691
|
11 .globl _start
|
pascal@13691
|
12 _start:
|
pascal@13691
|
13 decw %bp // Magic number: MZ
|
pascal@13691
|
14 popw %dx
|
pascal@13972
|
15 jmp start0 // Bytes on last page of file
|
pascal@13691
|
16 .word (CODESZ+511)/512 // Pages in file
|
pascal@13691
|
17 .word 0 // Relocations
|
pascal@13691
|
18 .word (end_header-_start)/16 // Size of header in paragraphs
|
pascal@13691
|
19 .word 4064-(CODESZ/16) // Minimum extra paragraphs needed
|
pascal@13691
|
20 .word 4064-(CODESZ/16) // Maximum extra paragraphs needed
|
pascal@13691
|
21 .word 0xFFF0 // Initial (relative) SS value
|
pascal@13691
|
22 .word 0xFFFE // Initial SP value
|
pascal@19872
|
23 magic:
|
pascal@13691
|
24 .word 0 // Checksum
|
pascal@13729
|
25 .word EXEADRS(exestart) // Initial IP value
|
pascal@13691
|
26 .word 0xFFF0 // Initial (relative) CS value
|
pascal@13972
|
27 initramfssize:
|
pascal@13972
|
28 .word 0 // File address of relocation table
|
pascal@17810
|
29 fdcnt: // Overlay number
|
pascal@14257
|
30 .byte 0 // Bootstrap floppy sector count
|
pascal@17810
|
31 .ascii "slitaz"
|
pascal@13691
|
32
|
pascal@13691
|
33 /////////////////////// Master Boot Record code //////////////////////////////
|
pascal@13691
|
34
|
pascal@17810
|
35 moved = 0x8000
|
pascal@17496
|
36 start0:
|
pascal@19827
|
37 //pushw %dx // restore %sp
|
pascal@19827
|
38 //incw %bp // restore %bp
|
pascal@17496
|
39 xorw %bx, %bx
|
pascal@17496
|
40 movw %bx, %ds
|
pascal@17496
|
41 movb $0x7C, %bh
|
pascal@19827
|
42 pushw %ds
|
pascal@19827
|
43 popw %ss
|
pascal@19827
|
44 movw %bx, %sp
|
pascal@17496
|
45 pushw %bx // return address
|
pascal@19827
|
46 pushw %di
|
pascal@17496
|
47 pushw %es // save %es:%di
|
pascal@13972
|
48 cld
|
pascal@17496
|
49 sti
|
pascal@13972
|
50 pushw %ds
|
pascal@13972
|
51 popw %es
|
pascal@13691
|
52 call setreg
|
pascal@13691
|
53 rep
|
pascal@19827
|
54 movsw
|
pascal@13972
|
55 movw $0x80, %dx
|
pascal@17810
|
56 ljmp $0, $moved+start2
|
pascal@17810
|
57 .byte 0
|
pascal@17810
|
58 // .org 60
|
pascal@17810
|
59 // .long 0x0080 // PE header offset
|
pascal@17810
|
60 .org 64
|
pascal@13972
|
61 end_header:
|
pascal@13972
|
62 comstart:
|
pascal@13972
|
63 .word 0
|
pascal@13691
|
64
|
pascal@17810
|
65 .org 66
|
pascal@17810
|
66 dxloop:
|
pascal@17810
|
67 start2:
|
pascal@17810
|
68 call readsector1 // look for the boot device
|
pascal@17810
|
69 repe
|
pascal@17810
|
70 cmpsw
|
pascal@17810
|
71 je dxfound
|
pascal@17810
|
72 movb $0, %cl // ch = 0
|
pascal@17810
|
73 addb $0x7D, %dl // try every hard disk
|
pascal@17810
|
74 jno dxloop
|
pascal@17810
|
75
|
pascal@17810
|
76 dxfound:
|
pascal@17810
|
77 call readsectorX // read isolinux boot sector
|
pascal@17810
|
78 cmpw (%bx), %cx
|
pascal@17810
|
79 jnc puts // read fail or no isohydrid boot sector
|
pascal@23863
|
80 call bootpartition // assume DS=SS SI=BX=7C00 CX=0100 DL=<drive> DI=table+66
|
pascal@17810
|
81 popw %es
|
pascal@19827
|
82 popw %di // isolinux boot needs %es:%di and %dx
|
pascal@17810
|
83 putsret:
|
pascal@17810
|
84 ret
|
pascal@17810
|
85
|
pascal@17810
|
86 putstrlp:
|
pascal@17810
|
87 movw $7, %bx
|
pascal@17810
|
88 movb $0xE, %ah
|
pascal@17810
|
89 int $0x10
|
pascal@17810
|
90 error:
|
pascal@17810
|
91 lodsb
|
pascal@17810
|
92 cmp $1, %al
|
pascal@17810
|
93 jg putstrlp
|
pascal@17810
|
94 jz putsret
|
pascal@17810
|
95 puts:
|
pascal@17810
|
96 movb $0x80, %ah
|
pascal@17810
|
97 xchgw %ax, %si
|
pascal@17810
|
98 jnc error
|
pascal@17810
|
99 halt:
|
pascal@17810
|
100 hlt
|
pascal@17810
|
101 jmp halt
|
pascal@17810
|
102 nobsmsg:
|
pascal@17810
|
103 .asciz "No isolinux."
|
pascal@17810
|
104
|
pascal@23863
|
105 .org 0x0080,0xEE
|
pascal@17810
|
106 ////////////////////////////// EXE/PE header //////////////////////////////////
|
pascal@23863
|
107 .org 0x0178,0xFF
|
pascal@23863
|
108 ////////////////////////// partition boot code ////////////////////////////////
|
pascal@23863
|
109 // assume DS=SS SI=BX=7C00 CX=0100 DL=<drive> DI=table+66
|
pascal@17810
|
110
|
pascal@23863
|
111 bootpartition:
|
pascal@23863
|
112 movw $4,%cx
|
pascal@23863
|
113 movw $16,%ax
|
pascal@23863
|
114 next:
|
pascal@23863
|
115 subw %ax,%di
|
pascal@23863
|
116 cmpb %ch,-2(%di) // boot flag ?
|
pascal@23863
|
117 loope next
|
pascal@23863
|
118 cmpw $63,2-2(%di) // empty or isolinux partition ?
|
pascal@23863
|
119 jbe default
|
pascal@23863
|
120 .arch i486
|
pascal@23863
|
121 pushl $0
|
pascal@23863
|
122 pushl 8-2(%di)
|
pascal@23863
|
123 pushw %cs
|
pascal@23863
|
124 pushw %bx
|
pascal@23863
|
125 pushw $1
|
pascal@23863
|
126 pushw %ax
|
pascal@23863
|
127 movw %sp,%si // assume %ds = %ss
|
pascal@23863
|
128 movb $0x42,%ah
|
pascal@23863
|
129 int $0x13
|
pascal@23863
|
130 add $16,%sp
|
pascal@23863
|
131 .arch i8086
|
pascal@23863
|
132 default:
|
pascal@23863
|
133 ret
|
pascal@23863
|
134
|
pascal@23863
|
135 .org 0x01A0,0xFF
|
pascal@17496
|
136 readsectorX: // read isolinux boot sector
|
pascal@17496
|
137 movb $0xA5, %cl // patched by installer
|
pascal@13699
|
138 readsector1:
|
pascal@17496
|
139 andb $0x83, %dl // disk and floppy disk
|
pascal@13699
|
140 movw %cx, (%bx)
|
pascal@13699
|
141 incw %cx
|
pascal@13699
|
142 movw $0x201, %ax
|
pascal@13699
|
143 int $0x13
|
pascal@13691
|
144 setreg:
|
pascal@13699
|
145 movw %bx, %si
|
pascal@17810
|
146 movw $moved, %di
|
pascal@13691
|
147 movw $0x0100, %cx
|
pascal@17810
|
148 movb $nobsmsg, %al
|
pascal@13691
|
149 ret
|
pascal@23863
|
150 .org 0x01B8,0xEE // partition table
|
pascal@14267
|
151
|
pascal@23863
|
152 .org 0x0270,0xFF
|
pascal@19827
|
153
|
pascal@13691
|
154 ////////////////////////////// DOS EXE code ///////////////////////////////////
|
pascal@13691
|
155
|
pascal@23863
|
156 bootdir:
|
pascal@23863
|
157 .asciz "/boot"
|
pascal@23863
|
158 linld:
|
pascal@23863
|
159 .asciz "linld.com"
|
pascal@23863
|
160 cmdline:
|
pascal@23863
|
161 .ascii "-f "
|
pascal@23863
|
162 // .ascii "image=\boot\"
|
pascal@23863
|
163 // .ascii "bzImage "
|
pascal@23863
|
164 .ascii "initrd="
|
pascal@23863
|
165 rootfs:
|
pascal@23863
|
166 .ascii "rootfs"
|
pascal@23863
|
167 dotgz:
|
pascal@23863
|
168 .ascii ".gz,! "
|
pascal@23863
|
169 // .ascii ".gz,rootfs4.gz,! "
|
pascal@23863
|
170 args:
|
pascal@23863
|
171 // .ascii " rw "
|
pascal@23863
|
172 // .ascii " mode=menu"
|
pascal@23863
|
173 .ascii " autologin rdinit=/init.exe magic="
|
pascal@23863
|
174 magicstr:
|
pascal@23863
|
175 .ascii "0 bootfrom="
|
pascal@23863
|
176 // .ascii "65535 bootfrom="
|
pascal@23863
|
177 filename:
|
pascal@13729
|
178 exestart:
|
pascal@23863
|
179 movb $0x30,%ah // get DOS version
|
pascal@23863
|
180 int $0x21
|
pascal@23863
|
181 cmpb $3,%al
|
pascal@23863
|
182 jc goabort
|
pascal@13691
|
183
|
pascal@23863
|
184 cld
|
pascal@23863
|
185 movw EXEADRS(comstart),%si
|
pascal@23863
|
186 movw $0xF000,%di
|
pascal@23863
|
187 movb $4,%ch // 2k min
|
pascal@23863
|
188 rep
|
pascal@23863
|
189 movsw // helper
|
pascal@23863
|
190 movw $129,%si
|
pascal@23863
|
191 leaw args-cmdline(%si),%di
|
pascal@23863
|
192 movb -1(%si),%cl
|
pascal@23863
|
193 pushw %si
|
pascal@23863
|
194 rep
|
pascal@23863
|
195 movsb // user args
|
pascal@23863
|
196 xchgw %ax,%di
|
pascal@23863
|
197 popw %di
|
pascal@23863
|
198 movw $EXEADRS(cmdline),%si
|
pascal@23863
|
199 movb $args-cmdline,%cl
|
pascal@23863
|
200 rep
|
pascal@23863
|
201 movsb // files
|
pascal@23863
|
202 xchgw %ax,%di
|
pascal@23863
|
203 movb $filename-args,%cl
|
pascal@23863
|
204 rep
|
pascal@23863
|
205 movsb // end
|
pascal@23863
|
206 pushw %di // filename
|
pascal@23863
|
207
|
pascal@23863
|
208 #define ISOSTATE 0xF000
|
pascal@23863
|
209 #define ISO_OPEN iso_open
|
pascal@23863
|
210 #define ISO_READDIR *0xF004
|
pascal@23863
|
211 #define ISO_READMENU iso_readmenu
|
pascal@23863
|
212 #define RUN_LINLD run_linld
|
pascal@23863
|
213 movw ISOSTATE,%bp
|
pascal@23863
|
214 xorw %ax,%ax
|
pascal@23863
|
215 movw %bp,%di
|
pascal@23863
|
216 movb $64,%cl
|
pascal@23863
|
217 rep
|
pascal@23863
|
218 stosb // clear BSS
|
pascal@23863
|
219
|
pascal@21791
|
220 movw %ax,%di
|
pascal@21791
|
221 movw 0x2C(%di),%es
|
pascal@23863
|
222 decw %cx
|
pascal@21791
|
223 scalp:
|
pascal@21791
|
224 repne
|
pascal@21791
|
225 scasb
|
pascal@21791
|
226 scasb
|
pascal@21791
|
227 jne scalp
|
pascal@23863
|
228 scasw
|
pascal@23863
|
229 movw %di,%si // %es:%di = programme pathname
|
pascal@23863
|
230
|
pascal@23863
|
231 pushw %es
|
pascal@23863
|
232 pushw %ds
|
pascal@23863
|
233 popw %es
|
pascal@23863
|
234 popw %ds
|
pascal@23863
|
235 popw %di // filename
|
pascal@23863
|
236 pushw %di
|
pascal@23863
|
237 movb $0x60,%ah // canonicalize filename
|
pascal@23863
|
238 int $0x21
|
pascal@23863
|
239 pushw %es
|
pascal@23863
|
240 popw %ds
|
pascal@23863
|
241 #define LONG_FILENAME
|
pascal@23863
|
242 #ifdef LONG_FILENAME
|
pascal@23863
|
243 popw %si
|
pascal@23863
|
244 pushw %si
|
pascal@23863
|
245 movw $0x716C,%ax
|
pascal@23863
|
246 xorw %bx,%bx // R/O
|
pascal@23863
|
247 xorw %cx,%cx // attributes
|
pascal@23863
|
248 cwd // action = open
|
pascal@23863
|
249 stc
|
pascal@23863
|
250 int $0x21
|
pascal@23863
|
251 jnc opened
|
pascal@23863
|
252 #endif
|
pascal@23863
|
253 popw %dx
|
pascal@23863
|
254 pushw %dx
|
pascal@23863
|
255 movw $0x3D00,%ax
|
pascal@23863
|
256 // movb $0,%cl
|
pascal@23863
|
257 int $0x21
|
pascal@23863
|
258 goabort:
|
pascal@23863
|
259 jc abort
|
pascal@23863
|
260 opened:
|
pascal@23863
|
261 movw %ax,4(%bp) // fd
|
pascal@23863
|
262
|
pascal@23863
|
263 call ISO_READMENU
|
pascal@23863
|
264 movw 6(%bp),%ax // magic = filemod
|
pascal@23863
|
265 popw %bx
|
pascal@23863
|
266 leaw magicstr-filename(%bx),%di
|
pascal@23863
|
267 movb $10,%bl
|
pascal@23863
|
268 xorw %cx,%cx
|
pascal@23863
|
269 lp1:
|
pascal@23863
|
270 xorw %dx,%dx
|
pascal@23863
|
271 divw %bx
|
pascal@23863
|
272 pushw %dx
|
pascal@21791
|
273 incw %cx
|
pascal@23863
|
274 orw %ax,%ax
|
pascal@23863
|
275 jnz lp1
|
pascal@23863
|
276 lp2:
|
pascal@23863
|
277 popw %ax
|
pascal@23863
|
278 addb $'0',%al
|
pascal@23863
|
279 stosb // store magic
|
pascal@23863
|
280 loop lp2
|
pascal@23863
|
281
|
pascal@23863
|
282 movw $EXEADRS(bootdir),%ax
|
pascal@23863
|
283 call ISO_OPEN
|
pascal@23863
|
284 orw $-1,18(%bp) // curdirsize = -1
|
pascal@23863
|
285 xorw %ax,%ax
|
pascal@23863
|
286 found:
|
pascal@23863
|
287 incb %ah
|
pascal@23863
|
288 patchtest:
|
pascal@23863
|
289 pushw %ax
|
pascal@23863
|
290 call ISO_READDIR
|
pascal@23863
|
291 pushw %ds
|
pascal@23863
|
292 popw %es
|
pascal@23863
|
293 incw %ax
|
pascal@23863
|
294 popw %ax
|
pascal@23863
|
295 movw $EXEADRS(rootfs),%si
|
pascal@23863
|
296 je dopatch
|
pascal@23863
|
297 movw %si,%di
|
pascal@23863
|
298 movw 16(%bp),%si // filename
|
pascal@23863
|
299 movw $9,%cx
|
pascal@23863
|
300 rep
|
pascal@23863
|
301 cmpsb
|
pascal@23863
|
302 jcxz found
|
pascal@23863
|
303 cmpb $3,%cl
|
pascal@23863
|
304 ja patchtest
|
pascal@23863
|
305 decw %si
|
pascal@23863
|
306 cmpb (%si),%al
|
pascal@23863
|
307 ja patchtest
|
pascal@23863
|
308 lodsb
|
pascal@23863
|
309 jmp patchtest
|
pascal@23863
|
310 done:
|
pascal@23863
|
311 movw $128,%ax
|
pascal@23863
|
312 subw %ax,%si
|
pascal@23863
|
313 xchgw %ax,%si
|
pascal@23863
|
314 decw %ax
|
pascal@23863
|
315 movb %al,(%si) // cmdline length
|
pascal@23863
|
316
|
pascal@23863
|
317 movw $EXEADRS(linld),%ax
|
pascal@23863
|
318 call ISO_OPEN
|
pascal@23863
|
319 jc abort
|
pascal@23863
|
320 movw 12(%bp),%cx // filesize
|
pascal@23863
|
321 movw $0x100,%dx
|
pascal@23863
|
322 call RUN_LINLD
|
pascal@23863
|
323 abort:
|
pascal@23863
|
324 movw $EXEADRS(stopmsg),%dx
|
pascal@23863
|
325 movb $9,%ah
|
pascal@23863
|
326 int $0x21
|
pascal@23863
|
327 int $0x20
|
pascal@23863
|
328 dopatch:
|
pascal@21791
|
329 pushw %si
|
pascal@23863
|
330 cmpw $0x200,%ax
|
pascal@23863
|
331 je initrddone
|
pascal@23863
|
332 movw $EXEADRS(dotgz),%di
|
pascal@23863
|
333 decb %ah
|
pascal@23863
|
334 je modify
|
pascal@23863
|
335 scasw
|
pascal@23863
|
336 scasw // addw $4,%di
|
pascal@23863
|
337 movsw
|
pascal@23863
|
338 movsw
|
pascal@23863
|
339 movsw
|
pascal@23863
|
340 modify:
|
pascal@23863
|
341 stosb
|
pascal@23863
|
342 movw $129+dotgz-cmdline,%si
|
pascal@23863
|
343 movsb
|
pascal@23863
|
344 movsw
|
pascal@23863
|
345 movsw
|
pascal@23863
|
346 initrddone:
|
pascal@23863
|
347 movw $129+rootfs-cmdline,%di
|
pascal@23863
|
348 popw %si
|
pascal@23863
|
349 movw $args-rootfs,%cx
|
pascal@23863
|
350 rep
|
pascal@23863
|
351 movsb
|
pascal@23863
|
352
|
pascal@23863
|
353 shrink0:
|
pascal@23863
|
354 movw $129,%si
|
pascal@23863
|
355 shrink:
|
pascal@23863
|
356 movw %si,%di
|
pascal@21791
|
357 lodsb
|
pascal@23863
|
358 cmpb $0,%al
|
pascal@23863
|
359 je done
|
pascal@23863
|
360 cmpb $' ',%al
|
pascal@23863
|
361 jne shrink
|
pascal@23863
|
362 cmpb (%si),%al
|
pascal@23863
|
363 jne shrink
|
pascal@23863
|
364 pack:
|
pascal@23863
|
365 lodsb
|
pascal@23863
|
366 stosb
|
pascal@23863
|
367 cmpb $0,%al
|
pascal@23863
|
368 jne pack
|
pascal@23863
|
369 jmp shrink0
|
pascal@23863
|
370
|
pascal@23863
|
371 .org 0x0400,0xEE
|
pascal@23863
|
372 .org 0x0600,0xFF
|
pascal@23863
|
373 .org 0x0750,0xBB
|
pascal@23863
|
374 stopmsg:
|
pascal@23863
|
375 .ascii "This program cannot be run in DOS mode.$"
|
pascal@23863
|
376 .org 0x0778,0xEE
|
pascal@23863
|
377 .org 0xF002-0xC0
|
pascal@23863
|
378 iso_open:
|
pascal@23863
|
379 .word 0
|
pascal@23863
|
380 .word 0
|
pascal@23863
|
381 iso_readmenu:
|
pascal@23863
|
382 .word 0
|
pascal@23863
|
383 run_linld:
|
pascal@13713
|
384
|
pascal@23863
|
385 .end
|