Remove pc98 support completely.
I thank all developers and contributors for pc98. Relnotes: yes
This commit is contained in:
parent
8c2c935f91
commit
259480b6de
5
Makefile
5
Makefile
@ -236,7 +236,7 @@ _MAKE+= MK_META_MODE=no
|
|||||||
|
|
||||||
# Guess machine architecture from machine type, and vice versa.
|
# Guess machine architecture from machine type, and vice versa.
|
||||||
.if !defined(TARGET_ARCH) && defined(TARGET)
|
.if !defined(TARGET_ARCH) && defined(TARGET)
|
||||||
_TARGET_ARCH= ${TARGET:S/pc98/i386/:S/arm64/aarch64/}
|
_TARGET_ARCH= ${TARGET:S/arm64/aarch64/}
|
||||||
.elif !defined(TARGET) && defined(TARGET_ARCH) && \
|
.elif !defined(TARGET) && defined(TARGET_ARCH) && \
|
||||||
${TARGET_ARCH} != ${MACHINE_ARCH}
|
${TARGET_ARCH} != ${MACHINE_ARCH}
|
||||||
_TARGET= ${TARGET_ARCH:C/mips(n32|64)?(el)?(hf)?/mips/:C/arm(v6)?(eb)?/arm/:C/aarch64/arm64/:C/powerpc64/powerpc/:C/powerpcspe/powerpc/:C/riscv64(sf)?/riscv/}
|
_TARGET= ${TARGET_ARCH:C/mips(n32|64)?(el)?(hf)?/mips/:C/arm(v6)?(eb)?/arm/:C/aarch64/arm64/:C/powerpc64/powerpc/:C/powerpcspe/powerpc/:C/riscv64(sf)?/riscv/}
|
||||||
@ -417,13 +417,12 @@ worlds: .PHONY
|
|||||||
# existing system is.
|
# existing system is.
|
||||||
#
|
#
|
||||||
.if make(universe) || make(universe_kernels) || make(tinderbox) || make(targets)
|
.if make(universe) || make(universe_kernels) || make(tinderbox) || make(targets)
|
||||||
TARGETS?=amd64 arm arm64 i386 mips pc98 powerpc sparc64
|
TARGETS?=amd64 arm arm64 i386 mips powerpc sparc64
|
||||||
_UNIVERSE_TARGETS= ${TARGETS}
|
_UNIVERSE_TARGETS= ${TARGETS}
|
||||||
TARGET_ARCHES_arm?= arm armeb armv6
|
TARGET_ARCHES_arm?= arm armeb armv6
|
||||||
TARGET_ARCHES_arm64?= aarch64
|
TARGET_ARCHES_arm64?= aarch64
|
||||||
TARGET_ARCHES_mips?= mipsel mips mips64el mips64 mipsn32 mipselhf mipshf mips64elhf mips64hf
|
TARGET_ARCHES_mips?= mipsel mips mips64el mips64 mipsn32 mipselhf mipshf mips64elhf mips64hf
|
||||||
TARGET_ARCHES_powerpc?= powerpc powerpc64 powerpcspe
|
TARGET_ARCHES_powerpc?= powerpc powerpc64 powerpcspe
|
||||||
TARGET_ARCHES_pc98?= i386
|
|
||||||
.for target in ${TARGETS}
|
.for target in ${TARGETS}
|
||||||
TARGET_ARCHES_${target}?= ${target}
|
TARGET_ARCHES_${target}?= ${target}
|
||||||
.endfor
|
.endfor
|
||||||
|
@ -349,7 +349,6 @@ KNOWN_ARCHES?= aarch64/arm64 \
|
|||||||
armeb/arm \
|
armeb/arm \
|
||||||
armv6/arm \
|
armv6/arm \
|
||||||
i386 \
|
i386 \
|
||||||
i386/pc98 \
|
|
||||||
mips \
|
mips \
|
||||||
mipsel/mips \
|
mipsel/mips \
|
||||||
mips64el/mips \
|
mips64el/mips \
|
||||||
|
@ -38,6 +38,17 @@
|
|||||||
# xargs -n1 | sort | uniq -d;
|
# xargs -n1 | sort | uniq -d;
|
||||||
# done
|
# done
|
||||||
|
|
||||||
|
# 20170128: remove pc98 support
|
||||||
|
OLD_FILES+=usr/include/dev/ic/i8251.h
|
||||||
|
OLD_FILES+=usr/include/dev/ic/wd33c93reg.h
|
||||||
|
OLD_FILES+=usr/include/sys/disk/pc98.h
|
||||||
|
OLD_FILES+=usr/include/sys/diskpc98.h
|
||||||
|
OLD_FILES+=usr/share/man/man4/i386/ct.4.gz
|
||||||
|
OLD_FILES+=usr/share/man/man4/i386/snc.4.gz
|
||||||
|
OLD_FILES+=usr/share/syscons/keymaps/jp.pc98.iso.kbd
|
||||||
|
OLD_FILES+=usr/share/syscons/keymaps/jp.pc98.kbd
|
||||||
|
OLD_FILES+=usr/share/vt/keymaps/jp.pc98.iso.kbd
|
||||||
|
OLD_FILES+=usr/share/vt/keymaps/jp.pc98.kbd
|
||||||
# 20170110: Four files from ggate tests consolidated into one
|
# 20170110: Four files from ggate tests consolidated into one
|
||||||
OLD_FILES+=usr/tests/sys/geom/class/gate/1_test
|
OLD_FILES+=usr/tests/sys/geom/class/gate/1_test
|
||||||
OLD_FILES+=usr/tests/sys/geom/class/gate/2_test
|
OLD_FILES+=usr/tests/sys/geom/class/gate/2_test
|
||||||
|
@ -1,49 +0,0 @@
|
|||||||
#
|
|
||||||
# $FreeBSD$
|
|
||||||
# @(#)ttys 5.1 (Berkeley) 4/17/89
|
|
||||||
#
|
|
||||||
# This file specifies various information about terminals on the system.
|
|
||||||
# It is used by several different programs. Common entries for the
|
|
||||||
# various columns include:
|
|
||||||
#
|
|
||||||
# name The name of the terminal device.
|
|
||||||
#
|
|
||||||
# getty The program to start running on the terminal. Typically a
|
|
||||||
# getty program, as the name implies. Other common entries
|
|
||||||
# include none, when no getty is needed, and xdm, to start the
|
|
||||||
# X Window System.
|
|
||||||
#
|
|
||||||
# type The initial terminal type for this port. For hardwired
|
|
||||||
# terminal lines, this will contain the type of terminal used.
|
|
||||||
# For virtual consoles, the correct type is typically cons25w.
|
|
||||||
# Other common values include dialup for incoming modem ports, and
|
|
||||||
# unknown when the terminal type cannot be predetermined.
|
|
||||||
#
|
|
||||||
# status Must be on or off. If on, init will run the getty program on
|
|
||||||
# the specified port. If the word "secure" appears, this tty
|
|
||||||
# allows root login.
|
|
||||||
#
|
|
||||||
# name getty type status comments
|
|
||||||
#
|
|
||||||
# If console is marked "insecure", then init will ask for the root password
|
|
||||||
# when going to single-user mode.
|
|
||||||
console none unknown off secure
|
|
||||||
#
|
|
||||||
ttyv0 "/usr/libexec/getty Pc" cons25w on secure
|
|
||||||
# Virtual terminals
|
|
||||||
ttyv1 "/usr/libexec/getty Pc" cons25w on secure
|
|
||||||
ttyv2 "/usr/libexec/getty Pc" cons25w on secure
|
|
||||||
ttyv3 "/usr/libexec/getty Pc" cons25w on secure
|
|
||||||
ttyv4 "/usr/libexec/getty Pc" cons25w on secure
|
|
||||||
ttyv5 "/usr/libexec/getty Pc" cons25w on secure
|
|
||||||
ttyv6 "/usr/libexec/getty Pc" cons25w on secure
|
|
||||||
ttyv7 "/usr/libexec/getty Pc" cons25w on secure
|
|
||||||
ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure
|
|
||||||
# Serial terminals
|
|
||||||
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
|
|
||||||
ttyu0 "/usr/libexec/getty 3wire" vt100 onifconsole secure
|
|
||||||
ttyu1 "/usr/libexec/getty 3wire" vt100 onifconsole secure
|
|
||||||
ttyu2 "/usr/libexec/getty 3wire" vt100 onifconsole secure
|
|
||||||
ttyu3 "/usr/libexec/getty 3wire" vt100 onifconsole secure
|
|
||||||
# Dumb console
|
|
||||||
dcons "/usr/libexec/getty std.9600" vt100 off secure
|
|
@ -112,7 +112,6 @@ icelandic.iso) echo is;;
|
|||||||
it.iso) echo it;;
|
it.iso) echo it;;
|
||||||
jp.106x) echo jp.capsctrl;;
|
jp.106x) echo jp.capsctrl;;
|
||||||
jp.106) echo jp;;
|
jp.106) echo jp;;
|
||||||
#?? jp.pc98.iso) echo jp.pc98;;
|
|
||||||
kk.pt154.io) echo kz.io;;
|
kk.pt154.io) echo kz.io;;
|
||||||
kk.pt154.kst) echo kz.kst;;
|
kk.pt154.kst) echo kz.kst;;
|
||||||
latinamerican.iso.acc) echo latinamerican.acc;;
|
latinamerican.iso.acc) echo latinamerican.acc;;
|
||||||
|
@ -120,7 +120,7 @@ tables.h: mktables
|
|||||||
ioctl.c: .PHONY
|
ioctl.c: .PHONY
|
||||||
.endif
|
.endif
|
||||||
ioctl.c: mkioctls .META
|
ioctl.c: mkioctls .META
|
||||||
env MACHINE=${MACHINE} CPP="${CPP}" \
|
env CPP="${CPP}" \
|
||||||
/bin/sh ${.CURDIR}/mkioctls ${DESTDIR}${INCLUDEDIR} > ${.TARGET}
|
/bin/sh ${.CURDIR}/mkioctls ${DESTDIR}${INCLUDEDIR} > ${.TARGET}
|
||||||
|
|
||||||
beforedepend: ioctl.c tables.h
|
beforedepend: ioctl.c tables.h
|
||||||
|
@ -24,15 +24,7 @@ ioctl_includes=$(
|
|||||||
awk '{printf("#include <%s>\\n", $1)}'
|
awk '{printf("#include <%s>\\n", $1)}'
|
||||||
)
|
)
|
||||||
|
|
||||||
: ${MACHINE=$(uname -m)}
|
ioctl_includes="$ioctl_includes#include <sys/diskmbr.h>\\n"
|
||||||
case "${MACHINE}" in
|
|
||||||
*pc98*)
|
|
||||||
ioctl_includes="$ioctl_includes#include <sys/diskpc98.h>\\n"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
ioctl_includes="$ioctl_includes#include <sys/diskmbr.h>\\n"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
awk -v x="$ioctl_includes" 'BEGIN {print x}' |
|
awk -v x="$ioctl_includes" 'BEGIN {print x}' |
|
||||||
$CPP -nostdinc -I$includedir -dM -DCOMPAT_43TTY - |
|
$CPP -nostdinc -I$includedir -dM -DCOMPAT_43TTY - |
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
# Because i386 adds extra stuff we don't need or want for PC98 we need
|
|
||||||
# an empty file so it doesn't get added.
|
|
@ -99,7 +99,7 @@ element will be included. For example:
|
|||||||
|
|
||||||
<para arch="sparc64">SPARC64-specific text</para>
|
<para arch="sparc64">SPARC64-specific text</para>
|
||||||
|
|
||||||
The currently-supported architectures are amd64, arm, i386, pc98,
|
The currently-supported architectures are amd64, arm, i386,
|
||||||
powerpc and sparc64. An element may appear for multiple architectures
|
powerpc and sparc64. An element may appear for multiple architectures
|
||||||
by specifying a comma-separated list of architectures
|
by specifying a comma-separated list of architectures
|
||||||
(i.e. arch="sparc64,amd64").
|
(i.e. arch="sparc64,amd64").
|
||||||
|
@ -252,35 +252,6 @@
|
|||||||
more information.</para>
|
more information.</para>
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
<sect2 xml:id="proc-pc98">
|
|
||||||
<title>pc98</title>
|
|
||||||
|
|
||||||
<para>NEC PC-9801/9821 series with almost all &i386;-compatible
|
|
||||||
processors, including 80486, &pentium;, &pentium; Pro,
|
|
||||||
&pentium; II, and variants. All &i386;-compatible processors
|
|
||||||
by AMD, Cyrix, IBM, and IDT are also supported.</para>
|
|
||||||
|
|
||||||
<para>NEC FC-9801/9821 series, and NEC SV-98 series (both of
|
|
||||||
them are compatible with PC-9801/9821 series) should be
|
|
||||||
supported.</para>
|
|
||||||
|
|
||||||
<para>EPSON PC-386/486/586 series, which are compatible with NEC
|
|
||||||
PC-9801 series are supported.</para>
|
|
||||||
|
|
||||||
<para>High-resolution mode is not supported. NEC
|
|
||||||
PC-98XA/XL/RL/XL^2, and NEC PC-H98 series are supported in
|
|
||||||
normal (PC-9801 compatible) mode only.</para>
|
|
||||||
|
|
||||||
<para>Although there are some multi-processor systems (such as
|
|
||||||
Rs20/B20), SMP-related features of &os; are not supported
|
|
||||||
yet.</para>
|
|
||||||
|
|
||||||
<para>PC-9801/9821 standard bus (called C-Bus), PC-9801NOTE
|
|
||||||
expansion bus (110pin), and PCI bus are supported. New Extend
|
|
||||||
Standard Architecture (NESA) bus (used in PC-H98, SV-H98, and
|
|
||||||
FC-H98 series) is not supported.</para>
|
|
||||||
</sect2>
|
|
||||||
|
|
||||||
<sect2 xml:id="proc-powerpc">
|
<sect2 xml:id="proc-powerpc">
|
||||||
<title>powerpc</title>
|
<title>powerpc</title>
|
||||||
|
|
||||||
@ -636,17 +607,9 @@
|
|||||||
<sect2 xml:id="disk">
|
<sect2 xml:id="disk">
|
||||||
<title>Disk Controllers</title>
|
<title>Disk Controllers</title>
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;, &arch.sparc64;]
|
<para>[&arch.amd64;, &arch.i386;, &arch.sparc64;]
|
||||||
IDE/ATA controllers (&man.ata.4; driver)</para>
|
IDE/ATA controllers (&man.ata.4; driver)</para>
|
||||||
|
|
||||||
<para>[&arch.pc98;] IDE/ATA controllers (wdc driver)</para>
|
|
||||||
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem>
|
|
||||||
<para>On-board IDE controller</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
|
|
||||||
&hwlist.aac;
|
&hwlist.aac;
|
||||||
|
|
||||||
&hwlist.adv;
|
&hwlist.adv;
|
||||||
@ -673,8 +636,6 @@
|
|||||||
|
|
||||||
&hwlist.ciss;
|
&hwlist.ciss;
|
||||||
|
|
||||||
&hwlist.ct;
|
|
||||||
|
|
||||||
&hwlist.dpt;
|
&hwlist.dpt;
|
||||||
|
|
||||||
<note>
|
<note>
|
||||||
@ -894,8 +855,6 @@
|
|||||||
|
|
||||||
&hwlist.sn;
|
&hwlist.sn;
|
||||||
|
|
||||||
&hwlist.snc;
|
|
||||||
|
|
||||||
&hwlist.ste;
|
&hwlist.ste;
|
||||||
|
|
||||||
&hwlist.stge;
|
&hwlist.stge;
|
||||||
@ -904,7 +863,7 @@
|
|||||||
|
|
||||||
&hwlist.tl;
|
&hwlist.tl;
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;] SMC 83c17x
|
<para>[&arch.amd64;, &arch.i386;] SMC 83c17x
|
||||||
(EPIC)-based Ethernet NICs (&man.tx.4; driver)</para>
|
(EPIC)-based Ethernet NICs (&man.tx.4; driver)</para>
|
||||||
|
|
||||||
&hwlist.txp;
|
&hwlist.txp;
|
||||||
@ -934,8 +893,7 @@
|
|||||||
<sect2 xml:id="fddi">
|
<sect2 xml:id="fddi">
|
||||||
<title>FDDI Interfaces</title>
|
<title>FDDI Interfaces</title>
|
||||||
|
|
||||||
<para>[&arch.i386;, &arch.pc98;] DEC DEFPA PCI (&man.fpa.4;
|
<para>[&arch.i386;] DEC DEFPA PCI (&man.fpa.4; driver)</para>
|
||||||
driver)</para>
|
|
||||||
|
|
||||||
<para>[&arch.i386;] DEC DEFEA EISA (&man.fpa.4; driver)</para>
|
<para>[&arch.i386;] DEC DEFEA EISA (&man.fpa.4; driver)</para>
|
||||||
</sect2>
|
</sect2>
|
||||||
@ -943,28 +901,28 @@
|
|||||||
<sect2 xml:id="atm">
|
<sect2 xml:id="atm">
|
||||||
<title>ATM Interfaces</title>
|
<title>ATM Interfaces</title>
|
||||||
|
|
||||||
<para>[&arch.i386;, &arch.pc98;] Midway-based ATM interfaces
|
<para>[&arch.i386;] Midway-based ATM interfaces
|
||||||
(&man.en.4; driver)</para>
|
(&man.en.4; driver)</para>
|
||||||
|
|
||||||
<para>[&arch.i386;, &arch.pc98; &arch.sparc64;] FORE Systems,
|
<para>[&arch.i386;, &arch.sparc64;] FORE Systems,
|
||||||
Inc. PCA-200E ATM PCI Adapters (hfa and &man.fatm.4;
|
Inc. PCA-200E ATM PCI Adapters (hfa and &man.fatm.4;
|
||||||
drivers)</para>
|
drivers)</para>
|
||||||
|
|
||||||
<para>[&arch.i386;, &arch.pc98;] IDT NICStAR 77201/211-based ATM
|
<para>[&arch.i386;] IDT NICStAR 77201/211-based ATM
|
||||||
Adapters (&man.idt.4; driver)</para>
|
Adapters (&man.idt.4; driver)</para>
|
||||||
|
|
||||||
<para>[&arch.i386;, &arch.pc98; &arch.sparc64;] FORE Systems,
|
<para>[&arch.i386;, &arch.sparc64;] FORE Systems,
|
||||||
Inc. HE155 and HE622 ATM interfaces (&man.hatm.4;
|
Inc. HE155 and HE622 ATM interfaces (&man.hatm.4;
|
||||||
driver)</para>
|
driver)</para>
|
||||||
|
|
||||||
<para>[&arch.i386;, &arch.pc98;] IDT77252-based ATM cards
|
<para>[&arch.i386;] IDT77252-based ATM cards
|
||||||
(&man.patm.4; driver)</para>
|
(&man.patm.4; driver)</para>
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
<sect2 xml:id="wlan">
|
<sect2 xml:id="wlan">
|
||||||
<title>Wireless Network Interfaces</title>
|
<title>Wireless Network Interfaces</title>
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;] Cisco/Aironet
|
<para>[&arch.amd64;, &arch.i386;] Cisco/Aironet
|
||||||
802.11b wireless adapters (&man.an.4; driver)</para>
|
802.11b wireless adapters (&man.an.4; driver)</para>
|
||||||
|
|
||||||
&hwlist.ath;
|
&hwlist.ath;
|
||||||
@ -1016,7 +974,7 @@
|
|||||||
|
|
||||||
&hwlist.urtw;
|
&hwlist.urtw;
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;] Lucent
|
<para>[&arch.amd64;, &arch.i386;] Lucent
|
||||||
Technologies WaveLAN/IEEE 802.11b wireless network adapters
|
Technologies WaveLAN/IEEE 802.11b wireless network adapters
|
||||||
and workalikes using the Lucent Hermes, Intersil PRISM-II,
|
and workalikes using the Lucent Hermes, Intersil PRISM-II,
|
||||||
Intersil PRISM-2.5, Intersil Prism-3, and Symbol Spectrum24
|
Intersil PRISM-2.5, Intersil Prism-3, and Symbol Spectrum24
|
||||||
@ -1214,77 +1172,6 @@
|
|||||||
|
|
||||||
&hwlist.rc;
|
&hwlist.rc;
|
||||||
|
|
||||||
<para>[&arch.pc98;] Internel serial interfaces (&man.sio.4;
|
|
||||||
driver)</para>
|
|
||||||
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem>
|
|
||||||
<para>PC-9801 on-board</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>PC-9821 2'nd CCU (flags 0x12000000)</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
|
|
||||||
<para>[&arch.pc98;] NEC PC-9861K, PC-9801-101 and Midori-Denshi
|
|
||||||
MDC-926Rs (&man.sio.4; driver)</para>
|
|
||||||
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem>
|
|
||||||
<para>COM2 (flags 0x01000000)</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>COM3 (flags 0x02000000)</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
|
|
||||||
<para>[&arch.pc98;] NEC PC-9801-120 (&man.sio.4; driver)</para>
|
|
||||||
|
|
||||||
<note>
|
|
||||||
<para>"flags 0x11000000" is necessary in kernel
|
|
||||||
configuration.</para>
|
|
||||||
</note>
|
|
||||||
|
|
||||||
<para>[&arch.pc98;] Microcore MC-16550, MC-16550II, MC-RS98
|
|
||||||
(&man.sio.4; driver)</para>
|
|
||||||
|
|
||||||
<note>
|
|
||||||
<para>"flags 0x14000?01" is necessary in kernel
|
|
||||||
configuration.</para>
|
|
||||||
</note>
|
|
||||||
|
|
||||||
<para>[&arch.pc98;] Media Intelligent RSB-2000, RSB-3000 and
|
|
||||||
AIWA B98-02 (&man.sio.4; driver)</para>
|
|
||||||
|
|
||||||
<note>
|
|
||||||
<para>"flags 0x15000?01" is necessary in kernel
|
|
||||||
configuration.</para>
|
|
||||||
</note>
|
|
||||||
|
|
||||||
<para>[&arch.pc98;] Media Intelligent RSB-384 (&man.sio.4;
|
|
||||||
driver)</para>
|
|
||||||
|
|
||||||
<note>
|
|
||||||
<para>"flags 0x16000001" is necessary in kernel
|
|
||||||
configuration.</para>
|
|
||||||
</note>
|
|
||||||
|
|
||||||
<para>[&arch.pc98;] I-O DATA RSA-98III (&man.sio.4;
|
|
||||||
driver)</para>
|
|
||||||
|
|
||||||
<note>
|
|
||||||
<para>"flags 0x18000?01" is necessary in kernel
|
|
||||||
configuration.</para>
|
|
||||||
</note>
|
|
||||||
|
|
||||||
<para>[&arch.pc98;] Hayes ESP98 (&man.sio.4; driver)</para>
|
|
||||||
|
|
||||||
<note>
|
|
||||||
<para>"options COM_ESP" and "flags 0x19000000" are necessary
|
|
||||||
in kernel configuration.</para>
|
|
||||||
</note>
|
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
<sect2 xml:id="sound">
|
<sect2 xml:id="sound">
|
||||||
@ -1350,35 +1237,6 @@
|
|||||||
|
|
||||||
&hwlist.snd.vibes;
|
&hwlist.snd.vibes;
|
||||||
|
|
||||||
<para>[&arch.pc98;] NEC PC-9801-73, 86 and compatibles (nss
|
|
||||||
driver)</para>
|
|
||||||
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem>
|
|
||||||
<para>NEC A-MATE internal sound</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>Q-Vision WaveStar, WaveMaster</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
|
|
||||||
<para>[&arch.pc98;] NEC X-MATE, CanBe, ValueStar internal (mss
|
|
||||||
driver)</para>
|
|
||||||
|
|
||||||
<para>[&arch.pc98;] Creative Technologies SoundBlaster(98)
|
|
||||||
(&man.sb.4; driver)</para>
|
|
||||||
|
|
||||||
<para>[&arch.pc98;] I-O DATA CD-BOX (&man.sb.4; driver)</para>
|
|
||||||
|
|
||||||
<para>[&arch.pc98;] MPU-401 and compatible interfaces (mpu
|
|
||||||
driver)</para>
|
|
||||||
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem>
|
|
||||||
<para>Q-Vision WaveStar</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
<sect2 xml:id="camera">
|
<sect2 xml:id="camera">
|
||||||
@ -1392,7 +1250,7 @@
|
|||||||
<sect2 xml:id="usb">
|
<sect2 xml:id="usb">
|
||||||
<title>USB Devices</title>
|
<title>USB Devices</title>
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;] A
|
<para>[&arch.amd64;, &arch.i386;] A
|
||||||
range of USB peripherals are supported; devices known to work
|
range of USB peripherals are supported; devices known to work
|
||||||
are listed in this section. Owing to the generic nature of
|
are listed in this section. Owing to the generic nature of
|
||||||
most USB devices, with some exceptions any device of a given
|
most USB devices, with some exceptions any device of a given
|
||||||
@ -1400,14 +1258,14 @@
|
|||||||
here.</para>
|
here.</para>
|
||||||
|
|
||||||
<note>
|
<note>
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
|
<para>[&arch.amd64;, &arch.i386;]
|
||||||
USB Ethernet adapters can be found in the section listing
|
USB Ethernet adapters can be found in the section listing
|
||||||
<link linkend="ethernet">Ethernet
|
<link linkend="ethernet">Ethernet
|
||||||
interfaces</link>.</para>
|
interfaces</link>.</para>
|
||||||
</note>
|
</note>
|
||||||
|
|
||||||
<note>
|
<note>
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
|
<para>[&arch.amd64;, &arch.i386;]
|
||||||
USB Bluetooth adapters can be found in <link linkend="bluetooth">Bluetooth</link> section.</para>
|
USB Bluetooth adapters can be found in <link linkend="bluetooth">Bluetooth</link> section.</para>
|
||||||
</note>
|
</note>
|
||||||
|
|
||||||
@ -1415,18 +1273,15 @@
|
|||||||
|
|
||||||
&hwlist.uhci;
|
&hwlist.uhci;
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;] USB
|
<para>[&arch.amd64;, &arch.i386;] USB
|
||||||
2.0 controllers using the EHCI interface (&man.ehci.4;
|
2.0 controllers using the EHCI interface (&man.ehci.4;
|
||||||
driver)</para>
|
driver)</para>
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
|
<para>[&arch.amd64;, &arch.i386;] Hubs</para>
|
||||||
Hubs</para>
|
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
|
<para>[&arch.amd64;, &arch.i386;] Keyboards (&man.ukbd.4; driver)</para>
|
||||||
Keyboards (&man.ukbd.4; driver)</para>
|
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
|
<para>[&arch.amd64;, &arch.i386;] Miscellaneous</para>
|
||||||
Miscellaneous</para>
|
|
||||||
|
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem>
|
<listitem>
|
||||||
@ -1454,8 +1309,7 @@
|
|||||||
|
|
||||||
&hwlist.umodem;
|
&hwlist.umodem;
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;] Mice
|
<para>[&arch.amd64;, &arch.i386;] Mice (&man.ums.4; driver)</para>
|
||||||
(&man.ums.4; driver)</para>
|
|
||||||
|
|
||||||
&hwlist.ulpt;
|
&hwlist.ulpt;
|
||||||
|
|
||||||
@ -1471,7 +1325,7 @@
|
|||||||
|
|
||||||
&hwlist.umass;
|
&hwlist.umass;
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;] Audio Devices
|
<para>[&arch.amd64;, &arch.i386;] Audio Devices
|
||||||
(&man.uaudio.4; driver)</para>
|
(&man.uaudio.4; driver)</para>
|
||||||
|
|
||||||
&hwlist.uvisor;
|
&hwlist.uvisor;
|
||||||
@ -1507,8 +1361,7 @@
|
|||||||
<sect2 xml:id="misc">
|
<sect2 xml:id="misc">
|
||||||
<title>Miscellaneous</title>
|
<title>Miscellaneous</title>
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
|
<para>[&arch.amd64;, &arch.i386;] FAX-Modem/PCCARD</para>
|
||||||
FAX-Modem/PCCARD</para>
|
|
||||||
|
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem>
|
<listitem>
|
||||||
@ -1521,7 +1374,7 @@
|
|||||||
</listitem>
|
</listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;] Floppy drives
|
<para>[&arch.amd64;, &arch.i386;] Floppy drives
|
||||||
(&man.fdc.4; driver)</para>
|
(&man.fdc.4; driver)</para>
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;] VGA-compatible video cards
|
<para>[&arch.amd64;, &arch.i386;] VGA-compatible video cards
|
||||||
@ -1533,8 +1386,7 @@
|
|||||||
found at <uri xlink:href="http://www.x.org/">http://www.x.org/</uri>.</para>
|
found at <uri xlink:href="http://www.x.org/">http://www.x.org/</uri>.</para>
|
||||||
</note>
|
</note>
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
|
<para>[&arch.amd64;, &arch.i386;] Keyboards including:</para>
|
||||||
Keyboards including:</para>
|
|
||||||
|
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem>
|
<listitem>
|
||||||
@ -1548,21 +1400,17 @@
|
|||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>[&arch.pc98;] Standard keyboards</para>
|
<para>[&arch.amd64;, &arch.i386;]
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
|
|
||||||
USB keyboards (&man.ukbd.4; driver)</para>
|
USB keyboards (&man.ukbd.4; driver)</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
|
<para>[&arch.amd64;, &arch.i386;]
|
||||||
Pointing devices including:</para>
|
Pointing devices including:</para>
|
||||||
|
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;] Bus mice and
|
<para>[&arch.amd64;, &arch.i386;] Bus mice and
|
||||||
compatible devices (&man.mse.4; driver)</para>
|
compatible devices (&man.mse.4; driver)</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
@ -1577,7 +1425,7 @@
|
|||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
|
<para>[&arch.amd64;, &arch.i386;]
|
||||||
USB mice (&man.ums.4; driver)</para>
|
USB mice (&man.ums.4; driver)</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
@ -1591,17 +1439,10 @@
|
|||||||
<para>[&arch.amd64;, &arch.i386;] <quote>PC standard</quote>
|
<para>[&arch.amd64;, &arch.i386;] <quote>PC standard</quote>
|
||||||
parallel ports (&man.ppc.4; driver)</para>
|
parallel ports (&man.ppc.4; driver)</para>
|
||||||
|
|
||||||
<para>[&arch.pc98;] <quote>PC-9821 standard</quote> parallel
|
|
||||||
ports (&man.ppc.4; driver)</para>
|
|
||||||
|
|
||||||
<para>[&arch.i386;, &arch.amd64;] PC-compatible joysticks
|
<para>[&arch.i386;, &arch.amd64;] PC-compatible joysticks
|
||||||
(&man.joy.4; driver)</para>
|
(&man.joy.4; driver)</para>
|
||||||
|
|
||||||
<para>[&arch.pc98;] Joystick port of SoundBlaster(98)
|
<para>[&arch.i386;] PHS Data Communication Card/PCCARD</para>
|
||||||
(&man.joy.4; driver)</para>
|
|
||||||
|
|
||||||
<para>[&arch.i386;, &arch.pc98;] PHS Data Communication
|
|
||||||
Card/PCCARD</para>
|
|
||||||
|
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem>
|
<listitem>
|
||||||
@ -1621,8 +1462,6 @@
|
|||||||
cards compatible with the HOT1 from <link xlink:href="http://www.vcc.com/">Virtual Computers</link> (xrpu
|
cards compatible with the HOT1 from <link xlink:href="http://www.vcc.com/">Virtual Computers</link> (xrpu
|
||||||
driver).</para>
|
driver).</para>
|
||||||
|
|
||||||
<para>[&arch.pc98;] Power Management Controller of NEC PC-98
|
|
||||||
Note (pmc driver)</para>
|
|
||||||
</sect2>
|
</sect2>
|
||||||
</sect1>
|
</sect1>
|
||||||
</article>
|
</article>
|
||||||
|
@ -69,7 +69,6 @@
|
|||||||
<para>&os; is an operating system based on 4.4 BSD Lite for
|
<para>&os; is an operating system based on 4.4 BSD Lite for
|
||||||
AMD64 and Intel EM64T based PC hardware (&arch.amd64;),
|
AMD64 and Intel EM64T based PC hardware (&arch.amd64;),
|
||||||
Intel, AMD, Cyrix or NexGen <quote>x86</quote> based PC hardware (&arch.i386;),
|
Intel, AMD, Cyrix or NexGen <quote>x86</quote> based PC hardware (&arch.i386;),
|
||||||
NEC PC-9801/9821 series PCs and compatibles (&arch.pc98;),
|
|
||||||
and &ultrasparc; machines (&arch.sparc64;). Versions
|
and &ultrasparc; machines (&arch.sparc64;). Versions
|
||||||
for the &arm; (&arch.arm;), &mips; (&arch.mips;), and
|
for the &arm; (&arch.arm;), &mips; (&arch.mips;), and
|
||||||
&powerpc; (&arch.powerpc;) architectures are currently under
|
&powerpc; (&arch.powerpc;) architectures are currently under
|
||||||
@ -324,7 +323,7 @@
|
|||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>On platforms that support &man.bsdinstall.8; (currently
|
<para>On platforms that support &man.bsdinstall.8; (currently
|
||||||
&arch.amd64;, &arch.i386;, &arch.pc98;, and &arch.sparc64;), these documents are generally available via the
|
&arch.amd64;, &arch.i386;, and &arch.sparc64;), these documents are generally available via the
|
||||||
Documentation menu during installation. Once the system is
|
Documentation menu during installation. Once the system is
|
||||||
installed, you can revisit this menu by re-running the
|
installed, you can revisit this menu by re-running the
|
||||||
&man.bsdinstall.8; utility.</para>
|
&man.bsdinstall.8; utility.</para>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
# the build tree.
|
# the build tree.
|
||||||
#
|
#
|
||||||
|
|
||||||
ARCHS= amd64 i386 pc98 powerpc sparc64
|
ARCHS= amd64 i386 powerpc sparc64
|
||||||
MULTITEXTS=
|
MULTITEXTS=
|
||||||
UNITEXTS= hardware readme relnotes errata
|
UNITEXTS= hardware readme relnotes errata
|
||||||
|
|
||||||
|
@ -36,43 +36,42 @@
|
|||||||
# <Driver name><tab><arch>[,<arch>...]
|
# <Driver name><tab><arch>[,<arch>...]
|
||||||
#
|
#
|
||||||
aac i386,amd64
|
aac i386,amd64
|
||||||
adv i386,pc98,amd64
|
adv i386,amd64
|
||||||
adw i386,pc98,amd64
|
adw i386,amd64
|
||||||
aha i386
|
aha i386
|
||||||
ahb i386
|
ahb i386
|
||||||
ahd i386,sparc64,amd64
|
ahd i386,sparc64,amd64
|
||||||
aic i386,pc98,amd64
|
aic i386,amd64
|
||||||
amd i386,pc98,amd64
|
amd i386,amd64
|
||||||
arcmsr i386,amd64
|
arcmsr i386,amd64
|
||||||
asr i386
|
asr i386
|
||||||
ath i386,pc98,amd64,sparc64
|
ath i386,amd64,sparc64
|
||||||
aue i386,pc98,amd64,powerpc
|
aue i386,amd64,powerpc
|
||||||
axe i386,pc98,amd64,powerpc
|
axe i386,amd64,powerpc
|
||||||
bce i386,amd64
|
bce i386,amd64
|
||||||
bge i386,pc98,sparc64,amd64
|
bge i386,sparc64,amd64
|
||||||
bktr i386,pc98
|
bktr i386
|
||||||
bt i386,amd64
|
bt i386,amd64
|
||||||
bxe i386,amd64
|
bxe i386,amd64
|
||||||
cdce i386,pc98,amd64,powerpc
|
cdce i386,amd64,powerpc
|
||||||
ciss i386,amd64
|
ciss i386,amd64
|
||||||
ce i386,pc98
|
ce i386
|
||||||
cm i386
|
cm i386
|
||||||
cnw i386,pc98,amd64
|
cnw i386,amd64
|
||||||
cp i386,pc98
|
cp i386
|
||||||
ct pc98
|
|
||||||
ctau i386
|
ctau i386
|
||||||
cue i386,pc98,amd64,powerpc
|
cue i386,amd64,powerpc
|
||||||
cx i386
|
cx i386
|
||||||
cxgb i386,amd64
|
cxgb i386,amd64
|
||||||
de i386,pc98,amd64
|
de i386,amd64
|
||||||
dpt i386,amd64
|
dpt i386,amd64
|
||||||
ed i386,pc98
|
ed i386
|
||||||
ep i386,pc98,amd64
|
ep i386,amd64
|
||||||
esp sparc64
|
esp sparc64
|
||||||
ex i386,amd64
|
ex i386,amd64
|
||||||
fe i386,pc98,amd64
|
fe i386,amd64
|
||||||
fwohci i386,sparc64,amd64,powerpc
|
fwohci i386,sparc64,amd64,powerpc
|
||||||
hifn i386,pc98,amd64
|
hifn i386,amd64
|
||||||
hpt27xx i386,amd64
|
hpt27xx i386,amd64
|
||||||
hptiop i386,amd64
|
hptiop i386,amd64
|
||||||
hptmv i386,amd64
|
hptmv i386,amd64
|
||||||
@ -83,26 +82,26 @@ iir i386,amd64
|
|||||||
ips i386,amd64
|
ips i386,amd64
|
||||||
isci i386,amd64
|
isci i386,amd64
|
||||||
ixgb i386,amd64
|
ixgb i386,amd64
|
||||||
kue i386,pc98,amd64,powerpc
|
kue i386,amd64,powerpc
|
||||||
lge i386,pc98,amd64
|
lge i386,amd64
|
||||||
mfi i386,amd64
|
mfi i386,amd64
|
||||||
mlx i386,amd64
|
mlx i386,amd64
|
||||||
mly i386,amd64
|
mly i386,amd64
|
||||||
msk i386,amd64
|
msk i386,amd64
|
||||||
mxge i386,amd64
|
mxge i386,amd64
|
||||||
my i386,pc98
|
my i386
|
||||||
ncr i386,pc98,amd64
|
ncr i386,amd64
|
||||||
ncv i386,pc98
|
ncv i386
|
||||||
nfe i386,amd64
|
nfe i386,amd64
|
||||||
ng_bt3c i386,pc98,amd64
|
ng_bt3c i386,amd64
|
||||||
ng_ubt i386,pc98,amd64
|
ng_ubt i386,amd64
|
||||||
nsp i386,pc98
|
nsp i386
|
||||||
nxge i386,amd64
|
nxge i386,amd64
|
||||||
oce i386,amd64
|
oce i386,amd64
|
||||||
ohci i386,pc98,amd64,powerpc
|
ohci i386,amd64,powerpc
|
||||||
oltr i386
|
oltr i386
|
||||||
otus i386,amd64
|
otus i386,amd64
|
||||||
pcn i386,pc98,amd64
|
pcn i386,amd64
|
||||||
pst i386
|
pst i386
|
||||||
qlxgb amd64
|
qlxgb amd64
|
||||||
qlxgbe amd64
|
qlxgbe amd64
|
||||||
@ -110,14 +109,13 @@ qlxge amd64
|
|||||||
rc i386
|
rc i386
|
||||||
ral i386,amd64
|
ral i386,amd64
|
||||||
rsu i386,amd64
|
rsu i386,amd64
|
||||||
rue i386,pc98,amd64
|
rue i386,amd64
|
||||||
rum i386,amd64
|
rum i386,amd64
|
||||||
run i386,amd64
|
run i386,amd64
|
||||||
safe i386,pc98,amd64
|
safe i386,amd64
|
||||||
sbp i386,sparc64,amd64
|
sbp i386,sparc64,amd64
|
||||||
sfgxe amd64
|
sfgxe amd64
|
||||||
sn i386,amd64
|
sn i386,amd64
|
||||||
snc pc98
|
|
||||||
snd_ad1816 i386,amd64
|
snd_ad1816 i386,amd64
|
||||||
snd_als4000 i386
|
snd_als4000 i386
|
||||||
snd_atiixp i386,amd64
|
snd_atiixp i386,amd64
|
||||||
@ -148,31 +146,31 @@ snd_t4dwave i386,amd64,sparc64
|
|||||||
snd_via8233 i386,amd64
|
snd_via8233 i386,amd64
|
||||||
snd_via82c686 i386,amd64
|
snd_via82c686 i386,amd64
|
||||||
snd_vibes i386,amd64
|
snd_vibes i386,amd64
|
||||||
stg i386,pc98
|
stg i386
|
||||||
ti i386,pc98,amd64,sparc64
|
ti i386,amd64,sparc64
|
||||||
tl i386,pc98,amd64
|
tl i386,amd64
|
||||||
trm i386,amd64
|
trm i386,amd64
|
||||||
twa i386,amd64
|
twa i386,amd64
|
||||||
twe i386,amd64
|
twe i386,amd64
|
||||||
tws i386,amd64
|
tws i386,amd64
|
||||||
ubsa i386,pc98,amd64
|
ubsa i386,amd64
|
||||||
ubsec i386,pc98,amd64
|
ubsec i386,amd64
|
||||||
ubser i386,pc98,amd64
|
ubser i386,amd64
|
||||||
ucycom i386,pc98,amd64
|
ucycom i386,amd64
|
||||||
udav i386,pc98,amd64
|
udav i386,amd64
|
||||||
uftdi i386,pc98,amd64
|
uftdi i386,amd64
|
||||||
uhci i386,pc98,amd64,powerpc
|
uhci i386,amd64,powerpc
|
||||||
ulpt i386,pc98,amd64,powerpc
|
ulpt i386,amd64,powerpc
|
||||||
umass i386,pc98,amd64,powerpc
|
umass i386,amd64,powerpc
|
||||||
umodem i386,pc98,amd64
|
umodem i386,amd64
|
||||||
uplcom i386,pc98,amd64
|
uplcom i386,amd64
|
||||||
ural i386,amd64
|
ural i386,amd64
|
||||||
urio i386,pc98,amd64,powerpc
|
urio i386,amd64,powerpc
|
||||||
uvisor i386,pc98,amd64
|
uvisor i386,amd64
|
||||||
uvscom i386,pc98,amd64
|
uvscom i386,amd64
|
||||||
vpo i386
|
vpo i386
|
||||||
vx i386,pc98,amd64
|
vx i386,amd64
|
||||||
vxge i386,amd64
|
vxge i386,amd64
|
||||||
wb i386,pc98,amd64
|
wb i386,amd64
|
||||||
xe i386,amd64
|
xe i386,amd64
|
||||||
zyd i386,amd64
|
zyd i386,amd64
|
||||||
|
@ -73,7 +73,6 @@
|
|||||||
<!ENTITY arch.arm64 "aarch64">
|
<!ENTITY arch.arm64 "aarch64">
|
||||||
<!ENTITY arch.i386 "i386">
|
<!ENTITY arch.i386 "i386">
|
||||||
<!ENTITY arch.mips "mips">
|
<!ENTITY arch.mips "mips">
|
||||||
<!ENTITY arch.pc98 "pc98">
|
|
||||||
<!ENTITY arch.powerpc "powerpc">
|
<!ENTITY arch.powerpc "powerpc">
|
||||||
<!ENTITY arch.powerpc64 "powerpc64">
|
<!ENTITY arch.powerpc64 "powerpc64">
|
||||||
<!ENTITY arch.sparc64 "sparc64">
|
<!ENTITY arch.sparc64 "sparc64">
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Module: mkisoimages.sh
|
|
||||||
# Author: Jordan K Hubbard
|
|
||||||
# Date: 22 June 2001
|
|
||||||
#
|
|
||||||
# $FreeBSD$
|
|
||||||
#
|
|
||||||
# This script is used by release/Makefile to build the (optional) ISO images
|
|
||||||
# for a FreeBSD release. It is considered architecture dependent since each
|
|
||||||
# platform has a slightly unique way of making bootable CDs. This script
|
|
||||||
# is also allowed to generate any number of images since that is more of
|
|
||||||
# publishing decision than anything else.
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
#
|
|
||||||
# mkisoimages.sh [-b] image-label image-name base-bits-dir [extra-bits-dir]
|
|
||||||
#
|
|
||||||
# Where -b is passed if the ISO image should be made "bootable" by
|
|
||||||
# whatever standards this architecture supports (may be unsupported),
|
|
||||||
# image-label is the ISO image label, image-name is the filename of the
|
|
||||||
# resulting ISO image, base-bits-dir contains the image contents and
|
|
||||||
# extra-bits-dir, if provided, contains additional files to be merged
|
|
||||||
# into base-bits-dir as part of making the image.
|
|
||||||
|
|
||||||
if [ "x$1" = "x-b" ]; then
|
|
||||||
# This is highly x86-centric and will be used directly below.
|
|
||||||
bootable="-o generic-bootimage=$4/boot/cdboot"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
bootable=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $# -lt 3 ]; then
|
|
||||||
echo "Usage: $0 [-b] image-label image-name base-bits-dir [extra-bits-dir]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
LABEL=`echo "$1" | tr '[:lower:]' '[:upper:]'`; shift
|
|
||||||
NAME="$1"; shift
|
|
||||||
|
|
||||||
publisher="The FreeBSD Project. http://www.FreeBSD.org/"
|
|
||||||
echo "/dev/iso9660/$LABEL / cd9660 ro 0 0" > "$1/etc/fstab"
|
|
||||||
makefs -t cd9660 $bootable -o rockridge -o label="$LABEL" -o publisher="$publisher" "$NAME" "$@"
|
|
||||||
rm -f "$1/etc/fstab"
|
|
@ -16,11 +16,7 @@ mkdir /tmp/bsdinstall_etc
|
|||||||
kbdcontrol -d >/dev/null 2>&1
|
kbdcontrol -d >/dev/null 2>&1
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
# Syscons: use xterm, start interesting things on other VTYs
|
# Syscons: use xterm, start interesting things on other VTYs
|
||||||
if [ ${MACHINE} = "pc98" ]; then
|
TERM=xterm
|
||||||
TERM=cons25w
|
|
||||||
else
|
|
||||||
TERM=xterm
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Don't send ESC on function-key 62/63 (left/right command key)
|
# Don't send ESC on function-key 62/63 (left/right command key)
|
||||||
kbdcontrol -f 62 '' > /dev/null 2>&1
|
kbdcontrol -f 62 '' > /dev/null 2>&1
|
||||||
|
@ -141,10 +141,6 @@ CRUNCH_ALIAS_bsdlabel= disklabel
|
|||||||
#CRUNCH_LIBS+= -lsmb
|
#CRUNCH_LIBS+= -lsmb
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
.if ${MACHINE} == "pc98"
|
|
||||||
CRUNCH_SRCDIR_fdisk= $(.CURDIR)/../../sbin/fdisk_pc98
|
|
||||||
.endif
|
|
||||||
|
|
||||||
.if ${MACHINE_CPUARCH} == "sparc64"
|
.if ${MACHINE_CPUARCH} == "sparc64"
|
||||||
CRUNCH_PROGS_sbin+= bsdlabel sunlabel
|
CRUNCH_PROGS_sbin+= bsdlabel sunlabel
|
||||||
.endif
|
.endif
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
SUBDIR += bsdlabel
|
|
||||||
SUBDIR += fdisk_pc98
|
|
||||||
SUBDIR += sconfig
|
|
@ -109,9 +109,9 @@ argument forces
|
|||||||
.Nm
|
.Nm
|
||||||
to use a layout suitable for a different architecture.
|
to use a layout suitable for a different architecture.
|
||||||
Current valid values are
|
Current valid values are
|
||||||
.Cm i386 , amd64 ,
|
.Cm i386
|
||||||
and
|
and
|
||||||
.Cm pc98 .
|
.Cm amd64 .
|
||||||
If this option is omitted,
|
If this option is omitted,
|
||||||
.Nm
|
.Nm
|
||||||
will use a layout suitable for the current machine.
|
will use a layout suitable for the current machine.
|
||||||
|
@ -164,8 +164,7 @@ main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
if (!strcmp(optarg, "i386") ||
|
if (!strcmp(optarg, "i386") ||
|
||||||
!strcmp(optarg, "amd64") ||
|
!strcmp(optarg, "amd64")) {
|
||||||
!strcmp(optarg, "pc98")) {
|
|
||||||
labelsoffset = 1;
|
labelsoffset = 1;
|
||||||
labeloffset = 0;
|
labeloffset = 0;
|
||||||
bbsize = 8192;
|
bbsize = 8192;
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
PACKAGE=runtime
|
|
||||||
PROG= fdisk
|
|
||||||
SRCS= fdisk.c geom_pc98_enc.c
|
|
||||||
WARNS?= 4
|
|
||||||
MAN= fdisk.8
|
|
||||||
|
|
||||||
.PATH: ${.CURDIR}/../../sys/geom
|
|
||||||
|
|
||||||
LIBADD= geom
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
@ -1,17 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
# Autogenerated - do NOT edit!
|
|
||||||
|
|
||||||
DIRDEPS = \
|
|
||||||
gnu/lib/libgcc \
|
|
||||||
include \
|
|
||||||
include/xlocale \
|
|
||||||
lib/${CSU_DIR} \
|
|
||||||
lib/libc \
|
|
||||||
lib/libgeom \
|
|
||||||
|
|
||||||
|
|
||||||
.include <dirdeps.mk>
|
|
||||||
|
|
||||||
.if ${DEP_RELDIR} == ${_DEP_RELDIR}
|
|
||||||
# local dependencies - needed for -jN in clean tree
|
|
||||||
.endif
|
|
@ -1,486 +0,0 @@
|
|||||||
.\" $FreeBSD$
|
|
||||||
.\"
|
|
||||||
.Dd October 5, 2016
|
|
||||||
.Dt FDISK 8
|
|
||||||
.Os
|
|
||||||
.Sh NAME
|
|
||||||
.Nm fdisk
|
|
||||||
.Nd NEC PC-98x1 slice table maintenance utility
|
|
||||||
.Sh SYNOPSIS
|
|
||||||
.Nm
|
|
||||||
.Op Fl BIaistuv
|
|
||||||
.Op Fl 12345678
|
|
||||||
.Op Ar disk
|
|
||||||
.Nm
|
|
||||||
.Fl f Ar configfile
|
|
||||||
.Op Fl itv
|
|
||||||
.Op Ar disk
|
|
||||||
.Sh PROLOGUE
|
|
||||||
In order for the BIOS to boot the kernel,
|
|
||||||
certain conventions must be adhered to.
|
|
||||||
Sector 0 of the disk must contain boot code,
|
|
||||||
a slice table,
|
|
||||||
and a magic number.
|
|
||||||
BIOS slices can be used to break the disk up into several pieces.
|
|
||||||
The BIOS brings in sector 0 and verifies the magic number.
|
|
||||||
The sector
|
|
||||||
0 boot code then searches the slice table to determine which
|
|
||||||
slice is marked
|
|
||||||
.Dq active .
|
|
||||||
This boot code then brings in the bootstrap from the
|
|
||||||
active slice and, if marked bootable, runs it.
|
|
||||||
Under
|
|
||||||
.Tn DOS ,
|
|
||||||
you can have one or more slices with one active.
|
|
||||||
The
|
|
||||||
.Tn DOS
|
|
||||||
.Nm
|
|
||||||
utility can be used to divide space on the disk into slices and set one
|
|
||||||
active.
|
|
||||||
.Sh DESCRIPTION
|
|
||||||
The
|
|
||||||
.Fx
|
|
||||||
utility,
|
|
||||||
.Nm ,
|
|
||||||
serves a similar purpose to the
|
|
||||||
.Tn DOS
|
|
||||||
utility.
|
|
||||||
The first form is used to
|
|
||||||
display slice information or to interactively edit the slice
|
|
||||||
table.
|
|
||||||
The second is used to write a slice table using a
|
|
||||||
.Ar configfile ,
|
|
||||||
and is designed to be used by other scripts/programs.
|
|
||||||
.Pp
|
|
||||||
Options are:
|
|
||||||
.Bl -tag -width indent
|
|
||||||
.It Fl a
|
|
||||||
Change the active slice only.
|
|
||||||
Ignored if
|
|
||||||
.Fl f
|
|
||||||
is given.
|
|
||||||
.It Fl B
|
|
||||||
Reinitialize the boot code contained in sector 0 of the disk.
|
|
||||||
Ignored if
|
|
||||||
.Fl f
|
|
||||||
is given.
|
|
||||||
.It Fl f Ar configfile
|
|
||||||
Set slice values using the file
|
|
||||||
.Ar configfile .
|
|
||||||
The
|
|
||||||
.Ar configfile
|
|
||||||
always modifies existing slices, unless
|
|
||||||
.Fl i
|
|
||||||
is also given, in which case all existing slices are deleted (marked
|
|
||||||
as
|
|
||||||
.Dq unused )
|
|
||||||
before the
|
|
||||||
.Ar configfile
|
|
||||||
is read.
|
|
||||||
The
|
|
||||||
.Ar configfile
|
|
||||||
can be
|
|
||||||
.Sq Fl ,
|
|
||||||
in which case standard input is read.
|
|
||||||
See
|
|
||||||
.Sx CONFIGURATION FILE ,
|
|
||||||
below, for file syntax.
|
|
||||||
.Pp
|
|
||||||
.Em WARNING :
|
|
||||||
when
|
|
||||||
.Fl f
|
|
||||||
is used, you are not asked if you really want to write the slices
|
|
||||||
table (as you are in the interactive mode).
|
|
||||||
Use with caution!
|
|
||||||
.It Fl i
|
|
||||||
Initialize sector 0 of the disk.
|
|
||||||
This implies
|
|
||||||
.Fl u ,
|
|
||||||
unless
|
|
||||||
.Fl f
|
|
||||||
is given.
|
|
||||||
.It Fl I
|
|
||||||
Initialize sector 0 slice table
|
|
||||||
for one
|
|
||||||
.Fx
|
|
||||||
slice covering the entire disk.
|
|
||||||
Some space at the start of the disk will reserved for the IPL program
|
|
||||||
and the pc98 slice table itself.
|
|
||||||
.It Fl s
|
|
||||||
Print summary information and exit.
|
|
||||||
.It Fl t
|
|
||||||
Test mode; do not write slice values.
|
|
||||||
Generally used with the
|
|
||||||
.Fl f
|
|
||||||
option to see what would be written to the slice table.
|
|
||||||
Implies
|
|
||||||
.Fl v .
|
|
||||||
.It Fl u
|
|
||||||
Update (edit) the disk's sector 0 slice table.
|
|
||||||
Ignored if
|
|
||||||
.Fl f
|
|
||||||
is given.
|
|
||||||
.It Fl v
|
|
||||||
Be verbose.
|
|
||||||
Slices that are unused are suppressed unless this flag is specified.
|
|
||||||
When
|
|
||||||
.Fl f
|
|
||||||
is used,
|
|
||||||
.Nm
|
|
||||||
prints out the slice table that is written to the disk.
|
|
||||||
.It Fl 12345678
|
|
||||||
Operate on a single slice table entry only.
|
|
||||||
Ignored if
|
|
||||||
.Fl f
|
|
||||||
is given.
|
|
||||||
.El
|
|
||||||
.Pp
|
|
||||||
The final disk name can be provided as a
|
|
||||||
.Dq bare
|
|
||||||
disk name only, e.g.\&
|
|
||||||
.Pa da0 ,
|
|
||||||
or as a full pathname.
|
|
||||||
If omitted,
|
|
||||||
.Nm
|
|
||||||
tries to figure out the default disk device name from the
|
|
||||||
mounted root device.
|
|
||||||
.Pp
|
|
||||||
When called with no arguments, it prints the sector 0 slice table.
|
|
||||||
An example follows:
|
|
||||||
.Bd -literal
|
|
||||||
******* Working on device /dev/da0 *******
|
|
||||||
parameters extracted from in-core disklabel are:
|
|
||||||
cylinders=33075 heads=8 sectors/track=32 (256 blks/cyl)
|
|
||||||
|
|
||||||
parameters to be used for BIOS calculations are:
|
|
||||||
cylinders=33075 heads=8 sectors/track=32 (256 blks/cyl)
|
|
||||||
|
|
||||||
Media sector size is 512
|
|
||||||
Warning: BIOS sector numbering starts with sector 1
|
|
||||||
Information from DOS bootblock is:
|
|
||||||
The data for partition 1 is:
|
|
||||||
sysmid 148,(FreeBSD/NetBSD/386BSD)
|
|
||||||
start 256, size 2490112 (1215 Meg), sid 196
|
|
||||||
beg: cyl 1/ sector 0/ head 0;
|
|
||||||
end: cyl 9727/ sector 0/ head 0
|
|
||||||
system Name FreeBSD(98)
|
|
||||||
The data for partition 2 is:
|
|
||||||
sysmid 148,(FreeBSD/NetBSD/386BSD)
|
|
||||||
start 2490368, size 5505024 (2688 Meg), sid 196
|
|
||||||
beg: cyl 9728/ sector 0/ head 0;
|
|
||||||
end: cyl 31231/ sector 0/ head 0
|
|
||||||
system Name FreeBSD(98)
|
|
||||||
The data for partition 3 is:
|
|
||||||
<UNUSED>
|
|
||||||
The data for partition 4 is:
|
|
||||||
<UNUSED>
|
|
||||||
The data for partition 5 is:
|
|
||||||
<UNUSED>
|
|
||||||
The data for partition 6 is:
|
|
||||||
<UNUSED>
|
|
||||||
The data for partition 7 is:
|
|
||||||
<UNUSED>
|
|
||||||
The data for partition 8 is:
|
|
||||||
<UNUSED>
|
|
||||||
The data for partition 9 is:
|
|
||||||
<UNUSED>
|
|
||||||
The data for partition 10 is:
|
|
||||||
<UNUSED>
|
|
||||||
The data for partition 11 is:
|
|
||||||
<UNUSED>
|
|
||||||
The data for partition 12 is:
|
|
||||||
<UNUSED>
|
|
||||||
The data for partition 13 is:
|
|
||||||
<UNUSED>
|
|
||||||
The data for partition 14 is:
|
|
||||||
<UNUSED>
|
|
||||||
The data for partition 15 is:
|
|
||||||
<UNUSED>
|
|
||||||
The data for partition 16 is:
|
|
||||||
<UNUSED>
|
|
||||||
.Ed
|
|
||||||
.Pp
|
|
||||||
The disk is divided into three slices that happen to fill the disk.
|
|
||||||
The second slice overlaps the end of the first.
|
|
||||||
(Used for debugging purposes.)
|
|
||||||
.Bl -tag -width ".Em cyl , sector No and Em head"
|
|
||||||
.It Em sysmid
|
|
||||||
is used to label the slice.
|
|
||||||
.Fx
|
|
||||||
reserves the
|
|
||||||
magic number 148 decimal (94 in hex).
|
|
||||||
.It Xo
|
|
||||||
.Em start
|
|
||||||
and
|
|
||||||
.Em size
|
|
||||||
.Xc
|
|
||||||
fields provide the start address
|
|
||||||
and size of a slice in sectors.
|
|
||||||
.It Xo
|
|
||||||
.Em cyl , sector
|
|
||||||
and
|
|
||||||
.Em head
|
|
||||||
.Xc
|
|
||||||
fields are used to specify the beginning and end addresses of the slice.
|
|
||||||
.It Em "system Name"
|
|
||||||
is the name of the slice.
|
|
||||||
.El
|
|
||||||
.Pp
|
|
||||||
.Em Note :
|
|
||||||
these numbers are calculated using BIOS's understanding of the disk geometry
|
|
||||||
and saved in the bootblock.
|
|
||||||
.Pp
|
|
||||||
The
|
|
||||||
.Fl i
|
|
||||||
and
|
|
||||||
.Fl u
|
|
||||||
flags are used to indicate that the slice data is to be updated.
|
|
||||||
Unless the
|
|
||||||
.Fl f
|
|
||||||
option is also given,
|
|
||||||
.Nm
|
|
||||||
will enter a conversational mode.
|
|
||||||
In this mode, no changes will be written to disk unless you explicitly tell
|
|
||||||
.Nm
|
|
||||||
to.
|
|
||||||
.Pp
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
utility will display each slice and ask whether you want to edit it.
|
|
||||||
If you say yes,
|
|
||||||
.Nm
|
|
||||||
will step through each field, show you the old value,
|
|
||||||
and ask you for a new one.
|
|
||||||
When you are done with the slice,
|
|
||||||
.Nm
|
|
||||||
will display it and ask you whether it is correct.
|
|
||||||
It will then proceed to the next entry.
|
|
||||||
.Pp
|
|
||||||
Getting the
|
|
||||||
.Em cyl , sector ,
|
|
||||||
and
|
|
||||||
.Em head
|
|
||||||
fields correct is tricky, so by default,
|
|
||||||
they will be calculated for you;
|
|
||||||
you can specify them if you choose to though.
|
|
||||||
.Pp
|
|
||||||
After all the slices are processed,
|
|
||||||
you are given the option to change the
|
|
||||||
.Dq active
|
|
||||||
slice.
|
|
||||||
Finally, when all the new data for sector 0 has been accumulated,
|
|
||||||
you are asked to confirm whether you really want to rewrite it.
|
|
||||||
.Pp
|
|
||||||
The difference between the
|
|
||||||
.Fl u
|
|
||||||
and
|
|
||||||
.Fl i
|
|
||||||
flags is that
|
|
||||||
the
|
|
||||||
.Fl u
|
|
||||||
flag edits (updates) the existing slice parameters
|
|
||||||
while the
|
|
||||||
.Fl i
|
|
||||||
flag is used to
|
|
||||||
.Dq initialize
|
|
||||||
them (old values will be ignored);
|
|
||||||
it will setup the last BIOS slice to use the whole disk for
|
|
||||||
.Fx ;
|
|
||||||
and make it active.
|
|
||||||
.Sh NOTES
|
|
||||||
The automatic calculation of starting cylinder etc.\& uses
|
|
||||||
a set of figures that represent what the BIOS thinks the
|
|
||||||
geometry of the drive is.
|
|
||||||
These figures are taken from the in-core disklabel by default,
|
|
||||||
but
|
|
||||||
.Nm
|
|
||||||
initially gives you an opportunity to change them.
|
|
||||||
This allows you to create a bootblock that can work with drives
|
|
||||||
that use geometry translation under the BIOS.
|
|
||||||
.Pp
|
|
||||||
If you hand craft your disk layout,
|
|
||||||
please make sure that the
|
|
||||||
.Fx
|
|
||||||
slice starts on a cylinder boundary.
|
|
||||||
.Pp
|
|
||||||
Editing an existing slice will most likely result in the loss of
|
|
||||||
all data in that slice.
|
|
||||||
.Pp
|
|
||||||
You should run
|
|
||||||
.Nm
|
|
||||||
interactively once or twice to see how it works.
|
|
||||||
This is completely safe as long as you answer the last question
|
|
||||||
in the negative.
|
|
||||||
There are subtleties that
|
|
||||||
.Nm
|
|
||||||
detects that are not fully explained in this manual page.
|
|
||||||
.Sh CONFIGURATION FILE
|
|
||||||
When the
|
|
||||||
.Fl f
|
|
||||||
option is given, a disk's slice table can be written using values
|
|
||||||
from a
|
|
||||||
.Ar configfile .
|
|
||||||
The syntax of this file is very simple;
|
|
||||||
each line is either a comment or a specification, as follows:
|
|
||||||
.Bl -tag -width indent
|
|
||||||
.It Ic # Ar comment ...
|
|
||||||
Lines beginning with a
|
|
||||||
.Ic #
|
|
||||||
are comments and are ignored.
|
|
||||||
.It Ic g Ar spec1 spec2 spec3
|
|
||||||
Set the BIOS geometry used in slice calculations.
|
|
||||||
There must be
|
|
||||||
three values specified, with a letter preceding each number:
|
|
||||||
.Bl -tag -width indent
|
|
||||||
.It Cm c Ns Ar num
|
|
||||||
Set the number of cylinders to
|
|
||||||
.Ar num .
|
|
||||||
.It Cm h Ns Ar num
|
|
||||||
Set the number of heads to
|
|
||||||
.Ar num .
|
|
||||||
.It Cm s Ns Ar num
|
|
||||||
Set the number of sectors/track to
|
|
||||||
.Ar num .
|
|
||||||
.El
|
|
||||||
.Pp
|
|
||||||
These specs can occur in any order, as the leading letter determines
|
|
||||||
which value is which; however, all three must be specified.
|
|
||||||
.Pp
|
|
||||||
This line must occur before any lines that specify slice
|
|
||||||
information.
|
|
||||||
.Pp
|
|
||||||
It is an error if the following is not true:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
1 <= number of cylinders
|
|
||||||
1 <= number of heads <= 256
|
|
||||||
1 <= number of sectors/track < 64
|
|
||||||
.Ed
|
|
||||||
.Pp
|
|
||||||
The number of cylinders should be less than or equal to 1024, but this
|
|
||||||
is not enforced, although a warning will be printed.
|
|
||||||
Note that bootable
|
|
||||||
.Fx
|
|
||||||
slices (the
|
|
||||||
.Dq Pa /
|
|
||||||
file system) must lie completely within the
|
|
||||||
first 1024 cylinders; if this is not true, booting may fail.
|
|
||||||
Non-bootable slices do not have this restriction.
|
|
||||||
.Pp
|
|
||||||
Example (all of these are equivalent), for a disk with 1019 cylinders,
|
|
||||||
39 heads, and 63 sectors:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
g c1019 h39 s63
|
|
||||||
g h39 c1019 s63
|
|
||||||
g s63 h39 c1019
|
|
||||||
.Ed
|
|
||||||
.It Ic p Ar slice type start length
|
|
||||||
Set the slice given by
|
|
||||||
.Ar slice
|
|
||||||
(1-8) to type
|
|
||||||
.Ar type ,
|
|
||||||
starting at sector
|
|
||||||
.Ar start
|
|
||||||
for
|
|
||||||
.Ar length
|
|
||||||
sectors.
|
|
||||||
.Pp
|
|
||||||
Only those slices explicitly mentioned by these lines are modified;
|
|
||||||
any slice not referenced by a
|
|
||||||
.Ic p
|
|
||||||
line will not be modified.
|
|
||||||
However, if an invalid slice table is present, or the
|
|
||||||
.Fl i
|
|
||||||
option is specified, all existing slice entries will be cleared
|
|
||||||
(marked as unused), and these
|
|
||||||
.Ic p
|
|
||||||
lines will have to be used to
|
|
||||||
explicitly set slice information.
|
|
||||||
If multiple slices need to be
|
|
||||||
set, multiple
|
|
||||||
.Ic p
|
|
||||||
lines must be specified; one for each slice.
|
|
||||||
.Pp
|
|
||||||
These slice lines must occur after any geometry specification lines,
|
|
||||||
if one is present.
|
|
||||||
.Pp
|
|
||||||
The
|
|
||||||
.Ar type
|
|
||||||
is 165 for
|
|
||||||
.Fx
|
|
||||||
slices.
|
|
||||||
Specifying a slice type of zero is
|
|
||||||
the same as clearing the slice and marking it as unused; however,
|
|
||||||
dummy values (such as
|
|
||||||
.Dq 0 )
|
|
||||||
must still be specified for
|
|
||||||
.Ar start
|
|
||||||
and
|
|
||||||
.Ar length .
|
|
||||||
.Pp
|
|
||||||
Note: the start offset will be rounded upwards to a head boundary if
|
|
||||||
necessary, and the end offset will be rounded downwards to a cylinder
|
|
||||||
boundary if necessary.
|
|
||||||
.Pp
|
|
||||||
Example: to clear slice 4 and mark it as unused:
|
|
||||||
.Pp
|
|
||||||
.Dl "p 4 0 0 0"
|
|
||||||
.Pp
|
|
||||||
Example: to set slice 1 to a
|
|
||||||
.Fx
|
|
||||||
slice, starting at sector 1
|
|
||||||
for 2503871 sectors (note: these numbers will be rounded upwards and
|
|
||||||
downwards to correspond to head and cylinder boundaries):
|
|
||||||
.Pp
|
|
||||||
.Dl "p 1 165 1 2503871"
|
|
||||||
.It Ic a Ar slice
|
|
||||||
Make
|
|
||||||
.Ar slice
|
|
||||||
the active slice.
|
|
||||||
Can occur anywhere in the config file, but only
|
|
||||||
one must be present.
|
|
||||||
.Pp
|
|
||||||
Example: to make slice 1 the active slice:
|
|
||||||
.Pp
|
|
||||||
.Dl "a 1"
|
|
||||||
.El
|
|
||||||
.Sh SEE ALSO
|
|
||||||
.Xr boot98cfg 8 ,
|
|
||||||
.Xr bsdlabel 8 ,
|
|
||||||
.Xr gpart 8 ,
|
|
||||||
.Xr newfs 8
|
|
||||||
.Sh HISTORY
|
|
||||||
A version of
|
|
||||||
.Nm
|
|
||||||
first appeared in the Mach Operating System.
|
|
||||||
It was subsequently ported to
|
|
||||||
.Bx 386 .
|
|
||||||
.Sh AUTHORS
|
|
||||||
.An -nosplit
|
|
||||||
.Nm
|
|
||||||
for Mach Operating System was written by
|
|
||||||
.An Robert Baron Aq Mt rvb@cs.cmu.edu .
|
|
||||||
It was ported to
|
|
||||||
.Bx 386
|
|
||||||
by
|
|
||||||
.An Julian Elischer Aq Mt julian@tfs.com .
|
|
||||||
.Sh BUGS
|
|
||||||
The default boot code will not necessarily handle all slice types
|
|
||||||
correctly, in particular those introduced since
|
|
||||||
.Tn MS-DOS
|
|
||||||
6.x.
|
|
||||||
.Pp
|
|
||||||
The entire utility should be made more user-friendly.
|
|
||||||
.Pp
|
|
||||||
Most users new to
|
|
||||||
.Fx
|
|
||||||
do not understand the difference between
|
|
||||||
.Dq slice
|
|
||||||
and
|
|
||||||
.Dq partition ,
|
|
||||||
causing difficulty to adjust.
|
|
||||||
.Pp
|
|
||||||
You cannot use this command to completely dedicate a disk to
|
|
||||||
.Fx .
|
|
||||||
The
|
|
||||||
.Xr bsdlabel 8
|
|
||||||
command must be used for this.
|
|
@ -1,910 +0,0 @@
|
|||||||
/*
|
|
||||||
* Mach Operating System
|
|
||||||
* Copyright (c) 1992 Carnegie Mellon University
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify and distribute this software and its
|
|
||||||
* documentation is hereby granted, provided that both the copyright
|
|
||||||
* notice and this permission notice appear in all copies of the
|
|
||||||
* software, derivative works or modified versions, and any portions
|
|
||||||
* thereof, and that both notices appear in supporting documentation.
|
|
||||||
*
|
|
||||||
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
|
|
||||||
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
|
|
||||||
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* Carnegie Mellon requests users of this software to return to
|
|
||||||
*
|
|
||||||
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
|
|
||||||
* School of Computer Science
|
|
||||||
* Carnegie Mellon University
|
|
||||||
* Pittsburgh PA 15213-3890
|
|
||||||
*
|
|
||||||
* any improvements or extensions that they make and grant Carnegie Mellon
|
|
||||||
* the rights to redistribute these changes.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include <sys/disk.h>
|
|
||||||
#include <sys/disklabel.h>
|
|
||||||
#include <sys/diskpc98.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/mount.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <err.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <libgeom.h>
|
|
||||||
#include <paths.h>
|
|
||||||
#include <regex.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
int iotest;
|
|
||||||
|
|
||||||
#define LBUF 100
|
|
||||||
static char lbuf[LBUF];
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Ported to 386bsd by Julian Elischer Thu Oct 15 20:26:46 PDT 1992
|
|
||||||
*
|
|
||||||
* 14-Dec-89 Robert Baron (rvb) at Carnegie-Mellon University
|
|
||||||
* Copyright (c) 1989 Robert. V. Baron
|
|
||||||
* Created.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define Decimal(str, ans, tmp) if (decimal(str, &tmp, ans)) ans = tmp
|
|
||||||
#define String(str, ans, len) {char *z = ans; char **dflt = &z; if (string(str, dflt)) strncpy(ans, *dflt, len); }
|
|
||||||
|
|
||||||
#define MAX_SEC_SIZE 2048 /* maximum section size that is supported */
|
|
||||||
#define MIN_SEC_SIZE 512 /* the sector size to start sensing at */
|
|
||||||
static int secsize = 0; /* the sensed sector size */
|
|
||||||
|
|
||||||
static char *disk;
|
|
||||||
|
|
||||||
static int cyls, sectors, heads, cylsecs, disksecs;
|
|
||||||
|
|
||||||
struct mboot {
|
|
||||||
unsigned char padding[2]; /* force the longs to be long aligned */
|
|
||||||
unsigned char bootinst[510];
|
|
||||||
unsigned short int signature;
|
|
||||||
struct pc98_partition parts[8];
|
|
||||||
unsigned char large_sector_overflow[MAX_SEC_SIZE-MIN_SEC_SIZE];
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct mboot mboot;
|
|
||||||
static int fd;
|
|
||||||
|
|
||||||
static uint dos_cyls;
|
|
||||||
static uint dos_heads;
|
|
||||||
static uint dos_sectors;
|
|
||||||
static uint dos_cylsecs;
|
|
||||||
|
|
||||||
#define MAX_ARGS 10
|
|
||||||
|
|
||||||
typedef struct cmd {
|
|
||||||
char cmd;
|
|
||||||
int n_args;
|
|
||||||
struct arg {
|
|
||||||
char argtype;
|
|
||||||
int arg_val;
|
|
||||||
} args[MAX_ARGS];
|
|
||||||
} CMD;
|
|
||||||
|
|
||||||
static int B_flag = 0; /* replace boot code */
|
|
||||||
static int I_flag = 0; /* Inizialize disk to defaults */
|
|
||||||
static int a_flag = 0; /* set active partition */
|
|
||||||
static int i_flag = 0; /* replace partition data */
|
|
||||||
static int u_flag = 0; /* update partition data */
|
|
||||||
static int s_flag = 0; /* Print a summary and exit */
|
|
||||||
static int t_flag = 0; /* test only */
|
|
||||||
static char *f_flag = NULL; /* Read config info from file */
|
|
||||||
static int v_flag = 0; /* Be verbose */
|
|
||||||
|
|
||||||
static struct part_type
|
|
||||||
{
|
|
||||||
unsigned char type;
|
|
||||||
const char *name;
|
|
||||||
} part_types[] = {
|
|
||||||
{0x00, "unused"}
|
|
||||||
,{0x01, "Primary DOS with 12 bit FAT"}
|
|
||||||
,{0x11, "MSDOS"}
|
|
||||||
,{0x20, "MSDOS"}
|
|
||||||
,{0x21, "MSDOS"}
|
|
||||||
,{0x22, "MSDOS"}
|
|
||||||
,{0x23, "MSDOS"}
|
|
||||||
,{0x02, "XENIX / file system"}
|
|
||||||
,{0x03, "XENIX /usr file system"}
|
|
||||||
,{0x04, "PC-UX"}
|
|
||||||
,{0x05, "Extended DOS"}
|
|
||||||
,{0x06, "Primary 'big' DOS (> 32MB)"}
|
|
||||||
,{0x07, "OS/2 HPFS, QNX or Advanced UNIX"}
|
|
||||||
,{0x08, "AIX file system"}
|
|
||||||
,{0x09, "AIX boot partition or Coherent"}
|
|
||||||
,{0x0A, "OS/2 Boot Manager or OPUS"}
|
|
||||||
,{0x10, "OPUS"}
|
|
||||||
,{0x14, "FreeBSD/NetBSD/386BSD"}
|
|
||||||
,{0x94, "FreeBSD/NetBSD/386BSD"}
|
|
||||||
,{0x40, "VENIX 286"}
|
|
||||||
,{0x50, "DM"}
|
|
||||||
,{0x51, "DM"}
|
|
||||||
,{0x52, "CP/M or Microport SysV/AT"}
|
|
||||||
,{0x56, "GB"}
|
|
||||||
,{0x61, "Speed"}
|
|
||||||
,{0x63, "ISC UNIX, other System V/386, GNU HURD or Mach"}
|
|
||||||
,{0x64, "Novell Netware 2.xx"}
|
|
||||||
,{0x65, "Novell Netware 3.xx"}
|
|
||||||
,{0x75, "PCIX"}
|
|
||||||
,{0x40, "Minix"}
|
|
||||||
};
|
|
||||||
|
|
||||||
static void print_s0(int which);
|
|
||||||
static void print_part(int i);
|
|
||||||
static void init_sector0(unsigned long start);
|
|
||||||
static void init_boot(void);
|
|
||||||
static void change_part(int i, int force);
|
|
||||||
static void print_params(void);
|
|
||||||
static void change_active(int which);
|
|
||||||
static void change_code(void);
|
|
||||||
static void get_params_to_use(void);
|
|
||||||
static char *get_rootdisk(void);
|
|
||||||
static void dos(u_int32_t start, u_int32_t size, struct pc98_partition *partp);
|
|
||||||
static int open_disk(int flag);
|
|
||||||
static ssize_t read_disk(off_t sector, void *buf);
|
|
||||||
static int write_disk(off_t sector, void *buf);
|
|
||||||
static int get_params(void);
|
|
||||||
static int read_s0(void);
|
|
||||||
static int write_s0(void);
|
|
||||||
static int ok(const char *str);
|
|
||||||
static int decimal(const char *str, int *num, int deflt);
|
|
||||||
static const char *get_type(int type);
|
|
||||||
static void usage(void);
|
|
||||||
static int string(const char *str, char **ans);
|
|
||||||
static void reset_boot(void);
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
struct stat sb;
|
|
||||||
int c, i;
|
|
||||||
int partition = -1;
|
|
||||||
struct pc98_partition *partp;
|
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "BIa:f:istuv12345678")) != -1)
|
|
||||||
switch (c) {
|
|
||||||
case 'B':
|
|
||||||
B_flag = 1;
|
|
||||||
break;
|
|
||||||
case 'I':
|
|
||||||
I_flag = 1;
|
|
||||||
break;
|
|
||||||
case 'a':
|
|
||||||
a_flag = 1;
|
|
||||||
break;
|
|
||||||
case 'f':
|
|
||||||
f_flag = optarg;
|
|
||||||
break;
|
|
||||||
case 'i':
|
|
||||||
i_flag = 1;
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
s_flag = 1;
|
|
||||||
break;
|
|
||||||
case 't':
|
|
||||||
t_flag = 1;
|
|
||||||
break;
|
|
||||||
case 'u':
|
|
||||||
u_flag = 1;
|
|
||||||
break;
|
|
||||||
case 'v':
|
|
||||||
v_flag = 1;
|
|
||||||
break;
|
|
||||||
case '1':
|
|
||||||
case '2':
|
|
||||||
case '3':
|
|
||||||
case '4':
|
|
||||||
case '5':
|
|
||||||
case '6':
|
|
||||||
case '7':
|
|
||||||
case '8':
|
|
||||||
partition = c - '0';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
if (f_flag || i_flag)
|
|
||||||
u_flag = 1;
|
|
||||||
if (t_flag)
|
|
||||||
v_flag = 1;
|
|
||||||
argc -= optind;
|
|
||||||
argv += optind;
|
|
||||||
|
|
||||||
if (argc == 0) {
|
|
||||||
disk = get_rootdisk();
|
|
||||||
} else {
|
|
||||||
if (stat(argv[0], &sb) == 0) {
|
|
||||||
/* OK, full pathname given */
|
|
||||||
disk = argv[0];
|
|
||||||
} else if (errno == ENOENT && argv[0][0] != '/') {
|
|
||||||
/* Try prepending "/dev" */
|
|
||||||
asprintf(&disk, "%s%s", _PATH_DEV, argv[0]);
|
|
||||||
if (disk == NULL)
|
|
||||||
errx(1, "out of memory");
|
|
||||||
} else {
|
|
||||||
/* other stat error, let it fail below */
|
|
||||||
disk = argv[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (open_disk(u_flag) < 0)
|
|
||||||
err(1, "cannot open disk %s", disk);
|
|
||||||
|
|
||||||
if (s_flag) {
|
|
||||||
if (read_s0())
|
|
||||||
err(1, "read_s0");
|
|
||||||
printf("%s: %d cyl %d hd %d sec\n", disk, dos_cyls, dos_heads,
|
|
||||||
dos_sectors);
|
|
||||||
printf("Part %11s %11s %4s %4s %-16s\n", "Start", "Size", "MID",
|
|
||||||
"SID", "Name");
|
|
||||||
for (i = 0; i < PC98_NPARTS; i++) {
|
|
||||||
partp = ((struct pc98_partition *) &mboot.parts) + i;
|
|
||||||
if (partp->dp_sid == 0)
|
|
||||||
continue;
|
|
||||||
printf("%4d: %11u %11u 0x%02x 0x%02x %-16.16s\n", i + 1,
|
|
||||||
partp->dp_scyl * cylsecs,
|
|
||||||
(partp->dp_ecyl - partp->dp_scyl + 1) * cylsecs,
|
|
||||||
partp->dp_mid, partp->dp_sid, partp->dp_name);
|
|
||||||
}
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("******* Working on device %s *******\n",disk);
|
|
||||||
|
|
||||||
if (I_flag) {
|
|
||||||
read_s0();
|
|
||||||
reset_boot();
|
|
||||||
partp = (struct pc98_partition *) (&mboot.parts[0]);
|
|
||||||
partp->dp_mid = DOSMID_386BSD;
|
|
||||||
partp->dp_sid = DOSSID_386BSD;
|
|
||||||
strncpy(partp->dp_name, "FreeBSD", sizeof(partp->dp_name));
|
|
||||||
/* Start c/h/s. */
|
|
||||||
partp->dp_scyl = partp->dp_ipl_cyl = 1;
|
|
||||||
partp->dp_shd = partp->dp_ipl_head = 1;
|
|
||||||
partp->dp_ssect = partp->dp_ipl_sct = 0;
|
|
||||||
|
|
||||||
/* End c/h/s. */
|
|
||||||
partp->dp_ecyl = dos_cyls - 1;
|
|
||||||
partp->dp_ehd = dos_cylsecs / dos_sectors;
|
|
||||||
partp->dp_esect = dos_sectors;
|
|
||||||
|
|
||||||
if (v_flag)
|
|
||||||
print_s0(-1);
|
|
||||||
if (!t_flag)
|
|
||||||
write_s0();
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f_flag) {
|
|
||||||
if (v_flag)
|
|
||||||
print_s0(-1);
|
|
||||||
if (!t_flag)
|
|
||||||
write_s0();
|
|
||||||
} else {
|
|
||||||
if(u_flag)
|
|
||||||
get_params_to_use();
|
|
||||||
else
|
|
||||||
print_params();
|
|
||||||
|
|
||||||
if (read_s0())
|
|
||||||
init_sector0(dos_sectors);
|
|
||||||
|
|
||||||
printf("Media sector size is %d\n", secsize);
|
|
||||||
printf("Warning: BIOS sector numbering starts with sector 1\n");
|
|
||||||
printf("Information from DOS bootblock is:\n");
|
|
||||||
if (partition == -1)
|
|
||||||
for (i = 1; i <= PC98_NPARTS; i++)
|
|
||||||
change_part(i, v_flag);
|
|
||||||
else
|
|
||||||
change_part(partition, 1);
|
|
||||||
|
|
||||||
if (u_flag || a_flag)
|
|
||||||
change_active(partition);
|
|
||||||
|
|
||||||
if (B_flag)
|
|
||||||
change_code();
|
|
||||||
|
|
||||||
if (u_flag || a_flag || B_flag) {
|
|
||||||
if (!t_flag) {
|
|
||||||
printf("\nWe haven't changed the partition table yet. ");
|
|
||||||
printf("This is your last chance.\n");
|
|
||||||
}
|
|
||||||
print_s0(-1);
|
|
||||||
if (!t_flag) {
|
|
||||||
if (ok("Should we write new partition table?"))
|
|
||||||
write_s0();
|
|
||||||
} else {
|
|
||||||
printf("\n-t flag specified -- partition table not written.\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
usage()
|
|
||||||
{
|
|
||||||
fprintf(stderr, "%s%s",
|
|
||||||
"usage: fdisk [-BIaistu] [-12345678] [disk]\n",
|
|
||||||
" fdisk -f configfile [-itv] [disk]\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct pc98_partition mtpart;
|
|
||||||
|
|
||||||
static int
|
|
||||||
part_unused(int i)
|
|
||||||
{
|
|
||||||
struct pc98_partition *partp;
|
|
||||||
|
|
||||||
partp = ((struct pc98_partition *) &mboot.parts) + i - 1;
|
|
||||||
return (bcmp(partp, &mtpart, sizeof (struct pc98_partition)) == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
print_s0(int which)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
print_params();
|
|
||||||
printf("Information from DOS bootblock is:\n");
|
|
||||||
if (which == -1) {
|
|
||||||
for (i = 1; i <= PC98_NPARTS; i++)
|
|
||||||
if (v_flag || !part_unused(i)) {
|
|
||||||
printf("%d: ", i);
|
|
||||||
print_part(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
print_part(which);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
print_part(int i)
|
|
||||||
{
|
|
||||||
struct pc98_partition *partp;
|
|
||||||
u_int64_t part_sz, part_mb;
|
|
||||||
|
|
||||||
if (part_unused(i)) {
|
|
||||||
printf("<UNUSED>\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Be careful not to overflow.
|
|
||||||
*/
|
|
||||||
partp = ((struct pc98_partition *) &mboot.parts) + i - 1;
|
|
||||||
part_sz = (partp->dp_ecyl - partp->dp_scyl + 1) * cylsecs;
|
|
||||||
part_mb = part_sz * secsize;
|
|
||||||
part_mb /= (1024 * 1024);
|
|
||||||
printf("sysmid %d (%#04x),(%s)\n", partp->dp_mid, partp->dp_mid,
|
|
||||||
get_type(partp->dp_mid));
|
|
||||||
printf(" start %lu, size %lu (%ju Meg), sid %d\n",
|
|
||||||
(u_long)(partp->dp_scyl * cylsecs), (u_long)part_sz,
|
|
||||||
(uintmax_t)part_mb, partp->dp_sid);
|
|
||||||
printf("\tbeg: cyl %d/ head %d/ sector %d;\n\tend: cyl %d/ head %d/ sector %d\n"
|
|
||||||
,partp->dp_scyl
|
|
||||||
,partp->dp_shd
|
|
||||||
,partp->dp_ssect
|
|
||||||
,partp->dp_ecyl
|
|
||||||
,partp->dp_ehd
|
|
||||||
,partp->dp_esect);
|
|
||||||
printf ("\tsystem Name %.16s\n", partp->dp_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
init_boot(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
mboot.signature = PC98_MAGIC;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
init_sector0(unsigned long start)
|
|
||||||
{
|
|
||||||
struct pc98_partition *partp =
|
|
||||||
(struct pc98_partition *)(&mboot.parts[0]);
|
|
||||||
|
|
||||||
init_boot();
|
|
||||||
|
|
||||||
partp->dp_mid = DOSMID_386BSD;
|
|
||||||
partp->dp_sid = DOSSID_386BSD;
|
|
||||||
|
|
||||||
dos(start, disksecs - start, partp);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
change_part(int i, int force)
|
|
||||||
{
|
|
||||||
struct pc98_partition *partp =
|
|
||||||
((struct pc98_partition *) &mboot.parts) + i - 1;
|
|
||||||
|
|
||||||
if (!force && part_unused(i))
|
|
||||||
return;
|
|
||||||
|
|
||||||
printf("The data for partition %d is:\n", i);
|
|
||||||
print_part(i);
|
|
||||||
|
|
||||||
if (u_flag && ok("Do you want to change it?")) {
|
|
||||||
int tmp;
|
|
||||||
|
|
||||||
if (i_flag) {
|
|
||||||
bzero((char *)partp, sizeof (struct pc98_partition));
|
|
||||||
if (i == 1) {
|
|
||||||
init_sector0(1);
|
|
||||||
printf("\nThe static data for the slice 1 has been reinitialized to:\n");
|
|
||||||
print_part(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
do {
|
|
||||||
int x_start = partp->dp_scyl * cylsecs ;
|
|
||||||
int x_size = (partp->dp_ecyl - partp->dp_scyl + 1) * cylsecs;
|
|
||||||
Decimal("sysmid", partp->dp_mid, tmp);
|
|
||||||
Decimal("syssid", partp->dp_sid, tmp);
|
|
||||||
String ("system name", partp->dp_name, 16);
|
|
||||||
Decimal("start", x_start, tmp);
|
|
||||||
Decimal("size", x_size, tmp);
|
|
||||||
|
|
||||||
if (ok("Explicitly specify beg/end address ?"))
|
|
||||||
{
|
|
||||||
int tsec,tcyl,thd;
|
|
||||||
tcyl = partp->dp_scyl;
|
|
||||||
thd = partp->dp_shd;
|
|
||||||
tsec = partp->dp_ssect;
|
|
||||||
Decimal("beginning cylinder", tcyl, tmp);
|
|
||||||
Decimal("beginning head", thd, tmp);
|
|
||||||
Decimal("beginning sector", tsec, tmp);
|
|
||||||
partp->dp_scyl = tcyl;
|
|
||||||
partp->dp_ssect = tsec;
|
|
||||||
partp->dp_shd = thd;
|
|
||||||
partp->dp_ipl_cyl = partp->dp_scyl;
|
|
||||||
partp->dp_ipl_sct = partp->dp_ssect;
|
|
||||||
partp->dp_ipl_head = partp->dp_shd;
|
|
||||||
|
|
||||||
tcyl = partp->dp_ecyl;
|
|
||||||
thd = partp->dp_ehd;
|
|
||||||
tsec = partp->dp_esect;
|
|
||||||
Decimal("ending cylinder", tcyl, tmp);
|
|
||||||
Decimal("ending head", thd, tmp);
|
|
||||||
Decimal("ending sector", tsec, tmp);
|
|
||||||
partp->dp_ecyl = tcyl;
|
|
||||||
partp->dp_esect = tsec;
|
|
||||||
partp->dp_ehd = thd;
|
|
||||||
} else
|
|
||||||
dos(x_start, x_size, partp);
|
|
||||||
|
|
||||||
print_part(i);
|
|
||||||
} while (!ok("Are we happy with this entry?"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
print_params()
|
|
||||||
{
|
|
||||||
printf("parameters extracted from in-core disklabel are:\n");
|
|
||||||
printf("cylinders=%d heads=%d sectors/track=%d (%d blks/cyl)\n\n"
|
|
||||||
,cyls,heads,sectors,cylsecs);
|
|
||||||
if (dos_cyls > 65535 || dos_heads > 255 || dos_sectors > 255)
|
|
||||||
printf("Figures below won't work with BIOS for partitions not in cyl 1\n");
|
|
||||||
printf("parameters to be used for BIOS calculations are:\n");
|
|
||||||
printf("cylinders=%d heads=%d sectors/track=%d (%d blks/cyl)\n\n"
|
|
||||||
,dos_cyls,dos_heads,dos_sectors,dos_cylsecs);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
change_active(int which)
|
|
||||||
{
|
|
||||||
struct pc98_partition *partp = &mboot.parts[0];
|
|
||||||
int active, i, new, tmp;
|
|
||||||
|
|
||||||
active = -1;
|
|
||||||
for (i = 0; i < PC98_NPARTS; i++) {
|
|
||||||
if ((partp[i].dp_sid & PC98_SID_ACTIVE) == 0)
|
|
||||||
continue;
|
|
||||||
printf("Partition %d is marked active\n", i + 1);
|
|
||||||
if (active == -1)
|
|
||||||
active = i + 1;
|
|
||||||
}
|
|
||||||
if (a_flag && which != -1)
|
|
||||||
active = which;
|
|
||||||
else if (active == -1)
|
|
||||||
active = 1;
|
|
||||||
|
|
||||||
if (!ok("Do you want to change the active partition?"))
|
|
||||||
return;
|
|
||||||
setactive:
|
|
||||||
do {
|
|
||||||
new = active;
|
|
||||||
Decimal("active partition", new, tmp);
|
|
||||||
if (new < 1 || new > 8) {
|
|
||||||
printf("Active partition number must be in range 1-8."
|
|
||||||
" Try again.\n");
|
|
||||||
goto setactive;
|
|
||||||
}
|
|
||||||
active = new;
|
|
||||||
} while (!ok("Are you happy with this choice"));
|
|
||||||
if (active > 0 && active <= 8)
|
|
||||||
partp[active-1].dp_sid |= PC98_SID_ACTIVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
change_code()
|
|
||||||
{
|
|
||||||
if (ok("Do you want to change the boot code?"))
|
|
||||||
init_boot();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
get_params_to_use()
|
|
||||||
{
|
|
||||||
int tmp;
|
|
||||||
print_params();
|
|
||||||
if (ok("Do you want to change our idea of what BIOS thinks ?"))
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
Decimal("BIOS's idea of #cylinders", dos_cyls, tmp);
|
|
||||||
Decimal("BIOS's idea of #heads", dos_heads, tmp);
|
|
||||||
Decimal("BIOS's idea of #sectors", dos_sectors, tmp);
|
|
||||||
dos_cylsecs = dos_heads * dos_sectors;
|
|
||||||
print_params();
|
|
||||||
}
|
|
||||||
while(!ok("Are you happy with this choice"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************\
|
|
||||||
* Change real numbers into strange dos numbers *
|
|
||||||
\***********************************************/
|
|
||||||
static void
|
|
||||||
dos(u_int32_t start, u_int32_t size, struct pc98_partition *partp)
|
|
||||||
{
|
|
||||||
u_int32_t end;
|
|
||||||
|
|
||||||
if (partp->dp_mid == 0 && partp->dp_sid == 0 &&
|
|
||||||
start == 0 && size == 0) {
|
|
||||||
memcpy(partp, &mtpart, sizeof(*partp));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Start c/h/s. */
|
|
||||||
partp->dp_scyl = partp->dp_ipl_cyl = start / dos_cylsecs;
|
|
||||||
partp->dp_shd = partp->dp_ipl_head = start % dos_cylsecs / dos_sectors;
|
|
||||||
partp->dp_ssect = partp->dp_ipl_sct = start % dos_sectors;
|
|
||||||
|
|
||||||
/* End c/h/s. */
|
|
||||||
end = start + size - cylsecs;
|
|
||||||
partp->dp_ecyl = end / dos_cylsecs;
|
|
||||||
partp->dp_ehd = end % dos_cylsecs / dos_sectors;
|
|
||||||
partp->dp_esect = end % dos_sectors;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
open_disk(int flag)
|
|
||||||
{
|
|
||||||
struct stat st;
|
|
||||||
int rwmode;
|
|
||||||
|
|
||||||
if (stat(disk, &st) == -1) {
|
|
||||||
if (errno == ENOENT)
|
|
||||||
return -2;
|
|
||||||
warnx("can't get file status of %s", disk);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if ( !(st.st_mode & S_IFCHR) )
|
|
||||||
warnx("device %s is not character special", disk);
|
|
||||||
rwmode = I_flag || a_flag || B_flag || flag ? O_RDWR : O_RDONLY;
|
|
||||||
fd = open(disk, rwmode);
|
|
||||||
if (fd == -1 && errno == EPERM && rwmode == O_RDWR)
|
|
||||||
fd = open(disk, O_RDONLY);
|
|
||||||
if (fd == -1 && errno == ENXIO)
|
|
||||||
return -2;
|
|
||||||
if (fd == -1) {
|
|
||||||
warnx("can't open device %s", disk);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (get_params() == -1) {
|
|
||||||
warnx("can't get disk parameters on %s", disk);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t
|
|
||||||
read_disk(off_t sector, void *buf)
|
|
||||||
{
|
|
||||||
|
|
||||||
lseek(fd, (sector * 512), 0);
|
|
||||||
return read(fd, buf,
|
|
||||||
secsize > MIN_SEC_SIZE ? secsize : MIN_SEC_SIZE * 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
write_disk(off_t sector, void *buf)
|
|
||||||
{
|
|
||||||
int error;
|
|
||||||
struct gctl_req *grq;
|
|
||||||
const char *q;
|
|
||||||
char fbuf[BUFSIZ];
|
|
||||||
int i, fdw, sz;
|
|
||||||
|
|
||||||
sz = secsize > MIN_SEC_SIZE ? secsize : MIN_SEC_SIZE * 2;
|
|
||||||
grq = gctl_get_handle();
|
|
||||||
gctl_ro_param(grq, "verb", -1, "write PC98");
|
|
||||||
gctl_ro_param(grq, "class", -1, "PC98");
|
|
||||||
q = strrchr(disk, '/');
|
|
||||||
if (q == NULL)
|
|
||||||
q = disk;
|
|
||||||
else
|
|
||||||
q++;
|
|
||||||
gctl_ro_param(grq, "geom", -1, q);
|
|
||||||
gctl_ro_param(grq, "data", sz, buf);
|
|
||||||
q = gctl_issue(grq);
|
|
||||||
if (q == NULL) {
|
|
||||||
gctl_free(grq);
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
warnx("Geom problem: %s", q);
|
|
||||||
gctl_free(grq);
|
|
||||||
|
|
||||||
warnx("Warning: Partitioning via geom failed, trying raw write");
|
|
||||||
error = pwrite(fd, buf, sz, sector * 512);
|
|
||||||
if (error == sz)
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
for (i = 0; i < PC98_NPARTS; i++) {
|
|
||||||
sprintf(fbuf, "%ss%d", disk, i + 1);
|
|
||||||
fdw = open(fbuf, O_RDWR, 0);
|
|
||||||
if (fdw < 0)
|
|
||||||
continue;
|
|
||||||
error = ioctl(fdw, DIOCSPC98, buf);
|
|
||||||
close(fdw);
|
|
||||||
if (error == 0)
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
warnx("Failed to write sector zero");
|
|
||||||
return(EINVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
get_params()
|
|
||||||
{
|
|
||||||
int error;
|
|
||||||
u_int u;
|
|
||||||
off_t o;
|
|
||||||
|
|
||||||
error = ioctl(fd, DIOCGFWSECTORS, &u);
|
|
||||||
if (error == 0)
|
|
||||||
sectors = dos_sectors = u;
|
|
||||||
else
|
|
||||||
sectors = dos_sectors = 17;
|
|
||||||
|
|
||||||
error = ioctl(fd, DIOCGFWHEADS, &u);
|
|
||||||
if (error == 0)
|
|
||||||
heads = dos_heads = u;
|
|
||||||
else
|
|
||||||
heads = dos_heads = 8;
|
|
||||||
|
|
||||||
dos_cylsecs = cylsecs = heads * sectors;
|
|
||||||
disksecs = cyls * heads * sectors;
|
|
||||||
|
|
||||||
error = ioctl(fd, DIOCGSECTORSIZE, &u);
|
|
||||||
if (error != 0 || u == 0)
|
|
||||||
u = 512;
|
|
||||||
secsize = u;
|
|
||||||
|
|
||||||
error = ioctl(fd, DIOCGMEDIASIZE, &o);
|
|
||||||
if (error == 0) {
|
|
||||||
disksecs = o / u;
|
|
||||||
cyls = dos_cyls = o / (u * dos_heads * dos_sectors);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (disksecs);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
read_s0()
|
|
||||||
{
|
|
||||||
|
|
||||||
if (read_disk(0, (char *) mboot.bootinst) == -1) {
|
|
||||||
warnx("can't read fdisk partition table");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (mboot.signature != PC98_MAGIC) {
|
|
||||||
warnx("invalid fdisk partition table found");
|
|
||||||
/* So should we initialize things */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
write_s0()
|
|
||||||
{
|
|
||||||
|
|
||||||
if (iotest) {
|
|
||||||
print_s0(-1);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* write enable label sector before write (if necessary),
|
|
||||||
* disable after writing.
|
|
||||||
* needed if the disklabel protected area also protects
|
|
||||||
* sector 0. (e.g. empty disk)
|
|
||||||
*/
|
|
||||||
if (write_disk(0, (char *) mboot.bootinst) == -1) {
|
|
||||||
warn("can't write fdisk partition table");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
ok(const char *str)
|
|
||||||
{
|
|
||||||
printf("%s [n] ", str);
|
|
||||||
fflush(stdout);
|
|
||||||
if (fgets(lbuf, LBUF, stdin) == NULL)
|
|
||||||
exit(1);
|
|
||||||
lbuf[strlen(lbuf)-1] = 0;
|
|
||||||
|
|
||||||
if (*lbuf &&
|
|
||||||
(!strcmp(lbuf, "yes") || !strcmp(lbuf, "YES") ||
|
|
||||||
!strcmp(lbuf, "y") || !strcmp(lbuf, "Y")))
|
|
||||||
return 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
decimal(const char *str, int *num, int deflt)
|
|
||||||
{
|
|
||||||
int acc = 0, c;
|
|
||||||
char *cp;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
printf("Supply a decimal value for \"%s\" [%d] ", str, deflt);
|
|
||||||
fflush(stdout);
|
|
||||||
if (fgets(lbuf, LBUF, stdin) == NULL)
|
|
||||||
exit(1);
|
|
||||||
lbuf[strlen(lbuf)-1] = 0;
|
|
||||||
|
|
||||||
if (!*lbuf)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
cp = lbuf;
|
|
||||||
while ((c = *cp) && (c == ' ' || c == '\t')) cp++;
|
|
||||||
if (!c)
|
|
||||||
return 0;
|
|
||||||
while ((c = *cp++)) {
|
|
||||||
if (c <= '9' && c >= '0')
|
|
||||||
acc = acc * 10 + c - '0';
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (c == ' ' || c == '\t')
|
|
||||||
while ((c = *cp) && (c == ' ' || c == '\t')) cp++;
|
|
||||||
if (!c) {
|
|
||||||
*num = acc;
|
|
||||||
return 1;
|
|
||||||
} else
|
|
||||||
printf("%s is an invalid decimal number. Try again.\n",
|
|
||||||
lbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
string(const char *str, char **ans)
|
|
||||||
{
|
|
||||||
int i, c;
|
|
||||||
char *cp = lbuf;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
printf("Supply a string value for \"%s\" [%s] ", str, *ans);
|
|
||||||
fgets(lbuf, LBUF, stdin);
|
|
||||||
lbuf[strlen(lbuf)-1] = 0;
|
|
||||||
|
|
||||||
if (!*lbuf)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
while ((c = *cp) && (c == ' ' || c == '\t')) cp++;
|
|
||||||
if (c == '"') {
|
|
||||||
c = *++cp;
|
|
||||||
*ans = cp;
|
|
||||||
while ((c = *cp) && c != '"') cp++;
|
|
||||||
} else {
|
|
||||||
*ans = cp;
|
|
||||||
while ((c = *cp) && c != ' ' && c != '\t') cp++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = strlen(*ans); i < 16; i++)
|
|
||||||
(*ans)[i] = ' ';
|
|
||||||
(*ans)[16] = 0;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *
|
|
||||||
get_type(int type)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < nitems(part_types); i++)
|
|
||||||
if (part_types[i].type == (type & 0x7f))
|
|
||||||
return(part_types[i].name);
|
|
||||||
return("unknown");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Try figuring out the root device's canonical disk name.
|
|
||||||
* The following choices are considered:
|
|
||||||
* /dev/ad0s1a => /dev/ad0
|
|
||||||
* /dev/da0a => /dev/da0
|
|
||||||
* /dev/vinum/root => /dev/vinum/root
|
|
||||||
*/
|
|
||||||
static char *
|
|
||||||
get_rootdisk(void)
|
|
||||||
{
|
|
||||||
struct statfs rootfs;
|
|
||||||
regex_t re;
|
|
||||||
#define NMATCHES 2
|
|
||||||
regmatch_t rm[NMATCHES];
|
|
||||||
char *s;
|
|
||||||
int rv;
|
|
||||||
|
|
||||||
if (statfs("/", &rootfs) == -1)
|
|
||||||
err(1, "statfs(\"/\")");
|
|
||||||
|
|
||||||
if ((rv = regcomp(&re, "^(/dev/[a-z]+[0-9]+)([sp][0-9]+)?[a-h]?$",
|
|
||||||
REG_EXTENDED)) != 0)
|
|
||||||
errx(1, "regcomp() failed (%d)", rv);
|
|
||||||
if ((rv = regexec(&re, rootfs.f_mntfromname, NMATCHES, rm, 0)) != 0)
|
|
||||||
errx(1,
|
|
||||||
"mounted root fs resource doesn't match expectations (regexec returned %d)",
|
|
||||||
rv);
|
|
||||||
if ((s = malloc(rm[1].rm_eo - rm[1].rm_so + 1)) == NULL)
|
|
||||||
errx(1, "out of memory");
|
|
||||||
memcpy(s, rootfs.f_mntfromname + rm[1].rm_so,
|
|
||||||
rm[1].rm_eo - rm[1].rm_so);
|
|
||||||
s[rm[1].rm_eo - rm[1].rm_so] = 0;
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
reset_boot(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
struct pc98_partition *partp;
|
|
||||||
|
|
||||||
init_boot();
|
|
||||||
for (i = 1; i <= PC98_NPARTS; i++) {
|
|
||||||
partp = ((struct pc98_partition *) &mboot.parts) + i - 1;
|
|
||||||
bzero((char *)partp, sizeof (struct pc98_partition));
|
|
||||||
}
|
|
||||||
}
|
|
@ -543,11 +543,6 @@ The
|
|||||||
option enables backward compatibility for partition names
|
option enables backward compatibility for partition names
|
||||||
in the EBR scheme.
|
in the EBR scheme.
|
||||||
It also prevents any type of actions on such partitions.
|
It also prevents any type of actions on such partitions.
|
||||||
.It Cm PC98
|
|
||||||
An MBR variant for NEC PC-98 and compatible computers.
|
|
||||||
Requires the
|
|
||||||
.Cm GEOM_PART_PC98
|
|
||||||
kernel option.
|
|
||||||
.It Cm VTOC8
|
.It Cm VTOC8
|
||||||
Sun's SMI Volume Table Of Contents, used by
|
Sun's SMI Volume Table Of Contents, used by
|
||||||
.Tn SPARC64
|
.Tn SPARC64
|
||||||
@ -945,12 +940,6 @@ The scheme-specific attributes for MBR:
|
|||||||
.Bl -tag -width ".Cm active"
|
.Bl -tag -width ".Cm active"
|
||||||
.It Cm active
|
.It Cm active
|
||||||
.El
|
.El
|
||||||
.Pp
|
|
||||||
The scheme-specific attributes for PC98:
|
|
||||||
.Bl -tag -width ".Cm bootable"
|
|
||||||
.It Cm active
|
|
||||||
.It Cm bootable
|
|
||||||
.El
|
|
||||||
.Sh BOOTSTRAPPING
|
.Sh BOOTSTRAPPING
|
||||||
.Fx
|
.Fx
|
||||||
supports several partitioning schemes and each scheme uses different
|
supports several partitioning schemes and each scheme uses different
|
||||||
|
@ -12,49 +12,26 @@ variable rt_el
|
|||||||
variable rb_el
|
variable rb_el
|
||||||
variable fill
|
variable fill
|
||||||
|
|
||||||
s" arch-pc98" environment? [if]
|
\ Single frames
|
||||||
\ Single frames
|
196 constant sh_el
|
||||||
149 constant sh_el
|
179 constant sv_el
|
||||||
150 constant sv_el
|
218 constant slt_el
|
||||||
152 constant slt_el
|
192 constant slb_el
|
||||||
154 constant slb_el
|
191 constant srt_el
|
||||||
153 constant srt_el
|
217 constant srb_el
|
||||||
155 constant srb_el
|
\ Double frames
|
||||||
\ Double frames
|
205 constant dh_el
|
||||||
149 constant dh_el
|
186 constant dv_el
|
||||||
150 constant dv_el
|
201 constant dlt_el
|
||||||
152 constant dlt_el
|
200 constant dlb_el
|
||||||
154 constant dlb_el
|
187 constant drt_el
|
||||||
153 constant drt_el
|
188 constant drb_el
|
||||||
155 constant drb_el
|
\ Fillings
|
||||||
\ Fillings
|
0 constant fill_none
|
||||||
0 constant fill_none
|
32 constant fill_blank
|
||||||
32 constant fill_blank
|
176 constant fill_dark
|
||||||
135 constant fill_dark
|
177 constant fill_med
|
||||||
135 constant fill_med
|
178 constant fill_bright
|
||||||
135 constant fill_bright
|
|
||||||
[else]
|
|
||||||
\ Single frames
|
|
||||||
196 constant sh_el
|
|
||||||
179 constant sv_el
|
|
||||||
218 constant slt_el
|
|
||||||
192 constant slb_el
|
|
||||||
191 constant srt_el
|
|
||||||
217 constant srb_el
|
|
||||||
\ Double frames
|
|
||||||
205 constant dh_el
|
|
||||||
186 constant dv_el
|
|
||||||
201 constant dlt_el
|
|
||||||
200 constant dlb_el
|
|
||||||
187 constant drt_el
|
|
||||||
188 constant drb_el
|
|
||||||
\ Fillings
|
|
||||||
0 constant fill_none
|
|
||||||
32 constant fill_blank
|
|
||||||
176 constant fill_dark
|
|
||||||
177 constant fill_med
|
|
||||||
178 constant fill_bright
|
|
||||||
[then]
|
|
||||||
|
|
||||||
: hline ( len x y -- ) \ Draw horizontal single line
|
: hline ( len x y -- ) \ Draw horizontal single line
|
||||||
at-xy \ move cursor
|
at-xy \ move cursor
|
||||||
|
@ -204,12 +204,6 @@ AdvanSys ABP950
|
|||||||
AdvanSys ABP980, ABP980U
|
AdvanSys ABP980, ABP980U
|
||||||
.It
|
.It
|
||||||
AdvanSys ABP980UA/3980UA
|
AdvanSys ABP980UA/3980UA
|
||||||
.It
|
|
||||||
MELCO IFC-USP (PC-98)
|
|
||||||
.It
|
|
||||||
RATOC REX-PCI30 (PC-98)
|
|
||||||
.It
|
|
||||||
@Nifty FNECHARD IFC-USUP-TX (PC-98)
|
|
||||||
.El
|
.El
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr adw 4 ,
|
.Xr adw 4 ,
|
||||||
|
@ -349,14 +349,6 @@ Adaptec
|
|||||||
Adaptec
|
Adaptec
|
||||||
.Tn 4944UW
|
.Tn 4944UW
|
||||||
.It
|
.It
|
||||||
NEC PC-9821Xt13 (PC-98)
|
|
||||||
.It
|
|
||||||
NEC RvII26 (PC-98)
|
|
||||||
.It
|
|
||||||
NEC PC-9821X-B02L/B09 (PC-98)
|
|
||||||
.It
|
|
||||||
NEC SV-98/2-B03 (PC-98)
|
|
||||||
.It
|
|
||||||
Many motherboards with on-board
|
Many motherboards with on-board
|
||||||
.Tn SCSI
|
.Tn SCSI
|
||||||
support
|
support
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
.Nd Advanced Programmable Interrupt Controller (APIC) driver
|
.Nd Advanced Programmable Interrupt Controller (APIC) driver
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
This driver is a mandatory part of amd64 kernel.
|
This driver is a mandatory part of amd64 kernel.
|
||||||
To compile this driver into i386 or pc98 kernel,
|
To compile this driver into i386 kernel,
|
||||||
place the following line in your
|
place the following line in your
|
||||||
kernel configuration file:
|
kernel configuration file:
|
||||||
.Bd -ragged -offset indent
|
.Bd -ragged -offset indent
|
||||||
|
@ -133,12 +133,6 @@ Accton EN2212/EN2216/UE2216
|
|||||||
.It
|
.It
|
||||||
Allied Telesis CentreCOM LA100-PCM_V2
|
Allied Telesis CentreCOM LA100-PCM_V2
|
||||||
.It
|
.It
|
||||||
Allied Telesis LA-98 (flags 0x000000) (PC-98)
|
|
||||||
.It
|
|
||||||
Allied Telesis SIC-98, SIC-98NOTE (110pin), SIU-98 (flags 0x600000) (PC-98)
|
|
||||||
.It
|
|
||||||
Allied Telesis SIU-98-D (flags 0x610000) (PC-98)
|
|
||||||
.It
|
|
||||||
AmbiCom 10BaseT card (8002, 8002T, 8010 and 8610)
|
AmbiCom 10BaseT card (8002, 8002T, 8010 and 8610)
|
||||||
.It
|
.It
|
||||||
Bay Networks NETGEAR FA410TXC Fast Ethernet
|
Bay Networks NETGEAR FA410TXC Fast Ethernet
|
||||||
@ -163,12 +157,6 @@ Compex Net-A adapter
|
|||||||
.It
|
.It
|
||||||
Compex RL2000
|
Compex RL2000
|
||||||
.It
|
.It
|
||||||
Contec C-NET(98), RT-1007(98), C-NET(9N) (110pin) (flags 0xa00000) (PC-98)
|
|
||||||
.It
|
|
||||||
Contec C-NET(98)E-A, C-NET(98)L-A, C-NET(98)P (flags 0x300000) (PC-98)
|
|
||||||
.It
|
|
||||||
Corega Ether98-T (flags 0x000000) (PC-98)
|
|
||||||
.It
|
|
||||||
Corega Ether PCC-T/EtherII PCC-T/FEther PCC-TXF/PCC-TXD PCC-T/Fether II TXD
|
Corega Ether PCC-T/EtherII PCC-T/FEther PCC-TXF/PCC-TXD PCC-T/Fether II TXD
|
||||||
.It
|
.It
|
||||||
Corega LAPCCTXD (TC5299J)
|
Corega LAPCCTXD (TC5299J)
|
||||||
@ -179,16 +167,10 @@ DEC EtherWorks DE305
|
|||||||
.It
|
.It
|
||||||
Danpex EN-6200P2
|
Danpex EN-6200P2
|
||||||
.It
|
.It
|
||||||
D-Link DE-298, DE-298P (flags 0x500000) (PC-98)
|
|
||||||
.It
|
|
||||||
D-Link DE-660, DE-660+
|
D-Link DE-660, DE-660+
|
||||||
.It
|
.It
|
||||||
D-Link IC-CARD/IC-CARD+ Ethernet
|
D-Link IC-CARD/IC-CARD+ Ethernet
|
||||||
.It
|
.It
|
||||||
ELECOM LD-98P (flags 0x500000) (PC-98)
|
|
||||||
.It
|
|
||||||
ELECOM LD-BDN, LD-NW801G (flags 0x200000) (PC-98)
|
|
||||||
.It
|
|
||||||
ELECOM Laneed LD-CDL/TX, LD-CDF, LD-CDS, LD-10/100CD, LD-CDWA (DP83902A)
|
ELECOM Laneed LD-CDL/TX, LD-CDF, LD-CDS, LD-10/100CD, LD-CDWA (DP83902A)
|
||||||
.It
|
.It
|
||||||
Hawking PN652TX PC Card (AX88790)
|
Hawking PN652TX PC Card (AX88790)
|
||||||
@ -198,17 +180,10 @@ HP PC Lan+ 27247B and 27252A
|
|||||||
.It
|
.It
|
||||||
IBM Creditcard Ethernet I/II
|
IBM Creditcard Ethernet I/II
|
||||||
.It
|
.It
|
||||||
ICM AD-ET2-T, DT-ET-25, DT-ET-T5, IF-2766ET, IF-2771ET, NB-ET-T (110pin)
|
|
||||||
(flags 0x500000) (PC-98)
|
|
||||||
.It
|
|
||||||
I-O DATA LA/T-98, LA/T-98SB, LA2/T-98, ET/T-98 (flags 0x900000) (PC-98)
|
|
||||||
.It
|
|
||||||
I-O DATA ET2/T-PCI
|
I-O DATA ET2/T-PCI
|
||||||
.It
|
.It
|
||||||
I-O DATA PCLATE
|
I-O DATA PCLATE
|
||||||
.It
|
.It
|
||||||
Kansai KLA-98C/T (flags 0x900000) (PC-98)
|
|
||||||
.It
|
|
||||||
Kingston KNE-PC2, CIO10T, KNE-PCM/x Ethernet
|
Kingston KNE-PC2, CIO10T, KNE-PCM/x Ethernet
|
||||||
.It
|
.It
|
||||||
KTI ET32P2 PCI
|
KTI ET32P2 PCI
|
||||||
@ -217,28 +192,14 @@ Linksys EC2T/PCMPC100/PCM100, PCMLM56
|
|||||||
.It
|
.It
|
||||||
Linksys EtherFast 10/100 PC Card, Combo PCMCIA Ethernet Card (PCMPC100 V2)
|
Linksys EtherFast 10/100 PC Card, Combo PCMCIA Ethernet Card (PCMPC100 V2)
|
||||||
.It
|
.It
|
||||||
Logitec LAN-98T (flags 0xb00000) (PC-98)
|
|
||||||
.It
|
|
||||||
MACNICA Ethernet ME1 for JEIDA
|
MACNICA Ethernet ME1 for JEIDA
|
||||||
.It
|
.It
|
||||||
MACNICA ME98 (flags 0x900000) (PC-98)
|
|
||||||
.It
|
|
||||||
MACNICA NE2098 (flags 0x400000) (PC-98)
|
|
||||||
.It
|
|
||||||
MELCO EGY-98 (flags 0x300000) (PC-98)
|
|
||||||
.It
|
|
||||||
MELCO LGH-98, LGY-98, LGY-98-N (110pin), IND-SP, IND-SS (flags 0x400000) (PC-98)
|
|
||||||
.It
|
|
||||||
MELCO LGY-PCI-TR
|
MELCO LGY-PCI-TR
|
||||||
.It
|
.It
|
||||||
MELCO LPC-T/LPC2-T/LPC2-CLT/LPC2-TX/LPC3-TX/LPC3-CLX
|
MELCO LPC-T/LPC2-T/LPC2-CLT/LPC2-TX/LPC3-TX/LPC3-CLX
|
||||||
.It
|
.It
|
||||||
NDC Ethernet Instant-Link
|
NDC Ethernet Instant-Link
|
||||||
.It
|
.It
|
||||||
NEC PC-9801-77, PC-9801-78 (flags 0x910000) (PC-98)
|
|
||||||
.It
|
|
||||||
NEC PC-9801-107, PC-9801-108 (flags 0x800000) (PC-98)
|
|
||||||
.It
|
|
||||||
National Semiconductor InfoMover NE4100
|
National Semiconductor InfoMover NE4100
|
||||||
.It
|
.It
|
||||||
NetGear FA-410TX
|
NetGear FA-410TX
|
||||||
@ -247,10 +208,6 @@ NetVin NV5000SC
|
|||||||
.It
|
.It
|
||||||
Network Everywhere Ethernet 10BaseT PC Card
|
Network Everywhere Ethernet 10BaseT PC Card
|
||||||
.It
|
.It
|
||||||
Networld 98X3 (flags 0xd00000) (PC-98)
|
|
||||||
.It
|
|
||||||
Networld EC-98X, EP-98X (flags 0xd10000) (PC-98)
|
|
||||||
.It
|
|
||||||
New Media LANSurfer 10+56 Ethernet/Modem
|
New Media LANSurfer 10+56 Ethernet/Modem
|
||||||
.It
|
.It
|
||||||
New Media LANSurfer
|
New Media LANSurfer
|
||||||
@ -259,10 +216,6 @@ Novell NE1000/NE2000/NE2100
|
|||||||
.It
|
.It
|
||||||
PLANEX ENW-8300-T
|
PLANEX ENW-8300-T
|
||||||
.It
|
.It
|
||||||
PLANEX EN-2298-C (flags 0x200000) (PC-98)
|
|
||||||
.It
|
|
||||||
PLANEX EN-2298P-T, EN-2298-T (flags 0x500000) (PC-98)
|
|
||||||
.It
|
|
||||||
PLANEX FNW-3600-T
|
PLANEX FNW-3600-T
|
||||||
.It
|
.It
|
||||||
Psion 10/100 LANGLOBAL Combine iT
|
Psion 10/100 LANGLOBAL Combine iT
|
||||||
@ -277,8 +230,6 @@ SMC Elite 16 WD8013
|
|||||||
.It
|
.It
|
||||||
SMC Elite Ultra
|
SMC Elite Ultra
|
||||||
.It
|
.It
|
||||||
SMC EtherEZ98 (flags 0x000000) (PC-98)
|
|
||||||
.It
|
|
||||||
SMC WD8003E/WD8003EBT/WD8003S/WD8003SBT/WD8003W/WD8013EBT/WD8013W and clones
|
SMC WD8003E/WD8003EBT/WD8003S/WD8003SBT/WD8003W/WD8013EBT/WD8013W and clones
|
||||||
.It
|
.It
|
||||||
SMC EZCard PC Card, 8040-TX, 8041-TX (AX88x90), 8041-TX V.2 (TC5299J)
|
SMC EZCard PC Card, 8040-TX, 8041-TX (AX88x90), 8041-TX V.2 (TC5299J)
|
||||||
|
@ -66,8 +66,6 @@ driver include:
|
|||||||
.Pp
|
.Pp
|
||||||
.Bl -bullet -compact
|
.Bl -bullet -compact
|
||||||
.It
|
.It
|
||||||
MELCO IFC-DP (PC-98)
|
|
||||||
.It
|
|
||||||
Sun ESP family
|
Sun ESP family
|
||||||
.It
|
.It
|
||||||
Sun FAS family
|
Sun FAS family
|
||||||
|
@ -137,12 +137,6 @@ Intel PRO/100 M Desktop Adapter
|
|||||||
.It
|
.It
|
||||||
Intel PRO/100 S Desktop, Server and Dual-Port Server Adapters
|
Intel PRO/100 S Desktop, Server and Dual-Port Server Adapters
|
||||||
.It
|
.It
|
||||||
Contec C-NET(PI)-100TX (PC-98)
|
|
||||||
.It
|
|
||||||
NEC PC-9821Ra20, Rv20, Xv13, Xv20 internal 100Base-TX (PC-98)
|
|
||||||
.It
|
|
||||||
NEC PC-9821X-B06 (PC-98)
|
|
||||||
.It
|
|
||||||
Many on-board network interfaces on Intel motherboards
|
Many on-board network interfaces on Intel motherboards
|
||||||
.El
|
.El
|
||||||
.Sh LOADER TUNABLES
|
.Sh LOADER TUNABLES
|
||||||
|
@ -65,9 +65,7 @@
|
|||||||
.Cd options GEOM_PART_GPT
|
.Cd options GEOM_PART_GPT
|
||||||
.Cd options GEOM_PART_LDM
|
.Cd options GEOM_PART_LDM
|
||||||
.Cd options GEOM_PART_MBR
|
.Cd options GEOM_PART_MBR
|
||||||
.Cd options GEOM_PART_PC98
|
|
||||||
.Cd options GEOM_PART_VTOC8
|
.Cd options GEOM_PART_VTOC8
|
||||||
.Cd options GEOM_PC98
|
|
||||||
.Cd options GEOM_RAID
|
.Cd options GEOM_RAID
|
||||||
.Cd options GEOM_RAID3
|
.Cd options GEOM_RAID3
|
||||||
.Cd options GEOM_SHSEC
|
.Cd options GEOM_SHSEC
|
||||||
|
@ -8,7 +8,6 @@ MAN= aic.4 \
|
|||||||
cp.4 \
|
cp.4 \
|
||||||
CPU_ELAN.4 \
|
CPU_ELAN.4 \
|
||||||
cs.4 \
|
cs.4 \
|
||||||
ct.4 \
|
|
||||||
ctau.4 \
|
ctau.4 \
|
||||||
cx.4 \
|
cx.4 \
|
||||||
ep.4 \
|
ep.4 \
|
||||||
@ -26,7 +25,6 @@ MAN= aic.4 \
|
|||||||
pnpbios.4 \
|
pnpbios.4 \
|
||||||
sbni.4 \
|
sbni.4 \
|
||||||
smapi.4 \
|
smapi.4 \
|
||||||
snc.4 \
|
|
||||||
streams.4 \
|
streams.4 \
|
||||||
svr4.4 \
|
svr4.4 \
|
||||||
vpd.4 \
|
vpd.4 \
|
||||||
|
@ -62,10 +62,6 @@ Adaptec AHA-1535 (ISA)
|
|||||||
Creative Labs SoundBlaster SCSI host adapter (ISA)
|
Creative Labs SoundBlaster SCSI host adapter (ISA)
|
||||||
.It
|
.It
|
||||||
Adaptec AHA-1460, AHA-1460B, AHA-1460C, AHA-1460D (PC Card)
|
Adaptec AHA-1460, AHA-1460B, AHA-1460C, AHA-1460D (PC Card)
|
||||||
.It
|
|
||||||
Adaptec AHA-1030B, AHA-1030P (PC98)
|
|
||||||
.It
|
|
||||||
NEC PC-9801-100 (PC98)
|
|
||||||
.El
|
.El
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr aha 4 ,
|
.Xr aha 4 ,
|
||||||
|
@ -1,162 +0,0 @@
|
|||||||
.\" Copyright (c) 2003 Noriaki MITSUNAGA. All rights reserved.
|
|
||||||
.\" Copyright (c) 2003 Hideyuki KURASHINA. All rights reserved.
|
|
||||||
.\"
|
|
||||||
.\" 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.
|
|
||||||
.\" 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 AUTHOR AND CONTRIBUTORS ``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 AUTHOR OR CONTRIBUTORS 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$
|
|
||||||
.\"
|
|
||||||
.Dd November 18, 2003
|
|
||||||
.Dt CT 4 i386
|
|
||||||
.Os
|
|
||||||
.Sh NAME
|
|
||||||
.Nm ct
|
|
||||||
.Nd "WD33C93[ABC] based CBUS SCSI host adapter driver"
|
|
||||||
.Sh SYNOPSIS
|
|
||||||
.Cd "device ct"
|
|
||||||
.Cd "device scbus"
|
|
||||||
.Pp
|
|
||||||
In
|
|
||||||
.Pa /boot/device.hints:
|
|
||||||
.Pp
|
|
||||||
For most PC-9801-55, -92 and compatibles:
|
|
||||||
.Cd hint.ct.0.at="isa"
|
|
||||||
.Pp
|
|
||||||
For ELECOM bus-master
|
|
||||||
.Tn SCSI
|
|
||||||
adapters:
|
|
||||||
.Cd hint.ct.0.at="isa"
|
|
||||||
.Cd hint.ct.0.flags="0x30000"
|
|
||||||
.Pp
|
|
||||||
For I-O DATA SC98 adapters:
|
|
||||||
.Cd hint.ct.0.at="isa"
|
|
||||||
.Cd hint.ct.0.flags="0x10000"
|
|
||||||
.Pp
|
|
||||||
For LOGITEC adapters:
|
|
||||||
.Cd hint.ct.0.at="isa"
|
|
||||||
.Cd hint.ct.0.flags="0x50000"
|
|
||||||
.Pp
|
|
||||||
For TEXA adapters:
|
|
||||||
.Cd hint.ct.0.at="isa"
|
|
||||||
.Cd hint.ct.0.flags="0x20000"
|
|
||||||
.Pp
|
|
||||||
For adapters with SMIT transfer mode to enable SMIT transfer:
|
|
||||||
.Cd hint.ct.0.at="isa"
|
|
||||||
.Cd hint.ct.0.flags="0x40000"
|
|
||||||
.Cd hint.ct.0.maddr="0xdc000"
|
|
||||||
.Pp
|
|
||||||
Flags meaning:
|
|
||||||
.Bl -tag -offset indent -compact -width 0x000000
|
|
||||||
.It 0x00000
|
|
||||||
DMA transfer mode for an NEC PC-9801-55, -92 (or
|
|
||||||
compatibles), ICM IF-2660, Midori-Denshi MDC-554NA, or
|
|
||||||
Logitec LHA-N151
|
|
||||||
.It 0x10000
|
|
||||||
DMA transfer mode for an I-O DATA SC-98II
|
|
||||||
.It 0x20000
|
|
||||||
bus-master transfer mode for a TEXA HA-55BS2, its
|
|
||||||
successors, or Midori-Denshi MDC-926R
|
|
||||||
.It 0x30000
|
|
||||||
bus-master transfer mode for an ELECOM bus-master SCSI
|
|
||||||
adapter
|
|
||||||
.It 0x40000
|
|
||||||
SMIT transfer mode (for supported adapters only)
|
|
||||||
.It 0x50000
|
|
||||||
bus-master transfer mode for a Logitec LHA-20x series,
|
|
||||||
ICM IF-2766, IF-2766ET, IF-2767 or IF-2769
|
|
||||||
.El
|
|
||||||
.Sh DESCRIPTION
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
driver provides access to the
|
|
||||||
.Tn SCSI
|
|
||||||
bus connected to a WD33C93[ABC] based host adapter.
|
|
||||||
.Sh HARDWARE
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
driver supports the following adapters:
|
|
||||||
.Pp
|
|
||||||
.Bl -bullet -compact
|
|
||||||
.It
|
|
||||||
ELECOM bus-master
|
|
||||||
.Tn SCSI
|
|
||||||
adapters
|
|
||||||
.It
|
|
||||||
I-O DATA SC-98II
|
|
||||||
.It
|
|
||||||
ICM IF-2660, IF-2766, IF-2766ET, IF-2767 and IF-2769
|
|
||||||
.It
|
|
||||||
Logitec LHA-N151 and LHA-20x series
|
|
||||||
.It
|
|
||||||
Midori-Denshi MDC-554NA and MDC-926R
|
|
||||||
.It
|
|
||||||
NEC PC-9801-55, 92 and compatibles
|
|
||||||
.It
|
|
||||||
SMIT transfer type
|
|
||||||
.Tn SCSI
|
|
||||||
host adapters
|
|
||||||
.It
|
|
||||||
TEXA HA-55BS2 and its later models
|
|
||||||
.El
|
|
||||||
.Sh SEE ALSO
|
|
||||||
.Xr cd 4 ,
|
|
||||||
.Xr ch 4 ,
|
|
||||||
.Xr ctau 4 ,
|
|
||||||
.Xr da 4 ,
|
|
||||||
.Xr intro 4 ,
|
|
||||||
.Xr sa 4 ,
|
|
||||||
.Xr scsi 4
|
|
||||||
.Sh NOTES
|
|
||||||
Historically, the driver for the Cronyx Tau WAN adapters was
|
|
||||||
.Dq ct .
|
|
||||||
This device name was changed to
|
|
||||||
.Dq ctau
|
|
||||||
to avoid conflicts
|
|
||||||
with this pc98
|
|
||||||
.Nm
|
|
||||||
driver.
|
|
||||||
The network device name for
|
|
||||||
.Xr ctau 4
|
|
||||||
is
|
|
||||||
.Dq Li ct .
|
|
||||||
Please see
|
|
||||||
.Xr ctau 4
|
|
||||||
for the details for that device.
|
|
||||||
.Sh HISTORY
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
device driver has been developed for
|
|
||||||
.Nx Ns /pc98
|
|
||||||
and ported for
|
|
||||||
.Fx .
|
|
||||||
It first appeared in
|
|
||||||
.Fx 4.4 .
|
|
||||||
.Sh AUTHORS
|
|
||||||
.An -nosplit
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
driver was written by
|
|
||||||
.An Naofumi HONDA .
|
|
||||||
.Pp
|
|
||||||
This manual page was written by
|
|
||||||
.An Noriaki MITSUNAGA Aq Mt non@FreeBSD.org
|
|
||||||
and
|
|
||||||
.An Hideyuki KURASHINA Aq Mt rushani@FreeBSD.org .
|
|
@ -1,142 +0,0 @@
|
|||||||
.\"
|
|
||||||
.\" Copyright (c) 2004 Tom Rhodes
|
|
||||||
.\" All rights reserved.
|
|
||||||
.\"
|
|
||||||
.\" 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.
|
|
||||||
.\" 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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$
|
|
||||||
.\"
|
|
||||||
.Dd September 4, 2004
|
|
||||||
.Dt SNC 4 i386
|
|
||||||
.Os
|
|
||||||
.Sh NAME
|
|
||||||
.Nm snc
|
|
||||||
.Nd National Semiconductor DP8393X SONIC Ethernet adapter driver
|
|
||||||
.Sh SYNOPSIS
|
|
||||||
.Cd device isa
|
|
||||||
.Cd device snc
|
|
||||||
.Sh DESCRIPTION
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
driver provides support for the
|
|
||||||
.Tn National
|
|
||||||
.Tn Semiconductor
|
|
||||||
.Tn SONIC
|
|
||||||
Ethernet adapters.
|
|
||||||
.Sh HARDWARE
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
driver supports the following cards:
|
|
||||||
.Pp
|
|
||||||
.Bl -bullet -compact
|
|
||||||
.It
|
|
||||||
National Semiconductor DP83934AVQB
|
|
||||||
.It
|
|
||||||
NEC PC-9801-83
|
|
||||||
.It
|
|
||||||
NEC PC-9801-84
|
|
||||||
.It
|
|
||||||
NEC PC-9801-103
|
|
||||||
.It
|
|
||||||
NEC PC-9801-104
|
|
||||||
.It
|
|
||||||
NEC PC-9801N-15
|
|
||||||
.It
|
|
||||||
NEC PC-9801N-25
|
|
||||||
.It
|
|
||||||
NEC PC-9801N-J02 PCMCIA
|
|
||||||
.It
|
|
||||||
NEC PC-9801N-J02R PCMCIA
|
|
||||||
.El
|
|
||||||
.Pp
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
driver also includes support for the
|
|
||||||
.Tn National
|
|
||||||
.Tn Semiconductor
|
|
||||||
.Tn NS46C46
|
|
||||||
as
|
|
||||||
64 * 16 bits Microwave Serial
|
|
||||||
.Tn EEPROM .
|
|
||||||
.Sh IMPLEMENTATION NOTES
|
|
||||||
Accessing
|
|
||||||
.Tn SONIC
|
|
||||||
card data structures and registers as 32 bit values
|
|
||||||
makes code endianness independent.
|
|
||||||
The
|
|
||||||
.Tn SONIC
|
|
||||||
is however always in big-endian mode so it is necessary to
|
|
||||||
ensure that data structures shared
|
|
||||||
between the
|
|
||||||
.Tn CPU
|
|
||||||
and the
|
|
||||||
.Tn SONIC
|
|
||||||
card are always in big-endian order.
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
driver supports the
|
|
||||||
.Tn PC-98
|
|
||||||
C-Bus,
|
|
||||||
and
|
|
||||||
.Tn PnP
|
|
||||||
buses.
|
|
||||||
Support is also provided for the legacy C-Bus.
|
|
||||||
.Sh DIAGNOSTICS
|
|
||||||
The following driver specific error messages
|
|
||||||
may be reported:
|
|
||||||
.Bl -diag
|
|
||||||
.It "snc%d: snc_nec16_register_irq: unsupported irq (%d)"
|
|
||||||
The card returned an
|
|
||||||
.Tn IRQ
|
|
||||||
which is not supported by the driver.
|
|
||||||
.It "snc%d: invalid packet length %d bytes"
|
|
||||||
An attempt to transfer a data packet failed due to an
|
|
||||||
invalid packet length.
|
|
||||||
.El
|
|
||||||
.Sh SEE ALSO
|
|
||||||
.Xr netintro 4 ,
|
|
||||||
.Xr bus_alloc_resource_any 9
|
|
||||||
.Sh HISTORY
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
driver was ported from
|
|
||||||
.Nx
|
|
||||||
by
|
|
||||||
.An -nosplit
|
|
||||||
.An Motomichi Matsuzaki Aq Mt mzaki@e-mail.ne.jp
|
|
||||||
and
|
|
||||||
.An Hiroshi Yamashita Aq Mt bluemoon@msj.biglobe.ne.jp .
|
|
||||||
It first appeared in
|
|
||||||
.Fx 4.2 .
|
|
||||||
This manual page first appeared in
|
|
||||||
.Fx 5.3 .
|
|
||||||
.Sh AUTHORS
|
|
||||||
This manual page was written by
|
|
||||||
.An Tom Rhodes Aq Mt trhodes@FreeBSD.org .
|
|
||||||
.Sh BUGS
|
|
||||||
Currently the
|
|
||||||
.Nm
|
|
||||||
driver only works on the
|
|
||||||
.Tn PC-98
|
|
||||||
architecture.
|
|
||||||
It should probably work on the i386 architecture
|
|
||||||
as well.
|
|
@ -72,15 +72,6 @@ chips:
|
|||||||
.It
|
.It
|
||||||
.Tn 53C1510D
|
.Tn 53C1510D
|
||||||
.El
|
.El
|
||||||
.Pp
|
|
||||||
The following add-on boards are known to be supported:
|
|
||||||
.Pp
|
|
||||||
.Bl -bullet -compact
|
|
||||||
.It
|
|
||||||
I-O DATA SC-98/PCI (PC-98)
|
|
||||||
.It
|
|
||||||
I-O DATA SC-PCI (PC-98)
|
|
||||||
.El
|
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr cd 4 ,
|
.Xr cd 4 ,
|
||||||
.Xr ch 4 ,
|
.Xr ch 4 ,
|
||||||
|
@ -72,8 +72,6 @@ Macnica Miracle SCSI-II mPS110
|
|||||||
.It
|
.It
|
||||||
Media Intelligent MSC-110, MSC-200
|
Media Intelligent MSC-110, MSC-200
|
||||||
.It
|
.It
|
||||||
NEC PC-9801N-J03R
|
|
||||||
.It
|
|
||||||
New Media Corporation BASICS SCSI
|
New Media Corporation BASICS SCSI
|
||||||
.It
|
.It
|
||||||
Qlogic Fast SCSI
|
Qlogic Fast SCSI
|
||||||
|
@ -329,10 +329,6 @@ DawiControl DC2976UW
|
|||||||
.It
|
.It
|
||||||
Diamond FirePort (all)
|
Diamond FirePort (all)
|
||||||
.It
|
.It
|
||||||
I-O DATA SC-UPCI (PC-98)
|
|
||||||
.It
|
|
||||||
Logitec LHA-521UA (PC-98)
|
|
||||||
.It
|
|
||||||
NCR cards (all)
|
NCR cards (all)
|
||||||
.It
|
.It
|
||||||
Symbios cards (all)
|
Symbios cards (all)
|
||||||
|
@ -18,9 +18,6 @@ CFLAGS.gcc+= -mpreferred-stack-boundary=2
|
|||||||
.if ${MACHINE_CPUARCH} == "amd64"
|
.if ${MACHINE_CPUARCH} == "amd64"
|
||||||
CFLAGS+= -fPIC -mno-red-zone
|
CFLAGS+= -fPIC -mno-red-zone
|
||||||
.endif
|
.endif
|
||||||
.if ${MACHINE} == "pc98"
|
|
||||||
CFLAGS+= -Os
|
|
||||||
.endif
|
|
||||||
.if ${MACHINE_CPUARCH} == "aarch64"
|
.if ${MACHINE_CPUARCH} == "aarch64"
|
||||||
CFLAGS+= -mgeneral-regs-only
|
CFLAGS+= -mgeneral-regs-only
|
||||||
.endif
|
.endif
|
||||||
|
@ -47,7 +47,6 @@ TARGET_ARCHES_arm?= arm armeb armv6
|
|||||||
TARGET_ARCHES_arm64?= aarch64
|
TARGET_ARCHES_arm64?= aarch64
|
||||||
TARGET_ARCHES_mips?= mipsel mips mips64el mips64 mipsn32 mipsn32el
|
TARGET_ARCHES_mips?= mipsel mips mips64el mips64 mipsn32 mipsn32el
|
||||||
TARGET_ARCHES_powerpc?= powerpc powerpc64 powerpcspe
|
TARGET_ARCHES_powerpc?= powerpc powerpc64 powerpcspe
|
||||||
TARGET_ARCHES_pc98?= i386
|
|
||||||
TARGET_ARCHES_riscv?= riscv64 riscv64sf
|
TARGET_ARCHES_riscv?= riscv64 riscv64sf
|
||||||
|
|
||||||
# some corner cases
|
# some corner cases
|
||||||
@ -55,7 +54,7 @@ BOOT_MACHINE_DIR.amd64 = boot/i386
|
|||||||
MACHINE_ARCH.host = ${_HOST_ARCH}
|
MACHINE_ARCH.host = ${_HOST_ARCH}
|
||||||
|
|
||||||
# the list of machines we support
|
# the list of machines we support
|
||||||
ALL_MACHINE_LIST?= amd64 arm arm64 i386 mips pc98 powerpc riscv sparc64
|
ALL_MACHINE_LIST?= amd64 arm arm64 i386 mips powerpc riscv sparc64
|
||||||
.for m in ${ALL_MACHINE_LIST:O:u}
|
.for m in ${ALL_MACHINE_LIST:O:u}
|
||||||
MACHINE_ARCH_LIST.$m?= ${TARGET_ARCHES_${m}:U$m}
|
MACHINE_ARCH_LIST.$m?= ${TARGET_ARCHES_${m}:U$m}
|
||||||
MACHINE_ARCH.$m?= ${MACHINE_ARCH_LIST.$m:[1]}
|
MACHINE_ARCH.$m?= ${MACHINE_ARCH_LIST.$m:[1]}
|
||||||
|
@ -294,20 +294,6 @@ jp.106x.kbd:pt:Japon
|
|||||||
jp.106x.kbd:es:Japonés 106x
|
jp.106x.kbd:es:Japonés 106x
|
||||||
jp.106x.kbd:uk:ñÐÏÎÓØËÁ 106x
|
jp.106x.kbd:uk:ñÐÏÎÓØËÁ 106x
|
||||||
|
|
||||||
jp.pc98.kbd:en:Japanese PC-98x1
|
|
||||||
jp.pc98.kbd:de:Japanisch PC-98x1
|
|
||||||
jp.pc98.kbd:fr:Japonais PC-98x1
|
|
||||||
jp.pc98.kbd:pt:Japonês PC-98x1
|
|
||||||
jp.pc98.kbd:es:Japonés PC-98x1
|
|
||||||
jp.pc98.kbd:uk:ñÐÏÎÓØËÁ PC-98x1
|
|
||||||
|
|
||||||
jp.pc98.iso.kbd:en:Japanese PC-98x1 (ISO)
|
|
||||||
jp.pc98.iso.kbd:de:Japanisch PC-98x1 (ISO)
|
|
||||||
jp.pc98.iso.kbd:fr:Japonais PC-98x1 (ISO)
|
|
||||||
jp.pc98.iso.kbd:pt:Japonês PC-98x1 (ISO)
|
|
||||||
jp.pc98.iso.kbd:es:Japonés PC-98x1 (ISO)
|
|
||||||
jp.pc98.iso.kbd:uk:ñÐÏÎÓØËÁ PC-98x1 (ISO)
|
|
||||||
|
|
||||||
kk.pt154.kst.kbd:en:Kazakh PT154 codepage
|
kk.pt154.kst.kbd:en:Kazakh PT154 codepage
|
||||||
kk.pt154.kst.kbd:de:Kasachisch PT154 codepage
|
kk.pt154.kst.kbd:de:Kasachisch PT154 codepage
|
||||||
kk.pt154.kst.kbd:fr:Kazakh PT154 code page
|
kk.pt154.kst.kbd:fr:Kazakh PT154 code page
|
||||||
|
@ -26,7 +26,7 @@ FILES= INDEX.keymaps \
|
|||||||
icelandic.iso.kbd icelandic.iso.acc.kbd \
|
icelandic.iso.kbd icelandic.iso.acc.kbd \
|
||||||
it.iso.kbd \
|
it.iso.kbd \
|
||||||
iw.iso8.kbd \
|
iw.iso8.kbd \
|
||||||
jp.106.kbd jp.106x.kbd jp.pc98.kbd jp.pc98.iso.kbd \
|
jp.106.kbd jp.106x.kbd \
|
||||||
kk.pt154.kst.kbd kk.pt154.io.kbd \
|
kk.pt154.kst.kbd kk.pt154.io.kbd \
|
||||||
latinamerican.kbd latinamerican.iso.acc.kbd \
|
latinamerican.kbd latinamerican.iso.acc.kbd \
|
||||||
lt.iso4.kbd \
|
lt.iso4.kbd \
|
||||||
|
@ -1,134 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
# alt
|
|
||||||
# scan cntrl alt alt cntrl lock
|
|
||||||
# code base shift cntrl shift alt shift cntrl shift state
|
|
||||||
# ------------------------------------------------------------------
|
|
||||||
000 esc esc esc esc esc esc debug esc O
|
|
||||||
001 '1' '!' '!' '!' '1' '!' '!' '!' O
|
|
||||||
002 '2' '@' sub sub '2' '"' nul nul O
|
|
||||||
003 '3' '#' esc esc '3' '#' esc esc O
|
|
||||||
004 '4' '$' fs fs '4' '$' fs fs O
|
|
||||||
005 '5' '%' gs gs '5' '%' gs gs O
|
|
||||||
006 '6' '^' rs rs '6' '&' rs rs O
|
|
||||||
007 '7' '&' '&' '&' '7' ''' us us O
|
|
||||||
008 '8' '*' bs bs '8' '(' del del O
|
|
||||||
009 '9' '(' '(' '(' '9' ')' '9' '9' O
|
|
||||||
010 '0' ')' ')' ')' '0' nop '0' '0' O
|
|
||||||
011 '-' '_' us us '-' '=' '-' '-' O
|
|
||||||
012 '=' '+' '+' '+' '^' '`' rs rs O
|
|
||||||
013 '\' '|' fs fs '\' '|' fs fs O
|
|
||||||
014 bs bs bs bs bs bs bs bs O
|
|
||||||
015 ht btab ht btab ht btab ht btab O
|
|
||||||
016 'q' 'Q' dc1 dc1 'q' 'Q' dc1 dc1 C
|
|
||||||
017 'w' 'W' etb etb 'w' 'W' etb etb C
|
|
||||||
018 'e' 'E' enq enq 'e' 'E' enq enq C
|
|
||||||
019 'r' 'R' dc2 dc2 'r' 'R' dc2 dc2 C
|
|
||||||
020 't' 'T' dc4 dc4 't' 'T' dc4 dc4 C
|
|
||||||
021 'y' 'Y' em em 'y' 'Y' em em C
|
|
||||||
022 'u' 'U' nak nak 'u' 'U' nak nak C
|
|
||||||
023 'i' 'I' ht ht 'i' 'I' ht ht C
|
|
||||||
024 'o' 'O' si si 'o' 'O' si si C
|
|
||||||
025 'p' 'P' dle dle 'p' 'P' dle dle C
|
|
||||||
026 '[' '{' esc esc '@' '~' nul nul O
|
|
||||||
027 ']' '}' gs gs '[' '{' esc esc O
|
|
||||||
028 cr cr nl nl cr cr nl nl O
|
|
||||||
029 'a' 'A' soh soh 'a' 'A' soh soh C
|
|
||||||
030 's' 'S' dc3 dc3 's' 'S' dc3 dc3 C
|
|
||||||
031 'd' 'D' eot eot 'd' 'D' eot eot C
|
|
||||||
032 'f' 'F' ack ack 'f' 'F' ack ack C
|
|
||||||
033 'g' 'G' bel bel 'g' 'G' bel bel C
|
|
||||||
034 'h' 'H' bs bs 'h' 'H' bs bs C
|
|
||||||
035 'j' 'J' nl nl 'j' 'J' nl nl C
|
|
||||||
036 'k' 'K' vt vt 'k' 'K' vt vt C
|
|
||||||
037 'l' 'L' ff ff 'l' 'L' ff ff C
|
|
||||||
038 ';' ':' ';' ';' ';' '+' ';' ';' O
|
|
||||||
039 ''' '"' ''' ''' ':' '*' ':' ':' O
|
|
||||||
040 '`' '~' '~' '~' ']' '}' gs gs O
|
|
||||||
041 'z' 'Z' sub sub 'z' 'Z' sub sub C
|
|
||||||
042 'x' 'X' can can 'x' 'X' can can C
|
|
||||||
043 'c' 'C' etx etx 'c' 'C' etx etx C
|
|
||||||
044 'v' 'V' syn syn 'v' 'V' syn syn C
|
|
||||||
045 'b' 'B' stx stx 'b' 'B' stx stx C
|
|
||||||
046 'n' 'N' so so 'n' 'N' so so C
|
|
||||||
047 'm' 'M' cr cr 'm' 'M' cr cr C
|
|
||||||
048 ',' '<' '<' '<' ',' '<' '<' '<' O
|
|
||||||
049 '.' '>' '>' '>' '.' '>' '>' '>' O
|
|
||||||
050 '/' '?' del del '/' '?' del del O
|
|
||||||
051 '\' '|' fs fs nop '_' us us O
|
|
||||||
052 ' ' ' ' nul nul ' ' ' ' nul nul O
|
|
||||||
053 esc esc esc esc esc esc esc esc O
|
|
||||||
054 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 O
|
|
||||||
055 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 O
|
|
||||||
056 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 O
|
|
||||||
057 del del del del del del boot boot N
|
|
||||||
058 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 O
|
|
||||||
059 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 O
|
|
||||||
060 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 O
|
|
||||||
061 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 O
|
|
||||||
062 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 O
|
|
||||||
063 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 O
|
|
||||||
064 '-' '-' '-' '-' '-' '-' '-' '-' O
|
|
||||||
065 '/' '/' '/' '/' '/' '/' '/' '/' O
|
|
||||||
066 '7' '7' '7' '7' '7' '7' '7' '7' O
|
|
||||||
067 '8' '8' '8' '8' '8' '8' '8' '8' O
|
|
||||||
068 '9' '9' '9' '9' '9' '9' '9' '9' O
|
|
||||||
069 '*' '*' '*' '*' '*' '*' '*' '*' O
|
|
||||||
070 '4' '4' '4' '4' '4' '4' '4' '4' O
|
|
||||||
071 '5' '5' '5' '5' '5' '5' '5' '5' O
|
|
||||||
072 '6' '6' '6' '6' '6' '6' '6' '6' O
|
|
||||||
073 '+' '+' '+' '+' '+' '+' '+' '+' O
|
|
||||||
074 '1' '1' '1' '1' '1' '1' '1' '1' O
|
|
||||||
075 '2' '2' '2' '2' '2' '2' '2' '2' O
|
|
||||||
076 '3' '3' '3' '3' '3' '3' '3' '3' O
|
|
||||||
077 '=' '=' '=' '=' '=' '=' '=' '=' O
|
|
||||||
078 '0' '0' '0' '0' '0' '0' '0' '0' O
|
|
||||||
079 ',' ',' ',' ',' ',' ',' ',' ',' O
|
|
||||||
080 '.' '.' '.' '.' '.' '.' '.' '.' O
|
|
||||||
081 meta meta meta meta meta meta meta meta O
|
|
||||||
082 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O
|
|
||||||
083 fkey12 fkey24 fkey36 fkey48 scr12 scr12 scr12 scr12 O
|
|
||||||
084 slock slock slock slock slock slock slock slock O
|
|
||||||
085 nop nop nop nop nop nop nop nop O
|
|
||||||
086 nop nop nop nop nop nop nop nop O
|
|
||||||
087 nop nop nop nop nop nop nop nop O
|
|
||||||
088 nop nop nop nop nop nop nop nop O
|
|
||||||
089 nop nop nop nop nop nop nop nop O
|
|
||||||
090 nop nop nop nop nop nop nop nop O
|
|
||||||
091 nop nop nop nop nop nop nop nop O
|
|
||||||
092 nop nop nop nop nop nop nop nop O
|
|
||||||
093 nop nop nop nop nop nop nop nop O
|
|
||||||
094 nop nop nop nop nop nop nop nop O
|
|
||||||
095 nop nop nop nop nop nop nop nop O
|
|
||||||
096 slock saver slock saver susp nop susp nop O
|
|
||||||
097 nscr nscr debug debug nop nop nop nop O
|
|
||||||
098 fkey01 fkey13 fkey25 fkey37 scr01 scr01 scr01 scr01 O
|
|
||||||
099 fkey02 fkey14 fkey26 fkey38 scr02 scr02 scr02 scr02 O
|
|
||||||
100 fkey03 fkey15 fkey27 fkey39 scr03 scr03 scr03 scr03 O
|
|
||||||
101 fkey04 fkey16 fkey28 fkey40 scr04 scr04 scr04 scr04 O
|
|
||||||
102 fkey05 fkey17 fkey29 fkey41 scr05 scr05 scr05 scr05 O
|
|
||||||
103 fkey06 fkey18 fkey30 fkey42 scr06 scr06 scr06 scr06 O
|
|
||||||
104 fkey07 fkey19 fkey31 fkey43 scr07 scr07 scr07 scr07 O
|
|
||||||
105 fkey08 fkey20 fkey32 fkey44 scr08 scr08 scr08 scr08 O
|
|
||||||
106 fkey09 fkey21 fkey33 fkey45 scr09 scr09 scr09 scr09 O
|
|
||||||
107 fkey10 fkey22 fkey34 fkey46 scr10 scr10 scr10 scr10 O
|
|
||||||
108 nop nop nop nop nop nop nop nop O
|
|
||||||
109 nop nop nop nop nop nop nop nop O
|
|
||||||
110 nop nop nop nop nop nop nop nop O
|
|
||||||
111 nop nop nop nop nop nop nop nop O
|
|
||||||
112 lshift lshift lshift lshift lshift lshift lshift lshift O
|
|
||||||
113 clock clock clock clock clock clock clock clock O
|
|
||||||
114 lalt lalt lalt lalt lalt lalt lalt lalt O
|
|
||||||
115 lalt lalt lalt lalt lalt lalt lalt lalt O
|
|
||||||
116 lctrl lctrl lctrl lctrl lctrl lctrl lctrl lctrl O
|
|
||||||
117 nop nop nop nop nop nop nop nop O
|
|
||||||
118 nop nop nop nop nop nop nop nop O
|
|
||||||
119 nop nop nop nop nop nop nop nop O
|
|
||||||
120 nop nop nop nop nop nop nop nop O
|
|
||||||
121 nop nop nop nop nop nop nop nop O
|
|
||||||
122 nop nop nop nop nop nop nop nop O
|
|
||||||
123 nop nop nop nop nop nop nop nop O
|
|
||||||
124 nop nop nop nop nop nop nop nop O
|
|
||||||
125 nop nop nop nop nop nop nop nop O
|
|
||||||
126 nop nop nop nop nop nop nop nop O
|
|
||||||
127 nop nop nop nop nop nop nop nop O
|
|
||||||
|
|
@ -1,134 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
# alt
|
|
||||||
# scan cntrl alt alt cntrl lock
|
|
||||||
# code base shift cntrl shift alt shift cntrl shift state
|
|
||||||
# ------------------------------------------------------------------
|
|
||||||
000 esc esc esc esc esc esc debug esc O
|
|
||||||
001 '1' '!' '!' '!' '1' '!' '!' '!' O
|
|
||||||
002 '2' '"' sub sub '2' '@' nul nul O
|
|
||||||
003 '3' '#' esc esc '3' '#' esc esc O
|
|
||||||
004 '4' '$' fs fs '4' '$' fs fs O
|
|
||||||
005 '5' '%' gs gs '5' '%' gs gs O
|
|
||||||
006 '6' '&' rs rs '6' '^' rs rs O
|
|
||||||
007 '7' ''' us us '7' '&' '&' '&' O
|
|
||||||
008 '8' '(' del del '8' '*' bs bs O
|
|
||||||
009 '9' ')' '9' '9' '9' '(' '(' '(' O
|
|
||||||
010 '0' nop '0' '0' '0' ')' ')' ')' O
|
|
||||||
011 '-' '=' '-' '-' '-' '_' us us O
|
|
||||||
012 '^' '`' rs rs '=' '+' '+' '+' O
|
|
||||||
013 '\' '|' fs fs '\' '|' fs fs O
|
|
||||||
014 bs bs bs bs bs bs bs bs O
|
|
||||||
015 ht btab ht btab ht btab ht btab O
|
|
||||||
016 'q' 'Q' dc1 dc1 'q' 'Q' dc1 dc1 C
|
|
||||||
017 'w' 'W' etb etb 'w' 'W' etb etb C
|
|
||||||
018 'e' 'E' enq enq 'e' 'E' enq enq C
|
|
||||||
019 'r' 'R' dc2 dc2 'r' 'R' dc2 dc2 C
|
|
||||||
020 't' 'T' dc4 dc4 't' 'T' dc4 dc4 C
|
|
||||||
021 'y' 'Y' em em 'y' 'Y' em em C
|
|
||||||
022 'u' 'U' nak nak 'u' 'U' nak nak C
|
|
||||||
023 'i' 'I' ht ht 'i' 'I' ht ht C
|
|
||||||
024 'o' 'O' si si 'o' 'O' si si C
|
|
||||||
025 'p' 'P' dle dle 'p' 'P' dle dle C
|
|
||||||
026 '@' '~' nul nul '[' '{' esc esc O
|
|
||||||
027 '[' '{' esc esc ']' '}' gs gs O
|
|
||||||
028 cr cr nl nl cr cr nl nl O
|
|
||||||
029 'a' 'A' soh soh 'a' 'A' soh soh C
|
|
||||||
030 's' 'S' dc3 dc3 's' 'S' dc3 dc3 C
|
|
||||||
031 'd' 'D' eot eot 'd' 'D' eot eot C
|
|
||||||
032 'f' 'F' ack ack 'f' 'F' ack ack C
|
|
||||||
033 'g' 'G' bel bel 'g' 'G' bel bel C
|
|
||||||
034 'h' 'H' bs bs 'h' 'H' bs bs C
|
|
||||||
035 'j' 'J' nl nl 'j' 'J' nl nl C
|
|
||||||
036 'k' 'K' vt vt 'k' 'K' vt vt C
|
|
||||||
037 'l' 'L' ff ff 'l' 'L' ff ff C
|
|
||||||
038 ';' '+' ';' ';' ';' ':' ';' ';' O
|
|
||||||
039 ':' '*' ':' ':' ''' '"' ''' ''' O
|
|
||||||
040 ']' '}' gs gs '`' '~' '~' '~' O
|
|
||||||
041 'z' 'Z' sub sub 'z' 'Z' sub sub C
|
|
||||||
042 'x' 'X' can can 'x' 'X' can can C
|
|
||||||
043 'c' 'C' etx etx 'c' 'C' etx etx C
|
|
||||||
044 'v' 'V' syn syn 'v' 'V' syn syn C
|
|
||||||
045 'b' 'B' stx stx 'b' 'B' stx stx C
|
|
||||||
046 'n' 'N' so so 'n' 'N' so so C
|
|
||||||
047 'm' 'M' cr cr 'm' 'M' cr cr C
|
|
||||||
048 ',' '<' '<' '<' ',' '<' '<' '<' O
|
|
||||||
049 '.' '>' '>' '>' '.' '>' '>' '>' O
|
|
||||||
050 '/' '?' del del '/' '?' del del O
|
|
||||||
051 nop '_' us us '\' '|' fs fs O
|
|
||||||
052 ' ' ' ' nul nul ' ' ' ' nul nul O
|
|
||||||
053 esc esc esc esc esc esc esc esc O
|
|
||||||
054 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 O
|
|
||||||
055 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 O
|
|
||||||
056 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 O
|
|
||||||
057 del del del del del del boot boot N
|
|
||||||
058 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 O
|
|
||||||
059 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 O
|
|
||||||
060 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 O
|
|
||||||
061 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 O
|
|
||||||
062 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 O
|
|
||||||
063 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 O
|
|
||||||
064 '-' '-' '-' '-' '-' '-' '-' '-' O
|
|
||||||
065 '/' '/' '/' '/' '/' '/' '/' '/' O
|
|
||||||
066 '7' '7' '7' '7' '7' '7' '7' '7' O
|
|
||||||
067 '8' '8' '8' '8' '8' '8' '8' '8' O
|
|
||||||
068 '9' '9' '9' '9' '9' '9' '9' '9' O
|
|
||||||
069 '*' '*' '*' '*' '*' '*' '*' '*' O
|
|
||||||
070 '4' '4' '4' '4' '4' '4' '4' '4' O
|
|
||||||
071 '5' '5' '5' '5' '5' '5' '5' '5' O
|
|
||||||
072 '6' '6' '6' '6' '6' '6' '6' '6' O
|
|
||||||
073 '+' '+' '+' '+' '+' '+' '+' '+' O
|
|
||||||
074 '1' '1' '1' '1' '1' '1' '1' '1' O
|
|
||||||
075 '2' '2' '2' '2' '2' '2' '2' '2' O
|
|
||||||
076 '3' '3' '3' '3' '3' '3' '3' '3' O
|
|
||||||
077 '=' '=' '=' '=' '=' '=' '=' '=' O
|
|
||||||
078 '0' '0' '0' '0' '0' '0' '0' '0' O
|
|
||||||
079 ',' ',' ',' ',' ',' ',' ',' ',' O
|
|
||||||
080 '.' '.' '.' '.' '.' '.' '.' '.' O
|
|
||||||
081 meta meta meta meta meta meta meta meta O
|
|
||||||
082 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O
|
|
||||||
083 fkey12 fkey24 fkey36 fkey48 scr12 scr12 scr12 scr12 O
|
|
||||||
084 slock slock slock slock slock slock slock slock O
|
|
||||||
085 nop nop nop nop nop nop nop nop O
|
|
||||||
086 nop nop nop nop nop nop nop nop O
|
|
||||||
087 nop nop nop nop nop nop nop nop O
|
|
||||||
088 nop nop nop nop nop nop nop nop O
|
|
||||||
089 nop nop nop nop nop nop nop nop O
|
|
||||||
090 nop nop nop nop nop nop nop nop O
|
|
||||||
091 nop nop nop nop nop nop nop nop O
|
|
||||||
092 nop nop nop nop nop nop nop nop O
|
|
||||||
093 nop nop nop nop nop nop nop nop O
|
|
||||||
094 nop nop nop nop nop nop nop nop O
|
|
||||||
095 nop nop nop nop nop nop nop nop O
|
|
||||||
096 slock saver slock saver susp nop susp nop O
|
|
||||||
097 nscr nscr debug debug nop nop nop nop O
|
|
||||||
098 fkey01 fkey13 fkey25 fkey37 scr01 scr01 scr01 scr01 O
|
|
||||||
099 fkey02 fkey14 fkey26 fkey38 scr02 scr02 scr02 scr02 O
|
|
||||||
100 fkey03 fkey15 fkey27 fkey39 scr03 scr03 scr03 scr03 O
|
|
||||||
101 fkey04 fkey16 fkey28 fkey40 scr04 scr04 scr04 scr04 O
|
|
||||||
102 fkey05 fkey17 fkey29 fkey41 scr05 scr05 scr05 scr05 O
|
|
||||||
103 fkey06 fkey18 fkey30 fkey42 scr06 scr06 scr06 scr06 O
|
|
||||||
104 fkey07 fkey19 fkey31 fkey43 scr07 scr07 scr07 scr07 O
|
|
||||||
105 fkey08 fkey20 fkey32 fkey44 scr08 scr08 scr08 scr08 O
|
|
||||||
106 fkey09 fkey21 fkey33 fkey45 scr09 scr09 scr09 scr09 O
|
|
||||||
107 fkey10 fkey22 fkey34 fkey46 scr10 scr10 scr10 scr10 O
|
|
||||||
108 nop nop nop nop nop nop nop nop O
|
|
||||||
109 nop nop nop nop nop nop nop nop O
|
|
||||||
110 nop nop nop nop nop nop nop nop O
|
|
||||||
111 nop nop nop nop nop nop nop nop O
|
|
||||||
112 lshift lshift lshift lshift lshift lshift lshift lshift O
|
|
||||||
113 clock clock clock clock clock clock clock clock O
|
|
||||||
114 lalt lalt lalt lalt lalt lalt lalt lalt O
|
|
||||||
115 lalt lalt lalt lalt lalt lalt lalt lalt O
|
|
||||||
116 lctrl lctrl lctrl lctrl lctrl lctrl lctrl lctrl O
|
|
||||||
117 nop nop nop nop nop nop nop nop O
|
|
||||||
118 nop nop nop nop nop nop nop nop O
|
|
||||||
119 nop nop nop nop nop nop nop nop O
|
|
||||||
120 nop nop nop nop nop nop nop nop O
|
|
||||||
121 nop nop nop nop nop nop nop nop O
|
|
||||||
122 nop nop nop nop nop nop nop nop O
|
|
||||||
123 nop nop nop nop nop nop nop nop O
|
|
||||||
124 nop nop nop nop nop nop nop nop O
|
|
||||||
125 nop nop nop nop nop nop nop nop O
|
|
||||||
126 nop nop nop nop nop nop nop nop O
|
|
||||||
127 nop nop nop nop nop nop nop nop O
|
|
||||||
|
|
@ -301,20 +301,6 @@ jp.capsctrl.kbd:pt:Japonês 106x
|
|||||||
jp.capsctrl.kbd:es:Japonés 106x
|
jp.capsctrl.kbd:es:Japonés 106x
|
||||||
jp.capsctrl.kbd:uk:Японська 106x
|
jp.capsctrl.kbd:uk:Японська 106x
|
||||||
|
|
||||||
jp.pc98.kbd:en:Japanese PC-98x1
|
|
||||||
jp.pc98.kbd:de:Japanisch PC-98x1
|
|
||||||
jp.pc98.kbd:fr:Japonais PC-98x1
|
|
||||||
jp.pc98.kbd:pt:Japonês PC-98x1
|
|
||||||
jp.pc98.kbd:es:Japonés PC-98x1
|
|
||||||
jp.pc98.kbd:uk:Японська PC-98x1
|
|
||||||
|
|
||||||
jp.pc98.iso.kbd:en:Japanese PC-98x1 (ISO)
|
|
||||||
jp.pc98.iso.kbd:de:Japanisch PC-98x1 (ISO)
|
|
||||||
jp.pc98.iso.kbd:fr:Japonais PC-98x1 (ISO)
|
|
||||||
jp.pc98.iso.kbd:pt:Japonês PC-98x1 (ISO)
|
|
||||||
jp.pc98.iso.kbd:es:Japonés PC-98x1 (ISO)
|
|
||||||
jp.pc98.iso.kbd:uk:Японська PC-98x1 (ISO)
|
|
||||||
|
|
||||||
kz.kst.kbd:en:Kazakh
|
kz.kst.kbd:en:Kazakh
|
||||||
kz.kst.kbd:de:Kasachisch
|
kz.kst.kbd:de:Kasachisch
|
||||||
kz.kst.kbd:fr:Kazakh
|
kz.kst.kbd:fr:Kazakh
|
||||||
|
@ -48,8 +48,6 @@ FILES= INDEX.keymaps \
|
|||||||
it.kbd \
|
it.kbd \
|
||||||
jp.capsctrl.kbd \
|
jp.capsctrl.kbd \
|
||||||
jp.kbd \
|
jp.kbd \
|
||||||
jp.pc98.iso.kbd \
|
|
||||||
jp.pc98.kbd \
|
|
||||||
kz.io.kbd \
|
kz.io.kbd \
|
||||||
kz.kst.kbd \
|
kz.kst.kbd \
|
||||||
latinamerican.acc.kbd \
|
latinamerican.acc.kbd \
|
||||||
|
@ -1,134 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
# alt
|
|
||||||
# scan cntrl alt alt cntrl lock
|
|
||||||
# code base shift cntrl shift alt shift cntrl shift state
|
|
||||||
# ------------------------------------------------------------------
|
|
||||||
000 esc esc esc esc esc esc debug esc O
|
|
||||||
001 '1' '!' '!' '!' '1' '!' '!' '!' O
|
|
||||||
002 '2' '@' sub sub '2' '"' nul nul O
|
|
||||||
003 '3' '#' esc esc '3' '#' esc esc O
|
|
||||||
004 '4' '$' fs fs '4' '$' fs fs O
|
|
||||||
005 '5' '%' gs gs '5' '%' gs gs O
|
|
||||||
006 '6' '^' rs rs '6' '&' rs rs O
|
|
||||||
007 '7' '&' '&' '&' '7' ''' us us O
|
|
||||||
008 '8' '*' bs bs '8' '(' del del O
|
|
||||||
009 '9' '(' '(' '(' '9' ')' '9' '9' O
|
|
||||||
010 '0' ')' ')' ')' '0' nop '0' '0' O
|
|
||||||
011 '-' '_' us us '-' '=' '-' '-' O
|
|
||||||
012 '=' '+' '+' '+' '^' '`' rs rs O
|
|
||||||
013 0xa5 '|' fs fs 0xa5 '|' fs fs O
|
|
||||||
014 bs bs bs bs bs bs bs bs O
|
|
||||||
015 ht btab ht btab ht btab ht btab O
|
|
||||||
016 'q' 'Q' dc1 dc1 'q' 'Q' dc1 dc1 C
|
|
||||||
017 'w' 'W' etb etb 'w' 'W' etb etb C
|
|
||||||
018 'e' 'E' enq enq 'e' 'E' enq enq C
|
|
||||||
019 'r' 'R' dc2 dc2 'r' 'R' dc2 dc2 C
|
|
||||||
020 't' 'T' dc4 dc4 't' 'T' dc4 dc4 C
|
|
||||||
021 'y' 'Y' em em 'y' 'Y' em em C
|
|
||||||
022 'u' 'U' nak nak 'u' 'U' nak nak C
|
|
||||||
023 'i' 'I' ht ht 'i' 'I' ht ht C
|
|
||||||
024 'o' 'O' si si 'o' 'O' si si C
|
|
||||||
025 'p' 'P' dle dle 'p' 'P' dle dle C
|
|
||||||
026 '[' '{' esc esc '@' '~' nul nul O
|
|
||||||
027 ']' '}' gs gs '[' '{' esc esc O
|
|
||||||
028 cr cr nl nl cr cr nl nl O
|
|
||||||
029 'a' 'A' soh soh 'a' 'A' soh soh C
|
|
||||||
030 's' 'S' dc3 dc3 's' 'S' dc3 dc3 C
|
|
||||||
031 'd' 'D' eot eot 'd' 'D' eot eot C
|
|
||||||
032 'f' 'F' ack ack 'f' 'F' ack ack C
|
|
||||||
033 'g' 'G' bel bel 'g' 'G' bel bel C
|
|
||||||
034 'h' 'H' bs bs 'h' 'H' bs bs C
|
|
||||||
035 'j' 'J' nl nl 'j' 'J' nl nl C
|
|
||||||
036 'k' 'K' vt vt 'k' 'K' vt vt C
|
|
||||||
037 'l' 'L' ff ff 'l' 'L' ff ff C
|
|
||||||
038 ';' ':' ';' ';' ';' '+' ';' ';' O
|
|
||||||
039 ''' '"' ''' ''' ':' '*' ':' ':' O
|
|
||||||
040 '`' '~' '~' '~' ']' '}' gs gs O
|
|
||||||
041 'z' 'Z' sub sub 'z' 'Z' sub sub C
|
|
||||||
042 'x' 'X' can can 'x' 'X' can can C
|
|
||||||
043 'c' 'C' etx etx 'c' 'C' etx etx C
|
|
||||||
044 'v' 'V' syn syn 'v' 'V' syn syn C
|
|
||||||
045 'b' 'B' stx stx 'b' 'B' stx stx C
|
|
||||||
046 'n' 'N' so so 'n' 'N' so so C
|
|
||||||
047 'm' 'M' cr cr 'm' 'M' cr cr C
|
|
||||||
048 ',' '<' '<' '<' ',' '<' '<' '<' O
|
|
||||||
049 '.' '>' '>' '>' '.' '>' '>' '>' O
|
|
||||||
050 '/' '?' del del '/' '?' del del O
|
|
||||||
051 '\' '|' fs fs nop '_' us us O
|
|
||||||
052 ' ' ' ' nul nul ' ' ' ' nul nul O
|
|
||||||
053 esc esc esc esc esc esc esc esc O
|
|
||||||
054 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 O
|
|
||||||
055 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 O
|
|
||||||
056 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 O
|
|
||||||
057 del del del del del del boot boot N
|
|
||||||
058 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 O
|
|
||||||
059 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 O
|
|
||||||
060 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 O
|
|
||||||
061 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 O
|
|
||||||
062 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 O
|
|
||||||
063 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 O
|
|
||||||
064 '-' '-' '-' '-' '-' '-' '-' '-' O
|
|
||||||
065 '/' '/' '/' '/' '/' '/' '/' '/' O
|
|
||||||
066 '7' '7' '7' '7' '7' '7' '7' '7' O
|
|
||||||
067 '8' '8' '8' '8' '8' '8' '8' '8' O
|
|
||||||
068 '9' '9' '9' '9' '9' '9' '9' '9' O
|
|
||||||
069 '*' '*' '*' '*' '*' '*' '*' '*' O
|
|
||||||
070 '4' '4' '4' '4' '4' '4' '4' '4' O
|
|
||||||
071 '5' '5' '5' '5' '5' '5' '5' '5' O
|
|
||||||
072 '6' '6' '6' '6' '6' '6' '6' '6' O
|
|
||||||
073 '+' '+' '+' '+' '+' '+' '+' '+' O
|
|
||||||
074 '1' '1' '1' '1' '1' '1' '1' '1' O
|
|
||||||
075 '2' '2' '2' '2' '2' '2' '2' '2' O
|
|
||||||
076 '3' '3' '3' '3' '3' '3' '3' '3' O
|
|
||||||
077 '=' '=' '=' '=' '=' '=' '=' '=' O
|
|
||||||
078 '0' '0' '0' '0' '0' '0' '0' '0' O
|
|
||||||
079 ',' ',' ',' ',' ',' ',' ',' ',' O
|
|
||||||
080 '.' '.' '.' '.' '.' '.' '.' '.' O
|
|
||||||
081 meta meta meta meta meta meta meta meta O
|
|
||||||
082 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O
|
|
||||||
083 fkey12 fkey24 fkey36 fkey48 scr12 scr12 scr12 scr12 O
|
|
||||||
084 slock slock slock slock slock slock slock slock O
|
|
||||||
085 nop nop nop nop nop nop nop nop O
|
|
||||||
086 nop nop nop nop nop nop nop nop O
|
|
||||||
087 nop nop nop nop nop nop nop nop O
|
|
||||||
088 nop nop nop nop nop nop nop nop O
|
|
||||||
089 nop nop nop nop nop nop nop nop O
|
|
||||||
090 nop nop nop nop nop nop nop nop O
|
|
||||||
091 nop nop nop nop nop nop nop nop O
|
|
||||||
092 nop nop nop nop nop nop nop nop O
|
|
||||||
093 nop nop nop nop nop nop nop nop O
|
|
||||||
094 nop nop nop nop nop nop nop nop O
|
|
||||||
095 nop nop nop nop nop nop nop nop O
|
|
||||||
096 slock saver slock saver susp nop susp nop O
|
|
||||||
097 nscr nscr debug debug nop nop nop nop O
|
|
||||||
098 fkey01 fkey13 fkey25 fkey37 scr01 scr01 scr01 scr01 O
|
|
||||||
099 fkey02 fkey14 fkey26 fkey38 scr02 scr02 scr02 scr02 O
|
|
||||||
100 fkey03 fkey15 fkey27 fkey39 scr03 scr03 scr03 scr03 O
|
|
||||||
101 fkey04 fkey16 fkey28 fkey40 scr04 scr04 scr04 scr04 O
|
|
||||||
102 fkey05 fkey17 fkey29 fkey41 scr05 scr05 scr05 scr05 O
|
|
||||||
103 fkey06 fkey18 fkey30 fkey42 scr06 scr06 scr06 scr06 O
|
|
||||||
104 fkey07 fkey19 fkey31 fkey43 scr07 scr07 scr07 scr07 O
|
|
||||||
105 fkey08 fkey20 fkey32 fkey44 scr08 scr08 scr08 scr08 O
|
|
||||||
106 fkey09 fkey21 fkey33 fkey45 scr09 scr09 scr09 scr09 O
|
|
||||||
107 fkey10 fkey22 fkey34 fkey46 scr10 scr10 scr10 scr10 O
|
|
||||||
108 nop nop nop nop nop nop nop nop O
|
|
||||||
109 nop nop nop nop nop nop nop nop O
|
|
||||||
110 nop nop nop nop nop nop nop nop O
|
|
||||||
111 nop nop nop nop nop nop nop nop O
|
|
||||||
112 lshift lshift lshift lshift lshift lshift lshift lshift O
|
|
||||||
113 clock clock clock clock clock clock clock clock O
|
|
||||||
114 lalt lalt lalt lalt lalt lalt lalt lalt O
|
|
||||||
115 lalt lalt lalt lalt lalt lalt lalt lalt O
|
|
||||||
116 lctrl lctrl lctrl lctrl lctrl lctrl lctrl lctrl O
|
|
||||||
117 nop nop nop nop nop nop nop nop O
|
|
||||||
118 nop nop nop nop nop nop nop nop O
|
|
||||||
119 nop nop nop nop nop nop nop nop O
|
|
||||||
120 nop nop nop nop nop nop nop nop O
|
|
||||||
121 nop nop nop nop nop nop nop nop O
|
|
||||||
122 nop nop nop nop nop nop nop nop O
|
|
||||||
123 nop nop nop nop nop nop nop nop O
|
|
||||||
124 nop nop nop nop nop nop nop nop O
|
|
||||||
125 nop nop nop nop nop nop nop nop O
|
|
||||||
126 nop nop nop nop nop nop nop nop O
|
|
||||||
127 nop nop nop nop nop nop nop nop O
|
|
||||||
|
|
@ -1,134 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
# alt
|
|
||||||
# scan cntrl alt alt cntrl lock
|
|
||||||
# code base shift cntrl shift alt shift cntrl shift state
|
|
||||||
# ------------------------------------------------------------------
|
|
||||||
000 esc esc esc esc esc esc debug esc O
|
|
||||||
001 '1' '!' '!' '!' '1' '!' '!' '!' O
|
|
||||||
002 '2' '"' sub sub '2' '@' nul nul O
|
|
||||||
003 '3' '#' esc esc '3' '#' esc esc O
|
|
||||||
004 '4' '$' fs fs '4' '$' fs fs O
|
|
||||||
005 '5' '%' gs gs '5' '%' gs gs O
|
|
||||||
006 '6' '&' rs rs '6' '^' rs rs O
|
|
||||||
007 '7' ''' us us '7' '&' '&' '&' O
|
|
||||||
008 '8' '(' del del '8' '*' bs bs O
|
|
||||||
009 '9' ')' '9' '9' '9' '(' '(' '(' O
|
|
||||||
010 '0' nop '0' '0' '0' ')' ')' ')' O
|
|
||||||
011 '-' '=' '-' '-' '-' '_' us us O
|
|
||||||
012 '^' '`' rs rs '=' '+' '+' '+' O
|
|
||||||
013 '\' '|' fs fs 0xa5 '|' fs fs O
|
|
||||||
014 bs bs bs bs bs bs bs bs O
|
|
||||||
015 ht btab ht btab ht btab ht btab O
|
|
||||||
016 'q' 'Q' dc1 dc1 'q' 'Q' dc1 dc1 C
|
|
||||||
017 'w' 'W' etb etb 'w' 'W' etb etb C
|
|
||||||
018 'e' 'E' enq enq 'e' 'E' enq enq C
|
|
||||||
019 'r' 'R' dc2 dc2 'r' 'R' dc2 dc2 C
|
|
||||||
020 't' 'T' dc4 dc4 't' 'T' dc4 dc4 C
|
|
||||||
021 'y' 'Y' em em 'y' 'Y' em em C
|
|
||||||
022 'u' 'U' nak nak 'u' 'U' nak nak C
|
|
||||||
023 'i' 'I' ht ht 'i' 'I' ht ht C
|
|
||||||
024 'o' 'O' si si 'o' 'O' si si C
|
|
||||||
025 'p' 'P' dle dle 'p' 'P' dle dle C
|
|
||||||
026 '@' '~' nul nul '[' '{' esc esc O
|
|
||||||
027 '[' '{' esc esc ']' '}' gs gs O
|
|
||||||
028 cr cr nl nl cr cr nl nl O
|
|
||||||
029 'a' 'A' soh soh 'a' 'A' soh soh C
|
|
||||||
030 's' 'S' dc3 dc3 's' 'S' dc3 dc3 C
|
|
||||||
031 'd' 'D' eot eot 'd' 'D' eot eot C
|
|
||||||
032 'f' 'F' ack ack 'f' 'F' ack ack C
|
|
||||||
033 'g' 'G' bel bel 'g' 'G' bel bel C
|
|
||||||
034 'h' 'H' bs bs 'h' 'H' bs bs C
|
|
||||||
035 'j' 'J' nl nl 'j' 'J' nl nl C
|
|
||||||
036 'k' 'K' vt vt 'k' 'K' vt vt C
|
|
||||||
037 'l' 'L' ff ff 'l' 'L' ff ff C
|
|
||||||
038 ';' '+' ';' ';' ';' ':' ';' ';' O
|
|
||||||
039 ':' '*' ':' ':' ''' '"' ''' ''' O
|
|
||||||
040 ']' '}' gs gs '`' '~' '~' '~' O
|
|
||||||
041 'z' 'Z' sub sub 'z' 'Z' sub sub C
|
|
||||||
042 'x' 'X' can can 'x' 'X' can can C
|
|
||||||
043 'c' 'C' etx etx 'c' 'C' etx etx C
|
|
||||||
044 'v' 'V' syn syn 'v' 'V' syn syn C
|
|
||||||
045 'b' 'B' stx stx 'b' 'B' stx stx C
|
|
||||||
046 'n' 'N' so so 'n' 'N' so so C
|
|
||||||
047 'm' 'M' cr cr 'm' 'M' cr cr C
|
|
||||||
048 ',' '<' '<' '<' ',' '<' '<' '<' O
|
|
||||||
049 '.' '>' '>' '>' '.' '>' '>' '>' O
|
|
||||||
050 '/' '?' del del '/' '?' del del O
|
|
||||||
051 nop '_' us us '\' '|' fs fs O
|
|
||||||
052 ' ' ' ' nul nul ' ' ' ' nul nul O
|
|
||||||
053 esc esc esc esc esc esc esc esc O
|
|
||||||
054 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 O
|
|
||||||
055 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 O
|
|
||||||
056 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 O
|
|
||||||
057 del del del del del del boot boot N
|
|
||||||
058 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 O
|
|
||||||
059 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 O
|
|
||||||
060 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 O
|
|
||||||
061 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 O
|
|
||||||
062 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 O
|
|
||||||
063 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 O
|
|
||||||
064 '-' '-' '-' '-' '-' '-' '-' '-' O
|
|
||||||
065 '/' '/' '/' '/' '/' '/' '/' '/' O
|
|
||||||
066 '7' '7' '7' '7' '7' '7' '7' '7' O
|
|
||||||
067 '8' '8' '8' '8' '8' '8' '8' '8' O
|
|
||||||
068 '9' '9' '9' '9' '9' '9' '9' '9' O
|
|
||||||
069 '*' '*' '*' '*' '*' '*' '*' '*' O
|
|
||||||
070 '4' '4' '4' '4' '4' '4' '4' '4' O
|
|
||||||
071 '5' '5' '5' '5' '5' '5' '5' '5' O
|
|
||||||
072 '6' '6' '6' '6' '6' '6' '6' '6' O
|
|
||||||
073 '+' '+' '+' '+' '+' '+' '+' '+' O
|
|
||||||
074 '1' '1' '1' '1' '1' '1' '1' '1' O
|
|
||||||
075 '2' '2' '2' '2' '2' '2' '2' '2' O
|
|
||||||
076 '3' '3' '3' '3' '3' '3' '3' '3' O
|
|
||||||
077 '=' '=' '=' '=' '=' '=' '=' '=' O
|
|
||||||
078 '0' '0' '0' '0' '0' '0' '0' '0' O
|
|
||||||
079 ',' ',' ',' ',' ',' ',' ',' ',' O
|
|
||||||
080 '.' '.' '.' '.' '.' '.' '.' '.' O
|
|
||||||
081 meta meta meta meta meta meta meta meta O
|
|
||||||
082 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O
|
|
||||||
083 fkey12 fkey24 fkey36 fkey48 scr12 scr12 scr12 scr12 O
|
|
||||||
084 slock slock slock slock slock slock slock slock O
|
|
||||||
085 nop nop nop nop nop nop nop nop O
|
|
||||||
086 nop nop nop nop nop nop nop nop O
|
|
||||||
087 nop nop nop nop nop nop nop nop O
|
|
||||||
088 nop nop nop nop nop nop nop nop O
|
|
||||||
089 nop nop nop nop nop nop nop nop O
|
|
||||||
090 nop nop nop nop nop nop nop nop O
|
|
||||||
091 nop nop nop nop nop nop nop nop O
|
|
||||||
092 nop nop nop nop nop nop nop nop O
|
|
||||||
093 nop nop nop nop nop nop nop nop O
|
|
||||||
094 nop nop nop nop nop nop nop nop O
|
|
||||||
095 nop nop nop nop nop nop nop nop O
|
|
||||||
096 slock saver slock saver susp nop susp nop O
|
|
||||||
097 nscr nscr debug debug nop nop nop nop O
|
|
||||||
098 fkey01 fkey13 fkey25 fkey37 scr01 scr01 scr01 scr01 O
|
|
||||||
099 fkey02 fkey14 fkey26 fkey38 scr02 scr02 scr02 scr02 O
|
|
||||||
100 fkey03 fkey15 fkey27 fkey39 scr03 scr03 scr03 scr03 O
|
|
||||||
101 fkey04 fkey16 fkey28 fkey40 scr04 scr04 scr04 scr04 O
|
|
||||||
102 fkey05 fkey17 fkey29 fkey41 scr05 scr05 scr05 scr05 O
|
|
||||||
103 fkey06 fkey18 fkey30 fkey42 scr06 scr06 scr06 scr06 O
|
|
||||||
104 fkey07 fkey19 fkey31 fkey43 scr07 scr07 scr07 scr07 O
|
|
||||||
105 fkey08 fkey20 fkey32 fkey44 scr08 scr08 scr08 scr08 O
|
|
||||||
106 fkey09 fkey21 fkey33 fkey45 scr09 scr09 scr09 scr09 O
|
|
||||||
107 fkey10 fkey22 fkey34 fkey46 scr10 scr10 scr10 scr10 O
|
|
||||||
108 nop nop nop nop nop nop nop nop O
|
|
||||||
109 nop nop nop nop nop nop nop nop O
|
|
||||||
110 nop nop nop nop nop nop nop nop O
|
|
||||||
111 nop nop nop nop nop nop nop nop O
|
|
||||||
112 lshift lshift lshift lshift lshift lshift lshift lshift O
|
|
||||||
113 clock clock clock clock clock clock clock clock O
|
|
||||||
114 lalt lalt lalt lalt lalt lalt lalt lalt O
|
|
||||||
115 lalt lalt lalt lalt lalt lalt lalt lalt O
|
|
||||||
116 lctrl lctrl lctrl lctrl lctrl lctrl lctrl lctrl O
|
|
||||||
117 nop nop nop nop nop nop nop nop O
|
|
||||||
118 nop nop nop nop nop nop nop nop O
|
|
||||||
119 nop nop nop nop nop nop nop nop O
|
|
||||||
120 nop nop nop nop nop nop nop nop O
|
|
||||||
121 nop nop nop nop nop nop nop nop O
|
|
||||||
122 nop nop nop nop nop nop nop nop O
|
|
||||||
123 nop nop nop nop nop nop nop nop O
|
|
||||||
124 nop nop nop nop nop nop nop nop O
|
|
||||||
125 nop nop nop nop nop nop nop nop O
|
|
||||||
126 nop nop nop nop nop nop nop nop O
|
|
||||||
127 nop nop nop nop nop nop nop nop O
|
|
||||||
|
|
@ -8,7 +8,7 @@ CSCOPEDIRS= boot bsm cam cddl compat conf contrib crypto ddb dev fs gdb \
|
|||||||
rpc security sys ufs vm xdr xen ${CSCOPE_ARCHDIR}
|
rpc security sys ufs vm xdr xen ${CSCOPE_ARCHDIR}
|
||||||
.if !defined(CSCOPE_ARCHDIR)
|
.if !defined(CSCOPE_ARCHDIR)
|
||||||
.if defined(ALL_ARCH)
|
.if defined(ALL_ARCH)
|
||||||
CSCOPE_ARCHDIR = amd64 arm arm64 i386 mips pc98 powerpc riscv sparc64 x86
|
CSCOPE_ARCHDIR = amd64 arm arm64 i386 mips powerpc riscv sparc64 x86
|
||||||
.else
|
.else
|
||||||
CSCOPE_ARCHDIR = ${MACHINE}
|
CSCOPE_ARCHDIR = ${MACHINE}
|
||||||
.if ${MACHINE} != ${MACHINE_CPUARCH}
|
.if ${MACHINE} != ${MACHINE_CPUARCH}
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
SUBDIR+= libstand32
|
|
@ -7,8 +7,6 @@ SRCS+= module.c panic.c
|
|||||||
.if ${MACHINE} == "i386" || ${MACHINE_CPUARCH} == "amd64"
|
.if ${MACHINE} == "i386" || ${MACHINE_CPUARCH} == "amd64"
|
||||||
SRCS+= load_elf32.c load_elf32_obj.c reloc_elf32.c
|
SRCS+= load_elf32.c load_elf32_obj.c reloc_elf32.c
|
||||||
SRCS+= load_elf64.c load_elf64_obj.c reloc_elf64.c
|
SRCS+= load_elf64.c load_elf64_obj.c reloc_elf64.c
|
||||||
.elif ${MACHINE} == "pc98"
|
|
||||||
SRCS+= load_elf32.c load_elf32_obj.c reloc_elf32.c
|
|
||||||
.elif ${MACHINE_CPUARCH} == "aarch64"
|
.elif ${MACHINE_CPUARCH} == "aarch64"
|
||||||
SRCS+= load_elf64.c reloc_elf64.c
|
SRCS+= load_elf64.c reloc_elf64.c
|
||||||
.elif ${MACHINE_CPUARCH} == "arm"
|
.elif ${MACHINE_CPUARCH} == "arm"
|
||||||
|
@ -45,15 +45,9 @@
|
|||||||
|
|
||||||
/* Static ports to access PnP state machine */
|
/* Static ports to access PnP state machine */
|
||||||
#ifndef _KERNEL
|
#ifndef _KERNEL
|
||||||
#ifdef PC98
|
|
||||||
/* pnp.h is included from pnpinfo.c. */
|
|
||||||
#define _PNP_ADDRESS 0x259
|
|
||||||
#define _PNP_WRITE_DATA 0xa59
|
|
||||||
#else
|
|
||||||
#define _PNP_ADDRESS 0x279
|
#define _PNP_ADDRESS 0x279
|
||||||
#define _PNP_WRITE_DATA 0xa79
|
#define _PNP_WRITE_DATA 0xa79
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
/* PnP Registers. Write to ADDRESS and then use WRITE/READ_DATA */
|
/* PnP Registers. Write to ADDRESS and then use WRITE/READ_DATA */
|
||||||
#define SET_RD_DATA 0x00
|
#define SET_RD_DATA 0x00
|
||||||
|
@ -827,9 +827,7 @@ void ficlCompilePlatform(FICL_SYSTEM *pSys)
|
|||||||
SET_FOREACH(fnpp, Xficl_compile_set)
|
SET_FOREACH(fnpp, Xficl_compile_set)
|
||||||
(*fnpp)(pSys);
|
(*fnpp)(pSys);
|
||||||
|
|
||||||
#if defined(PC98)
|
#if defined(__i386__)
|
||||||
ficlSetEnv(pSys, "arch-pc98", FICL_TRUE);
|
|
||||||
#elif defined(__i386__)
|
|
||||||
ficlSetEnv(pSys, "arch-i386", FICL_TRUE);
|
ficlSetEnv(pSys, "arch-i386", FICL_TRUE);
|
||||||
ficlSetEnv(pSys, "arch-powerpc", FICL_FALSE);
|
ficlSetEnv(pSys, "arch-powerpc", FICL_FALSE);
|
||||||
#elif defined(__powerpc__)
|
#elif defined(__powerpc__)
|
||||||
|
@ -46,49 +46,26 @@ variable fill
|
|||||||
124 constant ascii_pipe
|
124 constant ascii_pipe
|
||||||
43 constant ascii_plus
|
43 constant ascii_plus
|
||||||
|
|
||||||
s" arch-pc98" environment? [if]
|
\ Single frames
|
||||||
\ Single frames
|
196 constant sh_el
|
||||||
149 constant sh_el
|
179 constant sv_el
|
||||||
150 constant sv_el
|
218 constant slt_el
|
||||||
152 constant slt_el
|
192 constant slb_el
|
||||||
154 constant slb_el
|
191 constant srt_el
|
||||||
153 constant srt_el
|
217 constant srb_el
|
||||||
155 constant srb_el
|
\ Double frames
|
||||||
\ Double frames
|
205 constant dh_el
|
||||||
149 constant dh_el
|
186 constant dv_el
|
||||||
150 constant dv_el
|
201 constant dlt_el
|
||||||
152 constant dlt_el
|
200 constant dlb_el
|
||||||
154 constant dlb_el
|
187 constant drt_el
|
||||||
153 constant drt_el
|
188 constant drb_el
|
||||||
155 constant drb_el
|
\ Fillings
|
||||||
\ Fillings
|
0 constant fill_none
|
||||||
0 constant fill_none
|
32 constant fill_blank
|
||||||
32 constant fill_blank
|
176 constant fill_dark
|
||||||
135 constant fill_dark
|
177 constant fill_med
|
||||||
135 constant fill_med
|
178 constant fill_bright
|
||||||
135 constant fill_bright
|
|
||||||
[else]
|
|
||||||
\ Single frames
|
|
||||||
196 constant sh_el
|
|
||||||
179 constant sv_el
|
|
||||||
218 constant slt_el
|
|
||||||
192 constant slb_el
|
|
||||||
191 constant srt_el
|
|
||||||
217 constant srb_el
|
|
||||||
\ Double frames
|
|
||||||
205 constant dh_el
|
|
||||||
186 constant dv_el
|
|
||||||
201 constant dlt_el
|
|
||||||
200 constant dlb_el
|
|
||||||
187 constant drt_el
|
|
||||||
188 constant drb_el
|
|
||||||
\ Fillings
|
|
||||||
0 constant fill_none
|
|
||||||
32 constant fill_blank
|
|
||||||
176 constant fill_dark
|
|
||||||
177 constant fill_med
|
|
||||||
178 constant fill_bright
|
|
||||||
[then]
|
|
||||||
|
|
||||||
only forth definitions also frame-drawing
|
only forth definitions also frame-drawing
|
||||||
|
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
SUBDIR= boot0 boot0.5 pc98boot btx boot2 cdboot kgzldr libpc98 loader
|
|
||||||
|
|
||||||
.include <bsd.subdir.mk>
|
|
@ -1,29 +0,0 @@
|
|||||||
# Common defines for all of /sys/boot/pc98/
|
|
||||||
#
|
|
||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
BINDIR?= /boot
|
|
||||||
|
|
||||||
LOADER_ADDRESS?=0x200000
|
|
||||||
CFLAGS+= -march=i386 -ffreestanding
|
|
||||||
CFLAGS.gcc+= -mpreferred-stack-boundary=2
|
|
||||||
CFLAGS+= ${CFLAGS_NO_SIMD} -msoft-float
|
|
||||||
CFLAGS+= -Os -DPC98
|
|
||||||
LDFLAGS+= -nostdlib
|
|
||||||
|
|
||||||
# BTX components
|
|
||||||
.if exists(${.OBJDIR}/../btx)
|
|
||||||
BTXDIR= ${.OBJDIR}/../btx
|
|
||||||
.else
|
|
||||||
BTXDIR= ${.CURDIR}/../btx
|
|
||||||
.endif
|
|
||||||
BTXLDR= ${BTXDIR}/btxldr/btxldr
|
|
||||||
BTXKERN= ${BTXDIR}/btx/btx
|
|
||||||
BTXCRT= ${BTXDIR}/lib/crt0.o
|
|
||||||
|
|
||||||
# compact binary with no padding between text, data, bss
|
|
||||||
LDSCRIPT= ${SRCTOP}/sys/boot/i386/boot.ldscript
|
|
||||||
LDFLAGS_BIN=-e start -Ttext ${ORG} -Wl,-T,${LDSCRIPT},-S,--oformat,binary
|
|
||||||
LD_FLAGS_BIN=-static -T ${LDSCRIPT} --gc-sections
|
|
||||||
|
|
||||||
.include "../Makefile.inc"
|
|
@ -1,26 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
PROG= ${BOOT}.out
|
|
||||||
INTERNALPROG=
|
|
||||||
FILES= ${BOOT}
|
|
||||||
MAN=
|
|
||||||
SRCS= start.s boot.s boot0.5.s disk.s selector.s support.s syscons.s \
|
|
||||||
putssjis.s
|
|
||||||
CLEANFILES= ${BOOT} ${BOOT}.bin
|
|
||||||
|
|
||||||
BOOT= boot0.5
|
|
||||||
|
|
||||||
# The base address that we the boot0 code to to run it. Don't change this
|
|
||||||
# unless you are glutton for punishment.
|
|
||||||
BOOT_BOOT0_ORG?= 0x0000
|
|
||||||
|
|
||||||
LDFLAGS=-e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-N,-T,${.CURDIR}/ldscript
|
|
||||||
|
|
||||||
# The size of boot0.5 must be 7168 bytes
|
|
||||||
${BOOT}: ${BOOT}.bin
|
|
||||||
cat ${BOOT}.bin /dev/zero | ${DD} of=${BOOT} bs=1 count=7168
|
|
||||||
|
|
||||||
${BOOT}.bin: ${BOOT}.out
|
|
||||||
${OBJCOPY} -S -O binary ${BOOT}.out ${.TARGET}
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
@ -1,174 +0,0 @@
|
|||||||
# 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 the segment address of the 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 $5, %cl
|
|
||||||
shl %cl, %ax # %ax = partition number * 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 # %ah = 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
|
|
@ -1,293 +0,0 @@
|
|||||||
# 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
|
|
@ -1,296 +0,0 @@
|
|||||||
# 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:
|
|
||||||
push %cx
|
|
||||||
movw %dx, %si
|
|
||||||
movb $5, %cl
|
|
||||||
shlw %cl, %si
|
|
||||||
addw %bx, %si
|
|
||||||
movb iplbuf(%si), %al
|
|
||||||
orb %al, %al
|
|
||||||
jz unused_partition
|
|
||||||
addw $iplbuf, %si
|
|
||||||
movw npartition, %ax
|
|
||||||
movw %ax, %di
|
|
||||||
movb $5, %cl
|
|
||||||
shlw %cl, %di
|
|
||||||
addw $parttable, %di
|
|
||||||
movw $32, %cx
|
|
||||||
rep
|
|
||||||
movsb
|
|
||||||
movw %ax, %di
|
|
||||||
addw $partnum, %di
|
|
||||||
movb %dl, (%di)
|
|
||||||
incw npartition
|
|
||||||
unused_partition:
|
|
||||||
incw %dx
|
|
||||||
pop %cx
|
|
||||||
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 # %dh = DA/UA
|
|
||||||
movb %dh, daua(%si) # Store DA/UA
|
|
||||||
|
|
||||||
# Try new sense command
|
|
||||||
push %ax
|
|
||||||
push %cx
|
|
||||||
movb %dh, %al
|
|
||||||
movb $0x84, %ah
|
|
||||||
int $0x1b
|
|
||||||
pop %cx
|
|
||||||
pop %ax
|
|
||||||
jc err_newsense
|
|
||||||
movw %bx, %dx
|
|
||||||
jmp found_sasi_unit
|
|
||||||
|
|
||||||
err_newsense:
|
|
||||||
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 $0x40, %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 parameter 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 defpartflag, defpartnum, npartition
|
|
||||||
defpartflag: .byte 0
|
|
||||||
defpartnum: .byte 0
|
|
||||||
npartition: .word 0 # number of partitions
|
|
||||||
|
|
||||||
.bss
|
|
||||||
.global partnum, parttable
|
|
||||||
iplbuf: .space 0x400 # Read buffer for IPL
|
|
||||||
partnum: .space 32 # Index of parttable
|
|
||||||
parttable: .space 1024 # Copy of valid partition table
|
|
@ -1,12 +0,0 @@
|
|||||||
/*
|
|
||||||
* $FreeBSD$
|
|
||||||
*/
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
.text : { *(.text) }
|
|
||||||
.data : { *(.data) }
|
|
||||||
. = 0x1243;
|
|
||||||
.putssjis : { *(.putssjis) }
|
|
||||||
.bss : { *(.bss) }
|
|
||||||
}
|
|
@ -1,137 +0,0 @@
|
|||||||
# Copyright (c) KATO Takenori, 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$
|
|
||||||
#
|
|
||||||
|
|
||||||
.code16
|
|
||||||
.section .putssjis, "awx", @progbits
|
|
||||||
|
|
||||||
#
|
|
||||||
# Display string with Shift-JIS support
|
|
||||||
# %si: address of string, %di: T-VRAM address, %cx: count
|
|
||||||
#
|
|
||||||
|
|
||||||
# Absolute address of putssjis_entry must be 0x1243.
|
|
||||||
putssjis_entry:
|
|
||||||
push %es
|
|
||||||
push %ax
|
|
||||||
# Setup the T-VRAM segement address.
|
|
||||||
xorw %ax, %ax
|
|
||||||
movw %ax, %es
|
|
||||||
movw $0xa000, %ax
|
|
||||||
testb $0x08, %es:0x501
|
|
||||||
jz normalmode
|
|
||||||
movw $0xe000, %ax
|
|
||||||
normalmode:
|
|
||||||
movw %ax, %es
|
|
||||||
|
|
||||||
putssjis_loop:
|
|
||||||
lodsw
|
|
||||||
call check_sjis
|
|
||||||
jc put_2byte_char
|
|
||||||
|
|
||||||
# 1 byte character
|
|
||||||
xorb %ah, %ah
|
|
||||||
testb $0xe0, %al # Check control code.
|
|
||||||
jnz put_1byte_char
|
|
||||||
movb $0x20, %al # Convert control code into the space.
|
|
||||||
put_1byte_char:
|
|
||||||
stosw
|
|
||||||
decw %si
|
|
||||||
jmp putssjis_loop_end
|
|
||||||
|
|
||||||
put_2byte_char:
|
|
||||||
subb $0x20, %al
|
|
||||||
|
|
||||||
# Check 2byte "hankaku"
|
|
||||||
cmp $0x09, %al
|
|
||||||
je put_2byte_hankaku
|
|
||||||
cmp $0x0a, %al
|
|
||||||
je put_2byte_hankaku
|
|
||||||
cmp $0x0b, %al
|
|
||||||
je put_2byte_hankaku
|
|
||||||
jmp put_2byte_zenkaku
|
|
||||||
|
|
||||||
put_2byte_hankaku:
|
|
||||||
stosw
|
|
||||||
jmp putssjis_loop_end
|
|
||||||
|
|
||||||
put_2byte_zenkaku:
|
|
||||||
stosw
|
|
||||||
orb $0x80, %ah
|
|
||||||
stosw
|
|
||||||
decw %cx
|
|
||||||
|
|
||||||
putssjis_loop_end:
|
|
||||||
loop putssjis_loop
|
|
||||||
|
|
||||||
pop %ax
|
|
||||||
pop %es
|
|
||||||
ret
|
|
||||||
|
|
||||||
# Check 2-byte code.
|
|
||||||
check_sjis:
|
|
||||||
cmpb $0x80, %al
|
|
||||||
jbe found_ank_kana
|
|
||||||
cmpb $0xa0, %al
|
|
||||||
jb found_2byte_char
|
|
||||||
cmpb $0xe0, %al
|
|
||||||
jb found_ank_kana
|
|
||||||
cmpb $0xf0, %al
|
|
||||||
jae found_ank_kana
|
|
||||||
jmp found_2byte_char
|
|
||||||
found_ank_kana:
|
|
||||||
clc
|
|
||||||
ret
|
|
||||||
|
|
||||||
found_2byte_char:
|
|
||||||
# Convert Shift-JIS into JIS.
|
|
||||||
cmpb $0x9f, %al
|
|
||||||
ja sjis_h_2 # Upper > 0x9f
|
|
||||||
subb $0x71, %al # Upper -= 0x71
|
|
||||||
jmp sjis_lower
|
|
||||||
sjis_h_2:
|
|
||||||
subb $0xb1, %al # Upper -= 0xb1
|
|
||||||
sjis_lower:
|
|
||||||
salb %al # Upper *= 2
|
|
||||||
incb %al # Upper += 1
|
|
||||||
|
|
||||||
cmpb $0x7f, %ah
|
|
||||||
jbe sjis_l_2
|
|
||||||
decb %ah # Lower -= 1 if lower > 0x7f
|
|
||||||
sjis_l_2:
|
|
||||||
cmpb $0x9e, %ah
|
|
||||||
jb sjis_l_3
|
|
||||||
subb $0x7d, %ah # Lower -= 0x7d
|
|
||||||
incb %al # Upper += 1
|
|
||||||
jmp check_2byte_end
|
|
||||||
sjis_l_3:
|
|
||||||
subb $0x1f, %ah # Lower -= 0x1f
|
|
||||||
check_2byte_end:
|
|
||||||
stc
|
|
||||||
ret
|
|
@ -1,450 +0,0 @@
|
|||||||
# 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$
|
|
||||||
#
|
|
||||||
|
|
||||||
.code16
|
|
||||||
|
|
||||||
.text
|
|
||||||
#
|
|
||||||
# Display partition table.
|
|
||||||
#
|
|
||||||
showpartitions:
|
|
||||||
# Clear partition 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
|
|
||||||
|
|
||||||
# XXX
|
|
||||||
.space 5, 0x90
|
|
||||||
ret # Dummy ret @0x9ab
|
|
||||||
|
|
||||||
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, curdevice # trydefault may change the curdevice.
|
|
||||||
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 " "
|
|
@ -1,73 +0,0 @@
|
|||||||
# 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 start
|
|
||||||
.code16
|
|
||||||
|
|
||||||
.text
|
|
||||||
start:
|
|
||||||
jmp start1
|
|
||||||
|
|
||||||
# Magic
|
|
||||||
.org 0x053, 0x20
|
|
||||||
.byte 0x4e, 0x45, 0x43
|
|
||||||
|
|
||||||
.org 0x8f
|
|
||||||
.byte 0x32, 0x2e, 0x37, 0x30
|
|
||||||
|
|
||||||
.org 0x2d4
|
|
||||||
start1:
|
|
||||||
# The instruction 'call 0x9ab' can be here. See also selector.s.
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
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
|
|
@ -1,94 +0,0 @@
|
|||||||
# 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 parameter 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
|
|
@ -1,253 +0,0 @@
|
|||||||
# 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
|
|
@ -1,19 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
PROG= ${BOOT}
|
|
||||||
INTERNALPROG=
|
|
||||||
FILES= ${BOOT}
|
|
||||||
MAN=
|
|
||||||
SRCS= ${BOOT}.s
|
|
||||||
CLEANFILES= ${BOOT}
|
|
||||||
|
|
||||||
BOOT= boot0
|
|
||||||
|
|
||||||
# The base address that we the boot0 code to to run it. Don't change this
|
|
||||||
# unless you are glutton for punishment.
|
|
||||||
BOOT_BOOT0_ORG?= 0x0000
|
|
||||||
ORG=${BOOT_BOOT0_ORG}
|
|
||||||
|
|
||||||
LDFLAGS=${LDFLAGS_BIN}
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
@ -1,108 +0,0 @@
|
|||||||
# 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
|
|
@ -1,116 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
.include <bsd.own.mk>
|
|
||||||
|
|
||||||
FILES= boot boot1 boot2
|
|
||||||
|
|
||||||
NM?= nm
|
|
||||||
|
|
||||||
BOOT_COMCONSOLE_PORT?= 0x238
|
|
||||||
BOOT_COMCONSOLE_SPEED?= 9600
|
|
||||||
B2SIOFMT?= 0x3
|
|
||||||
|
|
||||||
REL1= 0x700
|
|
||||||
ORG1= 0
|
|
||||||
ORG2= 0x2000
|
|
||||||
|
|
||||||
# Decide level of UFS support.
|
|
||||||
BOOT2_UFS?= UFS1_AND_UFS2
|
|
||||||
#BOOT2_UFS?= UFS2_ONLY
|
|
||||||
#BOOT2_UFS?= UFS1_ONLY
|
|
||||||
|
|
||||||
CFLAGS= -fomit-frame-pointer \
|
|
||||||
-mrtd \
|
|
||||||
-mregparm=3 \
|
|
||||||
-D${BOOT2_UFS} \
|
|
||||||
-DFLAGS=${BOOT_BOOT1_FLAGS} \
|
|
||||||
-DSIOPRT=${BOOT_COMCONSOLE_PORT} \
|
|
||||||
-DSIOFMT=${B2SIOFMT} \
|
|
||||||
-DSIOSPD=${BOOT_COMCONSOLE_SPEED} \
|
|
||||||
-I${.CURDIR}/../../.. \
|
|
||||||
-I${.CURDIR}/../../i386/boot2 \
|
|
||||||
-I${.CURDIR}/../../common \
|
|
||||||
-I${.CURDIR}/../btx/lib -I. \
|
|
||||||
-Wall -Waggregate-return -Wbad-function-cast -Wcast-align \
|
|
||||||
-Wmissing-declarations -Wmissing-prototypes -Wnested-externs \
|
|
||||||
-Wpointer-arith -Wshadow -Wstrict-prototypes -Wwrite-strings \
|
|
||||||
-Winline
|
|
||||||
|
|
||||||
CFLAGS.gcc+= -Os \
|
|
||||||
-fno-guess-branch-probability \
|
|
||||||
-fno-unit-at-a-time \
|
|
||||||
--param max-inline-insns-single=100
|
|
||||||
.if ${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} <= 40201
|
|
||||||
CFLAGS.gcc+= -mno-align-long-strings
|
|
||||||
.endif
|
|
||||||
|
|
||||||
# Set machine type to PC98_SYSTEM_PARAMETER
|
|
||||||
#CFLAGS+= -DSET_MACHINE_TYPE
|
|
||||||
|
|
||||||
# Initialize the bi_bios_geom using the BIOS geometry
|
|
||||||
#CFLAGS+= -DGET_BIOSGEOM
|
|
||||||
|
|
||||||
CFLAGS.clang+= -Oz ${CLANG_OPT_SMALL}
|
|
||||||
|
|
||||||
LD_FLAGS=${LD_FLAGS_BIN}
|
|
||||||
|
|
||||||
# Pick up ../Makefile.inc early.
|
|
||||||
.include <bsd.init.mk>
|
|
||||||
|
|
||||||
.PATH: ${.CURDIR}/../../i386/boot2
|
|
||||||
|
|
||||||
CLEANFILES= boot
|
|
||||||
|
|
||||||
boot: boot1 boot2
|
|
||||||
cat boot1 boot2 > boot
|
|
||||||
|
|
||||||
CLEANFILES+= boot1 boot1.out boot1.o
|
|
||||||
|
|
||||||
boot1: boot1.out
|
|
||||||
${OBJCOPY} -S -O binary boot1.out ${.TARGET}
|
|
||||||
|
|
||||||
boot1.out: boot1.o
|
|
||||||
${LD} ${LD_FLAGS} -e start -Ttext ${ORG1} -o ${.TARGET} boot1.o
|
|
||||||
|
|
||||||
CLEANFILES+= boot2 boot2.ld boot2.ldr boot2.bin boot2.out boot2.o \
|
|
||||||
boot2.s boot2.s.tmp boot2.h sio.o
|
|
||||||
|
|
||||||
boot2: boot2.ld
|
|
||||||
@set -- `ls -l boot2.ld`; x=$$((7680-$$5)); \
|
|
||||||
echo "$$x bytes available"; test $$x -ge 0
|
|
||||||
${DD} if=boot2.ld of=${.TARGET} obs=7680 conv=osync
|
|
||||||
|
|
||||||
boot2.ld: boot2.ldr boot2.bin ${BTXKERN}
|
|
||||||
btxld -v -E ${ORG2} -f bin -b ${BTXKERN} -l boot2.ldr \
|
|
||||||
-o ${.TARGET} -P 1 boot2.bin
|
|
||||||
|
|
||||||
boot2.ldr:
|
|
||||||
${DD} if=/dev/zero of=${.TARGET} bs=276 count=1
|
|
||||||
|
|
||||||
boot2.bin: boot2.out
|
|
||||||
${OBJCOPY} -S -O binary boot2.out ${.TARGET}
|
|
||||||
|
|
||||||
boot2.out: ${BTXCRT} boot2.o sio.o
|
|
||||||
${LD} ${LD_FLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC}
|
|
||||||
|
|
||||||
boot2.o: boot2.s
|
|
||||||
${CC} ${ACFLAGS} -c boot2.s
|
|
||||||
|
|
||||||
SRCS= boot2.c boot2.h
|
|
||||||
|
|
||||||
boot2.s: boot2.c boot2.h ${.CURDIR}/../../common/ufsread.c
|
|
||||||
${CC} ${CFLAGS} -S -o boot2.s.tmp ${.CURDIR}/boot2.c
|
|
||||||
sed -e '/align/d' -e '/nop/d' < boot2.s.tmp > boot2.s
|
|
||||||
rm -f boot2.s.tmp
|
|
||||||
|
|
||||||
boot2.h: boot1.out
|
|
||||||
${NM} -t d ${.ALLSRC} | awk '/([0-9])+ T (read|putc)/ \
|
|
||||||
{ x = $$1 - ORG1; \
|
|
||||||
printf("#define %sORG %#x\n", toupper($$3), REL1 + x) }' \
|
|
||||||
ORG1=`printf "%d" ${ORG1}` \
|
|
||||||
REL1=`printf "%d" ${REL1}` > ${.TARGET}
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
||||||
|
|
||||||
# XXX: clang integrated-as doesn't grok .codeNN directives yet
|
|
||||||
CFLAGS.boot1.S= ${CLANG_NO_IAS}
|
|
@ -1,395 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright (c) 2008-2009 TAKAHASHI Yoshihiro
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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$
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Memory Locations */
|
|
||||||
.set STACK_OFF,0x6000 # Stack offset
|
|
||||||
.set LOAD_SIZE,8192 # Load size
|
|
||||||
.set DAUA,0x0584 # DA/UA
|
|
||||||
.set MEM_REL,0x700 # Relocation address
|
|
||||||
.set MEM_ARG,0x900 # Arguments
|
|
||||||
.set MEM_BUF,0x8cec # Load area
|
|
||||||
.set MEM_BTX,0x9000 # BTX start
|
|
||||||
.set MEM_JMP,0x9010 # BTX entry point
|
|
||||||
.set MEM_USR,0xa000 # Client start
|
|
||||||
|
|
||||||
/* PC98 machine type from sys/pc98/pc98/pc98_machdep.h */
|
|
||||||
.set MEM_SYS, 0xa100 # System common area segment
|
|
||||||
.set PC98_MACHINE_TYPE, 0x0620 # PC98 machine type
|
|
||||||
.set EPSON_ID, 0x0624 # EPSON machine id
|
|
||||||
|
|
||||||
.set M_NEC_PC98, 0x0001
|
|
||||||
.set M_EPSON_PC98, 0x0002
|
|
||||||
.set M_NOT_H98, 0x0010
|
|
||||||
.set M_H98, 0x0020
|
|
||||||
.set M_NOTE, 0x0040
|
|
||||||
.set M_NORMAL, 0x1000
|
|
||||||
.set M_8M, 0x8000
|
|
||||||
|
|
||||||
/* Partition Constants */
|
|
||||||
.set PRT_OFF,0x1be # Partition offset
|
|
||||||
|
|
||||||
/* Misc. Constants */
|
|
||||||
.set SIZ_PAG,0x1000 # Page size
|
|
||||||
.set SIZ_SEC,0x200 # Sector size
|
|
||||||
|
|
||||||
.set NSECT,0x10
|
|
||||||
|
|
||||||
.globl start
|
|
||||||
.globl read
|
|
||||||
.globl putc
|
|
||||||
.code16
|
|
||||||
|
|
||||||
start: jmp main
|
|
||||||
|
|
||||||
boot_cyl: .org 4
|
|
||||||
.ascii "IPL1 "
|
|
||||||
|
|
||||||
main: cld
|
|
||||||
|
|
||||||
/* Setup the stack */
|
|
||||||
xor %si,%si
|
|
||||||
mov %si,%ss
|
|
||||||
mov $STACK_OFF,%sp
|
|
||||||
|
|
||||||
push %cx
|
|
||||||
|
|
||||||
/* Relocate ourself to MEM_REL */
|
|
||||||
push %cs
|
|
||||||
pop %ds
|
|
||||||
mov %si,%es
|
|
||||||
mov $MEM_REL,%di
|
|
||||||
mov $SIZ_SEC,%cx
|
|
||||||
rep
|
|
||||||
movsb
|
|
||||||
|
|
||||||
/* Transfer PC-9801 system common area */
|
|
||||||
xor %ax,%ax
|
|
||||||
mov %ax,%si
|
|
||||||
mov %ax,%ds
|
|
||||||
mov %ax,%di
|
|
||||||
mov $MEM_SYS,%ax
|
|
||||||
mov %ax,%es
|
|
||||||
mov $0x0600,%cx
|
|
||||||
rep
|
|
||||||
movsb
|
|
||||||
|
|
||||||
/* Transfer EPSON machine type */
|
|
||||||
mov $0xfd00,%ax
|
|
||||||
mov %ax,%ds
|
|
||||||
mov (0x804),%eax
|
|
||||||
and $0x00ffffff,%eax
|
|
||||||
mov %eax,%es:(EPSON_ID)
|
|
||||||
|
|
||||||
/* Set machine type to PC98_SYSTEM_PARAMETER */
|
|
||||||
#ifdef SET_MACHINE_TYPE
|
|
||||||
call set_machine_type
|
|
||||||
#else
|
|
||||||
mov $M_NEC_PC98+M_NOT_H98,%eax
|
|
||||||
mov %eax,%es:(PC98_MACHINE_TYPE)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Setup graphic screen */
|
|
||||||
mov $0x42,%ah /* 640x400 */
|
|
||||||
mov $0xc0,%ch
|
|
||||||
int $0x18
|
|
||||||
mov $0x40,%ah /* graph on */
|
|
||||||
int $0x18
|
|
||||||
|
|
||||||
/* Setup text screen */
|
|
||||||
mov $0x0a00,%ax /* 80x25 */
|
|
||||||
int $0x18
|
|
||||||
mov $0x0c,%ah /* text on */
|
|
||||||
int $0x18
|
|
||||||
mov $0x13,%ah /* cursor home */
|
|
||||||
xor %dx,%dx
|
|
||||||
int $0x18
|
|
||||||
mov $0x11,%ah /* cursor on */
|
|
||||||
int $0x18
|
|
||||||
|
|
||||||
/* Setup keyboard */
|
|
||||||
mov $0x03,%ah
|
|
||||||
int $0x18
|
|
||||||
|
|
||||||
pop %cx
|
|
||||||
|
|
||||||
/* bootstrap passes */
|
|
||||||
xor %edi,%edi
|
|
||||||
mov %di,%ds
|
|
||||||
mov %di,%es
|
|
||||||
mov %cs,%bx
|
|
||||||
cmp $0x1fe0,%bx
|
|
||||||
jz boot_fd
|
|
||||||
cmp $0x1fc0,%bx
|
|
||||||
jnz boot_hd
|
|
||||||
xor %cx,%cx
|
|
||||||
mov (DAUA),%al
|
|
||||||
and $0xf0,%al
|
|
||||||
cmp $0x30,%al
|
|
||||||
jz boot_fd
|
|
||||||
cmp $0x90,%al
|
|
||||||
jnz boot_hd
|
|
||||||
boot_fd: xor %cx,%cx
|
|
||||||
jmp boot_load
|
|
||||||
boot_hd: test %cx,%cx
|
|
||||||
jnz boot_load
|
|
||||||
mov %cs:(boot_cyl),%cx
|
|
||||||
boot_load: mov %cx,MEM_ARG /* Save cylinder number */
|
|
||||||
mov %cx,%di
|
|
||||||
xor %dx,%dx
|
|
||||||
mov $LOAD_SIZE,%bx
|
|
||||||
mov $MEM_BUF,%bp
|
|
||||||
push %cs
|
|
||||||
callw read
|
|
||||||
jc error
|
|
||||||
|
|
||||||
/* Transfer boot2.bin */
|
|
||||||
mov $MEM_BTX,%bx
|
|
||||||
mov 0xa(%bx),%si /* BTX size */
|
|
||||||
add %bx,%si /* start of boot2.bin */
|
|
||||||
mov $MEM_USR+SIZ_PAG*2,%di
|
|
||||||
mov $MEM_BTX+(NSECT-1)*SIZ_SEC,%cx
|
|
||||||
sub %si,%cx
|
|
||||||
rep
|
|
||||||
movsb
|
|
||||||
|
|
||||||
/* Enable A20 */
|
|
||||||
xor %ax,%ax
|
|
||||||
outb %al,$0xf2
|
|
||||||
mov $0x02,%al
|
|
||||||
outb %al,$0xf6
|
|
||||||
|
|
||||||
/* Start BTX */
|
|
||||||
ljmp $0x0000,$MEM_JMP
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Reads sectors from the disk.
|
|
||||||
* Call with:
|
|
||||||
*
|
|
||||||
* %bx - bytes to read
|
|
||||||
* %cx - cylinder
|
|
||||||
* %dh - head
|
|
||||||
* %dl - sector
|
|
||||||
* %edi - lba
|
|
||||||
* %es:(%bp) - buffer to read data into
|
|
||||||
*/
|
|
||||||
read: xor %ax,%ax
|
|
||||||
mov %ax,%ds
|
|
||||||
mov $0x06,%ah
|
|
||||||
mov (DAUA),%al
|
|
||||||
mov %ax,%si
|
|
||||||
and $0xf0,%al
|
|
||||||
cmp $0x30,%al /* 1.44MB FDD */
|
|
||||||
jz read_fd
|
|
||||||
cmp $0x90,%al /* 1MB FDD */
|
|
||||||
jz read_fd
|
|
||||||
cmp $0xa0,%al /* Is SCSI device? */
|
|
||||||
jnz read_load
|
|
||||||
push %cx
|
|
||||||
mov %si,%cx
|
|
||||||
and $0x0f,%cl
|
|
||||||
inc %cl
|
|
||||||
mov (0x482),%ah
|
|
||||||
shr %cl,%ah /* Is SCSI HDD? */
|
|
||||||
pop %cx
|
|
||||||
jc read_load
|
|
||||||
and $0xff7f,%si /* SCSI MO */
|
|
||||||
mov %di,%cx
|
|
||||||
shr $16,%edi
|
|
||||||
mov %di,%dx
|
|
||||||
jmp read_load
|
|
||||||
read_fd: or $0xd000,%si
|
|
||||||
or $0x0200,%cx
|
|
||||||
inc %dx
|
|
||||||
read_load: mov %si,%ax
|
|
||||||
int $0x1b
|
|
||||||
lret
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Print out the error message, wait for a keypress, and then reboot
|
|
||||||
* the machine.
|
|
||||||
*/
|
|
||||||
error: push %cs
|
|
||||||
pop %ds
|
|
||||||
mov $msg_eread,%si
|
|
||||||
call putstr
|
|
||||||
xor %ax,%ax /* Get keypress */
|
|
||||||
int $0x18
|
|
||||||
xor %ax,%ax /* CPU reset */
|
|
||||||
outb %al,$0xf0
|
|
||||||
halt: hlt
|
|
||||||
jmp halt /* Spin */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Display a null-terminated string.
|
|
||||||
*/
|
|
||||||
putstr.0: push %cs
|
|
||||||
callw putc
|
|
||||||
putstr: lodsb
|
|
||||||
test %al,%al
|
|
||||||
jne putstr.0
|
|
||||||
ret
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Display a single char.
|
|
||||||
*/
|
|
||||||
putc: pusha
|
|
||||||
xor %dx,%dx
|
|
||||||
mov %dx,%ds
|
|
||||||
mov MEM_REL+cursor-start,%di
|
|
||||||
mov $0xa000,%bx
|
|
||||||
mov %bx,%es
|
|
||||||
mov $(80*2),%cx
|
|
||||||
|
|
||||||
cmp $0x08,%al
|
|
||||||
je putc.bs
|
|
||||||
cmp $0x0d,%al
|
|
||||||
je putc.cr
|
|
||||||
cmp $0x0a,%al
|
|
||||||
je putc.lf
|
|
||||||
cmp $0x5c,%al /* \ */
|
|
||||||
jne 1f
|
|
||||||
mov $0xfc,%al
|
|
||||||
1: movb $0xe1,%es:0x2000(%di)
|
|
||||||
stosw
|
|
||||||
jmp putc.scr
|
|
||||||
putc.bs: test %di,%di
|
|
||||||
jz putc.move
|
|
||||||
dec %di
|
|
||||||
dec %di
|
|
||||||
movb $0xe1,%es:0x2000(%di)
|
|
||||||
movw $0x20,%es:(%di)
|
|
||||||
jmp putc.move
|
|
||||||
putc.cr: mov %di,%ax
|
|
||||||
div %cx
|
|
||||||
sub %dx,%di
|
|
||||||
jmp putc.move
|
|
||||||
putc.lf: add %cx,%di
|
|
||||||
putc.scr: cmp $(80*2*25),%di /* Scroll screen */
|
|
||||||
jb putc.move
|
|
||||||
push %ds
|
|
||||||
mov %bx,%ds
|
|
||||||
mov $(80*2),%si
|
|
||||||
xor %di,%di
|
|
||||||
mov $(80*24/2),%cx
|
|
||||||
rep
|
|
||||||
movsl
|
|
||||||
xor %ax,%ax
|
|
||||||
mov $0x20,%al
|
|
||||||
mov $80,%cl
|
|
||||||
rep
|
|
||||||
stosw
|
|
||||||
pop %ds
|
|
||||||
mov $(80*24*2),%di
|
|
||||||
putc.move: mov %di,MEM_REL+cursor-start /* Move cursor */
|
|
||||||
mov $0x13,%ah
|
|
||||||
mov %di,%dx
|
|
||||||
int $0x18
|
|
||||||
popa
|
|
||||||
lret
|
|
||||||
|
|
||||||
cursor: .word 0
|
|
||||||
|
|
||||||
#ifdef SET_MACHINE_TYPE
|
|
||||||
/*
|
|
||||||
* Set machine type to PC98_SYSTEM_PARAMETER.
|
|
||||||
*/
|
|
||||||
set_machine_type:
|
|
||||||
xor %edx,%edx
|
|
||||||
mov %dx,%ds
|
|
||||||
// mov $MEM_SYS,%ax
|
|
||||||
// mov %ax,%es
|
|
||||||
|
|
||||||
/* Wait V-SYNC */
|
|
||||||
vsync.1: inb $0x60,%al
|
|
||||||
test $0x20,%al
|
|
||||||
jnz vsync.1
|
|
||||||
vsync.2: inb $0x60,%al
|
|
||||||
test $0x20,%al
|
|
||||||
jz vsync.2
|
|
||||||
|
|
||||||
/* ANK 'A' font */
|
|
||||||
xor %al,%al
|
|
||||||
outb %al,$0xa1
|
|
||||||
mov $0x41,%al
|
|
||||||
outb %al,$0xa3
|
|
||||||
|
|
||||||
/* Get 'A' font from CG window */
|
|
||||||
push %ds
|
|
||||||
mov $0xa400,%ax
|
|
||||||
mov %ax,%ds
|
|
||||||
xor %eax,%eax
|
|
||||||
xor %bx,%bx
|
|
||||||
mov $4,%cx
|
|
||||||
font.1: add (%bx),%eax
|
|
||||||
add $4,%bx
|
|
||||||
loop font.1
|
|
||||||
pop %ds
|
|
||||||
cmp $0x6efc58fc,%eax
|
|
||||||
jnz m_epson
|
|
||||||
|
|
||||||
m_pc98: or $M_NEC_PC98,%edx
|
|
||||||
mov $0x0458,%bx
|
|
||||||
mov (%bx),%al
|
|
||||||
test $0x80,%al
|
|
||||||
jz m_not_h98
|
|
||||||
or $M_H98,%edx
|
|
||||||
jmp 1f
|
|
||||||
m_epson: or $M_EPSON_PC98,%edx
|
|
||||||
m_not_h98: or $M_NOT_H98,%edx
|
|
||||||
|
|
||||||
1: inb $0x42,%al
|
|
||||||
test $0x20,%al
|
|
||||||
jz 1f
|
|
||||||
or $M_8M,%edx
|
|
||||||
|
|
||||||
1: mov $0x0400,%bx
|
|
||||||
mov (%bx),%al
|
|
||||||
test $0x80,%al
|
|
||||||
jz 1f
|
|
||||||
or $M_NOTE,%edx
|
|
||||||
|
|
||||||
1: mov $PC98_MACHINE_TYPE,%bx
|
|
||||||
mov %edx,%es:(%bx)
|
|
||||||
ret
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Messages */
|
|
||||||
|
|
||||||
msg_eread: .asciz "Error\r\n"
|
|
||||||
|
|
||||||
.org PRT_OFF,0x90
|
|
||||||
|
|
||||||
/* Partition table */
|
|
||||||
|
|
||||||
.fill 0x30,0x1,0x0
|
|
||||||
.byte 0x80, 0x00, 0x01, 0x00
|
|
||||||
.byte 0xa5, 0xff, 0xff, 0xff
|
|
||||||
.byte 0x00, 0x00, 0x00, 0x00
|
|
||||||
.byte 0x50, 0xc3, 0x00, 0x00
|
|
||||||
|
|
||||||
.word 0xaa55 # Magic number
|
|
@ -1,803 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright (c) 2008-2009 TAKAHASHI Yoshihiro
|
|
||||||
* Copyright (c) 1998 Robert Nordier
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are freely
|
|
||||||
* permitted provided that the above copyright notice and this
|
|
||||||
* paragraph and the following disclaimer are duplicated in all
|
|
||||||
* such forms.
|
|
||||||
*
|
|
||||||
* This software is provided "AS IS" and without any express or
|
|
||||||
* implied warranties, including, without limitation, the implied
|
|
||||||
* warranties of merchantability and fitness for a particular
|
|
||||||
* purpose.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/disklabel.h>
|
|
||||||
#include <sys/diskpc98.h>
|
|
||||||
#include <sys/dirent.h>
|
|
||||||
#include <sys/reboot.h>
|
|
||||||
|
|
||||||
#include <machine/bootinfo.h>
|
|
||||||
#include <machine/cpufunc.h>
|
|
||||||
#include <machine/elf.h>
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include <a.out.h>
|
|
||||||
|
|
||||||
#include <btxv86.h>
|
|
||||||
|
|
||||||
#include "boot2.h"
|
|
||||||
#include "lib.h"
|
|
||||||
#include "paths.h"
|
|
||||||
#include "rbx.h"
|
|
||||||
|
|
||||||
/* Define to 0 to omit serial support */
|
|
||||||
#ifndef SERIAL
|
|
||||||
#define SERIAL 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define IO_KEYBOARD 1
|
|
||||||
#define IO_SERIAL 2
|
|
||||||
|
|
||||||
#if SERIAL
|
|
||||||
#define DO_KBD (ioctrl & IO_KEYBOARD)
|
|
||||||
#define DO_SIO (ioctrl & IO_SERIAL)
|
|
||||||
#else
|
|
||||||
#define DO_KBD (1)
|
|
||||||
#define DO_SIO (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SECOND 1 /* Circa that many ticks in a second. */
|
|
||||||
|
|
||||||
#define ARGS 0x900
|
|
||||||
#define NOPT 14
|
|
||||||
#define NDEV 3
|
|
||||||
|
|
||||||
#define DRV_DISK 0xf0
|
|
||||||
#define DRV_UNIT 0x0f
|
|
||||||
|
|
||||||
#define TYPE_AD 0
|
|
||||||
#define TYPE_DA 1
|
|
||||||
#define TYPE_FD 2
|
|
||||||
|
|
||||||
extern uint32_t _end;
|
|
||||||
|
|
||||||
static const char optstr[NOPT] = "DhaCcdgmnpqrsv"; /* Also 'P', 'S' */
|
|
||||||
static const unsigned char flags[NOPT] = {
|
|
||||||
RBX_DUAL,
|
|
||||||
RBX_SERIAL,
|
|
||||||
RBX_ASKNAME,
|
|
||||||
RBX_CDROM,
|
|
||||||
RBX_CONFIG,
|
|
||||||
RBX_KDB,
|
|
||||||
RBX_GDB,
|
|
||||||
RBX_MUTE,
|
|
||||||
RBX_NOINTR,
|
|
||||||
RBX_PAUSE,
|
|
||||||
RBX_QUIET,
|
|
||||||
RBX_DFLTROOT,
|
|
||||||
RBX_SINGLE,
|
|
||||||
RBX_VERBOSE
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *const dev_nm[NDEV] = {"ad", "da", "fd"};
|
|
||||||
static const unsigned char dev_maj[NDEV] = {30, 4, 2};
|
|
||||||
static const unsigned char dev_daua[NDEV] = {0x80, 0xa0, 0x90};
|
|
||||||
|
|
||||||
static struct dsk {
|
|
||||||
unsigned daua;
|
|
||||||
unsigned type;
|
|
||||||
unsigned disk;
|
|
||||||
unsigned unit;
|
|
||||||
unsigned head;
|
|
||||||
unsigned sec;
|
|
||||||
uint8_t slice;
|
|
||||||
uint8_t part;
|
|
||||||
unsigned start;
|
|
||||||
} dsk;
|
|
||||||
static char cmd[512], cmddup[512], knamebuf[1024];
|
|
||||||
static const char *kname;
|
|
||||||
uint32_t opts;
|
|
||||||
static struct bootinfo bootinfo;
|
|
||||||
#if SERIAL
|
|
||||||
static int comspeed = SIOSPD;
|
|
||||||
static uint8_t ioctrl = IO_KEYBOARD;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main(void);
|
|
||||||
void exit(int);
|
|
||||||
static void load(void);
|
|
||||||
static int parse(void);
|
|
||||||
static int dskread(void *, unsigned, unsigned);
|
|
||||||
static void printf(const char *,...);
|
|
||||||
static void putchar(int);
|
|
||||||
static int drvread(void *, unsigned);
|
|
||||||
static int keyhit(unsigned);
|
|
||||||
static int xputc(int);
|
|
||||||
static int xgetc(int);
|
|
||||||
static inline int getc(int);
|
|
||||||
|
|
||||||
static void memcpy(void *, const void *, int);
|
|
||||||
static void
|
|
||||||
memcpy(void *dst, const void *src, int len)
|
|
||||||
{
|
|
||||||
const char *s = src;
|
|
||||||
char *d = dst;
|
|
||||||
|
|
||||||
while (len--)
|
|
||||||
*d++ = *s++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
strcmp(const char *s1, const char *s2)
|
|
||||||
{
|
|
||||||
for (; *s1 == *s2 && *s1; s1++, s2++);
|
|
||||||
return (unsigned char)*s1 - (unsigned char)*s2;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define UFS_SMALL_CGBASE
|
|
||||||
#include "ufsread.c"
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
xfsread(ufs_ino_t inode, void *buf, size_t nbyte)
|
|
||||||
{
|
|
||||||
if ((size_t)fsread(inode, buf, nbyte) != nbyte) {
|
|
||||||
printf("Invalid %s\n", "format");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
getstr(void)
|
|
||||||
{
|
|
||||||
char *s;
|
|
||||||
int c;
|
|
||||||
|
|
||||||
s = cmd;
|
|
||||||
for (;;) {
|
|
||||||
switch (c = xgetc(0)) {
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case '\177':
|
|
||||||
case '\b':
|
|
||||||
if (s > cmd) {
|
|
||||||
s--;
|
|
||||||
printf("\b \b");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case '\n':
|
|
||||||
case '\r':
|
|
||||||
*s = 0;
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
if (s - cmd < sizeof(cmd) - 1)
|
|
||||||
*s++ = c;
|
|
||||||
putchar(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
putc(int c)
|
|
||||||
{
|
|
||||||
|
|
||||||
v86.ctl = V86_ADDR | V86_CALLF | V86_FLAGS;
|
|
||||||
v86.addr = PUTCORG; /* call to putc in boot1 */
|
|
||||||
v86.eax = c;
|
|
||||||
v86int();
|
|
||||||
v86.ctl = V86_FLAGS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
is_scsi_hd(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
if ((*(u_char *)PTOV(0x482) >> dsk.unit) & 0x01)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
fix_sector_size(void)
|
|
||||||
{
|
|
||||||
u_char *p;
|
|
||||||
|
|
||||||
p = (u_char *)PTOV(0x460 + dsk.unit * 4); /* SCSI equipment parameter */
|
|
||||||
|
|
||||||
if ((p[0] & 0x1f) == 7) { /* SCSI MO */
|
|
||||||
if (!(p[3] & 0x30)) { /* 256B / sector */
|
|
||||||
p[3] |= 0x10; /* forced set 512B / sector */
|
|
||||||
p[3 + 0xa1000] |= 0x10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint32_t
|
|
||||||
get_diskinfo(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (dsk.disk == 0x30) { /* 1440KB FD */
|
|
||||||
/* 80 cylinders, 2 heads, 18 sectors */
|
|
||||||
return (80 << 16) | (2 << 8) | 18;
|
|
||||||
} else if (dsk.disk == 0x90) { /* 1200KB FD */
|
|
||||||
/* 80 cylinders, 2 heads, 15 sectors */
|
|
||||||
return (80 << 16) | (2 << 8) | 15;
|
|
||||||
} else if (dsk.disk == 0x80 || is_scsi_hd()) { /* IDE or SCSI HDD */
|
|
||||||
v86.addr = 0x1b;
|
|
||||||
v86.eax = 0x8400 | dsk.daua;
|
|
||||||
v86int();
|
|
||||||
return (v86.ecx << 16) | v86.edx;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* SCSI MO or CD */
|
|
||||||
fix_sector_size(); /* SCSI MO */
|
|
||||||
|
|
||||||
/* other SCSI devices */
|
|
||||||
return (65535 << 16) | (8 << 8) | 32;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_dsk(void)
|
|
||||||
{
|
|
||||||
uint32_t di;
|
|
||||||
|
|
||||||
di = get_diskinfo();
|
|
||||||
|
|
||||||
dsk.head = (di >> 8) & 0xff;
|
|
||||||
dsk.sec = di & 0xff;
|
|
||||||
dsk.start = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef GET_BIOSGEOM
|
|
||||||
static uint32_t
|
|
||||||
bd_getbigeom(int bunit)
|
|
||||||
{
|
|
||||||
int hds = 0;
|
|
||||||
int unit = 0x80; /* IDE HDD */
|
|
||||||
u_int addr = 0x55d;
|
|
||||||
|
|
||||||
while (unit < 0xa7) {
|
|
||||||
if (*(u_char *)PTOV(addr) & (1 << (unit & 0x0f)))
|
|
||||||
if (hds++ == bunit)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (unit >= 0xA0) {
|
|
||||||
int media = ((unsigned *)PTOV(0x460))[unit & 0x0F] & 0x1F;
|
|
||||||
|
|
||||||
if (media == 7 && hds++ == bunit) /* SCSI MO */
|
|
||||||
return(0xFFFE0820); /* C:65535 H:8 S:32 */
|
|
||||||
}
|
|
||||||
if (++unit == 0x84) {
|
|
||||||
unit = 0xA0; /* SCSI HDD */
|
|
||||||
addr = 0x482;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (unit == 0xa7)
|
|
||||||
return 0x4F020F; /* 1200KB FD C:80 H:2 S:15 */
|
|
||||||
v86.addr = 0x1b;
|
|
||||||
v86.eax = 0x8400 | unit;
|
|
||||||
v86int();
|
|
||||||
if (V86_CY(v86.efl))
|
|
||||||
return 0x4F020F; /* 1200KB FD C:80 H:2 S:15 */
|
|
||||||
return ((v86.ecx & 0xffff) << 16) | (v86.edx & 0xffff);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int
|
|
||||||
check_slice(void)
|
|
||||||
{
|
|
||||||
struct pc98_partition *dp;
|
|
||||||
char *sec;
|
|
||||||
unsigned i, cyl;
|
|
||||||
|
|
||||||
sec = dmadat->secbuf;
|
|
||||||
cyl = *(uint16_t *)PTOV(ARGS);
|
|
||||||
set_dsk();
|
|
||||||
|
|
||||||
if (dsk.type == TYPE_FD)
|
|
||||||
return (WHOLE_DISK_SLICE);
|
|
||||||
if (drvread(sec, PC98_BBSECTOR))
|
|
||||||
return (WHOLE_DISK_SLICE); /* Read error */
|
|
||||||
dp = (void *)(sec + PC98_PARTOFF);
|
|
||||||
for (i = 0; i < PC98_NPARTS; i++) {
|
|
||||||
if (dp[i].dp_mid == DOSMID_386BSD) {
|
|
||||||
if (dp[i].dp_scyl <= cyl && cyl <= dp[i].dp_ecyl)
|
|
||||||
return (BASE_SLICE + i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (WHOLE_DISK_SLICE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
#ifdef GET_BIOSGEOM
|
|
||||||
int i;
|
|
||||||
#endif
|
|
||||||
uint8_t autoboot;
|
|
||||||
ufs_ino_t ino;
|
|
||||||
size_t nbyte;
|
|
||||||
|
|
||||||
dmadat = (void *)(roundup2(__base + (int32_t)&_end, 0x10000) - __base);
|
|
||||||
v86.ctl = V86_FLAGS;
|
|
||||||
v86.efl = PSL_RESERVED_DEFAULT | PSL_I;
|
|
||||||
dsk.daua = *(uint8_t *)PTOV(0x584);
|
|
||||||
dsk.disk = dsk.daua & DRV_DISK;
|
|
||||||
dsk.unit = dsk.daua & DRV_UNIT;
|
|
||||||
if (dsk.disk == 0x80)
|
|
||||||
dsk.type = TYPE_AD;
|
|
||||||
else if (dsk.disk == 0xa0)
|
|
||||||
dsk.type = TYPE_DA;
|
|
||||||
else /* if (dsk.disk == 0x30 || dsk.disk == 0x90) */
|
|
||||||
dsk.type = TYPE_FD;
|
|
||||||
dsk.slice = check_slice();
|
|
||||||
#ifdef GET_BIOSGEOM
|
|
||||||
for (i = 0; i < N_BIOS_GEOM; i++)
|
|
||||||
bootinfo.bi_bios_geom[i] = bd_getbigeom(i);
|
|
||||||
#endif
|
|
||||||
bootinfo.bi_version = BOOTINFO_VERSION;
|
|
||||||
bootinfo.bi_size = sizeof(bootinfo);
|
|
||||||
|
|
||||||
/* Process configuration file */
|
|
||||||
|
|
||||||
autoboot = 1;
|
|
||||||
|
|
||||||
if ((ino = lookup(PATH_CONFIG)) ||
|
|
||||||
(ino = lookup(PATH_DOTCONFIG))) {
|
|
||||||
nbyte = fsread(ino, cmd, sizeof(cmd) - 1);
|
|
||||||
cmd[nbyte] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*cmd) {
|
|
||||||
memcpy(cmddup, cmd, sizeof(cmd));
|
|
||||||
if (parse())
|
|
||||||
autoboot = 0;
|
|
||||||
if (!OPT_CHECK(RBX_QUIET))
|
|
||||||
printf("%s: %s", PATH_CONFIG, cmddup);
|
|
||||||
/* Do not process this command twice */
|
|
||||||
*cmd = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Try to exec stage 3 boot loader. If interrupted by a keypress,
|
|
||||||
* or in case of failure, try to load a kernel directly instead.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!kname) {
|
|
||||||
kname = PATH_LOADER;
|
|
||||||
if (autoboot && !keyhit(3*SECOND)) {
|
|
||||||
load();
|
|
||||||
kname = PATH_KERNEL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Present the user with the boot2 prompt. */
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
if (!autoboot || !OPT_CHECK(RBX_QUIET))
|
|
||||||
printf("\nFreeBSD/pc98 boot\n"
|
|
||||||
"Default: %u:%s(%u,%c)%s\n"
|
|
||||||
"boot: ",
|
|
||||||
dsk.unit, dev_nm[dsk.type], dsk.unit,
|
|
||||||
'a' + dsk.part, kname);
|
|
||||||
if (DO_SIO)
|
|
||||||
sio_flush();
|
|
||||||
if (!autoboot || keyhit(3*SECOND))
|
|
||||||
getstr();
|
|
||||||
else if (!autoboot || !OPT_CHECK(RBX_QUIET))
|
|
||||||
putchar('\n');
|
|
||||||
autoboot = 0;
|
|
||||||
if (parse())
|
|
||||||
putchar('\a');
|
|
||||||
else
|
|
||||||
load();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX - Needed for btxld to link the boot2 binary; do not remove. */
|
|
||||||
void
|
|
||||||
exit(int x)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
load(void)
|
|
||||||
{
|
|
||||||
union {
|
|
||||||
struct exec ex;
|
|
||||||
Elf32_Ehdr eh;
|
|
||||||
} hdr;
|
|
||||||
static Elf32_Phdr ep[2];
|
|
||||||
static Elf32_Shdr es[2];
|
|
||||||
caddr_t p;
|
|
||||||
ufs_ino_t ino;
|
|
||||||
uint32_t addr;
|
|
||||||
int k;
|
|
||||||
uint8_t i, j;
|
|
||||||
|
|
||||||
if (!(ino = lookup(kname))) {
|
|
||||||
if (!ls)
|
|
||||||
printf("No %s\n", kname);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (xfsread(ino, &hdr, sizeof(hdr)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (N_GETMAGIC(hdr.ex) == ZMAGIC) {
|
|
||||||
addr = hdr.ex.a_entry & 0xffffff;
|
|
||||||
p = PTOV(addr);
|
|
||||||
fs_off = PAGE_SIZE;
|
|
||||||
if (xfsread(ino, p, hdr.ex.a_text))
|
|
||||||
return;
|
|
||||||
p += roundup2(hdr.ex.a_text, PAGE_SIZE);
|
|
||||||
if (xfsread(ino, p, hdr.ex.a_data))
|
|
||||||
return;
|
|
||||||
} else if (IS_ELF(hdr.eh)) {
|
|
||||||
fs_off = hdr.eh.e_phoff;
|
|
||||||
for (j = k = 0; k < hdr.eh.e_phnum && j < 2; k++) {
|
|
||||||
if (xfsread(ino, ep + j, sizeof(ep[0])))
|
|
||||||
return;
|
|
||||||
if (ep[j].p_type == PT_LOAD)
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
for (i = 0; i < 2; i++) {
|
|
||||||
p = PTOV(ep[i].p_paddr & 0xffffff);
|
|
||||||
fs_off = ep[i].p_offset;
|
|
||||||
if (xfsread(ino, p, ep[i].p_filesz))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
p += roundup2(ep[1].p_memsz, PAGE_SIZE);
|
|
||||||
bootinfo.bi_symtab = VTOP(p);
|
|
||||||
if (hdr.eh.e_shnum == hdr.eh.e_shstrndx + 3) {
|
|
||||||
fs_off = hdr.eh.e_shoff + sizeof(es[0]) *
|
|
||||||
(hdr.eh.e_shstrndx + 1);
|
|
||||||
if (xfsread(ino, &es, sizeof(es)))
|
|
||||||
return;
|
|
||||||
for (i = 0; i < 2; i++) {
|
|
||||||
*(Elf32_Word *)p = es[i].sh_size;
|
|
||||||
p += sizeof(es[i].sh_size);
|
|
||||||
fs_off = es[i].sh_offset;
|
|
||||||
if (xfsread(ino, p, es[i].sh_size))
|
|
||||||
return;
|
|
||||||
p += es[i].sh_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
addr = hdr.eh.e_entry & 0xffffff;
|
|
||||||
bootinfo.bi_esymtab = VTOP(p);
|
|
||||||
} else {
|
|
||||||
printf("Invalid %s\n", "format");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bootinfo.bi_kernelname = VTOP(kname);
|
|
||||||
bootinfo.bi_bios_dev = dsk.daua;
|
|
||||||
__exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK),
|
|
||||||
MAKEBOOTDEV(dev_maj[dsk.type], dsk.slice, dsk.unit, dsk.part),
|
|
||||||
0, 0, 0, VTOP(&bootinfo));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
parse()
|
|
||||||
{
|
|
||||||
char *arg = cmd;
|
|
||||||
char *ep, *p, *q;
|
|
||||||
const char *cp;
|
|
||||||
unsigned int drv;
|
|
||||||
int c, i, j;
|
|
||||||
size_t k;
|
|
||||||
|
|
||||||
while ((c = *arg++)) {
|
|
||||||
if (c == ' ' || c == '\t' || c == '\n')
|
|
||||||
continue;
|
|
||||||
for (p = arg; *p && *p != '\n' && *p != ' ' && *p != '\t'; p++);
|
|
||||||
ep = p;
|
|
||||||
if (*p)
|
|
||||||
*p++ = 0;
|
|
||||||
if (c == '-') {
|
|
||||||
while ((c = *arg++)) {
|
|
||||||
if (c == 'P') {
|
|
||||||
if (*(uint8_t *)PTOV(0x481) & 0x48) {
|
|
||||||
cp = "yes";
|
|
||||||
} else {
|
|
||||||
opts |= OPT_SET(RBX_DUAL) | OPT_SET(RBX_SERIAL);
|
|
||||||
cp = "no";
|
|
||||||
}
|
|
||||||
printf("Keyboard: %s\n", cp);
|
|
||||||
continue;
|
|
||||||
#if SERIAL
|
|
||||||
} else if (c == 'S') {
|
|
||||||
j = 0;
|
|
||||||
while ((unsigned int)(i = *arg++ - '0') <= 9)
|
|
||||||
j = j * 10 + i;
|
|
||||||
if (j > 0 && i == -'0') {
|
|
||||||
comspeed = j;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Fall through to error below ('S' not in optstr[]). */
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
for (i = 0; c != optstr[i]; i++)
|
|
||||||
if (i == NOPT - 1)
|
|
||||||
return -1;
|
|
||||||
opts ^= OPT_SET(flags[i]);
|
|
||||||
}
|
|
||||||
#if SERIAL
|
|
||||||
ioctrl = OPT_CHECK(RBX_DUAL) ? (IO_SERIAL|IO_KEYBOARD) :
|
|
||||||
OPT_CHECK(RBX_SERIAL) ? IO_SERIAL : IO_KEYBOARD;
|
|
||||||
if (DO_SIO) {
|
|
||||||
if (sio_init(115200 / comspeed) != 0)
|
|
||||||
ioctrl &= ~IO_SERIAL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
for (q = arg--; *q && *q != '('; q++);
|
|
||||||
if (*q) {
|
|
||||||
drv = -1;
|
|
||||||
if (arg[1] == ':') {
|
|
||||||
drv = *arg - '0';
|
|
||||||
if (drv > 9)
|
|
||||||
return (-1);
|
|
||||||
arg += 2;
|
|
||||||
}
|
|
||||||
if (q - arg != 2)
|
|
||||||
return -1;
|
|
||||||
for (i = 0; arg[0] != dev_nm[i][0] ||
|
|
||||||
arg[1] != dev_nm[i][1]; i++)
|
|
||||||
if (i == NDEV - 1)
|
|
||||||
return -1;
|
|
||||||
dsk.type = i;
|
|
||||||
arg += 3;
|
|
||||||
dsk.unit = *arg - '0';
|
|
||||||
if (arg[1] != ',' || dsk.unit > 9)
|
|
||||||
return -1;
|
|
||||||
arg += 2;
|
|
||||||
dsk.slice = WHOLE_DISK_SLICE;
|
|
||||||
if (arg[1] == ',') {
|
|
||||||
dsk.slice = *arg - '0' + 1;
|
|
||||||
if (dsk.slice > PC98_NPARTS + 1)
|
|
||||||
return -1;
|
|
||||||
arg += 2;
|
|
||||||
}
|
|
||||||
if (arg[1] != ')')
|
|
||||||
return -1;
|
|
||||||
dsk.part = *arg - 'a';
|
|
||||||
if (dsk.part > 7)
|
|
||||||
return (-1);
|
|
||||||
arg += 2;
|
|
||||||
if (drv == -1)
|
|
||||||
drv = dsk.unit;
|
|
||||||
dsk.disk = dev_daua[dsk.type];
|
|
||||||
dsk.daua = dsk.disk | dsk.unit;
|
|
||||||
dsk_meta = 0;
|
|
||||||
}
|
|
||||||
k = ep - arg;
|
|
||||||
if (k > 0) {
|
|
||||||
if (k >= sizeof(knamebuf))
|
|
||||||
return -1;
|
|
||||||
memcpy(knamebuf, arg, k + 1);
|
|
||||||
kname = knamebuf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
arg = p;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
dskread(void *buf, unsigned lba, unsigned nblk)
|
|
||||||
{
|
|
||||||
struct pc98_partition *dp;
|
|
||||||
struct disklabel *d;
|
|
||||||
char *sec;
|
|
||||||
unsigned i;
|
|
||||||
uint8_t sl;
|
|
||||||
u_char *p;
|
|
||||||
const char *reason;
|
|
||||||
|
|
||||||
if (!dsk_meta) {
|
|
||||||
sec = dmadat->secbuf;
|
|
||||||
set_dsk();
|
|
||||||
if (dsk.type == TYPE_FD)
|
|
||||||
goto unsliced;
|
|
||||||
if (drvread(sec, PC98_BBSECTOR))
|
|
||||||
return -1;
|
|
||||||
dp = (void *)(sec + PC98_PARTOFF);
|
|
||||||
sl = dsk.slice;
|
|
||||||
if (sl < BASE_SLICE) {
|
|
||||||
for (i = 0; i < PC98_NPARTS; i++)
|
|
||||||
if (dp[i].dp_mid == DOSMID_386BSD) {
|
|
||||||
sl = BASE_SLICE + i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
dsk.slice = sl;
|
|
||||||
}
|
|
||||||
if (sl != WHOLE_DISK_SLICE) {
|
|
||||||
dp += sl - BASE_SLICE;
|
|
||||||
if (dp->dp_mid != DOSMID_386BSD) {
|
|
||||||
reason = "slice";
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
dsk.start = dp->dp_scyl * dsk.head * dsk.sec +
|
|
||||||
dp->dp_shd * dsk.sec + dp->dp_ssect;
|
|
||||||
}
|
|
||||||
if (drvread(sec, dsk.start + LABELSECTOR))
|
|
||||||
return -1;
|
|
||||||
d = (void *)(sec + LABELOFFSET);
|
|
||||||
if (d->d_magic != DISKMAGIC || d->d_magic2 != DISKMAGIC) {
|
|
||||||
if (dsk.part != RAW_PART) {
|
|
||||||
reason = "label";
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (dsk.part >= d->d_npartitions ||
|
|
||||||
!d->d_partitions[dsk.part].p_size) {
|
|
||||||
reason = "partition";
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
dsk.start += d->d_partitions[dsk.part].p_offset;
|
|
||||||
dsk.start -= d->d_partitions[RAW_PART].p_offset;
|
|
||||||
}
|
|
||||||
unsliced: ;
|
|
||||||
}
|
|
||||||
for (p = buf; nblk; p += 512, lba++, nblk--) {
|
|
||||||
if ((i = drvread(p, dsk.start + lba)))
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
error:
|
|
||||||
printf("Invalid %s\n", reason);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
printf(const char *fmt,...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
static char buf[10];
|
|
||||||
char *s;
|
|
||||||
unsigned u;
|
|
||||||
int c;
|
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
while ((c = *fmt++)) {
|
|
||||||
if (c == '%') {
|
|
||||||
c = *fmt++;
|
|
||||||
switch (c) {
|
|
||||||
case 'c':
|
|
||||||
putchar(va_arg(ap, int));
|
|
||||||
continue;
|
|
||||||
case 's':
|
|
||||||
for (s = va_arg(ap, char *); *s; s++)
|
|
||||||
putchar(*s);
|
|
||||||
continue;
|
|
||||||
case 'u':
|
|
||||||
u = va_arg(ap, unsigned);
|
|
||||||
s = buf;
|
|
||||||
do
|
|
||||||
*s++ = '0' + u % 10U;
|
|
||||||
while (u /= 10U);
|
|
||||||
while (--s >= buf)
|
|
||||||
putchar(*s);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
putchar(c);
|
|
||||||
}
|
|
||||||
va_end(ap);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
putchar(int c)
|
|
||||||
{
|
|
||||||
if (c == '\n')
|
|
||||||
xputc('\r');
|
|
||||||
xputc(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
drvread(void *buf, unsigned lba)
|
|
||||||
{
|
|
||||||
static unsigned c = 0x2d5c7c2f;
|
|
||||||
unsigned bpc, x, cyl, head, sec;
|
|
||||||
|
|
||||||
bpc = dsk.sec * dsk.head;
|
|
||||||
cyl = lba / bpc;
|
|
||||||
x = lba % bpc;
|
|
||||||
head = x / dsk.sec;
|
|
||||||
sec = x % dsk.sec;
|
|
||||||
|
|
||||||
if (!OPT_CHECK(RBX_QUIET)) {
|
|
||||||
xputc(c = c << 8 | c >> 24);
|
|
||||||
xputc('\b');
|
|
||||||
}
|
|
||||||
v86.ctl = V86_ADDR | V86_CALLF | V86_FLAGS;
|
|
||||||
v86.addr = READORG; /* call to read in boot1 */
|
|
||||||
v86.ecx = cyl;
|
|
||||||
v86.edx = (head << 8) | sec;
|
|
||||||
v86.edi = lba;
|
|
||||||
v86.ebx = 512;
|
|
||||||
v86.es = VTOPSEG(buf);
|
|
||||||
v86.ebp = VTOPOFF(buf);
|
|
||||||
v86int();
|
|
||||||
v86.ctl = V86_FLAGS;
|
|
||||||
if (V86_CY(v86.efl)) {
|
|
||||||
printf("error %u c/h/s %u/%u/%u lba %u\n", v86.eax >> 8 & 0xff,
|
|
||||||
cyl, head, sec, lba);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
delay(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
i = 800;
|
|
||||||
do {
|
|
||||||
outb(0x5f, 0); /* about 600ns */
|
|
||||||
} while (--i >= 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
keyhit(unsigned sec)
|
|
||||||
{
|
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
if (OPT_CHECK(RBX_NOINTR))
|
|
||||||
return 0;
|
|
||||||
for (i = 0; i < sec * 1000; i++) {
|
|
||||||
if (xgetc(1))
|
|
||||||
return 1;
|
|
||||||
delay();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
xputc(int c)
|
|
||||||
{
|
|
||||||
if (DO_KBD)
|
|
||||||
putc(c);
|
|
||||||
if (DO_SIO)
|
|
||||||
sio_putc(c);
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
getc(int fn)
|
|
||||||
{
|
|
||||||
v86.addr = 0x18;
|
|
||||||
v86.eax = fn << 8;
|
|
||||||
v86int();
|
|
||||||
if (fn)
|
|
||||||
return (v86.ebx >> 8) & 0x01;
|
|
||||||
else
|
|
||||||
return v86.eax & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
xgetc(int fn)
|
|
||||||
{
|
|
||||||
if (OPT_CHECK(RBX_NOINTR))
|
|
||||||
return 0;
|
|
||||||
for (;;) {
|
|
||||||
if (DO_KBD && getc(1))
|
|
||||||
return fn ? 1 : getc(0);
|
|
||||||
if (DO_SIO && sio_ischar())
|
|
||||||
return fn ? 1 : sio_getc();
|
|
||||||
if (fn)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
SUBDIR= btx btxldr lib
|
|
||||||
|
|
||||||
.include <bsd.subdir.mk>
|
|
@ -1,3 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
.include "../Makefile.inc"
|
|
@ -1,33 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
PROG= btx
|
|
||||||
INTERNALPROG=
|
|
||||||
MAN=
|
|
||||||
SRCS= btx.S
|
|
||||||
|
|
||||||
.if defined(BOOT_BTX_NOHANG)
|
|
||||||
BOOT_BTX_FLAGS=0x1
|
|
||||||
.else
|
|
||||||
BOOT_BTX_FLAGS=0x0
|
|
||||||
.endif
|
|
||||||
|
|
||||||
CFLAGS+=-DBTX_FLAGS=${BOOT_BTX_FLAGS}
|
|
||||||
CFLAGS+=-I${.CURDIR}/../../../i386/common
|
|
||||||
|
|
||||||
.if defined(BTX_SERIAL)
|
|
||||||
BOOT_COMCONSOLE_PORT?= 0x238
|
|
||||||
BOOT_COMCONSOLE_SPEED?= 9600
|
|
||||||
B2SIOFMT?= 0x3
|
|
||||||
|
|
||||||
CFLAGS+=-DBTX_SERIAL -DSIOPRT=${BOOT_COMCONSOLE_PORT} \
|
|
||||||
-DSIOFMT=${B2SIOFMT} -DSIOSPD=${BOOT_COMCONSOLE_SPEED}
|
|
||||||
.endif
|
|
||||||
|
|
||||||
ORG= 0x9000
|
|
||||||
|
|
||||||
LDFLAGS=${LDFLAGS_BIN}
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
||||||
|
|
||||||
# XXX: clang integrated-as doesn't grok .codeNN directives yet
|
|
||||||
CFLAGS.btx.S= ${CLANG_NO_IAS}
|
|
File diff suppressed because it is too large
Load Diff
@ -1,21 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
PROG= btxldr
|
|
||||||
INTERNALPROG=
|
|
||||||
MAN=
|
|
||||||
SRCS= btxldr.S
|
|
||||||
|
|
||||||
CFLAGS+=-DLOADER_ADDRESS=${LOADER_ADDRESS}
|
|
||||||
CFLAGS+=-I${.CURDIR}/../../../i386/common
|
|
||||||
|
|
||||||
.if defined(BTXLDR_VERBOSE)
|
|
||||||
CFLAGS+=-DBTXLDR_VERBOSE
|
|
||||||
.endif
|
|
||||||
|
|
||||||
ORG=${LOADER_ADDRESS}
|
|
||||||
LDFLAGS=${LDFLAGS_BIN}
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
||||||
|
|
||||||
# XXX: clang integrated-as doesn't grok .codeNN directives yet
|
|
||||||
CFLAGS.btxldr.S= ${CLANG_NO_IAS}
|
|
@ -1,430 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1998 Robert Nordier
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are freely
|
|
||||||
* permitted provided that the above copyright notice and this
|
|
||||||
* paragraph and the following disclaimer are duplicated in all
|
|
||||||
* such forms.
|
|
||||||
*
|
|
||||||
* This software is provided "AS IS" and without any express or
|
|
||||||
* implied warranties, including, without limitation, the implied
|
|
||||||
* warranties of merchantability and fitness for a particular
|
|
||||||
* purpose.
|
|
||||||
*
|
|
||||||
* $FreeBSD$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <bootargs.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Prototype BTX loader program, written in a couple of hours. The
|
|
||||||
* real thing should probably be more flexible, and in C.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Memory locations.
|
|
||||||
*/
|
|
||||||
.set MEM_STUB,0x600 # Real mode stub
|
|
||||||
.set MEM_ESP,0x1000 # New stack pointer
|
|
||||||
.set MEM_TBL,0x5000 # BTX page tables
|
|
||||||
.set MEM_ENTRY,0x9010 # BTX entry point
|
|
||||||
.set MEM_DATA,start+0x1000 # Data segment
|
|
||||||
/*
|
|
||||||
* Segment selectors.
|
|
||||||
*/
|
|
||||||
.set SEL_SCODE,0x8 # 4GB code
|
|
||||||
.set SEL_SDATA,0x10 # 4GB data
|
|
||||||
.set SEL_RCODE,0x18 # 64K code
|
|
||||||
.set SEL_RDATA,0x20 # 64K data
|
|
||||||
/*
|
|
||||||
* Paging constants.
|
|
||||||
*/
|
|
||||||
.set PAG_SIZ,0x1000 # Page size
|
|
||||||
.set PAG_ENT,0x4 # Page entry size
|
|
||||||
/*
|
|
||||||
* Screen constants.
|
|
||||||
*/
|
|
||||||
.set SCR_MAT,0xe1 # Mode/attribute
|
|
||||||
.set SCR_COL,0x50 # Columns per row
|
|
||||||
.set SCR_ROW,0x19 # Rows per screen
|
|
||||||
/*
|
|
||||||
* BIOS Data Area locations.
|
|
||||||
*/
|
|
||||||
.set BDA_MEM,0xa1501 # Free memory
|
|
||||||
.set BDA_POS,0xa153e # Cursor position
|
|
||||||
/*
|
|
||||||
* Required by aout gas inadequacy.
|
|
||||||
*/
|
|
||||||
.set SIZ_STUB,0x1a # Size of stub
|
|
||||||
/*
|
|
||||||
* We expect to be loaded by boot2 at the origin defined in ./Makefile.
|
|
||||||
*/
|
|
||||||
.globl start
|
|
||||||
/*
|
|
||||||
* BTX program loader for ELF clients.
|
|
||||||
*/
|
|
||||||
start: cld # String ops inc
|
|
||||||
cli
|
|
||||||
gdcwait.1: inb $0x60,%al
|
|
||||||
testb $0x04,%al
|
|
||||||
jz gdcwait.1
|
|
||||||
movb $0xe0,%al
|
|
||||||
outb %al,$0x62
|
|
||||||
nop
|
|
||||||
gdcwait.2: inb $0x60,%al
|
|
||||||
testb $0x01,%al
|
|
||||||
jz gdcwait.2
|
|
||||||
inb $0x62,%al
|
|
||||||
movb %al,%dl
|
|
||||||
inb $0x62,%al
|
|
||||||
movb %al,%dh
|
|
||||||
inb $0x62,%al
|
|
||||||
inb $0x62,%al
|
|
||||||
inb $0x62,%al
|
|
||||||
shlw $1,%dx
|
|
||||||
movl $BDA_POS,%ebx
|
|
||||||
movw %dx,(%ebx)
|
|
||||||
movl $m_logo,%esi # Identify
|
|
||||||
call putstr # ourselves
|
|
||||||
movzwl BDA_MEM,%eax # Get base memory
|
|
||||||
andl $0x7,%eax
|
|
||||||
incl %eax
|
|
||||||
shll $0x11,%eax # in bytes
|
|
||||||
movl %eax,%ebp # Base of user stack
|
|
||||||
#ifdef BTXLDR_VERBOSE
|
|
||||||
movl $m_mem,%esi # Display
|
|
||||||
call hexout # amount of
|
|
||||||
call putstr # base memory
|
|
||||||
#endif
|
|
||||||
lgdt gdtdesc # Load new GDT
|
|
||||||
/*
|
|
||||||
* Relocate caller's arguments.
|
|
||||||
*/
|
|
||||||
#ifdef BTXLDR_VERBOSE
|
|
||||||
movl $m_esp,%esi # Display
|
|
||||||
movl %esp,%eax # caller
|
|
||||||
call hexout # stack
|
|
||||||
call putstr # pointer
|
|
||||||
movl $m_args,%esi # Format string
|
|
||||||
leal 0x4(%esp),%ebx # First argument
|
|
||||||
movl $0x6,%ecx # Count
|
|
||||||
start.1: movl (%ebx),%eax # Get argument and
|
|
||||||
addl $0x4,%ebx # bump pointer
|
|
||||||
call hexout # Display it
|
|
||||||
loop start.1 # Till done
|
|
||||||
call putstr # End message
|
|
||||||
#endif
|
|
||||||
movl BA_BOOTINFO+4(%esp),%esi # Source: bootinfo
|
|
||||||
cmpl $0x0, %esi # If the bootinfo pointer
|
|
||||||
je start_null_bi # is null, don't copy it
|
|
||||||
movl BI_SIZE(%esi),%ecx # Allocate space
|
|
||||||
subl %ecx,%ebp # for bootinfo
|
|
||||||
movl %ebp,%edi # Destination
|
|
||||||
rep # Copy
|
|
||||||
movsb # it
|
|
||||||
movl %ebp,BA_BOOTINFO+4(%esp) # Update pointer
|
|
||||||
movl %edi,%ebp # Restore base pointer
|
|
||||||
#ifdef BTXLDR_VERBOSE
|
|
||||||
movl $m_rel_bi,%esi # Display
|
|
||||||
movl %ebp,%eax # bootinfo
|
|
||||||
call hexout # relocation
|
|
||||||
call putstr # message
|
|
||||||
#endif
|
|
||||||
start_null_bi: movl $BOOTARGS_SIZE,%ecx # Fixed size of arguments
|
|
||||||
testl $KARGS_FLAGS_EXTARG, BA_BOOTFLAGS+4(%esp) # Check for extra data
|
|
||||||
jz start_fixed # Skip if the flag is not set
|
|
||||||
addl BOOTARGS_SIZE+4(%esp),%ecx # Add size of variable args
|
|
||||||
start_fixed: subl $ARGOFF,%ebp # Place args at fixed offset
|
|
||||||
leal 0x4(%esp),%esi # Source
|
|
||||||
movl %ebp,%edi # Destination
|
|
||||||
rep # Copy
|
|
||||||
movsb # them
|
|
||||||
#ifdef BTXLDR_VERBOSE
|
|
||||||
movl $m_rel_args,%esi # Display
|
|
||||||
movl %ebp,%eax # argument
|
|
||||||
call hexout # relocation
|
|
||||||
call putstr # message
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Set up BTX kernel.
|
|
||||||
*/
|
|
||||||
movl $MEM_ESP,%esp # Set up new stack
|
|
||||||
movl $MEM_DATA,%ebx # Data segment
|
|
||||||
movl $m_vers,%esi # Display BTX
|
|
||||||
call putstr # version message
|
|
||||||
movb 0x5(%ebx),%al # Get major version
|
|
||||||
addb $'0',%al # Display
|
|
||||||
call putchr # it
|
|
||||||
movb $'.',%al # And a
|
|
||||||
call putchr # dot
|
|
||||||
movb 0x6(%ebx),%al # Get minor
|
|
||||||
xorb %ah,%ah # version
|
|
||||||
movb $0xa,%dl # Divide
|
|
||||||
divb %dl,%al # by 10
|
|
||||||
addb $'0',%al # Display
|
|
||||||
call putchr # tens
|
|
||||||
movb %ah,%al # Get units
|
|
||||||
addb $'0',%al # Display
|
|
||||||
call putchr # units
|
|
||||||
call putstr # End message
|
|
||||||
movl %ebx,%esi # BTX image
|
|
||||||
movzwl 0x8(%ebx),%edi # Compute
|
|
||||||
orl $PAG_SIZ/PAG_ENT-1,%edi # the
|
|
||||||
incl %edi # BTX
|
|
||||||
shll $0x2,%edi # load
|
|
||||||
addl $MEM_TBL,%edi # address
|
|
||||||
pushl %edi # Save load address
|
|
||||||
movzwl 0xa(%ebx),%ecx # Image size
|
|
||||||
#ifdef BTXLDR_VERBOSE
|
|
||||||
pushl %ecx # Save image size
|
|
||||||
#endif
|
|
||||||
rep # Relocate
|
|
||||||
movsb # BTX
|
|
||||||
movl %esi,%ebx # Keep place
|
|
||||||
#ifdef BTXLDR_VERBOSE
|
|
||||||
movl $m_rel_btx,%esi # Restore
|
|
||||||
popl %eax # parameters
|
|
||||||
call hexout # and
|
|
||||||
#endif
|
|
||||||
popl %ebp # display
|
|
||||||
#ifdef BTXLDR_VERBOSE
|
|
||||||
movl %ebp,%eax # the
|
|
||||||
call hexout # relocation
|
|
||||||
call putstr # message
|
|
||||||
#endif
|
|
||||||
addl $PAG_SIZ,%ebp # Display
|
|
||||||
#ifdef BTXLDR_VERBOSE
|
|
||||||
movl $m_base,%esi # the
|
|
||||||
movl %ebp,%eax # user
|
|
||||||
call hexout # base
|
|
||||||
call putstr # address
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Set up ELF-format client program.
|
|
||||||
*/
|
|
||||||
cmpl $0x464c457f,(%ebx) # ELF magic number?
|
|
||||||
je start.3 # Yes
|
|
||||||
movl $e_fmt,%esi # Display error
|
|
||||||
call putstr # message
|
|
||||||
start.2: jmp start.2 # Hang
|
|
||||||
start.3:
|
|
||||||
#ifdef BTXLDR_VERBOSE
|
|
||||||
movl $m_elf,%esi # Display ELF
|
|
||||||
call putstr # message
|
|
||||||
movl $m_segs,%esi # Format string
|
|
||||||
#endif
|
|
||||||
movl $0x2,%edi # Segment count
|
|
||||||
movl 0x1c(%ebx),%edx # Get e_phoff
|
|
||||||
addl %ebx,%edx # To pointer
|
|
||||||
movzwl 0x2c(%ebx),%ecx # Get e_phnum
|
|
||||||
start.4: cmpl $0x1,(%edx) # Is p_type PT_LOAD?
|
|
||||||
jne start.6 # No
|
|
||||||
#ifdef BTXLDR_VERBOSE
|
|
||||||
movl 0x4(%edx),%eax # Display
|
|
||||||
call hexout # p_offset
|
|
||||||
movl 0x8(%edx),%eax # Display
|
|
||||||
call hexout # p_vaddr
|
|
||||||
movl 0x10(%edx),%eax # Display
|
|
||||||
call hexout # p_filesz
|
|
||||||
movl 0x14(%edx),%eax # Display
|
|
||||||
call hexout # p_memsz
|
|
||||||
call putstr # End message
|
|
||||||
#endif
|
|
||||||
pushl %esi # Save
|
|
||||||
pushl %edi # working
|
|
||||||
pushl %ecx # registers
|
|
||||||
movl 0x4(%edx),%esi # Get p_offset
|
|
||||||
addl %ebx,%esi # as pointer
|
|
||||||
movl 0x8(%edx),%edi # Get p_vaddr
|
|
||||||
addl %ebp,%edi # as pointer
|
|
||||||
movl 0x10(%edx),%ecx # Get p_filesz
|
|
||||||
rep # Set up
|
|
||||||
movsb # segment
|
|
||||||
movl 0x14(%edx),%ecx # Any bytes
|
|
||||||
subl 0x10(%edx),%ecx # to zero?
|
|
||||||
jz start.5 # No
|
|
||||||
xorb %al,%al # Then
|
|
||||||
rep # zero
|
|
||||||
stosb # them
|
|
||||||
start.5: popl %ecx # Restore
|
|
||||||
popl %edi # working
|
|
||||||
popl %esi # registers
|
|
||||||
decl %edi # Segments to do
|
|
||||||
je start.7 # If none
|
|
||||||
start.6: addl $0x20,%edx # To next entry
|
|
||||||
loop start.4 # Till done
|
|
||||||
start.7:
|
|
||||||
#ifdef BTXLDR_VERBOSE
|
|
||||||
movl $m_done,%esi # Display done
|
|
||||||
call putstr # message
|
|
||||||
#endif
|
|
||||||
movl $start.8,%esi # Real mode stub
|
|
||||||
movl $MEM_STUB,%edi # Destination
|
|
||||||
movl $start.9-start.8,%ecx # Size
|
|
||||||
rep # Relocate
|
|
||||||
movsb # it
|
|
||||||
ljmp $SEL_RCODE,$MEM_STUB # To 16-bit code
|
|
||||||
.code16
|
|
||||||
start.8: xorw %ax,%ax # Data
|
|
||||||
movb $SEL_RDATA,%al # selector
|
|
||||||
movw %ax,%ss # Reload SS
|
|
||||||
movw %ax,%ds # Reset
|
|
||||||
movw %ax,%es # other
|
|
||||||
movw %ax,%fs # segment
|
|
||||||
movw %ax,%gs # limits
|
|
||||||
movl %cr0,%eax # Switch to
|
|
||||||
decw %ax # real
|
|
||||||
movl %eax,%cr0 # mode
|
|
||||||
ljmp $0,$MEM_ENTRY # Jump to BTX entry point
|
|
||||||
start.9:
|
|
||||||
.code32
|
|
||||||
/*
|
|
||||||
* Output message [ESI] followed by EAX in hex.
|
|
||||||
*/
|
|
||||||
hexout: pushl %eax # Save
|
|
||||||
call putstr # Display message
|
|
||||||
popl %eax # Restore
|
|
||||||
pushl %esi # Save
|
|
||||||
pushl %edi # caller's
|
|
||||||
movl $buf,%edi # Buffer
|
|
||||||
pushl %edi # Save
|
|
||||||
call hex32 # To hex
|
|
||||||
xorb %al,%al # Terminate
|
|
||||||
stosb # string
|
|
||||||
popl %esi # Restore
|
|
||||||
hexout.1: lodsb # Get a char
|
|
||||||
cmpb $'0',%al # Leading zero?
|
|
||||||
je hexout.1 # Yes
|
|
||||||
testb %al,%al # End of string?
|
|
||||||
jne hexout.2 # No
|
|
||||||
decl %esi # Undo
|
|
||||||
hexout.2: decl %esi # Adjust for inc
|
|
||||||
call putstr # Display hex
|
|
||||||
popl %edi # Restore
|
|
||||||
popl %esi # caller's
|
|
||||||
ret # To caller
|
|
||||||
/*
|
|
||||||
* Output zero-terminated string [ESI] to the console.
|
|
||||||
*/
|
|
||||||
putstr.0: call putchr # Output char
|
|
||||||
putstr: lodsb # Load char
|
|
||||||
testb %al,%al # End of string?
|
|
||||||
jne putstr.0 # No
|
|
||||||
ret # To caller
|
|
||||||
/*
|
|
||||||
* Output character AL to the console.
|
|
||||||
*/
|
|
||||||
putchr: pusha # Save
|
|
||||||
xorl %ecx,%ecx # Zero for loops
|
|
||||||
movb $SCR_MAT,%ah # Mode/attribute
|
|
||||||
movl $BDA_POS,%ebx # BDA pointer
|
|
||||||
movw (%ebx),%dx # Cursor position
|
|
||||||
movl $0xa0000,%edi # Regen buffer (color)
|
|
||||||
putchr.1: cmpb $0xa,%al # New line?
|
|
||||||
je putchr.2 # Yes
|
|
||||||
movw %dx,%cx
|
|
||||||
movb %al,(%edi,%ecx,1) # Write char
|
|
||||||
addl $0x2000,%ecx
|
|
||||||
movb %ah,(%edi,%ecx,1) # Write attr
|
|
||||||
addw $0x2,%dx
|
|
||||||
jmp putchr.3
|
|
||||||
putchr.2: movw %dx,%ax
|
|
||||||
movb $SCR_COL*2,%dl
|
|
||||||
div %dl
|
|
||||||
incb %al
|
|
||||||
mul %dl
|
|
||||||
movw %ax,%dx
|
|
||||||
putchr.3: cmpw $SCR_COL*SCR_ROW*2,%dx
|
|
||||||
jb putchr.4 # No
|
|
||||||
leal 2*SCR_COL(%edi),%esi # New top line
|
|
||||||
movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move
|
|
||||||
rep # Scroll
|
|
||||||
movsl # screen
|
|
||||||
movb $' ',%al # Space
|
|
||||||
xorb %ah,%ah
|
|
||||||
movb $SCR_COL,%cl # Columns to clear
|
|
||||||
rep # Clear
|
|
||||||
stosw # line
|
|
||||||
movw $(SCR_ROW-1)*SCR_COL*2,%dx
|
|
||||||
putchr.4: movw %dx,(%ebx) # Update position
|
|
||||||
shrw $1,%dx
|
|
||||||
gdcwait.3: inb $0x60,%al
|
|
||||||
testb $0x04,%al
|
|
||||||
jz gdcwait.3
|
|
||||||
movb $0x49,%al
|
|
||||||
outb %al,$0x62
|
|
||||||
movb %dl,%al
|
|
||||||
outb %al,$0x60
|
|
||||||
movb %dh,%al
|
|
||||||
outb %al,$0x60
|
|
||||||
popa # Restore
|
|
||||||
ret # To caller
|
|
||||||
/*
|
|
||||||
* Convert EAX, AX, or AL to hex, saving the result to [EDI].
|
|
||||||
*/
|
|
||||||
hex32: pushl %eax # Save
|
|
||||||
shrl $0x10,%eax # Do upper
|
|
||||||
call hex16 # 16
|
|
||||||
popl %eax # Restore
|
|
||||||
hex16: call hex16.1 # Do upper 8
|
|
||||||
hex16.1: xchgb %ah,%al # Save/restore
|
|
||||||
hex8: pushl %eax # Save
|
|
||||||
shrb $0x4,%al # Do upper
|
|
||||||
call hex8.1 # 4
|
|
||||||
popl %eax # Restore
|
|
||||||
hex8.1: andb $0xf,%al # Get lower 4
|
|
||||||
cmpb $0xa,%al # Convert
|
|
||||||
sbbb $0x69,%al # to hex
|
|
||||||
das # digit
|
|
||||||
orb $0x20,%al # To lower case
|
|
||||||
stosb # Save char
|
|
||||||
ret # (Recursive)
|
|
||||||
|
|
||||||
.data
|
|
||||||
.p2align 4
|
|
||||||
/*
|
|
||||||
* Global descriptor table.
|
|
||||||
*/
|
|
||||||
gdt: .word 0x0,0x0,0x0,0x0 # Null entry
|
|
||||||
.word 0xffff,0x0,0x9a00,0xcf # SEL_SCODE
|
|
||||||
.word 0xffff,0x0,0x9200,0xcf # SEL_SDATA
|
|
||||||
.word 0xffff,0x0,0x9a00,0x0 # SEL_RCODE
|
|
||||||
.word 0xffff,0x0,0x9200,0x0 # SEL_RDATA
|
|
||||||
gdt.1:
|
|
||||||
gdtdesc: .word gdt.1-gdt-1 # Limit
|
|
||||||
.long gdt # Base
|
|
||||||
/*
|
|
||||||
* Messages.
|
|
||||||
*/
|
|
||||||
m_logo: .asciz " \nBTX loader 1.00 "
|
|
||||||
m_vers: .asciz "BTX version is \0\n"
|
|
||||||
e_fmt: .asciz "Error: Client format not supported\n"
|
|
||||||
#ifdef BTXLDR_VERBOSE
|
|
||||||
m_mem: .asciz "Starting in protected mode (base mem=\0)\n"
|
|
||||||
m_esp: .asciz "Arguments passed (esp=\0):\n"
|
|
||||||
m_args: .asciz"<howto="
|
|
||||||
.asciz" bootdev="
|
|
||||||
.asciz" junk="
|
|
||||||
.asciz" "
|
|
||||||
.asciz" "
|
|
||||||
.asciz" bootinfo=\0>\n"
|
|
||||||
m_rel_bi: .asciz "Relocated bootinfo (size=48) to \0\n"
|
|
||||||
m_rel_args: .asciz "Relocated arguments (size=18) to \0\n"
|
|
||||||
m_rel_btx: .asciz "Relocated kernel (size=\0) to \0\n"
|
|
||||||
m_base: .asciz "Client base address is \0\n"
|
|
||||||
m_elf: .asciz "Client format is ELF\n"
|
|
||||||
m_segs: .asciz "text segment: offset="
|
|
||||||
.asciz " vaddr="
|
|
||||||
.asciz " filesz="
|
|
||||||
.asciz " memsz=\0\n"
|
|
||||||
.asciz "data segment: offset="
|
|
||||||
.asciz " vaddr="
|
|
||||||
.asciz " filesz="
|
|
||||||
.asciz " memsz=\0\n"
|
|
||||||
m_done: .asciz "Loading complete\n"
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Uninitialized data area.
|
|
||||||
*/
|
|
||||||
buf: # Scratch buffer
|
|
@ -1,10 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
PROG= crt0.o
|
|
||||||
INTERNALPROG=
|
|
||||||
MAN=
|
|
||||||
SRCS= btxcsu.S btxsys.s btxv86.s
|
|
||||||
CFLAGS+=-I${.CURDIR}/../../../i386/common
|
|
||||||
LDFLAGS=-Wl,-r
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
@ -1,49 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 1998 Robert Nordier
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms are freely
|
|
||||||
# permitted provided that the above copyright notice and this
|
|
||||||
# paragraph and the following disclaimer are duplicated in all
|
|
||||||
# such forms.
|
|
||||||
#
|
|
||||||
# This software is provided "AS IS" and without any express or
|
|
||||||
# implied warranties, including, without limitation, the implied
|
|
||||||
# warranties of merchantability and fitness for a particular
|
|
||||||
# purpose.
|
|
||||||
#
|
|
||||||
|
|
||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
#include <bootargs.h>
|
|
||||||
|
|
||||||
#
|
|
||||||
# BTX C startup code (ELF).
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Globals.
|
|
||||||
#
|
|
||||||
.global _start
|
|
||||||
#
|
|
||||||
# Client entry point.
|
|
||||||
#
|
|
||||||
_start: cld
|
|
||||||
pushl %eax
|
|
||||||
movl $_edata,%edi
|
|
||||||
movl $_end,%ecx
|
|
||||||
subl %edi, %ecx
|
|
||||||
xorb %al, %al
|
|
||||||
rep
|
|
||||||
stosb
|
|
||||||
popl __base
|
|
||||||
movl %esp,%eax # Set
|
|
||||||
addl $ARGADJ,%eax # argument
|
|
||||||
movl %eax,__args # pointer
|
|
||||||
call main # Invoke client main()
|
|
||||||
call exit # Invoke client exit()
|
|
||||||
#
|
|
||||||
# Data.
|
|
||||||
#
|
|
||||||
.comm __base,4 # Client base address
|
|
||||||
.comm __args,4 # Client arguments
|
|
@ -1,40 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 1998 Robert Nordier
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms are freely
|
|
||||||
# permitted provided that the above copyright notice and this
|
|
||||||
# paragraph and the following disclaimer are duplicated in all
|
|
||||||
# such forms.
|
|
||||||
#
|
|
||||||
# This software is provided "AS IS" and without any express or
|
|
||||||
# implied warranties, including, without limitation, the implied
|
|
||||||
# warranties of merchantability and fitness for a particular
|
|
||||||
# purpose.
|
|
||||||
#
|
|
||||||
|
|
||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
#
|
|
||||||
# BTX system calls.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Globals.
|
|
||||||
#
|
|
||||||
.global __exit
|
|
||||||
.global __exec
|
|
||||||
#
|
|
||||||
# Constants.
|
|
||||||
#
|
|
||||||
.set INT_SYS,0x30 # Interrupt number
|
|
||||||
#
|
|
||||||
# System call: exit
|
|
||||||
#
|
|
||||||
__exit: xorl %eax,%eax # BTX system
|
|
||||||
int $INT_SYS # call 0x0
|
|
||||||
#
|
|
||||||
# System call: exec
|
|
||||||
#
|
|
||||||
__exec: movl $0x1,%eax # BTX system
|
|
||||||
int $INT_SYS # call 0x1
|
|
@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1998 Robert Nordier
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are freely
|
|
||||||
* permitted provided that the above copyright notice and this
|
|
||||||
* paragraph and the following disclaimer are duplicated in all
|
|
||||||
* such forms.
|
|
||||||
*
|
|
||||||
* This software is provided "AS IS" and without any express or
|
|
||||||
* implied warranties, including, without limitation, the implied
|
|
||||||
* warranties of merchantability and fitness for a particular
|
|
||||||
* purpose.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* $FreeBSD$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _BTXV86_H_
|
|
||||||
#define _BTXV86_H_
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <machine/psl.h>
|
|
||||||
|
|
||||||
#define V86_ADDR 0x10000 /* Segment:offset address */
|
|
||||||
#define V86_CALLF 0x20000 /* Emulate far call */
|
|
||||||
#define V86_FLAGS 0x40000 /* Return flags */
|
|
||||||
|
|
||||||
struct __v86 {
|
|
||||||
uint32_t ctl; /* Control flags */
|
|
||||||
uint32_t addr; /* Interrupt number or address */
|
|
||||||
uint32_t es; /* V86 ES register */
|
|
||||||
uint32_t ds; /* V86 DS register */
|
|
||||||
uint32_t fs; /* V86 FS register */
|
|
||||||
uint32_t gs; /* V86 GS register */
|
|
||||||
uint32_t eax; /* V86 EAX register */
|
|
||||||
uint32_t ecx; /* V86 ECX register */
|
|
||||||
uint32_t edx; /* V86 EDX register */
|
|
||||||
uint32_t ebx; /* V86 EBX register */
|
|
||||||
uint32_t efl; /* V86 eflags register */
|
|
||||||
uint32_t ebp; /* V86 EBP register */
|
|
||||||
uint32_t esi; /* V86 ESI register */
|
|
||||||
uint32_t edi; /* V86 EDI register */
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct __v86 __v86; /* V86 interface structure */
|
|
||||||
void __v86int(void);
|
|
||||||
|
|
||||||
#define v86 __v86
|
|
||||||
#define v86int __v86int
|
|
||||||
|
|
||||||
extern u_int32_t __base;
|
|
||||||
extern u_int32_t __args;
|
|
||||||
|
|
||||||
#define PTOV(pa) ((caddr_t)(pa) - __base)
|
|
||||||
#define VTOP(va) ((vm_offset_t)(va) + __base)
|
|
||||||
#define VTOPSEG(va) (u_int16_t)(VTOP((caddr_t)va) >> 4)
|
|
||||||
#define VTOPOFF(va) (u_int16_t)(VTOP((caddr_t)va) & 0xf)
|
|
||||||
|
|
||||||
#define V86_CY(x) ((x) & PSL_C)
|
|
||||||
#define V86_ZR(x) ((x) & PSL_Z)
|
|
||||||
|
|
||||||
void __exit(int) __attribute__((__noreturn__));
|
|
||||||
void __exec(caddr_t, ...);
|
|
||||||
|
|
||||||
#endif /* !_BTXV86_H_ */
|
|
@ -1,85 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 1998 Robert Nordier
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms are freely
|
|
||||||
# permitted provided that the above copyright notice and this
|
|
||||||
# paragraph and the following disclaimer are duplicated in all
|
|
||||||
# such forms.
|
|
||||||
#
|
|
||||||
# This software is provided "AS IS" and without any express or
|
|
||||||
# implied warranties, including, without limitation, the implied
|
|
||||||
# warranties of merchantability and fitness for a particular
|
|
||||||
# purpose.
|
|
||||||
#
|
|
||||||
|
|
||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
#
|
|
||||||
# BTX V86 interface.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Globals.
|
|
||||||
#
|
|
||||||
.global __v86int
|
|
||||||
#
|
|
||||||
# Fields in V86 interface structure.
|
|
||||||
#
|
|
||||||
.set V86_CTL,0x0 # Control flags
|
|
||||||
.set V86_ADDR,0x4 # Int number/address
|
|
||||||
.set V86_ES,0x8 # V86 ES
|
|
||||||
.set V86_DS,0xc # V86 DS
|
|
||||||
.set V86_FS,0x10 # V86 FS
|
|
||||||
.set V86_GS,0x14 # V86 GS
|
|
||||||
.set V86_EAX,0x18 # V86 EAX
|
|
||||||
.set V86_ECX,0x1c # V86 ECX
|
|
||||||
.set V86_EDX,0x20 # V86 EDX
|
|
||||||
.set V86_EBX,0x24 # V86 EBX
|
|
||||||
.set V86_EFL,0x28 # V86 eflags
|
|
||||||
.set V86_EBP,0x2c # V86 EBP
|
|
||||||
.set V86_ESI,0x30 # V86 ESI
|
|
||||||
.set V86_EDI,0x34 # V86 EDI
|
|
||||||
#
|
|
||||||
# Other constants.
|
|
||||||
#
|
|
||||||
.set INT_V86,0x31 # Interrupt number
|
|
||||||
.set SIZ_V86,0x38 # Size of V86 structure
|
|
||||||
#
|
|
||||||
# V86 interface function.
|
|
||||||
#
|
|
||||||
__v86int: popl __v86ret # Save return address
|
|
||||||
pushl $__v86 # Push pointer
|
|
||||||
call __v86_swap # Load V86 registers
|
|
||||||
int $INT_V86 # To BTX
|
|
||||||
call __v86_swap # Load user registers
|
|
||||||
addl $0x4,%esp # Discard pointer
|
|
||||||
pushl __v86ret # Restore return address
|
|
||||||
ret # To user
|
|
||||||
#
|
|
||||||
# Swap V86 and user registers.
|
|
||||||
#
|
|
||||||
__v86_swap: xchgl %ebp,0x4(%esp,1) # Swap pointer, EBP
|
|
||||||
xchgl %eax,V86_EAX(%ebp) # Swap EAX
|
|
||||||
xchgl %ecx,V86_ECX(%ebp) # Swap ECX
|
|
||||||
xchgl %edx,V86_EDX(%ebp) # Swap EDX
|
|
||||||
xchgl %ebx,V86_EBX(%ebp) # Swap EBX
|
|
||||||
pushl %eax # Save
|
|
||||||
pushf # Put eflags
|
|
||||||
popl %eax # in EAX
|
|
||||||
xchgl %eax,V86_EFL(%ebp) # Swap
|
|
||||||
pushl %eax # Put EAX
|
|
||||||
popf # in eflags
|
|
||||||
movl 0x8(%esp,1),%eax # Load EBP
|
|
||||||
xchgl %eax,V86_EBP(%ebp) # Swap
|
|
||||||
movl %eax,0x8(%esp,1) # Save EBP
|
|
||||||
popl %eax # Restore
|
|
||||||
xchgl %esi,V86_ESI(%ebp) # Swap ESI
|
|
||||||
xchgl %edi,V86_EDI(%ebp) # Swap EDI
|
|
||||||
xchgl %ebp,0x4(%esp,1) # Swap pointer, EBP
|
|
||||||
ret # To caller
|
|
||||||
#
|
|
||||||
# V86 interface structure.
|
|
||||||
#
|
|
||||||
.comm __v86,SIZ_V86
|
|
||||||
.comm __v86ret,4
|
|
@ -1,18 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
PROG= cdboot
|
|
||||||
STRIP=
|
|
||||||
BINMODE=${NOBINMODE}
|
|
||||||
MAN=
|
|
||||||
SRCS= ${PROG}.S
|
|
||||||
|
|
||||||
CFLAGS+=-I${.CURDIR}/../../i386/common
|
|
||||||
|
|
||||||
ORG= 0x0000
|
|
||||||
|
|
||||||
LDFLAGS=${LDFLAGS_BIN}
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
||||||
|
|
||||||
# XXX: clang integrated-as doesn't grok .codeNN directives yet
|
|
||||||
CFLAGS.cdboot.S= ${CLANG_NO_IAS}
|
|
@ -1,805 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2006 TAKAHASHI Yoshihiro <nyan@FreeBSD.org>
|
|
||||||
# Copyright (c) 2001 John Baldwin <jhb@FreeBSD.org>
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
# 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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$
|
|
||||||
|
|
||||||
#
|
|
||||||
# Basically, we first create a set of boot arguments to pass to the loaded
|
|
||||||
# binary. Then we attempt to load /boot/loader from the CD we were booted
|
|
||||||
# off of.
|
|
||||||
#
|
|
||||||
|
|
||||||
#include <bootargs.h>
|
|
||||||
|
|
||||||
#
|
|
||||||
# Memory locations.
|
|
||||||
#
|
|
||||||
.set STACK_OFF,0x6000 # Stack offset
|
|
||||||
.set LOAD_SEG,0x0700 # Load segment
|
|
||||||
.set LOAD_SIZE,2048 # Load size
|
|
||||||
.set DAUA,0x0584 # DA/UA
|
|
||||||
|
|
||||||
.set MEM_PAGE_SIZE,0x1000 # memory page size, 4k
|
|
||||||
.set MEM_ARG,0x900 # Arguments at start
|
|
||||||
.set MEM_ARG_BTX,0xa100 # Where we move them to so the
|
|
||||||
# BTX client can see them
|
|
||||||
.set MEM_ARG_SIZE,0x18 # Size of the arguments
|
|
||||||
.set MEM_BTX_ADDRESS,0x9000 # where BTX lives
|
|
||||||
.set MEM_BTX_ENTRY,0x9010 # where BTX starts to execute
|
|
||||||
.set MEM_BTX_OFFSET,MEM_PAGE_SIZE # offset of BTX in the loader
|
|
||||||
.set MEM_BTX_CLIENT,0xa000 # where BTX clients live
|
|
||||||
#
|
|
||||||
# PC98 machine type from sys/pc98/pc98/pc98_machdep.h
|
|
||||||
#
|
|
||||||
.set MEM_SYS, 0xa100 # System common area segment
|
|
||||||
.set PC98_MACHINE_TYPE, 0x0620 # PC98 machine type
|
|
||||||
.set EPSON_ID, 0x0624 # EPSON machine id
|
|
||||||
|
|
||||||
.set M_NEC_PC98, 0x0001
|
|
||||||
.set M_EPSON_PC98, 0x0002
|
|
||||||
.set M_NOT_H98, 0x0010
|
|
||||||
.set M_H98, 0x0020
|
|
||||||
.set M_NOTE, 0x0040
|
|
||||||
.set M_NORMAL, 0x1000
|
|
||||||
.set M_8M, 0x8000
|
|
||||||
#
|
|
||||||
# Signature Constants
|
|
||||||
#
|
|
||||||
.set SIG1_OFF,0x1fe # Signature offset
|
|
||||||
.set SIG2_OFF,0x7fe # Signature offset
|
|
||||||
#
|
|
||||||
# a.out header fields
|
|
||||||
#
|
|
||||||
.set AOUT_TEXT,0x04 # text segment size
|
|
||||||
.set AOUT_DATA,0x08 # data segment size
|
|
||||||
.set AOUT_BSS,0x0c # zero'd BSS size
|
|
||||||
.set AOUT_SYMBOLS,0x10 # symbol table
|
|
||||||
.set AOUT_ENTRY,0x14 # entry point
|
|
||||||
.set AOUT_HEADER,MEM_PAGE_SIZE # size of the a.out header
|
|
||||||
#
|
|
||||||
# Segment selectors.
|
|
||||||
#
|
|
||||||
.set SEL_SDATA,0x8 # Supervisor data
|
|
||||||
.set SEL_RDATA,0x10 # Real mode data
|
|
||||||
.set SEL_SCODE,0x18 # PM-32 code
|
|
||||||
.set SEL_SCODE16,0x20 # PM-16 code
|
|
||||||
#
|
|
||||||
# BTX constants
|
|
||||||
#
|
|
||||||
.set INT_SYS,0x30 # BTX syscall interrupt
|
|
||||||
#
|
|
||||||
# Constants for reading from the CD.
|
|
||||||
#
|
|
||||||
.set ERROR_TIMEOUT,0x90 # BIOS timeout on read
|
|
||||||
.set NUM_RETRIES,3 # Num times to retry
|
|
||||||
.set SECTOR_SIZE,0x800 # size of a sector
|
|
||||||
.set SECTOR_SHIFT,11 # number of place to shift
|
|
||||||
.set BUFFER_LEN,0x100 # number of sectors in buffer
|
|
||||||
.set MAX_READ,0xf800 # max we can read at a time
|
|
||||||
.set MAX_READ_SEC,MAX_READ >> SECTOR_SHIFT
|
|
||||||
.set MEM_READ_BUFFER,0x9000 # buffer to read from CD
|
|
||||||
.set MEM_VOLDESC,MEM_READ_BUFFER # volume descriptor
|
|
||||||
.set MEM_DIR,MEM_VOLDESC+SECTOR_SIZE # Lookup buffer
|
|
||||||
.set VOLDESC_LBA,0x10 # LBA of vol descriptor
|
|
||||||
.set VD_PRIMARY,1 # Primary VD
|
|
||||||
.set VD_END,255 # VD Terminator
|
|
||||||
.set VD_ROOTDIR,156 # Offset of Root Dir Record
|
|
||||||
.set DIR_LEN,0 # Offset of Dir Record length
|
|
||||||
.set DIR_EA_LEN,1 # Offset of EA length
|
|
||||||
.set DIR_EXTENT,2 # Offset of 64-bit LBA
|
|
||||||
.set DIR_SIZE,10 # Offset of 64-bit length
|
|
||||||
.set DIR_NAMELEN,32 # Offset of 8-bit name len
|
|
||||||
.set DIR_NAME,33 # Offset of dir name
|
|
||||||
|
|
||||||
#
|
|
||||||
# Program start.
|
|
||||||
#
|
|
||||||
.code16
|
|
||||||
.globl start
|
|
||||||
|
|
||||||
start: jmp main
|
|
||||||
|
|
||||||
.org 4
|
|
||||||
.ascii "IPL1 "
|
|
||||||
|
|
||||||
main: cld
|
|
||||||
|
|
||||||
/* Setup the stack */
|
|
||||||
xor %ax,%ax
|
|
||||||
mov %ax,%ss
|
|
||||||
mov $STACK_OFF,%sp
|
|
||||||
|
|
||||||
push %ecx
|
|
||||||
|
|
||||||
/* Setup graphic screen */
|
|
||||||
mov $0x42,%ah # 640x400
|
|
||||||
mov $0xc0,%ch
|
|
||||||
int $0x18
|
|
||||||
mov $0x40,%ah # graph on
|
|
||||||
int $0x18
|
|
||||||
|
|
||||||
/* Setup text screen */
|
|
||||||
mov $0x0a00,%ax # 80x25
|
|
||||||
int $0x18
|
|
||||||
mov $0x0c,%ah # text on
|
|
||||||
int $0x18
|
|
||||||
mov $0x13,%ah # cursor home
|
|
||||||
xor %dx,%dx
|
|
||||||
int $0x18
|
|
||||||
mov $0x11,%ah # cursor on
|
|
||||||
int $0x18
|
|
||||||
|
|
||||||
/* Setup keyboard */
|
|
||||||
mov $0x03,%ah
|
|
||||||
int $0x18
|
|
||||||
|
|
||||||
/* Transfer PC-9801 system common area */
|
|
||||||
xor %ax,%ax
|
|
||||||
mov %ax,%si
|
|
||||||
mov %ax,%ds
|
|
||||||
mov %ax,%di
|
|
||||||
mov $MEM_SYS,%ax
|
|
||||||
mov %ax,%es
|
|
||||||
mov $0x0600,%cx
|
|
||||||
rep
|
|
||||||
movsb
|
|
||||||
|
|
||||||
/* Transfer EPSON machine type */
|
|
||||||
mov $0xfd00,%ax
|
|
||||||
mov %ax,%ds
|
|
||||||
mov (0x804),%eax
|
|
||||||
and $0x00ffffff,%eax
|
|
||||||
mov %eax,%es:(EPSON_ID)
|
|
||||||
|
|
||||||
/* Set machine type to PC98_SYSTEM_PARAMETER */
|
|
||||||
call machine_check
|
|
||||||
|
|
||||||
/* Load cdboot */
|
|
||||||
xor %ax,%ax
|
|
||||||
mov %ax,%ds
|
|
||||||
mov $0x06,%ah /* Read data */
|
|
||||||
mov (DAUA),%al /* Read drive */
|
|
||||||
pop %ecx /* cylinder */
|
|
||||||
xor %dx,%dx /* head / sector */
|
|
||||||
mov $LOAD_SEG,%bx /* Load address */
|
|
||||||
mov %bx,%es
|
|
||||||
xor %bp,%bp
|
|
||||||
mov $LOAD_SIZE,%bx /* Load size */
|
|
||||||
int $0x1b
|
|
||||||
mov $msg_readerr,%si
|
|
||||||
jc error
|
|
||||||
|
|
||||||
/* Jump to cdboot */
|
|
||||||
ljmp $LOAD_SEG,$cdboot
|
|
||||||
|
|
||||||
#
|
|
||||||
# Set machine type to PC98_SYSTEM_PARAMETER.
|
|
||||||
#
|
|
||||||
machine_check: xor %edx,%edx
|
|
||||||
mov %dx,%ds
|
|
||||||
mov $MEM_SYS,%ax
|
|
||||||
mov %ax,%es
|
|
||||||
|
|
||||||
/* Wait V-SYNC */
|
|
||||||
vsync.1: inb $0x60,%al
|
|
||||||
test $0x20,%al
|
|
||||||
jnz vsync.1
|
|
||||||
vsync.2: inb $0x60,%al
|
|
||||||
test $0x20,%al
|
|
||||||
jz vsync.2
|
|
||||||
|
|
||||||
/* ANK 'A' font */
|
|
||||||
xor %al,%al
|
|
||||||
outb %al,$0xa1
|
|
||||||
mov $0x41,%al
|
|
||||||
outb %al,$0xa3
|
|
||||||
|
|
||||||
/* Get 'A' font from CG window */
|
|
||||||
push %ds
|
|
||||||
mov $0xa400,%ax
|
|
||||||
mov %ax,%ds
|
|
||||||
xor %eax,%eax
|
|
||||||
xor %bx,%bx
|
|
||||||
mov $4,%cx
|
|
||||||
font.1: add (%bx),%eax
|
|
||||||
add $4,%bx
|
|
||||||
loop font.1
|
|
||||||
pop %ds
|
|
||||||
cmp $0x6efc58fc,%eax
|
|
||||||
jnz m_epson
|
|
||||||
|
|
||||||
m_pc98: or $M_NEC_PC98,%edx
|
|
||||||
mov $0x0458,%bx
|
|
||||||
mov (%bx),%al
|
|
||||||
test $0x80,%al
|
|
||||||
jz m_not_h98
|
|
||||||
or $M_H98,%edx
|
|
||||||
jmp 1f
|
|
||||||
m_epson: or $M_EPSON_PC98,%edx
|
|
||||||
m_not_h98: or $M_NOT_H98,%edx
|
|
||||||
|
|
||||||
1: inb $0x42,%al
|
|
||||||
test $0x20,%al
|
|
||||||
jz 1f
|
|
||||||
or $M_8M,%edx
|
|
||||||
|
|
||||||
1: mov $0x0400,%bx
|
|
||||||
mov (%bx),%al
|
|
||||||
test $0x80,%al
|
|
||||||
jz 1f
|
|
||||||
or $M_NOTE,%edx
|
|
||||||
|
|
||||||
1: mov $PC98_MACHINE_TYPE,%bx
|
|
||||||
mov %edx,%es:(%bx)
|
|
||||||
ret
|
|
||||||
|
|
||||||
#
|
|
||||||
# Print out the error message at [SI], wait for a keypress, and then
|
|
||||||
# reboot the machine.
|
|
||||||
#
|
|
||||||
error: call putstr
|
|
||||||
mov $msg_keypress,%si
|
|
||||||
call putstr
|
|
||||||
xor %ax,%ax # Get keypress
|
|
||||||
int $0x18
|
|
||||||
xor %ax,%ax # CPU reset
|
|
||||||
outb %al,$0xf0
|
|
||||||
halt: hlt
|
|
||||||
jmp halt # Spin
|
|
||||||
|
|
||||||
#
|
|
||||||
# Display a null-terminated string at [SI].
|
|
||||||
#
|
|
||||||
# Trashes: AX, BX, CX, DX, SI, DI
|
|
||||||
#
|
|
||||||
putstr: push %ds
|
|
||||||
push %es
|
|
||||||
mov %cs,%ax
|
|
||||||
mov %ax,%ds
|
|
||||||
mov $0xa000,%ax
|
|
||||||
mov %ax,%es
|
|
||||||
mov cursor,%di
|
|
||||||
mov $0x00e1,%bx # Attribute
|
|
||||||
mov $160,%cx
|
|
||||||
putstr.0: lodsb
|
|
||||||
testb %al,%al
|
|
||||||
jz putstr.done
|
|
||||||
cmp $0x0d,%al
|
|
||||||
jz putstr.cr
|
|
||||||
cmp $0x0a,%al
|
|
||||||
jz putstr.lf
|
|
||||||
mov %bl,%es:0x2000(%di)
|
|
||||||
stosb
|
|
||||||
inc %di
|
|
||||||
jmp putstr.move
|
|
||||||
putstr.cr: xor %dx,%dx
|
|
||||||
mov %di,%ax
|
|
||||||
div %cx
|
|
||||||
sub %dx,%di
|
|
||||||
jmp putstr.move
|
|
||||||
putstr.lf: add %cx,%di
|
|
||||||
putstr.move: mov %di,%dx
|
|
||||||
mov $0x13,%ah # Move cursor
|
|
||||||
int $0x18
|
|
||||||
jmp putstr.0
|
|
||||||
putstr.done: mov %di,cursor
|
|
||||||
pop %es
|
|
||||||
pop %ds
|
|
||||||
ret
|
|
||||||
|
|
||||||
#
|
|
||||||
# Display a single char at [AL], but don't move a cursor.
|
|
||||||
#
|
|
||||||
putc: push %es
|
|
||||||
push %di
|
|
||||||
push %bx
|
|
||||||
mov $0xa000,%bx
|
|
||||||
mov %bx,%es
|
|
||||||
mov cursor,%di
|
|
||||||
mov $0xe1,%bl # Attribute
|
|
||||||
mov %bl,%es:0x2000(%di)
|
|
||||||
stosb
|
|
||||||
pop %bx
|
|
||||||
pop %di
|
|
||||||
pop %es
|
|
||||||
ret
|
|
||||||
|
|
||||||
msg_readerr: .asciz "Read Error\r\n"
|
|
||||||
msg_keypress: .asciz "\r\nPress any key to reboot\r\n"
|
|
||||||
|
|
||||||
/* Boot signature */
|
|
||||||
|
|
||||||
.org SIG1_OFF,0x90
|
|
||||||
|
|
||||||
.word 0xaa55 # Magic number
|
|
||||||
|
|
||||||
#
|
|
||||||
# cdboot
|
|
||||||
#
|
|
||||||
cdboot: mov %cs,%ax
|
|
||||||
mov %ax,%ds
|
|
||||||
xor %ax,%ax
|
|
||||||
mov %ax,%es
|
|
||||||
mov %es:(DAUA),%al # Save BIOS boot device
|
|
||||||
mov %al,drive
|
|
||||||
mov %cx,cylinder # Save BIOS boot cylinder
|
|
||||||
|
|
||||||
mov $msg_welcome,%si # %ds:(%si) -> welcome message
|
|
||||||
call putstr # display the welcome message
|
|
||||||
#
|
|
||||||
# Setup the arguments that the loader is expecting from boot[12]
|
|
||||||
#
|
|
||||||
mov $msg_bootinfo,%si # %ds:(%si) -> boot args message
|
|
||||||
call putstr # display the message
|
|
||||||
mov $MEM_ARG,%bx # %ds:(%bx) -> boot args
|
|
||||||
mov %bx,%di # %es:(%di) -> boot args
|
|
||||||
xor %eax,%eax # zero %eax
|
|
||||||
mov $(MEM_ARG_SIZE/4),%cx # Size of arguments in 32-bit
|
|
||||||
# dwords
|
|
||||||
rep # Clear the arguments
|
|
||||||
stosl # to zero
|
|
||||||
mov drive,%dl # Store BIOS boot device
|
|
||||||
mov %dl,%es:0x4(%bx) # in kargs->bootdev
|
|
||||||
or $KARGS_FLAGS_CD,%es:0x8(%bx) # kargs->bootflags |=
|
|
||||||
# KARGS_FLAGS_CD
|
|
||||||
#
|
|
||||||
# Load Volume Descriptor
|
|
||||||
#
|
|
||||||
mov $VOLDESC_LBA,%eax # Set LBA of first VD
|
|
||||||
load_vd: push %eax # Save %eax
|
|
||||||
mov $1,%dh # One sector
|
|
||||||
mov $MEM_VOLDESC,%ebx # Destination
|
|
||||||
call read # Read it in
|
|
||||||
cmpb $VD_PRIMARY,%es:(%bx) # Primary VD?
|
|
||||||
je have_vd # Yes
|
|
||||||
pop %eax # Prepare to
|
|
||||||
inc %eax # try next
|
|
||||||
cmpb $VD_END,%es:(%bx) # Last VD?
|
|
||||||
jne load_vd # No, read next
|
|
||||||
mov $msg_novd,%si # No VD
|
|
||||||
jmp error # Halt
|
|
||||||
have_vd: # Have Primary VD
|
|
||||||
#
|
|
||||||
# Try to look up the loader binary using the paths in the loader_paths
|
|
||||||
# array.
|
|
||||||
#
|
|
||||||
mov $loader_paths,%si # Point to start of array
|
|
||||||
lookup_path: push %si # Save file name pointer
|
|
||||||
call lookup # Try to find file
|
|
||||||
pop %di # Restore file name pointer
|
|
||||||
jnc lookup_found # Found this file
|
|
||||||
push %es
|
|
||||||
mov %cs,%ax
|
|
||||||
mov %ax,%es
|
|
||||||
xor %al,%al # Look for next
|
|
||||||
mov $0xffff,%cx # path name by
|
|
||||||
repnz # scanning for
|
|
||||||
scasb # nul char
|
|
||||||
pop %es
|
|
||||||
mov %di,%si # Point %si at next path
|
|
||||||
mov (%si),%al # Get first char of next path
|
|
||||||
or %al,%al # Is it double nul?
|
|
||||||
jnz lookup_path # No, try it.
|
|
||||||
mov $msg_failed,%si # Failed message
|
|
||||||
jmp error # Halt
|
|
||||||
lookup_found: # Found a loader file
|
|
||||||
#
|
|
||||||
# Load the binary into the buffer. Due to real mode addressing limitations
|
|
||||||
# we have to read it in 64k chunks.
|
|
||||||
#
|
|
||||||
mov %es:DIR_SIZE(%bx),%eax # Read file length
|
|
||||||
add $SECTOR_SIZE-1,%eax # Convert length to sectors
|
|
||||||
shr $SECTOR_SHIFT,%eax
|
|
||||||
cmp $BUFFER_LEN,%eax
|
|
||||||
jbe load_sizeok
|
|
||||||
mov $msg_load2big,%si # Error message
|
|
||||||
jmp error
|
|
||||||
load_sizeok: movzbw %al,%cx # Num sectors to read
|
|
||||||
mov %es:DIR_EXTENT(%bx),%eax # Load extent
|
|
||||||
xor %edx,%edx
|
|
||||||
mov %es:DIR_EA_LEN(%bx),%dl
|
|
||||||
add %edx,%eax # Skip extended
|
|
||||||
mov $MEM_READ_BUFFER,%ebx # Read into the buffer
|
|
||||||
load_loop: mov %cl,%dh
|
|
||||||
cmp $MAX_READ_SEC,%cl # Truncate to max read size
|
|
||||||
jbe load_notrunc
|
|
||||||
mov $MAX_READ_SEC,%dh
|
|
||||||
load_notrunc: sub %dh,%cl # Update count
|
|
||||||
push %eax # Save
|
|
||||||
call read # Read it in
|
|
||||||
pop %eax # Restore
|
|
||||||
add $MAX_READ_SEC,%eax # Update LBA
|
|
||||||
add $MAX_READ,%ebx # Update dest addr
|
|
||||||
jcxz load_done # Done?
|
|
||||||
jmp load_loop # Keep going
|
|
||||||
load_done:
|
|
||||||
#
|
|
||||||
# Turn on the A20 address line
|
|
||||||
#
|
|
||||||
xor %ax,%ax # Turn A20 on
|
|
||||||
outb %al,$0xf2
|
|
||||||
mov $0x02,%al
|
|
||||||
outb %al,$0xf6
|
|
||||||
#
|
|
||||||
# Relocate the loader and BTX using a very lazy protected mode
|
|
||||||
#
|
|
||||||
mov $msg_relocate,%si # Display the
|
|
||||||
call putstr # relocation message
|
|
||||||
mov %es:(MEM_READ_BUFFER+AOUT_ENTRY),%edi # %edi is the destination
|
|
||||||
mov $(MEM_READ_BUFFER+AOUT_HEADER),%esi # %esi is
|
|
||||||
# the start of the text
|
|
||||||
# segment
|
|
||||||
mov %es:(MEM_READ_BUFFER+AOUT_TEXT),%ecx # %ecx = length of the text
|
|
||||||
# segment
|
|
||||||
push %edi # Save entry point for later
|
|
||||||
lgdt gdtdesc # setup our own gdt
|
|
||||||
cli # turn off interrupts
|
|
||||||
mov %cr0,%eax # Turn on
|
|
||||||
or $0x1,%al # protected
|
|
||||||
mov %eax,%cr0 # mode
|
|
||||||
ljmp $SEL_SCODE,$pm_start # long jump to clear the
|
|
||||||
# instruction pre-fetch queue
|
|
||||||
.code32
|
|
||||||
pm_start: mov $SEL_SDATA,%ax # Initialize
|
|
||||||
mov %ax,%ds # %ds and
|
|
||||||
mov %ax,%es # %es to a flat selector
|
|
||||||
rep # Relocate the
|
|
||||||
movsb # text segment
|
|
||||||
add $(MEM_PAGE_SIZE - 1),%edi # pad %edi out to a new page
|
|
||||||
and $~(MEM_PAGE_SIZE - 1),%edi # for the data segment
|
|
||||||
mov MEM_READ_BUFFER+AOUT_DATA,%ecx # size of the data segment
|
|
||||||
rep # Relocate the
|
|
||||||
movsb # data segment
|
|
||||||
mov MEM_READ_BUFFER+AOUT_BSS,%ecx # size of the bss
|
|
||||||
xor %eax,%eax # zero %eax
|
|
||||||
add $3,%cl # round %ecx up to
|
|
||||||
shr $2,%ecx # a multiple of 4
|
|
||||||
rep # zero the
|
|
||||||
stosl # bss
|
|
||||||
mov MEM_READ_BUFFER+AOUT_ENTRY,%esi # %esi -> relocated loader
|
|
||||||
add $MEM_BTX_OFFSET,%esi # %esi -> BTX in the loader
|
|
||||||
mov $MEM_BTX_ADDRESS,%edi # %edi -> where BTX needs to go
|
|
||||||
movzwl 0xa(%esi),%ecx # %ecx -> length of BTX
|
|
||||||
rep # Relocate
|
|
||||||
movsb # BTX
|
|
||||||
ljmp $SEL_SCODE16,$pm_16 # Jump to 16-bit PM
|
|
||||||
.code16
|
|
||||||
pm_16: mov $SEL_RDATA,%ax # Initialize
|
|
||||||
mov %ax,%ds # %ds and
|
|
||||||
mov %ax,%es # %es to a real mode selector
|
|
||||||
mov %cr0,%eax # Turn off
|
|
||||||
and $~0x1,%al # protected
|
|
||||||
mov %eax,%cr0 # mode
|
|
||||||
ljmp $LOAD_SEG,$pm_end # Long jump to clear the
|
|
||||||
# instruction pre-fetch queue
|
|
||||||
pm_end: sti # Turn interrupts back on now
|
|
||||||
#
|
|
||||||
# Copy the BTX client to MEM_BTX_CLIENT
|
|
||||||
#
|
|
||||||
mov %cs,%ax
|
|
||||||
mov %ax,%ds
|
|
||||||
xor %ax,%ax
|
|
||||||
mov %ax,%es
|
|
||||||
mov $MEM_BTX_CLIENT,%di # Prepare to relocate
|
|
||||||
mov $btx_client,%si # the simple btx client
|
|
||||||
mov $(btx_client_end-btx_client),%cx # length of btx client
|
|
||||||
rep # Relocate the
|
|
||||||
movsb # simple BTX client
|
|
||||||
#
|
|
||||||
# Copy the boot[12] args to where the BTX client can see them
|
|
||||||
#
|
|
||||||
xor %ax,%ax
|
|
||||||
mov %ax,%ds
|
|
||||||
mov $MEM_ARG,%si # where the args are at now
|
|
||||||
mov $MEM_ARG_BTX,%di # where the args are moving to
|
|
||||||
mov $(MEM_ARG_SIZE/4),%cx # size of the arguments in longs
|
|
||||||
rep # Relocate
|
|
||||||
movsl # the words
|
|
||||||
#
|
|
||||||
# Save the entry point so the client can get to it later on
|
|
||||||
#
|
|
||||||
pop %eax # Restore saved entry point
|
|
||||||
stosl # and add it to the end of
|
|
||||||
# the arguments
|
|
||||||
#
|
|
||||||
# Now we just start up BTX and let it do the rest
|
|
||||||
#
|
|
||||||
mov $msg_jump,%si # Display the
|
|
||||||
call putstr # jump message
|
|
||||||
ljmp $0,$MEM_BTX_ENTRY # Jump to the BTX entry point
|
|
||||||
|
|
||||||
#
|
|
||||||
# Lookup the file in the path at [SI] from the root directory.
|
|
||||||
#
|
|
||||||
# Trashes: All but BX
|
|
||||||
# Returns: CF = 0 (success), BX = pointer to record
|
|
||||||
# CF = 1 (not found)
|
|
||||||
#
|
|
||||||
lookup: mov $VD_ROOTDIR+MEM_VOLDESC,%bx # Root directory record
|
|
||||||
push %bx
|
|
||||||
push %si
|
|
||||||
mov $msg_lookup,%si # Display lookup message
|
|
||||||
call putstr
|
|
||||||
pop %si
|
|
||||||
push %si
|
|
||||||
call putstr
|
|
||||||
mov $msg_lookup2,%si
|
|
||||||
call putstr
|
|
||||||
pop %si
|
|
||||||
pop %bx
|
|
||||||
lookup_dir: lodsb # Get first char of path
|
|
||||||
cmp $0,%al # Are we done?
|
|
||||||
je lookup_done # Yes
|
|
||||||
cmp $'/',%al # Skip path separator.
|
|
||||||
je lookup_dir
|
|
||||||
dec %si # Undo lodsb side effect
|
|
||||||
call find_file # Lookup first path item
|
|
||||||
jnc lookup_dir # Try next component
|
|
||||||
mov $msg_lookupfail,%si # Not found message
|
|
||||||
push %bx
|
|
||||||
call putstr
|
|
||||||
pop %bx
|
|
||||||
stc # Set carry
|
|
||||||
ret
|
|
||||||
lookup_done: mov $msg_lookupok,%si # Success message
|
|
||||||
push %bx
|
|
||||||
call putstr
|
|
||||||
pop %bx
|
|
||||||
clc # Clear carry
|
|
||||||
ret
|
|
||||||
|
|
||||||
#
|
|
||||||
# Lookup file at [SI] in directory whose record is at [BX].
|
|
||||||
#
|
|
||||||
# Trashes: All but returns
|
|
||||||
# Returns: CF = 0 (success), BX = pointer to record, SI = next path item
|
|
||||||
# CF = 1 (not found), SI = preserved
|
|
||||||
#
|
|
||||||
find_file: mov %es:DIR_EXTENT(%bx),%eax # Load extent
|
|
||||||
xor %edx,%edx
|
|
||||||
mov %es:DIR_EA_LEN(%bx),%dl
|
|
||||||
add %edx,%eax # Skip extended attributes
|
|
||||||
mov %eax,rec_lba # Save LBA
|
|
||||||
mov %es:DIR_SIZE(%bx),%eax # Save size
|
|
||||||
mov %eax,rec_size
|
|
||||||
xor %cl,%cl # Zero length
|
|
||||||
push %si # Save
|
|
||||||
ff.namelen: inc %cl # Update length
|
|
||||||
lodsb # Read char
|
|
||||||
cmp $0,%al # Nul?
|
|
||||||
je ff.namedone # Yes
|
|
||||||
cmp $'/',%al # Path separator?
|
|
||||||
jnz ff.namelen # No, keep going
|
|
||||||
ff.namedone: dec %cl # Adjust length and save
|
|
||||||
mov %cl,name_len
|
|
||||||
pop %si # Restore
|
|
||||||
ff.load: mov rec_lba,%eax # Load LBA
|
|
||||||
mov $MEM_DIR,%ebx # Address buffer
|
|
||||||
mov $1,%dh # One sector
|
|
||||||
call read # Read directory block
|
|
||||||
incl rec_lba # Update LBA to next block
|
|
||||||
ff.scan: mov %ebx,%edx # Check for EOF
|
|
||||||
sub $MEM_DIR,%edx
|
|
||||||
cmp %edx,rec_size
|
|
||||||
ja ff.scan.1
|
|
||||||
stc # EOF reached
|
|
||||||
ret
|
|
||||||
ff.scan.1: cmpb $0,%es:DIR_LEN(%bx) # Last record in block?
|
|
||||||
je ff.nextblock
|
|
||||||
push %si # Save
|
|
||||||
movzbw %es:DIR_NAMELEN(%bx),%si # Find end of string
|
|
||||||
ff.checkver: cmpb $'0',%es:DIR_NAME-1(%bx,%si) # Less than '0'?
|
|
||||||
jb ff.checkver.1
|
|
||||||
cmpb $'9',%es:DIR_NAME-1(%bx,%si) # Greater than '9'?
|
|
||||||
ja ff.checkver.1
|
|
||||||
dec %si # Next char
|
|
||||||
jnz ff.checkver
|
|
||||||
jmp ff.checklen # All numbers in name, so
|
|
||||||
# no version
|
|
||||||
ff.checkver.1: movzbw %es:DIR_NAMELEN(%bx),%cx
|
|
||||||
cmp %cx,%si # Did we find any digits?
|
|
||||||
je ff.checkdot # No
|
|
||||||
cmpb $';',%es:DIR_NAME-1(%bx,%si) # Check for semicolon
|
|
||||||
jne ff.checkver.2
|
|
||||||
dec %si # Skip semicolon
|
|
||||||
mov %si,%cx
|
|
||||||
mov %cl,%es:DIR_NAMELEN(%bx) # Adjust length
|
|
||||||
jmp ff.checkdot
|
|
||||||
ff.checkver.2: mov %cx,%si # Restore %si to end of string
|
|
||||||
ff.checkdot: cmpb $'.',%es:DIR_NAME-1(%bx,%si) # Trailing dot?
|
|
||||||
jne ff.checklen # No
|
|
||||||
decb %es:DIR_NAMELEN(%bx) # Adjust length
|
|
||||||
ff.checklen: pop %si # Restore
|
|
||||||
movzbw name_len,%cx # Load length of name
|
|
||||||
cmp %cl,%es:DIR_NAMELEN(%bx) # Does length match?
|
|
||||||
je ff.checkname # Yes, check name
|
|
||||||
ff.nextrec: add %es:DIR_LEN(%bx),%bl # Next record
|
|
||||||
adc $0,%bh
|
|
||||||
jmp ff.scan
|
|
||||||
ff.nextblock: subl $SECTOR_SIZE,rec_size # Adjust size
|
|
||||||
jnc ff.load # If subtract ok, keep going
|
|
||||||
ret # End of file, so not found
|
|
||||||
ff.checkname: lea DIR_NAME(%bx),%di # Address name in record
|
|
||||||
push %si # Save
|
|
||||||
repe cmpsb # Compare name
|
|
||||||
je ff.match # We have a winner!
|
|
||||||
pop %si # Restore
|
|
||||||
jmp ff.nextrec # Keep looking.
|
|
||||||
ff.match: add $2,%sp # Discard saved %si
|
|
||||||
clc # Clear carry
|
|
||||||
ret
|
|
||||||
|
|
||||||
#
|
|
||||||
# Load DH sectors starting at LBA EAX into [EBX].
|
|
||||||
#
|
|
||||||
# Trashes: EAX
|
|
||||||
#
|
|
||||||
read: push %es # Save
|
|
||||||
push %bp
|
|
||||||
push %dx
|
|
||||||
push %cx
|
|
||||||
push %ebx
|
|
||||||
mov %bx,%bp # Set destination address
|
|
||||||
and $0x000f,%bp
|
|
||||||
shr $4,%ebx
|
|
||||||
mov %bx,%es
|
|
||||||
xor %bx,%bx # Set read bytes
|
|
||||||
mov %dh,%bl
|
|
||||||
shl $SECTOR_SHIFT,%bx # 2048 bytes/sec
|
|
||||||
mov %ax,%cx # Set LBA
|
|
||||||
shr $16,%eax
|
|
||||||
mov %ax,%dx
|
|
||||||
read.retry: mov $0x06,%ah # BIOS device read
|
|
||||||
mov drive,%al
|
|
||||||
and $0x7f,%al
|
|
||||||
call twiddle # Entertain the user
|
|
||||||
int $0x1b # Call BIOS
|
|
||||||
jc read.fail # Worked?
|
|
||||||
pop %ebx # Restore
|
|
||||||
pop %cx
|
|
||||||
pop %dx
|
|
||||||
pop %bp
|
|
||||||
pop %es
|
|
||||||
ret # Return
|
|
||||||
read.fail: cmp $ERROR_TIMEOUT,%ah # Timeout?
|
|
||||||
je read.retry # Yes, Retry.
|
|
||||||
read.error: mov %ah,%al # Save error
|
|
||||||
mov $hex_error,%di # Format it
|
|
||||||
call hex8 # as hex
|
|
||||||
mov $msg_badread,%si # Display Read error message
|
|
||||||
jmp error
|
|
||||||
|
|
||||||
#
|
|
||||||
# Output the "twiddle"
|
|
||||||
#
|
|
||||||
twiddle: push %ax # Save
|
|
||||||
push %bx # Save
|
|
||||||
mov twiddle_index,%al # Load index
|
|
||||||
mov $twiddle_chars,%bx # Address table
|
|
||||||
inc %al # Next
|
|
||||||
and $3,%al # char
|
|
||||||
mov %al,twiddle_index # Save index for next call
|
|
||||||
xlat # Get char
|
|
||||||
call putc # Output it
|
|
||||||
pop %bx # Restore
|
|
||||||
pop %ax # Restore
|
|
||||||
ret
|
|
||||||
|
|
||||||
#
|
|
||||||
# Convert AL to hex, saving the result to [EDI].
|
|
||||||
#
|
|
||||||
hex8: pushl %eax # Save
|
|
||||||
shrb $0x4,%al # Do upper
|
|
||||||
call hex8.1 # 4
|
|
||||||
popl %eax # Restore
|
|
||||||
hex8.1: andb $0xf,%al # Get lower 4
|
|
||||||
cmpb $0xa,%al # Convert
|
|
||||||
sbbb $0x69,%al # to hex
|
|
||||||
das # digit
|
|
||||||
orb $0x20,%al # To lower case
|
|
||||||
mov %al,(%di) # Save char
|
|
||||||
inc %di
|
|
||||||
ret # (Recursive)
|
|
||||||
|
|
||||||
#
|
|
||||||
# BTX client to start btxldr
|
|
||||||
#
|
|
||||||
.code32
|
|
||||||
btx_client: mov $(MEM_ARG_BTX-MEM_BTX_CLIENT+MEM_ARG_SIZE-4), %esi
|
|
||||||
# %ds:(%esi) -> end
|
|
||||||
# of boot[12] args
|
|
||||||
mov $(MEM_ARG_SIZE/4),%ecx # Number of words to push
|
|
||||||
std # Go backwards
|
|
||||||
push_arg: lodsl # Read argument
|
|
||||||
push %eax # Push it onto the stack
|
|
||||||
loop push_arg # Push all of the arguments
|
|
||||||
cld # In case anyone depends on this
|
|
||||||
pushl MEM_ARG_BTX-MEM_BTX_CLIENT+MEM_ARG_SIZE # Entry point of
|
|
||||||
# the loader
|
|
||||||
push %eax # Emulate a near call
|
|
||||||
mov $0x1,%eax # 'exec' system call
|
|
||||||
int $INT_SYS # BTX system call
|
|
||||||
btx_client_end:
|
|
||||||
.code16
|
|
||||||
|
|
||||||
.p2align 4
|
|
||||||
#
|
|
||||||
# Global descriptor table.
|
|
||||||
#
|
|
||||||
gdt: .word 0x0,0x0,0x0,0x0 # Null entry
|
|
||||||
.word 0xffff,0x0000,0x9200,0x00cf # SEL_SDATA
|
|
||||||
.word 0xffff,0x0000,0x9200,0x0000 # SEL_RDATA
|
|
||||||
.word 0xffff,LOAD_SEG<<4,0x9a00,0x00cf # SEL_SCODE (32-bit)
|
|
||||||
.word 0xffff,LOAD_SEG<<4,0x9a00,0x008f # SEL_SCODE16 (16-bit)
|
|
||||||
gdt.1:
|
|
||||||
#
|
|
||||||
# Pseudo-descriptors.
|
|
||||||
#
|
|
||||||
gdtdesc: .word gdt.1-gdt-1 # Limit
|
|
||||||
.long LOAD_SEG<<4 + gdt # Base
|
|
||||||
|
|
||||||
#
|
|
||||||
# BOOT device
|
|
||||||
#
|
|
||||||
drive: .byte 0
|
|
||||||
cylinder: .word 0
|
|
||||||
|
|
||||||
#
|
|
||||||
# State for searching dir
|
|
||||||
#
|
|
||||||
rec_lba: .long 0x0 # LBA (adjusted for EA)
|
|
||||||
rec_size: .long 0x0 # File size
|
|
||||||
name_len: .byte 0x0 # Length of current name
|
|
||||||
|
|
||||||
cursor: .word 0
|
|
||||||
twiddle_index: .byte 0x0
|
|
||||||
|
|
||||||
msg_welcome: .asciz "CD Loader 1.2\r\n\n"
|
|
||||||
msg_bootinfo: .asciz "Building the boot loader arguments\r\n"
|
|
||||||
msg_relocate: .asciz "Relocating the loader and the BTX\r\n"
|
|
||||||
msg_jump: .asciz "Starting the BTX loader\r\n"
|
|
||||||
msg_badread: .ascii "Read Error: 0x"
|
|
||||||
hex_error: .asciz "00\r\n"
|
|
||||||
msg_novd: .asciz "Could not find Primary Volume Descriptor\r\n"
|
|
||||||
msg_lookup: .asciz "Looking up "
|
|
||||||
msg_lookup2: .asciz "... "
|
|
||||||
msg_lookupok: .asciz "Found\r\n"
|
|
||||||
msg_lookupfail: .asciz "File not found\r\n"
|
|
||||||
msg_load2big: .asciz "File too big\r\n"
|
|
||||||
msg_failed: .asciz "Boot failed\r\n"
|
|
||||||
twiddle_chars: .ascii "|/-\\"
|
|
||||||
loader_paths: .asciz "/BOOT.PC98/LOADER"
|
|
||||||
.asciz "/boot.pc98/loader"
|
|
||||||
.asciz "/BOOT/LOADER"
|
|
||||||
.asciz "/boot/loader"
|
|
||||||
.byte 0
|
|
||||||
|
|
||||||
/* Boot signature */
|
|
||||||
|
|
||||||
.org SIG2_OFF,0x90
|
|
||||||
|
|
||||||
.word 0xaa55 # Magic number
|
|
@ -1,20 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
PROG= kgzldr.o
|
|
||||||
STRIP=
|
|
||||||
BINMODE=${LIBMODE}
|
|
||||||
BINDIR= ${LIBDIR}
|
|
||||||
MAN=
|
|
||||||
|
|
||||||
SRCS= start.s boot.c inflate.c lib.c crt.s sio.s
|
|
||||||
CFLAGS= -Os
|
|
||||||
CFLAGS+=-DKZIP
|
|
||||||
NO_SHARED=
|
|
||||||
LDFLAGS=-Wl,-r
|
|
||||||
.PATH: ${.CURDIR}/../../../kern
|
|
||||||
.PATH: ${.CURDIR}/../../i386/kgzldr
|
|
||||||
|
|
||||||
BOOT_COMCONSOLE_PORT?= 0x238
|
|
||||||
AFLAGS+=--defsym SIO_PRT=${BOOT_COMCONSOLE_PORT}
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
@ -1,89 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 1999 Global Technology Associates, Inc.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
# 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 AND CONTRIBUTORS``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 OR CONTRIBUTORS
|
|
||||||
# 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.
|
|
||||||
#
|
|
||||||
# From: btx.s 1.10 1999/02/25 16:27:41 rnordier
|
|
||||||
# $FreeBSD$
|
|
||||||
#
|
|
||||||
|
|
||||||
# Screen defaults and assumptions.
|
|
||||||
|
|
||||||
.set SCR_MAT,0xe1 # Mode/attribute
|
|
||||||
.set SCR_COL,0x50 # Columns per row
|
|
||||||
.set SCR_ROW,0x19 # Rows per screen
|
|
||||||
|
|
||||||
# BIOS Data Area locations.
|
|
||||||
|
|
||||||
.set BDA_POS,0x53e # Cursor position
|
|
||||||
|
|
||||||
.globl crt_putchr
|
|
||||||
|
|
||||||
# void crt_putchr(int c)
|
|
||||||
|
|
||||||
crt_putchr: movb 0x4(%esp,1),%al # Get character
|
|
||||||
pusha # Save
|
|
||||||
xorl %ecx,%ecx # Zero for loops
|
|
||||||
movb $SCR_MAT,%ah # Mode/attribute
|
|
||||||
movl $BDA_POS,%ebx # BDA pointer
|
|
||||||
movw (%ebx),%dx # Cursor position
|
|
||||||
movl $0xa0000,%edi
|
|
||||||
crt_putchr.1: cmpb $0xa,%al # New line?
|
|
||||||
je crt_putchr.2 # Yes
|
|
||||||
movw %dx,%cx
|
|
||||||
movb %al,(%edi,%ecx,1) # Write char
|
|
||||||
addl $0x2000,%ecx
|
|
||||||
movb %ah,(%edi,%ecx,1) # Write attr
|
|
||||||
addw $0x02,%dx
|
|
||||||
jmp crt_putchr.3
|
|
||||||
crt_putchr.2: movw %dx,%ax
|
|
||||||
movb $SCR_COL*2,%dl
|
|
||||||
div %dl
|
|
||||||
incb %al
|
|
||||||
mul %dl
|
|
||||||
movw %ax,%dx
|
|
||||||
crt_putchr.3: cmpw $SCR_ROW*SCR_COL*2,%dx
|
|
||||||
jb crt_putchr.4 # No
|
|
||||||
leal 2*SCR_COL(%edi),%esi # New top line
|
|
||||||
movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move
|
|
||||||
rep # Scroll
|
|
||||||
movsl # screen
|
|
||||||
movb $' ',%al # Space
|
|
||||||
xorb %ah,%ah
|
|
||||||
movb $SCR_COL,%cl # Columns to clear
|
|
||||||
rep # Clear
|
|
||||||
stosw # line
|
|
||||||
movw $(SCR_ROW-1)*SCR_COL*2,%dx
|
|
||||||
crt_putchr.4: movw %dx,(%ebx) # Update position
|
|
||||||
shrw $1,%dx
|
|
||||||
crt_putchr.5: inb $0x60,%al # Move cursor
|
|
||||||
testb $0x04,%al
|
|
||||||
jz crt_putchr.5
|
|
||||||
movb $0x49,%al
|
|
||||||
outb %al,$0x62
|
|
||||||
movb %dl,%al
|
|
||||||
outb %al,$0x60
|
|
||||||
movb %dh,%al
|
|
||||||
outb %al,$0x60
|
|
||||||
popa # Restore
|
|
||||||
ret # To caller
|
|
@ -1,51 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
#
|
|
||||||
LIB= pc98
|
|
||||||
INTERNALLIB=
|
|
||||||
|
|
||||||
.PATH: ${.CURDIR}/../../i386/libi386
|
|
||||||
|
|
||||||
SRCS= bioscd.c biosdisk.c biosmem.c biospnp.c \
|
|
||||||
biospci.c biossmap.c bootinfo.c bootinfo32.c \
|
|
||||||
comconsole.c devicename.c elf32_freebsd.c \
|
|
||||||
i386_copy.c i386_module.c nullconsole.c pc98_sys.c pxe.c pxetramp.s \
|
|
||||||
time.c vidconsole.c
|
|
||||||
.PATH: ${.CURDIR}/../../zfs
|
|
||||||
SRCS+= devicename_stubs.c
|
|
||||||
|
|
||||||
# Enable PXE TFTP or NFS support, not both.
|
|
||||||
.if defined(LOADER_TFTP_SUPPORT)
|
|
||||||
CFLAGS+= -DLOADER_TFTP_SUPPORT
|
|
||||||
.else
|
|
||||||
CFLAGS+= -DLOADER_NFS_SUPPORT
|
|
||||||
.endif
|
|
||||||
|
|
||||||
BOOT_COMCONSOLE_PORT?= 0x238
|
|
||||||
CFLAGS+= -DCOMPORT=${BOOT_COMCONSOLE_PORT}
|
|
||||||
|
|
||||||
BOOT_COMCONSOLE_SPEED?= 9600
|
|
||||||
CFLAGS+= -DCOMSPEED=${BOOT_COMCONSOLE_SPEED}
|
|
||||||
|
|
||||||
.ifdef(BOOT_BIOSDISK_DEBUG)
|
|
||||||
# Make the disk code more talkative
|
|
||||||
CFLAGS+= -DDISK_DEBUG
|
|
||||||
.endif
|
|
||||||
|
|
||||||
# Include simple terminal emulation (cons25-compatible)
|
|
||||||
CFLAGS+= -DTERM_EMU
|
|
||||||
|
|
||||||
# XXX: make alloca() useable
|
|
||||||
CFLAGS+= -Dalloca=__builtin_alloca
|
|
||||||
|
|
||||||
CFLAGS+= -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/i386 \
|
|
||||||
-I${.CURDIR}/../../common \
|
|
||||||
-I${.CURDIR}/../btx/lib \
|
|
||||||
-I${.CURDIR}/../../i386/libi386 \
|
|
||||||
-I${.CURDIR}/../../.. -I.
|
|
||||||
# the location of libstand
|
|
||||||
CFLAGS+= -I${.CURDIR}/../../../../lib/libstand/
|
|
||||||
|
|
||||||
# Handle FreeBSD specific %b and %D printf format specifiers
|
|
||||||
CFLAGS+= ${FORMAT_EXTENSIONS}
|
|
||||||
|
|
||||||
.include <bsd.lib.mk>
|
|
@ -1,420 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
|
|
||||||
* Copyright (c) 2001 John H. Baldwin <jhb@FreeBSD.org>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* BIOS CD device handling for CD's that have been booted off of via no
|
|
||||||
* emulation booting as defined in the El Torito standard.
|
|
||||||
*
|
|
||||||
* Ideas and algorithms from:
|
|
||||||
*
|
|
||||||
* - FreeBSD libi386/biosdisk.c
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stand.h>
|
|
||||||
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <machine/bootinfo.h>
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include <bootstrap.h>
|
|
||||||
#include <btxv86.h>
|
|
||||||
#include "libi386.h"
|
|
||||||
|
|
||||||
#define BIOSCD_SECSIZE 2048
|
|
||||||
#define BUFSIZE (1 * BIOSCD_SECSIZE)
|
|
||||||
#define MAXBCDEV 1
|
|
||||||
|
|
||||||
/* Major numbers for devices we frontend for. */
|
|
||||||
#define ACDMAJOR 117
|
|
||||||
#define CDMAJOR 15
|
|
||||||
|
|
||||||
#ifdef DISK_DEBUG
|
|
||||||
# define DEBUG(fmt, args...) printf("%s: " fmt "\n" , __func__ , ## args)
|
|
||||||
#else
|
|
||||||
# define DEBUG(fmt, args...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct specification_packet {
|
|
||||||
u_char sp_size;
|
|
||||||
u_char sp_bootmedia;
|
|
||||||
u_char sp_drive;
|
|
||||||
u_char sp_controller;
|
|
||||||
u_int sp_lba;
|
|
||||||
u_short sp_devicespec;
|
|
||||||
u_short sp_buffersegment;
|
|
||||||
u_short sp_loadsegment;
|
|
||||||
u_short sp_sectorcount;
|
|
||||||
u_short sp_cylsec;
|
|
||||||
u_char sp_head;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* List of BIOS devices, translation from disk unit number to
|
|
||||||
* BIOS unit number.
|
|
||||||
*/
|
|
||||||
static struct bcinfo {
|
|
||||||
int bc_unit; /* BIOS unit number */
|
|
||||||
struct specification_packet bc_sp;
|
|
||||||
int bc_open; /* reference counter */
|
|
||||||
void *bc_bcache; /* buffer cache data */
|
|
||||||
} bcinfo [MAXBCDEV];
|
|
||||||
static int nbcinfo = 0;
|
|
||||||
|
|
||||||
#define BC(dev) (bcinfo[(dev)->d_unit])
|
|
||||||
|
|
||||||
static int bc_read(int unit, daddr_t dblk, int blks, caddr_t dest);
|
|
||||||
static int bc_init(void);
|
|
||||||
static int bc_strategy(void *devdata, int flag, daddr_t dblk,
|
|
||||||
size_t size, char *buf, size_t *rsize);
|
|
||||||
static int bc_realstrategy(void *devdata, int flag, daddr_t dblk,
|
|
||||||
size_t size, char *buf, size_t *rsize);
|
|
||||||
static int bc_open(struct open_file *f, ...);
|
|
||||||
static int bc_close(struct open_file *f);
|
|
||||||
static int bc_print(int verbose);
|
|
||||||
|
|
||||||
struct devsw bioscd = {
|
|
||||||
"cd",
|
|
||||||
DEVT_CD,
|
|
||||||
bc_init,
|
|
||||||
bc_strategy,
|
|
||||||
bc_open,
|
|
||||||
bc_close,
|
|
||||||
noioctl,
|
|
||||||
bc_print,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Translate between BIOS device numbers and our private unit numbers.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
bc_bios2unit(int biosdev)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
DEBUG("looking for bios device 0x%x", biosdev);
|
|
||||||
for (i = 0; i < nbcinfo; i++) {
|
|
||||||
DEBUG("bc unit %d is BIOS device 0x%x", i, bcinfo[i].bc_unit);
|
|
||||||
if (bcinfo[i].bc_unit == biosdev)
|
|
||||||
return(i);
|
|
||||||
}
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
bc_unit2bios(int unit)
|
|
||||||
{
|
|
||||||
if ((unit >= 0) && (unit < nbcinfo))
|
|
||||||
return(bcinfo[unit].bc_unit);
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We can't quiz, we have to be told what device to use, so this functoin
|
|
||||||
* doesn't do anything. Instead, the loader calls bc_add() with the BIOS
|
|
||||||
* device number to add.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
bc_init(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
bc_add(int biosdev)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (nbcinfo >= MAXBCDEV)
|
|
||||||
return (-1);
|
|
||||||
bcinfo[nbcinfo].bc_unit = biosdev;
|
|
||||||
|
|
||||||
/* SCSI CD-ROM only */
|
|
||||||
if ((biosdev & 0xf0) != 0xa0)
|
|
||||||
return (-1);
|
|
||||||
if ((((uint32_t *)PTOV(0xA1460))[biosdev & 0x0f] & 0x1f) != 5)
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
printf("BIOS CD is cd%d\n", nbcinfo);
|
|
||||||
nbcinfo++;
|
|
||||||
bcache_add_dev(nbcinfo); /* register cd device in bcache */
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Print information about disks
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
bc_print(int verbose)
|
|
||||||
{
|
|
||||||
char line[80];
|
|
||||||
int i, ret = 0;
|
|
||||||
|
|
||||||
if (nbcinfo == 0)
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
printf("%s devices:", bioscd.dv_name);
|
|
||||||
if ((ret = pager_output("\n")) != 0)
|
|
||||||
return (ret);
|
|
||||||
|
|
||||||
for (i = 0; i < nbcinfo; i++) {
|
|
||||||
sprintf(line, " cd%d: Device 0x%x\n", i,
|
|
||||||
bcinfo[i].bc_sp.sp_devicespec);
|
|
||||||
if ((ret = pager_output(line)) != 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return (ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Attempt to open the disk described by (dev) for use by (f).
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
bc_open(struct open_file *f, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
struct i386_devdesc *dev;
|
|
||||||
|
|
||||||
va_start(ap, f);
|
|
||||||
dev = va_arg(ap, struct i386_devdesc *);
|
|
||||||
va_end(ap);
|
|
||||||
if (dev->d_unit >= nbcinfo) {
|
|
||||||
DEBUG("attempt to open nonexistent disk");
|
|
||||||
return(ENXIO);
|
|
||||||
}
|
|
||||||
|
|
||||||
BC(dev).bc_open++;
|
|
||||||
if (BC(dev).bc_bcache == NULL)
|
|
||||||
BC(dev).bc_bcache = bcache_allocate();
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
bc_close(struct open_file *f)
|
|
||||||
{
|
|
||||||
struct i386_devdesc *dev;
|
|
||||||
|
|
||||||
dev = (struct i386_devdesc *)f->f_devdata;
|
|
||||||
BC(dev).bc_open--;
|
|
||||||
if (BC(dev).bc_open == 0) {
|
|
||||||
bcache_free(BC(dev).bc_bcache);
|
|
||||||
BC(dev).bc_bcache = NULL;
|
|
||||||
}
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
bc_strategy(void *devdata, int rw, daddr_t dblk, size_t size,
|
|
||||||
char *buf, size_t *rsize)
|
|
||||||
{
|
|
||||||
struct bcache_devdata bcd;
|
|
||||||
struct i386_devdesc *dev;
|
|
||||||
|
|
||||||
dev = (struct i386_devdesc *)devdata;
|
|
||||||
bcd.dv_strategy = bc_realstrategy;
|
|
||||||
bcd.dv_devdata = devdata;
|
|
||||||
bcd.dv_cache = BC(dev).bc_bcache;
|
|
||||||
|
|
||||||
return (bcache_strategy(&bcd, rw, dblk, size, buf, rsize));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
bc_realstrategy(void *devdata, int rw, daddr_t dblk, size_t size,
|
|
||||||
char *buf, size_t *rsize)
|
|
||||||
{
|
|
||||||
struct i386_devdesc *dev;
|
|
||||||
int unit;
|
|
||||||
int blks;
|
|
||||||
#ifdef BD_SUPPORT_FRAGS
|
|
||||||
char fragbuf[BIOSCD_SECSIZE];
|
|
||||||
size_t fragsize;
|
|
||||||
|
|
||||||
fragsize = size % BIOSCD_SECSIZE;
|
|
||||||
#else
|
|
||||||
if (size % BIOSCD_SECSIZE)
|
|
||||||
return (EINVAL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (rw != F_READ)
|
|
||||||
return(EROFS);
|
|
||||||
dev = (struct i386_devdesc *)devdata;
|
|
||||||
unit = dev->d_unit;
|
|
||||||
blks = size / BIOSCD_SECSIZE;
|
|
||||||
if (dblk % (BIOSCD_SECSIZE / DEV_BSIZE) != 0)
|
|
||||||
return (EINVAL);
|
|
||||||
dblk /= (BIOSCD_SECSIZE / DEV_BSIZE);
|
|
||||||
DEBUG("read %d from %lld to %p", blks, dblk, buf);
|
|
||||||
|
|
||||||
if (rsize)
|
|
||||||
*rsize = 0;
|
|
||||||
if (blks && bc_read(unit, dblk, blks, buf)) {
|
|
||||||
DEBUG("read error");
|
|
||||||
return (EIO);
|
|
||||||
}
|
|
||||||
#ifdef BD_SUPPORT_FRAGS
|
|
||||||
DEBUG("frag read %d from %lld+%d to %p",
|
|
||||||
fragsize, dblk, blks, buf + (blks * BIOSCD_SECSIZE));
|
|
||||||
if (fragsize && bc_read(unit, dblk + blks, 1, fragbuf)) {
|
|
||||||
DEBUG("frag read error");
|
|
||||||
return(EIO);
|
|
||||||
}
|
|
||||||
bcopy(fragbuf, buf + (blks * BIOSCD_SECSIZE), fragsize);
|
|
||||||
#endif
|
|
||||||
if (rsize)
|
|
||||||
*rsize = size;
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Max number of sectors to bounce-buffer at a time. */
|
|
||||||
#define CD_BOUNCEBUF 8
|
|
||||||
|
|
||||||
static int
|
|
||||||
bc_read(int unit, daddr_t dblk, int blks, caddr_t dest)
|
|
||||||
{
|
|
||||||
u_int maxfer, resid, result, retry, x;
|
|
||||||
caddr_t bbuf, p, xp;
|
|
||||||
int biosdev;
|
|
||||||
#ifdef DISK_DEBUG
|
|
||||||
int error;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Just in case some idiot actually tries to read -1 blocks... */
|
|
||||||
if (blks < 0)
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
/* If nothing to do, just return succcess. */
|
|
||||||
if (blks == 0)
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
/* Decide whether we have to bounce */
|
|
||||||
if (VTOP(dest) >> 20 != 0) {
|
|
||||||
/*
|
|
||||||
* The destination buffer is above first 1MB of
|
|
||||||
* physical memory so we have to arrange a suitable
|
|
||||||
* bounce buffer.
|
|
||||||
*/
|
|
||||||
x = min(CD_BOUNCEBUF, (unsigned)blks);
|
|
||||||
bbuf = alloca(x * BIOSCD_SECSIZE);
|
|
||||||
maxfer = x;
|
|
||||||
} else {
|
|
||||||
bbuf = NULL;
|
|
||||||
maxfer = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
biosdev = bc_unit2bios(unit);
|
|
||||||
resid = blks;
|
|
||||||
p = dest;
|
|
||||||
|
|
||||||
while (resid > 0) {
|
|
||||||
if (bbuf)
|
|
||||||
xp = bbuf;
|
|
||||||
else
|
|
||||||
xp = p;
|
|
||||||
x = resid;
|
|
||||||
if (maxfer > 0)
|
|
||||||
x = min(x, maxfer);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Loop retrying the operation a couple of times. The BIOS
|
|
||||||
* may also retry.
|
|
||||||
*/
|
|
||||||
for (retry = 0; retry < 3; retry++) {
|
|
||||||
/* If retrying, reset the drive */
|
|
||||||
if (retry > 0) {
|
|
||||||
v86.ctl = V86_FLAGS;
|
|
||||||
v86.addr = 0x1b;
|
|
||||||
v86.eax = 0x0300 | biosdev;
|
|
||||||
v86int();
|
|
||||||
}
|
|
||||||
|
|
||||||
v86.ctl = V86_FLAGS;
|
|
||||||
v86.addr = 0x1b;
|
|
||||||
v86.eax = 0x0600 | (biosdev & 0x7f);
|
|
||||||
v86.ebx = x * BIOSCD_SECSIZE;
|
|
||||||
v86.ecx = dblk & 0xffff;
|
|
||||||
v86.edx = (dblk >> 16) & 0xffff;
|
|
||||||
v86.ebp = VTOPOFF(xp);
|
|
||||||
v86.es = VTOPSEG(xp);
|
|
||||||
v86int();
|
|
||||||
result = V86_CY(v86.efl);
|
|
||||||
if (result == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DISK_DEBUG
|
|
||||||
error = (v86.eax >> 8) & 0xff;
|
|
||||||
#endif
|
|
||||||
DEBUG("%d sectors from %lld to %p (0x%x) %s", x, dblk, p,
|
|
||||||
VTOP(p), result ? "failed" : "ok");
|
|
||||||
DEBUG("unit %d status 0x%x", unit, error);
|
|
||||||
if (bbuf != NULL)
|
|
||||||
bcopy(bbuf, p, x * BIOSCD_SECSIZE);
|
|
||||||
p += (x * BIOSCD_SECSIZE);
|
|
||||||
dblk += x;
|
|
||||||
resid -= x;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* hexdump(dest, (blks * BIOSCD_SECSIZE)); */
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return a suitable dev_t value for (dev).
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
bc_getdev(struct i386_devdesc *dev)
|
|
||||||
{
|
|
||||||
int biosdev, unit, device;
|
|
||||||
int major;
|
|
||||||
int rootdev;
|
|
||||||
|
|
||||||
unit = dev->d_unit;
|
|
||||||
biosdev = bc_unit2bios(unit);
|
|
||||||
DEBUG("unit %d BIOS device %d", unit, biosdev);
|
|
||||||
if (biosdev == -1) /* not a BIOS device */
|
|
||||||
return(-1);
|
|
||||||
|
|
||||||
device = biosdev & 0xf0;
|
|
||||||
if (device == 0x80)
|
|
||||||
major = ACDMAJOR;
|
|
||||||
else if (device == 0xa0)
|
|
||||||
major = CDMAJOR;
|
|
||||||
else
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
unit = 0; /* XXX */
|
|
||||||
|
|
||||||
/* XXX: Assume partition 'a'. */
|
|
||||||
rootdev = MAKEBOOTDEV(major, 0, unit, 0);
|
|
||||||
DEBUG("dev is 0x%x\n", rootdev);
|
|
||||||
return(rootdev);
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -1,64 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Obtain memory configuration information from the BIOS
|
|
||||||
*/
|
|
||||||
#include <stand.h>
|
|
||||||
#include "libi386.h"
|
|
||||||
#include "btxv86.h"
|
|
||||||
|
|
||||||
vm_offset_t memtop, memtop_copyin, high_heap_base;
|
|
||||||
uint32_t bios_basemem, bios_extmem, high_heap_size;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The minimum amount of memory to reserve in bios_extmem for the heap.
|
|
||||||
*/
|
|
||||||
#define HEAP_MIN (64 * 1024 * 1024)
|
|
||||||
|
|
||||||
void
|
|
||||||
bios_getmem(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
bios_basemem = ((*(u_char *)PTOV(0xA1501) & 0x07) + 1) * 128 * 1024;
|
|
||||||
bios_extmem = *(u_char *)PTOV(0xA1401) * 128 * 1024 +
|
|
||||||
*(u_int16_t *)PTOV(0xA1594) * 1024 * 1024;
|
|
||||||
|
|
||||||
/* Set memtop to actual top of memory */
|
|
||||||
memtop = memtop_copyin = 0x100000 + bios_extmem;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we have extended memory, use the last 3MB of 'extended' memory
|
|
||||||
* as a high heap candidate.
|
|
||||||
*/
|
|
||||||
if (bios_extmem >= HEAP_MIN) {
|
|
||||||
high_heap_size = HEAP_MIN;
|
|
||||||
high_heap_base = memtop - HEAP_MIN;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright (c) 2006 TAKAHASHI Yoshihiro <nyan@FreeBSD.org>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include <stand.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include "libi386.h"
|
|
||||||
|
|
||||||
void
|
|
||||||
bios_addsmapdata(struct preloaded_file *kfp)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
@ -1,367 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright (c) 1998 Michael Smith (msmith@freebsd.org)
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include <stand.h>
|
|
||||||
#include <bootstrap.h>
|
|
||||||
#include <machine/cpufunc.h>
|
|
||||||
#include <dev/ic/ns16550.h>
|
|
||||||
#include <dev/pci/pcireg.h>
|
|
||||||
#include "libi386.h"
|
|
||||||
|
|
||||||
#define COMC_FMT 0x3 /* 8N1 */
|
|
||||||
#define COMC_TXWAIT 0x40000 /* transmit timeout */
|
|
||||||
#define COMC_BPS(x) (115200 / (x)) /* speed to DLAB divisor */
|
|
||||||
#define COMC_DIV2BPS(x) (115200 / (x)) /* DLAB divisor to speed */
|
|
||||||
|
|
||||||
#ifndef COMPORT
|
|
||||||
#define COMPORT 0x238
|
|
||||||
#endif
|
|
||||||
#ifndef COMSPEED
|
|
||||||
#define COMSPEED 9600
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void comc_probe(struct console *cp);
|
|
||||||
static int comc_init(int arg);
|
|
||||||
static void comc_putchar(int c);
|
|
||||||
static int comc_getchar(void);
|
|
||||||
static int comc_getspeed(void);
|
|
||||||
static int comc_ischar(void);
|
|
||||||
static int comc_parseint(const char *string);
|
|
||||||
static uint32_t comc_parse_pcidev(const char *string);
|
|
||||||
static int comc_pcidev_set(struct env_var *ev, int flags,
|
|
||||||
const void *value);
|
|
||||||
static int comc_pcidev_handle(uint32_t locator);
|
|
||||||
static int comc_port_set(struct env_var *ev, int flags,
|
|
||||||
const void *value);
|
|
||||||
static void comc_setup(int speed, int port);
|
|
||||||
static int comc_speed_set(struct env_var *ev, int flags,
|
|
||||||
const void *value);
|
|
||||||
|
|
||||||
static int comc_curspeed;
|
|
||||||
static int comc_port = COMPORT;
|
|
||||||
static uint32_t comc_locator;
|
|
||||||
|
|
||||||
struct console comconsole = {
|
|
||||||
"comconsole",
|
|
||||||
"serial port",
|
|
||||||
0,
|
|
||||||
comc_probe,
|
|
||||||
comc_init,
|
|
||||||
comc_putchar,
|
|
||||||
comc_getchar,
|
|
||||||
comc_ischar
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
|
||||||
comc_probe(struct console *cp)
|
|
||||||
{
|
|
||||||
char intbuf[16];
|
|
||||||
char *cons, *env;
|
|
||||||
int speed, port;
|
|
||||||
uint32_t locator;
|
|
||||||
|
|
||||||
if (comc_curspeed == 0) {
|
|
||||||
comc_curspeed = COMSPEED;
|
|
||||||
/*
|
|
||||||
* Assume that the speed was set by an earlier boot loader if
|
|
||||||
* comconsole is already the preferred console.
|
|
||||||
*/
|
|
||||||
cons = getenv("console");
|
|
||||||
if ((cons != NULL && strcmp(cons, comconsole.c_name) == 0) ||
|
|
||||||
getenv("boot_multicons") != NULL) {
|
|
||||||
comc_curspeed = comc_getspeed();
|
|
||||||
}
|
|
||||||
|
|
||||||
env = getenv("comconsole_speed");
|
|
||||||
if (env != NULL) {
|
|
||||||
speed = comc_parseint(env);
|
|
||||||
if (speed > 0)
|
|
||||||
comc_curspeed = speed;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(intbuf, "%d", comc_curspeed);
|
|
||||||
unsetenv("comconsole_speed");
|
|
||||||
env_setenv("comconsole_speed", EV_VOLATILE, intbuf, comc_speed_set,
|
|
||||||
env_nounset);
|
|
||||||
|
|
||||||
env = getenv("comconsole_port");
|
|
||||||
if (env != NULL) {
|
|
||||||
port = comc_parseint(env);
|
|
||||||
if (port > 0)
|
|
||||||
comc_port = port;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(intbuf, "%d", comc_port);
|
|
||||||
unsetenv("comconsole_port");
|
|
||||||
env_setenv("comconsole_port", EV_VOLATILE, intbuf, comc_port_set,
|
|
||||||
env_nounset);
|
|
||||||
|
|
||||||
env = getenv("comconsole_pcidev");
|
|
||||||
if (env != NULL) {
|
|
||||||
locator = comc_parse_pcidev(env);
|
|
||||||
if (locator != 0)
|
|
||||||
comc_pcidev_handle(locator);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsetenv("comconsole_pcidev");
|
|
||||||
env_setenv("comconsole_pcidev", EV_VOLATILE, env, comc_pcidev_set,
|
|
||||||
env_nounset);
|
|
||||||
}
|
|
||||||
comc_setup(comc_curspeed, comc_port);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
comc_init(int arg)
|
|
||||||
{
|
|
||||||
|
|
||||||
comc_setup(comc_curspeed, comc_port);
|
|
||||||
|
|
||||||
if ((comconsole.c_flags & (C_PRESENTIN | C_PRESENTOUT)) ==
|
|
||||||
(C_PRESENTIN | C_PRESENTOUT))
|
|
||||||
return (CMD_OK);
|
|
||||||
return (CMD_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
comc_putchar(int c)
|
|
||||||
{
|
|
||||||
int wait;
|
|
||||||
|
|
||||||
for (wait = COMC_TXWAIT; wait > 0; wait--)
|
|
||||||
if (inb(comc_port + com_lsr) & LSR_TXRDY) {
|
|
||||||
outb(comc_port + com_data, (u_char)c);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
comc_getchar(void)
|
|
||||||
{
|
|
||||||
return (comc_ischar() ? inb(comc_port + com_data) : -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
comc_ischar(void)
|
|
||||||
{
|
|
||||||
return (inb(comc_port + com_lsr) & LSR_RXRDY);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
comc_speed_set(struct env_var *ev, int flags, const void *value)
|
|
||||||
{
|
|
||||||
int speed;
|
|
||||||
|
|
||||||
if (value == NULL || (speed = comc_parseint(value)) <= 0) {
|
|
||||||
printf("Invalid speed\n");
|
|
||||||
return (CMD_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (comc_curspeed != speed)
|
|
||||||
comc_setup(speed, comc_port);
|
|
||||||
|
|
||||||
env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL);
|
|
||||||
|
|
||||||
return (CMD_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
comc_port_set(struct env_var *ev, int flags, const void *value)
|
|
||||||
{
|
|
||||||
int port;
|
|
||||||
|
|
||||||
if (value == NULL || (port = comc_parseint(value)) <= 0) {
|
|
||||||
printf("Invalid port\n");
|
|
||||||
return (CMD_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (comc_port != port)
|
|
||||||
comc_setup(comc_curspeed, port);
|
|
||||||
|
|
||||||
env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL);
|
|
||||||
|
|
||||||
return (CMD_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Input: bus:dev:func[:bar]. If bar is not specified, it is 0x10.
|
|
||||||
* Output: bar[24:16] bus[15:8] dev[7:3] func[2:0]
|
|
||||||
*/
|
|
||||||
static uint32_t
|
|
||||||
comc_parse_pcidev(const char *string)
|
|
||||||
{
|
|
||||||
char *p, *p1;
|
|
||||||
uint8_t bus, dev, func, bar;
|
|
||||||
uint32_t locator;
|
|
||||||
int pres;
|
|
||||||
|
|
||||||
pres = strtol(string, &p, 0);
|
|
||||||
if (p == string || *p != ':' || pres < 0 )
|
|
||||||
return (0);
|
|
||||||
bus = pres;
|
|
||||||
p1 = ++p;
|
|
||||||
|
|
||||||
pres = strtol(p1, &p, 0);
|
|
||||||
if (p == string || *p != ':' || pres < 0 )
|
|
||||||
return (0);
|
|
||||||
dev = pres;
|
|
||||||
p1 = ++p;
|
|
||||||
|
|
||||||
pres = strtol(p1, &p, 0);
|
|
||||||
if (p == string || (*p != ':' && *p != '\0') || pres < 0 )
|
|
||||||
return (0);
|
|
||||||
func = pres;
|
|
||||||
|
|
||||||
if (*p == ':') {
|
|
||||||
p1 = ++p;
|
|
||||||
pres = strtol(p1, &p, 0);
|
|
||||||
if (p == string || *p != '\0' || pres <= 0 )
|
|
||||||
return (0);
|
|
||||||
bar = pres;
|
|
||||||
} else
|
|
||||||
bar = 0x10;
|
|
||||||
|
|
||||||
locator = (bar << 16) | biospci_locator(bus, dev, func);
|
|
||||||
return (locator);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
comc_pcidev_handle(uint32_t locator)
|
|
||||||
{
|
|
||||||
char intbuf[64];
|
|
||||||
uint32_t port;
|
|
||||||
|
|
||||||
if (biospci_read_config(locator & 0xffff,
|
|
||||||
(locator & 0xff0000) >> 16, 2, &port) == -1) {
|
|
||||||
printf("Cannot read bar at 0x%x\n", locator);
|
|
||||||
return (CMD_ERROR);
|
|
||||||
}
|
|
||||||
if (!PCI_BAR_IO(port)) {
|
|
||||||
printf("Memory bar at 0x%x\n", locator);
|
|
||||||
return (CMD_ERROR);
|
|
||||||
}
|
|
||||||
port &= PCIM_BAR_IO_BASE;
|
|
||||||
|
|
||||||
sprintf(intbuf, "%d", port);
|
|
||||||
unsetenv("comconsole_port");
|
|
||||||
env_setenv("comconsole_port", EV_VOLATILE, intbuf,
|
|
||||||
comc_port_set, env_nounset);
|
|
||||||
|
|
||||||
comc_setup(comc_curspeed, port);
|
|
||||||
comc_locator = locator;
|
|
||||||
|
|
||||||
return (CMD_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
comc_pcidev_set(struct env_var *ev, int flags, const void *value)
|
|
||||||
{
|
|
||||||
uint32_t locator;
|
|
||||||
int error;
|
|
||||||
|
|
||||||
if (value == NULL || (locator = comc_parse_pcidev(value)) <= 0) {
|
|
||||||
printf("Invalid pcidev\n");
|
|
||||||
return (CMD_ERROR);
|
|
||||||
}
|
|
||||||
if ((comconsole.c_flags & (C_ACTIVEIN | C_ACTIVEOUT)) != 0 &&
|
|
||||||
comc_locator != locator) {
|
|
||||||
error = comc_pcidev_handle(locator);
|
|
||||||
if (error != CMD_OK)
|
|
||||||
return (error);
|
|
||||||
}
|
|
||||||
env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL);
|
|
||||||
return (CMD_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
comc_setup(int speed, int port)
|
|
||||||
{
|
|
||||||
static int TRY_COUNT = 1000000;
|
|
||||||
char intbuf[64];
|
|
||||||
int tries;
|
|
||||||
|
|
||||||
unsetenv("hw.uart.console");
|
|
||||||
comc_curspeed = speed;
|
|
||||||
comc_port = port;
|
|
||||||
if ((comconsole.c_flags & (C_ACTIVEIN | C_ACTIVEOUT)) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
outb(comc_port + com_cfcr, CFCR_DLAB | COMC_FMT);
|
|
||||||
outb(comc_port + com_dlbl, COMC_BPS(speed) & 0xff);
|
|
||||||
outb(comc_port + com_dlbh, COMC_BPS(speed) >> 8);
|
|
||||||
outb(comc_port + com_cfcr, COMC_FMT);
|
|
||||||
outb(comc_port + com_mcr, MCR_RTS | MCR_DTR);
|
|
||||||
|
|
||||||
tries = 0;
|
|
||||||
do
|
|
||||||
inb(comc_port + com_data);
|
|
||||||
while (inb(comc_port + com_lsr) & LSR_RXRDY && ++tries < TRY_COUNT);
|
|
||||||
|
|
||||||
if (tries < TRY_COUNT) {
|
|
||||||
comconsole.c_flags |= (C_PRESENTIN | C_PRESENTOUT);
|
|
||||||
sprintf(intbuf, "io:%d,br:%d", comc_port, comc_curspeed);
|
|
||||||
env_setenv("hw.uart.console", EV_VOLATILE, intbuf, NULL, NULL);
|
|
||||||
} else
|
|
||||||
comconsole.c_flags &= ~(C_PRESENTIN | C_PRESENTOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
comc_parseint(const char *speedstr)
|
|
||||||
{
|
|
||||||
char *p;
|
|
||||||
int speed;
|
|
||||||
|
|
||||||
speed = strtol(speedstr, &p, 0);
|
|
||||||
if (p == speedstr || *p != '\0' || speed <= 0)
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
return (speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
comc_getspeed(void)
|
|
||||||
{
|
|
||||||
u_int divisor;
|
|
||||||
u_char dlbh;
|
|
||||||
u_char dlbl;
|
|
||||||
u_char cfcr;
|
|
||||||
|
|
||||||
cfcr = inb(comc_port + com_cfcr);
|
|
||||||
outb(comc_port + com_cfcr, CFCR_DLAB | cfcr);
|
|
||||||
|
|
||||||
dlbl = inb(comc_port + com_dlbl);
|
|
||||||
dlbh = inb(comc_port + com_dlbh);
|
|
||||||
|
|
||||||
outb(comc_port + com_cfcr, cfcr);
|
|
||||||
|
|
||||||
divisor = dlbh << 8 | dlbl;
|
|
||||||
|
|
||||||
/* XXX there should be more sanity checking. */
|
|
||||||
if (divisor == 0)
|
|
||||||
return (COMSPEED);
|
|
||||||
return (COMC_DIV2BPS(divisor));
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright (c) 2009 TAKAHASHI Yoshihiro <nyan@FreeBSD.org>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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$
|
|
||||||
*/
|
|
||||||
|
|
||||||
void set_machine_type(void);
|
|
@ -1,78 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright (c) 2009 TAKAHASHI Yoshihiro <nyan@FreeBSD.org>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include <btxv86.h>
|
|
||||||
#include <machine/cpufunc.h>
|
|
||||||
#define _KERNEL
|
|
||||||
#include <pc98/pc98/pc98_machdep.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set machine type to PC98_SYSTEM_PARAMETER.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
set_machine_type(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
u_long ret, data;
|
|
||||||
|
|
||||||
/* PC98_SYSTEM_PARAMETER (0x501) */
|
|
||||||
ret = ((*(u_char *)PTOV(0xA1501)) & 0x08) >> 3;
|
|
||||||
|
|
||||||
/* Wait V-SYNC */
|
|
||||||
while (inb(0x60) & 0x20) {}
|
|
||||||
while (!(inb(0x60) & 0x20)) {}
|
|
||||||
|
|
||||||
/* ANK 'A' font */
|
|
||||||
outb(0xa1, 0x00);
|
|
||||||
outb(0xa3, 0x41);
|
|
||||||
|
|
||||||
/* M_NORMAL, use CG window (all NEC OK) */
|
|
||||||
for (i = data = 0; i < 4; i++)
|
|
||||||
data += *((u_long *)PTOV(0xA4000) + i); /* 0xa4000 */
|
|
||||||
if (data == 0x6efc58fc) /* DA data */
|
|
||||||
ret |= M_NEC_PC98;
|
|
||||||
else
|
|
||||||
ret |= M_EPSON_PC98;
|
|
||||||
ret |= (inb(0x42) & 0x20) ? M_8M : 0;
|
|
||||||
|
|
||||||
/* PC98_SYSTEM_PARAMETER(0x400) */
|
|
||||||
if ((*(u_char *)PTOV(0xA1400)) & 0x80)
|
|
||||||
ret |= M_NOTE;
|
|
||||||
if (ret & M_NEC_PC98) {
|
|
||||||
/* PC98_SYSTEM_PARAMETER(0x458) */
|
|
||||||
if ((*(u_char *)PTOV(0xA1458)) & 0x80)
|
|
||||||
ret |= M_H98;
|
|
||||||
else
|
|
||||||
ret |= M_NOT_H98;
|
|
||||||
} else
|
|
||||||
ret |= M_NOT_H98;
|
|
||||||
|
|
||||||
(*(u_long *)PTOV(0xA1620)) = ret;
|
|
||||||
}
|
|
@ -1,98 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include <stand.h>
|
|
||||||
#include <btxv86.h>
|
|
||||||
#include <machine/cpufunc.h>
|
|
||||||
#include "bootstrap.h"
|
|
||||||
#include "libi386.h"
|
|
||||||
|
|
||||||
static int bios_seconds(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the BIOS time-of-day value.
|
|
||||||
*
|
|
||||||
* XXX uses undocumented BCD support from libstand.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
bios_seconds(void)
|
|
||||||
{
|
|
||||||
int hr, minute, sec;
|
|
||||||
unsigned char bios_time[6];
|
|
||||||
|
|
||||||
v86.ctl = 0;
|
|
||||||
v86.addr = 0x1c; /* int 0x1c, function 0 */
|
|
||||||
v86.eax = 0x0000;
|
|
||||||
v86.es = VTOPSEG(bios_time);
|
|
||||||
v86.ebx = VTOPOFF(bios_time);
|
|
||||||
v86int();
|
|
||||||
|
|
||||||
hr = bcd2bin(bios_time[3]);
|
|
||||||
minute = bcd2bin(bios_time[4]);
|
|
||||||
sec = bcd2bin(bios_time[5]);
|
|
||||||
|
|
||||||
return (hr * 3600 + minute * 60 + sec);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the time in seconds since the beginning of the day.
|
|
||||||
*/
|
|
||||||
time_t
|
|
||||||
time(time_t *t)
|
|
||||||
{
|
|
||||||
static time_t lasttime;
|
|
||||||
time_t now;
|
|
||||||
|
|
||||||
now = bios_seconds();
|
|
||||||
|
|
||||||
if (now < lasttime)
|
|
||||||
now += 24 * 3600;
|
|
||||||
lasttime = now;
|
|
||||||
|
|
||||||
if (t != NULL)
|
|
||||||
*t = now;
|
|
||||||
return(now);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Use the BIOS Wait function to pause for (period) microseconds.
|
|
||||||
*
|
|
||||||
* Resolution of this function is variable, but typically around
|
|
||||||
* 1ms.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
delay(int period)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
period = (period + 500) / 1000;
|
|
||||||
for( ; period != 0 ; period--)
|
|
||||||
for(i=800;i != 0; i--)
|
|
||||||
outb(0x5f,0); /* wait 600ns */
|
|
||||||
}
|
|
@ -1,596 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright (c) 1998 Michael Smith (msmith@freebsd.org)
|
|
||||||
* Copyright (c) 1997 Kazutaka YOKOTA (yokota@zodiac.mech.utsunomiya-u.ac.jp)
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
|
||||||
*
|
|
||||||
* Id: probe_keyboard.c,v 1.13 1997/06/09 05:10:55 bde Exp
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include <stand.h>
|
|
||||||
#include <bootstrap.h>
|
|
||||||
#include <btxv86.h>
|
|
||||||
#include <machine/cpufunc.h>
|
|
||||||
#include "libi386.h"
|
|
||||||
|
|
||||||
#if KEYBOARD_PROBE
|
|
||||||
#include <machine/cpufunc.h>
|
|
||||||
|
|
||||||
static int probe_keyboard(void);
|
|
||||||
#endif
|
|
||||||
static void vidc_probe(struct console *cp);
|
|
||||||
static int vidc_init(int arg);
|
|
||||||
static void vidc_putchar(int c);
|
|
||||||
static int vidc_getchar(void);
|
|
||||||
static int vidc_ischar(void);
|
|
||||||
|
|
||||||
static int vidc_started;
|
|
||||||
|
|
||||||
#ifdef TERM_EMU
|
|
||||||
#define MAXARGS 8
|
|
||||||
#define DEFAULT_FGCOLOR 7
|
|
||||||
#define DEFAULT_BGCOLOR 0
|
|
||||||
|
|
||||||
void end_term(void);
|
|
||||||
void bail_out(int c);
|
|
||||||
void vidc_term_emu(int c);
|
|
||||||
void get_pos(void);
|
|
||||||
void curs_move(int x, int y);
|
|
||||||
void write_char(int c, int fg, int bg);
|
|
||||||
void scroll_up(int rows, int fg, int bg);
|
|
||||||
void CD(void);
|
|
||||||
void CM(void);
|
|
||||||
void HO(void);
|
|
||||||
|
|
||||||
static int args[MAXARGS], argc;
|
|
||||||
static int fg_c, bg_c, curx, cury;
|
|
||||||
static int esc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static unsigned short *crtat, *Crtat;
|
|
||||||
static int row = 25, col = 80;
|
|
||||||
#ifdef TERM_EMU
|
|
||||||
static u_int8_t ibmpc_to_pc98[256] = {
|
|
||||||
0x01, 0x21, 0x81, 0xa1, 0x41, 0x61, 0xc1, 0xe1,
|
|
||||||
0x09, 0x29, 0x89, 0xa9, 0x49, 0x69, 0xc9, 0xe9,
|
|
||||||
0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25,
|
|
||||||
0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25,
|
|
||||||
0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
|
|
||||||
0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
|
|
||||||
0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
|
|
||||||
0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
|
|
||||||
0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45,
|
|
||||||
0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45,
|
|
||||||
0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65,
|
|
||||||
0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65,
|
|
||||||
0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5,
|
|
||||||
0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5,
|
|
||||||
0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5,
|
|
||||||
0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5,
|
|
||||||
|
|
||||||
0x03, 0x23, 0x83, 0xa3, 0x43, 0x63, 0xc3, 0xe3,
|
|
||||||
0x0b, 0x2b, 0x8b, 0xab, 0x4b, 0x6b, 0xcb, 0xeb,
|
|
||||||
0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f,
|
|
||||||
0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f,
|
|
||||||
0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
|
|
||||||
0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
|
|
||||||
0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
|
|
||||||
0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
|
|
||||||
0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
|
|
||||||
0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
|
|
||||||
0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f,
|
|
||||||
0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f,
|
|
||||||
0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf,
|
|
||||||
0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf,
|
|
||||||
0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef,
|
|
||||||
0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef,
|
|
||||||
};
|
|
||||||
#define at2pc98(fg_at, bg_at) ibmpc_to_pc98[((bg_at) << 4) | (fg_at)]
|
|
||||||
#endif /* TERM_EMU */
|
|
||||||
|
|
||||||
struct console vidconsole = {
|
|
||||||
"vidconsole",
|
|
||||||
"internal video/keyboard",
|
|
||||||
0,
|
|
||||||
vidc_probe,
|
|
||||||
vidc_init,
|
|
||||||
vidc_putchar,
|
|
||||||
vidc_getchar,
|
|
||||||
vidc_ischar
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
|
||||||
vidc_probe(struct console *cp)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* look for a keyboard */
|
|
||||||
#if KEYBOARD_PROBE
|
|
||||||
if (probe_keyboard())
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
|
|
||||||
cp->c_flags |= C_PRESENTIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX for now, always assume we can do BIOS screen output */
|
|
||||||
cp->c_flags |= C_PRESENTOUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
vidc_init(int arg)
|
|
||||||
{
|
|
||||||
int i, hw_cursor;
|
|
||||||
|
|
||||||
if (vidc_started && arg == 0)
|
|
||||||
return (0);
|
|
||||||
vidc_started = 1;
|
|
||||||
Crtat = (unsigned short *)PTOV(0xA0000);
|
|
||||||
while ((inb(0x60) & 0x04) == 0)
|
|
||||||
;
|
|
||||||
outb(0x62, 0xe0);
|
|
||||||
while ((inb(0x60) & 0x01) == 0)
|
|
||||||
;
|
|
||||||
hw_cursor = inb(0x62);
|
|
||||||
hw_cursor |= (inb(0x62) << 8);
|
|
||||||
inb(0x62);
|
|
||||||
inb(0x62);
|
|
||||||
inb(0x62);
|
|
||||||
crtat = Crtat + hw_cursor;
|
|
||||||
#ifdef TERM_EMU
|
|
||||||
/* Init terminal emulator */
|
|
||||||
end_term();
|
|
||||||
get_pos();
|
|
||||||
curs_move(curx, cury);
|
|
||||||
fg_c = DEFAULT_FGCOLOR;
|
|
||||||
bg_c = DEFAULT_BGCOLOR;
|
|
||||||
#endif
|
|
||||||
for (i = 0; i < 10 && vidc_ischar(); i++)
|
|
||||||
(void)vidc_getchar();
|
|
||||||
return (0); /* XXX reinit? */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
beep(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
outb(0x37, 6);
|
|
||||||
delay(40000);
|
|
||||||
outb(0x37, 7);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
static void
|
|
||||||
vidc_biosputchar(int c)
|
|
||||||
{
|
|
||||||
unsigned short *cp;
|
|
||||||
int i, pos;
|
|
||||||
|
|
||||||
#ifdef TERM_EMU
|
|
||||||
*crtat = (c == 0x5c ? 0xfc : c);
|
|
||||||
*(crtat + 0x1000) = at2pc98(fg, bg);
|
|
||||||
#else
|
|
||||||
switch(c) {
|
|
||||||
case '\b':
|
|
||||||
crtat--;
|
|
||||||
break;
|
|
||||||
case '\r':
|
|
||||||
crtat -= (crtat - Crtat) % col;
|
|
||||||
break;
|
|
||||||
case '\n':
|
|
||||||
crtat += col;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
*crtat = (c == 0x5c ? 0xfc : c);
|
|
||||||
*(crtat++ + 0x1000) = 0xe1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (crtat >= Crtat + col * row) {
|
|
||||||
cp = Crtat;
|
|
||||||
for (i = 1; i < row; i++) {
|
|
||||||
bcopy((void *)(cp + col), (void *)cp, col * 2);
|
|
||||||
cp += col;
|
|
||||||
}
|
|
||||||
for (i = 0; i < col; i++) {
|
|
||||||
*cp++ = ' ';
|
|
||||||
}
|
|
||||||
crtat -= col;
|
|
||||||
}
|
|
||||||
pos = crtat - Crtat;
|
|
||||||
while ((inb(0x60) & 0x04) == 0) {}
|
|
||||||
outb(0x62, 0x49);
|
|
||||||
outb(0x60, pos & 0xff);
|
|
||||||
outb(0x60, pos >> 8);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
|
||||||
vidc_rawputchar(int c)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (c == '\t')
|
|
||||||
/* lame tab expansion */
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
vidc_rawputchar(' ');
|
|
||||||
else {
|
|
||||||
/* Emulate AH=0eh (teletype output) */
|
|
||||||
switch(c) {
|
|
||||||
case '\a':
|
|
||||||
beep();
|
|
||||||
return;
|
|
||||||
case '\r':
|
|
||||||
curx = 0;
|
|
||||||
curs_move(curx, cury);
|
|
||||||
return;
|
|
||||||
case '\n':
|
|
||||||
cury++;
|
|
||||||
if (cury > 24) {
|
|
||||||
scroll_up(1, fg_c, bg_c);
|
|
||||||
cury--;
|
|
||||||
} else {
|
|
||||||
curs_move(curx, cury);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
case '\b':
|
|
||||||
if (curx > 0) {
|
|
||||||
curx--;
|
|
||||||
curs_move(curx, cury);
|
|
||||||
/* write_char(' ', fg_c, bg_c); XXX destructive(!) */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
write_char(c, fg_c, bg_c);
|
|
||||||
curx++;
|
|
||||||
if (curx > 79) {
|
|
||||||
curx = 0;
|
|
||||||
cury++;
|
|
||||||
}
|
|
||||||
if (cury > 24) {
|
|
||||||
curx = 0;
|
|
||||||
scroll_up(1, fg_c, bg_c);
|
|
||||||
cury--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
curs_move(curx, cury);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TERM_EMU
|
|
||||||
|
|
||||||
/* Get cursor position on the screen. Result is in edx. Sets
|
|
||||||
* curx and cury appropriately.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
get_pos(void)
|
|
||||||
{
|
|
||||||
int pos = crtat - Crtat;
|
|
||||||
|
|
||||||
curx = pos % col;
|
|
||||||
cury = pos / col;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Move cursor to x rows and y cols (0-based). */
|
|
||||||
void
|
|
||||||
curs_move(int x, int y)
|
|
||||||
{
|
|
||||||
int pos;
|
|
||||||
|
|
||||||
pos = x + y * col;
|
|
||||||
crtat = Crtat + pos;
|
|
||||||
pos = crtat - Crtat;
|
|
||||||
while((inb(0x60) & 0x04) == 0) {}
|
|
||||||
outb(0x62, 0x49);
|
|
||||||
outb(0x60, pos & 0xff);
|
|
||||||
outb(0x60, pos >> 8);
|
|
||||||
curx = x;
|
|
||||||
cury = y;
|
|
||||||
#define isvisible(c) (((c) >= 32) && ((c) < 255))
|
|
||||||
if (!isvisible(*crtat & 0x00ff)) {
|
|
||||||
write_char(' ', fg_c, bg_c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Scroll up the whole window by a number of rows. If rows==0,
|
|
||||||
* clear the window. fg and bg are attributes for the new lines
|
|
||||||
* inserted in the window.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
scroll_up(int rows, int fgcol, int bgcol)
|
|
||||||
{
|
|
||||||
unsigned short *cp;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (rows == 0)
|
|
||||||
rows = 25;
|
|
||||||
cp = Crtat;
|
|
||||||
for (i = rows; i < row; i++) {
|
|
||||||
bcopy((void *)(cp + col), (void *)cp, col * 2);
|
|
||||||
cp += col;
|
|
||||||
}
|
|
||||||
for (i = 0; i < col; i++) {
|
|
||||||
*(cp + 0x1000) = at2pc98(fgcol, bgcol);
|
|
||||||
*cp++ = ' ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write character and attribute at cursor position. */
|
|
||||||
void
|
|
||||||
write_char(int c, int fgcol, int bgcol)
|
|
||||||
{
|
|
||||||
|
|
||||||
*crtat = (c == 0x5c ? 0xfc : (c & 0xff));
|
|
||||||
*(crtat + 0x1000) = at2pc98(fgcol, bgcol);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************/
|
|
||||||
/*
|
|
||||||
* Screen manipulation functions. They use accumulated data in
|
|
||||||
* args[] and argc variables.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Clear display from current position to end of screen */
|
|
||||||
void
|
|
||||||
CD(void)
|
|
||||||
{
|
|
||||||
int pos;
|
|
||||||
|
|
||||||
get_pos();
|
|
||||||
for (pos = 0; crtat + pos <= Crtat + col * row; pos++) {
|
|
||||||
*(crtat + pos) = ' ';
|
|
||||||
*(crtat + pos + 0x1000) = at2pc98(fg_c, bg_c);
|
|
||||||
}
|
|
||||||
end_term();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Absolute cursor move to args[0] rows and args[1] columns
|
|
||||||
* (the coordinates are 1-based).
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
CM(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (args[0] > 0)
|
|
||||||
args[0]--;
|
|
||||||
if (args[1] > 0)
|
|
||||||
args[1]--;
|
|
||||||
curs_move(args[1], args[0]);
|
|
||||||
end_term();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Home cursor (left top corner) */
|
|
||||||
void
|
|
||||||
HO(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
argc = 1;
|
|
||||||
args[0] = args[1] = 1;
|
|
||||||
CM();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clear internal state of the terminal emulation code */
|
|
||||||
void
|
|
||||||
end_term(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
esc = 0;
|
|
||||||
argc = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Gracefully exit ESC-sequence processing in case of misunderstanding */
|
|
||||||
void
|
|
||||||
bail_out(int c)
|
|
||||||
{
|
|
||||||
char buf[16], *ch;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (esc) {
|
|
||||||
vidc_rawputchar('\033');
|
|
||||||
if (esc != '\033')
|
|
||||||
vidc_rawputchar(esc);
|
|
||||||
for (i = 0; i <= argc; ++i) {
|
|
||||||
sprintf(buf, "%d", args[i]);
|
|
||||||
ch = buf;
|
|
||||||
while (*ch)
|
|
||||||
vidc_rawputchar(*ch++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
vidc_rawputchar(c);
|
|
||||||
end_term();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
get_arg(int c)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (argc < 0)
|
|
||||||
argc = 0;
|
|
||||||
args[argc] *= 10;
|
|
||||||
args[argc] += c - '0';
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Emulate basic capabilities of cons25 terminal */
|
|
||||||
void
|
|
||||||
vidc_term_emu(int c)
|
|
||||||
{
|
|
||||||
static int ansi_col[] = {
|
|
||||||
0, 4, 2, 6, 1, 5, 3, 7,
|
|
||||||
};
|
|
||||||
int t;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
switch (esc) {
|
|
||||||
case 0:
|
|
||||||
switch (c) {
|
|
||||||
case '\033':
|
|
||||||
esc = c;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
vidc_rawputchar(c);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '\033':
|
|
||||||
switch (c) {
|
|
||||||
case '[':
|
|
||||||
esc = c;
|
|
||||||
args[0] = 0;
|
|
||||||
argc = -1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
bail_out(c);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '[':
|
|
||||||
switch (c) {
|
|
||||||
case ';':
|
|
||||||
if (argc < 0) /* XXX */
|
|
||||||
argc = 0;
|
|
||||||
else if (argc + 1 >= MAXARGS)
|
|
||||||
bail_out(c);
|
|
||||||
else
|
|
||||||
args[++argc] = 0;
|
|
||||||
break;
|
|
||||||
case 'H':
|
|
||||||
if (argc < 0)
|
|
||||||
HO();
|
|
||||||
else if (argc == 1)
|
|
||||||
CM();
|
|
||||||
else
|
|
||||||
bail_out(c);
|
|
||||||
break;
|
|
||||||
case 'J':
|
|
||||||
if (argc < 0)
|
|
||||||
CD();
|
|
||||||
else
|
|
||||||
bail_out(c);
|
|
||||||
break;
|
|
||||||
case 'm':
|
|
||||||
if (argc < 0) {
|
|
||||||
fg_c = DEFAULT_FGCOLOR;
|
|
||||||
bg_c = DEFAULT_BGCOLOR;
|
|
||||||
}
|
|
||||||
for (i = 0; i <= argc; ++i) {
|
|
||||||
switch (args[i]) {
|
|
||||||
case 0: /* back to normal */
|
|
||||||
fg_c = DEFAULT_FGCOLOR;
|
|
||||||
bg_c = DEFAULT_BGCOLOR;
|
|
||||||
break;
|
|
||||||
case 1: /* bold */
|
|
||||||
fg_c |= 0x8;
|
|
||||||
break;
|
|
||||||
case 4: /* underline */
|
|
||||||
case 5: /* blink */
|
|
||||||
bg_c |= 0x8;
|
|
||||||
break;
|
|
||||||
case 7: /* reverse */
|
|
||||||
t = fg_c;
|
|
||||||
fg_c = bg_c;
|
|
||||||
bg_c = t;
|
|
||||||
break;
|
|
||||||
case 30: case 31: case 32: case 33:
|
|
||||||
case 34: case 35: case 36: case 37:
|
|
||||||
fg_c = ansi_col[args[i] - 30];
|
|
||||||
break;
|
|
||||||
case 39: /* normal */
|
|
||||||
fg_c = DEFAULT_FGCOLOR;
|
|
||||||
break;
|
|
||||||
case 40: case 41: case 42: case 43:
|
|
||||||
case 44: case 45: case 46: case 47:
|
|
||||||
bg_c = ansi_col[args[i] - 40];
|
|
||||||
break;
|
|
||||||
case 49: /* normal */
|
|
||||||
bg_c = DEFAULT_BGCOLOR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
end_term();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (isdigit(c))
|
|
||||||
get_arg(c);
|
|
||||||
else
|
|
||||||
bail_out(c);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
bail_out(c);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
|
||||||
vidc_putchar(int c)
|
|
||||||
{
|
|
||||||
#ifdef TERM_EMU
|
|
||||||
vidc_term_emu(c);
|
|
||||||
#else
|
|
||||||
vidc_rawputchar(c);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
vidc_getchar(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (vidc_ischar()) {
|
|
||||||
v86.ctl = 0;
|
|
||||||
v86.addr = 0x18;
|
|
||||||
v86.eax = 0x0;
|
|
||||||
v86int();
|
|
||||||
return (v86.eax & 0xff);
|
|
||||||
} else {
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
vidc_ischar(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
v86.ctl = 0;
|
|
||||||
v86.addr = 0x18;
|
|
||||||
v86.eax = 0x100;
|
|
||||||
v86int();
|
|
||||||
return ((v86.ebx >> 8) & 0x1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if KEYBOARD_PROBE
|
|
||||||
static int
|
|
||||||
probe_keyboard(void)
|
|
||||||
{
|
|
||||||
return (*(u_char *)PTOV(0xA1481) & 0x48);
|
|
||||||
}
|
|
||||||
#endif /* KEYBOARD_PROBE */
|
|
@ -1,99 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
.include <src.opts.mk>
|
|
||||||
MK_SSP= no
|
|
||||||
MAN=
|
|
||||||
|
|
||||||
LOADER?= loader
|
|
||||||
PROG= ${LOADER}.sym
|
|
||||||
INTERNALPROG=
|
|
||||||
NEWVERSWHAT= "bootstrap loader" pc98
|
|
||||||
VERSION_FILE= ${.CURDIR}/../../i386/loader/version
|
|
||||||
|
|
||||||
# architecture-specific loader code
|
|
||||||
SRCS= main.c conf.c vers.c
|
|
||||||
.PATH: ${.CURDIR}/../../i386/loader
|
|
||||||
|
|
||||||
# Enable PXE TFTP or NFS support, not both.
|
|
||||||
.if defined(LOADER_TFTP_SUPPORT)
|
|
||||||
CFLAGS+= -DLOADER_TFTP_SUPPORT
|
|
||||||
.else
|
|
||||||
CFLAGS+= -DLOADER_NFS_SUPPORT
|
|
||||||
.endif
|
|
||||||
|
|
||||||
# Include bcache code.
|
|
||||||
HAVE_BCACHE= yes
|
|
||||||
|
|
||||||
# Enable PnP and ISA-PnP code.
|
|
||||||
HAVE_PNP= yes
|
|
||||||
HAVE_ISABUS= yes
|
|
||||||
|
|
||||||
.if ${MK_FORTH} != "no"
|
|
||||||
# Enable BootForth
|
|
||||||
BOOT_FORTH= yes
|
|
||||||
CFLAGS+= -DBOOT_FORTH -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/i386
|
|
||||||
LIBFICL= ${.OBJDIR}/../../ficl/libficl.a
|
|
||||||
.endif
|
|
||||||
|
|
||||||
.if defined(LOADER_BZIP2_SUPPORT)
|
|
||||||
CFLAGS+= -DLOADER_BZIP2_SUPPORT
|
|
||||||
.endif
|
|
||||||
.if !defined(LOADER_NO_GZIP_SUPPORT)
|
|
||||||
CFLAGS+= -DLOADER_GZIP_SUPPORT
|
|
||||||
.endif
|
|
||||||
|
|
||||||
# Always add MI sources
|
|
||||||
.PATH: ${.CURDIR}/../../common
|
|
||||||
.include "${.CURDIR}/../../common/Makefile.inc"
|
|
||||||
CFLAGS+= -I${.CURDIR}/../../common
|
|
||||||
CFLAGS+= -I${.CURDIR}/../../i386
|
|
||||||
CFLAGS+= -I.
|
|
||||||
|
|
||||||
CLEANFILES= ${LOADER} ${LOADER}.bin loader.help
|
|
||||||
|
|
||||||
CFLAGS+= -Wall
|
|
||||||
LDFLAGS= -static -Ttext 0x0
|
|
||||||
|
|
||||||
# pc98 standalone support library
|
|
||||||
LIBPC98= ${.OBJDIR}/../libpc98/libpc98.a
|
|
||||||
CFLAGS+= -I${.CURDIR}/..
|
|
||||||
|
|
||||||
LIBSTAND= ${.OBJDIR}/../../libstand32/libstand.a
|
|
||||||
|
|
||||||
# BTX components
|
|
||||||
CFLAGS+= -I${.CURDIR}/../btx/lib
|
|
||||||
|
|
||||||
# Debug me!
|
|
||||||
#CFLAGS+= -g
|
|
||||||
#LDFLAGS+= -g
|
|
||||||
|
|
||||||
# Pick up ../Makefile.inc early.
|
|
||||||
.include <bsd.init.mk>
|
|
||||||
|
|
||||||
${LOADER}: ${LOADER}.bin ${BTXLDR} ${BTXKERN}
|
|
||||||
btxld -v -f aout -e ${LOADER_ADDRESS} -o ${.TARGET} -l ${BTXLDR} \
|
|
||||||
-b ${BTXKERN} ${LOADER}.bin
|
|
||||||
|
|
||||||
${LOADER}.bin: ${LOADER}.sym
|
|
||||||
cp ${.ALLSRC} ${.TARGET}
|
|
||||||
strip -R .comment -R .note ${.TARGET}
|
|
||||||
|
|
||||||
loader.help: help.common help.pc98
|
|
||||||
cat ${.ALLSRC} | awk -f ${.CURDIR}/../../common/merge_help.awk > ${.TARGET}
|
|
||||||
|
|
||||||
FILES= ${LOADER}
|
|
||||||
# XXX INSTALLFLAGS_loader= -b
|
|
||||||
FILESMODE_${LOADER}= ${BINMODE} -b
|
|
||||||
|
|
||||||
.PATH: ${.CURDIR}/../../forth
|
|
||||||
.include "${.CURDIR}/../../forth/Makefile.inc"
|
|
||||||
|
|
||||||
FILES+= ${.CURDIR}/../../i386/loader/loader.rc menu.rc
|
|
||||||
|
|
||||||
# XXX crt0.o needs to be first for pxeboot(8) to work
|
|
||||||
OBJS= ${BTXCRT}
|
|
||||||
|
|
||||||
DPADD= ${LIBFICL} ${LIBPC98} ${LIBSTAND}
|
|
||||||
LDADD= ${LIBFICL} ${LIBPC98} ${LIBSTAND}
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
@ -1,116 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
* 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include <stand.h>
|
|
||||||
#include <bootstrap.h>
|
|
||||||
#include "libi386/libi386.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We could use linker sets for some or all of these, but
|
|
||||||
* then we would have to control what ended up linked into
|
|
||||||
* the bootstrap. So it's easier to conditionalise things
|
|
||||||
* here.
|
|
||||||
*
|
|
||||||
* XXX rename these arrays to be consistent and less namespace-hostile
|
|
||||||
*
|
|
||||||
* XXX as libi386 and biosboot merge, some of these can become linker sets.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Exported for libstand */
|
|
||||||
struct devsw *devsw[] = {
|
|
||||||
&bioscd,
|
|
||||||
&biosdisk,
|
|
||||||
#if defined(LOADER_NFS_SUPPORT) || defined(LOADER_TFTP_SUPPORT)
|
|
||||||
&pxedisk,
|
|
||||||
#endif
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
struct fs_ops *file_system[] = {
|
|
||||||
&ufs_fsops,
|
|
||||||
&ext2fs_fsops,
|
|
||||||
&dosfs_fsops,
|
|
||||||
&cd9660_fsops,
|
|
||||||
#ifdef LOADER_NFS_SUPPORT
|
|
||||||
&nfs_fsops,
|
|
||||||
#endif
|
|
||||||
#ifdef LOADER_TFTP_SUPPORT
|
|
||||||
&tftp_fsops,
|
|
||||||
#endif
|
|
||||||
#ifdef LOADER_GZIP_SUPPORT
|
|
||||||
&gzipfs_fsops,
|
|
||||||
#endif
|
|
||||||
#ifdef LOADER_BZIP2_SUPPORT
|
|
||||||
&bzipfs_fsops,
|
|
||||||
#endif
|
|
||||||
&splitfs_fsops,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Exported for i386 only */
|
|
||||||
/*
|
|
||||||
* Sort formats so that those that can detect based on arguments
|
|
||||||
* rather than reading the file go first.
|
|
||||||
*/
|
|
||||||
extern struct file_format i386_elf;
|
|
||||||
extern struct file_format i386_elf_obj;
|
|
||||||
|
|
||||||
struct file_format *file_formats[] = {
|
|
||||||
&i386_elf,
|
|
||||||
&i386_elf_obj,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Consoles
|
|
||||||
*
|
|
||||||
* We don't prototype these in libi386.h because they require
|
|
||||||
* data structures from bootstrap.h as well.
|
|
||||||
*/
|
|
||||||
extern struct console vidconsole;
|
|
||||||
extern struct console comconsole;
|
|
||||||
extern struct console nullconsole;
|
|
||||||
|
|
||||||
struct console *consoles[] = {
|
|
||||||
&vidconsole,
|
|
||||||
&comconsole,
|
|
||||||
&nullconsole,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct pnphandler isapnphandler;
|
|
||||||
extern struct pnphandler biospnphandler;
|
|
||||||
extern struct pnphandler biospcihandler;
|
|
||||||
|
|
||||||
struct pnphandler *pnphandlers[] = {
|
|
||||||
&biospnphandler, /* should go first, as it may set isapnp_readport */
|
|
||||||
&isapnphandler,
|
|
||||||
&biospcihandler,
|
|
||||||
NULL
|
|
||||||
};
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user