Added PC-98 HDD boot manager. The boot0 is the `IPL' which occupies

sector 0 of a disk and boot0.5 is the `boot selector' which starts
from address 0x400.  The IPL loads boot0.5 and boot0.5 loads bootblock
of a slice.

The boot manager stuff was developed by me (kato) with Borland C++,
and then, translated into bcc in the ports collection by Nokubi-san.
After that, boot0 has been translated into gas with the .code16
directive by Takahashi-san (nyan) and boot0.5 has been rewritten in
gas by me.
This commit is contained in:
KATO Takenori 2000-08-02 08:46:08 +00:00
parent 19a0702e86
commit e9b13dd6ec
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=64123
11 changed files with 1752 additions and 1 deletions

View File

@ -1,5 +1,5 @@
# $FreeBSD$
SUBDIR= btx boot2 libpc98 loader
SUBDIR= btx boot0 boot0.5 boot2 libpc98 loader
.include <bsd.subdir.mk>

View File

@ -0,0 +1,25 @@
# $FreeBSD$
PROG= boot0.5
OBJS= start.o boot.o boot0.5.o disk.o selector.o support.o \
syscons.o
NOMAN=
STRIP=
BINDIR?= /boot
BINMODE= 444
ORG= 0x000
# The size of boot0.5 must be 7168 bytes
boot0.5: boot0.5.bin
cat boot0.5.bin /dev/zero | dd of=boot0.5 bs=1 count=7168
boot0.5.bin: boot0.5.out
objcopy -S -O binary boot0.5.out ${.TARGET}
boot0.5.out: ${OBJS}
${LD} -N -e start -Ttext ${ORG} -o ${.TARGET} ${OBJS}
CLEANFILES+= boot0.5.out boot0.5.bin
.include <bsd.prog.mk>

View File

@ -0,0 +1,174 @@
# Copyright (c) KATO Takenori, 1999, 2000.
#
# 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$
#
.code16
.text
.global boot
#
# Read bootstrap program and jump to it.
#
boot:
# Step 1: Save parameters
movw curdevice, %si
movb daua(%si), %al
movb %al, b_daua
shlw %si
movw secsize(%si), %ax
movw %ax, b_secsize
movw curpartition, %si
movb partnum(%si), %al # %al = real partition number
xorb %ah, %ah
movw %ax, b_partn # save real parttion number
movb $5, %cl
shlw %cl, %si # %si = offset to parttable
addw $4, %si
movb parttable(%si), %al # IPLS
movb %al, b_sector
incw %si
movb parttable(%si), %al # IPLH
movb %al, b_head
incw %si # IPLC
movw parttable(%si), %ax
movw %ax, b_cylinder
# Step 2: Calculate egment address of bootstrap routine
movw $0x1d00, %ax
movw b_secsize, %cx
shrw %cx
shrw %cx
subw %cx, %ax
subw $0x100, %ax
movw %ax, b_bootseg
# Step 3: Read bootstrap code
movb $6, %ah
movb b_daua, %al
movw b_secsize, %bx
shlw %bx # 2 sectors
movw b_cylinder, %cx
movb b_head, %dh
movb b_sector, %dl
movw b_bootseg, %es
xorw %bp, %bp
int $0x1b
jc boot_error
# Step 4: Set DA/UA into BIOS work area
xorw %ax, %ax
movw %ax, %es
movw $0x584, %bx # DISK_BOOT
movb b_daua, %dl
call write_biosparam
call sc_clean
# Step 5: Set registers
# %ah: 00
# %al: DA/UA
# %bx: Sector size * 2
# %cx: cylinder number of boot partition
# %si: pointer to partition table
movw b_partn, %ax
movb $10, %cl
shl %cl, %ax # %ax = partition number * 32 * 32
addw b_secsize, %ax
movw %ax, %si # %si = pointer to partition table
movw b_cylinder, %cx # %cx = cylinder
movb b_head, %dh # %dh = head
movb b_sector, %dl # %dl = sector
movw b_bootseg, %es # %es = boot segment
movb b_daua, %al # %al = DA/UA
movw b_secsize, %bx
shlw %bx # %bx = sector size * 2
cli
movw %cs:iniss, %ss # Restore stack pointer
movw %cs:inisp, %sp
push %es # Boot segment
xorw %bp, %bp
push %bp # 0
movw %ax, %di # Save %ax
xorw %ax, %ax
movw %ax, %ds # %ds = 0
movw %di, %ax # Restore %ax
xorb %ah, %ah # %di = 0
xorw %di, %di # %di = 0
sti
# Jump to bootstrap code
lret
# NOTREACHED
boot_error:
ret
#
# Try to boot from default partition.
#
.global trydefault
trydefault:
movw ndevice, %cx
xorw %si, %si
trydefault_loop:
movw %si, curdevice
push %cx
push %si
call read_ipl
pop %si
pop %cx
cmpb $0x80, defpartflag
jne nodefpart
# Default partition is defined.
push %cx
movw npartition, %cx
srch_part:
movw %cx, %bx
decw %bx
movb defpartnum, %al # %al = real partition number
cmpb partnum(%bx), %al
jne not_match
movw %bx, curpartition # Store partition number
call boot
not_match:
loop srch_part
pop %cx
nodefpart:
incw %si
loop trydefault_loop
ret
.data
b_daua: .byte 0 # DA/UA
b_head: .byte 0 # SYSH
b_sector: .byte 0 # SYSS
b_cylinder: .word 0 # SYSC
b_bootseg: .word 0
b_secsize: .word 0
b_partn: .word 0 # Real partition number

View File

@ -0,0 +1,290 @@
# Copyright (c) KATO Takenori, 1999, 2000.
#
# 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 depended 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
# NOTREACHED
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, daua, secsize, defflagoff, defpartoff
.global maxpart, partoff, ndevice
ndevice: .word 0 # number of device
curdevice: .word 0 # current device
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
.global ishireso
ishireso: .byte 0
title: .asciz "PC98 Boot Selector Version 1.1"
copyright: .ascii "(C)Copyright 1999, 2000 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"

View File

@ -0,0 +1,285 @@
# Copyright (c) KATO Takenori, 1999, 2000.
#
# 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$
#
.code16
.text
#
# Check magic number at the end of the sector 0
#
check_magic:
movw curdevice, %si
shlw %si
movw secsize(%si), %bx
decw %bx
decw %bx
movw iplbuf(%bx), %ax
cmpw $0xaa55, %ax
je magic_ok
movw $1, %ax
ret
magic_ok:
xorw %ax, %ax
ret
#
# Copy partition table from buffer to parttable.
#
setup_partition:
push %cs
pop %es
movw curdevice, %bx
shlw %bx
movw maxpart(%bx), %cx # %cx = max num of partitions
movw partoff(%bx), %di
movw %di, %bx # %bx = offset to partition table
xorw %dx, %dx # %dx = partition number
setup_partition_loop:
movw %dx, %si
shlw %si
shlw %si
shlw %si
shlw %si
shlw %si
addw %bx, %si
movb iplbuf(%si), %al
orb %al, %al
jz unused_partition
movw npartition, %ax
movw %ax, %di
shlw %di
shlw %di
shlw %di
shlw %di
shlw %di
addw $parttable, %di
push %cx
movw $32, %cx
rep
movsb
pop %cx
movw %ax, %di
addw $partnum, %di
movb %dl, (%di)
incw npartition
unused_partition:
incw %dx
loop setup_partition_loop
ret
#
# Read IPL and partition table in the current device.
#
.global read_ipl
read_ipl:
movw curdevice, %ax
movw %ax, %si # %si = device number
movw %ax, %di
shlw %di
movw %cs, %ax
movw %ax, %es
movb $6, %ah
movb daua(%si), %al
movw $0x400, %bx
xorw %cx, %cx
xorw %dx, %dx
movw $iplbuf, %bp
int $0x1b
jc read_ipl_error
movw defflagoff(%di), %bx
movb iplbuf(%bx), %al
movb %al, defpartflag
incw %bx
movb iplbuf(%bx), %al
movb %al, defpartnum
movw $0, npartition
call check_magic
orw %ax, %ax
jnz no_magic
call setup_partition
no_magic:
xorw %ax, %ax
read_ipl_error:
xorw %bx, %bx
movw %bx, %es
ret
#
# Restore IPL from the buffer
#
.global write_ipl
write_ipl:
movw curdevice, %ax
movw %ax, %si
movw %ax, %di
shlw %di
# Restore default boot partition info.
movw defflagoff(%di), %bx
movb defpartflag, %al
movb %al, iplbuf(%bx)
incw %bx
movb defpartnum, %al
movb %al, iplbuf(%bx)
movw %cs, %ax
movw %ax, %es
movb $5, %ah
movb daua(%si), %al
movw secsize(%di), %bx
xorw %cx, %cx
xorw %dx, %dx
movw $iplbuf, %bp
int $0x1b
jc write_ipl_error
xorw %ax, %ax
write_ipl_error:
xorw %bx, %bx
movw %bx, %es
ret
#
# Scan HDD devices
#
.global scan_sasi, scan_scsi
# Scan SASI disk
scan_sasi:
# SASI Disk
movw $4, %cx
movw $0x0001, %ax # %ah = unit number, %al = for bit operation
sasi_loop:
movw %si, %di
shlw %di
movw $0x55d, %bx # DISK_EQUIP
call read_biosparam
testb %al, %dl
jz no_sasi_unit
movb $0x80, %dh
addb %ah, %dh
movb %dh, daua(%si)
movw $0x457, %bx # capacity & sector size of IDE HDD
call read_biosparam
orb %ah, %ah
jz sasi_1
cmpb $1, %ah
jz sasi_2
# SASI #3/#4
movw $512, %dx # XXX
jmp found_sasi_unit
sasi_1:
# SASI #1
testb $0x80, %dl
jz sasi_256
jmp sasi_512
sasi_2:
# SASI #2
testb $0x80, %dl
jz sasi_256
jmp sasi_512
sasi_256:
movw $256, %dx
jmp found_sasi_unit
sasi_512:
movw $512, %dx
found_sasi_unit:
movw %dx, secsize(%di)
incw %si
no_sasi_unit:
incb %ah
shlb %al
loop sasi_loop
ret
#
# Scan SCSI disk
# SI number of disks
# destroyed: %ax, %bx, %cx, %dx
scan_scsi:
movw $8, %cx
movw $0x0001, %ax # %ah = ID number, %al = for bit operation
scsi_loop:
# Check whether drive exist.
movw %si, %di
shlw %di
movw $0x482, %bx # DISK_EQUIPS
call read_biosparam
testb %al, %dl
jz no_scsi_unit
xorw %bx, %bx
movb %ah, %bl
shlw %bx
shlw %bx
addw $0x460, %bx # SCSI paramter block
call read_biosparam
orb %dl, %dl
jz no_scsi_unit
# SCSI harddrive found.
movb $0xa0, %dh
addb %ah, %dh
movb %dh, daua(%si)
# Check sector size.
addw $3, %bx
call read_biosparam
andb $0x30, %dl
cmpb $0x20, %dl
je scsi_1024
cmpb $0x10, %dl
je scsi_512
movw $256, %dx
jmp found_scsi
scsi_1024:
movw $1024, %dx
jmp found_scsi
scsi_512:
movw $512, %dx
found_scsi:
movw %dx, secsize(%di)
incw %si
no_scsi_unit:
incb %ah
shlb %al
loop scsi_loop
ret
.data
.global partnum, parttable, defpartflag, defpartnum, npartition
partnum: .space 32 # Index of parttable
parttable: .space 1024 # Copy of valid partition table
defpartflag: .byte 0
defpartnum: .byte 0
npartition: .word 0 # number of partitions
.bss
iplbuf: .space 0x400

View File

@ -0,0 +1,444 @@
# Copyright (c) KATO Takenori, 1999, 2000.
#
# 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$
#
.code16
.text
#
# Display partition table.
#
showpartitions:
# Clear partion table area
movw $16, %cx
clear_part:
push %cx
movw %cx, %dx
decw %dx
addw $5, %dx
movw $20, %cx
call sc_goto
movw $msg_spc, %di
call sc_puts
pop %cx
loop clear_part
# Check `Exit' menu
movw curdevice, %ax
cmpw ndevice, %ax
je no_slice
# XXX Move this to a suitable place!
movw $22, %cx
movw $4, %dx
call sc_goto
movw $msg_slice, %di
call sc_puts
# Check the number of partitions
movw npartition, %cx
orw %cx, %cx
jnz partitionexist
no_slice:
# Just show the `no slice' message.
movw $22, %cx
movw $5, %dx
call sc_goto
movw $msg_noslice, %di
call sc_puts
ret
partitionexist:
xorw %si, %si # %si = partition number
showpart_loop:
push %cx # %cx = number of partitions
movw $22, %cx
movw %si, %dx
addw $5, %dx
call sc_goto
movw %si, %di
movb $5, %cl
shlw %cl, %di
addw $0x10, %di # SYSM field
# SYSM: space filled string. Don't use sc_puts.
movw $16, %cx
showpart_name:
push %cx
movb parttable(%di), %al
call sc_putc
incw %di
pop %cx
loop showpart_name
incw %si
pop %cx
loop showpart_loop
ret
#
# Show default slice indicator
# If the default boot slice exists, `*' indicator will be showed.
#
showdefaultslicemark:
cmpb $0x80, defpartflag
je defpartexist
ret
defpartexist:
movw npartition, %cx
defslice_loop:
movw %cx, %bx
decw %bx
push %cx
push %bx
movw $40, %cx
movw %bx, %dx
addw $5, %dx
call sc_goto
pop %bx
pop %cx
movb defpartnum, %al
cmpb partnum(%bx), %al
jne nomatch
movb $'*', %al
call sc_putc
jmp defslice_done
nomatch:
movb $' ', %al
call sc_putc
defslice_done:
loop defslice_loop
ret
#
# Hide default slice indicator
#
hidedefaultslicemark:
movw $16, %cx
hidedefslice_loop:
push %cx
movw %cx, %dx
addw $4, %dx
movw $40, %cx
call sc_goto
movb $' ', %al
call sc_putc
pop %cx
loop hidedefslice_loop
ret
#
# Toggle default slice
#
toggle_default:
cmpb $0x80, defpartflag
jne set_default
# Clear default
movb $0, defpartflag
call write_ipl # Restore
call hidedefaultslicemark
ret
# Set default slice
set_default:
movw curpartition, %si
movb partnum(%si), %al # %al = real partition number
movb $5, %cl
shlw %cl, %si
# Default slice must be bootable
testb $0x80, parttable(%si)
jnz curpart_bootable
# Current partition is not bootable.
ret
curpart_bootable:
movb $0x80, defpartflag
movb %al, defpartnum
call write_ipl # Restore
call showdefaultslicemark
ret
#
# Show/hide cursor
#
show_devcurs:
xorw %cx, %cx
movw curdevice, %dx
addw $5, %dx
call sc_goto
movb $'>', %al
call sc_putc
movb $'>', %al
call sc_putc
ret
hide_devcurs:
xorw %cx, %cx
movw curdevice, %dx
addw $5, %dx
call sc_goto
movb $' ', %al
call sc_putc
movb $' ', %al
call sc_putc
ret
show_slicecurs:
movw $20, %cx
movw curpartition, %dx
addw $5, %dx
call sc_goto
movb $'>', %al
call sc_putc
movb $'>', %al
call sc_putc
ret
hide_slicecurs:
movw $20, %cx
movw curpartition, %dx
addw $5, %dx
call sc_goto
movb $' ', %al
call sc_putc
movb $' ', %al
call sc_putc
ret
isforceboot:
xorw %cx, %cx
movw $20, %dx
call sc_goto
movw $msg_force, %di
call sc_puts
call sc_getc
push %ax
xorw %cx, %cx
movw $20, %dx
call sc_goto
movw $msg_forceclr, %di
call sc_puts
pop %ax
cmpb $0x15, %ah
je force_yes
xorw %ax, %ax
ret
force_yes:
movw $1, %ax
ret
#
# Main loop for device mode
#
devmode:
call read_ipl
call hidedefaultslicemark
call showpartitions
call showdefaultslicemark
call show_devcurs
movw $2, %cx
movw $4, %dx
call sc_goto
movb $0xe5, %al
movw $6, %cx
call sc_setattr
movw $22, %cx
movw $4, %dx
call sc_goto
movb $0xe1, %al
movw $5, %cx
call sc_setattr
movw $44, %cx
movw $3, %dx
call sc_goto
movb $0xe5, %al
movw $11, %cx
call sc_setattr
movw $44, %cx
movw $7, %dx
call sc_goto
movb $0xe1, %al
movw $10, %cx
call sc_setattr
devmode_loop:
call sc_getc
movw ndevice, %bx
cmpb $0x3a, %ah # UP
je dev_up
cmpb $0x3d, %ah # DOWN
je dev_down
cmpb $0x3c, %ah # RIGHT
je dev_right
cmpb $0x1c, %ah # RETURN
jne devmode_loop
cmpw curdevice, %bx
jne dev_right
movw $3, mode # N88-BASIC
ret
dev_up:
cmpw $0, curdevice
je devmode_loop
call hide_devcurs
decw curdevice
call read_ipl
call hidedefaultslicemark
call showpartitions
call showdefaultslicemark
call show_devcurs
jmp devmode_loop
dev_down:
cmpw curdevice, %bx
je devmode_loop
call hide_devcurs
incw curdevice
call read_ipl
call hidedefaultslicemark
call showpartitions
call showdefaultslicemark
call show_devcurs
jmp devmode_loop
dev_right:
cmpw curdevice, %bx
je devmode_loop
movw $1, mode # Slice mode
ret
#
# main loop for slice mode
#
slicemode:
movw $0, curpartition
call show_slicecurs
movw $2, %cx
movw $4, %dx
call sc_goto
movb $0xe1, %al
movw $6, %cx
call sc_setattr
movw $22, %cx
movw $4, %dx
call sc_goto
movb $0xe5, %al
movw $5, %cx
call sc_setattr
movw $44, %cx
movw $3, %dx
call sc_goto
movb $0xe1, %al
movw $11, %cx
call sc_setattr
movw $44, %cx
movw $7, %dx
call sc_goto
movb $0xe5, %al
movw $10, %cx
call sc_setattr
slicemode_loop:
call sc_getc
cmpb $0x3a, %ah # UP
je slice_up
cmpb $0x3d, %ah # DOWN
je slice_down
cmpb $0x3b, %ah # LEFT
je slice_esc
cmpb $0x00, %ah # ESC
je slice_esc
cmpb $0x1c, %ah # RETURN
je slice_ret
cmpb $0x34, %ah # SPC
je slice_spc
cmpb $0x62, %ah # f1
je slice_spc
jmp slicemode_loop
slice_up:
cmpw $0, curpartition
je slicemode_loop
call hide_slicecurs
decw curpartition
call show_slicecurs
jmp slicemode_loop
slice_down:
movw curpartition, %bx
movw npartition, %ax
decw %ax
cmpw %bx, %ax
je slicemode_loop
call hide_slicecurs
incw curpartition
call show_slicecurs
jmp slicemode_loop
slice_esc:
movw $0, mode # Device mode
ret
slice_spc:
call toggle_default
jmp slicemode_loop
slice_ret:
# Test bit 7 of mid
movw curpartition, %si
movb $5, %cl
shlw %cl, %si
testb $0x80, parttable(%si)
jnz bootable_slice
call isforceboot
orw %ax, %ax
jz slicemode_loop
bootable_slice:
call boot
jmp slicemode_loop
#
# Main loop
#
.global selector
selector:
movw $0, mode
selector_loop:
cmpw $0, mode
je status_dev
cmpw $1, mode
je status_slice
ret
status_dev:
call devmode
jmp selector_loop
status_slice:
call slicemode
jmp selector_loop
.data
.global curpartition
curpartition: .word 0 # current patition
mode: .word 0
msg_spc: .asciz " "
msg_slice: .asciz "Slice"
msg_noslice: .asciz "no slice"
msg_force: .asciz "This slice is not bootable. Continue? (Y / [N])"
msg_forceclr: .asciz " "

View File

@ -0,0 +1,58 @@
# Copyright (c) KATO Takenori, 1999, 2000.
#
# 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 start
.code16
.text
start:
cli
movw %cs, %ax
movw %ax, %ds
movw %ss, iniss
movw %sp, inisp
movw %ax, %ss
movw $0xfffe, %sp
sti
xorw %ax, %ax
movw %ax, %es
call main
cli
movw %cs:iniss, %ss
movw %cs:inisp, %sp
sti
int $0x1e
# NOTREACHED
lret
.data
.global iniss, inisp
iniss: .word 0
inisp: .word 0

View File

@ -0,0 +1,94 @@
# Copyright (c) KATO Takenori, 1999, 2000.
#
# 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$
#
.code16
.text
#
# Wait 1ms
#
.global wait1ms
wait1ms:
push %cx
movw $800, %cx
wait_loop:
outb %al, $0x5f
loop wait_loop
pop %cx
ret
#
# Read one byte from BIOS parameter block
# %bx offset
# %dl value
#
.global read_biosparam
read_biosparam:
movb %es:(%bx), %dl
ret
#
# Write one byte to BIOS paramter block
# %bx offset
# %dl value
#
.global write_biosparam
write_biosparam:
movb %dl, %es:(%bx)
ret
#
# beep
#
.global beep_on, beep_off, beep
beep_on:
movb $0x17, %ah
int $0x18
ret
beep_off:
movb $0x18, %ah
int $0x18
ret
beep:
push %cx
call beep_on
movw $100, %cx
beep_loop1:
call wait1ms
loop beep_loop1
call beep_off
movw $50, %cx
beep_loop2:
call wait1ms
loop beep_loop2
pop %cx
ret

View File

@ -0,0 +1,253 @@
# Copyright (c) KATO Takenori, 1999, 2000.
#
# 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$
#
.code16
.text
#
# %al character code
# destroyed: %al, %bx
#
put_character:
movw $0xe000, %bx
movb ishireso, %ah
orb %ah, %ah
jne hireso_ch
movw $0xa000, %bx
hireso_ch:
movw %bx, %es
xorb %ah, %ah
movw curpos, %bx
movw %ax, %es:(%bx)
xorw %ax, %ax
movw %ax, %es
ret
#
# %al attribute
# destroyed: %ah, %cx
#
set_attribute:
movw $0xe200, %bx
movb ishireso, %ah
orb %ah, %ah
jne hireso_ch
movw $0xa200, %bx
hireso_attr:
movw %bx, %es
xorb %ah, %ah
movw curpos, %bx
movw %ax, %es:(%bx)
xorw %bx, %bx
movw %bx, %es
ret
#
# Put a character
# %al: character code
# destroyed: %ah, %bx, %cx
#
.global sc_putc
sc_putc:
call put_character
incw curpos
incw curpos
cmpw $4000, curpos
jng putc_end
movw $0, curpos
putc_end:
ret
#
# Put a null terminated string
# %di: pointer to string
# destroyed: %ah, %cx, %di
#
.global sc_puts
sc_puts:
movb (%di), %al
orb %al, %al
jz puts_end
call sc_putc
incw %di
jmp sc_puts
puts_end:
ret
#
# Change the current cursor position
# %cx: X
# %dx: Y
# destroyed: %ax, %bx
#
.global sc_goto
sc_goto:
movw %dx, %ax # AX=Y
shlw %ax # AX=Y*64
shlw %ax
shlw %ax
shlw %ax
shlw %ax
shlw %ax
movw %dx, %bx # BX=Y
shlw %bx # BX=Y*16
shlw %bx
shlw %bx
shlw %bx
addw %bx, %ax # AX=Y*64+Y*16=Y*80
addw %cx, %ax
shlw %ax
movw %ax, curpos
ret
#
# Clear screen
# destroyed: %ax, %bx
#
.global sc_clean
sc_clean:
movb $0x16, %ah
movw $0xe120, %dx
int $0x18 # KBD/CRT BIOS
movw $0, curpos
ret
#
# Set sttribute code
# %al: attribute
# %cx: count
# destroyed: %ax, %bx, %cx
#
.global sc_setattr
sc_setattr:
call set_attribute
incw curpos
incw curpos
loop sc_setattr
#
# Sense the state of shift key
# destroyed: %ax
#
.global sc_getshiftkey
sc_getshiftkey:
movb $2, %ah # Sense KB_SHIFT_COD
int $0x18 # KBD/CRT BIOS
xorb %ah, %ah
ret
#
# Check KBD buffer
#
.global sc_iskeypress
sc_iskeypress:
mov $1, %ah
int $0x18 # KBD/CRT BIOS
testb $1, %bh
jz no_key
movw $1, %ax
ret
no_key:
xorw %ax, %ax
ret
#
# Read from KBD
#
.global sc_getc
sc_getc:
xorb %ah, %ah
int $0x18
ret
#
# Initialize CRT (normal mode)
#
init_screen_normal:
# Disable graphic screen
movb $0x41, %ah
int $0x18
# Init graphic screen
movb $0x42, %al
movb $0xc0, %ch
int $0x18
# 80x25 mode
movw $0x0a00, %ax
int $0x18
ret
#
# Initialize CRT (hireso mode)
#
init_screen_hireso:
# Init RAM window
movb $8, %al
outb %al, $0x91
movb $0x0a, %al
outb %al, $0x93
# 80x31 mode
movw $0x0a00, %ax
int $0x18
ret
#
# Initialize screen (internal)
#
init_screen:
movb ishireso, %ah
orb %ah, %ah
jne hireso_ini
call init_screen_normal
jmp init_next
hireso_ini:
call init_screen_hireso
init_next:
movb $0x0c, %ah
int $0x18
# cursor home and off
xorw %dx, %dx
movb $0x13, %ah
int $0x18
movb $0x12, %ah
int $0x18
ret
#
# Initialize screeen
#
.global sc_init
sc_init:
call init_screen
call sc_clean
movw $0, curpos
ret
.data
curpos: .word 0 # Current cursor position

View File

@ -0,0 +1,20 @@
# $FreeBSD$
PROG= boot0
OBJS= boot0.o
NOMAN=
STRIP=
BINDIR?= /boot
BINMODE= 444
ORG= 0x0000
boot0: boot0.out
objcopy -S -O binary boot0.out ${.TARGET}
boot0.out: ${OBJS}
${LD} -N -e start -Ttext ${ORG} -o ${.TARGET} ${OBJS}
CLEANFILES+= boot0.out
.include <bsd.prog.mk>

108
sys/boot/pc98/boot0/boot0.s Normal file
View File

@ -0,0 +1,108 @@
# Copyright (c) KATO Takenori, 1999, 2000.
#
# 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.
# 3. The name of the author may not be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# 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$
.globl start
.code16
start:
jmp main
.org 4
.ascii "IPL1"
.byte 0, 0, 0
.globl start
main:
xor %ax, %ax
mov %ax, %ds
mov (0x584), %al # DA/UA
mov %al, %ah
and $0xf0, %ah
cmp $0x90, %ah
je fdd
# hdd
mov $6, %ah
mov $0x3000, %bx
mov %bx, %es
mov $0x2000, %bx
xor %cx, %cx
xor %dx, %dx
xor %bp, %bp
int $0x1b
jc error_hdd
push %ax
mov %es, %ax
add $0x40, %ax
mov %ax, %es
pop %ax
push %es
push %bp
lret
# fdd
fdd:
xor %di, %di
fdd_retry:
mov $0xd6, %ah
mov $0x3000, %bx
mov %bx, %es
mov $0x2000, %bx
mov $0x0200, %cx
mov $0x0001, %dx
xor %bp, %bp
int $0x1b
jc error
push %ax
mov %es, %ax
add $0x40, %ax
mov %ax, %es
pop %ax
push %es
push %bp
lret
error:
or %di, %di
jnz error_hdd
and $0x0f, %al
or $0x30, %al
jmp fdd_retry
error_hdd:
jmp error
.org 0x1fa
.byte 0 # defflag_off
.byte 0 # defpart_off
.byte 1 # menu version
.byte 0
.word 0xaa55