Remove pc98 support completely.

I thank all developers and contributors for pc98.

Relnotes:	yes
This commit is contained in:
Yoshihiro Takahashi 2017-01-28 02:22:15 +00:00
parent 34bac11eba
commit 2b375b4edd
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=312910
418 changed files with 215 additions and 46737 deletions

View file

@ -236,7 +236,7 @@ _MAKE+= MK_META_MODE=no
# Guess machine architecture from machine type, and vice versa.
.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) && \
${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/}
@ -417,13 +417,12 @@ worlds: .PHONY
# existing system is.
#
.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}
TARGET_ARCHES_arm?= arm armeb armv6
TARGET_ARCHES_arm64?= aarch64
TARGET_ARCHES_mips?= mipsel mips mips64el mips64 mipsn32 mipselhf mipshf mips64elhf mips64hf
TARGET_ARCHES_powerpc?= powerpc powerpc64 powerpcspe
TARGET_ARCHES_pc98?= i386
.for target in ${TARGETS}
TARGET_ARCHES_${target}?= ${target}
.endfor

View file

@ -349,7 +349,6 @@ KNOWN_ARCHES?= aarch64/arm64 \
armeb/arm \
armv6/arm \
i386 \
i386/pc98 \
mips \
mipsel/mips \
mips64el/mips \

View file

@ -38,6 +38,17 @@
# xargs -n1 | sort | uniq -d;
# 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
OLD_FILES+=usr/tests/sys/geom/class/gate/1_test
OLD_FILES+=usr/tests/sys/geom/class/gate/2_test

View file

@ -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

View file

@ -112,7 +112,6 @@ icelandic.iso) echo is;;
it.iso) echo it;;
jp.106x) echo jp.capsctrl;;
jp.106) echo jp;;
#?? jp.pc98.iso) echo jp.pc98;;
kk.pt154.io) echo kz.io;;
kk.pt154.kst) echo kz.kst;;
latinamerican.iso.acc) echo latinamerican.acc;;

View file

@ -120,7 +120,7 @@ tables.h: mktables
ioctl.c: .PHONY
.endif
ioctl.c: mkioctls .META
env MACHINE=${MACHINE} CPP="${CPP}" \
env CPP="${CPP}" \
/bin/sh ${.CURDIR}/mkioctls ${DESTDIR}${INCLUDEDIR} > ${.TARGET}
beforedepend: ioctl.c tables.h

View file

@ -24,15 +24,7 @@ ioctl_includes=$(
awk '{printf("#include <%s>\\n", $1)}'
)
: ${MACHINE=$(uname -m)}
case "${MACHINE}" in
*pc98*)
ioctl_includes="$ioctl_includes#include <sys/diskpc98.h>\\n"
;;
*)
ioctl_includes="$ioctl_includes#include <sys/diskmbr.h>\\n"
;;
esac
ioctl_includes="$ioctl_includes#include <sys/diskmbr.h>\\n"
awk -v x="$ioctl_includes" 'BEGIN {print x}' |
$CPP -nostdinc -I$includedir -dM -DCOMPAT_43TTY - |

View file

@ -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.

View file

@ -99,7 +99,7 @@ element will be included. For example:
<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
by specifying a comma-separated list of architectures
(i.e. arch="sparc64,amd64").

View file

@ -252,35 +252,6 @@
more information.</para>
</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">
<title>powerpc</title>
@ -636,17 +607,9 @@
<sect2 xml:id="disk">
<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>
<para>[&arch.pc98;] IDE/ATA controllers (wdc driver)</para>
<itemizedlist>
<listitem>
<para>On-board IDE controller</para>
</listitem>
</itemizedlist>
&hwlist.aac;
&hwlist.adv;
@ -673,8 +636,6 @@
&hwlist.ciss;
&hwlist.ct;
&hwlist.dpt;
<note>
@ -894,8 +855,6 @@
&hwlist.sn;
&hwlist.snc;
&hwlist.ste;
&hwlist.stge;
@ -904,7 +863,7 @@
&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>
&hwlist.txp;
@ -934,8 +893,7 @@
<sect2 xml:id="fddi">
<title>FDDI Interfaces</title>
<para>[&arch.i386;, &arch.pc98;] DEC DEFPA PCI (&man.fpa.4;
driver)</para>
<para>[&arch.i386;] DEC DEFPA PCI (&man.fpa.4; driver)</para>
<para>[&arch.i386;] DEC DEFEA EISA (&man.fpa.4; driver)</para>
</sect2>
@ -943,28 +901,28 @@
<sect2 xml:id="atm">
<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>
<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;
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>
<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;
driver)</para>
<para>[&arch.i386;, &arch.pc98;] IDT77252-based ATM cards
<para>[&arch.i386;] IDT77252-based ATM cards
(&man.patm.4; driver)</para>
</sect2>
<sect2 xml:id="wlan">
<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>
&hwlist.ath;
@ -1016,7 +974,7 @@
&hwlist.urtw;
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;] Lucent
<para>[&arch.amd64;, &arch.i386;] Lucent
Technologies WaveLAN/IEEE 802.11b wireless network adapters
and workalikes using the Lucent Hermes, Intersil PRISM-II,
Intersil PRISM-2.5, Intersil Prism-3, and Symbol Spectrum24
@ -1214,77 +1172,6 @@
&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 xml:id="sound">
@ -1350,35 +1237,6 @@
&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 xml:id="camera">
@ -1392,7 +1250,7 @@
<sect2 xml:id="usb">
<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
are listed in this section. Owing to the generic nature of
most USB devices, with some exceptions any device of a given
@ -1400,14 +1258,14 @@
here.</para>
<note>
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
<para>[&arch.amd64;, &arch.i386;]
USB Ethernet adapters can be found in the section listing
<link linkend="ethernet">Ethernet
interfaces</link>.</para>
</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>
</note>
@ -1415,18 +1273,15 @@
&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;
driver)</para>
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
Hubs</para>
<para>[&arch.amd64;, &arch.i386;] Hubs</para>
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
Keyboards (&man.ukbd.4; driver)</para>
<para>[&arch.amd64;, &arch.i386;] Keyboards (&man.ukbd.4; driver)</para>
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
Miscellaneous</para>
<para>[&arch.amd64;, &arch.i386;] Miscellaneous</para>
<itemizedlist>
<listitem>
@ -1454,8 +1309,7 @@
&hwlist.umodem;
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;] Mice
(&man.ums.4; driver)</para>
<para>[&arch.amd64;, &arch.i386;] Mice (&man.ums.4; driver)</para>
&hwlist.ulpt;
@ -1471,7 +1325,7 @@
&hwlist.umass;
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;] Audio Devices
<para>[&arch.amd64;, &arch.i386;] Audio Devices
(&man.uaudio.4; driver)</para>
&hwlist.uvisor;
@ -1507,8 +1361,7 @@
<sect2 xml:id="misc">
<title>Miscellaneous</title>
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
FAX-Modem/PCCARD</para>
<para>[&arch.amd64;, &arch.i386;] FAX-Modem/PCCARD</para>
<itemizedlist>
<listitem>
@ -1521,7 +1374,7 @@
</listitem>
</itemizedlist>
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;] Floppy drives
<para>[&arch.amd64;, &arch.i386;] Floppy drives
(&man.fdc.4; driver)</para>
<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>
</note>
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
Keyboards including:</para>
<para>[&arch.amd64;, &arch.i386;] Keyboards including:</para>
<itemizedlist>
<listitem>
@ -1548,21 +1400,17 @@
</listitem>
<listitem>
<para>[&arch.pc98;] Standard keyboards</para>
</listitem>
<listitem>
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
<para>[&arch.amd64;, &arch.i386;]
USB keyboards (&man.ukbd.4; driver)</para>
</listitem>
</itemizedlist>
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
<para>[&arch.amd64;, &arch.i386;]
Pointing devices including:</para>
<itemizedlist>
<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>
</listitem>
@ -1577,7 +1425,7 @@
</listitem>
<listitem>
<para>[&arch.amd64;, &arch.i386;, &arch.pc98;]
<para>[&arch.amd64;, &arch.i386;]
USB mice (&man.ums.4; driver)</para>
</listitem>
</itemizedlist>
@ -1591,17 +1439,10 @@
<para>[&arch.amd64;, &arch.i386;] <quote>PC standard</quote>
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
(&man.joy.4; driver)</para>
<para>[&arch.pc98;] Joystick port of SoundBlaster(98)
(&man.joy.4; driver)</para>
<para>[&arch.i386;, &arch.pc98;] PHS Data Communication
Card/PCCARD</para>
<para>[&arch.i386;] PHS Data Communication Card/PCCARD</para>
<itemizedlist>
<listitem>
@ -1621,8 +1462,6 @@
cards compatible with the HOT1 from <link xlink:href="http://www.vcc.com/">Virtual Computers</link> (xrpu
driver).</para>
<para>[&arch.pc98;] Power Management Controller of NEC PC-98
Note (pmc driver)</para>
</sect2>
</sect1>
</article>

View file

@ -69,7 +69,6 @@
<para>&os; is an operating system based on 4.4 BSD Lite for
AMD64 and Intel EM64T based PC hardware (&arch.amd64;),
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
for the &arm; (&arch.arm;), &mips; (&arch.mips;), and
&powerpc; (&arch.powerpc;) architectures are currently under
@ -324,7 +323,7 @@
</para>
<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
installed, you can revisit this menu by re-running the
&man.bsdinstall.8; utility.</para>

View file

@ -6,7 +6,7 @@
# the build tree.
#
ARCHS= amd64 i386 pc98 powerpc sparc64
ARCHS= amd64 i386 powerpc sparc64
MULTITEXTS=
UNITEXTS= hardware readme relnotes errata

View file

@ -36,43 +36,42 @@
# <Driver name><tab><arch>[,<arch>...]
#
aac i386,amd64
adv i386,pc98,amd64
adw i386,pc98,amd64
adv i386,amd64
adw i386,amd64
aha i386
ahb i386
ahd i386,sparc64,amd64
aic i386,pc98,amd64
amd i386,pc98,amd64
aic i386,amd64
amd i386,amd64
arcmsr i386,amd64
asr i386
ath i386,pc98,amd64,sparc64
aue i386,pc98,amd64,powerpc
axe i386,pc98,amd64,powerpc
ath i386,amd64,sparc64
aue i386,amd64,powerpc
axe i386,amd64,powerpc
bce i386,amd64
bge i386,pc98,sparc64,amd64
bktr i386,pc98
bge i386,sparc64,amd64
bktr i386
bt i386,amd64
bxe i386,amd64
cdce i386,pc98,amd64,powerpc
cdce i386,amd64,powerpc
ciss i386,amd64
ce i386,pc98
ce i386
cm i386
cnw i386,pc98,amd64
cp i386,pc98
ct pc98
cnw i386,amd64
cp i386
ctau i386
cue i386,pc98,amd64,powerpc
cue i386,amd64,powerpc
cx i386
cxgb i386,amd64
de i386,pc98,amd64
de i386,amd64
dpt i386,amd64
ed i386,pc98
ep i386,pc98,amd64
ed i386
ep i386,amd64
esp sparc64
ex i386,amd64
fe i386,pc98,amd64
fe i386,amd64
fwohci i386,sparc64,amd64,powerpc
hifn i386,pc98,amd64
hifn i386,amd64
hpt27xx i386,amd64
hptiop i386,amd64
hptmv i386,amd64
@ -83,26 +82,26 @@ iir i386,amd64
ips i386,amd64
isci i386,amd64
ixgb i386,amd64
kue i386,pc98,amd64,powerpc
lge i386,pc98,amd64
kue i386,amd64,powerpc
lge i386,amd64
mfi i386,amd64
mlx i386,amd64
mly i386,amd64
msk i386,amd64
mxge i386,amd64
my i386,pc98
ncr i386,pc98,amd64
ncv i386,pc98
my i386
ncr i386,amd64
ncv i386
nfe i386,amd64
ng_bt3c i386,pc98,amd64
ng_ubt i386,pc98,amd64
nsp i386,pc98
ng_bt3c i386,amd64
ng_ubt i386,amd64
nsp i386
nxge i386,amd64
oce i386,amd64
ohci i386,pc98,amd64,powerpc
ohci i386,amd64,powerpc
oltr i386
otus i386,amd64
pcn i386,pc98,amd64
pcn i386,amd64
pst i386
qlxgb amd64
qlxgbe amd64
@ -110,14 +109,13 @@ qlxge amd64
rc i386
ral i386,amd64
rsu i386,amd64
rue i386,pc98,amd64
rue i386,amd64
rum i386,amd64
run i386,amd64
safe i386,pc98,amd64
safe i386,amd64
sbp i386,sparc64,amd64
sfgxe amd64
sn i386,amd64
snc pc98
snd_ad1816 i386,amd64
snd_als4000 i386
snd_atiixp i386,amd64
@ -148,31 +146,31 @@ snd_t4dwave i386,amd64,sparc64
snd_via8233 i386,amd64
snd_via82c686 i386,amd64
snd_vibes i386,amd64
stg i386,pc98
ti i386,pc98,amd64,sparc64
tl i386,pc98,amd64
stg i386
ti i386,amd64,sparc64
tl i386,amd64
trm i386,amd64
twa i386,amd64
twe i386,amd64
tws i386,amd64
ubsa i386,pc98,amd64
ubsec i386,pc98,amd64
ubser i386,pc98,amd64
ucycom i386,pc98,amd64
udav i386,pc98,amd64
uftdi i386,pc98,amd64
uhci i386,pc98,amd64,powerpc
ulpt i386,pc98,amd64,powerpc
umass i386,pc98,amd64,powerpc
umodem i386,pc98,amd64
uplcom i386,pc98,amd64
ubsa i386,amd64
ubsec i386,amd64
ubser i386,amd64
ucycom i386,amd64
udav i386,amd64
uftdi i386,amd64
uhci i386,amd64,powerpc
ulpt i386,amd64,powerpc
umass i386,amd64,powerpc
umodem i386,amd64
uplcom i386,amd64
ural i386,amd64
urio i386,pc98,amd64,powerpc
uvisor i386,pc98,amd64
uvscom i386,pc98,amd64
urio i386,amd64,powerpc
uvisor i386,amd64
uvscom i386,amd64
vpo i386
vx i386,pc98,amd64
vx i386,amd64
vxge i386,amd64
wb i386,pc98,amd64
wb i386,amd64
xe i386,amd64
zyd i386,amd64

View file

@ -73,7 +73,6 @@
<!ENTITY arch.arm64 "aarch64">
<!ENTITY arch.i386 "i386">
<!ENTITY arch.mips "mips">
<!ENTITY arch.pc98 "pc98">
<!ENTITY arch.powerpc "powerpc">
<!ENTITY arch.powerpc64 "powerpc64">
<!ENTITY arch.sparc64 "sparc64">

View file

@ -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"

View file

@ -16,11 +16,7 @@ mkdir /tmp/bsdinstall_etc
kbdcontrol -d >/dev/null 2>&1
if [ $? -eq 0 ]; then
# Syscons: use xterm, start interesting things on other VTYs
if [ ${MACHINE} = "pc98" ]; then
TERM=cons25w
else
TERM=xterm
fi
TERM=xterm
# Don't send ESC on function-key 62/63 (left/right command key)
kbdcontrol -f 62 '' > /dev/null 2>&1

View file

@ -141,10 +141,6 @@ CRUNCH_ALIAS_bsdlabel= disklabel
#CRUNCH_LIBS+= -lsmb
.endif
.if ${MACHINE} == "pc98"
CRUNCH_SRCDIR_fdisk= $(.CURDIR)/../../sbin/fdisk_pc98
.endif
.if ${MACHINE_CPUARCH} == "sparc64"
CRUNCH_PROGS_sbin+= bsdlabel sunlabel
.endif

View file

@ -1,5 +0,0 @@
# $FreeBSD$
SUBDIR += bsdlabel
SUBDIR += fdisk_pc98
SUBDIR += sconfig

View file

@ -109,9 +109,9 @@ argument forces
.Nm
to use a layout suitable for a different architecture.
Current valid values are
.Cm i386 , amd64 ,
.Cm i386
and
.Cm pc98 .
.Cm amd64 .
If this option is omitted,
.Nm
will use a layout suitable for the current machine.

View file

@ -164,8 +164,7 @@ main(int argc, char *argv[])
break;
case 'm':
if (!strcmp(optarg, "i386") ||
!strcmp(optarg, "amd64") ||
!strcmp(optarg, "pc98")) {
!strcmp(optarg, "amd64")) {
labelsoffset = 1;
labeloffset = 0;
bbsize = 8192;

View file

@ -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>

View file

@ -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

View file

@ -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.

View file

@ -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));
}
}

View file

@ -543,11 +543,6 @@ The
option enables backward compatibility for partition names
in the EBR scheme.
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
Sun's SMI Volume Table Of Contents, used by
.Tn SPARC64
@ -945,12 +940,6 @@ The scheme-specific attributes for MBR:
.Bl -tag -width ".Cm active"
.It Cm active
.El
.Pp
The scheme-specific attributes for PC98:
.Bl -tag -width ".Cm bootable"
.It Cm active
.It Cm bootable
.El
.Sh BOOTSTRAPPING
.Fx
supports several partitioning schemes and each scheme uses different

View file

@ -12,49 +12,26 @@ variable rt_el
variable rb_el
variable fill
s" arch-pc98" environment? [if]
\ Single frames
149 constant sh_el
150 constant sv_el
152 constant slt_el
154 constant slb_el
153 constant srt_el
155 constant srb_el
\ Double frames
149 constant dh_el
150 constant dv_el
152 constant dlt_el
154 constant dlb_el
153 constant drt_el
155 constant drb_el
\ Fillings
0 constant fill_none
32 constant fill_blank
135 constant fill_dark
135 constant fill_med
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]
\ 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
: hline ( len x y -- ) \ Draw horizontal single line
at-xy \ move cursor

View file

@ -204,12 +204,6 @@ AdvanSys ABP950
AdvanSys ABP980, ABP980U
.It
AdvanSys ABP980UA/3980UA
.It
MELCO IFC-USP (PC-98)
.It
RATOC REX-PCI30 (PC-98)
.It
@Nifty FNECHARD IFC-USUP-TX (PC-98)
.El
.Sh SEE ALSO
.Xr adw 4 ,

View file

@ -349,14 +349,6 @@ Adaptec
Adaptec
.Tn 4944UW
.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
.Tn SCSI
support

View file

@ -32,7 +32,7 @@
.Nd Advanced Programmable Interrupt Controller (APIC) driver
.Sh SYNOPSIS
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
kernel configuration file:
.Bd -ragged -offset indent

View file

@ -133,12 +133,6 @@ Accton EN2212/EN2216/UE2216
.It
Allied Telesis CentreCOM LA100-PCM_V2
.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)
.It
Bay Networks NETGEAR FA410TXC Fast Ethernet
@ -163,12 +157,6 @@ Compex Net-A adapter
.It
Compex RL2000
.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
.It
Corega LAPCCTXD (TC5299J)
@ -179,16 +167,10 @@ DEC EtherWorks DE305
.It
Danpex EN-6200P2
.It
D-Link DE-298, DE-298P (flags 0x500000) (PC-98)
.It
D-Link DE-660, DE-660+
.It
D-Link IC-CARD/IC-CARD+ Ethernet
.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)
.It
Hawking PN652TX PC Card (AX88790)
@ -198,17 +180,10 @@ HP PC Lan+ 27247B and 27252A
.It
IBM Creditcard Ethernet I/II
.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
.It
I-O DATA PCLATE
.It
Kansai KLA-98C/T (flags 0x900000) (PC-98)
.It
Kingston KNE-PC2, CIO10T, KNE-PCM/x Ethernet
.It
KTI ET32P2 PCI
@ -217,28 +192,14 @@ Linksys EC2T/PCMPC100/PCM100, PCMLM56
.It
Linksys EtherFast 10/100 PC Card, Combo PCMCIA Ethernet Card (PCMPC100 V2)
.It
Logitec LAN-98T (flags 0xb00000) (PC-98)
.It
MACNICA Ethernet ME1 for JEIDA
.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
.It
MELCO LPC-T/LPC2-T/LPC2-CLT/LPC2-TX/LPC3-TX/LPC3-CLX
.It
NDC Ethernet Instant-Link
.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
.It
NetGear FA-410TX
@ -247,10 +208,6 @@ NetVin NV5000SC
.It
Network Everywhere Ethernet 10BaseT PC Card
.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
.It
New Media LANSurfer
@ -259,10 +216,6 @@ Novell NE1000/NE2000/NE2100
.It
PLANEX ENW-8300-T
.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
.It
Psion 10/100 LANGLOBAL Combine iT
@ -277,8 +230,6 @@ SMC Elite 16 WD8013
.It
SMC Elite Ultra
.It
SMC EtherEZ98 (flags 0x000000) (PC-98)
.It
SMC WD8003E/WD8003EBT/WD8003S/WD8003SBT/WD8003W/WD8013EBT/WD8013W and clones
.It
SMC EZCard PC Card, 8040-TX, 8041-TX (AX88x90), 8041-TX V.2 (TC5299J)

View file

@ -66,8 +66,6 @@ driver include:
.Pp
.Bl -bullet -compact
.It
MELCO IFC-DP (PC-98)
.It
Sun ESP family
.It
Sun FAS family

View file

@ -137,12 +137,6 @@ Intel PRO/100 M Desktop Adapter
.It
Intel PRO/100 S Desktop, Server and Dual-Port Server Adapters
.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
.El
.Sh LOADER TUNABLES

View file

@ -65,9 +65,7 @@
.Cd options GEOM_PART_GPT
.Cd options GEOM_PART_LDM
.Cd options GEOM_PART_MBR
.Cd options GEOM_PART_PC98
.Cd options GEOM_PART_VTOC8
.Cd options GEOM_PC98
.Cd options GEOM_RAID
.Cd options GEOM_RAID3
.Cd options GEOM_SHSEC

View file

@ -8,7 +8,6 @@ MAN= aic.4 \
cp.4 \
CPU_ELAN.4 \
cs.4 \
ct.4 \
ctau.4 \
cx.4 \
ep.4 \
@ -26,7 +25,6 @@ MAN= aic.4 \
pnpbios.4 \
sbni.4 \
smapi.4 \
snc.4 \
streams.4 \
svr4.4 \
vpd.4 \

View file

@ -62,10 +62,6 @@ Adaptec AHA-1535 (ISA)
Creative Labs SoundBlaster SCSI host adapter (ISA)
.It
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
.Sh SEE ALSO
.Xr aha 4 ,

View file

@ -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 .

View file

@ -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.

View file

@ -72,15 +72,6 @@ chips:
.It
.Tn 53C1510D
.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
.Xr cd 4 ,
.Xr ch 4 ,

View file

@ -72,8 +72,6 @@ Macnica Miracle SCSI-II mPS110
.It
Media Intelligent MSC-110, MSC-200
.It
NEC PC-9801N-J03R
.It
New Media Corporation BASICS SCSI
.It
Qlogic Fast SCSI

View file

@ -329,10 +329,6 @@ DawiControl DC2976UW
.It
Diamond FirePort (all)
.It
I-O DATA SC-UPCI (PC-98)
.It
Logitec LHA-521UA (PC-98)
.It
NCR cards (all)
.It
Symbios cards (all)

View file

@ -18,9 +18,6 @@ CFLAGS.gcc+= -mpreferred-stack-boundary=2
.if ${MACHINE_CPUARCH} == "amd64"
CFLAGS+= -fPIC -mno-red-zone
.endif
.if ${MACHINE} == "pc98"
CFLAGS+= -Os
.endif
.if ${MACHINE_CPUARCH} == "aarch64"
CFLAGS+= -mgeneral-regs-only
.endif

View file

@ -47,7 +47,6 @@ TARGET_ARCHES_arm?= arm armeb armv6
TARGET_ARCHES_arm64?= aarch64
TARGET_ARCHES_mips?= mipsel mips mips64el mips64 mipsn32 mipsn32el
TARGET_ARCHES_powerpc?= powerpc powerpc64 powerpcspe
TARGET_ARCHES_pc98?= i386
TARGET_ARCHES_riscv?= riscv64 riscv64sf
# some corner cases
@ -55,7 +54,7 @@ BOOT_MACHINE_DIR.amd64 = boot/i386
MACHINE_ARCH.host = ${_HOST_ARCH}
# 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}
MACHINE_ARCH_LIST.$m?= ${TARGET_ARCHES_${m}:U$m}
MACHINE_ARCH.$m?= ${MACHINE_ARCH_LIST.$m:[1]}

View file

@ -294,20 +294,6 @@ jp.106x.kbd:pt:Japon
jp.106x.kbd:es:Japonés 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:de:Kasachisch PT154 codepage
kk.pt154.kst.kbd:fr:Kazakh PT154 code page

View file

@ -26,7 +26,7 @@ FILES= INDEX.keymaps \
icelandic.iso.kbd icelandic.iso.acc.kbd \
it.iso.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 \
latinamerican.kbd latinamerican.iso.acc.kbd \
lt.iso4.kbd \

View file

@ -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

View file

@ -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

View file

@ -301,20 +301,6 @@ jp.capsctrl.kbd:pt:Japonês 106x
jp.capsctrl.kbd:es:Japonés 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:de:Kasachisch
kz.kst.kbd:fr:Kazakh

View file

@ -48,8 +48,6 @@ FILES= INDEX.keymaps \
it.kbd \
jp.capsctrl.kbd \
jp.kbd \
jp.pc98.iso.kbd \
jp.pc98.kbd \
kz.io.kbd \
kz.kst.kbd \
latinamerican.acc.kbd \

View file

@ -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

View file

@ -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

View file

@ -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}
.if !defined(CSCOPE_ARCHDIR)
.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
CSCOPE_ARCHDIR = ${MACHINE}
.if ${MACHINE} != ${MACHINE_CPUARCH}

View file

@ -1,3 +0,0 @@
# $FreeBSD$
SUBDIR+= libstand32

View file

@ -7,8 +7,6 @@ SRCS+= module.c panic.c
.if ${MACHINE} == "i386" || ${MACHINE_CPUARCH} == "amd64"
SRCS+= load_elf32.c load_elf32_obj.c reloc_elf32.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"
SRCS+= load_elf64.c reloc_elf64.c
.elif ${MACHINE_CPUARCH} == "arm"

View file

@ -45,15 +45,9 @@
/* Static ports to access PnP state machine */
#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_WRITE_DATA 0xa79
#endif
#endif
/* PnP Registers. Write to ADDRESS and then use WRITE/READ_DATA */
#define SET_RD_DATA 0x00

View file

@ -827,9 +827,7 @@ void ficlCompilePlatform(FICL_SYSTEM *pSys)
SET_FOREACH(fnpp, Xficl_compile_set)
(*fnpp)(pSys);
#if defined(PC98)
ficlSetEnv(pSys, "arch-pc98", FICL_TRUE);
#elif defined(__i386__)
#if defined(__i386__)
ficlSetEnv(pSys, "arch-i386", FICL_TRUE);
ficlSetEnv(pSys, "arch-powerpc", FICL_FALSE);
#elif defined(__powerpc__)

View file

@ -46,49 +46,26 @@ variable fill
124 constant ascii_pipe
43 constant ascii_plus
s" arch-pc98" environment? [if]
\ Single frames
149 constant sh_el
150 constant sv_el
152 constant slt_el
154 constant slb_el
153 constant srt_el
155 constant srb_el
\ Double frames
149 constant dh_el
150 constant dv_el
152 constant dlt_el
154 constant dlb_el
153 constant drt_el
155 constant drb_el
\ Fillings
0 constant fill_none
32 constant fill_blank
135 constant fill_dark
135 constant fill_med
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]
\ 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
only forth definitions also frame-drawing

View file

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

View file

@ -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"

View file

@ -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>

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -1,12 +0,0 @@
/*
* $FreeBSD$
*/
SECTIONS
{
.text : { *(.text) }
.data : { *(.data) }
. = 0x1243;
.putssjis : { *(.putssjis) }
.bss : { *(.bss) }
}

View file

@ -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

View file

@ -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 " "

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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>

View file

@ -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

View file

@ -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}

View file

@ -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

View file

@ -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;
}
}

View file

@ -1,5 +0,0 @@
# $FreeBSD$
SUBDIR= btx btxldr lib
.include <bsd.subdir.mk>

View file

@ -1,3 +0,0 @@
# $FreeBSD$
.include "../Makefile.inc"

View file

@ -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

View file

@ -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}

View file

@ -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

View file

@ -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>

View file

@ -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

View file

@ -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

View file

@ -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_ */

View file

@ -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

View file

@ -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}

View file

@ -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

View file

@ -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>

View file

@ -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

View file

@ -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>

View file

@ -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

View file

@ -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;
}
}

View file

@ -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)
{
}

View file

@ -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));
}

View file

@ -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);

View file

@ -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;
}

View file

@ -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 */
}

View file

@ -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 */

View file

@ -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>

View file

@ -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