mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-11-29 17:32:43 +00:00
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:
parent
19a0702e86
commit
e9b13dd6ec
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=64123
@ -1,5 +1,5 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SUBDIR= btx boot2 libpc98 loader
|
||||
SUBDIR= btx boot0 boot0.5 boot2 libpc98 loader
|
||||
|
||||
.include <bsd.subdir.mk>
|
||||
|
25
sys/boot/pc98/boot0.5/Makefile
Normal file
25
sys/boot/pc98/boot0.5/Makefile
Normal 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>
|
174
sys/boot/pc98/boot0.5/boot.s
Normal file
174
sys/boot/pc98/boot0.5/boot.s
Normal 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
|
290
sys/boot/pc98/boot0.5/boot0.5.s
Normal file
290
sys/boot/pc98/boot0.5/boot0.5.s
Normal 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"
|
285
sys/boot/pc98/boot0.5/disk.s
Normal file
285
sys/boot/pc98/boot0.5/disk.s
Normal 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
|
444
sys/boot/pc98/boot0.5/selector.s
Normal file
444
sys/boot/pc98/boot0.5/selector.s
Normal 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 " "
|
58
sys/boot/pc98/boot0.5/start.s
Normal file
58
sys/boot/pc98/boot0.5/start.s
Normal 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
|
94
sys/boot/pc98/boot0.5/support.s
Normal file
94
sys/boot/pc98/boot0.5/support.s
Normal 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
|
253
sys/boot/pc98/boot0.5/syscons.s
Normal file
253
sys/boot/pc98/boot0.5/syscons.s
Normal 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
|
20
sys/boot/pc98/boot0/Makefile
Normal file
20
sys/boot/pc98/boot0/Makefile
Normal 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
108
sys/boot/pc98/boot0/boot0.s
Normal 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
|
Loading…
Reference in New Issue
Block a user