]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/boot/pc98/boot0.5/selector.s
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / boot / pc98 / boot0.5 / selector.s
1 # Copyright (c) KATO Takenori, 1999, 2000, 2007.
2 #
3 # All rights reserved.  Unpublished rights reserved under the copyright
4 # laws of Japan.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 #
10 # 1. Redistributions of source code must retain the above copyright
11 #    notice, this list of conditions and the following disclaimer as
12 #    the first lines of this file unmodified.
13 # 2. Redistributions in binary form must reproduce the above copyright
14 #    notice, this list of conditions and the following disclaimer in the
15 #    documentation and/or other materials provided with the distribution.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #
28 # $FreeBSD$
29 #
30
31         .code16
32
33         .text
34 #
35 # Display partition table.
36 #
37 showpartitions:
38         # Clear partition table area
39         movw    $16, %cx
40 clear_part:
41         push    %cx
42         movw    %cx, %dx
43         decw    %dx
44         addw    $5, %dx
45         movw    $20, %cx
46         call    sc_goto
47         movw    $msg_spc, %di
48         call    sc_puts
49         pop     %cx
50         loop    clear_part
51
52         # Check `Exit' menu
53         movw    curdevice, %ax
54         cmpw    ndevice, %ax
55         je      no_slice
56
57         # XXX Move this to a suitable place!
58         movw    $22, %cx
59         movw    $4, %dx
60         call    sc_goto
61         movw    $msg_slice, %di
62         call    sc_puts
63
64         # Check the number of partitions
65         movw    npartition, %cx
66         orw     %cx, %cx
67         jnz     partitionexist
68 no_slice:
69         # Just show the `no slice' message.
70         movw    $22, %cx
71         movw    $5, %dx
72         call    sc_goto
73         movw    $msg_noslice, %di
74         call    sc_puts
75         ret
76 partitionexist:
77         xorw    %si, %si                # %si = partition number
78 showpart_loop:
79         push    %cx                     # %cx = number of partitions
80         movw    $22, %cx
81         movw    %si, %dx
82         addw    $5, %dx
83         call    sc_goto
84         movw    %si, %di
85         movb    $5, %cl
86         shlw    %cl, %di
87         addw    $0x10, %di              # SYSM field
88         # SYSM: space filled string.  Don't use sc_puts.
89         movw    $16, %cx
90 showpart_name:
91         push    %cx
92         movb    parttable(%di), %al
93         call    sc_putc
94         incw    %di
95         pop     %cx
96         loop    showpart_name
97         incw    %si
98         pop     %cx
99         loop    showpart_loop
100         ret
101
102 #
103 # Show default slice indicator
104 # If the default boot slice exists, `*' indicator will be showed.
105 #
106 showdefaultslicemark:
107         cmpb    $0x80, defpartflag
108         je      defpartexist
109         ret
110 defpartexist:
111         movw    npartition, %cx
112 defslice_loop:
113         movw    %cx, %bx
114         decw    %bx
115         push    %cx
116         push    %bx
117         movw    $40, %cx
118         movw    %bx, %dx
119         addw    $5, %dx
120         call    sc_goto
121
122         pop     %bx
123         pop     %cx
124         movb    defpartnum, %al
125         cmpb    partnum(%bx), %al
126         jne     nomatch
127         movb    $'*', %al
128         call    sc_putc
129         jmp     defslice_done
130 nomatch:
131         movb    $' ', %al
132         call    sc_putc
133 defslice_done:
134         loop    defslice_loop
135         ret
136
137 #
138 # Hide default slice indicator
139 #
140 hidedefaultslicemark:
141         movw    $16, %cx
142 hidedefslice_loop:
143         push    %cx
144         movw    %cx, %dx
145         addw    $4, %dx
146         movw    $40, %cx
147         call    sc_goto
148         movb    $' ', %al
149         call    sc_putc
150         pop     %cx
151         loop    hidedefslice_loop
152         ret
153
154 #
155 # Toggle default slice
156 #
157 toggle_default:
158         cmpb    $0x80, defpartflag
159         jne     set_default
160         # Clear default
161         movb    $0, defpartflag
162         call    write_ipl               # Restore
163         call    hidedefaultslicemark
164         ret
165         # Set default slice
166 set_default:
167         movw    curpartition, %si
168         movb    partnum(%si), %al       # %al = real partition number
169         movb    $5, %cl
170         shlw    %cl, %si
171         # Default slice must be bootable
172         testb   $0x80, parttable(%si)
173         jnz     curpart_bootable
174         # Current partition is not bootable.
175         ret
176 curpart_bootable:
177         movb    $0x80, defpartflag
178         movb    %al, defpartnum
179         call    write_ipl               # Restore
180         call    showdefaultslicemark
181         ret
182
183 #
184 # Show/hide cursor
185 #
186 show_devcurs:
187         xorw    %cx, %cx
188         movw    curdevice, %dx
189         addw    $5, %dx
190         call    sc_goto
191         movb    $'>', %al
192         call    sc_putc
193         movb    $'>', %al
194         call    sc_putc
195         ret
196
197 hide_devcurs:
198         xorw    %cx, %cx
199         movw    curdevice, %dx
200         addw    $5, %dx
201         call    sc_goto
202         movb    $' ', %al
203         call    sc_putc
204         movb    $' ', %al
205         call    sc_putc
206         ret
207
208 show_slicecurs:
209         movw    $20, %cx
210         movw    curpartition, %dx
211         addw    $5, %dx
212         call    sc_goto
213         movb    $'>', %al
214         call    sc_putc
215         movb    $'>', %al
216         call    sc_putc
217         ret
218
219 hide_slicecurs:
220         movw    $20, %cx
221         movw    curpartition, %dx
222         addw    $5, %dx
223         call    sc_goto
224         movb    $' ', %al
225         call    sc_putc
226         movb    $' ', %al
227         call    sc_putc
228         ret
229
230 isforceboot:
231         xorw    %cx, %cx
232         movw    $20, %dx
233         call    sc_goto
234         movw    $msg_force, %di
235         call    sc_puts
236         call    sc_getc
237         push    %ax
238         xorw    %cx, %cx
239         movw    $20, %dx
240         call    sc_goto
241         movw    $msg_forceclr, %di
242         call    sc_puts
243         pop     %ax
244         cmpb    $0x15, %ah
245         je      force_yes
246         xorw    %ax, %ax
247         ret
248 force_yes:
249         movw    $1, %ax
250         ret
251
252 #
253 # Main loop for device mode
254 #
255 devmode:
256         call    read_ipl
257         call    hidedefaultslicemark
258         call    showpartitions
259         call    showdefaultslicemark
260         call    show_devcurs
261
262         movw    $2, %cx
263         movw    $4, %dx
264         call    sc_goto
265         movb    $0xe5, %al
266         movw    $6, %cx
267         call    sc_setattr
268         movw    $22, %cx
269         movw    $4, %dx
270         call    sc_goto
271         movb    $0xe1, %al
272         movw    $5, %cx
273         call    sc_setattr
274         movw    $44, %cx
275         movw    $3, %dx
276         call    sc_goto
277         movb    $0xe5, %al
278         movw    $11, %cx
279         call    sc_setattr
280         movw    $44, %cx
281         movw    $7, %dx
282         call    sc_goto
283         movb    $0xe1, %al
284         movw    $10, %cx
285         call    sc_setattr
286
287 devmode_loop:
288         call    sc_getc
289         movw    ndevice, %bx
290         cmpb    $0x3a, %ah              # UP
291         je      dev_up
292         cmpb    $0x3d, %ah              # DOWN
293         je      dev_down
294         cmpb    $0x3c, %ah              # RIGHT
295         je      dev_right
296         cmpb    $0x1c, %ah              # RETURN
297         jne     devmode_loop
298         cmpw    curdevice, %bx
299         jne     dev_right
300         movw    $3, mode                # N88-BASIC
301         ret
302
303         # XXX
304         .space  5, 0x90
305         ret                             # Dummy ret @0x9ab
306
307 dev_up:
308         cmpw    $0, curdevice
309         je      devmode_loop
310         call    hide_devcurs
311         decw    curdevice
312         call    read_ipl
313         call    hidedefaultslicemark
314         call    showpartitions
315         call    showdefaultslicemark
316         call    show_devcurs
317         jmp     devmode_loop
318 dev_down:
319         cmpw    curdevice, %bx
320         je      devmode_loop
321         call    hide_devcurs
322         incw    curdevice
323         call    read_ipl
324         call    hidedefaultslicemark
325         call    showpartitions
326         call    showdefaultslicemark
327         call    show_devcurs
328         jmp     devmode_loop
329 dev_right:
330         cmpw    curdevice, %bx
331         je      devmode_loop
332         movw    $1, mode                # Slice mode
333         ret
334
335 #
336 # main loop for slice mode
337 #
338 slicemode:
339         movw    $0, curpartition
340         call    show_slicecurs
341         movw    $2, %cx
342         movw    $4, %dx
343         call    sc_goto
344         movb    $0xe1, %al
345         movw    $6, %cx
346         call    sc_setattr
347         movw    $22, %cx
348         movw    $4, %dx
349         call    sc_goto
350         movb    $0xe5, %al
351         movw    $5, %cx
352         call    sc_setattr
353         movw    $44, %cx
354         movw    $3, %dx
355         call    sc_goto
356         movb    $0xe1, %al
357         movw    $11, %cx
358         call    sc_setattr
359         movw    $44, %cx
360         movw    $7, %dx
361         call    sc_goto
362         movb    $0xe5, %al
363         movw    $10, %cx
364         call    sc_setattr
365
366 slicemode_loop:
367         call    sc_getc
368         cmpb    $0x3a, %ah              # UP
369         je      slice_up
370         cmpb    $0x3d, %ah              # DOWN
371         je      slice_down
372         cmpb    $0x3b, %ah              # LEFT
373         je      slice_esc
374         cmpb    $0x00, %ah              # ESC
375         je      slice_esc
376         cmpb    $0x1c, %ah              # RETURN
377         je      slice_ret
378         cmpb    $0x34, %ah              # SPC
379         je      slice_spc
380         cmpb    $0x62, %ah              # f1
381         je      slice_spc
382         jmp     slicemode_loop
383 slice_up:
384         cmpw    $0, curpartition
385         je      slicemode_loop
386         call    hide_slicecurs
387         decw    curpartition
388         call    show_slicecurs
389         jmp     slicemode_loop
390 slice_down:
391         movw    curpartition, %bx
392         movw    npartition, %ax
393         decw    %ax
394         cmpw    %bx, %ax
395         je      slicemode_loop
396         call    hide_slicecurs
397         incw    curpartition
398         call    show_slicecurs
399         jmp     slicemode_loop
400 slice_esc:
401         movw    $0, mode                # Device mode
402         ret
403 slice_spc:
404         call    toggle_default
405         jmp     slicemode_loop
406 slice_ret:
407         # Test bit 7 of mid
408         movw    curpartition, %si
409         movb    $5, %cl
410         shlw    %cl, %si
411         testb   $0x80, parttable(%si)
412         jnz     bootable_slice
413         call    isforceboot
414         orw     %ax, %ax
415         jz      slicemode_loop
416 bootable_slice:
417         call    boot
418         jmp     slicemode_loop
419
420 #
421 # Main loop
422 #
423         .global selector
424 selector:
425         movw    $0, curdevice   # trydefault may change the curdevice.
426         movw    $0, mode
427
428 selector_loop:
429         cmpw    $0, mode
430         je      status_dev
431         cmpw    $1, mode
432         je      status_slice
433         ret
434 status_dev:
435         call    devmode
436         jmp     selector_loop
437 status_slice:
438         call    slicemode
439         jmp     selector_loop
440
441         .data
442         .global curpartition
443 curpartition:   .word   0               # current patition
444 mode:           .word   0
445
446 msg_spc:        .asciz  "                        "
447 msg_slice:      .asciz  "Slice"
448 msg_noslice:    .asciz  "no slice"
449 msg_force:      .asciz  "This slice is not bootable. Continue? (Y / [N])"
450 msg_forceclr:   .asciz  "                                               "