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@13697
|
33 .word 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 call setreg
|
pascal@13691
|
48 rep
|
pascal@13691
|
49 movsw
|
pascal@13691
|
50 ljmp $0, $0x0600+start2
|
pascal@13691
|
51
|
pascal@13699
|
52 readsector2:
|
pascal@13699
|
53 incw %cx
|
pascal@13699
|
54 readsector1:
|
pascal@13699
|
55 movw %cx, (%bx)
|
pascal@13699
|
56 incw %cx
|
pascal@13699
|
57 movw $0x201, %ax
|
pascal@13699
|
58 int $0x13
|
pascal@13691
|
59 setreg:
|
pascal@13691
|
60 cld
|
pascal@13699
|
61 xorw %bx, %bx // Clear C
|
pascal@13699
|
62 movw %bx, %ds
|
pascal@13699
|
63 movw %bx, %es
|
pascal@13699
|
64 movb $0x7C, %bh
|
pascal@13699
|
65 movw %bx, %si
|
pascal@13691
|
66 movw $0x0600, %di
|
pascal@13691
|
67 movw $0x0100, %cx
|
pascal@13691
|
68 return:
|
pascal@13691
|
69 ret
|
pascal@13691
|
70 start2:
|
pascal@13691
|
71 movw $0x80, %dx
|
pascal@13691
|
72 dxloop:
|
pascal@13699
|
73 call readsector1
|
pascal@13691
|
74 repe
|
pascal@13691
|
75 cmpsw
|
pascal@13691
|
76 je dxfound
|
pascal@13691
|
77 next:
|
pascal@13699
|
78 xorw %cx, %cx
|
pascal@13699
|
79 xchgw %ax, %dx
|
pascal@13699
|
80 addb $0x7D, %al // try every hard disk
|
pascal@13699
|
81 andb $0x83, %al // and floppy disk
|
pascal@13699
|
82 cmpb $0x80, %al
|
pascal@13699
|
83 xchgw %ax, %dx
|
pascal@13691
|
84 jnz dxloop
|
pascal@13691
|
85 fail:
|
pascal@13691
|
86 int $0x19
|
pascal@13691
|
87 dxfound:
|
pascal@13691
|
88 movw %dx, 10(%bp)
|
pascal@13699
|
89 call readsector2
|
pascal@13699
|
90 lodsw
|
pascal@13699
|
91 decw %ax
|
pascal@13699
|
92 jz fail // read fail or not isohydrid
|
pascal@13691
|
93 popw %es
|
pascal@13691
|
94 popw %ds
|
pascal@13691
|
95 popf
|
pascal@13691
|
96 popa
|
pascal@13691
|
97 ljmp $0, $0x7C00
|
pascal@13691
|
98
|
pascal@13691
|
99 ////////////////////////////// DOS EXE code ///////////////////////////////////
|
pascal@13691
|
100
|
pascal@13697
|
101 eol:
|
pascal@13697
|
102 .ascii ".\r\n$"
|
pascal@13691
|
103 no386:
|
pascal@13691
|
104 .ascii "No 386+$"
|
pascal@13691
|
105 noDOS3:
|
pascal@13691
|
106 .ascii "No DOS 3.0+$"
|
pascal@13691
|
107 rmPaging:
|
pascal@13697
|
108 .ascii "Broken paging$"
|
pascal@13691
|
109 ERRvcpi:
|
pascal@13699
|
110 .ascii "No EMM386/VCPI 4.0+$"
|
pascal@13691
|
111 chkerr:
|
pascal@13699
|
112 .ascii "Broken ISO file$"
|
pascal@13691
|
113 realmodemsg:
|
pascal@13697
|
114 .ascii "Real mode$"
|
pascal@13691
|
115 vm86modemsg:
|
pascal@13697
|
116 .ascii "VM86 mode$"
|
pascal@13691
|
117 help:
|
pascal@13699
|
118 .ascii "SliTaz GNU/Linux boot loader$"
|
pascal@13697
|
119
|
pascal@13691
|
120 fixseg:
|
pascal@13699
|
121 cld
|
pascal@13691
|
122 movb $EXESTR(help), %dl
|
pascal@13697
|
123 movw $0x100, %si
|
pascal@13697
|
124 cmpw $0x3F2F, -126(%si) # /?
|
pascal@13691
|
125 je abort
|
pascal@13697
|
126 movw (%si), %cx
|
pascal@13697
|
127 jcxz skip
|
pascal@13697
|
128 xorw %dx, %dx
|
pascal@13697
|
129 movw $0x7FE0/2, %cx
|
pascal@13697
|
130 chklp:
|
pascal@13697
|
131 lodsw
|
pascal@13697
|
132 addw %ax, %dx
|
pascal@13697
|
133 loop chklp
|
pascal@13697
|
134 orw %dx, %dx
|
pascal@13697
|
135 movb $EXESTR(chkerr), %dl
|
pascal@13697
|
136 jne abort
|
pascal@13697
|
137 skip:
|
pascal@13691
|
138 pushf
|
pascal@13691
|
139 popw %ax
|
pascal@13699
|
140 movw $0xF0F0, %dx
|
pascal@13699
|
141 orb %ah, %dh
|
pascal@13691
|
142 andb $0xF, %ah
|
pascal@13691
|
143 pushw %ax
|
pascal@13691
|
144 popf
|
pascal@13691
|
145 pushf
|
pascal@13691
|
146 popw %ax
|
pascal@13699
|
147 andb %dl, %ah
|
pascal@13699
|
148 cmp %dl, %ah
|
pascal@13691
|
149 je NotSupported // 8086 family
|
pascal@13699
|
150 pushw %dx
|
pascal@13691
|
151 popf
|
pascal@13691
|
152 pushf
|
pascal@13691
|
153 popw %ax
|
pascal@13699
|
154 andb %dl, %ah
|
pascal@13691
|
155 jnz is386 // 80286 family
|
pascal@13691
|
156 NotSupported:
|
pascal@13691
|
157 movb $EXESTR(no386), %dl
|
pascal@13691
|
158 abort:
|
pascal@13691
|
159 puts:
|
pascal@13691
|
160 movb $1, %dh
|
pascal@13697
|
161 call puts2
|
pascal@13697
|
162 movw $EXEADRS(eol), %dx
|
pascal@13697
|
163 puts2:
|
pascal@13691
|
164 movb $9, %ah
|
pascal@13691
|
165 int $0x21
|
pascal@13691
|
166 ret
|
pascal@13691
|
167
|
pascal@13691
|
168 is386:
|
pascal@13697
|
169 movl %cr0, %eax
|
pascal@13691
|
170 andb $1, %al
|
pascal@13691
|
171 jne tstvcpi
|
pascal@13691
|
172 movb $EXESTR(rmPaging), %dl
|
pascal@13691
|
173 shll $1, %eax
|
pascal@13699
|
174 cabort:
|
pascal@13691
|
175 jc abort
|
pascal@13697
|
176 movb $EXESTR(realmodemsg), %dl
|
pascal@13691
|
177 jmp realmode
|
pascal@13691
|
178
|
pascal@13691
|
179 tstvcpi:
|
pascal@13691
|
180 pushw %ds
|
pascal@13699
|
181 movw %cx, %ds // %cx = 0
|
pascal@13691
|
182 movw 0x67*4+2, %ds
|
pascal@13691
|
183 std
|
pascal@13691
|
184 movw $14, %si
|
pascal@13691
|
185 lodsl
|
pascal@13691
|
186 cmpl $0x30585858, %eax // 0XXX
|
pascal@13691
|
187 lodsl
|
pascal@13691
|
188 cld
|
pascal@13691
|
189 popw %ds
|
pascal@13691
|
190 NoVCPI:
|
pascal@13691
|
191 movb $EXESTR(ERRvcpi), %dl
|
pascal@13691
|
192 jne abort
|
pascal@13691
|
193 shll $8, %eax
|
pascal@13691
|
194 cmpl $0x4D4D4500, %eax // [XQ]MME
|
pascal@13691
|
195 movw $EXEADRS(CmdVCPI), %si
|
pascal@13691
|
196 ChkVCPI:
|
pascal@13691
|
197 jne NoVCPI
|
pascal@13691
|
198 lodsb
|
pascal@13691
|
199 shlw $8, %ax
|
pascal@13691
|
200 je VersionVCPI
|
pascal@13691
|
201 int $0x67
|
pascal@13691
|
202 jmp ChkVCPI
|
pascal@13697
|
203
|
pascal@13691
|
204 CmdVCPI:
|
pascal@13691
|
205 .byte 0x40 // status
|
pascal@13691
|
206 .byte 0xDE // vcpi present ?
|
pascal@13691
|
207 .byte 0x46 // version
|
pascal@13691
|
208 .byte 0
|
pascal@13697
|
209
|
pascal@13691
|
210 VersionVCPI:
|
pascal@13691
|
211 cmpb $0x40, %al // >= 4.0 ?
|
pascal@13691
|
212 jb NoVCPI
|
pascal@13697
|
213 movb $EXESTR(vm86modemsg), %dl
|
pascal@13691
|
214 realmode:
|
pascal@13691
|
215 call puts
|
pascal@13699
|
216 movb $0x30, %ah
|
pascal@13699
|
217 int $0x21
|
pascal@13699
|
218 cmpb $3, %al
|
pascal@13699
|
219 movb $EXESTR(noDOS3), %dl
|
pascal@13699
|
220 jb cabort
|
pascal@13691
|
221 movw EXEADRS(comstart), %ax // .com address
|
pascal@13691
|
222 movw $moveend-move, %cx
|
pascal@13691
|
223 movw $EXEADRS(move), %si
|
pascal@13691
|
224 movw $0xC000, %di
|
pascal@13691
|
225 jmp move2
|
pascal@13691
|
226
|
pascal@13691
|
227 move:
|
pascal@13691
|
228 movb $0x80, %ch
|
pascal@13691
|
229 xchgw %ax, %si
|
pascal@13691
|
230 movw $0x0100, %di
|
pascal@13691
|
231 move2:
|
pascal@13691
|
232 pushw %di
|
pascal@13691
|
233 rep
|
pascal@13691
|
234 movsb
|
pascal@13691
|
235 ret
|
pascal@13691
|
236 moveend:
|
pascal@13691
|
237
|
pascal@13691
|
238 .org 440
|
pascal@13691
|
239 //////////////////////////// partition table //////////////////////////////////
|
pascal@13691
|
240
|