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

syslinux/iso2exe: menu can create usbkey/floppy
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Dec 14 15:43:12 2012 +0100 (2012-12-14)
parents 7d300004a3b8
children 58b695f73790
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 .word 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 eol:
99 .ascii ".\r\n$"
100 no386:
101 .ascii "No 386+$"
102 noDOS3:
103 .ascii "No DOS 3.0+$"
104 rmPaging:
105 .ascii "Broken paging$"
106 ERRvcpi:
107 .ascii "No VCPI 4.0+$"
108 chkerr:
109 .ascii "Broken ISO$"
110 realmodemsg:
111 .ascii "Real mode$"
112 vm86modemsg:
113 .ascii "VM86 mode$"
114 help:
115 .ascii "SliTaz GNU/Linux bootloader$"
117 fixseg:
118 movb $EXESTR(help), %dl
119 movw $0x100, %si
120 cmpw $0x3F2F, -126(%si) # /?
121 je abort
122 movw (%si), %cx
123 jcxz skip
124 xorw %dx, %dx
125 movw $0x7FE0/2, %cx
126 chklp:
127 lodsw
128 addw %ax, %dx
129 loop chklp
130 orw %dx, %dx
131 movb $EXESTR(chkerr), %dl
132 jne abort
133 skip:
134 pushf
135 popw %ax
136 movw $0xF0F0, %cx
137 orb %ah, %ch
138 andb $0xF, %ah
139 pushw %ax
140 popf
141 pushf
142 popw %ax
143 andb %cl, %ah
144 cmp %cl, %ah
145 je NotSupported // 8086 family
146 pushw %cx
147 popf
148 pushf
149 popw %ax
150 andb %cl, %ah
151 jnz is386 // 80286 family
152 NotSupported:
153 movb $EXESTR(no386), %dl
154 abort:
155 puts:
156 movb $1, %dh
157 call puts2
158 movw $EXEADRS(eol), %dx
159 puts2:
160 movb $9, %ah
161 int $0x21
162 ret
164 is386:
165 movb $0x30, %ah
166 int $0x21
167 cmpb $3, %al
168 movb $EXESTR(noDOS3), %dl
169 jb abort
170 movl %cr0, %eax
171 andb $1, %al
172 jne tstvcpi
173 movb $EXESTR(rmPaging), %dl
174 shll $1, %eax
175 jc abort
176 movb $EXESTR(realmodemsg), %dl
177 jmp realmode
179 tstvcpi:
180 pushw %ds
181 pushw $0
182 popw %ds
183 movw 0x67*4+2, %ds
184 std
185 movw $14, %si
186 lodsl
187 cmpl $0x30585858, %eax // 0XXX
188 lodsl
189 cld
190 popw %ds
191 NoVCPI:
192 movb $EXESTR(ERRvcpi), %dl
193 goabort:
194 jne abort
195 shll $8, %eax
196 cmpl $0x4D4D4500, %eax // [XQ]MME
197 movw $EXEADRS(CmdVCPI), %si
198 ChkVCPI:
199 jne NoVCPI
200 lodsb
201 shlw $8, %ax
202 je VersionVCPI
203 int $0x67
204 jmp ChkVCPI
206 CmdVCPI:
207 .byte 0x40 // status
208 .byte 0xDE // vcpi present ?
209 .byte 0x46 // version
210 .byte 0
212 VersionVCPI:
213 cmpb $0x40, %al // >= 4.0 ?
214 jb NoVCPI
215 movb $EXESTR(vm86modemsg), %dl
216 realmode:
217 call puts
218 movw EXEADRS(comstart), %ax // .com address
219 cld
220 movw $moveend-move, %cx
221 movw $EXEADRS(move), %si
222 movw $0xC000, %di
223 jmp move2
225 move:
226 movb $0x80, %ch
227 xchgw %ax, %si
228 movw $0x0100, %di
229 move2:
230 pushw %di
231 rep
232 movsb
233 ret
234 moveend:
236 .org 440
237 //////////////////////////// partition table //////////////////////////////////