rev |
line source |
pascal@15188
|
1 #define TOP (0x90000+_start-end)
|
pascal@13288
|
2 #define SYSTEM 0x10000
|
pascal@13288
|
3 #define SETUP 4
|
pascal@15188
|
4 #define SYSSIZE 0x1F4
|
pascal@15188
|
5 #define SETUPSIZE 0x1F1
|
pascal@13288
|
6
|
pascal@15188
|
7 #define CHANGE_STACK 0
|
pascal@15188
|
8 #define LINUX_HEADER 0
|
pascal@15188
|
9 #define UPDATE_SYSSIZE 1
|
pascal@15188
|
10 #define HARDCODED_SYSSIZE 1
|
pascal@15188
|
11 #define HARDCODED_SETUPSIZE 1
|
pascal@15188
|
12 #define HARDCODED_IP 1
|
pascal@19391
|
13 #define SHUTDOWNDOS 0
|
pascal@19391
|
14 #define FLAT16 1
|
pascal@19391
|
15 //#define FLAT16OUT 0
|
pascal@13269
|
16
|
pascal@13269
|
17 .text
|
pascal@13269
|
18 .code16
|
pascal@13269
|
19 .org 0
|
pascal@13269
|
20
|
pascal@13269
|
21 .globl _start
|
pascal@13269
|
22 _start:
|
pascal@13289
|
23 #if LINUX_HEADER
|
pascal@13289
|
24 jmp start2
|
pascal@13289
|
25 .ascii "HdrS" // 202 magic
|
pascal@13289
|
26 .word 0x200 // 206 version 2.00
|
pascal@13289
|
27 .long 0 // 208 realmode_swtch
|
pascal@13289
|
28 .word SYSTEM/16 // 20C start_sys_seg
|
pascal@13289
|
29 .word 0 // 20E kernel_version
|
pascal@13289
|
30 .byte 0 // 210 type_of_loader
|
pascal@13289
|
31 .byte 0 // 211 loadflags
|
pascal@13289
|
32 .word 0 // 212 setup_move_size
|
pascal@13289
|
33 .long SYSTEM // 214 code32_start
|
pascal@13289
|
34 .long 0 // 218 ramdisk_image
|
pascal@13289
|
35 .long 0 // 21C ramdisk_size
|
pascal@13289
|
36 .long 0 // 220 bootsect_kludge
|
pascal@13289
|
37 start2:
|
pascal@13289
|
38 #endif
|
pascal@13269
|
39 pushf
|
pascal@13269
|
40 pushw %cs
|
pascal@15188
|
41 #if HARDCODED_IP
|
pascal@15188
|
42 pushw $0
|
pascal@15188
|
43 #else
|
pascal@13269
|
44 call getip
|
pascal@13269
|
45 getip:
|
pascal@15188
|
46 #endif
|
pascal@13269
|
47 pushal
|
pascal@19391
|
48 #if SHUTDOWNDOS
|
pascal@19391
|
49 xorw %si, %si
|
pascal@19391
|
50 movw %si, %ds # %ds = 0
|
pascal@19391
|
51 pushl 4(%si)
|
pascal@19391
|
52 movw %sp, %cs:loadsp19+1(%si)
|
pascal@19391
|
53 cmpb $0xF0, 7(%si)
|
pascal@19391
|
54 jnb notdos
|
pascal@19391
|
55 movw $step19, 4(%si)
|
pascal@19391
|
56 movw %cs, 6(%si)
|
pascal@19391
|
57 pushfw
|
pascal@19391
|
58 popw %ax
|
pascal@19391
|
59 incb %ah # set TF
|
pascal@19391
|
60 pushw %ax
|
pascal@19391
|
61 popfw
|
pascal@19391
|
62 ljmp *4*0x19(%si)
|
pascal@19391
|
63 step19:
|
pascal@19391
|
64 pushw %si
|
pascal@19391
|
65 pushw %ds
|
pascal@19391
|
66 movw %sp, %si
|
pascal@19391
|
67 ldsw %ss:4(%si), %si
|
pascal@19391
|
68 cmpw $0x19CD, (%si)
|
pascal@19391
|
69 popw %ds
|
pascal@19391
|
70 popw %si
|
pascal@19391
|
71 jne doiret
|
pascal@19391
|
72 xorw %si, %si
|
pascal@19391
|
73 mov %si, %ds
|
pascal@19391
|
74 popl 4*0x19(%si)
|
pascal@19391
|
75 notdos:
|
pascal@19391
|
76 loadsp19:
|
pascal@19391
|
77 movw $0, %sp
|
pascal@19391
|
78 popl 4(%si)
|
pascal@19391
|
79 pushw %ss
|
pascal@19391
|
80 popw %ds
|
pascal@19391
|
81 #endif
|
pascal@19391
|
82 #if !FLAT16
|
pascal@19391
|
83 #undef FLAT16
|
pascal@15188
|
84 #if HARDCODED_SYSSIZE
|
pascal@15188
|
85 packed_syssize:
|
pascal@15188
|
86 movw $0, %bx // system size
|
pascal@15188
|
87 #else
|
pascal@15188
|
88 movw SYSSIZE, %bx
|
pascal@15188
|
89 #endif
|
pascal@19391
|
90 #endif
|
pascal@15188
|
91 #if HARDCODED_SETUPSIZE == 0
|
pascal@15188
|
92 xorw %dx, %dx
|
pascal@15188
|
93 movb SETUPSIZE, %dh
|
pascal@15188
|
94 #endif
|
pascal@15188
|
95 #if HARDCODED_IP
|
pascal@15188
|
96 xorw %si, %si
|
pascal@15188
|
97 #else
|
pascal@13269
|
98 movw %sp, %bp
|
pascal@13269
|
99 #define START_IP 32(%bp)
|
pascal@15188
|
100 subw $getip-_start, START_IP
|
pascal@15188
|
101 movw START_IP, %si
|
pascal@15188
|
102 #endif
|
pascal@13269
|
103 pushw %ds
|
pascal@13269
|
104 pushw %es
|
pascal@13269
|
105
|
pascal@13269
|
106 cld
|
pascal@19391
|
107
|
pascal@19391
|
108 #if FLAT16
|
pascal@19391
|
109 flat16mv:
|
pascal@19391
|
110 #if CHANGE_STACK
|
pascal@19391
|
111 STKSZ=0x9000-0x0990
|
pascal@19391
|
112 pushw $(TOP-STKSZ)/16-0x1000
|
pascal@19391
|
113 #else
|
pascal@19391
|
114 pushw $TOP/16-0x1000
|
pascal@19391
|
115 #endif
|
pascal@19391
|
116 popw %es
|
pascal@19391
|
117 pushw %es // moved
|
pascal@19391
|
118 .byte 0x6A, moved-_start // unpack code
|
pascal@19391
|
119 pushw %cs
|
pascal@19391
|
120 popw %ds
|
pascal@19391
|
121 xorw %di, %di
|
pascal@19391
|
122 #if HARDCODED_SETUPSIZE
|
pascal@19391
|
123 movw $SETUP*256, %cx
|
pascal@19391
|
124 #else
|
pascal@19391
|
125 xorw %cx, %cx
|
pascal@19391
|
126 movw SETUPSIZE, %ch
|
pascal@19391
|
127 #endif
|
pascal@19391
|
128 pushw %si
|
pascal@19391
|
129 rep
|
pascal@19391
|
130 movsw // move header part
|
pascal@19391
|
131 movw $0x1000, %bp
|
pascal@19391
|
132 movw %bp, %ds
|
pascal@19391
|
133 xorw %si, %si
|
pascal@19391
|
134 subw %di, %cx
|
pascal@19391
|
135 rep
|
pascal@19391
|
136 movsb // move system part
|
pascal@19391
|
137 popw %di
|
pascal@19391
|
138 movw $end-_start, %si
|
pascal@19391
|
139 #else
|
pascal@15188
|
140 #if CHANGE_STACK
|
pascal@15188
|
141 STKSZ=0x9000-0x0990
|
pascal@15188
|
142 movw $(TOP-STKSZ)/16, %ax
|
pascal@15188
|
143 #else
|
pascal@15188
|
144 movw $TOP/16, %ax
|
pascal@15188
|
145 #endif
|
pascal@15188
|
146 movw %ax, %es
|
pascal@15188
|
147 pushw %es // moved
|
pascal@15188
|
148 .byte 0x6A, moved-_start // unpack code
|
pascal@13269
|
149 pushw %cs
|
pascal@13269
|
150 popw %ds
|
pascal@15188
|
151 xorw %di, %di
|
pascal@13269
|
152 movw $end-_start, %cx
|
pascal@19391
|
153 pushw %cx
|
pascal@15188
|
154 pushw %si
|
pascal@13269
|
155 rep
|
pascal@13269
|
156 movsb // move upack code to $TOP
|
pascal@15188
|
157
|
pascal@15188
|
158 leaw SYSTEM/16(%bx), %bp
|
pascal@15188
|
159 movlp:
|
pascal@15188
|
160 decw %bp
|
pascal@15188
|
161 movw %bp, %ds
|
pascal@15188
|
162 decw %ax
|
pascal@13269
|
163 movw %ax, %es
|
pascal@13269
|
164 xorw %si, %si
|
pascal@13269
|
165 xorw %di, %di
|
pascal@15188
|
166 movb $8, %cl
|
pascal@13269
|
167 rep
|
pascal@13269
|
168 movsw // move system part
|
pascal@13269
|
169 decw %bx
|
pascal@15188
|
170 jnz movlp
|
pascal@15188
|
171
|
pascal@15188
|
172 pushw %cs
|
pascal@15188
|
173 popw %ds
|
pascal@15188
|
174 popw %si
|
pascal@15188
|
175 xorw %di, %di
|
pascal@15188
|
176 #if HARDCODED_SETUPSIZE
|
pascal@15188
|
177 movb $SETUP, %ch
|
pascal@15188
|
178 subw $SETUP*32, %ax
|
pascal@15188
|
179 #else
|
pascal@15188
|
180 movb %dh, %ch
|
pascal@15188
|
181 shrw $3, %dx
|
pascal@15188
|
182 subw %dx, %ax
|
pascal@15188
|
183 #endif
|
pascal@15188
|
184 movw %ax, %es
|
pascal@15188
|
185 pushw %si
|
pascal@15188
|
186 rep
|
pascal@15188
|
187 movsw // move header part
|
pascal@19391
|
188 popw %di
|
pascal@19391
|
189 popw %si
|
pascal@19391
|
190 #endif
|
pascal@15188
|
191 pushw %es
|
pascal@15188
|
192 popw %ds
|
pascal@15188
|
193 pushw %cs
|
pascal@15188
|
194 popw %es // restore setup seg
|
pascal@13269
|
195 retf
|
pascal@13269
|
196
|
pascal@13269
|
197 moved:
|
pascal@13288
|
198 #if CHANGE_STACK
|
pascal@15188
|
199 movw $STKSZ, %ax // trick: %ss = %sp
|
pascal@13288
|
200 movw %ss, %bx
|
pascal@15188
|
201 pushw %ax
|
pascal@13288
|
202 popw %ss
|
pascal@13288
|
203 xchgw %ax, %sp
|
pascal@13288
|
204 pushw %bx // %ss
|
pascal@13288
|
205 pushw %ax // %sp
|
pascal@13288
|
206 #endif
|
pascal@15188
|
207 pushw %bp // SYSTEM/16
|
pascal@13269
|
208 call unpack // unpack setup
|
pascal@13269
|
209 popw %es
|
pascal@13269
|
210 xorw %di,%di
|
pascal@13269
|
211 call unpack // unpack system
|
pascal@13288
|
212 #if CHANGE_STACK
|
pascal@13288
|
213 popw %ax // %sp
|
pascal@13288
|
214 popw %ss
|
pascal@13288
|
215 xchgw %ax, %sp
|
pascal@13288
|
216 #endif
|
pascal@15188
|
217 #if UPDATE_SYSSIZE
|
pascal@15188
|
218 # if HARDCODED_SYSSIZE
|
pascal@15188
|
219 original_syssize:
|
pascal@15188
|
220 movw $0, %ax
|
pascal@15188
|
221 # else
|
pascal@15188
|
222 addw $15, %di
|
pascal@15188
|
223 shrw $4, %di
|
pascal@15188
|
224 movw %es, %ax
|
pascal@15188
|
225 addw %di, %ax
|
pascal@15188
|
226 subw $SYSTEM/16, %ax
|
pascal@15188
|
227 # endif
|
pascal@15188
|
228 #endif
|
pascal@13269
|
229 popw %es
|
pascal@13269
|
230 popw %ds
|
pascal@15188
|
231 #if UPDATE_SYSSIZE
|
pascal@15188
|
232 movw %ax, SYSSIZE
|
pascal@15193
|
233 # if HARDCODED_SETUPSIZE
|
pascal@15193
|
234 original_setupsize:
|
pascal@15193
|
235 movb $4, SETUPSIZE
|
pascal@15193
|
236 # endif
|
pascal@15188
|
237 #endif
|
pascal@13269
|
238 popal
|
pascal@13269
|
239 iret
|
pascal@13269
|
240
|
pascal@13269
|
241 unpack:
|
pascal@13288
|
242 #include "unlzma.S"
|
pascal@13269
|
243
|
pascal@13269
|
244 end:
|