wok view syslinux/stuff/iso2exe/bootiso.S @ rev 13691

syslinux: add iso2exe
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Dec 13 14:33:27 2012 +0100 (2012-12-13)
parents
children d47403fdd900
line source
1 .text
2 .code16
3 .org 0
5 CODESZ = 0x8000 // 16 sectors = 32Kb
6 #define EXEADRS(x) x+0xE0
7 #define EXESTR(x) x-0x20
9 .globl _start
10 _start:
11 decw %bp // Magic number: MZ
12 popw %dx
13 jmp start // Bytes on last page of file
14 .word (CODESZ+511)/512 // Pages in file
15 .word 0 // Relocations
16 .word (end_header-_start)/16 // Size of header in paragraphs
17 .word 4064-(CODESZ/16) // Minimum extra paragraphs needed
18 .word 4064-(CODESZ/16) // Maximum extra paragraphs needed
19 .word 0xFFF0 // Initial (relative) SS value
20 .word 0xFFFE // Initial SP value
21 .word 0 // Checksum
22 .word EXEADRS(fixseg) // Initial IP value
23 .word 0xFFF0 // Initial (relative) CS value
24 .word 0x001C // File address of relocation table
25 .word 0 // Overlay number
26 initramfssize:
27 .word 0
28 id:
29 .word 0
30 end_header:
32 chksum:
33 .long 0
34 comstart:
35 .word 0
37 /////////////////////// Master Boot Record code //////////////////////////////
39 start:
40 incw %bp
41 pushw %dx // restore SP
42 pushaw
43 movw %sp, %bp
44 pushf
45 pushw %ds
46 pushw %es
47 pushw $0
48 popw %ds
49 call setreg
50 rep
51 movsw
52 ljmp $0, $0x0600+start2
54 setreg:
55 cld
56 pushw %ds
57 popw %es
58 movw $0x7C00, %si
59 movw %si, %bx
60 movw $0x0600, %di
61 movw $0x0100, %cx
62 return:
63 ret
64 start2:
65 movw $0x80, %dx
66 dxloop:
67 movw $1, %cx
68 movw $0x201, %ax
69 int $0x13
70 jc next
71 call setreg
72 repe
73 cmpsw
74 je dxfound
75 next:
76 addb $0x7D, %dl // try every hard disk
77 andb $0x83, %dl // and floppy disk
78 cmpb $0x80, %dl
79 jnz dxloop
80 fail:
81 int $0x19
82 dxfound:
83 movw %dx, 10(%bp)
84 movb $2, %cl // %ch = 0
85 movw $0x201, %ax
86 int $0x13
87 jc fail
88 cmpw $0xAA55, 0x7DFE
89 jne fail
90 popw %es
91 popw %ds
92 popf
93 popa
94 ljmp $0, $0x7C00
96 ////////////////////////////// DOS EXE code ///////////////////////////////////
98 no386:
99 .ascii "No 386+$"
100 noDOS3:
101 .ascii "No DOS 3.0+$"
102 rmPaging:
103 .ascii "Broken paging.$"
104 ERRvcpi:
105 .ascii "No VCPI 4.0+$"
106 chkerr:
107 .ascii "Broken ISO.$"
108 realmodemsg:
109 .ascii "Real mode\r$"
110 vm86modemsg:
111 .ascii "Vm86\r$"
112 help:
113 .ascii "Linux kickstarter.\r\n$"
114 fixseg:
115 #if 1
116 movb $EXESTR(help), %dl
117 movw 0x82, %ax
118 cmpw $0x3F2F, %ax # /?
119 je abort
120 #endif
121 pushf
122 popw %ax
123 movw $0xF0F0, %cx
124 orb %ah, %ch
125 andb $0xF, %ah
127 pushw %ax
128 popf
129 pushf
130 popw %ax
131 andb %cl, %ah
133 cmp %cl, %ah
134 je NotSupported // 8086 family
136 pushw %cx
137 popf
138 pushf
139 popw %ax
140 andb %cl, %ah
142 jnz is386 // 80286 family
143 NotSupported:
144 movb $EXESTR(no386), %dl
145 abort:
146 puts:
147 movb $1, %dh
148 movb $9, %ah
149 int $0x21
150 ret
152 is386:
153 movb $0x30, %ah
154 int $0x21
155 cmpb $3, %al
156 movb $EXESTR(noDOS3), %dl
157 jb abort
158 smsw %ax
159 andb $1, %al
160 jne tstvcpi
161 movl %cr0, %eax
162 movb $EXESTR(rmPaging), %dl
163 shll $1, %eax
164 jc abort
165 jmp realmode
167 tstvcpi:
168 pushw %ds
169 pushw $0
170 popw %ds
171 movw 0x67*4+2, %ds
172 std
173 movw $14, %si
174 lodsl
175 cmpl $0x30585858, %eax // 0XXX
176 lodsl
177 cld
178 popw %ds
179 NoVCPI:
180 movb $EXESTR(ERRvcpi), %dl
181 goabort:
182 jne abort
183 shll $8, %eax
184 cmpl $0x4D4D4500, %eax // [XQ]MME
185 #if 1
186 movw $EXEADRS(CmdVCPI), %si
187 ChkVCPI:
188 jne NoVCPI
189 lodsb
190 shlw $8, %ax
191 je VersionVCPI
192 int $0x67
193 jmp ChkVCPI
194 CmdVCPI:
195 .byte 0x40 // status
196 .byte 0xDE // vcpi present ?
197 .byte 0x46 // version
198 .byte 0
199 VersionVCPI:
200 cmpb $0x40, %al // >= 4.0 ?
201 jb NoVCPI
202 #else
203 jne NoVCPI
204 movb $0x40, %ah // status
205 int $0x67
206 testb %ah, %ah
207 jne NoVCPI
208 movb $0x46, %ah // version
209 int $0x67
210 testb %ah, %ah
211 jne NoVCPI
212 cmpb $0x40, %al // >= 4.0 ?
213 jb NoVCPI
214 movw $0xDE00, %ax // vcpi present ?
215 int $0x67
216 testb %ah, %ah
217 jne NoVCPI
218 #endif
219 realmode:
220 movw $0x100, %si
221 lodsl
222 xchgl %eax, %edx
223 orl %edx, %edx
224 jz skip
225 movw $0x7FDC/4, %cx
226 chklp:
227 lodsl
228 addl %eax, %edx
229 loop chklp
230 orl %edx, %edx
231 movb $EXESTR(chkerr), %dl
232 jne goabort
233 skip:
234 movb $EXESTR(realmodemsg), %dl
235 smsww %ax
236 andb $1, %al
237 jz isrealmode
238 movb $EXESTR(vm86modemsg), %dl
239 isrealmode:
240 call puts
241 movw EXEADRS(comstart), %ax // .com address
243 cld
244 movw $moveend-move, %cx
245 movw $EXEADRS(move), %si
246 movw $0xC000, %di
247 jmp move2
249 move:
250 movb $0x80, %ch
251 xchgw %ax, %si
252 movw $0x0100, %di
253 move2:
254 pushw %di
255 rep
256 movsb
257 ret
258 moveend:
260 .org 440
261 //////////////////////////// partition table //////////////////////////////////