rev |
line source |
pascal@23919
|
1 #define SYSTEM 0x10000
|
pascal@23919
|
2 #define SETUP 14
|
pascal@23919
|
3 #define SYSSIZE 0x1F4
|
pascal@23919
|
4 #define SETUPSIZE 0x1F1
|
pascal@23919
|
5
|
pascal@23919
|
6 #define KEEP_BOOTSECTOR 1
|
pascal@23919
|
7 #define LINUX_HEADER 0
|
pascal@23919
|
8 #define UPDATE_SYSSIZE 1
|
pascal@23919
|
9 #define HARDCODED_SYSSIZE 1
|
pascal@23919
|
10 #define HARDCODED_SETUPSIZE 1
|
pascal@23919
|
11 #define FLAT16 1
|
pascal@23919
|
12 #define FLAT16OUT 1
|
pascal@23919
|
13 #define SAVEREGS 0
|
pascal@23919
|
14 #define ELKS 0
|
pascal@23919
|
15
|
pascal@23919
|
16 .text
|
pascal@23919
|
17 .code16
|
pascal@23919
|
18 .org 0
|
pascal@23919
|
19
|
pascal@23919
|
20 #if KEEP_BOOTSECTOR
|
pascal@23919
|
21 #undef UPDATE_SYSSIZE
|
pascal@23919
|
22 #define UPDATE_SYSSIZE 0
|
pascal@23919
|
23 #endif
|
pascal@23919
|
24 #if defined(FLAT16OUT) && FLAT16OUT == 0
|
pascal@23919
|
25 #undef FLAT16OUT
|
pascal@23919
|
26 #endif
|
pascal@23919
|
27 #if ELKS
|
pascal@23919
|
28 .arch i8086
|
pascal@23919
|
29 #define FLAT16 1
|
pascal@23919
|
30 #define LINUX_HEADER 0
|
pascal@23919
|
31 #define SAVEREGS 0
|
pascal@23919
|
32 #define TOPSEG 0x2000
|
pascal@23919
|
33 #else
|
pascal@23919
|
34 #define TOPSEG 0x8000
|
pascal@23919
|
35 #endif
|
pascal@23919
|
36
|
pascal@23919
|
37 .globl _start
|
pascal@23919
|
38 _start:
|
pascal@23919
|
39 #if LINUX_HEADER
|
pascal@23919
|
40 jmp start2
|
pascal@23919
|
41 .ascii "HdrS" // 202 magic
|
pascal@23919
|
42 .word 0x200 // 206 version 2.00
|
pascal@23919
|
43 .long 0 // 208 realmode_swtch
|
pascal@23919
|
44 .word SYSTEM/16 // 20C start_sys_seg
|
pascal@23919
|
45 .word 0 // 20E kernel_version
|
pascal@23919
|
46 .byte 0 // 210 type_of_loader
|
pascal@23919
|
47 .byte 0 // 211 loadflags
|
pascal@23919
|
48 .word 0 // 212 setup_move_size
|
pascal@23919
|
49 .long SYSTEM // 214 code32_start
|
pascal@23919
|
50 .long 0 // 218 ramdisk_image
|
pascal@23919
|
51 .long 0 // 21C ramdisk_size
|
pascal@23919
|
52 .long 0 // 220 bootsect_kludge
|
pascal@23919
|
53 start2:
|
pascal@23919
|
54 #endif
|
pascal@23919
|
55 #if SAVEREGS
|
pascal@23919
|
56 pushfw
|
pascal@23919
|
57 pushw %cs
|
pascal@23919
|
58 pushw $0
|
pascal@23919
|
59 pushal
|
pascal@23919
|
60 pushw %ds
|
pascal@23919
|
61 cld
|
pascal@23919
|
62 #else
|
pascal@23919
|
63 pushw %cs
|
pascal@23919
|
64 # if FLAT16
|
pascal@23919
|
65 xorw %di, %di
|
pascal@23919
|
66 pushw %di
|
pascal@23919
|
67 # else
|
pascal@23919
|
68 pushw $0
|
pascal@23919
|
69 # endif
|
pascal@23919
|
70 #endif
|
pascal@23919
|
71 #if ELKS
|
pascal@23919
|
72 movw $0x100, %ax
|
pascal@23919
|
73 pushw %ax
|
pascal@23919
|
74 #else
|
pascal@23919
|
75 # if UPDATE_SYSSIZE || KEEP_BOOTSECTOR
|
pascal@23919
|
76 pushw %ds // <A>
|
pascal@23919
|
77 # else
|
pascal@23919
|
78 pushw %cs // <A>
|
pascal@23919
|
79 # endif
|
pascal@23919
|
80 #endif
|
pascal@23919
|
81 #if FLAT16
|
pascal@23919
|
82 # 1- move 9000/9020..9020+stp -> TOPSEG
|
pascal@23919
|
83 #if ELKS
|
pascal@23919
|
84 movb $TOPSEG/256, %ah
|
pascal@23919
|
85 movw %ax, %es
|
pascal@23919
|
86 #else
|
pascal@23919
|
87 pushw $TOPSEG
|
pascal@23919
|
88 popw %es
|
pascal@23919
|
89 #endif
|
pascal@23919
|
90 #if KEEP_BOOTSECTOR
|
pascal@23919
|
91 xorw %si, %si
|
pascal@23919
|
92 #else
|
pascal@23919
|
93 movw $0x200, %si
|
pascal@23919
|
94 #endif
|
pascal@23919
|
95 #if SAVEREGS == 0
|
pascal@23919
|
96 pushw %es
|
pascal@23919
|
97 #if ELKS
|
pascal@23919
|
98 # if KEEP_BOOTSECTOR
|
pascal@23919
|
99 movw $cont+0x200, %ax
|
pascal@23919
|
100 # else
|
pascal@23919
|
101 movw $cont, %ax
|
pascal@23919
|
102 # endif
|
pascal@23919
|
103 pushw %ax
|
pascal@23919
|
104 #else
|
pascal@23919
|
105 # if KEEP_BOOTSECTOR
|
pascal@23919
|
106 pushw $cont+0x200
|
pascal@23919
|
107 # else
|
pascal@23919
|
108 // pushw $cont
|
pascal@23919
|
109 .byte 0x6A, cont
|
pascal@23919
|
110 # endif
|
pascal@23919
|
111 #endif
|
pascal@23919
|
112 jmp jumpinto
|
pascal@23919
|
113 #else
|
pascal@23919
|
114 # if HARDCODED_SETUPSIZE
|
pascal@23919
|
115 setup_word:
|
pascal@23919
|
116 # if KEEP_BOOTSECTOR
|
pascal@23919
|
117 # else
|
pascal@23919
|
118 movw $SETUP*256, %cx
|
pascal@23919
|
119 # endif
|
pascal@23919
|
120 # else
|
pascal@23919
|
121 # if KEEP_BOOTSECTOR
|
pascal@23919
|
122 movw $0x100, %cx
|
pascal@23919
|
123 addb SETUPSIZE, %ch
|
pascal@23919
|
124 # else
|
pascal@23919
|
125 xorw %cx, %cx
|
pascal@23919
|
126 movb SETUPSIZE, %ch
|
pascal@23919
|
127 # endif
|
pascal@23919
|
128 movw %cx, %dx
|
pascal@23919
|
129 # endif
|
pascal@23919
|
130 pushw %cx // <B>
|
pascal@23919
|
131 pushw %es
|
pascal@23919
|
132 pushw %di
|
pascal@23919
|
133 rep
|
pascal@23919
|
134 movsw
|
pascal@23919
|
135 lret
|
pascal@23919
|
136 #endif
|
pascal@23919
|
137 cont:
|
pascal@23919
|
138 # 2- move 1000..1000+sys -> TOPSEG+stp
|
pascal@23919
|
139 #if ELKS
|
pascal@23919
|
140 movw $0x1000, %ax
|
pascal@23919
|
141 movw %ax, %ds
|
pascal@23919
|
142 #else
|
pascal@23919
|
143 pushw $0x1000
|
pascal@23919
|
144 popw %ds
|
pascal@23919
|
145 #endif
|
pascal@23919
|
146 xorw %si, %si
|
pascal@23919
|
147 subw %di, %cx
|
pascal@23919
|
148 rep
|
pascal@23919
|
149 movsb
|
pascal@23919
|
150 # 3- unlz(TOPSEG+stp:end, 1000-stp:0)
|
pascal@23919
|
151 pushw %es // <C>
|
pascal@23919
|
152 # if HARDCODED_SETUPSIZE
|
pascal@23919
|
153 setup_seg:
|
pascal@23919
|
154 #if ELKS
|
pascal@23919
|
155 # if KEEP_BOOTSECTOR
|
pascal@23919
|
156 # if UPDATE_SYSSIZE
|
pascal@23919
|
157 movw $0x1000-(SETUP*32)-32-32, %ax
|
pascal@23919
|
158 # else
|
pascal@23919
|
159 movw $0x1000-(SETUP*32)-32, %ax
|
pascal@23919
|
160 # endif
|
pascal@23919
|
161 # else
|
pascal@23919
|
162 # if UPDATE_SYSSIZE
|
pascal@23919
|
163 movw $0x1000-(SETUP*32)-32, %ax
|
pascal@23919
|
164 # else
|
pascal@23919
|
165 movw $0x1000-(SETUP*32), %ax
|
pascal@23919
|
166 # endif
|
pascal@23919
|
167 # endif
|
pascal@23919
|
168 movw %ax, %es
|
pascal@23919
|
169 #else
|
pascal@23919
|
170 # if KEEP_BOOTSECTOR
|
pascal@23919
|
171 # if UPDATE_SYSSIZE
|
pascal@23919
|
172 pushw $0x1000-(SETUP*32)-32-32
|
pascal@23919
|
173 # else
|
pascal@23919
|
174 pushw $0x1000-(SETUP*32)-32
|
pascal@23919
|
175 # endif
|
pascal@23919
|
176 # else
|
pascal@23919
|
177 # if UPDATE_SYSSIZE
|
pascal@23919
|
178 pushw $0x1000-(SETUP*32)-32
|
pascal@23919
|
179 # else
|
pascal@23919
|
180 pushw $0x1000-(SETUP*32)
|
pascal@23919
|
181 # endif
|
pascal@23919
|
182 # endif
|
pascal@23919
|
183 popw %es
|
pascal@23919
|
184 #endif
|
pascal@23919
|
185 # else
|
pascal@23919
|
186 # if UPDATE_SYSSIZE
|
pascal@23919
|
187 incb %dh
|
pascal@23919
|
188 # endif
|
pascal@23919
|
189 #if ELKS
|
pascal@23919
|
190 shrw $1, %dx
|
pascal@23919
|
191 shrw $1, %dx
|
pascal@23919
|
192 shrw $1, %dx
|
pascal@23919
|
193 #else
|
pascal@23919
|
194 shrw $3, %dx
|
pascal@23919
|
195 #endif
|
pascal@23919
|
196 movw %ds, %ax
|
pascal@23919
|
197 subw %dx, %ax
|
pascal@23919
|
198 movw %ax, %es
|
pascal@23919
|
199 # endif
|
pascal@23919
|
200 #else // FLAT16
|
pascal@23919
|
201 # 1- move 1000..1000+sys -> 9000-sys
|
pascal@23919
|
202 # if HARDCODED_SYSSIZE
|
pascal@23919
|
203 packed_syssize:
|
pascal@23919
|
204 movw $0x1000+0, %ax
|
pascal@23919
|
205 # else
|
pascal@23919
|
206 movw SYSSIZE, %ax
|
pascal@23919
|
207 addw $0x1000, %ax
|
pascal@23919
|
208 # endif
|
pascal@23919
|
209 movw %ds, %dx
|
pascal@23919
|
210 mvsys:
|
pascal@23919
|
211 decw %ax
|
pascal@23919
|
212 decw %dx
|
pascal@23919
|
213 movw %ax, %ds
|
pascal@23919
|
214 movw %dx, %es
|
pascal@23919
|
215 xorw %si, %si
|
pascal@23919
|
216 xorw %di, %di
|
pascal@23919
|
217 movw $8, %cx
|
pascal@23919
|
218 rep
|
pascal@23919
|
219 movsw
|
pascal@23919
|
220 cmpw $0x1000, %ax
|
pascal@23919
|
221 jne mvsys
|
pascal@23919
|
222 # 2- move 9000/9020..9020+stp -> 9000-sys-stp
|
pascal@23919
|
223
|
pascal@23919
|
224 # if HARDCODED_SETUPSIZE
|
pascal@23919
|
225 # if KEEP_BOOTSECTOR
|
pascal@23919
|
226 setup_byte:
|
pascal@23919
|
227 movb $SETUP+1, %ch
|
pascal@23919
|
228 setup_para:
|
pascal@23919
|
229 subw $SETUP*32+32, %dx
|
pascal@23919
|
230 # else
|
pascal@23919
|
231 setup_byte:
|
pascal@23919
|
232 movb $SETUP, %ch
|
pascal@23919
|
233 setup_para:
|
pascal@23919
|
234 subw $SETUP*32, %dx
|
pascal@23919
|
235 # endif
|
pascal@23919
|
236 # else
|
pascal@23919
|
237 movb %ss:SETUPSIZE, %ch
|
pascal@23919
|
238 # if KEEP_BOOTSECTOR
|
pascal@23919
|
239 incb $ch
|
pascal@23919
|
240 # endif
|
pascal@23919
|
241 movw %cx, %ax
|
pascal@23919
|
242 #if ELKS
|
pascal@23919
|
243 shrw $1, %ax
|
pascal@23919
|
244 shrw $1, %ax
|
pascal@23919
|
245 shrw $1, %ax
|
pascal@23919
|
246 #else
|
pascal@23919
|
247 shrw $3, %ax
|
pascal@23919
|
248 #endif
|
pascal@23919
|
249 subw %ax, %dx
|
pascal@23919
|
250 # endif
|
pascal@23919
|
251 pushw %cx // <B>
|
pascal@23919
|
252 movw %dx, %es
|
pascal@23919
|
253 xorw %si, %si
|
pascal@23919
|
254 xorw %di, %di
|
pascal@23919
|
255 rep
|
pascal@23919
|
256 movsw %cs:(%si),%es:(%di)
|
pascal@23919
|
257 pushw %es
|
pascal@23919
|
258 # 3- reloc itself in 0x7C00
|
pascal@23919
|
259 pushw $0x07C0
|
pascal@23919
|
260 popw %es
|
pascal@23919
|
261 movw $cont, %si
|
pascal@23919
|
262 movw %si, %di
|
pascal@23919
|
263 movw $end-_start, %cx
|
pascal@23919
|
264 pushw %es
|
pascal@23919
|
265 pushw %di
|
pascal@23919
|
266 rep
|
pascal@23919
|
267 movsb %cs:(%si),%es:(%di)
|
pascal@23919
|
268 lret
|
pascal@23919
|
269 cont:
|
pascal@23919
|
270 # 4- unlz(9000-sys-stp:end, 1000-stp:0)
|
pascal@23919
|
271 # if HARDCODED_SETUPSIZE
|
pascal@23919
|
272 setup_seg:
|
pascal@23919
|
273 # if KEEP_BOOTSECTOR
|
pascal@23919
|
274 # if UPDATE_SYSSIZE
|
pascal@23919
|
275 pushw $0x1000-(SETUP*32)-32-32
|
pascal@23919
|
276 # else
|
pascal@23919
|
277 pushw $0x1000-(SETUP*32)-32
|
pascal@23919
|
278 # endif
|
pascal@23919
|
279 # else
|
pascal@23919
|
280 # if UPDATE_SYSSIZE
|
pascal@23919
|
281 pushw $0x1000-(SETUP*32)-32
|
pascal@23919
|
282 # else
|
pascal@23919
|
283 pushw $0x1000-(SETUP*32)
|
pascal@23919
|
284 # endif
|
pascal@23919
|
285 # endif
|
pascal@23919
|
286 popw %es
|
pascal@23919
|
287 # else
|
pascal@23919
|
288 negw %ax
|
pascal@23919
|
289 # if UPDATE_SYSSIZE
|
pascal@23919
|
290 addw $0x1000-32, %ax
|
pascal@23919
|
291 # else
|
pascal@23919
|
292 addw $0x1000, %ax
|
pascal@23919
|
293 # endif
|
pascal@23919
|
294 movw %ax, %es
|
pascal@23919
|
295 # endif
|
pascal@23919
|
296 #endif // FLAT16
|
pascal@23919
|
297 popw %ds // <C>
|
pascal@23919
|
298 #if KEEP_BOOTSECTOR
|
pascal@23919
|
299 movw $0x200+end-_start, %si
|
pascal@23919
|
300 #else
|
pascal@23919
|
301 movw $end-_start, %si
|
pascal@23919
|
302 #endif
|
pascal@23919
|
303 #if UPDATE_SYSSIZE
|
pascal@23919
|
304 movw $SYSSIZE, %di
|
pascal@23919
|
305 #else
|
pascal@23919
|
306 xorw %di, %di
|
pascal@23919
|
307 #endif
|
pascal@23919
|
308 pushw %di
|
pascal@23919
|
309 pushw %es
|
pascal@23919
|
310 call unpack
|
pascal@23919
|
311 popw %ds
|
pascal@23919
|
312 popw %si
|
pascal@23919
|
313 # if KEEP_BOOTSECTOR
|
pascal@23919
|
314 setup_keep:
|
pascal@23919
|
315 xorw %di, %di
|
pascal@23919
|
316 # else
|
pascal@23919
|
317 movw %si, %di
|
pascal@23919
|
318 # endif
|
pascal@23919
|
319 # if SAVEREGS != 0
|
pascal@23919
|
320 popw %cx // <B>
|
pascal@23919
|
321 #if UPDATE_SYSSIZE
|
pascal@23919
|
322 // not need with memtest movb $(512-SYSSIZE)/2, %cl
|
pascal@23919
|
323 #endif
|
pascal@23919
|
324 popw %es // <A>
|
pascal@23919
|
325 # 5- move 1000-stp..1000 -> 9020
|
pascal@23919
|
326 # else
|
pascal@23919
|
327 popw %es // <A>
|
pascal@23919
|
328 jumpinto:
|
pascal@23919
|
329 # if HARDCODED_SETUPSIZE
|
pascal@23919
|
330 setup_word:
|
pascal@23919
|
331 # if KEEP_BOOTSECTOR
|
pascal@23919
|
332 movw $SETUP*256+256, %cx
|
pascal@23919
|
333 # else
|
pascal@23919
|
334 movw $SETUP*256, %cx
|
pascal@23919
|
335 # endif
|
pascal@23919
|
336 # else
|
pascal@23919
|
337 # if KEEP_BOOTSECTOR
|
pascal@23919
|
338 movw $0x100, %cx
|
pascal@23919
|
339 addb %ss:SETUPSIZE, %ch
|
pascal@23919
|
340 # else
|
pascal@23919
|
341 xorw %cx, %cx
|
pascal@23919
|
342 movb %ss:SETUPSIZE, %ch
|
pascal@23919
|
343 # endif
|
pascal@23919
|
344 movw %cx, %dx
|
pascal@23919
|
345 # endif
|
pascal@23919
|
346 # endif
|
pascal@23919
|
347 rep
|
pascal@23919
|
348 movsw
|
pascal@23919
|
349 #if SAVEREGS
|
pascal@23919
|
350 popw %ds
|
pascal@23919
|
351 popal
|
pascal@23919
|
352 iret
|
pascal@23919
|
353 #else
|
pascal@23919
|
354 lret
|
pascal@23919
|
355 #endif
|
pascal@23919
|
356
|
pascal@23919
|
357 unpack:
|
pascal@23919
|
358 #define NO_LZMA_HEADER
|
pascal@23919
|
359 #if ELKS
|
pascal@23919
|
360 #define ONLY8086 1
|
pascal@23919
|
361 #endif
|
pascal@23919
|
362 #include "unlzma.S"
|
pascal@23919
|
363
|
pascal@23919
|
364 end:
|