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