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@13972
|
27 id:
|
pascal@13691
|
28 .word 0 // Overlay number
|
pascal@17496
|
29 fdcnt: // File address of relocation table
|
pascal@14257
|
30 .byte 0 // Bootstrap floppy sector count
|
pascal@13691
|
31
|
pascal@13691
|
32 /////////////////////// Master Boot Record code //////////////////////////////
|
pascal@13691
|
33
|
pascal@17496
|
34 start0:
|
pascal@17496
|
35 pushw %dx // restore %sp
|
pascal@13972
|
36 incw %bp // restore %bp
|
pascal@17496
|
37 xorw %bx, %bx
|
pascal@17496
|
38 movw %bx, %ds
|
pascal@17496
|
39 movb $0x7C, %bh
|
pascal@17496
|
40 pushw %bx // return address
|
pascal@13691
|
41 pushaw
|
pascal@13691
|
42 movw %sp, %bp
|
pascal@17496
|
43 pushw %es // save %es:%di
|
pascal@13972
|
44 cld
|
pascal@17496
|
45 sti
|
pascal@13972
|
46 pushw %ds
|
pascal@13972
|
47 popw %es
|
pascal@13691
|
48 call setreg
|
pascal@13691
|
49 rep
|
pascal@13691
|
50 movsw
|
pascal@13972
|
51 movw $0x80, %dx
|
pascal@13691
|
52 ljmp $0, $0x0600+start2
|
pascal@13972
|
53
|
pascal@13972
|
54 .org 60
|
pascal@14261
|
55 .long 0x0080 // PE header offset
|
pascal@13972
|
56 end_header:
|
pascal@13972
|
57 chksum:
|
pascal@13972
|
58 .word 0
|
pascal@13972
|
59 comstart:
|
pascal@13972
|
60 .word 0
|
pascal@13691
|
61
|
pascal@17496
|
62 .org 68
|
pascal@17496
|
63 readsectorX: // read isolinux boot sector
|
pascal@17496
|
64 movb $0xA5, %cl // patched by installer
|
pascal@13699
|
65 readsector1:
|
pascal@17496
|
66 andb $0x83, %dl // disk and floppy disk
|
pascal@13699
|
67 movw %cx, (%bx)
|
pascal@13699
|
68 incw %cx
|
pascal@13699
|
69 movw $0x201, %ax
|
pascal@13699
|
70 int $0x13
|
pascal@13691
|
71 setreg:
|
pascal@13699
|
72 movw %bx, %si
|
pascal@13691
|
73 movw $0x0600, %di
|
pascal@13691
|
74 movw $0x0100, %cx
|
pascal@13691
|
75 return:
|
pascal@13691
|
76 ret
|
pascal@17496
|
77 dxloop:
|
pascal@13691
|
78 start2:
|
pascal@17496
|
79 call readsector1 // look for the boot device
|
pascal@13691
|
80 repe
|
pascal@13691
|
81 cmpsw
|
pascal@13691
|
82 je dxfound
|
pascal@17496
|
83 movb $0, %cl // ch = 0
|
pascal@17496
|
84 addb $0x7D, %dl // try every hard disk
|
pascal@17496
|
85 jno dxloop
|
pascal@13691
|
86 dxfound:
|
pascal@17496
|
87 call readsectorX // read isolinux boot sector
|
pascal@13691
|
88 movw %dx, 10(%bp)
|
pascal@14267
|
89 call checkboot
|
pascal@17496
|
90 .asciz "No isolinux bs"
|
pascal@14267
|
91
|
pascal@14267
|
92 .org 0x0080
|
pascal@14267
|
93 ////////////////////////////// EXE/PE header //////////////////////////////////
|
pascal@14267
|
94
|
pascal@14267
|
95 .org 0x01A0
|
pascal@14267
|
96 checkboot:
|
pascal@17496
|
97 cmpw %cx, (%bx)
|
pascal@14267
|
98 popw %si
|
pascal@17496
|
99 jc error // read fail or no isohydrid boot sector
|
pascal@13691
|
100 popw %es
|
pascal@13691
|
101 popa
|
pascal@17496
|
102 putsret:
|
pascal@17496
|
103 ret
|
pascal@17496
|
104 putstrlp:
|
pascal@14267
|
105 movw $7, %bx
|
pascal@14267
|
106 movb $0xE, %ah
|
pascal@14267
|
107 int $0x10
|
pascal@17496
|
108 error:
|
pascal@17496
|
109 lodsb
|
pascal@17496
|
110 cmp $1, %al
|
pascal@17496
|
111 jg putstrlp
|
pascal@17496
|
112 jz putsret
|
pascal@17496
|
113 putstr:
|
pascal@17496
|
114 movb $0x80, %ah
|
pascal@17496
|
115 xchgw %ax, %si
|
pascal@17496
|
116 jnc error
|
pascal@14267
|
117 halt:
|
pascal@14267
|
118 hlt
|
pascal@14267
|
119 jmp halt
|
pascal@14267
|
120 .org 0x01BE
|
pascal@14261
|
121
|
pascal@17496
|
122 .org 0x7F10
|
pascal@13691
|
123 ////////////////////////////// DOS EXE code ///////////////////////////////////
|
pascal@13691
|
124
|
pascal@13729
|
125 exestart:
|
pascal@13699
|
126 cld
|
pascal@13697
|
127 movw $0x100, %si
|
pascal@17461
|
128 movw -127(%si), %ax
|
pascal@17473
|
129 cmpb $0x2F, %al
|
pascal@17473
|
130 je ishelp
|
pascal@17473
|
131 cmpw $0x2F20, %ax
|
pascal@17473
|
132 ishelp:
|
pascal@17473
|
133 movw $0x3000+EXESTR(help), %ax
|
pascal@13729
|
134 cwd // clear dx
|
pascal@17454
|
135 pushw %dx // dos exit()
|
pascal@17454
|
136 je abort
|
pascal@17454
|
137 int $0x21 // get DOS version
|
pascal@17160
|
138 cmpb $3, %al
|
pascal@17160
|
139 movb $EXESTR(noDOS3), %al
|
pascal@17160
|
140 jb abort
|
pascal@14261
|
141 movw $(EXELOC(0x8000))/2, %cx
|
pascal@13697
|
142 chklp:
|
pascal@13697
|
143 lodsw
|
pascal@13697
|
144 addw %ax, %dx
|
pascal@13697
|
145 loop chklp
|
pascal@17160
|
146 chked:
|
pascal@17160
|
147 movw $0x1000+EXESTR(chkerr), %ax
|
pascal@17160
|
148 je tst386 // dx == 0 ?
|
pascal@13691
|
149 abort:
|
pascal@13691
|
150 puts:
|
pascal@17496
|
151 clc
|
pascal@17496
|
152 jmp putstr
|
pascal@13691
|
153
|
pascal@17160
|
154 tst386:
|
pascal@17160
|
155 pushfw // save flags
|
pascal@17160
|
156 // bits 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
pascal@17160
|
157 // flags 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF
|
pascal@17160
|
158 // movb $0x10, %ah
|
pascal@17160
|
159 pushw %ax
|
pascal@17160
|
160 popfw // < 286 : flags[12..15] are forced 1
|
pascal@17160
|
161 pushfw // = 286 : flags[12..15] are forced 0
|
pascal@17160
|
162 popw %bx // > 286 : only flags[15] is forced 0
|
pascal@17454
|
163 popfw // restore flags (IOPL)
|
pascal@17160
|
164 addb %ah, %bh // test F0 and 00 cases
|
pascal@17160
|
165 cmpb %ah, %bh
|
pascal@17160
|
166 movb $EXESTR(no386), %al
|
pascal@17160
|
167 #undef NEED386
|
pascal@17160
|
168 #ifdef NEED386
|
pascal@17160
|
169 jbe abort // C=8086/80186, Z=80286
|
pascal@17160
|
170 #else
|
pascal@17160
|
171 jbe is86 // C=8086/80186, Z=80286
|
pascal@17160
|
172 #endif
|
pascal@13691
|
173 is386:
|
pascal@17160
|
174 smsww %ax // not privileged
|
pascal@13691
|
175 andb $1, %al
|
pascal@13691
|
176 jne tstvcpi
|
pascal@17160
|
177 movl %cr0, %eax // privileged
|
pascal@14150
|
178 incl %eax
|
pascal@13713
|
179 movb $EXESTR(rmPaging), %al
|
pascal@14150
|
180 js abort
|
pascal@13713
|
181 movb $EXESTR(realmodemsg), %al
|
pascal@13691
|
182 realmode:
|
pascal@17160
|
183 is86:
|
pascal@13691
|
184 call puts
|
pascal@13691
|
185 movw $0x0100, %di
|
pascal@14261
|
186 movw comstart-end_header(%di), %si // .com address
|
pascal@13691
|
187 pushw %di
|
pascal@17473
|
188 movb $0x7C/2, %ch // 31K-31.5K, > com length
|
pascal@13691
|
189 rep
|
pascal@17473
|
190 movsw
|
pascal@13691
|
191 ret
|
pascal@13713
|
192
|
pascal@13713
|
193 VersionVCPI:
|
pascal@13713
|
194 cmpb $0x40, %dl // >= 4.0 ?
|
pascal@13713
|
195 jb NoVCPI
|
pascal@17496
|
196 xchgw %ax, %si // movb $EXESTR(vm86modemsg), %al
|
pascal@13713
|
197 jmp realmode
|
pascal@13713
|
198 tstvcpi:
|
pascal@13713
|
199 pushw %ds
|
pascal@17160
|
200 movw %dx, %ds // %dx = 0
|
pascal@13713
|
201 movw 0x67*4+2, %ds
|
pascal@13713
|
202 movw $10, %si
|
pascal@17473
|
203 lodsw
|
pascal@13713
|
204 xorw $0x4D45, %ax // EM(MX) or EM(MQ)
|
pascal@17473
|
205 lodsw
|
pascal@17473
|
206 lodsw
|
pascal@13713
|
207 popw %ds
|
pascal@14150
|
208 jne NoVCPI
|
pascal@17473
|
209 xorw $0x5858, %ax // XX(X0)
|
pascal@13713
|
210 movw $EXEADRS(CmdVCPI), %si
|
pascal@13713
|
211 ChkVCPI:
|
pascal@13713
|
212 NoVCPI:
|
pascal@13713
|
213 movb $EXESTR(ERRvcpi), %al
|
pascal@13713
|
214 jne abort
|
pascal@13713
|
215 lodsb
|
pascal@13713
|
216 shlw $8, %ax
|
pascal@13713
|
217 je VersionVCPI
|
pascal@13713
|
218 int $0x67
|
pascal@13713
|
219 testb %ah, %ah
|
pascal@14150
|
220 xchgw %ax, %dx
|
pascal@13713
|
221 jmp ChkVCPI
|
pascal@13713
|
222 CmdVCPI:
|
pascal@13713
|
223 .byte 0x40 // status
|
pascal@13713
|
224 .byte 0xDE // vcpi present ?
|
pascal@13713
|
225 .byte 0x46 // version
|
pascal@13713
|
226 .byte 0
|
pascal@13713
|
227
|
pascal@17496
|
228 vm86modemsg:
|
pascal@17473
|
229 // --------------- Must be in 7F40 7FFF range ------------------------
|
pascal@17496
|
230 .ascii "vm" // vm86
|
pascal@17496
|
231 .byte EXESTR(_86)
|
pascal@14261
|
232 ERRvcpi:
|
pascal@17496
|
233 .ascii "No VCPI-4.0/EMM" // No VCPI-4.0/EMM386
|
pascal@17496
|
234 .byte EXESTR(_386)
|
pascal@17496
|
235 noDOS3:
|
pascal@17496
|
236 .ascii "No DOS 3" // No DOS 3
|
pascal@17496
|
237 .byte EXESTR(eol)
|
pascal@14261
|
238 chkerr:
|
pascal@17496
|
239 .ascii "Broken c" // Broken code
|
pascal@17496
|
240 .byte EXESTR(ode)
|
pascal@14261
|
241 rmPaging:
|
pascal@17496
|
242 .ascii "Un" // Unreal mode
|
pascal@14261
|
243 realmodemsg:
|
pascal@17496
|
244 .ascii "real m" // real mode
|
pascal@17473
|
245 // --------------- Must be in 7FC0 7FFF range ------------------------
|
pascal@17496
|
246 ode:
|
pascal@17496
|
247 .ascii "od"
|
pascal@14261
|
248 eeol:
|
pascal@14261
|
249 .ascii "e"
|
pascal@14261
|
250 .byte EXESTR(eol)
|
pascal@17496
|
251 no386:
|
pascal@17496
|
252 .ascii "No " // No 386
|
pascal@17496
|
253 _386:
|
pascal@17496
|
254 .ascii "3"
|
pascal@17496
|
255 _86:
|
pascal@17496
|
256 .ascii "86"
|
pascal@17496
|
257 .byte EXESTR(eol)
|
pascal@17473
|
258 help:
|
pascal@17496
|
259 .ascii "SliTaz boot loader" // SliTaz boot loader
|
pascal@17473
|
260 eol:
|
pascal@17496
|
261 .ascii "\r\n"
|
pascal@17496
|
262 .byte 1
|
pascal@14261
|
263
|
pascal@17496
|
264 .space 16,0 // ISO md5
|
pascal@14261
|
265 .org 0x8000
|
pascal@14261
|
266 ////////////////////////// ISO9660 header /////////////////////////////////////
|