rev |
line source |
pascal@13288
|
1 #define SYSTEM 0x10000
|
pascal@19404
|
2 #define SETUP 14
|
pascal@15188
|
3 #define SYSSIZE 0x1F4
|
pascal@15188
|
4 #define SETUPSIZE 0x1F1
|
pascal@13288
|
5
|
pascal@25504
|
6 #define KEEP_BOOTSECTOR 0
|
pascal@15188
|
7 #define LINUX_HEADER 0
|
pascal@25508
|
8 #define UPDATE_SYSSIZE 0
|
pascal@25488
|
9 #define FLAT16 1 // lzma case
|
pascal@25504
|
10 #define FLAT16OUT 0
|
pascal@25504
|
11 #define COPYTOHIGHMEM 0
|
pascal@25508
|
12 #define UPDATE_CODE32_START 1
|
pascal@25504
|
13 #define DOUBLE_PACKED 0
|
pascal@19404
|
14 #define SAVEREGS 0
|
pascal@20187
|
15 #define ELKS 0
|
pascal@13269
|
16
|
pascal@13269
|
17 .text
|
pascal@13269
|
18 .code16
|
pascal@13269
|
19 .org 0
|
pascal@13269
|
20
|
pascal@25504
|
21 #if KEEP_BOOTSECTOR
|
pascal@25504
|
22 #undef UPDATE_SYSSIZE
|
pascal@25504
|
23 #define UPDATE_SYSSIZE 0
|
pascal@25504
|
24 #endif
|
pascal@20184
|
25 #if ELKS
|
pascal@20184
|
26 .arch i8086
|
pascal@20184
|
27 #define FLAT16 1
|
pascal@25504
|
28 #define KEEP_BOOTSECTOR 1
|
pascal@20184
|
29 #define LINUX_HEADER 0
|
pascal@20184
|
30 #define SAVEREGS 0
|
pascal@20184
|
31 #define TOPSEG 0x2000
|
pascal@20184
|
32 #else
|
pascal@20184
|
33 #define TOPSEG 0x8000
|
pascal@20184
|
34 #endif
|
pascal@20184
|
35
|
pascal@25504
|
36 .macro pusham
|
pascal@25504
|
37 #if ELKS
|
pascal@25504
|
38 pushw %ax
|
pascal@25504
|
39 // movw %sp, %ax
|
pascal@25504
|
40 // incw %ax // emulate popa behaviour
|
pascal@25504
|
41 // incw %ax
|
pascal@25504
|
42 pushw %cx
|
pascal@25504
|
43 pushw %dx
|
pascal@25504
|
44 pushw %bx
|
pascal@25504
|
45 // pushw %ax // %sp
|
pascal@25504
|
46 pushw %bp
|
pascal@25504
|
47 pushw %si
|
pascal@25504
|
48 pushw %di
|
pascal@25504
|
49 #else
|
pascal@25504
|
50 pushaw
|
pascal@25504
|
51 #endif
|
pascal@25504
|
52 .endm
|
pascal@25504
|
53
|
pascal@25504
|
54 .macro popam
|
pascal@25504
|
55 #if ELKS
|
pascal@25504
|
56 popw %di
|
pascal@25504
|
57 popw %si
|
pascal@25504
|
58 popw %bp
|
pascal@25504
|
59 // popw %ax
|
pascal@25504
|
60 popw %bx
|
pascal@25504
|
61 popw %dx
|
pascal@25504
|
62 popw %cx
|
pascal@25504
|
63 popw %ax
|
pascal@25504
|
64 #else
|
pascal@25504
|
65 popaw
|
pascal@25504
|
66 #endif
|
pascal@25504
|
67 .endm
|
pascal@25504
|
68
|
pascal@25504
|
69 .macro pushm val
|
pascal@25504
|
70 #if ELKS
|
pascal@25504
|
71 movw \val, %ax
|
pascal@25504
|
72 pushw %ax
|
pascal@25504
|
73 #else
|
pascal@25504
|
74 pushw \val
|
pascal@25504
|
75 #endif
|
pascal@25504
|
76 .endm
|
pascal@25504
|
77
|
pascal@25504
|
78 .macro shrwm cnt, reg
|
pascal@25504
|
79 #if ELKS
|
pascal@25504
|
80 .rept \cnt
|
pascal@25504
|
81 shrw $1, \reg
|
pascal@25504
|
82 .endr
|
pascal@25504
|
83 #else
|
pascal@25504
|
84 shrw $\cnt, \reg
|
pascal@25504
|
85 #endif
|
pascal@25504
|
86 .endm
|
pascal@25504
|
87
|
pascal@13269
|
88 .globl _start
|
pascal@13269
|
89 _start:
|
pascal@13289
|
90 #if LINUX_HEADER
|
pascal@13289
|
91 jmp start2
|
pascal@13289
|
92 .ascii "HdrS" // 202 magic
|
pascal@13289
|
93 .word 0x200 // 206 version 2.00
|
pascal@13289
|
94 .long 0 // 208 realmode_swtch
|
pascal@13289
|
95 .word SYSTEM/16 // 20C start_sys_seg
|
pascal@13289
|
96 .word 0 // 20E kernel_version
|
pascal@13289
|
97 .byte 0 // 210 type_of_loader
|
pascal@13289
|
98 .byte 0 // 211 loadflags
|
pascal@13289
|
99 .word 0 // 212 setup_move_size
|
pascal@13289
|
100 .long SYSTEM // 214 code32_start
|
pascal@13289
|
101 .long 0 // 218 ramdisk_image
|
pascal@13289
|
102 .long 0 // 21C ramdisk_size
|
pascal@13289
|
103 .long 0 // 220 bootsect_kludge
|
pascal@13289
|
104 start2:
|
pascal@13289
|
105 #endif
|
pascal@19404
|
106 #if SAVEREGS
|
pascal@19404
|
107 pushfw
|
pascal@13269
|
108 pushw %cs
|
pascal@15188
|
109 pushw $0
|
pascal@25504
|
110 pusham
|
pascal@25504
|
111 xorw %si, %si
|
pascal@19404
|
112 pushw %ds
|
pascal@25504
|
113 pushw %es
|
pascal@19942
|
114 cld
|
pascal@15188
|
115 #else
|
pascal@25504
|
116 pushw %cs // return adress is %cs:0
|
pascal@25504
|
117 xorw %si, %si
|
pascal@25504
|
118 pushw %si
|
pascal@25504
|
119 #endif // SAVEREGS
|
pascal@25504
|
120 pushw %ds // <A> bootsector+setup segment
|
pascal@25504
|
121 #if FLAT16
|
pascal@25504
|
122 # 1- move 9000..9020+stp -> TOPSEG
|
pascal@25504
|
123 pushm $TOPSEG
|
pascal@25504
|
124 popw %es
|
pascal@25504
|
125 # if SAVEREGS
|
pascal@25504
|
126 setup_word:
|
pascal@25504
|
127 movw $SETUP*256+256, %cx
|
pascal@25504
|
128 pushw %cx // <B> bootsector+setup words
|
pascal@19942
|
129 # endif
|
pascal@25504
|
130 pushw %es // <C> TOPSEG
|
pascal@19942
|
131 pushw %es
|
pascal@25504
|
132 # if SAVEREGS
|
pascal@25504
|
133 xorw %di, %di // %ds:%si = 9000:0000 %es:%di = TOPSEG:0
|
pascal@25504
|
134 pushm $0x200+cont
|
pascal@19404
|
135 rep
|
pascal@19942
|
136 movsw
|
pascal@19404
|
137 lret
|
pascal@25504
|
138 cont:
|
pascal@25504
|
139 # else
|
pascal@25504
|
140 movw $-0x200, %di
|
pascal@25504
|
141 call jumpinto
|
pascal@25488
|
142 # endif
|
pascal@20184
|
143 # 2- move 1000..1000+sys -> TOPSEG+stp
|
pascal@25504
|
144 pushm $0x1000
|
pascal@19404
|
145 popw %ds
|
pascal@25488
|
146 xorw %si, %si // %ds:%si = 1000:0
|
pascal@25488
|
147 subw %di, %cx // %cx = 64K - setupsz
|
pascal@19391
|
148 rep
|
pascal@19404
|
149 movsb
|
pascal@20184
|
150 # 3- unlz(TOPSEG+stp:end, 1000-stp:0)
|
pascal@19404
|
151 setup_seg:
|
pascal@25504
|
152 pushm $0x1000-(SETUP*32)-32
|
pascal@25488
|
153 popw %es
|
pascal@25504
|
154 #else // FLAT16
|
pascal@25504
|
155 # 1- move 9020..9020+unpack -> 0700 and jump into
|
pascal@25504
|
156 movw $0x700, %cx // Up to 3.5KB for unpacker (unlzma is << 1KB)
|
pascal@25504
|
157 movw %cx, %es // Use 7000 .. 7E00, keep up to 23 elks setup sectors
|
pascal@25504
|
158 pushw %es
|
pascal@25504
|
159 xorw %di, %di // %ds:%si = 9000:0000 %es:%di = 0700:0000
|
pascal@25504
|
160 pushm $0x200+cont
|
pascal@25504
|
161 # if SAVEREGS
|
pascal@25504
|
162 rep
|
pascal@25504
|
163 movsw
|
pascal@25504
|
164 lret
|
pascal@19404
|
165 # else
|
pascal@25504
|
166 jmp jumpinto
|
pascal@25504
|
167 # endif
|
pascal@25504
|
168 cont:
|
pascal@25504
|
169 # 2- move 9020..9020+stp -> 9000-sys-stp
|
pascal@25504
|
170 movw %ds, %dx
|
pascal@25504
|
171 setup_byte:
|
pascal@25504
|
172 movb $SETUP+1, %ch
|
pascal@25504
|
173 setup_para:
|
pascal@25504
|
174 subw $SETUP*32+32+0xF000, %dx
|
pascal@19404
|
175 packed_syssize:
|
pascal@25504
|
176 movw $0+0x1000, %ax
|
pascal@25504
|
177 pushw %cx // <B> bootsector+setup words
|
pascal@25504
|
178 subw %ax, %dx
|
pascal@25504
|
179 movw %dx, %es
|
pascal@25504
|
180 pushw %es // <C> 9000-sys-stp
|
pascal@25504
|
181 xorw %si, %si
|
pascal@25504
|
182 xorw %di, %di // %ds:%si = 9000:0 %es:%di = 9000-sys-stp:0
|
pascal@25504
|
183 rep
|
pascal@25504
|
184 movsw
|
pascal@25504
|
185 # 3- move 1000..1000+sys -> 9000-sys
|
pascal@19404
|
186 movw %ds, %dx
|
pascal@19404
|
187 mvsys:
|
pascal@19404
|
188 decw %ax
|
pascal@19404
|
189 decw %dx
|
pascal@19404
|
190 movw %ax, %ds
|
pascal@19404
|
191 movw %dx, %es
|
pascal@19404
|
192 xorw %si, %si
|
pascal@19404
|
193 xorw %di, %di
|
pascal@19404
|
194 movw $8, %cx
|
pascal@19404
|
195 rep
|
pascal@19404
|
196 movsw
|
pascal@19404
|
197 cmpw $0x1000, %ax
|
pascal@19404
|
198 jne mvsys
|
pascal@25504
|
199 # 4- unlz(9000-sys-stp:end, 1000-stp:0)
|
pascal@25504
|
200 setup_seg:
|
pascal@25504
|
201 pushm $0x1000-(SETUP*32)-32
|
pascal@19404
|
202 popw %es
|
pascal@19942
|
203 #endif // FLAT16
|
pascal@19942
|
204 popw %ds // <C>
|
pascal@25504
|
205 #if FLAT16 && SAVEREGS == 0
|
pascal@25504
|
206 movw $end-_start, %si // %ds:%si = TOPSSEG:compressed
|
pascal@19404
|
207 #else
|
pascal@25504
|
208 movw $0x200+end-_start, %si // %ds:%si = 9000-sys-stp:compressed
|
pascal@25504
|
209 #endif
|
pascal@25504
|
210 #if KEEP_BOOTSECTOR
|
pascal@25504
|
211 setup_keep:
|
pascal@13269
|
212 xorw %di, %di
|
pascal@25504
|
213 #else
|
pascal@25504
|
214 # if UPDATE_SYSSIZE
|
pascal@25504
|
215 setup_syssize:
|
pascal@25504
|
216 movw $0x1F4, %di // %es:%di = 1000-setup-bootsector:SYSSIZE
|
pascal@25504
|
217 # else
|
pascal@25504
|
218 movw $0x200, %di
|
pascal@25504
|
219 # endif
|
pascal@19404
|
220 #endif
|
pascal@19404
|
221 pushw %di
|
pascal@19404
|
222 pushw %es
|
pascal@25504
|
223 #if DOUBLE_PACKED
|
pascal@25504
|
224 double_packed:
|
pascal@25504
|
225 pushm $0x4000
|
pascal@25504
|
226 popw %es
|
pascal@25504
|
227 pushw %di
|
pascal@25504
|
228 pushw %es
|
pascal@19404
|
229 call unpack
|
pascal@15188
|
230 popw %ds
|
pascal@25504
|
231 popw %si
|
pascal@25504
|
232 popw %es
|
pascal@25504
|
233 popw %di
|
pascal@25504
|
234 pushw %di
|
pascal@25504
|
235 pushw %es
|
pascal@25504
|
236 #endif
|
pascal@25504
|
237 call unpack
|
pascal@25504
|
238 #if COPYTOHIGHMEM
|
pascal@25504
|
239 # if FLAT16OUT
|
pascal@25504
|
240 movw $0x9310+1, %ax // from 1000:FFFF
|
pascal@25504
|
241 # else
|
pascal@25504
|
242 # if 0
|
pascal@25504
|
243 movw %es, %ax
|
pascal@25504
|
244 shrw $12, %ax
|
pascal@25504
|
245 orw $0x9310, %ax
|
pascal@25504
|
246 # else
|
pascal@25504
|
247 movw $0x9310+7, %ax // from 7000:FFFF
|
pascal@25504
|
248 # endif
|
pascal@25504
|
249 # endif
|
pascal@25504
|
250 pushw %ss
|
pascal@25504
|
251 popw %es
|
pascal@25504
|
252 movw $8, %cx
|
pascal@25504
|
253 zero1:
|
pascal@25504
|
254 pushw $0 // 2E..20
|
pascal@25504
|
255 loop zero1
|
pascal@25504
|
256 src:
|
pascal@25504
|
257 pushw %cx // 1E, 16
|
pascal@25504
|
258 pushw %ax // 1A: dst %ax:%cx, 12: src %ax:%cx
|
pascal@25504
|
259 pushw %cx
|
pascal@25504
|
260 pushw $-1 // 18, 10: full 64K segment
|
pascal@25504
|
261 subb $0x10, %al
|
pascal@25504
|
262 jnc src
|
pascal@25504
|
263 movb $8, %cl
|
pascal@25504
|
264 zero2:
|
pascal@25504
|
265 pushw $0 // 0E..00
|
pascal@25504
|
266 loop zero2
|
pascal@25504
|
267 movw %sp, %si
|
pascal@25504
|
268 syslp:
|
pascal@25504
|
269 movb $0x80, %ch
|
pascal@25504
|
270 movb $0x87, %ah
|
pascal@25504
|
271 int $0x15
|
pascal@25504
|
272 # if FLAT16OUT == 0
|
pascal@25504
|
273 decb %es:0x1C(%si)
|
pascal@25504
|
274 decb %es:0x14(%si)
|
pascal@25504
|
275 jne syslp // down to 1000:0000
|
pascal@25504
|
276 # endif
|
pascal@25504
|
277 addw $0x30, %sp
|
pascal@25504
|
278 #endif // COPYTOHIGHMEM
|
pascal@25504
|
279 popw %ds
|
pascal@25504
|
280 popw %si // %ds:%si = 1000-setup-bootsector:SYSSIZE / 0
|
pascal@25504
|
281 #if UPDATE_CODE32_START
|
pascal@25504
|
282 update_code32_start:
|
pascal@25504
|
283 // movb $1, 0x216
|
pascal@25504
|
284 #endif
|
pascal@25504
|
285 #if FLAT16 == 0 || SAVEREGS
|
pascal@25504
|
286 popw %cx // <B> bootsector+setup words
|
pascal@25504
|
287 #endif
|
pascal@25504
|
288 popw %es // <A> bootsector+setup segment
|
pascal@19404
|
289 movw %si, %di
|
pascal@25504
|
290 jumpinto:
|
pascal@25504
|
291 #if FLAT16 && SAVEREGS == 0
|
pascal@25504
|
292 setup_word:
|
pascal@25504
|
293 movw $SETUP*256+256, %cx
|
pascal@15188
|
294 #endif
|
pascal@25504
|
295 # 5- move 1000-stp..1000 -> 9000
|
pascal@19404
|
296 rep
|
pascal@19404
|
297 movsw
|
pascal@19404
|
298 #if SAVEREGS
|
pascal@25504
|
299 popw %es
|
pascal@13269
|
300 popw %ds
|
pascal@25504
|
301 popam
|
pascal@13269
|
302 iret
|
pascal@19404
|
303 #else
|
pascal@19404
|
304 lret
|
pascal@19404
|
305 #endif
|
pascal@13269
|
306
|
pascal@13269
|
307 unpack:
|
pascal@19403
|
308 #define NO_LZMA_HEADER
|
pascal@25492
|
309 #define NO_LZSA2_HEADER
|
pascal@25492
|
310 #define NO_LZSA1_HEADER
|
pascal@25492
|
311 #define NO_LZ4_HEADER
|
pascal@20184
|
312 #if ELKS
|
pascal@20184
|
313 #define ONLY8086 1
|
pascal@20184
|
314 #endif
|
pascal@25504
|
315 #if defined(FLAT16OUT) && FLAT16OUT == 0
|
pascal@25504
|
316 #undef FLAT16OUT
|
pascal@25504
|
317 #endif
|
pascal@25504
|
318 #if defined(FLAT16) && FLAT16 == 0
|
pascal@25504
|
319 #undef FLAT16
|
pascal@25504
|
320 #endif
|
pascal@25488
|
321 #include "uncompress.S"
|
pascal@13269
|
322
|
pascal@13269
|
323 end:
|