rev |
line source |
pascal@15188
|
1 #define TOP (0x90000+_start-end)
|
pascal@13288
|
2 #define SYSTEM 0x10000
|
pascal@19404
|
3 #define SETUP 14
|
pascal@15188
|
4 #define SYSSIZE 0x1F4
|
pascal@15188
|
5 #define SETUPSIZE 0x1F1
|
pascal@13288
|
6
|
pascal@15188
|
7 #define LINUX_HEADER 0
|
pascal@15188
|
8 #define UPDATE_SYSSIZE 1
|
pascal@15188
|
9 #define HARDCODED_SYSSIZE 1
|
pascal@15188
|
10 #define HARDCODED_SETUPSIZE 1
|
pascal@19391
|
11 #define FLAT16 1
|
pascal@19391
|
12 //#define FLAT16OUT 0
|
pascal@19404
|
13 #define SAVEREGS 0
|
pascal@13269
|
14
|
pascal@13269
|
15 .text
|
pascal@13269
|
16 .code16
|
pascal@13269
|
17 .org 0
|
pascal@13269
|
18
|
pascal@13269
|
19 .globl _start
|
pascal@13269
|
20 _start:
|
pascal@13289
|
21 #if LINUX_HEADER
|
pascal@13289
|
22 jmp start2
|
pascal@13289
|
23 .ascii "HdrS" // 202 magic
|
pascal@13289
|
24 .word 0x200 // 206 version 2.00
|
pascal@13289
|
25 .long 0 // 208 realmode_swtch
|
pascal@13289
|
26 .word SYSTEM/16 // 20C start_sys_seg
|
pascal@13289
|
27 .word 0 // 20E kernel_version
|
pascal@13289
|
28 .byte 0 // 210 type_of_loader
|
pascal@13289
|
29 .byte 0 // 211 loadflags
|
pascal@13289
|
30 .word 0 // 212 setup_move_size
|
pascal@13289
|
31 .long SYSTEM // 214 code32_start
|
pascal@13289
|
32 .long 0 // 218 ramdisk_image
|
pascal@13289
|
33 .long 0 // 21C ramdisk_size
|
pascal@13289
|
34 .long 0 // 220 bootsect_kludge
|
pascal@13289
|
35 start2:
|
pascal@13289
|
36 #endif
|
pascal@19404
|
37 #if SAVEREGS
|
pascal@19404
|
38 pushfw
|
pascal@13269
|
39 pushw %cs
|
pascal@15188
|
40 pushw $0
|
pascal@19404
|
41 pushal
|
pascal@19404
|
42 pushw %ds
|
pascal@19942
|
43 cld
|
pascal@15188
|
44 #else
|
pascal@19404
|
45 pushw %cs
|
pascal@19942
|
46 # if FLAT16
|
pascal@19942
|
47 xorw %di, %di
|
pascal@19942
|
48 pushw %di
|
pascal@19942
|
49 # else
|
pascal@19404
|
50 pushw $0
|
pascal@19942
|
51 # endif
|
pascal@15188
|
52 #endif
|
pascal@19404
|
53 #if UPDATE_SYSSIZE
|
pascal@19942
|
54 pushw %ds // <A>
|
pascal@15188
|
55 #else
|
pascal@19942
|
56 pushw %cs // <A>
|
pascal@15188
|
57 #endif
|
pascal@19404
|
58 #if FLAT16
|
pascal@19404
|
59 # 1- move 9020..9020+stp -> 8000
|
pascal@19942
|
60 pushw $0x8000
|
pascal@19942
|
61 popw %es
|
pascal@19942
|
62 movw $0x200, %si
|
pascal@19942
|
63 #if SAVEREGS == 0
|
pascal@19942
|
64 pushw %es
|
pascal@19942
|
65 // pushw $cont
|
pascal@19942
|
66 .byte 0x6A, cont
|
pascal@19942
|
67 jmp jumpinto
|
pascal@19942
|
68 #else
|
pascal@19404
|
69 # if HARDCODED_SETUPSIZE
|
pascal@19404
|
70 setup_word:
|
pascal@19404
|
71 movw $SETUP*256, %cx
|
pascal@19404
|
72 # else
|
pascal@19404
|
73 xorw %cx, %cx
|
pascal@19404
|
74 movb SETUPSIZE, %ch
|
pascal@19404
|
75 movw %cx, %dx
|
pascal@19404
|
76 # endif
|
pascal@19942
|
77 pushw %cx // <B>
|
pascal@19942
|
78 pushw %es
|
pascal@19942
|
79 pushw %di
|
pascal@19404
|
80 rep
|
pascal@19942
|
81 movsw
|
pascal@19404
|
82 lret
|
pascal@19942
|
83 #endif
|
pascal@19404
|
84 cont:
|
pascal@19404
|
85 # 2- move 1000..1000+sys -> 8000+stp
|
pascal@19404
|
86 pushw $0x1000
|
pascal@19404
|
87 popw %ds
|
pascal@19391
|
88 xorw %si, %si
|
pascal@19391
|
89 subw %di, %cx
|
pascal@19391
|
90 rep
|
pascal@19404
|
91 movsb
|
pascal@19404
|
92 # 3- unlz(8000+stp:end, 1000-stp:0)
|
pascal@19942
|
93 pushw %es // <C>
|
pascal@19404
|
94 # if HARDCODED_SETUPSIZE
|
pascal@19404
|
95 setup_seg:
|
pascal@19404
|
96 # if UPDATE_SYSSIZE
|
pascal@19404
|
97 pushw $0x1000-(SETUP*32)-32
|
pascal@19404
|
98 # else
|
pascal@19404
|
99 pushw $0x1000-(SETUP*32)
|
pascal@19404
|
100 # endif
|
pascal@19404
|
101 popw %es
|
pascal@19404
|
102 # else
|
pascal@19404
|
103 # if UPDATE_SYSSIZE
|
pascal@19404
|
104 incb %dh
|
pascal@19404
|
105 # endif
|
pascal@19404
|
106 shrw $3, %dx
|
pascal@19404
|
107 movw %ds, %ax
|
pascal@19404
|
108 subw %dx, %ax
|
pascal@19404
|
109 movw %ax, %es
|
pascal@19404
|
110 # endif
|
pascal@19942
|
111 #else // FLAT16
|
pascal@19404
|
112 # 1- move 1000..1000+sys -> 9000-sys
|
pascal@19404
|
113 # if HARDCODED_SYSSIZE
|
pascal@19404
|
114 packed_syssize:
|
pascal@19404
|
115 movw $0x1000+0, %ax
|
pascal@19404
|
116 # else
|
pascal@19404
|
117 movw SYSSIZE, %ax
|
pascal@19404
|
118 addw $0x1000, %ax
|
pascal@19404
|
119 # endif
|
pascal@19404
|
120 movw %ds, %dx
|
pascal@19404
|
121 mvsys:
|
pascal@19404
|
122 decw %ax
|
pascal@19404
|
123 decw %dx
|
pascal@19404
|
124 movw %ax, %ds
|
pascal@19404
|
125 movw %dx, %es
|
pascal@19404
|
126 xorw %si, %si
|
pascal@19404
|
127 xorw %di, %di
|
pascal@19404
|
128 movw $8, %cx
|
pascal@19404
|
129 rep
|
pascal@19404
|
130 movsw
|
pascal@19404
|
131 cmpw $0x1000, %ax
|
pascal@19404
|
132 jne mvsys
|
pascal@19404
|
133 # 2- move 9020..9020+stp -> 9000-sys-stp
|
pascal@19404
|
134
|
pascal@19404
|
135 # if HARDCODED_SETUPSIZE
|
pascal@19404
|
136 setup_byte:
|
pascal@19404
|
137 movb $SETUP, %ch
|
pascal@19404
|
138 setup_para:
|
pascal@19404
|
139 subw $SETUP*32, %dx
|
pascal@19404
|
140 # else
|
pascal@19404
|
141 movb %ss:SETUPSIZE, %ch
|
pascal@19404
|
142 movw %cx, %ax
|
pascal@19404
|
143 shrw $3, %ax
|
pascal@19404
|
144 subw %ax, %dx
|
pascal@19404
|
145 # endif
|
pascal@19942
|
146 pushw %cx // <B>
|
pascal@19404
|
147 movw %dx, %es
|
pascal@19404
|
148 xorw %si, %si
|
pascal@19404
|
149 xorw %di, %di
|
pascal@19404
|
150 rep
|
pascal@19404
|
151 movsw %cs:(%si),%es:(%di)
|
pascal@19404
|
152 pushw %es
|
pascal@19404
|
153 # 3- reloc itself in 0x7C00
|
pascal@19404
|
154 pushw $0x07C0
|
pascal@19404
|
155 popw %es
|
pascal@19942
|
156 movw $cont, %si
|
pascal@19942
|
157 movw %si, %di
|
pascal@13269
|
158 movw $end-_start, %cx
|
pascal@19942
|
159 pushw %es
|
pascal@19942
|
160 pushw %di
|
pascal@13269
|
161 rep
|
pascal@19404
|
162 movsb %cs:(%si),%es:(%di)
|
pascal@19404
|
163 lret
|
pascal@19404
|
164 cont:
|
pascal@19404
|
165 # 4- unlz(9000-sys-stp:end, 1000-stp:0)
|
pascal@19404
|
166 # if HARDCODED_SETUPSIZE
|
pascal@19404
|
167 setup_seg:
|
pascal@19404
|
168 # if UPDATE_SYSSIZE
|
pascal@19404
|
169 pushw $0x1000-(SETUP*32)-32
|
pascal@19404
|
170 # else
|
pascal@19404
|
171 pushw $0x1000-(SETUP*32)
|
pascal@19404
|
172 # endif
|
pascal@19404
|
173 popw %es
|
pascal@19404
|
174 # else
|
pascal@19404
|
175 negw %ax
|
pascal@19404
|
176 # if UPDATE_SYSSIZE
|
pascal@19404
|
177 addw $0x1000-32, %ax
|
pascal@19404
|
178 # else
|
pascal@19404
|
179 addw $0x1000, %ax
|
pascal@19404
|
180 # endif
|
pascal@13269
|
181 movw %ax, %es
|
pascal@19404
|
182 # endif
|
pascal@19942
|
183 #endif // FLAT16
|
pascal@19942
|
184 popw %ds // <C>
|
pascal@19404
|
185 movw $end-_start, %si
|
pascal@19404
|
186 #if UPDATE_SYSSIZE
|
pascal@19404
|
187 movw $SYSSIZE, %di
|
pascal@19404
|
188 #else
|
pascal@13269
|
189 xorw %di, %di
|
pascal@19404
|
190 #endif
|
pascal@19404
|
191 pushw %di
|
pascal@19404
|
192 pushw %es
|
pascal@19404
|
193 call unpack
|
pascal@15188
|
194 popw %ds
|
pascal@15188
|
195 popw %si
|
pascal@19404
|
196 movw %si, %di
|
pascal@19942
|
197 # if SAVEREGS != 0
|
pascal@19942
|
198 popw %cx // <B>
|
pascal@15188
|
199 #if UPDATE_SYSSIZE
|
pascal@19404
|
200 // not need with memtest movb $(512-SYSSIZE)/2, %cl
|
pascal@15188
|
201 #endif
|
pascal@19942
|
202 popw %es // <A>
|
pascal@19404
|
203 # 5- move 1000-stp..1000 -> 9020
|
pascal@19942
|
204 # else
|
pascal@19942
|
205 popw %es // <A>
|
pascal@19942
|
206 jumpinto:
|
pascal@19942
|
207 # if HARDCODED_SETUPSIZE
|
pascal@19942
|
208 setup_word:
|
pascal@19942
|
209 movw $SETUP*256, %cx
|
pascal@19942
|
210 # else
|
pascal@19942
|
211 xorw %cx, %cx
|
pascal@19942
|
212 movb %ss:SETUPSIZE, %ch
|
pascal@19942
|
213 movw %cx, %dx
|
pascal@19942
|
214 # endif
|
pascal@19942
|
215 # endif
|
pascal@19404
|
216 rep
|
pascal@19404
|
217 movsw
|
pascal@19404
|
218 #if SAVEREGS
|
pascal@13269
|
219 popw %ds
|
pascal@13269
|
220 popal
|
pascal@13269
|
221 iret
|
pascal@19404
|
222 #else
|
pascal@19404
|
223 lret
|
pascal@19404
|
224 #endif
|
pascal@13269
|
225
|
pascal@13269
|
226 unpack:
|
pascal@19403
|
227 #define NO_LZMA_HEADER
|
pascal@13288
|
228 #include "unlzma.S"
|
pascal@13269
|
229
|
pascal@13269
|
230 end:
|