diff options
Diffstat (limited to 'stand/pc98/boot0.5/boot0.5.s')
-rw-r--r-- | stand/pc98/boot0.5/boot0.5.s | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/stand/pc98/boot0.5/boot0.5.s b/stand/pc98/boot0.5/boot0.5.s new file mode 100644 index 0000000..f878006 --- /dev/null +++ b/stand/pc98/boot0.5/boot0.5.s @@ -0,0 +1,293 @@ +# Copyright (c) KATO Takenori, 1999, 2000, 2007. +# +# All rights reserved. Unpublished rights reserved under the copyright +# laws of Japan. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer as +# the first lines of this file unmodified. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# $FreeBSD$ +# + .global main + .code16 + + .text +main: + # Check hireso mode + movw $0x501, %bx # BIOS_FLAG + call read_biosparam + testb $0x08, %dl + jz normalmode + movb $1, ishireso +normalmode: + call sc_init + + # Display title and copyright. + movw $title, %di + call sc_puts + xorw %cx, %cx + movw $1, %dx + call sc_goto + movw $copyright, %di + call sc_puts + + # Scan hard drives + xorw %si, %si # number of partition + call scan_sasi # SASI/IDE + call scan_scsi # SCSI + movw %si, ndevice + orw %si, %si + jnz drives_found + jmp exit # No hard drives + +drives_found: + # Setup sector size dependent parameters + movw %si, %cx # %cx = number of devices +setup_loop: + movw %cx, %di + decw %di + shlw %di + movw secsize(%di), %ax + cmpw $1024, %ax + je setup_1024 + cmpw $512, %ax + je setup_512 + # 256 bytes/sector + movw $0x100, partoff(%di) + movw $0x0fa, defflagoff(%di) + movw $0x0fb, defpartoff(%di) + movw $8, maxpart(%di) + jmp setup_secsize_end + # 1024 bytes/sector +setup_1024: + # XXX Fix me! + movw $0x400, partoff(%di) + movw $0x3fa, defflagoff(%di) + movw $0x3fb, defpartoff(%di) + movb $32, maxpart(%di) + jmp setup_secsize_end + # 512 bytes/sector +setup_512: + movw $0x200, partoff(%di) + movw $0x1fa, defflagoff(%di) + movw $0x1fb, defpartoff(%di) + movb $16, maxpart(%di) +setup_secsize_end: + loop setup_loop + + # For debug with floppy, fake the parameter. + movw $0x584, %bx # DISK_BOOT + call read_biosparam + andb $0xf0, %dl + cmpb $0x90, %ah + jne boot_from_hdd + movb daua, %dl + call write_biosparam + +boot_from_hdd: + movw $500, %cx +wait_0_5: + call wait1ms + loop wait_0_5 + + # If the TAB is pressed, don't try to boot from default partition + xorw %di, %di # flag +wait_key_release: + call sc_iskeypress + orw %ax, %ax + jz key_release # KBD buffer empty. + call sc_getc + cmpb $0x0f, %ah # TAB + jne wait_key_release + # TAB pressed + movw $1, %di + jmp wait_key_release +key_release: + orw %di, %di + jnz dont_try_default # TAB pressed. + call trydefault + # Default partition not found. +dont_try_default: + call show_usage + call showdevices + call selector +exit: + ret +# +# Display usage +# +show_usage: + movw $44, %cx + movw $3, %dx + call sc_goto + movw $msg_usage1, %di + call sc_puts + movw $44, %cx + movw $4, %dx + call sc_goto + movw $msg_usage2, %di + call sc_puts + movw $44, %cx + movw $5, %dx + call sc_goto + movw $msg_usage3, %di + call sc_puts + movw $44, %cx + movw $7, %dx + call sc_goto + movw $msg_usage4, %di + call sc_puts + movw $44, %cx + movw $8, %dx + call sc_goto + movw $msg_usage5, %di + call sc_puts + movw $44, %cx + movw $9, %dx + call sc_goto + movw $msg_usage6, %di + call sc_puts + movw $44, %cx + movw $10, %dx + call sc_goto + movw $msg_usage7, %di + call sc_puts + movw $44, %cx + movw $11, %dx + call sc_goto + movw $msg_usage8, %di + call sc_puts + movw $44, %cx + movw $16, %dx + call sc_goto + movw $msg_usage9, %di + call sc_puts + movw $44, %cx + movw $17, %dx + call sc_goto + movw $msg_usage10, %di + call sc_puts + movw $44, %cx + movw $18, %dx + call sc_goto + movw $msg_usage11, %di + call sc_puts + movw $44, %cx + movw $19, %dx + call sc_goto + movw $msg_usage12, %di + call sc_puts + ret + +# +# Display device list +# +showdevices: + movw $2, %cx + movw $4, %dx + call sc_goto + movw $msg_device, %di + call sc_puts + xorw %si, %si # %si = device number + movw ndevice, %cx # %cx = number of devices +showdev_loop: + push %cx + movw $2, %cx + movw $5, %dx + addw %si, %dx + call sc_goto + # Check DA + movb daua(%si), %al + push %ax + andb $0xf0, %al + cmpb $0x80, %al + je show_sasi + cmpb $0xa0, %al + je show_scsi + # unknown device + movw $msg_unknown, %di + call sc_puts + jmp showunit + # SASI +show_sasi: + movw $msg_sasi, %di + call sc_puts + jmp showunit + # SCSI +show_scsi: + movw $msg_scsi, %di + call sc_puts + # Display unit number. +showunit: + pop %ax + andb $0x0f, %al + addb $'0', %al + call sc_putc + incw %si + pop %cx + loop showdev_loop + movw ndevice, %dx + addw $5, %dx + movw $2, %cx + call sc_goto + movw $msg_exitmenu, %di + call sc_puts + ret + + .data + .global curdevice, ndevice +ndevice: .word 0 # number of device +curdevice: .word 0 # current device + + .global ishireso +ishireso: .byte 0 + +title: .asciz "PC98 Boot Selector Version 1.2" +copyright: .ascii "(C)Copyright 1999-2007 KATO Takenori. " + .asciz "All rights reserved." +msg_device: .asciz "Device" +msg_sasi: .asciz "SASI/IDE unit " +msg_scsi: .asciz "SCSI ID " +msg_unknown: .asciz "unknown unit " +msg_exitmenu: .asciz "Exit this menu" +msg_usage1: .asciz "Device list" +msg_usage2: .asciz "UP, DOWN: select boot device" +msg_usage3: .asciz "RETURN: move to slice list" +msg_usage4: .asciz "Slice list" +msg_usage5: .asciz "UP, DOWN: select boot slice" +msg_usage6: .asciz "RETURN: boot" +msg_usage7: .asciz "SPACE: toggle default" +msg_usage8: .asciz "ESC: move to device list" +msg_usage9: .asciz "LEGEND" +msg_usage10: .asciz ">>: selected device/slice" +msg_usage11: .asciz "*: default slice to boot" +msg_usage12: .asciz "!: unbootable slice" + + .bss + .global daua, secsize, defflagoff, defpartoff + .global maxpart, partoff +daua: .space 12 # DA/DU list +secsize: .space 12 * 2 # Sector soize +defflagoff: .space 12 * 2 +defpartoff: .space 12 * 2 +maxpart: .space 12 * 2 +partoff: .space 12 * 2 |