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@183
|
188 jmp boot
|
pascal@118
|
189 found:
|
pascal@183
|
190 cli
|
pascal@183
|
191 movb 0x1F1+BUFFER, %al // setup size
|
pascal@183
|
192 boot:
|
pascal@104
|
193 pushw %ds
|
pascal@151
|
194 pushw %bx
|
pascal@104
|
195 pushw %ss
|
pascal@104
|
196 popw %ds
|
pascal@104
|
197 pushw %ss
|
pascal@104
|
198 popw %es
|
pascal@104
|
199 xorw %di, %di
|
pascal@104
|
200 xchgw %ax, %di // ax = limits = 0
|
pascal@104
|
201 xorw %bx, %bx // to %es:%bx = 9000:0000
|
pascal@104
|
202 incw %di // Add bootsector, Clear Z
|
pascal@104
|
203 lret // Read from %dx, %cx
|
pascal@104
|
204
|
pascal@104
|
205 #ifdef CHECK_FILES
|
pascal@104
|
206 docrc:
|
pascal@104
|
207 movw $menu, %si
|
pascal@104
|
208 skiptitle:
|
pascal@104
|
209 lodsb
|
pascal@104
|
210 orb %al, %al
|
pascal@104
|
211 jnz skiptitle
|
pascal@151
|
212 nextchklp:
|
pascal@151
|
213 pushw %si // start of menu
|
pascal@104
|
214 nextchk:
|
pascal@104
|
215 lodsw // sector offset
|
pascal@151
|
216 cmpw %ax, %di // next sector offset
|
pascal@151
|
217 jne toeos
|
pascal@104
|
218 call puts // menu entry
|
pascal@151
|
219 call getsectors // %di -> %cx, %dx & %bp=sector max
|
pascal@104
|
220 lodsw
|
pascal@151
|
221 addw (%si), %di
|
pascal@151
|
222 pushw %di // next sector offset
|
pascal@104
|
223 xchgw %ax, %di // crc
|
pascal@104
|
224 lodsw // sector count
|
pascal@104
|
225 xchgw %ax, %si
|
pascal@104
|
226 chksector:
|
pascal@151
|
227 call readsector
|
pascal@151
|
228 jc chkfail
|
pascal@151
|
229 chksectorz:
|
pascal@104
|
230 subw (%bx), %di
|
pascal@104
|
231 incw %bx
|
pascal@104
|
232 incw %bx
|
pascal@104
|
233 cmpb $4, %bh
|
pascal@151
|
234 jne chksectorz
|
pascal@104
|
235 decw %si
|
pascal@104
|
236 je chkend
|
pascal@104
|
237 movw %bp, %ax
|
pascal@104
|
238 incw %cx
|
pascal@104
|
239 cmpb %al, %cl
|
pascal@104
|
240 jle rdit
|
pascal@104
|
241 movb $1, %cl
|
pascal@104
|
242 xorb %cl, %dh
|
pascal@104
|
243 jne rdit
|
pascal@104
|
244 incb %ch
|
pascal@151
|
245 cmp $80, %ch
|
pascal@151
|
246 jb rdit
|
pascal@151
|
247 push %si
|
pascal@151
|
248 mov $msgnext, %si
|
pascal@151
|
249 call puts
|
pascal@151
|
250 call wait4kbd
|
pascal@151
|
251 pop %si
|
pascal@151
|
252 mov $0, %ch
|
pascal@104
|
253 rdit:
|
pascal@151
|
254 jmp chksector
|
pascal@104
|
255 chkend:
|
pascal@104
|
256 movw $msgok, %si
|
pascal@104
|
257 orw %di, %di
|
pascal@104
|
258 je chkok
|
pascal@104
|
259 chkfail:
|
pascal@104
|
260 movw $msgko, %si
|
pascal@104
|
261 chkok:
|
pascal@104
|
262 call puts
|
pascal@151
|
263 popw %di // next sector offset
|
pascal@151
|
264 popw %si // start of menu
|
pascal@151
|
265 jmp nextchklp
|
pascal@151
|
266
|
pascal@151
|
267 readsector:
|
pascal@151
|
268 movw $BUFFER, %bx
|
pascal@151
|
269 readsector2:
|
pascal@151
|
270 movw $0x201, %ax
|
pascal@151
|
271 int $0x13
|
pascal@151
|
272 ret
|
pascal@104
|
273
|
pascal@104
|
274 getsectors:
|
pascal@104
|
275 tochs // %di -> %cx, %dx & %bp=sector max
|
pascal@104
|
276 ret
|
pascal@151
|
277
|
pascal@151
|
278 wait4kbd:
|
pascal@151
|
279 waitkbdcode
|
pascal@151
|
280 ret
|
pascal@151
|
281
|
pascal@151
|
282 putentry:
|
pascal@151
|
283 entry
|
pascal@151
|
284 jmp putcs
|
pascal@104
|
285 #endif
|
pascal@104
|
286
|
pascal@130
|
287 puts:
|
pascal@130
|
288 lodsb
|
pascal@151
|
289 cmpb $2, %al
|
pascal@151
|
290 jnc putcs
|
pascal@104
|
291 putcr:
|
pascal@104
|
292 movb $10, %al
|
pascal@104
|
293 putlf:
|
pascal@104
|
294 xorb $10^13, %al
|
pascal@104
|
295 putcs:
|
pascal@104
|
296 movw $7, %bx
|
pascal@104
|
297 movb $0xE, %ah
|
pascal@104
|
298 int $0x10
|
pascal@104
|
299 cmpb $13, %al
|
pascal@104
|
300 jz putlf
|
pascal@130
|
301 jnc puts
|
pascal@104
|
302 ret
|
pascal@104
|
303
|
pascal@104
|
304 #ifdef CHECK_FILES
|
pascal@104
|
305 msgok:
|
pascal@104
|
306 .asciz " OK"
|
pascal@104
|
307 msgko:
|
pascal@151
|
308 .ascii " Broken"
|
pascal@151
|
309 .word 1 // next sector offset
|
pascal@104
|
310 msgcrc:
|
pascal@104
|
311 .asciz "Check media" // used to detect CHECK_FILES
|
pascal@104
|
312 #endif
|
pascal@104
|
313 menu:
|
pascal@104
|
314
|
pascal@104
|
315 .org 0x1F1
|
pascal@104
|
316 setupsz:
|
pascal@104
|
317 .byte 0
|
pascal@104
|
318 rootflags:
|
pascal@104
|
319 .word menu
|
pascal@104
|
320 syssz:
|
pascal@104
|
321 .long 0 // updated by bundle
|
pascal@104
|
322 ramsize:
|
pascal@151
|
323 #ifdef CHECK_FILES
|
pascal@151
|
324 msgnext:
|
pascal@151
|
325 .asciz "Next!"
|
pascal@151
|
326 #else
|
pascal@104
|
327 .ascii "SliTaz"
|
pascal@151
|
328 #endif
|
pascal@104
|
329 // .word 0
|
pascal@104
|
330 //vidmode:
|
pascal@104
|
331 // .word 0
|
pascal@104
|
332 //rootdev:
|
pascal@104
|
333 // .word 0
|
pascal@104
|
334 bootflag:
|
pascal@104
|
335 .word 0xAA55
|