rev |
line source |
pascal@13691
|
1 .text
|
pascal@13691
|
2 .code16
|
pascal@13691
|
3 .org 0
|
pascal@13691
|
4
|
pascal@13691
|
5 CODESZ = 0x8000 // 16 sectors = 32Kb
|
pascal@13972
|
6 #define EXEADRS(x) x+0xC0
|
pascal@14261
|
7 #define EXELOC(x) x-0x40
|
pascal@14261
|
8 #define EXESTR(x) x-0x7F40
|
pascal@13691
|
9
|
pascal@13691
|
10 .globl _start
|
pascal@13691
|
11 _start:
|
pascal@13691
|
12 decw %bp // Magic number: MZ
|
pascal@13691
|
13 popw %dx
|
pascal@13972
|
14 jmp start0 // Bytes on last page of file
|
pascal@13691
|
15 .word (CODESZ+511)/512 // Pages in file
|
pascal@13691
|
16 .word 0 // Relocations
|
pascal@13691
|
17 .word (end_header-_start)/16 // Size of header in paragraphs
|
pascal@13691
|
18 .word 4064-(CODESZ/16) // Minimum extra paragraphs needed
|
pascal@13691
|
19 .word 4064-(CODESZ/16) // Maximum extra paragraphs needed
|
pascal@13691
|
20 .word 0xFFF0 // Initial (relative) SS value
|
pascal@13691
|
21 .word 0xFFFE // Initial SP value
|
pascal@13691
|
22 .word 0 // Checksum
|
pascal@13729
|
23 .word EXEADRS(exestart) // Initial IP value
|
pascal@13691
|
24 .word 0xFFF0 // Initial (relative) CS value
|
pascal@13972
|
25 initramfssize:
|
pascal@13972
|
26 .word 0 // File address of relocation table
|
pascal@17810
|
27 fdcnt: // Overlay number
|
pascal@14257
|
28 .byte 0 // Bootstrap floppy sector count
|
pascal@17810
|
29 .ascii "slitaz"
|
pascal@13691
|
30
|
pascal@13691
|
31 /////////////////////// Master Boot Record code //////////////////////////////
|
pascal@13691
|
32
|
pascal@17810
|
33 moved = 0x8000
|
pascal@17496
|
34 start0:
|
pascal@19827
|
35 //pushw %dx // restore %sp
|
pascal@19827
|
36 //incw %bp // restore %bp
|
pascal@17496
|
37 xorw %bx, %bx
|
pascal@17496
|
38 movw %bx, %ds
|
pascal@17496
|
39 movb $0x7C, %bh
|
pascal@19827
|
40 pushw %ds
|
pascal@19827
|
41 popw %ss
|
pascal@19827
|
42 movw %bx, %sp
|
pascal@17496
|
43 pushw %bx // return address
|
pascal@19827
|
44 pushw %di
|
pascal@17496
|
45 pushw %es // save %es:%di
|
pascal@13972
|
46 cld
|
pascal@17496
|
47 sti
|
pascal@13972
|
48 pushw %ds
|
pascal@13972
|
49 popw %es
|
pascal@13691
|
50 call setreg
|
pascal@13691
|
51 rep
|
pascal@19827
|
52 movsw
|
pascal@13972
|
53 movw $0x80, %dx
|
pascal@17810
|
54 ljmp $0, $moved+start2
|
pascal@17810
|
55 .byte 0
|
pascal@17810
|
56 // .org 60
|
pascal@17810
|
57 // .long 0x0080 // PE header offset
|
pascal@17810
|
58 .org 64
|
pascal@13972
|
59 end_header:
|
pascal@13972
|
60 comstart:
|
pascal@13972
|
61 .word 0
|
pascal@13691
|
62
|
pascal@17810
|
63 .org 66
|
pascal@17810
|
64 dxloop:
|
pascal@17810
|
65 start2:
|
pascal@17810
|
66 call readsector1 // look for the boot device
|
pascal@17810
|
67 repe
|
pascal@17810
|
68 cmpsw
|
pascal@17810
|
69 je dxfound
|
pascal@17810
|
70 movb $0, %cl // ch = 0
|
pascal@17810
|
71 addb $0x7D, %dl // try every hard disk
|
pascal@17810
|
72 jno dxloop
|
pascal@17810
|
73
|
pascal@17810
|
74 dxfound:
|
pascal@17810
|
75 call readsectorX // read isolinux boot sector
|
pascal@17810
|
76 cmpw (%bx), %cx
|
pascal@17810
|
77 jnc puts // read fail or no isohydrid boot sector
|
pascal@19827
|
78 movw $patch,%si
|
pascal@17810
|
79 popw %es
|
pascal@19827
|
80 popw %di // isolinux boot needs %es:%di and %dx
|
pascal@17810
|
81 putsret:
|
pascal@17810
|
82 ret
|
pascal@17810
|
83
|
pascal@17810
|
84 putstrlp:
|
pascal@17810
|
85 movw $7, %bx
|
pascal@17810
|
86 movb $0xE, %ah
|
pascal@17810
|
87 int $0x10
|
pascal@17810
|
88 error:
|
pascal@17810
|
89 lodsb
|
pascal@17810
|
90 cmp $1, %al
|
pascal@17810
|
91 jg putstrlp
|
pascal@17810
|
92 jz putsret
|
pascal@17810
|
93 puts:
|
pascal@17810
|
94 movb $0x80, %ah
|
pascal@17810
|
95 xchgw %ax, %si
|
pascal@17810
|
96 jnc error
|
pascal@17810
|
97 halt:
|
pascal@17810
|
98 hlt
|
pascal@17810
|
99 jmp halt
|
pascal@17810
|
100 nobsmsg:
|
pascal@17810
|
101 .asciz "No isolinux."
|
pascal@17810
|
102
|
pascal@17810
|
103 .org 0x0080
|
pascal@17810
|
104 ////////////////////////////// EXE/PE header //////////////////////////////////
|
pascal@17810
|
105
|
pascal@17810
|
106 .org 0x01A0
|
pascal@17496
|
107 readsectorX: // read isolinux boot sector
|
pascal@17496
|
108 movb $0xA5, %cl // patched by installer
|
pascal@13699
|
109 readsector1:
|
pascal@17496
|
110 andb $0x83, %dl // disk and floppy disk
|
pascal@13699
|
111 movw %cx, (%bx)
|
pascal@13699
|
112 incw %cx
|
pascal@13699
|
113 movw $0x201, %ax
|
pascal@13699
|
114 int $0x13
|
pascal@13691
|
115 setreg:
|
pascal@13699
|
116 movw %bx, %si
|
pascal@17810
|
117 movw $moved, %di
|
pascal@13691
|
118 movw $0x0100, %cx
|
pascal@17810
|
119 movb $nobsmsg, %al
|
pascal@13691
|
120 ret
|
pascal@17810
|
121 .org 0x01B8
|
pascal@14267
|
122
|
pascal@19827
|
123 ////////////////////////// partition boot code ////////////////////////////////
|
pascal@19827
|
124 // assume CS=DS=SS=0 BX=7C00 DL=<drive> SI=7DBE
|
pascal@19827
|
125
|
pascal@19827
|
126 .org 0x7C00
|
pascal@19827
|
127 jmp bootpartition
|
pascal@19827
|
128 .org 0x7C03
|
pascal@19827
|
129 .org 0x7DBE
|
pascal@19827
|
130 table = moved+0x1BE
|
pascal@19827
|
131 patch:
|
pascal@19827
|
132 .byte 0,0,0 // head of original bs
|
pascal@19827
|
133 partcode:
|
pascal@19827
|
134 popw %di
|
pascal@19827
|
135 movw $table,%si
|
pascal@19827
|
136 call movepartition
|
pascal@19827
|
137 movb $4,%cl
|
pascal@19827
|
138 movw $table-16,%di
|
pascal@19827
|
139 next:
|
pascal@19827
|
140 addw $16,%di
|
pascal@19827
|
141 cmpb %ch,(%di) // boot flag ?
|
pascal@19827
|
142 loope next
|
pascal@19827
|
143 pushw %ds
|
pascal@19827
|
144 pushw %ds
|
pascal@19827
|
145 pushl 8(%di)
|
pascal@19827
|
146 pushw %ds
|
pascal@19827
|
147 pushw %bx
|
pascal@19827
|
148 pushw $1
|
pascal@19827
|
149 pushw $0x10
|
pascal@19827
|
150 movw %sp,%si // assume %ds = %ss
|
pascal@19827
|
151 movb $0x42,%ah
|
pascal@19827
|
152 pushw %bx
|
pascal@19827
|
153 cmpw $63,2(%di) // empty or isolinux partition ?
|
pascal@19827
|
154 jbe default
|
pascal@19827
|
155 int $0x13
|
pascal@19827
|
156 default:
|
pascal@19827
|
157 ret
|
pascal@19827
|
158 .org 0x7DEF
|
pascal@19827
|
159 bootpartition:
|
pascal@19827
|
160 pushw %ds
|
pascal@19827
|
161 popw %es
|
pascal@19827
|
162 pushw %si
|
pascal@19827
|
163 movw %bx,%di
|
pascal@19827
|
164 movsw
|
pascal@19827
|
165 movsb
|
pascal@19827
|
166 movw $partcode+0x100,%di
|
pascal@19827
|
167 pushw %di
|
pascal@19827
|
168 movepartition:
|
pascal@19827
|
169 movw $66/2,%cx
|
pascal@19827
|
170 rep
|
pascal@19827
|
171 movsw
|
pascal@19827
|
172 ret
|
pascal@19827
|
173 .org 0x7E00
|
pascal@19827
|
174
|
pascal@17810
|
175 .org 0x7F48
|
pascal@13691
|
176 ////////////////////////////// DOS EXE code ///////////////////////////////////
|
pascal@13691
|
177
|
pascal@13729
|
178 exestart:
|
pascal@13699
|
179 cld
|
pascal@19428
|
180 movw $EXEADRS(puts), %bp
|
pascal@17810
|
181 movw 129, %ax
|
pascal@17473
|
182 cmpb $0x2F, %al
|
pascal@17473
|
183 je ishelp
|
pascal@17473
|
184 cmpw $0x2F20, %ax
|
pascal@17473
|
185 ishelp:
|
pascal@17473
|
186 movw $0x3000+EXESTR(help), %ax
|
pascal@13729
|
187 cwd // clear dx
|
pascal@17454
|
188 pushw %dx // dos exit()
|
pascal@17454
|
189 je abort
|
pascal@17454
|
190 int $0x21 // get DOS version
|
pascal@17562
|
191 addb $-3, %al
|
pascal@19435
|
192 movw $0xF000+EXESTR(noDOS3), %ax
|
pascal@19435
|
193 movw $0x100, %di
|
pascal@17810
|
194 jc tst386
|
pascal@13691
|
195 abort:
|
pascal@19429
|
196 jmp *%bp
|
pascal@13691
|
197
|
pascal@17160
|
198 tst386:
|
pascal@17906
|
199 pushfw // save flags
|
pascal@17160
|
200 // bits 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
pascal@17160
|
201 // flags 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF
|
pascal@19435
|
202 // movb $0xF0, %ah
|
pascal@17160
|
203 pushw %ax
|
pascal@17906
|
204 popfw // < 286 : flags[12..15] are forced 1
|
pascal@17906
|
205 pushfw // = 286 : flags[12..15] are forced 0
|
pascal@17906
|
206 popw %bx // > 286 : only flags[15] is forced 0
|
pascal@17906
|
207 popfw // restore flags (IOPL)
|
pascal@17906
|
208 addb %ah, %bh // test F0 and 00 cases
|
pascal@19435
|
209 js is86 // NS=386+, NC=286
|
pascal@13691
|
210 is386:
|
pascal@17906
|
211 smsww %ax // not privileged
|
pascal@13691
|
212 andb $1, %al
|
pascal@17562
|
213 movw $10, %si
|
pascal@13691
|
214 jne tstvcpi
|
pascal@17906
|
215 movl %cr0, %eax // privileged
|
pascal@14150
|
216 incl %eax
|
pascal@13713
|
217 movb $EXESTR(rmPaging), %al
|
pascal@14150
|
218 js abort
|
pascal@17810
|
219 inc %ax
|
pascal@17810
|
220 //movb $EXESTR(realmodemsg), %al
|
pascal@13691
|
221 realmode:
|
pascal@19429
|
222 call *%bp
|
pascal@17160
|
223 is86:
|
pascal@14261
|
224 movw comstart-end_header(%di), %si // .com address
|
pascal@13691
|
225 pushw %di
|
pascal@17906
|
226 movb $0x7C/2, %ch // 31K-31.5K, > com length
|
pascal@13691
|
227 rep
|
pascal@17473
|
228 movsw
|
pascal@13691
|
229 ret
|
pascal@13713
|
230
|
pascal@19429
|
231 CallVCPI:
|
pascal@19428
|
232 int $0x67
|
pascal@19428
|
233 testb %ah, %ah
|
pascal@19428
|
234 xchgw %ax, %cx
|
pascal@19429
|
235 pushw %si
|
pascal@19428
|
236 ScanVCPI:
|
pascal@19428
|
237 popw %si
|
pascal@19428
|
238 ChkVCPI:
|
pascal@19428
|
239 NoVCPI:
|
pascal@19428
|
240 movb $EXESTR(ERRvcpi), %al
|
pascal@19428
|
241 jne abort
|
pascal@19428
|
242 lodsb
|
pascal@19428
|
243 shlw $8, %ax
|
pascal@19428
|
244 jne CallVCPI
|
pascal@13713
|
245 VersionVCPI:
|
pascal@17496
|
246 xchgw %ax, %si // movb $EXESTR(vm86modemsg), %al
|
pascal@17562
|
247 cmpb $0x40, %cl // EMM386 / VCPI 4.0 mini
|
pascal@17562
|
248 jnc realmode // %si = 0
|
pascal@13713
|
249 tstvcpi:
|
pascal@13713
|
250 pushw %ds
|
pascal@17810
|
251 movw %si, %ds // %si = 10
|
pascal@17810
|
252 movw (0x67*4)+2-(16*10)-0x100(%di), %ds
|
pascal@17473
|
253 lodsw
|
pascal@13713
|
254 xorw $0x4D45, %ax // EM(MX) or EM(MQ)
|
pascal@17473
|
255 lodsw
|
pascal@17473
|
256 lodsw
|
pascal@13713
|
257 popw %ds
|
pascal@14150
|
258 jne NoVCPI
|
pascal@19435
|
259 xorw $0x5858, %ax // XX(X0)
|
pascal@19428
|
260 call ScanVCPI
|
pascal@13713
|
261 CmdVCPI:
|
pascal@13713
|
262 .byte 0x40 // status
|
pascal@13713
|
263 .byte 0xDE // vcpi present ?
|
pascal@13713
|
264 .byte 0x46 // version
|
pascal@13713
|
265 .byte 0
|
pascal@13713
|
266
|
pascal@17496
|
267 vm86modemsg:
|
pascal@17473
|
268 // --------------- Must be in 7F40 7FFF range ------------------------
|
pascal@17810
|
269 .ascii "86" // 86 mode
|
pascal@17562
|
270 .byte EXESTR(mode)
|
pascal@14261
|
271 ERRvcpi:
|
pascal@17810
|
272 .ascii "VCPI4" // VCPI4?
|
pascal@17562
|
273 .byte EXESTR(need)
|
pascal@14261
|
274 rmPaging:
|
pascal@17810
|
275 .ascii "X" // Xreal mode
|
pascal@14261
|
276 realmodemsg:
|
pascal@17562
|
277 .ascii "real" // real mode
|
pascal@17473
|
278 // --------------- Must be in 7FC0 7FFF range ------------------------
|
pascal@17562
|
279 mode:
|
pascal@17562
|
280 .ascii " m"
|
pascal@17496
|
281 ode:
|
pascal@17562
|
282 .ascii "ode"
|
pascal@14261
|
283 .byte EXESTR(eol)
|
pascal@17562
|
284 noDOS3:
|
pascal@17810
|
285 .ascii "DOS3" // DOS3?
|
pascal@17562
|
286 need:
|
pascal@17810
|
287 .ascii "?"
|
pascal@17496
|
288 .byte EXESTR(eol)
|
pascal@17473
|
289 help:
|
pascal@19435
|
290 .ascii "SliTaz iso boot." // SliTaz iso boot.
|
pascal@17473
|
291 eol:
|
pascal@17496
|
292 .ascii "\r\n"
|
pascal@17810
|
293 .byte 1 // puts will return
|
pascal@14261
|
294
|
pascal@17496
|
295 .space 16,0 // ISO md5
|
pascal@14261
|
296 .org 0x8000
|
pascal@14261
|
297 ////////////////////////// ISO9660 header /////////////////////////////////////
|