rev |
line source |
pascal@104
|
1 #define TIMEOUT autostart after 5 seconds
|
pascal@104
|
2 #define CHECK_FILES add 'Check media' entry
|
pascal@104
|
3
|
pascal@104
|
4 .arch i8086
|
pascal@104
|
5 .code16
|
pascal@104
|
6 .org 0
|
pascal@104
|
7 start:
|
pascal@104
|
8 // stack segment setup
|
pascal@104
|
9 cld
|
pascal@104
|
10 movw $0x9000, %di
|
pascal@104
|
11 pushw %di
|
pascal@104
|
12 popw %ss
|
pascal@104
|
13 movw %di, %sp
|
pascal@104
|
14
|
pascal@104
|
15 // patch disk parameter table
|
pascal@118
|
16 xorw %cx, %cx
|
pascal@130
|
17 pushw %cx // bootloader may want to pull 0
|
pascal@104
|
18 movw $0x78, %bx
|
pascal@118
|
19 movw %cx, %ds
|
pascal@182
|
20 ldsw (%bx), %si // %ds:0x78 is parameter table address
|
pascal@104
|
21 pushw %ss
|
pascal@104
|
22 popw %es
|
pascal@182
|
23 movb $6, %cl // copy 12 bytes
|
pascal@104
|
24 pushw %di
|
pascal@104
|
25 rep
|
pascal@104
|
26 movsw
|
pascal@182
|
27 movb $63, %es:4-12(%di) // patch max sector count
|
pascal@104
|
28 movw %cx, %ds
|
pascal@104
|
29 popw (%bx)
|
pascal@182
|
30 movw %es, 2(%bx) // update parameter table address
|
pascal@104
|
31
|
pascal@104
|
32 // data segments setup
|
pascal@104
|
33 movw $0x7C0, %ax
|
pascal@104
|
34 pushw %ax
|
pascal@104
|
35 popw %ds
|
pascal@104
|
36 pushw %ds
|
pascal@104
|
37 popw %es
|
pascal@104
|
38
|
pascal@104
|
39 // main loop
|
pascal@104
|
40 menustart:
|
pascal@104
|
41 xorw %bp, %bp
|
pascal@104
|
42 menudown:
|
pascal@104
|
43 incw %bp
|
pascal@104
|
44 menustartlp:
|
pascal@104
|
45 movw $3, %ax
|
pascal@182
|
46 int $0x10 // clear screen
|
pascal@104
|
47 movb $1, %ah
|
pascal@104
|
48 movw $0x1000, %cx
|
pascal@182
|
49 int $0x10 // clear cursor
|
pascal@104
|
50 movw $menu, %si
|
pascal@104
|
51 call puts
|
pascal@104
|
52 call putcr
|
pascal@104
|
53 movw %bp, %cx
|
pascal@104
|
54 menulp:
|
pascal@182
|
55
|
pascal@151
|
56 .macro entry
|
pascal@182
|
57 movb $' ', %bl // not selected by default
|
pascal@104
|
58 lodsw
|
pascal@104
|
59 loop notcur
|
pascal@104
|
60 xchgw %ax, %di
|
pascal@182
|
61 movb $'>', %bl // selected when cx = 0
|
pascal@104
|
62 notcur:
|
pascal@151
|
63 xchgw %ax, %bx
|
pascal@151
|
64 .endm
|
pascal@182
|
65
|
pascal@104
|
66 #ifdef CHECK_FILES
|
pascal@151
|
67 call putentry
|
pascal@182
|
68 lodsw // CRC16
|
pascal@182
|
69 lodsw // sector count
|
pascal@151
|
70 #else
|
pascal@151
|
71 entry
|
pascal@151
|
72 call putcs
|
pascal@104
|
73 #endif
|
pascal@182
|
74 cmpw $0, (%si) // end of list ?
|
pascal@118
|
75 jne menulp
|
pascal@104
|
76 #ifdef CHECK_FILES
|
pascal@151
|
77 movw $msgcrc-2, %si
|
pascal@151
|
78 call putentry
|
pascal@104
|
79 #endif
|
pascal@104
|
80 menustartz:
|
pascal@182
|
81
|
pascal@151
|
82 .macro waitkbdcode
|
pascal@104
|
83 #ifdef TIMEOUT
|
pascal@104
|
84 clock = 0x46C
|
pascal@104
|
85 wait:
|
pascal@104
|
86 wait4key:
|
pascal@104
|
87 pushw %ds
|
pascal@130
|
88 xorw %ax, %ax
|
pascal@104
|
89 movw %ax, %ds
|
pascal@104
|
90 movw $clock, %si
|
pascal@104
|
91 #define DELAY 5
|
pascal@104
|
92 movb $257-(DELAY*182)/10, (%si)
|
pascal@104
|
93 waitkbd:
|
pascal@104
|
94 movw $0x10D, %ax // test keyboard, timeout => CR
|
pascal@104
|
95 cmpb (%si), %ah
|
pascal@151
|
96 clock_patch:
|
pascal@104
|
97 je waitdone
|
pascal@104
|
98 int $0x16
|
pascal@104
|
99 jz waitkbd
|
pascal@104
|
100 cbw
|
pascal@104
|
101 int $0x16 // eat char
|
pascal@151
|
102 movb $0xA8, clock_patch+0x7C00 // disable timeout
|
pascal@104
|
103 waitdone:
|
pascal@104
|
104 popw %ds
|
pascal@104
|
105 #else
|
pascal@104
|
106 xorb %ax, %ax
|
pascal@104
|
107 int $0x16
|
pascal@104
|
108 #endif
|
pascal@151
|
109 .endm
|
pascal@182
|
110
|
pascal@151
|
111 #ifdef CHECK_FILES
|
pascal@151
|
112 call wait4kbd
|
pascal@151
|
113 #else
|
pascal@151
|
114 waitkbdcode
|
pascal@151
|
115 #endif
|
pascal@104
|
116 cmpb $0x0D, %al // CR ?
|
pascal@104
|
117 je doit
|
pascal@104
|
118 cmpb $0x48, %ah // UP ?
|
pascal@104
|
119 jne isitdn
|
pascal@104
|
120 decw %bp
|
pascal@104
|
121 jz menudown
|
pascal@104
|
122 isitdn:
|
pascal@104
|
123 incw %cx
|
pascal@104
|
124 cmpb $0x50, %ah // DN ?
|
pascal@104
|
125 loope menudown
|
pascal@104
|
126 jmp menustartlp
|
pascal@104
|
127
|
pascal@151
|
128 #ifdef CHECK_FILES
|
pascal@151
|
129 toeos:
|
pascal@151
|
130 lodsb
|
pascal@151
|
131 orb %al, %al
|
pascal@151
|
132 jnz toeos
|
pascal@151
|
133 lodsw // crc, count
|
pascal@151
|
134 lodsw
|
pascal@151
|
135 cmpw $0, (%si)
|
pascal@151
|
136 jne nextchk
|
pascal@151
|
137 call wait4kbd
|
pascal@151
|
138 jmp start
|
pascal@151
|
139 #endif
|
pascal@151
|
140
|
pascal@104
|
141 .macro tochs // %di -> %cx, %dx & %bp=sector max
|
pascal@104
|
142 movw $64, %cx
|
pascal@104
|
143 sectlp:
|
pascal@104
|
144 movb %ch, %dh
|
pascal@104
|
145 decw %cx
|
pascal@151
|
146 #define BUFFER 0x200
|
pascal@151
|
147 #ifdef CHECK_FILES
|
pascal@151
|
148 call readsector
|
pascal@151
|
149 #else
|
pascal@151
|
150 movw $BUFFER, %bx
|
pascal@151
|
151 movw $0x201, %ax
|
pascal@104
|
152 int $0x13
|
pascal@151
|
153 #endif
|
pascal@104
|
154 jc sectlp
|
pascal@104
|
155 movw %cx, %bp
|
pascal@104
|
156 movw %di, %ax
|
pascal@104
|
157 div %cl // 32 Mb & 255 tracks max
|
pascal@104
|
158 movb %ah, %cl // sector
|
pascal@104
|
159 incb %cl
|
pascal@104
|
160 shrb $1, %al // C = head, AL = cylinder
|
pascal@104
|
161 adcb %dh, %dh
|
pascal@104
|
162 movb %al, %ch
|
pascal@104
|
163 .endm
|
pascal@104
|
164
|
pascal@104
|
165 doit:
|
pascal@104
|
166 #ifdef CHECK_FILES
|
pascal@104
|
167 jcxz docrc
|
pascal@104
|
168 call getsectors
|
pascal@151
|
169 call readsector2
|
pascal@104
|
170 #else
|
pascal@104
|
171 tochs // %di -> %cx, %dx & %bp=sector max
|
pascal@104
|
172 movw $0x201, %ax
|
pascal@104
|
173 int $0x13
|
pascal@151
|
174 #endif
|
pascal@104
|
175 jc menustart
|
pascal@104
|
176
|
pascal@104
|
177 // scan boot code
|
pascal@104
|
178 scanboot:
|
pascal@151
|
179 incw %bx
|
pascal@151
|
180 cmpw $0x5897, -3(%bx) // xchgw %ax, %di; popw %ax
|
pascal@182
|
181 jne nofound
|
pascal@151
|
182 cmpw $0xE841, -1(%bx) // incw %cx ; call ...
|
pascal@182
|
183 je found
|
pascal@182
|
184 nofound:
|
pascal@182
|
185 orb %bl, %bl
|
pascal@182
|
186 jnz scanboot
|
pascal@182
|
187 decb %bh
|
pascal@118
|
188 found:
|
pascal@104
|
189 pushw %ds
|
pascal@151
|
190 pushw %bx
|
pascal@182
|
191 // cli
|
pascal@182
|
192 // movb 0x1F1+BUFFER, %al // setup size
|
pascal@104
|
193 pushw %ss
|
pascal@104
|
194 popw %ds
|
pascal@104
|
195 pushw %ss
|
pascal@104
|
196 popw %es
|
pascal@104
|
197 xorw %di, %di
|
pascal@104
|
198 xchgw %ax, %di // ax = limits = 0
|
pascal@104
|
199 xorw %bx, %bx // to %es:%bx = 9000:0000
|
pascal@104
|
200 incw %di // Add bootsector, Clear Z
|
pascal@104
|
201 lret // Read from %dx, %cx
|
pascal@104
|
202
|
pascal@104
|
203 #ifdef CHECK_FILES
|
pascal@104
|
204 docrc:
|
pascal@104
|
205 movw $menu, %si
|
pascal@104
|
206 skiptitle:
|
pascal@104
|
207 lodsb
|
pascal@104
|
208 orb %al, %al
|
pascal@104
|
209 jnz skiptitle
|
pascal@151
|
210 nextchklp:
|
pascal@151
|
211 pushw %si // start of menu
|
pascal@104
|
212 nextchk:
|
pascal@104
|
213 lodsw // sector offset
|
pascal@151
|
214 cmpw %ax, %di // next sector offset
|
pascal@151
|
215 jne toeos
|
pascal@104
|
216 call puts // menu entry
|
pascal@151
|
217 call getsectors // %di -> %cx, %dx & %bp=sector max
|
pascal@104
|
218 lodsw
|
pascal@151
|
219 addw (%si), %di
|
pascal@151
|
220 pushw %di // next sector offset
|
pascal@104
|
221 xchgw %ax, %di // crc
|
pascal@104
|
222 lodsw // sector count
|
pascal@104
|
223 xchgw %ax, %si
|
pascal@104
|
224 chksector:
|
pascal@151
|
225 call readsector
|
pascal@151
|
226 jc chkfail
|
pascal@151
|
227 chksectorz:
|
pascal@104
|
228 subw (%bx), %di
|
pascal@104
|
229 incw %bx
|
pascal@104
|
230 incw %bx
|
pascal@104
|
231 cmpb $4, %bh
|
pascal@151
|
232 jne chksectorz
|
pascal@104
|
233 decw %si
|
pascal@104
|
234 je chkend
|
pascal@104
|
235 movw %bp, %ax
|
pascal@104
|
236 incw %cx
|
pascal@104
|
237 cmpb %al, %cl
|
pascal@104
|
238 jle rdit
|
pascal@104
|
239 movb $1, %cl
|
pascal@104
|
240 xorb %cl, %dh
|
pascal@104
|
241 jne rdit
|
pascal@104
|
242 incb %ch
|
pascal@151
|
243 cmp $80, %ch
|
pascal@151
|
244 jb rdit
|
pascal@151
|
245 push %si
|
pascal@151
|
246 mov $msgnext, %si
|
pascal@151
|
247 call puts
|
pascal@151
|
248 call wait4kbd
|
pascal@151
|
249 pop %si
|
pascal@151
|
250 mov $0, %ch
|
pascal@104
|
251 rdit:
|
pascal@151
|
252 jmp chksector
|
pascal@104
|
253 chkend:
|
pascal@104
|
254 movw $msgok, %si
|
pascal@104
|
255 orw %di, %di
|
pascal@104
|
256 je chkok
|
pascal@104
|
257 chkfail:
|
pascal@104
|
258 movw $msgko, %si
|
pascal@104
|
259 chkok:
|
pascal@104
|
260 call puts
|
pascal@151
|
261 popw %di // next sector offset
|
pascal@151
|
262 popw %si // start of menu
|
pascal@151
|
263 jmp nextchklp
|
pascal@151
|
264
|
pascal@151
|
265 readsector:
|
pascal@151
|
266 movw $BUFFER, %bx
|
pascal@151
|
267 readsector2:
|
pascal@151
|
268 movw $0x201, %ax
|
pascal@151
|
269 int $0x13
|
pascal@151
|
270 ret
|
pascal@104
|
271
|
pascal@104
|
272 getsectors:
|
pascal@104
|
273 tochs // %di -> %cx, %dx & %bp=sector max
|
pascal@104
|
274 ret
|
pascal@151
|
275
|
pascal@151
|
276 wait4kbd:
|
pascal@151
|
277 waitkbdcode
|
pascal@151
|
278 ret
|
pascal@151
|
279
|
pascal@151
|
280 putentry:
|
pascal@151
|
281 entry
|
pascal@151
|
282 jmp putcs
|
pascal@104
|
283 #endif
|
pascal@104
|
284
|
pascal@130
|
285 puts:
|
pascal@130
|
286 lodsb
|
pascal@151
|
287 cmpb $2, %al
|
pascal@151
|
288 jnc putcs
|
pascal@104
|
289 putcr:
|
pascal@104
|
290 movb $10, %al
|
pascal@104
|
291 putlf:
|
pascal@104
|
292 xorb $10^13, %al
|
pascal@104
|
293 putcs:
|
pascal@104
|
294 movw $7, %bx
|
pascal@104
|
295 movb $0xE, %ah
|
pascal@104
|
296 int $0x10
|
pascal@104
|
297 cmpb $13, %al
|
pascal@104
|
298 jz putlf
|
pascal@130
|
299 jnc puts
|
pascal@104
|
300 ret
|
pascal@104
|
301
|
pascal@104
|
302 #ifdef CHECK_FILES
|
pascal@104
|
303 msgok:
|
pascal@104
|
304 .asciz " OK"
|
pascal@104
|
305 msgko:
|
pascal@151
|
306 .ascii " Broken"
|
pascal@151
|
307 .word 1 // next sector offset
|
pascal@104
|
308 msgcrc:
|
pascal@104
|
309 .asciz "Check media" // used to detect CHECK_FILES
|
pascal@104
|
310 #endif
|
pascal@104
|
311 menu:
|
pascal@104
|
312
|
pascal@104
|
313 .org 0x1F1
|
pascal@104
|
314 setupsz:
|
pascal@104
|
315 .byte 0
|
pascal@104
|
316 rootflags:
|
pascal@104
|
317 .word menu
|
pascal@104
|
318 syssz:
|
pascal@104
|
319 .long 0 // updated by bundle
|
pascal@104
|
320 ramsize:
|
pascal@151
|
321 #ifdef CHECK_FILES
|
pascal@151
|
322 msgnext:
|
pascal@151
|
323 .asciz "Next!"
|
pascal@151
|
324 #else
|
pascal@104
|
325 .ascii "SliTaz"
|
pascal@151
|
326 #endif
|
pascal@104
|
327 // .word 0
|
pascal@104
|
328 //vidmode:
|
pascal@104
|
329 // .word 0
|
pascal@104
|
330 //rootdev:
|
pascal@104
|
331 // .word 0
|
pascal@104
|
332 bootflag:
|
pascal@104
|
333 .word 0xAA55
|