summaryrefslogtreecommitdiffstats
path: root/stand/pc98/boot0.5/boot0.5.s
diff options
context:
space:
mode:
Diffstat (limited to 'stand/pc98/boot0.5/boot0.5.s')
-rw-r--r--stand/pc98/boot0.5/boot0.5.s293
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
OpenPOWER on IntegriCloud