Remove pc98 support completely.
I thank all developers and contributors for pc98. Relnotes: yes
This commit is contained in:
parent
34bac11eba
commit
2b375b4edd
5
Makefile
5
Makefile
@ -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
|
||||
|
@ -349,7 +349,6 @@ KNOWN_ARCHES?= aarch64/arm64 \
|
||||
armeb/arm \
|
||||
armv6/arm \
|
||||
i386 \
|
||||
i386/pc98 \
|
||||
mips \
|
||||
mipsel/mips \
|
||||
mips64el/mips \
|
||||
|
@ -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
|
||||
|
@ -1,49 +0,0 @@
|
||||
#
|
||||
# $FreeBSD$
|
||||
# @(#)ttys 5.1 (Berkeley) 4/17/89
|
||||
#
|
||||
# This file specifies various information about terminals on the system.
|
||||
# It is used by several different programs. Common entries for the
|
||||
# various columns include:
|
||||
#
|
||||
# name The name of the terminal device.
|
||||
#
|
||||
# getty The program to start running on the terminal. Typically a
|
||||
# getty program, as the name implies. Other common entries
|
||||
# include none, when no getty is needed, and xdm, to start the
|
||||
# X Window System.
|
||||
#
|
||||
# type The initial terminal type for this port. For hardwired
|
||||
# terminal lines, this will contain the type of terminal used.
|
||||
# For virtual consoles, the correct type is typically cons25w.
|
||||
# Other common values include dialup for incoming modem ports, and
|
||||
# unknown when the terminal type cannot be predetermined.
|
||||
#
|
||||
# status Must be on or off. If on, init will run the getty program on
|
||||
# the specified port. If the word "secure" appears, this tty
|
||||
# allows root login.
|
||||
#
|
||||
# name getty type status comments
|
||||
#
|
||||
# If console is marked "insecure", then init will ask for the root password
|
||||
# when going to single-user mode.
|
||||
console none unknown off secure
|
||||
#
|
||||
ttyv0 "/usr/libexec/getty Pc" cons25w on secure
|
||||
# Virtual terminals
|
||||
ttyv1 "/usr/libexec/getty Pc" cons25w on secure
|
||||
ttyv2 "/usr/libexec/getty Pc" cons25w on secure
|
||||
ttyv3 "/usr/libexec/getty Pc" cons25w on secure
|
||||
ttyv4 "/usr/libexec/getty Pc" cons25w on secure
|
||||
ttyv5 "/usr/libexec/getty Pc" cons25w on secure
|
||||
ttyv6 "/usr/libexec/getty Pc" cons25w on secure
|
||||
ttyv7 "/usr/libexec/getty Pc" cons25w on secure
|
||||
ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure
|
||||
# Serial terminals
|
||||
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
|
||||
ttyu0 "/usr/libexec/getty 3wire" vt100 onifconsole secure
|
||||
ttyu1 "/usr/libexec/getty 3wire" vt100 onifconsole secure
|
||||
ttyu2 "/usr/libexec/getty 3wire" vt100 onifconsole secure
|
||||
ttyu3 "/usr/libexec/getty 3wire" vt100 onifconsole secure
|
||||
# Dumb console
|
||||
dcons "/usr/libexec/getty std.9600" vt100 off secure
|
@ -112,7 +112,6 @@ icelandic.iso) echo is;;
|
||||
it.iso) echo it;;
|
||||
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;;
|
||||
|
@ -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
|
||||
|
@ -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 - |
|
||||
|
@ -1,4 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
# Because i386 adds extra stuff we don't need or want for PC98 we need
|
||||
# an empty file so it doesn't get added.
|
@ -99,7 +99,7 @@ element will be included. For example:
|
||||
|
||||
<para arch="sparc64">SPARC64-specific text</para>
|
||||
|
||||
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").
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -6,7 +6,7 @@
|
||||
# the build tree.
|
||||
#
|
||||
|
||||
ARCHS= amd64 i386 pc98 powerpc sparc64
|
||||
ARCHS= amd64 i386 powerpc sparc64
|
||||
MULTITEXTS=
|
||||
UNITEXTS= hardware readme relnotes errata
|
||||
|
||||
|
@ -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
|
||||
|
@ -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">
|
||||
|
@ -1,45 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Module: mkisoimages.sh
|
||||
# Author: Jordan K Hubbard
|
||||
# Date: 22 June 2001
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
# This script is used by release/Makefile to build the (optional) ISO images
|
||||
# for a FreeBSD release. It is considered architecture dependent since each
|
||||
# platform has a slightly unique way of making bootable CDs. This script
|
||||
# is also allowed to generate any number of images since that is more of
|
||||
# publishing decision than anything else.
|
||||
#
|
||||
# Usage:
|
||||
#
|
||||
# mkisoimages.sh [-b] image-label image-name base-bits-dir [extra-bits-dir]
|
||||
#
|
||||
# Where -b is passed if the ISO image should be made "bootable" by
|
||||
# whatever standards this architecture supports (may be unsupported),
|
||||
# image-label is the ISO image label, image-name is the filename of the
|
||||
# resulting ISO image, base-bits-dir contains the image contents and
|
||||
# extra-bits-dir, if provided, contains additional files to be merged
|
||||
# into base-bits-dir as part of making the image.
|
||||
|
||||
if [ "x$1" = "x-b" ]; then
|
||||
# This is highly x86-centric and will be used directly below.
|
||||
bootable="-o generic-bootimage=$4/boot/cdboot"
|
||||
shift
|
||||
else
|
||||
bootable=""
|
||||
fi
|
||||
|
||||
if [ $# -lt 3 ]; then
|
||||
echo "Usage: $0 [-b] image-label image-name base-bits-dir [extra-bits-dir]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
LABEL=`echo "$1" | tr '[:lower:]' '[:upper:]'`; shift
|
||||
NAME="$1"; shift
|
||||
|
||||
publisher="The FreeBSD Project. http://www.FreeBSD.org/"
|
||||
echo "/dev/iso9660/$LABEL / cd9660 ro 0 0" > "$1/etc/fstab"
|
||||
makefs -t cd9660 $bootable -o rockridge -o label="$LABEL" -o publisher="$publisher" "$NAME" "$@"
|
||||
rm -f "$1/etc/fstab"
|
@ -16,11 +16,7 @@ mkdir /tmp/bsdinstall_etc
|
||||
kbdcontrol -d >/dev/null 2>&1
|
||||
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
|
||||
|
@ -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
|
||||
|
@ -1,5 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SUBDIR += bsdlabel
|
||||
SUBDIR += fdisk_pc98
|
||||
SUBDIR += sconfig
|
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -1,13 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PACKAGE=runtime
|
||||
PROG= fdisk
|
||||
SRCS= fdisk.c geom_pc98_enc.c
|
||||
WARNS?= 4
|
||||
MAN= fdisk.8
|
||||
|
||||
.PATH: ${.CURDIR}/../../sys/geom
|
||||
|
||||
LIBADD= geom
|
||||
|
||||
.include <bsd.prog.mk>
|
@ -1,17 +0,0 @@
|
||||
# $FreeBSD$
|
||||
# Autogenerated - do NOT edit!
|
||||
|
||||
DIRDEPS = \
|
||||
gnu/lib/libgcc \
|
||||
include \
|
||||
include/xlocale \
|
||||
lib/${CSU_DIR} \
|
||||
lib/libc \
|
||||
lib/libgeom \
|
||||
|
||||
|
||||
.include <dirdeps.mk>
|
||||
|
||||
.if ${DEP_RELDIR} == ${_DEP_RELDIR}
|
||||
# local dependencies - needed for -jN in clean tree
|
||||
.endif
|
@ -1,486 +0,0 @@
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd October 5, 2016
|
||||
.Dt FDISK 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm fdisk
|
||||
.Nd NEC PC-98x1 slice table maintenance utility
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl BIaistuv
|
||||
.Op Fl 12345678
|
||||
.Op Ar disk
|
||||
.Nm
|
||||
.Fl f Ar configfile
|
||||
.Op Fl itv
|
||||
.Op Ar disk
|
||||
.Sh PROLOGUE
|
||||
In order for the BIOS to boot the kernel,
|
||||
certain conventions must be adhered to.
|
||||
Sector 0 of the disk must contain boot code,
|
||||
a slice table,
|
||||
and a magic number.
|
||||
BIOS slices can be used to break the disk up into several pieces.
|
||||
The BIOS brings in sector 0 and verifies the magic number.
|
||||
The sector
|
||||
0 boot code then searches the slice table to determine which
|
||||
slice is marked
|
||||
.Dq active .
|
||||
This boot code then brings in the bootstrap from the
|
||||
active slice and, if marked bootable, runs it.
|
||||
Under
|
||||
.Tn DOS ,
|
||||
you can have one or more slices with one active.
|
||||
The
|
||||
.Tn DOS
|
||||
.Nm
|
||||
utility can be used to divide space on the disk into slices and set one
|
||||
active.
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Fx
|
||||
utility,
|
||||
.Nm ,
|
||||
serves a similar purpose to the
|
||||
.Tn DOS
|
||||
utility.
|
||||
The first form is used to
|
||||
display slice information or to interactively edit the slice
|
||||
table.
|
||||
The second is used to write a slice table using a
|
||||
.Ar configfile ,
|
||||
and is designed to be used by other scripts/programs.
|
||||
.Pp
|
||||
Options are:
|
||||
.Bl -tag -width indent
|
||||
.It Fl a
|
||||
Change the active slice only.
|
||||
Ignored if
|
||||
.Fl f
|
||||
is given.
|
||||
.It Fl B
|
||||
Reinitialize the boot code contained in sector 0 of the disk.
|
||||
Ignored if
|
||||
.Fl f
|
||||
is given.
|
||||
.It Fl f Ar configfile
|
||||
Set slice values using the file
|
||||
.Ar configfile .
|
||||
The
|
||||
.Ar configfile
|
||||
always modifies existing slices, unless
|
||||
.Fl i
|
||||
is also given, in which case all existing slices are deleted (marked
|
||||
as
|
||||
.Dq unused )
|
||||
before the
|
||||
.Ar configfile
|
||||
is read.
|
||||
The
|
||||
.Ar configfile
|
||||
can be
|
||||
.Sq Fl ,
|
||||
in which case standard input is read.
|
||||
See
|
||||
.Sx CONFIGURATION FILE ,
|
||||
below, for file syntax.
|
||||
.Pp
|
||||
.Em WARNING :
|
||||
when
|
||||
.Fl f
|
||||
is used, you are not asked if you really want to write the slices
|
||||
table (as you are in the interactive mode).
|
||||
Use with caution!
|
||||
.It Fl i
|
||||
Initialize sector 0 of the disk.
|
||||
This implies
|
||||
.Fl u ,
|
||||
unless
|
||||
.Fl f
|
||||
is given.
|
||||
.It Fl I
|
||||
Initialize sector 0 slice table
|
||||
for one
|
||||
.Fx
|
||||
slice covering the entire disk.
|
||||
Some space at the start of the disk will reserved for the IPL program
|
||||
and the pc98 slice table itself.
|
||||
.It Fl s
|
||||
Print summary information and exit.
|
||||
.It Fl t
|
||||
Test mode; do not write slice values.
|
||||
Generally used with the
|
||||
.Fl f
|
||||
option to see what would be written to the slice table.
|
||||
Implies
|
||||
.Fl v .
|
||||
.It Fl u
|
||||
Update (edit) the disk's sector 0 slice table.
|
||||
Ignored if
|
||||
.Fl f
|
||||
is given.
|
||||
.It Fl v
|
||||
Be verbose.
|
||||
Slices that are unused are suppressed unless this flag is specified.
|
||||
When
|
||||
.Fl f
|
||||
is used,
|
||||
.Nm
|
||||
prints out the slice table that is written to the disk.
|
||||
.It Fl 12345678
|
||||
Operate on a single slice table entry only.
|
||||
Ignored if
|
||||
.Fl f
|
||||
is given.
|
||||
.El
|
||||
.Pp
|
||||
The final disk name can be provided as a
|
||||
.Dq bare
|
||||
disk name only, e.g.\&
|
||||
.Pa da0 ,
|
||||
or as a full pathname.
|
||||
If omitted,
|
||||
.Nm
|
||||
tries to figure out the default disk device name from the
|
||||
mounted root device.
|
||||
.Pp
|
||||
When called with no arguments, it prints the sector 0 slice table.
|
||||
An example follows:
|
||||
.Bd -literal
|
||||
******* Working on device /dev/da0 *******
|
||||
parameters extracted from in-core disklabel are:
|
||||
cylinders=33075 heads=8 sectors/track=32 (256 blks/cyl)
|
||||
|
||||
parameters to be used for BIOS calculations are:
|
||||
cylinders=33075 heads=8 sectors/track=32 (256 blks/cyl)
|
||||
|
||||
Media sector size is 512
|
||||
Warning: BIOS sector numbering starts with sector 1
|
||||
Information from DOS bootblock is:
|
||||
The data for partition 1 is:
|
||||
sysmid 148,(FreeBSD/NetBSD/386BSD)
|
||||
start 256, size 2490112 (1215 Meg), sid 196
|
||||
beg: cyl 1/ sector 0/ head 0;
|
||||
end: cyl 9727/ sector 0/ head 0
|
||||
system Name FreeBSD(98)
|
||||
The data for partition 2 is:
|
||||
sysmid 148,(FreeBSD/NetBSD/386BSD)
|
||||
start 2490368, size 5505024 (2688 Meg), sid 196
|
||||
beg: cyl 9728/ sector 0/ head 0;
|
||||
end: cyl 31231/ sector 0/ head 0
|
||||
system Name FreeBSD(98)
|
||||
The data for partition 3 is:
|
||||
<UNUSED>
|
||||
The data for partition 4 is:
|
||||
<UNUSED>
|
||||
The data for partition 5 is:
|
||||
<UNUSED>
|
||||
The data for partition 6 is:
|
||||
<UNUSED>
|
||||
The data for partition 7 is:
|
||||
<UNUSED>
|
||||
The data for partition 8 is:
|
||||
<UNUSED>
|
||||
The data for partition 9 is:
|
||||
<UNUSED>
|
||||
The data for partition 10 is:
|
||||
<UNUSED>
|
||||
The data for partition 11 is:
|
||||
<UNUSED>
|
||||
The data for partition 12 is:
|
||||
<UNUSED>
|
||||
The data for partition 13 is:
|
||||
<UNUSED>
|
||||
The data for partition 14 is:
|
||||
<UNUSED>
|
||||
The data for partition 15 is:
|
||||
<UNUSED>
|
||||
The data for partition 16 is:
|
||||
<UNUSED>
|
||||
.Ed
|
||||
.Pp
|
||||
The disk is divided into three slices that happen to fill the disk.
|
||||
The second slice overlaps the end of the first.
|
||||
(Used for debugging purposes.)
|
||||
.Bl -tag -width ".Em cyl , sector No and Em head"
|
||||
.It Em sysmid
|
||||
is used to label the slice.
|
||||
.Fx
|
||||
reserves the
|
||||
magic number 148 decimal (94 in hex).
|
||||
.It Xo
|
||||
.Em start
|
||||
and
|
||||
.Em size
|
||||
.Xc
|
||||
fields provide the start address
|
||||
and size of a slice in sectors.
|
||||
.It Xo
|
||||
.Em cyl , sector
|
||||
and
|
||||
.Em head
|
||||
.Xc
|
||||
fields are used to specify the beginning and end addresses of the slice.
|
||||
.It Em "system Name"
|
||||
is the name of the slice.
|
||||
.El
|
||||
.Pp
|
||||
.Em Note :
|
||||
these numbers are calculated using BIOS's understanding of the disk geometry
|
||||
and saved in the bootblock.
|
||||
.Pp
|
||||
The
|
||||
.Fl i
|
||||
and
|
||||
.Fl u
|
||||
flags are used to indicate that the slice data is to be updated.
|
||||
Unless the
|
||||
.Fl f
|
||||
option is also given,
|
||||
.Nm
|
||||
will enter a conversational mode.
|
||||
In this mode, no changes will be written to disk unless you explicitly tell
|
||||
.Nm
|
||||
to.
|
||||
.Pp
|
||||
The
|
||||
.Nm
|
||||
utility will display each slice and ask whether you want to edit it.
|
||||
If you say yes,
|
||||
.Nm
|
||||
will step through each field, show you the old value,
|
||||
and ask you for a new one.
|
||||
When you are done with the slice,
|
||||
.Nm
|
||||
will display it and ask you whether it is correct.
|
||||
It will then proceed to the next entry.
|
||||
.Pp
|
||||
Getting the
|
||||
.Em cyl , sector ,
|
||||
and
|
||||
.Em head
|
||||
fields correct is tricky, so by default,
|
||||
they will be calculated for you;
|
||||
you can specify them if you choose to though.
|
||||
.Pp
|
||||
After all the slices are processed,
|
||||
you are given the option to change the
|
||||
.Dq active
|
||||
slice.
|
||||
Finally, when all the new data for sector 0 has been accumulated,
|
||||
you are asked to confirm whether you really want to rewrite it.
|
||||
.Pp
|
||||
The difference between the
|
||||
.Fl u
|
||||
and
|
||||
.Fl i
|
||||
flags is that
|
||||
the
|
||||
.Fl u
|
||||
flag edits (updates) the existing slice parameters
|
||||
while the
|
||||
.Fl i
|
||||
flag is used to
|
||||
.Dq initialize
|
||||
them (old values will be ignored);
|
||||
it will setup the last BIOS slice to use the whole disk for
|
||||
.Fx ;
|
||||
and make it active.
|
||||
.Sh NOTES
|
||||
The automatic calculation of starting cylinder etc.\& uses
|
||||
a set of figures that represent what the BIOS thinks the
|
||||
geometry of the drive is.
|
||||
These figures are taken from the in-core disklabel by default,
|
||||
but
|
||||
.Nm
|
||||
initially gives you an opportunity to change them.
|
||||
This allows you to create a bootblock that can work with drives
|
||||
that use geometry translation under the BIOS.
|
||||
.Pp
|
||||
If you hand craft your disk layout,
|
||||
please make sure that the
|
||||
.Fx
|
||||
slice starts on a cylinder boundary.
|
||||
.Pp
|
||||
Editing an existing slice will most likely result in the loss of
|
||||
all data in that slice.
|
||||
.Pp
|
||||
You should run
|
||||
.Nm
|
||||
interactively once or twice to see how it works.
|
||||
This is completely safe as long as you answer the last question
|
||||
in the negative.
|
||||
There are subtleties that
|
||||
.Nm
|
||||
detects that are not fully explained in this manual page.
|
||||
.Sh CONFIGURATION FILE
|
||||
When the
|
||||
.Fl f
|
||||
option is given, a disk's slice table can be written using values
|
||||
from a
|
||||
.Ar configfile .
|
||||
The syntax of this file is very simple;
|
||||
each line is either a comment or a specification, as follows:
|
||||
.Bl -tag -width indent
|
||||
.It Ic # Ar comment ...
|
||||
Lines beginning with a
|
||||
.Ic #
|
||||
are comments and are ignored.
|
||||
.It Ic g Ar spec1 spec2 spec3
|
||||
Set the BIOS geometry used in slice calculations.
|
||||
There must be
|
||||
three values specified, with a letter preceding each number:
|
||||
.Bl -tag -width indent
|
||||
.It Cm c Ns Ar num
|
||||
Set the number of cylinders to
|
||||
.Ar num .
|
||||
.It Cm h Ns Ar num
|
||||
Set the number of heads to
|
||||
.Ar num .
|
||||
.It Cm s Ns Ar num
|
||||
Set the number of sectors/track to
|
||||
.Ar num .
|
||||
.El
|
||||
.Pp
|
||||
These specs can occur in any order, as the leading letter determines
|
||||
which value is which; however, all three must be specified.
|
||||
.Pp
|
||||
This line must occur before any lines that specify slice
|
||||
information.
|
||||
.Pp
|
||||
It is an error if the following is not true:
|
||||
.Bd -literal -offset indent
|
||||
1 <= number of cylinders
|
||||
1 <= number of heads <= 256
|
||||
1 <= number of sectors/track < 64
|
||||
.Ed
|
||||
.Pp
|
||||
The number of cylinders should be less than or equal to 1024, but this
|
||||
is not enforced, although a warning will be printed.
|
||||
Note that bootable
|
||||
.Fx
|
||||
slices (the
|
||||
.Dq Pa /
|
||||
file system) must lie completely within the
|
||||
first 1024 cylinders; if this is not true, booting may fail.
|
||||
Non-bootable slices do not have this restriction.
|
||||
.Pp
|
||||
Example (all of these are equivalent), for a disk with 1019 cylinders,
|
||||
39 heads, and 63 sectors:
|
||||
.Bd -literal -offset indent
|
||||
g c1019 h39 s63
|
||||
g h39 c1019 s63
|
||||
g s63 h39 c1019
|
||||
.Ed
|
||||
.It Ic p Ar slice type start length
|
||||
Set the slice given by
|
||||
.Ar slice
|
||||
(1-8) to type
|
||||
.Ar type ,
|
||||
starting at sector
|
||||
.Ar start
|
||||
for
|
||||
.Ar length
|
||||
sectors.
|
||||
.Pp
|
||||
Only those slices explicitly mentioned by these lines are modified;
|
||||
any slice not referenced by a
|
||||
.Ic p
|
||||
line will not be modified.
|
||||
However, if an invalid slice table is present, or the
|
||||
.Fl i
|
||||
option is specified, all existing slice entries will be cleared
|
||||
(marked as unused), and these
|
||||
.Ic p
|
||||
lines will have to be used to
|
||||
explicitly set slice information.
|
||||
If multiple slices need to be
|
||||
set, multiple
|
||||
.Ic p
|
||||
lines must be specified; one for each slice.
|
||||
.Pp
|
||||
These slice lines must occur after any geometry specification lines,
|
||||
if one is present.
|
||||
.Pp
|
||||
The
|
||||
.Ar type
|
||||
is 165 for
|
||||
.Fx
|
||||
slices.
|
||||
Specifying a slice type of zero is
|
||||
the same as clearing the slice and marking it as unused; however,
|
||||
dummy values (such as
|
||||
.Dq 0 )
|
||||
must still be specified for
|
||||
.Ar start
|
||||
and
|
||||
.Ar length .
|
||||
.Pp
|
||||
Note: the start offset will be rounded upwards to a head boundary if
|
||||
necessary, and the end offset will be rounded downwards to a cylinder
|
||||
boundary if necessary.
|
||||
.Pp
|
||||
Example: to clear slice 4 and mark it as unused:
|
||||
.Pp
|
||||
.Dl "p 4 0 0 0"
|
||||
.Pp
|
||||
Example: to set slice 1 to a
|
||||
.Fx
|
||||
slice, starting at sector 1
|
||||
for 2503871 sectors (note: these numbers will be rounded upwards and
|
||||
downwards to correspond to head and cylinder boundaries):
|
||||
.Pp
|
||||
.Dl "p 1 165 1 2503871"
|
||||
.It Ic a Ar slice
|
||||
Make
|
||||
.Ar slice
|
||||
the active slice.
|
||||
Can occur anywhere in the config file, but only
|
||||
one must be present.
|
||||
.Pp
|
||||
Example: to make slice 1 the active slice:
|
||||
.Pp
|
||||
.Dl "a 1"
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr boot98cfg 8 ,
|
||||
.Xr bsdlabel 8 ,
|
||||
.Xr gpart 8 ,
|
||||
.Xr newfs 8
|
||||
.Sh HISTORY
|
||||
A version of
|
||||
.Nm
|
||||
first appeared in the Mach Operating System.
|
||||
It was subsequently ported to
|
||||
.Bx 386 .
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
.Nm
|
||||
for Mach Operating System was written by
|
||||
.An Robert Baron Aq Mt rvb@cs.cmu.edu .
|
||||
It was ported to
|
||||
.Bx 386
|
||||
by
|
||||
.An Julian Elischer Aq Mt julian@tfs.com .
|
||||
.Sh BUGS
|
||||
The default boot code will not necessarily handle all slice types
|
||||
correctly, in particular those introduced since
|
||||
.Tn MS-DOS
|
||||
6.x.
|
||||
.Pp
|
||||
The entire utility should be made more user-friendly.
|
||||
.Pp
|
||||
Most users new to
|
||||
.Fx
|
||||
do not understand the difference between
|
||||
.Dq slice
|
||||
and
|
||||
.Dq partition ,
|
||||
causing difficulty to adjust.
|
||||
.Pp
|
||||
You cannot use this command to completely dedicate a disk to
|
||||
.Fx .
|
||||
The
|
||||
.Xr bsdlabel 8
|
||||
command must be used for this.
|
@ -1,910 +0,0 @@
|
||||
/*
|
||||
* Mach Operating System
|
||||
* Copyright (c) 1992 Carnegie Mellon University
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission to use, copy, modify and distribute this software and its
|
||||
* documentation is hereby granted, provided that both the copyright
|
||||
* notice and this permission notice appear in all copies of the
|
||||
* software, derivative works or modified versions, and any portions
|
||||
* thereof, and that both notices appear in supporting documentation.
|
||||
*
|
||||
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
|
||||
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
|
||||
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
|
||||
*
|
||||
* Carnegie Mellon requests users of this software to return to
|
||||
*
|
||||
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
|
||||
* School of Computer Science
|
||||
* Carnegie Mellon University
|
||||
* Pittsburgh PA 15213-3890
|
||||
*
|
||||
* any improvements or extensions that they make and grant Carnegie Mellon
|
||||
* the rights to redistribute these changes.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/disk.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/diskpc98.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mount.h>
|
||||
#include <ctype.h>
|
||||
#include <fcntl.h>
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <libgeom.h>
|
||||
#include <paths.h>
|
||||
#include <regex.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int iotest;
|
||||
|
||||
#define LBUF 100
|
||||
static char lbuf[LBUF];
|
||||
|
||||
/*
|
||||
*
|
||||
* Ported to 386bsd by Julian Elischer Thu Oct 15 20:26:46 PDT 1992
|
||||
*
|
||||
* 14-Dec-89 Robert Baron (rvb) at Carnegie-Mellon University
|
||||
* Copyright (c) 1989 Robert. V. Baron
|
||||
* Created.
|
||||
*/
|
||||
|
||||
#define Decimal(str, ans, tmp) if (decimal(str, &tmp, ans)) ans = tmp
|
||||
#define String(str, ans, len) {char *z = ans; char **dflt = &z; if (string(str, dflt)) strncpy(ans, *dflt, len); }
|
||||
|
||||
#define MAX_SEC_SIZE 2048 /* maximum section size that is supported */
|
||||
#define MIN_SEC_SIZE 512 /* the sector size to start sensing at */
|
||||
static int secsize = 0; /* the sensed sector size */
|
||||
|
||||
static char *disk;
|
||||
|
||||
static int cyls, sectors, heads, cylsecs, disksecs;
|
||||
|
||||
struct mboot {
|
||||
unsigned char padding[2]; /* force the longs to be long aligned */
|
||||
unsigned char bootinst[510];
|
||||
unsigned short int signature;
|
||||
struct pc98_partition parts[8];
|
||||
unsigned char large_sector_overflow[MAX_SEC_SIZE-MIN_SEC_SIZE];
|
||||
};
|
||||
|
||||
static struct mboot mboot;
|
||||
static int fd;
|
||||
|
||||
static uint dos_cyls;
|
||||
static uint dos_heads;
|
||||
static uint dos_sectors;
|
||||
static uint dos_cylsecs;
|
||||
|
||||
#define MAX_ARGS 10
|
||||
|
||||
typedef struct cmd {
|
||||
char cmd;
|
||||
int n_args;
|
||||
struct arg {
|
||||
char argtype;
|
||||
int arg_val;
|
||||
} args[MAX_ARGS];
|
||||
} CMD;
|
||||
|
||||
static int B_flag = 0; /* replace boot code */
|
||||
static int I_flag = 0; /* Inizialize disk to defaults */
|
||||
static int a_flag = 0; /* set active partition */
|
||||
static int i_flag = 0; /* replace partition data */
|
||||
static int u_flag = 0; /* update partition data */
|
||||
static int s_flag = 0; /* Print a summary and exit */
|
||||
static int t_flag = 0; /* test only */
|
||||
static char *f_flag = NULL; /* Read config info from file */
|
||||
static int v_flag = 0; /* Be verbose */
|
||||
|
||||
static struct part_type
|
||||
{
|
||||
unsigned char type;
|
||||
const char *name;
|
||||
} part_types[] = {
|
||||
{0x00, "unused"}
|
||||
,{0x01, "Primary DOS with 12 bit FAT"}
|
||||
,{0x11, "MSDOS"}
|
||||
,{0x20, "MSDOS"}
|
||||
,{0x21, "MSDOS"}
|
||||
,{0x22, "MSDOS"}
|
||||
,{0x23, "MSDOS"}
|
||||
,{0x02, "XENIX / file system"}
|
||||
,{0x03, "XENIX /usr file system"}
|
||||
,{0x04, "PC-UX"}
|
||||
,{0x05, "Extended DOS"}
|
||||
,{0x06, "Primary 'big' DOS (> 32MB)"}
|
||||
,{0x07, "OS/2 HPFS, QNX or Advanced UNIX"}
|
||||
,{0x08, "AIX file system"}
|
||||
,{0x09, "AIX boot partition or Coherent"}
|
||||
,{0x0A, "OS/2 Boot Manager or OPUS"}
|
||||
,{0x10, "OPUS"}
|
||||
,{0x14, "FreeBSD/NetBSD/386BSD"}
|
||||
,{0x94, "FreeBSD/NetBSD/386BSD"}
|
||||
,{0x40, "VENIX 286"}
|
||||
,{0x50, "DM"}
|
||||
,{0x51, "DM"}
|
||||
,{0x52, "CP/M or Microport SysV/AT"}
|
||||
,{0x56, "GB"}
|
||||
,{0x61, "Speed"}
|
||||
,{0x63, "ISC UNIX, other System V/386, GNU HURD or Mach"}
|
||||
,{0x64, "Novell Netware 2.xx"}
|
||||
,{0x65, "Novell Netware 3.xx"}
|
||||
,{0x75, "PCIX"}
|
||||
,{0x40, "Minix"}
|
||||
};
|
||||
|
||||
static void print_s0(int which);
|
||||
static void print_part(int i);
|
||||
static void init_sector0(unsigned long start);
|
||||
static void init_boot(void);
|
||||
static void change_part(int i, int force);
|
||||
static void print_params(void);
|
||||
static void change_active(int which);
|
||||
static void change_code(void);
|
||||
static void get_params_to_use(void);
|
||||
static char *get_rootdisk(void);
|
||||
static void dos(u_int32_t start, u_int32_t size, struct pc98_partition *partp);
|
||||
static int open_disk(int flag);
|
||||
static ssize_t read_disk(off_t sector, void *buf);
|
||||
static int write_disk(off_t sector, void *buf);
|
||||
static int get_params(void);
|
||||
static int read_s0(void);
|
||||
static int write_s0(void);
|
||||
static int ok(const char *str);
|
||||
static int decimal(const char *str, int *num, int deflt);
|
||||
static const char *get_type(int type);
|
||||
static void usage(void);
|
||||
static int string(const char *str, char **ans);
|
||||
static void reset_boot(void);
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
struct stat sb;
|
||||
int c, i;
|
||||
int partition = -1;
|
||||
struct pc98_partition *partp;
|
||||
|
||||
while ((c = getopt(argc, argv, "BIa:f:istuv12345678")) != -1)
|
||||
switch (c) {
|
||||
case 'B':
|
||||
B_flag = 1;
|
||||
break;
|
||||
case 'I':
|
||||
I_flag = 1;
|
||||
break;
|
||||
case 'a':
|
||||
a_flag = 1;
|
||||
break;
|
||||
case 'f':
|
||||
f_flag = optarg;
|
||||
break;
|
||||
case 'i':
|
||||
i_flag = 1;
|
||||
break;
|
||||
case 's':
|
||||
s_flag = 1;
|
||||
break;
|
||||
case 't':
|
||||
t_flag = 1;
|
||||
break;
|
||||
case 'u':
|
||||
u_flag = 1;
|
||||
break;
|
||||
case 'v':
|
||||
v_flag = 1;
|
||||
break;
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
partition = c - '0';
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
}
|
||||
if (f_flag || i_flag)
|
||||
u_flag = 1;
|
||||
if (t_flag)
|
||||
v_flag = 1;
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if (argc == 0) {
|
||||
disk = get_rootdisk();
|
||||
} else {
|
||||
if (stat(argv[0], &sb) == 0) {
|
||||
/* OK, full pathname given */
|
||||
disk = argv[0];
|
||||
} else if (errno == ENOENT && argv[0][0] != '/') {
|
||||
/* Try prepending "/dev" */
|
||||
asprintf(&disk, "%s%s", _PATH_DEV, argv[0]);
|
||||
if (disk == NULL)
|
||||
errx(1, "out of memory");
|
||||
} else {
|
||||
/* other stat error, let it fail below */
|
||||
disk = argv[0];
|
||||
}
|
||||
}
|
||||
if (open_disk(u_flag) < 0)
|
||||
err(1, "cannot open disk %s", disk);
|
||||
|
||||
if (s_flag) {
|
||||
if (read_s0())
|
||||
err(1, "read_s0");
|
||||
printf("%s: %d cyl %d hd %d sec\n", disk, dos_cyls, dos_heads,
|
||||
dos_sectors);
|
||||
printf("Part %11s %11s %4s %4s %-16s\n", "Start", "Size", "MID",
|
||||
"SID", "Name");
|
||||
for (i = 0; i < PC98_NPARTS; i++) {
|
||||
partp = ((struct pc98_partition *) &mboot.parts) + i;
|
||||
if (partp->dp_sid == 0)
|
||||
continue;
|
||||
printf("%4d: %11u %11u 0x%02x 0x%02x %-16.16s\n", i + 1,
|
||||
partp->dp_scyl * cylsecs,
|
||||
(partp->dp_ecyl - partp->dp_scyl + 1) * cylsecs,
|
||||
partp->dp_mid, partp->dp_sid, partp->dp_name);
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
printf("******* Working on device %s *******\n",disk);
|
||||
|
||||
if (I_flag) {
|
||||
read_s0();
|
||||
reset_boot();
|
||||
partp = (struct pc98_partition *) (&mboot.parts[0]);
|
||||
partp->dp_mid = DOSMID_386BSD;
|
||||
partp->dp_sid = DOSSID_386BSD;
|
||||
strncpy(partp->dp_name, "FreeBSD", sizeof(partp->dp_name));
|
||||
/* Start c/h/s. */
|
||||
partp->dp_scyl = partp->dp_ipl_cyl = 1;
|
||||
partp->dp_shd = partp->dp_ipl_head = 1;
|
||||
partp->dp_ssect = partp->dp_ipl_sct = 0;
|
||||
|
||||
/* End c/h/s. */
|
||||
partp->dp_ecyl = dos_cyls - 1;
|
||||
partp->dp_ehd = dos_cylsecs / dos_sectors;
|
||||
partp->dp_esect = dos_sectors;
|
||||
|
||||
if (v_flag)
|
||||
print_s0(-1);
|
||||
if (!t_flag)
|
||||
write_s0();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (f_flag) {
|
||||
if (v_flag)
|
||||
print_s0(-1);
|
||||
if (!t_flag)
|
||||
write_s0();
|
||||
} else {
|
||||
if(u_flag)
|
||||
get_params_to_use();
|
||||
else
|
||||
print_params();
|
||||
|
||||
if (read_s0())
|
||||
init_sector0(dos_sectors);
|
||||
|
||||
printf("Media sector size is %d\n", secsize);
|
||||
printf("Warning: BIOS sector numbering starts with sector 1\n");
|
||||
printf("Information from DOS bootblock is:\n");
|
||||
if (partition == -1)
|
||||
for (i = 1; i <= PC98_NPARTS; i++)
|
||||
change_part(i, v_flag);
|
||||
else
|
||||
change_part(partition, 1);
|
||||
|
||||
if (u_flag || a_flag)
|
||||
change_active(partition);
|
||||
|
||||
if (B_flag)
|
||||
change_code();
|
||||
|
||||
if (u_flag || a_flag || B_flag) {
|
||||
if (!t_flag) {
|
||||
printf("\nWe haven't changed the partition table yet. ");
|
||||
printf("This is your last chance.\n");
|
||||
}
|
||||
print_s0(-1);
|
||||
if (!t_flag) {
|
||||
if (ok("Should we write new partition table?"))
|
||||
write_s0();
|
||||
} else {
|
||||
printf("\n-t flag specified -- partition table not written.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static void
|
||||
usage()
|
||||
{
|
||||
fprintf(stderr, "%s%s",
|
||||
"usage: fdisk [-BIaistu] [-12345678] [disk]\n",
|
||||
" fdisk -f configfile [-itv] [disk]\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static struct pc98_partition mtpart;
|
||||
|
||||
static int
|
||||
part_unused(int i)
|
||||
{
|
||||
struct pc98_partition *partp;
|
||||
|
||||
partp = ((struct pc98_partition *) &mboot.parts) + i - 1;
|
||||
return (bcmp(partp, &mtpart, sizeof (struct pc98_partition)) == 0);
|
||||
}
|
||||
|
||||
static void
|
||||
print_s0(int which)
|
||||
{
|
||||
int i;
|
||||
|
||||
print_params();
|
||||
printf("Information from DOS bootblock is:\n");
|
||||
if (which == -1) {
|
||||
for (i = 1; i <= PC98_NPARTS; i++)
|
||||
if (v_flag || !part_unused(i)) {
|
||||
printf("%d: ", i);
|
||||
print_part(i);
|
||||
}
|
||||
}
|
||||
else
|
||||
print_part(which);
|
||||
}
|
||||
|
||||
static void
|
||||
print_part(int i)
|
||||
{
|
||||
struct pc98_partition *partp;
|
||||
u_int64_t part_sz, part_mb;
|
||||
|
||||
if (part_unused(i)) {
|
||||
printf("<UNUSED>\n");
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* Be careful not to overflow.
|
||||
*/
|
||||
partp = ((struct pc98_partition *) &mboot.parts) + i - 1;
|
||||
part_sz = (partp->dp_ecyl - partp->dp_scyl + 1) * cylsecs;
|
||||
part_mb = part_sz * secsize;
|
||||
part_mb /= (1024 * 1024);
|
||||
printf("sysmid %d (%#04x),(%s)\n", partp->dp_mid, partp->dp_mid,
|
||||
get_type(partp->dp_mid));
|
||||
printf(" start %lu, size %lu (%ju Meg), sid %d\n",
|
||||
(u_long)(partp->dp_scyl * cylsecs), (u_long)part_sz,
|
||||
(uintmax_t)part_mb, partp->dp_sid);
|
||||
printf("\tbeg: cyl %d/ head %d/ sector %d;\n\tend: cyl %d/ head %d/ sector %d\n"
|
||||
,partp->dp_scyl
|
||||
,partp->dp_shd
|
||||
,partp->dp_ssect
|
||||
,partp->dp_ecyl
|
||||
,partp->dp_ehd
|
||||
,partp->dp_esect);
|
||||
printf ("\tsystem Name %.16s\n", partp->dp_name);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
init_boot(void)
|
||||
{
|
||||
|
||||
mboot.signature = PC98_MAGIC;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
init_sector0(unsigned long start)
|
||||
{
|
||||
struct pc98_partition *partp =
|
||||
(struct pc98_partition *)(&mboot.parts[0]);
|
||||
|
||||
init_boot();
|
||||
|
||||
partp->dp_mid = DOSMID_386BSD;
|
||||
partp->dp_sid = DOSSID_386BSD;
|
||||
|
||||
dos(start, disksecs - start, partp);
|
||||
}
|
||||
|
||||
static void
|
||||
change_part(int i, int force)
|
||||
{
|
||||
struct pc98_partition *partp =
|
||||
((struct pc98_partition *) &mboot.parts) + i - 1;
|
||||
|
||||
if (!force && part_unused(i))
|
||||
return;
|
||||
|
||||
printf("The data for partition %d is:\n", i);
|
||||
print_part(i);
|
||||
|
||||
if (u_flag && ok("Do you want to change it?")) {
|
||||
int tmp;
|
||||
|
||||
if (i_flag) {
|
||||
bzero((char *)partp, sizeof (struct pc98_partition));
|
||||
if (i == 1) {
|
||||
init_sector0(1);
|
||||
printf("\nThe static data for the slice 1 has been reinitialized to:\n");
|
||||
print_part(i);
|
||||
}
|
||||
}
|
||||
do {
|
||||
int x_start = partp->dp_scyl * cylsecs ;
|
||||
int x_size = (partp->dp_ecyl - partp->dp_scyl + 1) * cylsecs;
|
||||
Decimal("sysmid", partp->dp_mid, tmp);
|
||||
Decimal("syssid", partp->dp_sid, tmp);
|
||||
String ("system name", partp->dp_name, 16);
|
||||
Decimal("start", x_start, tmp);
|
||||
Decimal("size", x_size, tmp);
|
||||
|
||||
if (ok("Explicitly specify beg/end address ?"))
|
||||
{
|
||||
int tsec,tcyl,thd;
|
||||
tcyl = partp->dp_scyl;
|
||||
thd = partp->dp_shd;
|
||||
tsec = partp->dp_ssect;
|
||||
Decimal("beginning cylinder", tcyl, tmp);
|
||||
Decimal("beginning head", thd, tmp);
|
||||
Decimal("beginning sector", tsec, tmp);
|
||||
partp->dp_scyl = tcyl;
|
||||
partp->dp_ssect = tsec;
|
||||
partp->dp_shd = thd;
|
||||
partp->dp_ipl_cyl = partp->dp_scyl;
|
||||
partp->dp_ipl_sct = partp->dp_ssect;
|
||||
partp->dp_ipl_head = partp->dp_shd;
|
||||
|
||||
tcyl = partp->dp_ecyl;
|
||||
thd = partp->dp_ehd;
|
||||
tsec = partp->dp_esect;
|
||||
Decimal("ending cylinder", tcyl, tmp);
|
||||
Decimal("ending head", thd, tmp);
|
||||
Decimal("ending sector", tsec, tmp);
|
||||
partp->dp_ecyl = tcyl;
|
||||
partp->dp_esect = tsec;
|
||||
partp->dp_ehd = thd;
|
||||
} else
|
||||
dos(x_start, x_size, partp);
|
||||
|
||||
print_part(i);
|
||||
} while (!ok("Are we happy with this entry?"));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
print_params()
|
||||
{
|
||||
printf("parameters extracted from in-core disklabel are:\n");
|
||||
printf("cylinders=%d heads=%d sectors/track=%d (%d blks/cyl)\n\n"
|
||||
,cyls,heads,sectors,cylsecs);
|
||||
if (dos_cyls > 65535 || dos_heads > 255 || dos_sectors > 255)
|
||||
printf("Figures below won't work with BIOS for partitions not in cyl 1\n");
|
||||
printf("parameters to be used for BIOS calculations are:\n");
|
||||
printf("cylinders=%d heads=%d sectors/track=%d (%d blks/cyl)\n\n"
|
||||
,dos_cyls,dos_heads,dos_sectors,dos_cylsecs);
|
||||
}
|
||||
|
||||
static void
|
||||
change_active(int which)
|
||||
{
|
||||
struct pc98_partition *partp = &mboot.parts[0];
|
||||
int active, i, new, tmp;
|
||||
|
||||
active = -1;
|
||||
for (i = 0; i < PC98_NPARTS; i++) {
|
||||
if ((partp[i].dp_sid & PC98_SID_ACTIVE) == 0)
|
||||
continue;
|
||||
printf("Partition %d is marked active\n", i + 1);
|
||||
if (active == -1)
|
||||
active = i + 1;
|
||||
}
|
||||
if (a_flag && which != -1)
|
||||
active = which;
|
||||
else if (active == -1)
|
||||
active = 1;
|
||||
|
||||
if (!ok("Do you want to change the active partition?"))
|
||||
return;
|
||||
setactive:
|
||||
do {
|
||||
new = active;
|
||||
Decimal("active partition", new, tmp);
|
||||
if (new < 1 || new > 8) {
|
||||
printf("Active partition number must be in range 1-8."
|
||||
" Try again.\n");
|
||||
goto setactive;
|
||||
}
|
||||
active = new;
|
||||
} while (!ok("Are you happy with this choice"));
|
||||
if (active > 0 && active <= 8)
|
||||
partp[active-1].dp_sid |= PC98_SID_ACTIVE;
|
||||
}
|
||||
|
||||
static void
|
||||
change_code()
|
||||
{
|
||||
if (ok("Do you want to change the boot code?"))
|
||||
init_boot();
|
||||
}
|
||||
|
||||
void
|
||||
get_params_to_use()
|
||||
{
|
||||
int tmp;
|
||||
print_params();
|
||||
if (ok("Do you want to change our idea of what BIOS thinks ?"))
|
||||
{
|
||||
do
|
||||
{
|
||||
Decimal("BIOS's idea of #cylinders", dos_cyls, tmp);
|
||||
Decimal("BIOS's idea of #heads", dos_heads, tmp);
|
||||
Decimal("BIOS's idea of #sectors", dos_sectors, tmp);
|
||||
dos_cylsecs = dos_heads * dos_sectors;
|
||||
print_params();
|
||||
}
|
||||
while(!ok("Are you happy with this choice"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************\
|
||||
* Change real numbers into strange dos numbers *
|
||||
\***********************************************/
|
||||
static void
|
||||
dos(u_int32_t start, u_int32_t size, struct pc98_partition *partp)
|
||||
{
|
||||
u_int32_t end;
|
||||
|
||||
if (partp->dp_mid == 0 && partp->dp_sid == 0 &&
|
||||
start == 0 && size == 0) {
|
||||
memcpy(partp, &mtpart, sizeof(*partp));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Start c/h/s. */
|
||||
partp->dp_scyl = partp->dp_ipl_cyl = start / dos_cylsecs;
|
||||
partp->dp_shd = partp->dp_ipl_head = start % dos_cylsecs / dos_sectors;
|
||||
partp->dp_ssect = partp->dp_ipl_sct = start % dos_sectors;
|
||||
|
||||
/* End c/h/s. */
|
||||
end = start + size - cylsecs;
|
||||
partp->dp_ecyl = end / dos_cylsecs;
|
||||
partp->dp_ehd = end % dos_cylsecs / dos_sectors;
|
||||
partp->dp_esect = end % dos_sectors;
|
||||
}
|
||||
|
||||
static int
|
||||
open_disk(int flag)
|
||||
{
|
||||
struct stat st;
|
||||
int rwmode;
|
||||
|
||||
if (stat(disk, &st) == -1) {
|
||||
if (errno == ENOENT)
|
||||
return -2;
|
||||
warnx("can't get file status of %s", disk);
|
||||
return -1;
|
||||
}
|
||||
if ( !(st.st_mode & S_IFCHR) )
|
||||
warnx("device %s is not character special", disk);
|
||||
rwmode = I_flag || a_flag || B_flag || flag ? O_RDWR : O_RDONLY;
|
||||
fd = open(disk, rwmode);
|
||||
if (fd == -1 && errno == EPERM && rwmode == O_RDWR)
|
||||
fd = open(disk, O_RDONLY);
|
||||
if (fd == -1 && errno == ENXIO)
|
||||
return -2;
|
||||
if (fd == -1) {
|
||||
warnx("can't open device %s", disk);
|
||||
return -1;
|
||||
}
|
||||
if (get_params() == -1) {
|
||||
warnx("can't get disk parameters on %s", disk);
|
||||
return -1;
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
read_disk(off_t sector, void *buf)
|
||||
{
|
||||
|
||||
lseek(fd, (sector * 512), 0);
|
||||
return read(fd, buf,
|
||||
secsize > MIN_SEC_SIZE ? secsize : MIN_SEC_SIZE * 2);
|
||||
}
|
||||
|
||||
static int
|
||||
write_disk(off_t sector, void *buf)
|
||||
{
|
||||
int error;
|
||||
struct gctl_req *grq;
|
||||
const char *q;
|
||||
char fbuf[BUFSIZ];
|
||||
int i, fdw, sz;
|
||||
|
||||
sz = secsize > MIN_SEC_SIZE ? secsize : MIN_SEC_SIZE * 2;
|
||||
grq = gctl_get_handle();
|
||||
gctl_ro_param(grq, "verb", -1, "write PC98");
|
||||
gctl_ro_param(grq, "class", -1, "PC98");
|
||||
q = strrchr(disk, '/');
|
||||
if (q == NULL)
|
||||
q = disk;
|
||||
else
|
||||
q++;
|
||||
gctl_ro_param(grq, "geom", -1, q);
|
||||
gctl_ro_param(grq, "data", sz, buf);
|
||||
q = gctl_issue(grq);
|
||||
if (q == NULL) {
|
||||
gctl_free(grq);
|
||||
return(0);
|
||||
}
|
||||
warnx("Geom problem: %s", q);
|
||||
gctl_free(grq);
|
||||
|
||||
warnx("Warning: Partitioning via geom failed, trying raw write");
|
||||
error = pwrite(fd, buf, sz, sector * 512);
|
||||
if (error == sz)
|
||||
return (0);
|
||||
|
||||
for (i = 0; i < PC98_NPARTS; i++) {
|
||||
sprintf(fbuf, "%ss%d", disk, i + 1);
|
||||
fdw = open(fbuf, O_RDWR, 0);
|
||||
if (fdw < 0)
|
||||
continue;
|
||||
error = ioctl(fdw, DIOCSPC98, buf);
|
||||
close(fdw);
|
||||
if (error == 0)
|
||||
return (0);
|
||||
}
|
||||
warnx("Failed to write sector zero");
|
||||
return(EINVAL);
|
||||
}
|
||||
|
||||
static int
|
||||
get_params()
|
||||
{
|
||||
int error;
|
||||
u_int u;
|
||||
off_t o;
|
||||
|
||||
error = ioctl(fd, DIOCGFWSECTORS, &u);
|
||||
if (error == 0)
|
||||
sectors = dos_sectors = u;
|
||||
else
|
||||
sectors = dos_sectors = 17;
|
||||
|
||||
error = ioctl(fd, DIOCGFWHEADS, &u);
|
||||
if (error == 0)
|
||||
heads = dos_heads = u;
|
||||
else
|
||||
heads = dos_heads = 8;
|
||||
|
||||
dos_cylsecs = cylsecs = heads * sectors;
|
||||
disksecs = cyls * heads * sectors;
|
||||
|
||||
error = ioctl(fd, DIOCGSECTORSIZE, &u);
|
||||
if (error != 0 || u == 0)
|
||||
u = 512;
|
||||
secsize = u;
|
||||
|
||||
error = ioctl(fd, DIOCGMEDIASIZE, &o);
|
||||
if (error == 0) {
|
||||
disksecs = o / u;
|
||||
cyls = dos_cyls = o / (u * dos_heads * dos_sectors);
|
||||
}
|
||||
|
||||
return (disksecs);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
read_s0()
|
||||
{
|
||||
|
||||
if (read_disk(0, (char *) mboot.bootinst) == -1) {
|
||||
warnx("can't read fdisk partition table");
|
||||
return -1;
|
||||
}
|
||||
if (mboot.signature != PC98_MAGIC) {
|
||||
warnx("invalid fdisk partition table found");
|
||||
/* So should we initialize things */
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
write_s0()
|
||||
{
|
||||
|
||||
if (iotest) {
|
||||
print_s0(-1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* write enable label sector before write (if necessary),
|
||||
* disable after writing.
|
||||
* needed if the disklabel protected area also protects
|
||||
* sector 0. (e.g. empty disk)
|
||||
*/
|
||||
if (write_disk(0, (char *) mboot.bootinst) == -1) {
|
||||
warn("can't write fdisk partition table");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
ok(const char *str)
|
||||
{
|
||||
printf("%s [n] ", str);
|
||||
fflush(stdout);
|
||||
if (fgets(lbuf, LBUF, stdin) == NULL)
|
||||
exit(1);
|
||||
lbuf[strlen(lbuf)-1] = 0;
|
||||
|
||||
if (*lbuf &&
|
||||
(!strcmp(lbuf, "yes") || !strcmp(lbuf, "YES") ||
|
||||
!strcmp(lbuf, "y") || !strcmp(lbuf, "Y")))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
decimal(const char *str, int *num, int deflt)
|
||||
{
|
||||
int acc = 0, c;
|
||||
char *cp;
|
||||
|
||||
while (1) {
|
||||
printf("Supply a decimal value for \"%s\" [%d] ", str, deflt);
|
||||
fflush(stdout);
|
||||
if (fgets(lbuf, LBUF, stdin) == NULL)
|
||||
exit(1);
|
||||
lbuf[strlen(lbuf)-1] = 0;
|
||||
|
||||
if (!*lbuf)
|
||||
return 0;
|
||||
|
||||
cp = lbuf;
|
||||
while ((c = *cp) && (c == ' ' || c == '\t')) cp++;
|
||||
if (!c)
|
||||
return 0;
|
||||
while ((c = *cp++)) {
|
||||
if (c <= '9' && c >= '0')
|
||||
acc = acc * 10 + c - '0';
|
||||
else
|
||||
break;
|
||||
}
|
||||
if (c == ' ' || c == '\t')
|
||||
while ((c = *cp) && (c == ' ' || c == '\t')) cp++;
|
||||
if (!c) {
|
||||
*num = acc;
|
||||
return 1;
|
||||
} else
|
||||
printf("%s is an invalid decimal number. Try again.\n",
|
||||
lbuf);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static int
|
||||
string(const char *str, char **ans)
|
||||
{
|
||||
int i, c;
|
||||
char *cp = lbuf;
|
||||
|
||||
while (1) {
|
||||
printf("Supply a string value for \"%s\" [%s] ", str, *ans);
|
||||
fgets(lbuf, LBUF, stdin);
|
||||
lbuf[strlen(lbuf)-1] = 0;
|
||||
|
||||
if (!*lbuf)
|
||||
return 0;
|
||||
|
||||
while ((c = *cp) && (c == ' ' || c == '\t')) cp++;
|
||||
if (c == '"') {
|
||||
c = *++cp;
|
||||
*ans = cp;
|
||||
while ((c = *cp) && c != '"') cp++;
|
||||
} else {
|
||||
*ans = cp;
|
||||
while ((c = *cp) && c != ' ' && c != '\t') cp++;
|
||||
}
|
||||
|
||||
for (i = strlen(*ans); i < 16; i++)
|
||||
(*ans)[i] = ' ';
|
||||
(*ans)[16] = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_type(int type)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < nitems(part_types); i++)
|
||||
if (part_types[i].type == (type & 0x7f))
|
||||
return(part_types[i].name);
|
||||
return("unknown");
|
||||
}
|
||||
|
||||
/*
|
||||
* Try figuring out the root device's canonical disk name.
|
||||
* The following choices are considered:
|
||||
* /dev/ad0s1a => /dev/ad0
|
||||
* /dev/da0a => /dev/da0
|
||||
* /dev/vinum/root => /dev/vinum/root
|
||||
*/
|
||||
static char *
|
||||
get_rootdisk(void)
|
||||
{
|
||||
struct statfs rootfs;
|
||||
regex_t re;
|
||||
#define NMATCHES 2
|
||||
regmatch_t rm[NMATCHES];
|
||||
char *s;
|
||||
int rv;
|
||||
|
||||
if (statfs("/", &rootfs) == -1)
|
||||
err(1, "statfs(\"/\")");
|
||||
|
||||
if ((rv = regcomp(&re, "^(/dev/[a-z]+[0-9]+)([sp][0-9]+)?[a-h]?$",
|
||||
REG_EXTENDED)) != 0)
|
||||
errx(1, "regcomp() failed (%d)", rv);
|
||||
if ((rv = regexec(&re, rootfs.f_mntfromname, NMATCHES, rm, 0)) != 0)
|
||||
errx(1,
|
||||
"mounted root fs resource doesn't match expectations (regexec returned %d)",
|
||||
rv);
|
||||
if ((s = malloc(rm[1].rm_eo - rm[1].rm_so + 1)) == NULL)
|
||||
errx(1, "out of memory");
|
||||
memcpy(s, rootfs.f_mntfromname + rm[1].rm_so,
|
||||
rm[1].rm_eo - rm[1].rm_so);
|
||||
s[rm[1].rm_eo - rm[1].rm_so] = 0;
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
static void
|
||||
reset_boot(void)
|
||||
{
|
||||
int i;
|
||||
struct pc98_partition *partp;
|
||||
|
||||
init_boot();
|
||||
for (i = 1; i <= PC98_NPARTS; i++) {
|
||||
partp = ((struct pc98_partition *) &mboot.parts) + i - 1;
|
||||
bzero((char *)partp, sizeof (struct pc98_partition));
|
||||
}
|
||||
}
|
@ -543,11 +543,6 @@ The
|
||||
option enables backward compatibility for partition names
|
||||
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
|
||||
|
@ -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
|
||||
|
@ -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 ,
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -66,8 +66,6 @@ driver include:
|
||||
.Pp
|
||||
.Bl -bullet -compact
|
||||
.It
|
||||
MELCO IFC-DP (PC-98)
|
||||
.It
|
||||
Sun ESP family
|
||||
.It
|
||||
Sun FAS family
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 \
|
||||
|
@ -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 ,
|
||||
|
@ -1,162 +0,0 @@
|
||||
.\" Copyright (c) 2003 Noriaki MITSUNAGA. All rights reserved.
|
||||
.\" Copyright (c) 2003 Hideyuki KURASHINA. All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd November 18, 2003
|
||||
.Dt CT 4 i386
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ct
|
||||
.Nd "WD33C93[ABC] based CBUS SCSI host adapter driver"
|
||||
.Sh SYNOPSIS
|
||||
.Cd "device ct"
|
||||
.Cd "device scbus"
|
||||
.Pp
|
||||
In
|
||||
.Pa /boot/device.hints:
|
||||
.Pp
|
||||
For most PC-9801-55, -92 and compatibles:
|
||||
.Cd hint.ct.0.at="isa"
|
||||
.Pp
|
||||
For ELECOM bus-master
|
||||
.Tn SCSI
|
||||
adapters:
|
||||
.Cd hint.ct.0.at="isa"
|
||||
.Cd hint.ct.0.flags="0x30000"
|
||||
.Pp
|
||||
For I-O DATA SC98 adapters:
|
||||
.Cd hint.ct.0.at="isa"
|
||||
.Cd hint.ct.0.flags="0x10000"
|
||||
.Pp
|
||||
For LOGITEC adapters:
|
||||
.Cd hint.ct.0.at="isa"
|
||||
.Cd hint.ct.0.flags="0x50000"
|
||||
.Pp
|
||||
For TEXA adapters:
|
||||
.Cd hint.ct.0.at="isa"
|
||||
.Cd hint.ct.0.flags="0x20000"
|
||||
.Pp
|
||||
For adapters with SMIT transfer mode to enable SMIT transfer:
|
||||
.Cd hint.ct.0.at="isa"
|
||||
.Cd hint.ct.0.flags="0x40000"
|
||||
.Cd hint.ct.0.maddr="0xdc000"
|
||||
.Pp
|
||||
Flags meaning:
|
||||
.Bl -tag -offset indent -compact -width 0x000000
|
||||
.It 0x00000
|
||||
DMA transfer mode for an NEC PC-9801-55, -92 (or
|
||||
compatibles), ICM IF-2660, Midori-Denshi MDC-554NA, or
|
||||
Logitec LHA-N151
|
||||
.It 0x10000
|
||||
DMA transfer mode for an I-O DATA SC-98II
|
||||
.It 0x20000
|
||||
bus-master transfer mode for a TEXA HA-55BS2, its
|
||||
successors, or Midori-Denshi MDC-926R
|
||||
.It 0x30000
|
||||
bus-master transfer mode for an ELECOM bus-master SCSI
|
||||
adapter
|
||||
.It 0x40000
|
||||
SMIT transfer mode (for supported adapters only)
|
||||
.It 0x50000
|
||||
bus-master transfer mode for a Logitec LHA-20x series,
|
||||
ICM IF-2766, IF-2766ET, IF-2767 or IF-2769
|
||||
.El
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
driver provides access to the
|
||||
.Tn SCSI
|
||||
bus connected to a WD33C93[ABC] based host adapter.
|
||||
.Sh HARDWARE
|
||||
The
|
||||
.Nm
|
||||
driver supports the following adapters:
|
||||
.Pp
|
||||
.Bl -bullet -compact
|
||||
.It
|
||||
ELECOM bus-master
|
||||
.Tn SCSI
|
||||
adapters
|
||||
.It
|
||||
I-O DATA SC-98II
|
||||
.It
|
||||
ICM IF-2660, IF-2766, IF-2766ET, IF-2767 and IF-2769
|
||||
.It
|
||||
Logitec LHA-N151 and LHA-20x series
|
||||
.It
|
||||
Midori-Denshi MDC-554NA and MDC-926R
|
||||
.It
|
||||
NEC PC-9801-55, 92 and compatibles
|
||||
.It
|
||||
SMIT transfer type
|
||||
.Tn SCSI
|
||||
host adapters
|
||||
.It
|
||||
TEXA HA-55BS2 and its later models
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr cd 4 ,
|
||||
.Xr ch 4 ,
|
||||
.Xr ctau 4 ,
|
||||
.Xr da 4 ,
|
||||
.Xr intro 4 ,
|
||||
.Xr sa 4 ,
|
||||
.Xr scsi 4
|
||||
.Sh NOTES
|
||||
Historically, the driver for the Cronyx Tau WAN adapters was
|
||||
.Dq ct .
|
||||
This device name was changed to
|
||||
.Dq ctau
|
||||
to avoid conflicts
|
||||
with this pc98
|
||||
.Nm
|
||||
driver.
|
||||
The network device name for
|
||||
.Xr ctau 4
|
||||
is
|
||||
.Dq Li ct .
|
||||
Please see
|
||||
.Xr ctau 4
|
||||
for the details for that device.
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
device driver has been developed for
|
||||
.Nx Ns /pc98
|
||||
and ported for
|
||||
.Fx .
|
||||
It first appeared in
|
||||
.Fx 4.4 .
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
The
|
||||
.Nm
|
||||
driver was written by
|
||||
.An Naofumi HONDA .
|
||||
.Pp
|
||||
This manual page was written by
|
||||
.An Noriaki MITSUNAGA Aq Mt non@FreeBSD.org
|
||||
and
|
||||
.An Hideyuki KURASHINA Aq Mt rushani@FreeBSD.org .
|
@ -1,142 +0,0 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2004 Tom Rhodes
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd September 4, 2004
|
||||
.Dt SNC 4 i386
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm snc
|
||||
.Nd National Semiconductor DP8393X SONIC Ethernet adapter driver
|
||||
.Sh SYNOPSIS
|
||||
.Cd device isa
|
||||
.Cd device snc
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
driver provides support for the
|
||||
.Tn National
|
||||
.Tn Semiconductor
|
||||
.Tn SONIC
|
||||
Ethernet adapters.
|
||||
.Sh HARDWARE
|
||||
The
|
||||
.Nm
|
||||
driver supports the following cards:
|
||||
.Pp
|
||||
.Bl -bullet -compact
|
||||
.It
|
||||
National Semiconductor DP83934AVQB
|
||||
.It
|
||||
NEC PC-9801-83
|
||||
.It
|
||||
NEC PC-9801-84
|
||||
.It
|
||||
NEC PC-9801-103
|
||||
.It
|
||||
NEC PC-9801-104
|
||||
.It
|
||||
NEC PC-9801N-15
|
||||
.It
|
||||
NEC PC-9801N-25
|
||||
.It
|
||||
NEC PC-9801N-J02 PCMCIA
|
||||
.It
|
||||
NEC PC-9801N-J02R PCMCIA
|
||||
.El
|
||||
.Pp
|
||||
The
|
||||
.Nm
|
||||
driver also includes support for the
|
||||
.Tn National
|
||||
.Tn Semiconductor
|
||||
.Tn NS46C46
|
||||
as
|
||||
64 * 16 bits Microwave Serial
|
||||
.Tn EEPROM .
|
||||
.Sh IMPLEMENTATION NOTES
|
||||
Accessing
|
||||
.Tn SONIC
|
||||
card data structures and registers as 32 bit values
|
||||
makes code endianness independent.
|
||||
The
|
||||
.Tn SONIC
|
||||
is however always in big-endian mode so it is necessary to
|
||||
ensure that data structures shared
|
||||
between the
|
||||
.Tn CPU
|
||||
and the
|
||||
.Tn SONIC
|
||||
card are always in big-endian order.
|
||||
The
|
||||
.Nm
|
||||
driver supports the
|
||||
.Tn PC-98
|
||||
C-Bus,
|
||||
and
|
||||
.Tn PnP
|
||||
buses.
|
||||
Support is also provided for the legacy C-Bus.
|
||||
.Sh DIAGNOSTICS
|
||||
The following driver specific error messages
|
||||
may be reported:
|
||||
.Bl -diag
|
||||
.It "snc%d: snc_nec16_register_irq: unsupported irq (%d)"
|
||||
The card returned an
|
||||
.Tn IRQ
|
||||
which is not supported by the driver.
|
||||
.It "snc%d: invalid packet length %d bytes"
|
||||
An attempt to transfer a data packet failed due to an
|
||||
invalid packet length.
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr netintro 4 ,
|
||||
.Xr bus_alloc_resource_any 9
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
driver was ported from
|
||||
.Nx
|
||||
by
|
||||
.An -nosplit
|
||||
.An Motomichi Matsuzaki Aq Mt mzaki@e-mail.ne.jp
|
||||
and
|
||||
.An Hiroshi Yamashita Aq Mt bluemoon@msj.biglobe.ne.jp .
|
||||
It first appeared in
|
||||
.Fx 4.2 .
|
||||
This manual page first appeared in
|
||||
.Fx 5.3 .
|
||||
.Sh AUTHORS
|
||||
This manual page was written by
|
||||
.An Tom Rhodes Aq Mt trhodes@FreeBSD.org .
|
||||
.Sh BUGS
|
||||
Currently the
|
||||
.Nm
|
||||
driver only works on the
|
||||
.Tn PC-98
|
||||
architecture.
|
||||
It should probably work on the i386 architecture
|
||||
as well.
|
@ -72,15 +72,6 @@ chips:
|
||||
.It
|
||||
.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 ,
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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]}
|
||||
|
@ -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
|
||||
|
@ -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 \
|
||||
|
@ -1,134 +0,0 @@
|
||||
# $FreeBSD$
|
||||
# alt
|
||||
# scan cntrl alt alt cntrl lock
|
||||
# code base shift cntrl shift alt shift cntrl shift state
|
||||
# ------------------------------------------------------------------
|
||||
000 esc esc esc esc esc esc debug esc O
|
||||
001 '1' '!' '!' '!' '1' '!' '!' '!' O
|
||||
002 '2' '@' sub sub '2' '"' nul nul O
|
||||
003 '3' '#' esc esc '3' '#' esc esc O
|
||||
004 '4' '$' fs fs '4' '$' fs fs O
|
||||
005 '5' '%' gs gs '5' '%' gs gs O
|
||||
006 '6' '^' rs rs '6' '&' rs rs O
|
||||
007 '7' '&' '&' '&' '7' ''' us us O
|
||||
008 '8' '*' bs bs '8' '(' del del O
|
||||
009 '9' '(' '(' '(' '9' ')' '9' '9' O
|
||||
010 '0' ')' ')' ')' '0' nop '0' '0' O
|
||||
011 '-' '_' us us '-' '=' '-' '-' O
|
||||
012 '=' '+' '+' '+' '^' '`' rs rs O
|
||||
013 '\' '|' fs fs '\' '|' fs fs O
|
||||
014 bs bs bs bs bs bs bs bs O
|
||||
015 ht btab ht btab ht btab ht btab O
|
||||
016 'q' 'Q' dc1 dc1 'q' 'Q' dc1 dc1 C
|
||||
017 'w' 'W' etb etb 'w' 'W' etb etb C
|
||||
018 'e' 'E' enq enq 'e' 'E' enq enq C
|
||||
019 'r' 'R' dc2 dc2 'r' 'R' dc2 dc2 C
|
||||
020 't' 'T' dc4 dc4 't' 'T' dc4 dc4 C
|
||||
021 'y' 'Y' em em 'y' 'Y' em em C
|
||||
022 'u' 'U' nak nak 'u' 'U' nak nak C
|
||||
023 'i' 'I' ht ht 'i' 'I' ht ht C
|
||||
024 'o' 'O' si si 'o' 'O' si si C
|
||||
025 'p' 'P' dle dle 'p' 'P' dle dle C
|
||||
026 '[' '{' esc esc '@' '~' nul nul O
|
||||
027 ']' '}' gs gs '[' '{' esc esc O
|
||||
028 cr cr nl nl cr cr nl nl O
|
||||
029 'a' 'A' soh soh 'a' 'A' soh soh C
|
||||
030 's' 'S' dc3 dc3 's' 'S' dc3 dc3 C
|
||||
031 'd' 'D' eot eot 'd' 'D' eot eot C
|
||||
032 'f' 'F' ack ack 'f' 'F' ack ack C
|
||||
033 'g' 'G' bel bel 'g' 'G' bel bel C
|
||||
034 'h' 'H' bs bs 'h' 'H' bs bs C
|
||||
035 'j' 'J' nl nl 'j' 'J' nl nl C
|
||||
036 'k' 'K' vt vt 'k' 'K' vt vt C
|
||||
037 'l' 'L' ff ff 'l' 'L' ff ff C
|
||||
038 ';' ':' ';' ';' ';' '+' ';' ';' O
|
||||
039 ''' '"' ''' ''' ':' '*' ':' ':' O
|
||||
040 '`' '~' '~' '~' ']' '}' gs gs O
|
||||
041 'z' 'Z' sub sub 'z' 'Z' sub sub C
|
||||
042 'x' 'X' can can 'x' 'X' can can C
|
||||
043 'c' 'C' etx etx 'c' 'C' etx etx C
|
||||
044 'v' 'V' syn syn 'v' 'V' syn syn C
|
||||
045 'b' 'B' stx stx 'b' 'B' stx stx C
|
||||
046 'n' 'N' so so 'n' 'N' so so C
|
||||
047 'm' 'M' cr cr 'm' 'M' cr cr C
|
||||
048 ',' '<' '<' '<' ',' '<' '<' '<' O
|
||||
049 '.' '>' '>' '>' '.' '>' '>' '>' O
|
||||
050 '/' '?' del del '/' '?' del del O
|
||||
051 '\' '|' fs fs nop '_' us us O
|
||||
052 ' ' ' ' nul nul ' ' ' ' nul nul O
|
||||
053 esc esc esc esc esc esc esc esc O
|
||||
054 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 O
|
||||
055 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 O
|
||||
056 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 O
|
||||
057 del del del del del del boot boot N
|
||||
058 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 O
|
||||
059 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 O
|
||||
060 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 O
|
||||
061 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 O
|
||||
062 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 O
|
||||
063 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 O
|
||||
064 '-' '-' '-' '-' '-' '-' '-' '-' O
|
||||
065 '/' '/' '/' '/' '/' '/' '/' '/' O
|
||||
066 '7' '7' '7' '7' '7' '7' '7' '7' O
|
||||
067 '8' '8' '8' '8' '8' '8' '8' '8' O
|
||||
068 '9' '9' '9' '9' '9' '9' '9' '9' O
|
||||
069 '*' '*' '*' '*' '*' '*' '*' '*' O
|
||||
070 '4' '4' '4' '4' '4' '4' '4' '4' O
|
||||
071 '5' '5' '5' '5' '5' '5' '5' '5' O
|
||||
072 '6' '6' '6' '6' '6' '6' '6' '6' O
|
||||
073 '+' '+' '+' '+' '+' '+' '+' '+' O
|
||||
074 '1' '1' '1' '1' '1' '1' '1' '1' O
|
||||
075 '2' '2' '2' '2' '2' '2' '2' '2' O
|
||||
076 '3' '3' '3' '3' '3' '3' '3' '3' O
|
||||
077 '=' '=' '=' '=' '=' '=' '=' '=' O
|
||||
078 '0' '0' '0' '0' '0' '0' '0' '0' O
|
||||
079 ',' ',' ',' ',' ',' ',' ',' ',' O
|
||||
080 '.' '.' '.' '.' '.' '.' '.' '.' O
|
||||
081 meta meta meta meta meta meta meta meta O
|
||||
082 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O
|
||||
083 fkey12 fkey24 fkey36 fkey48 scr12 scr12 scr12 scr12 O
|
||||
084 slock slock slock slock slock slock slock slock O
|
||||
085 nop nop nop nop nop nop nop nop O
|
||||
086 nop nop nop nop nop nop nop nop O
|
||||
087 nop nop nop nop nop nop nop nop O
|
||||
088 nop nop nop nop nop nop nop nop O
|
||||
089 nop nop nop nop nop nop nop nop O
|
||||
090 nop nop nop nop nop nop nop nop O
|
||||
091 nop nop nop nop nop nop nop nop O
|
||||
092 nop nop nop nop nop nop nop nop O
|
||||
093 nop nop nop nop nop nop nop nop O
|
||||
094 nop nop nop nop nop nop nop nop O
|
||||
095 nop nop nop nop nop nop nop nop O
|
||||
096 slock saver slock saver susp nop susp nop O
|
||||
097 nscr nscr debug debug nop nop nop nop O
|
||||
098 fkey01 fkey13 fkey25 fkey37 scr01 scr01 scr01 scr01 O
|
||||
099 fkey02 fkey14 fkey26 fkey38 scr02 scr02 scr02 scr02 O
|
||||
100 fkey03 fkey15 fkey27 fkey39 scr03 scr03 scr03 scr03 O
|
||||
101 fkey04 fkey16 fkey28 fkey40 scr04 scr04 scr04 scr04 O
|
||||
102 fkey05 fkey17 fkey29 fkey41 scr05 scr05 scr05 scr05 O
|
||||
103 fkey06 fkey18 fkey30 fkey42 scr06 scr06 scr06 scr06 O
|
||||
104 fkey07 fkey19 fkey31 fkey43 scr07 scr07 scr07 scr07 O
|
||||
105 fkey08 fkey20 fkey32 fkey44 scr08 scr08 scr08 scr08 O
|
||||
106 fkey09 fkey21 fkey33 fkey45 scr09 scr09 scr09 scr09 O
|
||||
107 fkey10 fkey22 fkey34 fkey46 scr10 scr10 scr10 scr10 O
|
||||
108 nop nop nop nop nop nop nop nop O
|
||||
109 nop nop nop nop nop nop nop nop O
|
||||
110 nop nop nop nop nop nop nop nop O
|
||||
111 nop nop nop nop nop nop nop nop O
|
||||
112 lshift lshift lshift lshift lshift lshift lshift lshift O
|
||||
113 clock clock clock clock clock clock clock clock O
|
||||
114 lalt lalt lalt lalt lalt lalt lalt lalt O
|
||||
115 lalt lalt lalt lalt lalt lalt lalt lalt O
|
||||
116 lctrl lctrl lctrl lctrl lctrl lctrl lctrl lctrl O
|
||||
117 nop nop nop nop nop nop nop nop O
|
||||
118 nop nop nop nop nop nop nop nop O
|
||||
119 nop nop nop nop nop nop nop nop O
|
||||
120 nop nop nop nop nop nop nop nop O
|
||||
121 nop nop nop nop nop nop nop nop O
|
||||
122 nop nop nop nop nop nop nop nop O
|
||||
123 nop nop nop nop nop nop nop nop O
|
||||
124 nop nop nop nop nop nop nop nop O
|
||||
125 nop nop nop nop nop nop nop nop O
|
||||
126 nop nop nop nop nop nop nop nop O
|
||||
127 nop nop nop nop nop nop nop nop O
|
||||
|
@ -1,134 +0,0 @@
|
||||
# $FreeBSD$
|
||||
# alt
|
||||
# scan cntrl alt alt cntrl lock
|
||||
# code base shift cntrl shift alt shift cntrl shift state
|
||||
# ------------------------------------------------------------------
|
||||
000 esc esc esc esc esc esc debug esc O
|
||||
001 '1' '!' '!' '!' '1' '!' '!' '!' O
|
||||
002 '2' '"' sub sub '2' '@' nul nul O
|
||||
003 '3' '#' esc esc '3' '#' esc esc O
|
||||
004 '4' '$' fs fs '4' '$' fs fs O
|
||||
005 '5' '%' gs gs '5' '%' gs gs O
|
||||
006 '6' '&' rs rs '6' '^' rs rs O
|
||||
007 '7' ''' us us '7' '&' '&' '&' O
|
||||
008 '8' '(' del del '8' '*' bs bs O
|
||||
009 '9' ')' '9' '9' '9' '(' '(' '(' O
|
||||
010 '0' nop '0' '0' '0' ')' ')' ')' O
|
||||
011 '-' '=' '-' '-' '-' '_' us us O
|
||||
012 '^' '`' rs rs '=' '+' '+' '+' O
|
||||
013 '\' '|' fs fs '\' '|' fs fs O
|
||||
014 bs bs bs bs bs bs bs bs O
|
||||
015 ht btab ht btab ht btab ht btab O
|
||||
016 'q' 'Q' dc1 dc1 'q' 'Q' dc1 dc1 C
|
||||
017 'w' 'W' etb etb 'w' 'W' etb etb C
|
||||
018 'e' 'E' enq enq 'e' 'E' enq enq C
|
||||
019 'r' 'R' dc2 dc2 'r' 'R' dc2 dc2 C
|
||||
020 't' 'T' dc4 dc4 't' 'T' dc4 dc4 C
|
||||
021 'y' 'Y' em em 'y' 'Y' em em C
|
||||
022 'u' 'U' nak nak 'u' 'U' nak nak C
|
||||
023 'i' 'I' ht ht 'i' 'I' ht ht C
|
||||
024 'o' 'O' si si 'o' 'O' si si C
|
||||
025 'p' 'P' dle dle 'p' 'P' dle dle C
|
||||
026 '@' '~' nul nul '[' '{' esc esc O
|
||||
027 '[' '{' esc esc ']' '}' gs gs O
|
||||
028 cr cr nl nl cr cr nl nl O
|
||||
029 'a' 'A' soh soh 'a' 'A' soh soh C
|
||||
030 's' 'S' dc3 dc3 's' 'S' dc3 dc3 C
|
||||
031 'd' 'D' eot eot 'd' 'D' eot eot C
|
||||
032 'f' 'F' ack ack 'f' 'F' ack ack C
|
||||
033 'g' 'G' bel bel 'g' 'G' bel bel C
|
||||
034 'h' 'H' bs bs 'h' 'H' bs bs C
|
||||
035 'j' 'J' nl nl 'j' 'J' nl nl C
|
||||
036 'k' 'K' vt vt 'k' 'K' vt vt C
|
||||
037 'l' 'L' ff ff 'l' 'L' ff ff C
|
||||
038 ';' '+' ';' ';' ';' ':' ';' ';' O
|
||||
039 ':' '*' ':' ':' ''' '"' ''' ''' O
|
||||
040 ']' '}' gs gs '`' '~' '~' '~' O
|
||||
041 'z' 'Z' sub sub 'z' 'Z' sub sub C
|
||||
042 'x' 'X' can can 'x' 'X' can can C
|
||||
043 'c' 'C' etx etx 'c' 'C' etx etx C
|
||||
044 'v' 'V' syn syn 'v' 'V' syn syn C
|
||||
045 'b' 'B' stx stx 'b' 'B' stx stx C
|
||||
046 'n' 'N' so so 'n' 'N' so so C
|
||||
047 'm' 'M' cr cr 'm' 'M' cr cr C
|
||||
048 ',' '<' '<' '<' ',' '<' '<' '<' O
|
||||
049 '.' '>' '>' '>' '.' '>' '>' '>' O
|
||||
050 '/' '?' del del '/' '?' del del O
|
||||
051 nop '_' us us '\' '|' fs fs O
|
||||
052 ' ' ' ' nul nul ' ' ' ' nul nul O
|
||||
053 esc esc esc esc esc esc esc esc O
|
||||
054 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 O
|
||||
055 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 O
|
||||
056 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 O
|
||||
057 del del del del del del boot boot N
|
||||
058 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 O
|
||||
059 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 O
|
||||
060 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 O
|
||||
061 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 O
|
||||
062 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 O
|
||||
063 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 O
|
||||
064 '-' '-' '-' '-' '-' '-' '-' '-' O
|
||||
065 '/' '/' '/' '/' '/' '/' '/' '/' O
|
||||
066 '7' '7' '7' '7' '7' '7' '7' '7' O
|
||||
067 '8' '8' '8' '8' '8' '8' '8' '8' O
|
||||
068 '9' '9' '9' '9' '9' '9' '9' '9' O
|
||||
069 '*' '*' '*' '*' '*' '*' '*' '*' O
|
||||
070 '4' '4' '4' '4' '4' '4' '4' '4' O
|
||||
071 '5' '5' '5' '5' '5' '5' '5' '5' O
|
||||
072 '6' '6' '6' '6' '6' '6' '6' '6' O
|
||||
073 '+' '+' '+' '+' '+' '+' '+' '+' O
|
||||
074 '1' '1' '1' '1' '1' '1' '1' '1' O
|
||||
075 '2' '2' '2' '2' '2' '2' '2' '2' O
|
||||
076 '3' '3' '3' '3' '3' '3' '3' '3' O
|
||||
077 '=' '=' '=' '=' '=' '=' '=' '=' O
|
||||
078 '0' '0' '0' '0' '0' '0' '0' '0' O
|
||||
079 ',' ',' ',' ',' ',' ',' ',' ',' O
|
||||
080 '.' '.' '.' '.' '.' '.' '.' '.' O
|
||||
081 meta meta meta meta meta meta meta meta O
|
||||
082 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O
|
||||
083 fkey12 fkey24 fkey36 fkey48 scr12 scr12 scr12 scr12 O
|
||||
084 slock slock slock slock slock slock slock slock O
|
||||
085 nop nop nop nop nop nop nop nop O
|
||||
086 nop nop nop nop nop nop nop nop O
|
||||
087 nop nop nop nop nop nop nop nop O
|
||||
088 nop nop nop nop nop nop nop nop O
|
||||
089 nop nop nop nop nop nop nop nop O
|
||||
090 nop nop nop nop nop nop nop nop O
|
||||
091 nop nop nop nop nop nop nop nop O
|
||||
092 nop nop nop nop nop nop nop nop O
|
||||
093 nop nop nop nop nop nop nop nop O
|
||||
094 nop nop nop nop nop nop nop nop O
|
||||
095 nop nop nop nop nop nop nop nop O
|
||||
096 slock saver slock saver susp nop susp nop O
|
||||
097 nscr nscr debug debug nop nop nop nop O
|
||||
098 fkey01 fkey13 fkey25 fkey37 scr01 scr01 scr01 scr01 O
|
||||
099 fkey02 fkey14 fkey26 fkey38 scr02 scr02 scr02 scr02 O
|
||||
100 fkey03 fkey15 fkey27 fkey39 scr03 scr03 scr03 scr03 O
|
||||
101 fkey04 fkey16 fkey28 fkey40 scr04 scr04 scr04 scr04 O
|
||||
102 fkey05 fkey17 fkey29 fkey41 scr05 scr05 scr05 scr05 O
|
||||
103 fkey06 fkey18 fkey30 fkey42 scr06 scr06 scr06 scr06 O
|
||||
104 fkey07 fkey19 fkey31 fkey43 scr07 scr07 scr07 scr07 O
|
||||
105 fkey08 fkey20 fkey32 fkey44 scr08 scr08 scr08 scr08 O
|
||||
106 fkey09 fkey21 fkey33 fkey45 scr09 scr09 scr09 scr09 O
|
||||
107 fkey10 fkey22 fkey34 fkey46 scr10 scr10 scr10 scr10 O
|
||||
108 nop nop nop nop nop nop nop nop O
|
||||
109 nop nop nop nop nop nop nop nop O
|
||||
110 nop nop nop nop nop nop nop nop O
|
||||
111 nop nop nop nop nop nop nop nop O
|
||||
112 lshift lshift lshift lshift lshift lshift lshift lshift O
|
||||
113 clock clock clock clock clock clock clock clock O
|
||||
114 lalt lalt lalt lalt lalt lalt lalt lalt O
|
||||
115 lalt lalt lalt lalt lalt lalt lalt lalt O
|
||||
116 lctrl lctrl lctrl lctrl lctrl lctrl lctrl lctrl O
|
||||
117 nop nop nop nop nop nop nop nop O
|
||||
118 nop nop nop nop nop nop nop nop O
|
||||
119 nop nop nop nop nop nop nop nop O
|
||||
120 nop nop nop nop nop nop nop nop O
|
||||
121 nop nop nop nop nop nop nop nop O
|
||||
122 nop nop nop nop nop nop nop nop O
|
||||
123 nop nop nop nop nop nop nop nop O
|
||||
124 nop nop nop nop nop nop nop nop O
|
||||
125 nop nop nop nop nop nop nop nop O
|
||||
126 nop nop nop nop nop nop nop nop O
|
||||
127 nop nop nop nop nop nop nop nop O
|
||||
|
@ -301,20 +301,6 @@ jp.capsctrl.kbd:pt:Japonês 106x
|
||||
jp.capsctrl.kbd:es:Japonés 106x
|
||||
jp.capsctrl.kbd: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
|
||||
|
@ -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 \
|
||||
|
@ -1,134 +0,0 @@
|
||||
# $FreeBSD$
|
||||
# alt
|
||||
# scan cntrl alt alt cntrl lock
|
||||
# code base shift cntrl shift alt shift cntrl shift state
|
||||
# ------------------------------------------------------------------
|
||||
000 esc esc esc esc esc esc debug esc O
|
||||
001 '1' '!' '!' '!' '1' '!' '!' '!' O
|
||||
002 '2' '@' sub sub '2' '"' nul nul O
|
||||
003 '3' '#' esc esc '3' '#' esc esc O
|
||||
004 '4' '$' fs fs '4' '$' fs fs O
|
||||
005 '5' '%' gs gs '5' '%' gs gs O
|
||||
006 '6' '^' rs rs '6' '&' rs rs O
|
||||
007 '7' '&' '&' '&' '7' ''' us us O
|
||||
008 '8' '*' bs bs '8' '(' del del O
|
||||
009 '9' '(' '(' '(' '9' ')' '9' '9' O
|
||||
010 '0' ')' ')' ')' '0' nop '0' '0' O
|
||||
011 '-' '_' us us '-' '=' '-' '-' O
|
||||
012 '=' '+' '+' '+' '^' '`' rs rs O
|
||||
013 0xa5 '|' fs fs 0xa5 '|' fs fs O
|
||||
014 bs bs bs bs bs bs bs bs O
|
||||
015 ht btab ht btab ht btab ht btab O
|
||||
016 'q' 'Q' dc1 dc1 'q' 'Q' dc1 dc1 C
|
||||
017 'w' 'W' etb etb 'w' 'W' etb etb C
|
||||
018 'e' 'E' enq enq 'e' 'E' enq enq C
|
||||
019 'r' 'R' dc2 dc2 'r' 'R' dc2 dc2 C
|
||||
020 't' 'T' dc4 dc4 't' 'T' dc4 dc4 C
|
||||
021 'y' 'Y' em em 'y' 'Y' em em C
|
||||
022 'u' 'U' nak nak 'u' 'U' nak nak C
|
||||
023 'i' 'I' ht ht 'i' 'I' ht ht C
|
||||
024 'o' 'O' si si 'o' 'O' si si C
|
||||
025 'p' 'P' dle dle 'p' 'P' dle dle C
|
||||
026 '[' '{' esc esc '@' '~' nul nul O
|
||||
027 ']' '}' gs gs '[' '{' esc esc O
|
||||
028 cr cr nl nl cr cr nl nl O
|
||||
029 'a' 'A' soh soh 'a' 'A' soh soh C
|
||||
030 's' 'S' dc3 dc3 's' 'S' dc3 dc3 C
|
||||
031 'd' 'D' eot eot 'd' 'D' eot eot C
|
||||
032 'f' 'F' ack ack 'f' 'F' ack ack C
|
||||
033 'g' 'G' bel bel 'g' 'G' bel bel C
|
||||
034 'h' 'H' bs bs 'h' 'H' bs bs C
|
||||
035 'j' 'J' nl nl 'j' 'J' nl nl C
|
||||
036 'k' 'K' vt vt 'k' 'K' vt vt C
|
||||
037 'l' 'L' ff ff 'l' 'L' ff ff C
|
||||
038 ';' ':' ';' ';' ';' '+' ';' ';' O
|
||||
039 ''' '"' ''' ''' ':' '*' ':' ':' O
|
||||
040 '`' '~' '~' '~' ']' '}' gs gs O
|
||||
041 'z' 'Z' sub sub 'z' 'Z' sub sub C
|
||||
042 'x' 'X' can can 'x' 'X' can can C
|
||||
043 'c' 'C' etx etx 'c' 'C' etx etx C
|
||||
044 'v' 'V' syn syn 'v' 'V' syn syn C
|
||||
045 'b' 'B' stx stx 'b' 'B' stx stx C
|
||||
046 'n' 'N' so so 'n' 'N' so so C
|
||||
047 'm' 'M' cr cr 'm' 'M' cr cr C
|
||||
048 ',' '<' '<' '<' ',' '<' '<' '<' O
|
||||
049 '.' '>' '>' '>' '.' '>' '>' '>' O
|
||||
050 '/' '?' del del '/' '?' del del O
|
||||
051 '\' '|' fs fs nop '_' us us O
|
||||
052 ' ' ' ' nul nul ' ' ' ' nul nul O
|
||||
053 esc esc esc esc esc esc esc esc O
|
||||
054 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 O
|
||||
055 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 O
|
||||
056 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 O
|
||||
057 del del del del del del boot boot N
|
||||
058 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 O
|
||||
059 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 O
|
||||
060 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 O
|
||||
061 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 O
|
||||
062 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 O
|
||||
063 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 O
|
||||
064 '-' '-' '-' '-' '-' '-' '-' '-' O
|
||||
065 '/' '/' '/' '/' '/' '/' '/' '/' O
|
||||
066 '7' '7' '7' '7' '7' '7' '7' '7' O
|
||||
067 '8' '8' '8' '8' '8' '8' '8' '8' O
|
||||
068 '9' '9' '9' '9' '9' '9' '9' '9' O
|
||||
069 '*' '*' '*' '*' '*' '*' '*' '*' O
|
||||
070 '4' '4' '4' '4' '4' '4' '4' '4' O
|
||||
071 '5' '5' '5' '5' '5' '5' '5' '5' O
|
||||
072 '6' '6' '6' '6' '6' '6' '6' '6' O
|
||||
073 '+' '+' '+' '+' '+' '+' '+' '+' O
|
||||
074 '1' '1' '1' '1' '1' '1' '1' '1' O
|
||||
075 '2' '2' '2' '2' '2' '2' '2' '2' O
|
||||
076 '3' '3' '3' '3' '3' '3' '3' '3' O
|
||||
077 '=' '=' '=' '=' '=' '=' '=' '=' O
|
||||
078 '0' '0' '0' '0' '0' '0' '0' '0' O
|
||||
079 ',' ',' ',' ',' ',' ',' ',' ',' O
|
||||
080 '.' '.' '.' '.' '.' '.' '.' '.' O
|
||||
081 meta meta meta meta meta meta meta meta O
|
||||
082 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O
|
||||
083 fkey12 fkey24 fkey36 fkey48 scr12 scr12 scr12 scr12 O
|
||||
084 slock slock slock slock slock slock slock slock O
|
||||
085 nop nop nop nop nop nop nop nop O
|
||||
086 nop nop nop nop nop nop nop nop O
|
||||
087 nop nop nop nop nop nop nop nop O
|
||||
088 nop nop nop nop nop nop nop nop O
|
||||
089 nop nop nop nop nop nop nop nop O
|
||||
090 nop nop nop nop nop nop nop nop O
|
||||
091 nop nop nop nop nop nop nop nop O
|
||||
092 nop nop nop nop nop nop nop nop O
|
||||
093 nop nop nop nop nop nop nop nop O
|
||||
094 nop nop nop nop nop nop nop nop O
|
||||
095 nop nop nop nop nop nop nop nop O
|
||||
096 slock saver slock saver susp nop susp nop O
|
||||
097 nscr nscr debug debug nop nop nop nop O
|
||||
098 fkey01 fkey13 fkey25 fkey37 scr01 scr01 scr01 scr01 O
|
||||
099 fkey02 fkey14 fkey26 fkey38 scr02 scr02 scr02 scr02 O
|
||||
100 fkey03 fkey15 fkey27 fkey39 scr03 scr03 scr03 scr03 O
|
||||
101 fkey04 fkey16 fkey28 fkey40 scr04 scr04 scr04 scr04 O
|
||||
102 fkey05 fkey17 fkey29 fkey41 scr05 scr05 scr05 scr05 O
|
||||
103 fkey06 fkey18 fkey30 fkey42 scr06 scr06 scr06 scr06 O
|
||||
104 fkey07 fkey19 fkey31 fkey43 scr07 scr07 scr07 scr07 O
|
||||
105 fkey08 fkey20 fkey32 fkey44 scr08 scr08 scr08 scr08 O
|
||||
106 fkey09 fkey21 fkey33 fkey45 scr09 scr09 scr09 scr09 O
|
||||
107 fkey10 fkey22 fkey34 fkey46 scr10 scr10 scr10 scr10 O
|
||||
108 nop nop nop nop nop nop nop nop O
|
||||
109 nop nop nop nop nop nop nop nop O
|
||||
110 nop nop nop nop nop nop nop nop O
|
||||
111 nop nop nop nop nop nop nop nop O
|
||||
112 lshift lshift lshift lshift lshift lshift lshift lshift O
|
||||
113 clock clock clock clock clock clock clock clock O
|
||||
114 lalt lalt lalt lalt lalt lalt lalt lalt O
|
||||
115 lalt lalt lalt lalt lalt lalt lalt lalt O
|
||||
116 lctrl lctrl lctrl lctrl lctrl lctrl lctrl lctrl O
|
||||
117 nop nop nop nop nop nop nop nop O
|
||||
118 nop nop nop nop nop nop nop nop O
|
||||
119 nop nop nop nop nop nop nop nop O
|
||||
120 nop nop nop nop nop nop nop nop O
|
||||
121 nop nop nop nop nop nop nop nop O
|
||||
122 nop nop nop nop nop nop nop nop O
|
||||
123 nop nop nop nop nop nop nop nop O
|
||||
124 nop nop nop nop nop nop nop nop O
|
||||
125 nop nop nop nop nop nop nop nop O
|
||||
126 nop nop nop nop nop nop nop nop O
|
||||
127 nop nop nop nop nop nop nop nop O
|
||||
|
@ -1,134 +0,0 @@
|
||||
# $FreeBSD$
|
||||
# alt
|
||||
# scan cntrl alt alt cntrl lock
|
||||
# code base shift cntrl shift alt shift cntrl shift state
|
||||
# ------------------------------------------------------------------
|
||||
000 esc esc esc esc esc esc debug esc O
|
||||
001 '1' '!' '!' '!' '1' '!' '!' '!' O
|
||||
002 '2' '"' sub sub '2' '@' nul nul O
|
||||
003 '3' '#' esc esc '3' '#' esc esc O
|
||||
004 '4' '$' fs fs '4' '$' fs fs O
|
||||
005 '5' '%' gs gs '5' '%' gs gs O
|
||||
006 '6' '&' rs rs '6' '^' rs rs O
|
||||
007 '7' ''' us us '7' '&' '&' '&' O
|
||||
008 '8' '(' del del '8' '*' bs bs O
|
||||
009 '9' ')' '9' '9' '9' '(' '(' '(' O
|
||||
010 '0' nop '0' '0' '0' ')' ')' ')' O
|
||||
011 '-' '=' '-' '-' '-' '_' us us O
|
||||
012 '^' '`' rs rs '=' '+' '+' '+' O
|
||||
013 '\' '|' fs fs 0xa5 '|' fs fs O
|
||||
014 bs bs bs bs bs bs bs bs O
|
||||
015 ht btab ht btab ht btab ht btab O
|
||||
016 'q' 'Q' dc1 dc1 'q' 'Q' dc1 dc1 C
|
||||
017 'w' 'W' etb etb 'w' 'W' etb etb C
|
||||
018 'e' 'E' enq enq 'e' 'E' enq enq C
|
||||
019 'r' 'R' dc2 dc2 'r' 'R' dc2 dc2 C
|
||||
020 't' 'T' dc4 dc4 't' 'T' dc4 dc4 C
|
||||
021 'y' 'Y' em em 'y' 'Y' em em C
|
||||
022 'u' 'U' nak nak 'u' 'U' nak nak C
|
||||
023 'i' 'I' ht ht 'i' 'I' ht ht C
|
||||
024 'o' 'O' si si 'o' 'O' si si C
|
||||
025 'p' 'P' dle dle 'p' 'P' dle dle C
|
||||
026 '@' '~' nul nul '[' '{' esc esc O
|
||||
027 '[' '{' esc esc ']' '}' gs gs O
|
||||
028 cr cr nl nl cr cr nl nl O
|
||||
029 'a' 'A' soh soh 'a' 'A' soh soh C
|
||||
030 's' 'S' dc3 dc3 's' 'S' dc3 dc3 C
|
||||
031 'd' 'D' eot eot 'd' 'D' eot eot C
|
||||
032 'f' 'F' ack ack 'f' 'F' ack ack C
|
||||
033 'g' 'G' bel bel 'g' 'G' bel bel C
|
||||
034 'h' 'H' bs bs 'h' 'H' bs bs C
|
||||
035 'j' 'J' nl nl 'j' 'J' nl nl C
|
||||
036 'k' 'K' vt vt 'k' 'K' vt vt C
|
||||
037 'l' 'L' ff ff 'l' 'L' ff ff C
|
||||
038 ';' '+' ';' ';' ';' ':' ';' ';' O
|
||||
039 ':' '*' ':' ':' ''' '"' ''' ''' O
|
||||
040 ']' '}' gs gs '`' '~' '~' '~' O
|
||||
041 'z' 'Z' sub sub 'z' 'Z' sub sub C
|
||||
042 'x' 'X' can can 'x' 'X' can can C
|
||||
043 'c' 'C' etx etx 'c' 'C' etx etx C
|
||||
044 'v' 'V' syn syn 'v' 'V' syn syn C
|
||||
045 'b' 'B' stx stx 'b' 'B' stx stx C
|
||||
046 'n' 'N' so so 'n' 'N' so so C
|
||||
047 'm' 'M' cr cr 'm' 'M' cr cr C
|
||||
048 ',' '<' '<' '<' ',' '<' '<' '<' O
|
||||
049 '.' '>' '>' '>' '.' '>' '>' '>' O
|
||||
050 '/' '?' del del '/' '?' del del O
|
||||
051 nop '_' us us '\' '|' fs fs O
|
||||
052 ' ' ' ' nul nul ' ' ' ' nul nul O
|
||||
053 esc esc esc esc esc esc esc esc O
|
||||
054 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 O
|
||||
055 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 O
|
||||
056 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 O
|
||||
057 del del del del del del boot boot N
|
||||
058 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 O
|
||||
059 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 O
|
||||
060 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 O
|
||||
061 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 O
|
||||
062 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 O
|
||||
063 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 O
|
||||
064 '-' '-' '-' '-' '-' '-' '-' '-' O
|
||||
065 '/' '/' '/' '/' '/' '/' '/' '/' O
|
||||
066 '7' '7' '7' '7' '7' '7' '7' '7' O
|
||||
067 '8' '8' '8' '8' '8' '8' '8' '8' O
|
||||
068 '9' '9' '9' '9' '9' '9' '9' '9' O
|
||||
069 '*' '*' '*' '*' '*' '*' '*' '*' O
|
||||
070 '4' '4' '4' '4' '4' '4' '4' '4' O
|
||||
071 '5' '5' '5' '5' '5' '5' '5' '5' O
|
||||
072 '6' '6' '6' '6' '6' '6' '6' '6' O
|
||||
073 '+' '+' '+' '+' '+' '+' '+' '+' O
|
||||
074 '1' '1' '1' '1' '1' '1' '1' '1' O
|
||||
075 '2' '2' '2' '2' '2' '2' '2' '2' O
|
||||
076 '3' '3' '3' '3' '3' '3' '3' '3' O
|
||||
077 '=' '=' '=' '=' '=' '=' '=' '=' O
|
||||
078 '0' '0' '0' '0' '0' '0' '0' '0' O
|
||||
079 ',' ',' ',' ',' ',' ',' ',' ',' O
|
||||
080 '.' '.' '.' '.' '.' '.' '.' '.' O
|
||||
081 meta meta meta meta meta meta meta meta O
|
||||
082 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O
|
||||
083 fkey12 fkey24 fkey36 fkey48 scr12 scr12 scr12 scr12 O
|
||||
084 slock slock slock slock slock slock slock slock O
|
||||
085 nop nop nop nop nop nop nop nop O
|
||||
086 nop nop nop nop nop nop nop nop O
|
||||
087 nop nop nop nop nop nop nop nop O
|
||||
088 nop nop nop nop nop nop nop nop O
|
||||
089 nop nop nop nop nop nop nop nop O
|
||||
090 nop nop nop nop nop nop nop nop O
|
||||
091 nop nop nop nop nop nop nop nop O
|
||||
092 nop nop nop nop nop nop nop nop O
|
||||
093 nop nop nop nop nop nop nop nop O
|
||||
094 nop nop nop nop nop nop nop nop O
|
||||
095 nop nop nop nop nop nop nop nop O
|
||||
096 slock saver slock saver susp nop susp nop O
|
||||
097 nscr nscr debug debug nop nop nop nop O
|
||||
098 fkey01 fkey13 fkey25 fkey37 scr01 scr01 scr01 scr01 O
|
||||
099 fkey02 fkey14 fkey26 fkey38 scr02 scr02 scr02 scr02 O
|
||||
100 fkey03 fkey15 fkey27 fkey39 scr03 scr03 scr03 scr03 O
|
||||
101 fkey04 fkey16 fkey28 fkey40 scr04 scr04 scr04 scr04 O
|
||||
102 fkey05 fkey17 fkey29 fkey41 scr05 scr05 scr05 scr05 O
|
||||
103 fkey06 fkey18 fkey30 fkey42 scr06 scr06 scr06 scr06 O
|
||||
104 fkey07 fkey19 fkey31 fkey43 scr07 scr07 scr07 scr07 O
|
||||
105 fkey08 fkey20 fkey32 fkey44 scr08 scr08 scr08 scr08 O
|
||||
106 fkey09 fkey21 fkey33 fkey45 scr09 scr09 scr09 scr09 O
|
||||
107 fkey10 fkey22 fkey34 fkey46 scr10 scr10 scr10 scr10 O
|
||||
108 nop nop nop nop nop nop nop nop O
|
||||
109 nop nop nop nop nop nop nop nop O
|
||||
110 nop nop nop nop nop nop nop nop O
|
||||
111 nop nop nop nop nop nop nop nop O
|
||||
112 lshift lshift lshift lshift lshift lshift lshift lshift O
|
||||
113 clock clock clock clock clock clock clock clock O
|
||||
114 lalt lalt lalt lalt lalt lalt lalt lalt O
|
||||
115 lalt lalt lalt lalt lalt lalt lalt lalt O
|
||||
116 lctrl lctrl lctrl lctrl lctrl lctrl lctrl lctrl O
|
||||
117 nop nop nop nop nop nop nop nop O
|
||||
118 nop nop nop nop nop nop nop nop O
|
||||
119 nop nop nop nop nop nop nop nop O
|
||||
120 nop nop nop nop nop nop nop nop O
|
||||
121 nop nop nop nop nop nop nop nop O
|
||||
122 nop nop nop nop nop nop nop nop O
|
||||
123 nop nop nop nop nop nop nop nop O
|
||||
124 nop nop nop nop nop nop nop nop O
|
||||
125 nop nop nop nop nop nop nop nop O
|
||||
126 nop nop nop nop nop nop nop nop O
|
||||
127 nop nop nop nop nop nop nop nop O
|
||||
|
@ -8,7 +8,7 @@ CSCOPEDIRS= boot bsm cam cddl compat conf contrib crypto ddb dev fs gdb \
|
||||
rpc security sys ufs vm xdr xen ${CSCOPE_ARCHDIR}
|
||||
.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}
|
||||
|
@ -1,3 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SUBDIR+= libstand32
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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__)
|
||||
|
@ -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
|
||||
|
||||
|
@ -1,5 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SUBDIR= boot0 boot0.5 pc98boot btx boot2 cdboot kgzldr libpc98 loader
|
||||
|
||||
.include <bsd.subdir.mk>
|
@ -1,29 +0,0 @@
|
||||
# Common defines for all of /sys/boot/pc98/
|
||||
#
|
||||
# $FreeBSD$
|
||||
|
||||
BINDIR?= /boot
|
||||
|
||||
LOADER_ADDRESS?=0x200000
|
||||
CFLAGS+= -march=i386 -ffreestanding
|
||||
CFLAGS.gcc+= -mpreferred-stack-boundary=2
|
||||
CFLAGS+= ${CFLAGS_NO_SIMD} -msoft-float
|
||||
CFLAGS+= -Os -DPC98
|
||||
LDFLAGS+= -nostdlib
|
||||
|
||||
# BTX components
|
||||
.if exists(${.OBJDIR}/../btx)
|
||||
BTXDIR= ${.OBJDIR}/../btx
|
||||
.else
|
||||
BTXDIR= ${.CURDIR}/../btx
|
||||
.endif
|
||||
BTXLDR= ${BTXDIR}/btxldr/btxldr
|
||||
BTXKERN= ${BTXDIR}/btx/btx
|
||||
BTXCRT= ${BTXDIR}/lib/crt0.o
|
||||
|
||||
# compact binary with no padding between text, data, bss
|
||||
LDSCRIPT= ${SRCTOP}/sys/boot/i386/boot.ldscript
|
||||
LDFLAGS_BIN=-e start -Ttext ${ORG} -Wl,-T,${LDSCRIPT},-S,--oformat,binary
|
||||
LD_FLAGS_BIN=-static -T ${LDSCRIPT} --gc-sections
|
||||
|
||||
.include "../Makefile.inc"
|
@ -1,26 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= ${BOOT}.out
|
||||
INTERNALPROG=
|
||||
FILES= ${BOOT}
|
||||
MAN=
|
||||
SRCS= start.s boot.s boot0.5.s disk.s selector.s support.s syscons.s \
|
||||
putssjis.s
|
||||
CLEANFILES= ${BOOT} ${BOOT}.bin
|
||||
|
||||
BOOT= boot0.5
|
||||
|
||||
# The base address that we the boot0 code to to run it. Don't change this
|
||||
# unless you are glutton for punishment.
|
||||
BOOT_BOOT0_ORG?= 0x0000
|
||||
|
||||
LDFLAGS=-e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-N,-T,${.CURDIR}/ldscript
|
||||
|
||||
# The size of boot0.5 must be 7168 bytes
|
||||
${BOOT}: ${BOOT}.bin
|
||||
cat ${BOOT}.bin /dev/zero | ${DD} of=${BOOT} bs=1 count=7168
|
||||
|
||||
${BOOT}.bin: ${BOOT}.out
|
||||
${OBJCOPY} -S -O binary ${BOOT}.out ${.TARGET}
|
||||
|
||||
.include <bsd.prog.mk>
|
@ -1,174 +0,0 @@
|
||||
# Copyright (c) KATO Takenori, 1999, 2000.
|
||||
#
|
||||
# All rights reserved. Unpublished rights reserved under the copyright
|
||||
# laws of Japan.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer as
|
||||
# the first lines of this file unmodified.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
.code16
|
||||
|
||||
.text
|
||||
.global boot
|
||||
#
|
||||
# Read bootstrap program and jump to it.
|
||||
#
|
||||
boot:
|
||||
# Step 1: Save parameters
|
||||
movw curdevice, %si
|
||||
movb daua(%si), %al
|
||||
movb %al, b_daua
|
||||
shlw %si
|
||||
movw secsize(%si), %ax
|
||||
movw %ax, b_secsize
|
||||
|
||||
movw curpartition, %si
|
||||
movb partnum(%si), %al # %al = real partition number
|
||||
xorb %ah, %ah
|
||||
movw %ax, b_partn # save real parttion number
|
||||
movb $5, %cl
|
||||
shlw %cl, %si # %si = offset to parttable
|
||||
addw $4, %si
|
||||
movb parttable(%si), %al # IPLS
|
||||
movb %al, b_sector
|
||||
incw %si
|
||||
movb parttable(%si), %al # IPLH
|
||||
movb %al, b_head
|
||||
incw %si # IPLC
|
||||
movw parttable(%si), %ax
|
||||
movw %ax, b_cylinder
|
||||
|
||||
# Step 2: Calculate the segment address of the bootstrap routine
|
||||
movw $0x1d00, %ax
|
||||
movw b_secsize, %cx
|
||||
shrw %cx
|
||||
shrw %cx
|
||||
subw %cx, %ax
|
||||
subw $0x100, %ax
|
||||
movw %ax, b_bootseg
|
||||
|
||||
# Step 3: Read bootstrap code
|
||||
movb $6, %ah
|
||||
movb b_daua, %al
|
||||
movw b_secsize, %bx
|
||||
shlw %bx # 2 sectors
|
||||
movw b_cylinder, %cx
|
||||
movb b_head, %dh
|
||||
movb b_sector, %dl
|
||||
movw b_bootseg, %es
|
||||
xorw %bp, %bp
|
||||
int $0x1b
|
||||
jc boot_error
|
||||
|
||||
# Step 4: Set DA/UA into BIOS work area
|
||||
xorw %ax, %ax
|
||||
movw %ax, %es
|
||||
movw $0x584, %bx # DISK_BOOT
|
||||
movb b_daua, %dl
|
||||
call write_biosparam
|
||||
|
||||
call sc_clean
|
||||
# Step 5: Set registers
|
||||
# %ah: 00
|
||||
# %al: DA/UA
|
||||
# %bx: Sector size * 2
|
||||
# %cx: cylinder number of boot partition
|
||||
# %si: pointer to partition table
|
||||
movw b_partn, %ax
|
||||
movb $5, %cl
|
||||
shl %cl, %ax # %ax = partition number * 32
|
||||
addw b_secsize, %ax
|
||||
movw %ax, %si # %si = pointer to partition table
|
||||
movw b_cylinder, %cx # %cx = cylinder
|
||||
movb b_head, %dh # %dh = head
|
||||
movb b_sector, %dl # %dl = sector
|
||||
movw b_bootseg, %es # %es = boot segment
|
||||
movb b_daua, %al # %al = DA/UA
|
||||
movw b_secsize, %bx
|
||||
shlw %bx # %bx = sector size * 2
|
||||
cli
|
||||
movw %cs:iniss, %ss # Restore stack pointer
|
||||
movw %cs:inisp, %sp
|
||||
push %es # Boot segment
|
||||
xorw %bp, %bp
|
||||
push %bp # 0
|
||||
movw %ax, %di # Save %ax
|
||||
xorw %ax, %ax
|
||||
movw %ax, %ds # %ds = 0
|
||||
movw %di, %ax # Restore %ax
|
||||
xorb %ah, %ah # %ah = 0
|
||||
xorw %di, %di # %di = 0
|
||||
sti
|
||||
|
||||
# Jump to bootstrap code
|
||||
lret
|
||||
# NOTREACHED
|
||||
|
||||
boot_error:
|
||||
ret
|
||||
|
||||
#
|
||||
# Try to boot from default partition.
|
||||
#
|
||||
.global trydefault
|
||||
trydefault:
|
||||
movw ndevice, %cx
|
||||
xorw %si, %si
|
||||
trydefault_loop:
|
||||
movw %si, curdevice
|
||||
push %cx
|
||||
push %si
|
||||
call read_ipl
|
||||
pop %si
|
||||
pop %cx
|
||||
cmpb $0x80, defpartflag
|
||||
jne nodefpart
|
||||
# Default partition is defined.
|
||||
push %cx
|
||||
movw npartition, %cx
|
||||
srch_part:
|
||||
movw %cx, %bx
|
||||
decw %bx
|
||||
movb defpartnum, %al # %al = real partition number
|
||||
cmpb partnum(%bx), %al
|
||||
jne not_match
|
||||
movw %bx, curpartition # Store partition number
|
||||
call boot
|
||||
not_match:
|
||||
loop srch_part
|
||||
pop %cx
|
||||
nodefpart:
|
||||
incw %si
|
||||
loop trydefault_loop
|
||||
ret
|
||||
|
||||
.data
|
||||
b_daua: .byte 0 # DA/UA
|
||||
b_head: .byte 0 # SYSH
|
||||
b_sector: .byte 0 # SYSS
|
||||
b_cylinder: .word 0 # SYSC
|
||||
b_bootseg: .word 0
|
||||
b_secsize: .word 0
|
||||
b_partn: .word 0 # Real partition number
|
@ -1,293 +0,0 @@
|
||||
# Copyright (c) KATO Takenori, 1999, 2000, 2007.
|
||||
#
|
||||
# All rights reserved. Unpublished rights reserved under the copyright
|
||||
# laws of Japan.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer as
|
||||
# the first lines of this file unmodified.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
.global main
|
||||
.code16
|
||||
|
||||
.text
|
||||
main:
|
||||
# Check hireso mode
|
||||
movw $0x501, %bx # BIOS_FLAG
|
||||
call read_biosparam
|
||||
testb $0x08, %dl
|
||||
jz normalmode
|
||||
movb $1, ishireso
|
||||
normalmode:
|
||||
call sc_init
|
||||
|
||||
# Display title and copyright.
|
||||
movw $title, %di
|
||||
call sc_puts
|
||||
xorw %cx, %cx
|
||||
movw $1, %dx
|
||||
call sc_goto
|
||||
movw $copyright, %di
|
||||
call sc_puts
|
||||
|
||||
# Scan hard drives
|
||||
xorw %si, %si # number of partition
|
||||
call scan_sasi # SASI/IDE
|
||||
call scan_scsi # SCSI
|
||||
movw %si, ndevice
|
||||
orw %si, %si
|
||||
jnz drives_found
|
||||
jmp exit # No hard drives
|
||||
|
||||
drives_found:
|
||||
# Setup sector size dependent parameters
|
||||
movw %si, %cx # %cx = number of devices
|
||||
setup_loop:
|
||||
movw %cx, %di
|
||||
decw %di
|
||||
shlw %di
|
||||
movw secsize(%di), %ax
|
||||
cmpw $1024, %ax
|
||||
je setup_1024
|
||||
cmpw $512, %ax
|
||||
je setup_512
|
||||
# 256 bytes/sector
|
||||
movw $0x100, partoff(%di)
|
||||
movw $0x0fa, defflagoff(%di)
|
||||
movw $0x0fb, defpartoff(%di)
|
||||
movw $8, maxpart(%di)
|
||||
jmp setup_secsize_end
|
||||
# 1024 bytes/sector
|
||||
setup_1024:
|
||||
# XXX Fix me!
|
||||
movw $0x400, partoff(%di)
|
||||
movw $0x3fa, defflagoff(%di)
|
||||
movw $0x3fb, defpartoff(%di)
|
||||
movb $32, maxpart(%di)
|
||||
jmp setup_secsize_end
|
||||
# 512 bytes/sector
|
||||
setup_512:
|
||||
movw $0x200, partoff(%di)
|
||||
movw $0x1fa, defflagoff(%di)
|
||||
movw $0x1fb, defpartoff(%di)
|
||||
movb $16, maxpart(%di)
|
||||
setup_secsize_end:
|
||||
loop setup_loop
|
||||
|
||||
# For debug with floppy, fake the parameter.
|
||||
movw $0x584, %bx # DISK_BOOT
|
||||
call read_biosparam
|
||||
andb $0xf0, %dl
|
||||
cmpb $0x90, %ah
|
||||
jne boot_from_hdd
|
||||
movb daua, %dl
|
||||
call write_biosparam
|
||||
|
||||
boot_from_hdd:
|
||||
movw $500, %cx
|
||||
wait_0_5:
|
||||
call wait1ms
|
||||
loop wait_0_5
|
||||
|
||||
# If the TAB is pressed, don't try to boot from default partition
|
||||
xorw %di, %di # flag
|
||||
wait_key_release:
|
||||
call sc_iskeypress
|
||||
orw %ax, %ax
|
||||
jz key_release # KBD buffer empty.
|
||||
call sc_getc
|
||||
cmpb $0x0f, %ah # TAB
|
||||
jne wait_key_release
|
||||
# TAB pressed
|
||||
movw $1, %di
|
||||
jmp wait_key_release
|
||||
key_release:
|
||||
orw %di, %di
|
||||
jnz dont_try_default # TAB pressed.
|
||||
call trydefault
|
||||
# Default partition not found.
|
||||
dont_try_default:
|
||||
call show_usage
|
||||
call showdevices
|
||||
call selector
|
||||
exit:
|
||||
ret
|
||||
#
|
||||
# Display usage
|
||||
#
|
||||
show_usage:
|
||||
movw $44, %cx
|
||||
movw $3, %dx
|
||||
call sc_goto
|
||||
movw $msg_usage1, %di
|
||||
call sc_puts
|
||||
movw $44, %cx
|
||||
movw $4, %dx
|
||||
call sc_goto
|
||||
movw $msg_usage2, %di
|
||||
call sc_puts
|
||||
movw $44, %cx
|
||||
movw $5, %dx
|
||||
call sc_goto
|
||||
movw $msg_usage3, %di
|
||||
call sc_puts
|
||||
movw $44, %cx
|
||||
movw $7, %dx
|
||||
call sc_goto
|
||||
movw $msg_usage4, %di
|
||||
call sc_puts
|
||||
movw $44, %cx
|
||||
movw $8, %dx
|
||||
call sc_goto
|
||||
movw $msg_usage5, %di
|
||||
call sc_puts
|
||||
movw $44, %cx
|
||||
movw $9, %dx
|
||||
call sc_goto
|
||||
movw $msg_usage6, %di
|
||||
call sc_puts
|
||||
movw $44, %cx
|
||||
movw $10, %dx
|
||||
call sc_goto
|
||||
movw $msg_usage7, %di
|
||||
call sc_puts
|
||||
movw $44, %cx
|
||||
movw $11, %dx
|
||||
call sc_goto
|
||||
movw $msg_usage8, %di
|
||||
call sc_puts
|
||||
movw $44, %cx
|
||||
movw $16, %dx
|
||||
call sc_goto
|
||||
movw $msg_usage9, %di
|
||||
call sc_puts
|
||||
movw $44, %cx
|
||||
movw $17, %dx
|
||||
call sc_goto
|
||||
movw $msg_usage10, %di
|
||||
call sc_puts
|
||||
movw $44, %cx
|
||||
movw $18, %dx
|
||||
call sc_goto
|
||||
movw $msg_usage11, %di
|
||||
call sc_puts
|
||||
movw $44, %cx
|
||||
movw $19, %dx
|
||||
call sc_goto
|
||||
movw $msg_usage12, %di
|
||||
call sc_puts
|
||||
ret
|
||||
|
||||
#
|
||||
# Display device list
|
||||
#
|
||||
showdevices:
|
||||
movw $2, %cx
|
||||
movw $4, %dx
|
||||
call sc_goto
|
||||
movw $msg_device, %di
|
||||
call sc_puts
|
||||
xorw %si, %si # %si = device number
|
||||
movw ndevice, %cx # %cx = number of devices
|
||||
showdev_loop:
|
||||
push %cx
|
||||
movw $2, %cx
|
||||
movw $5, %dx
|
||||
addw %si, %dx
|
||||
call sc_goto
|
||||
# Check DA
|
||||
movb daua(%si), %al
|
||||
push %ax
|
||||
andb $0xf0, %al
|
||||
cmpb $0x80, %al
|
||||
je show_sasi
|
||||
cmpb $0xa0, %al
|
||||
je show_scsi
|
||||
# unknown device
|
||||
movw $msg_unknown, %di
|
||||
call sc_puts
|
||||
jmp showunit
|
||||
# SASI
|
||||
show_sasi:
|
||||
movw $msg_sasi, %di
|
||||
call sc_puts
|
||||
jmp showunit
|
||||
# SCSI
|
||||
show_scsi:
|
||||
movw $msg_scsi, %di
|
||||
call sc_puts
|
||||
# Display unit number.
|
||||
showunit:
|
||||
pop %ax
|
||||
andb $0x0f, %al
|
||||
addb $'0', %al
|
||||
call sc_putc
|
||||
incw %si
|
||||
pop %cx
|
||||
loop showdev_loop
|
||||
movw ndevice, %dx
|
||||
addw $5, %dx
|
||||
movw $2, %cx
|
||||
call sc_goto
|
||||
movw $msg_exitmenu, %di
|
||||
call sc_puts
|
||||
ret
|
||||
|
||||
.data
|
||||
.global curdevice, ndevice
|
||||
ndevice: .word 0 # number of device
|
||||
curdevice: .word 0 # current device
|
||||
|
||||
.global ishireso
|
||||
ishireso: .byte 0
|
||||
|
||||
title: .asciz "PC98 Boot Selector Version 1.2"
|
||||
copyright: .ascii "(C)Copyright 1999-2007 KATO Takenori. "
|
||||
.asciz "All rights reserved."
|
||||
msg_device: .asciz "Device"
|
||||
msg_sasi: .asciz "SASI/IDE unit "
|
||||
msg_scsi: .asciz "SCSI ID "
|
||||
msg_unknown: .asciz "unknown unit "
|
||||
msg_exitmenu: .asciz "Exit this menu"
|
||||
msg_usage1: .asciz "Device list"
|
||||
msg_usage2: .asciz "UP, DOWN: select boot device"
|
||||
msg_usage3: .asciz "RETURN: move to slice list"
|
||||
msg_usage4: .asciz "Slice list"
|
||||
msg_usage5: .asciz "UP, DOWN: select boot slice"
|
||||
msg_usage6: .asciz "RETURN: boot"
|
||||
msg_usage7: .asciz "SPACE: toggle default"
|
||||
msg_usage8: .asciz "ESC: move to device list"
|
||||
msg_usage9: .asciz "LEGEND"
|
||||
msg_usage10: .asciz ">>: selected device/slice"
|
||||
msg_usage11: .asciz "*: default slice to boot"
|
||||
msg_usage12: .asciz "!: unbootable slice"
|
||||
|
||||
.bss
|
||||
.global daua, secsize, defflagoff, defpartoff
|
||||
.global maxpart, partoff
|
||||
daua: .space 12 # DA/DU list
|
||||
secsize: .space 12 * 2 # Sector soize
|
||||
defflagoff: .space 12 * 2
|
||||
defpartoff: .space 12 * 2
|
||||
maxpart: .space 12 * 2
|
||||
partoff: .space 12 * 2
|
@ -1,296 +0,0 @@
|
||||
# Copyright (c) KATO Takenori, 1999, 2000.
|
||||
#
|
||||
# All rights reserved. Unpublished rights reserved under the copyright
|
||||
# laws of Japan.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer as
|
||||
# the first lines of this file unmodified.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
.code16
|
||||
.text
|
||||
#
|
||||
# Check magic number at the end of the sector 0
|
||||
#
|
||||
check_magic:
|
||||
movw curdevice, %si
|
||||
shlw %si
|
||||
movw secsize(%si), %bx
|
||||
decw %bx
|
||||
decw %bx
|
||||
movw iplbuf(%bx), %ax
|
||||
cmpw $0xaa55, %ax
|
||||
je magic_ok
|
||||
movw $1, %ax
|
||||
ret
|
||||
magic_ok:
|
||||
xorw %ax, %ax
|
||||
ret
|
||||
|
||||
#
|
||||
# Copy partition table from buffer to parttable.
|
||||
#
|
||||
setup_partition:
|
||||
push %cs
|
||||
pop %es
|
||||
movw curdevice, %bx
|
||||
shlw %bx
|
||||
movw maxpart(%bx), %cx # %cx = max num of partitions
|
||||
movw partoff(%bx), %di
|
||||
movw %di, %bx # %bx = offset to partition table
|
||||
xorw %dx, %dx # %dx = partition number
|
||||
setup_partition_loop:
|
||||
push %cx
|
||||
movw %dx, %si
|
||||
movb $5, %cl
|
||||
shlw %cl, %si
|
||||
addw %bx, %si
|
||||
movb iplbuf(%si), %al
|
||||
orb %al, %al
|
||||
jz unused_partition
|
||||
addw $iplbuf, %si
|
||||
movw npartition, %ax
|
||||
movw %ax, %di
|
||||
movb $5, %cl
|
||||
shlw %cl, %di
|
||||
addw $parttable, %di
|
||||
movw $32, %cx
|
||||
rep
|
||||
movsb
|
||||
movw %ax, %di
|
||||
addw $partnum, %di
|
||||
movb %dl, (%di)
|
||||
incw npartition
|
||||
unused_partition:
|
||||
incw %dx
|
||||
pop %cx
|
||||
loop setup_partition_loop
|
||||
ret
|
||||
|
||||
#
|
||||
# Read IPL and partition table in the current device.
|
||||
#
|
||||
.global read_ipl
|
||||
read_ipl:
|
||||
movw curdevice, %ax
|
||||
movw %ax, %si # %si = device number
|
||||
movw %ax, %di
|
||||
shlw %di
|
||||
|
||||
movw %cs, %ax
|
||||
movw %ax, %es
|
||||
movb $6, %ah
|
||||
movb daua(%si), %al
|
||||
movw $0x400, %bx
|
||||
xorw %cx, %cx
|
||||
xorw %dx, %dx
|
||||
movw $iplbuf, %bp
|
||||
int $0x1b
|
||||
jc read_ipl_error
|
||||
movw defflagoff(%di), %bx
|
||||
movb iplbuf(%bx), %al
|
||||
movb %al, defpartflag
|
||||
incw %bx
|
||||
movb iplbuf(%bx), %al
|
||||
movb %al, defpartnum
|
||||
movw $0, npartition
|
||||
call check_magic
|
||||
orw %ax, %ax
|
||||
jnz no_magic
|
||||
call setup_partition
|
||||
no_magic:
|
||||
xorw %ax, %ax
|
||||
read_ipl_error:
|
||||
xorw %bx, %bx
|
||||
movw %bx, %es
|
||||
ret
|
||||
|
||||
#
|
||||
# Restore IPL from the buffer
|
||||
#
|
||||
.global write_ipl
|
||||
write_ipl:
|
||||
movw curdevice, %ax
|
||||
movw %ax, %si
|
||||
movw %ax, %di
|
||||
shlw %di
|
||||
|
||||
# Restore default boot partition info.
|
||||
movw defflagoff(%di), %bx
|
||||
movb defpartflag, %al
|
||||
movb %al, iplbuf(%bx)
|
||||
incw %bx
|
||||
movb defpartnum, %al
|
||||
movb %al, iplbuf(%bx)
|
||||
|
||||
movw %cs, %ax
|
||||
movw %ax, %es
|
||||
movb $5, %ah
|
||||
movb daua(%si), %al
|
||||
movw secsize(%di), %bx
|
||||
xorw %cx, %cx
|
||||
xorw %dx, %dx
|
||||
movw $iplbuf, %bp
|
||||
int $0x1b
|
||||
jc write_ipl_error
|
||||
xorw %ax, %ax
|
||||
write_ipl_error:
|
||||
xorw %bx, %bx
|
||||
movw %bx, %es
|
||||
ret
|
||||
|
||||
#
|
||||
# Scan HDD devices
|
||||
#
|
||||
.global scan_sasi, scan_scsi
|
||||
# Scan SASI disk
|
||||
scan_sasi:
|
||||
# SASI Disk
|
||||
movw $4, %cx
|
||||
movw $0x0001, %ax # %ah = unit number, %al = for bit operation
|
||||
|
||||
sasi_loop:
|
||||
movw %si, %di
|
||||
shlw %di
|
||||
movw $0x55d, %bx # DISK_EQUIP
|
||||
call read_biosparam
|
||||
testb %al, %dl
|
||||
jz no_sasi_unit
|
||||
movb $0x80, %dh
|
||||
addb %ah, %dh # %dh = DA/UA
|
||||
movb %dh, daua(%si) # Store DA/UA
|
||||
|
||||
# Try new sense command
|
||||
push %ax
|
||||
push %cx
|
||||
movb %dh, %al
|
||||
movb $0x84, %ah
|
||||
int $0x1b
|
||||
pop %cx
|
||||
pop %ax
|
||||
jc err_newsense
|
||||
movw %bx, %dx
|
||||
jmp found_sasi_unit
|
||||
|
||||
err_newsense:
|
||||
movw $0x457, %bx # capacity & sector size of IDE HDD
|
||||
call read_biosparam
|
||||
orb %ah, %ah
|
||||
jz sasi_1
|
||||
cmpb $1, %ah
|
||||
jz sasi_2
|
||||
|
||||
# SASI #3/#4
|
||||
movw $512, %dx # XXX
|
||||
jmp found_sasi_unit
|
||||
|
||||
sasi_1:
|
||||
# SASI #1
|
||||
testb $0x80, %dl
|
||||
jz sasi_256
|
||||
jmp sasi_512
|
||||
sasi_2:
|
||||
# SASI #2
|
||||
testb $0x40, %dl
|
||||
jz sasi_256
|
||||
jmp sasi_512
|
||||
|
||||
sasi_256:
|
||||
movw $256, %dx
|
||||
jmp found_sasi_unit
|
||||
sasi_512:
|
||||
movw $512, %dx
|
||||
found_sasi_unit:
|
||||
movw %dx, secsize(%di)
|
||||
incw %si
|
||||
no_sasi_unit:
|
||||
incb %ah
|
||||
shlb %al
|
||||
loop sasi_loop
|
||||
ret
|
||||
|
||||
#
|
||||
# Scan SCSI disk
|
||||
# SI number of disks
|
||||
# destroyed: %ax, %bx, %cx, %dx
|
||||
scan_scsi:
|
||||
movw $8, %cx
|
||||
movw $0x0001, %ax # %ah = ID number, %al = for bit operation
|
||||
scsi_loop:
|
||||
# Check whether drive exist.
|
||||
movw %si, %di
|
||||
shlw %di
|
||||
movw $0x482, %bx # DISK_EQUIPS
|
||||
call read_biosparam
|
||||
testb %al, %dl
|
||||
jz no_scsi_unit
|
||||
xorw %bx, %bx
|
||||
movb %ah, %bl
|
||||
shlw %bx
|
||||
shlw %bx
|
||||
addw $0x460, %bx # SCSI parameter block
|
||||
call read_biosparam
|
||||
orb %dl, %dl
|
||||
jz no_scsi_unit
|
||||
|
||||
# SCSI harddrive found.
|
||||
movb $0xa0, %dh
|
||||
addb %ah, %dh
|
||||
movb %dh, daua(%si)
|
||||
|
||||
# Check sector size.
|
||||
addw $3, %bx
|
||||
call read_biosparam
|
||||
andb $0x30, %dl
|
||||
cmpb $0x20, %dl
|
||||
je scsi_1024
|
||||
cmpb $0x10, %dl
|
||||
je scsi_512
|
||||
movw $256, %dx
|
||||
jmp found_scsi
|
||||
scsi_1024:
|
||||
movw $1024, %dx
|
||||
jmp found_scsi
|
||||
scsi_512:
|
||||
movw $512, %dx
|
||||
found_scsi:
|
||||
movw %dx, secsize(%di)
|
||||
incw %si
|
||||
no_scsi_unit:
|
||||
incb %ah
|
||||
shlb %al
|
||||
loop scsi_loop
|
||||
ret
|
||||
|
||||
.data
|
||||
.global defpartflag, defpartnum, npartition
|
||||
defpartflag: .byte 0
|
||||
defpartnum: .byte 0
|
||||
npartition: .word 0 # number of partitions
|
||||
|
||||
.bss
|
||||
.global partnum, parttable
|
||||
iplbuf: .space 0x400 # Read buffer for IPL
|
||||
partnum: .space 32 # Index of parttable
|
||||
parttable: .space 1024 # Copy of valid partition table
|
@ -1,12 +0,0 @@
|
||||
/*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.text : { *(.text) }
|
||||
.data : { *(.data) }
|
||||
. = 0x1243;
|
||||
.putssjis : { *(.putssjis) }
|
||||
.bss : { *(.bss) }
|
||||
}
|
@ -1,137 +0,0 @@
|
||||
# Copyright (c) KATO Takenori, 2007.
|
||||
#
|
||||
# All rights reserved. Unpublished rights reserved under the copyright
|
||||
# laws of Japan.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer as
|
||||
# the first lines of this file unmodified.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
.code16
|
||||
.section .putssjis, "awx", @progbits
|
||||
|
||||
#
|
||||
# Display string with Shift-JIS support
|
||||
# %si: address of string, %di: T-VRAM address, %cx: count
|
||||
#
|
||||
|
||||
# Absolute address of putssjis_entry must be 0x1243.
|
||||
putssjis_entry:
|
||||
push %es
|
||||
push %ax
|
||||
# Setup the T-VRAM segement address.
|
||||
xorw %ax, %ax
|
||||
movw %ax, %es
|
||||
movw $0xa000, %ax
|
||||
testb $0x08, %es:0x501
|
||||
jz normalmode
|
||||
movw $0xe000, %ax
|
||||
normalmode:
|
||||
movw %ax, %es
|
||||
|
||||
putssjis_loop:
|
||||
lodsw
|
||||
call check_sjis
|
||||
jc put_2byte_char
|
||||
|
||||
# 1 byte character
|
||||
xorb %ah, %ah
|
||||
testb $0xe0, %al # Check control code.
|
||||
jnz put_1byte_char
|
||||
movb $0x20, %al # Convert control code into the space.
|
||||
put_1byte_char:
|
||||
stosw
|
||||
decw %si
|
||||
jmp putssjis_loop_end
|
||||
|
||||
put_2byte_char:
|
||||
subb $0x20, %al
|
||||
|
||||
# Check 2byte "hankaku"
|
||||
cmp $0x09, %al
|
||||
je put_2byte_hankaku
|
||||
cmp $0x0a, %al
|
||||
je put_2byte_hankaku
|
||||
cmp $0x0b, %al
|
||||
je put_2byte_hankaku
|
||||
jmp put_2byte_zenkaku
|
||||
|
||||
put_2byte_hankaku:
|
||||
stosw
|
||||
jmp putssjis_loop_end
|
||||
|
||||
put_2byte_zenkaku:
|
||||
stosw
|
||||
orb $0x80, %ah
|
||||
stosw
|
||||
decw %cx
|
||||
|
||||
putssjis_loop_end:
|
||||
loop putssjis_loop
|
||||
|
||||
pop %ax
|
||||
pop %es
|
||||
ret
|
||||
|
||||
# Check 2-byte code.
|
||||
check_sjis:
|
||||
cmpb $0x80, %al
|
||||
jbe found_ank_kana
|
||||
cmpb $0xa0, %al
|
||||
jb found_2byte_char
|
||||
cmpb $0xe0, %al
|
||||
jb found_ank_kana
|
||||
cmpb $0xf0, %al
|
||||
jae found_ank_kana
|
||||
jmp found_2byte_char
|
||||
found_ank_kana:
|
||||
clc
|
||||
ret
|
||||
|
||||
found_2byte_char:
|
||||
# Convert Shift-JIS into JIS.
|
||||
cmpb $0x9f, %al
|
||||
ja sjis_h_2 # Upper > 0x9f
|
||||
subb $0x71, %al # Upper -= 0x71
|
||||
jmp sjis_lower
|
||||
sjis_h_2:
|
||||
subb $0xb1, %al # Upper -= 0xb1
|
||||
sjis_lower:
|
||||
salb %al # Upper *= 2
|
||||
incb %al # Upper += 1
|
||||
|
||||
cmpb $0x7f, %ah
|
||||
jbe sjis_l_2
|
||||
decb %ah # Lower -= 1 if lower > 0x7f
|
||||
sjis_l_2:
|
||||
cmpb $0x9e, %ah
|
||||
jb sjis_l_3
|
||||
subb $0x7d, %ah # Lower -= 0x7d
|
||||
incb %al # Upper += 1
|
||||
jmp check_2byte_end
|
||||
sjis_l_3:
|
||||
subb $0x1f, %ah # Lower -= 0x1f
|
||||
check_2byte_end:
|
||||
stc
|
||||
ret
|
@ -1,450 +0,0 @@
|
||||
# Copyright (c) KATO Takenori, 1999, 2000, 2007.
|
||||
#
|
||||
# All rights reserved. Unpublished rights reserved under the copyright
|
||||
# laws of Japan.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer as
|
||||
# the first lines of this file unmodified.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
.code16
|
||||
|
||||
.text
|
||||
#
|
||||
# Display partition table.
|
||||
#
|
||||
showpartitions:
|
||||
# Clear partition table area
|
||||
movw $16, %cx
|
||||
clear_part:
|
||||
push %cx
|
||||
movw %cx, %dx
|
||||
decw %dx
|
||||
addw $5, %dx
|
||||
movw $20, %cx
|
||||
call sc_goto
|
||||
movw $msg_spc, %di
|
||||
call sc_puts
|
||||
pop %cx
|
||||
loop clear_part
|
||||
|
||||
# Check `Exit' menu
|
||||
movw curdevice, %ax
|
||||
cmpw ndevice, %ax
|
||||
je no_slice
|
||||
|
||||
# XXX Move this to a suitable place!
|
||||
movw $22, %cx
|
||||
movw $4, %dx
|
||||
call sc_goto
|
||||
movw $msg_slice, %di
|
||||
call sc_puts
|
||||
|
||||
# Check the number of partitions
|
||||
movw npartition, %cx
|
||||
orw %cx, %cx
|
||||
jnz partitionexist
|
||||
no_slice:
|
||||
# Just show the `no slice' message.
|
||||
movw $22, %cx
|
||||
movw $5, %dx
|
||||
call sc_goto
|
||||
movw $msg_noslice, %di
|
||||
call sc_puts
|
||||
ret
|
||||
partitionexist:
|
||||
xorw %si, %si # %si = partition number
|
||||
showpart_loop:
|
||||
push %cx # %cx = number of partitions
|
||||
movw $22, %cx
|
||||
movw %si, %dx
|
||||
addw $5, %dx
|
||||
call sc_goto
|
||||
movw %si, %di
|
||||
movb $5, %cl
|
||||
shlw %cl, %di
|
||||
addw $0x10, %di # SYSM field
|
||||
# SYSM: space filled string. Don't use sc_puts.
|
||||
movw $16, %cx
|
||||
showpart_name:
|
||||
push %cx
|
||||
movb parttable(%di), %al
|
||||
call sc_putc
|
||||
incw %di
|
||||
pop %cx
|
||||
loop showpart_name
|
||||
incw %si
|
||||
pop %cx
|
||||
loop showpart_loop
|
||||
ret
|
||||
|
||||
#
|
||||
# Show default slice indicator
|
||||
# If the default boot slice exists, `*' indicator will be showed.
|
||||
#
|
||||
showdefaultslicemark:
|
||||
cmpb $0x80, defpartflag
|
||||
je defpartexist
|
||||
ret
|
||||
defpartexist:
|
||||
movw npartition, %cx
|
||||
defslice_loop:
|
||||
movw %cx, %bx
|
||||
decw %bx
|
||||
push %cx
|
||||
push %bx
|
||||
movw $40, %cx
|
||||
movw %bx, %dx
|
||||
addw $5, %dx
|
||||
call sc_goto
|
||||
|
||||
pop %bx
|
||||
pop %cx
|
||||
movb defpartnum, %al
|
||||
cmpb partnum(%bx), %al
|
||||
jne nomatch
|
||||
movb $'*', %al
|
||||
call sc_putc
|
||||
jmp defslice_done
|
||||
nomatch:
|
||||
movb $' ', %al
|
||||
call sc_putc
|
||||
defslice_done:
|
||||
loop defslice_loop
|
||||
ret
|
||||
|
||||
#
|
||||
# Hide default slice indicator
|
||||
#
|
||||
hidedefaultslicemark:
|
||||
movw $16, %cx
|
||||
hidedefslice_loop:
|
||||
push %cx
|
||||
movw %cx, %dx
|
||||
addw $4, %dx
|
||||
movw $40, %cx
|
||||
call sc_goto
|
||||
movb $' ', %al
|
||||
call sc_putc
|
||||
pop %cx
|
||||
loop hidedefslice_loop
|
||||
ret
|
||||
|
||||
#
|
||||
# Toggle default slice
|
||||
#
|
||||
toggle_default:
|
||||
cmpb $0x80, defpartflag
|
||||
jne set_default
|
||||
# Clear default
|
||||
movb $0, defpartflag
|
||||
call write_ipl # Restore
|
||||
call hidedefaultslicemark
|
||||
ret
|
||||
# Set default slice
|
||||
set_default:
|
||||
movw curpartition, %si
|
||||
movb partnum(%si), %al # %al = real partition number
|
||||
movb $5, %cl
|
||||
shlw %cl, %si
|
||||
# Default slice must be bootable
|
||||
testb $0x80, parttable(%si)
|
||||
jnz curpart_bootable
|
||||
# Current partition is not bootable.
|
||||
ret
|
||||
curpart_bootable:
|
||||
movb $0x80, defpartflag
|
||||
movb %al, defpartnum
|
||||
call write_ipl # Restore
|
||||
call showdefaultslicemark
|
||||
ret
|
||||
|
||||
#
|
||||
# Show/hide cursor
|
||||
#
|
||||
show_devcurs:
|
||||
xorw %cx, %cx
|
||||
movw curdevice, %dx
|
||||
addw $5, %dx
|
||||
call sc_goto
|
||||
movb $'>', %al
|
||||
call sc_putc
|
||||
movb $'>', %al
|
||||
call sc_putc
|
||||
ret
|
||||
|
||||
hide_devcurs:
|
||||
xorw %cx, %cx
|
||||
movw curdevice, %dx
|
||||
addw $5, %dx
|
||||
call sc_goto
|
||||
movb $' ', %al
|
||||
call sc_putc
|
||||
movb $' ', %al
|
||||
call sc_putc
|
||||
ret
|
||||
|
||||
show_slicecurs:
|
||||
movw $20, %cx
|
||||
movw curpartition, %dx
|
||||
addw $5, %dx
|
||||
call sc_goto
|
||||
movb $'>', %al
|
||||
call sc_putc
|
||||
movb $'>', %al
|
||||
call sc_putc
|
||||
ret
|
||||
|
||||
hide_slicecurs:
|
||||
movw $20, %cx
|
||||
movw curpartition, %dx
|
||||
addw $5, %dx
|
||||
call sc_goto
|
||||
movb $' ', %al
|
||||
call sc_putc
|
||||
movb $' ', %al
|
||||
call sc_putc
|
||||
ret
|
||||
|
||||
isforceboot:
|
||||
xorw %cx, %cx
|
||||
movw $20, %dx
|
||||
call sc_goto
|
||||
movw $msg_force, %di
|
||||
call sc_puts
|
||||
call sc_getc
|
||||
push %ax
|
||||
xorw %cx, %cx
|
||||
movw $20, %dx
|
||||
call sc_goto
|
||||
movw $msg_forceclr, %di
|
||||
call sc_puts
|
||||
pop %ax
|
||||
cmpb $0x15, %ah
|
||||
je force_yes
|
||||
xorw %ax, %ax
|
||||
ret
|
||||
force_yes:
|
||||
movw $1, %ax
|
||||
ret
|
||||
|
||||
#
|
||||
# Main loop for device mode
|
||||
#
|
||||
devmode:
|
||||
call read_ipl
|
||||
call hidedefaultslicemark
|
||||
call showpartitions
|
||||
call showdefaultslicemark
|
||||
call show_devcurs
|
||||
|
||||
movw $2, %cx
|
||||
movw $4, %dx
|
||||
call sc_goto
|
||||
movb $0xe5, %al
|
||||
movw $6, %cx
|
||||
call sc_setattr
|
||||
movw $22, %cx
|
||||
movw $4, %dx
|
||||
call sc_goto
|
||||
movb $0xe1, %al
|
||||
movw $5, %cx
|
||||
call sc_setattr
|
||||
movw $44, %cx
|
||||
movw $3, %dx
|
||||
call sc_goto
|
||||
movb $0xe5, %al
|
||||
movw $11, %cx
|
||||
call sc_setattr
|
||||
movw $44, %cx
|
||||
movw $7, %dx
|
||||
call sc_goto
|
||||
movb $0xe1, %al
|
||||
movw $10, %cx
|
||||
call sc_setattr
|
||||
|
||||
devmode_loop:
|
||||
call sc_getc
|
||||
movw ndevice, %bx
|
||||
cmpb $0x3a, %ah # UP
|
||||
je dev_up
|
||||
cmpb $0x3d, %ah # DOWN
|
||||
je dev_down
|
||||
cmpb $0x3c, %ah # RIGHT
|
||||
je dev_right
|
||||
cmpb $0x1c, %ah # RETURN
|
||||
jne devmode_loop
|
||||
cmpw curdevice, %bx
|
||||
jne dev_right
|
||||
movw $3, mode # N88-BASIC
|
||||
ret
|
||||
|
||||
# XXX
|
||||
.space 5, 0x90
|
||||
ret # Dummy ret @0x9ab
|
||||
|
||||
dev_up:
|
||||
cmpw $0, curdevice
|
||||
je devmode_loop
|
||||
call hide_devcurs
|
||||
decw curdevice
|
||||
call read_ipl
|
||||
call hidedefaultslicemark
|
||||
call showpartitions
|
||||
call showdefaultslicemark
|
||||
call show_devcurs
|
||||
jmp devmode_loop
|
||||
dev_down:
|
||||
cmpw curdevice, %bx
|
||||
je devmode_loop
|
||||
call hide_devcurs
|
||||
incw curdevice
|
||||
call read_ipl
|
||||
call hidedefaultslicemark
|
||||
call showpartitions
|
||||
call showdefaultslicemark
|
||||
call show_devcurs
|
||||
jmp devmode_loop
|
||||
dev_right:
|
||||
cmpw curdevice, %bx
|
||||
je devmode_loop
|
||||
movw $1, mode # Slice mode
|
||||
ret
|
||||
|
||||
#
|
||||
# main loop for slice mode
|
||||
#
|
||||
slicemode:
|
||||
movw $0, curpartition
|
||||
call show_slicecurs
|
||||
movw $2, %cx
|
||||
movw $4, %dx
|
||||
call sc_goto
|
||||
movb $0xe1, %al
|
||||
movw $6, %cx
|
||||
call sc_setattr
|
||||
movw $22, %cx
|
||||
movw $4, %dx
|
||||
call sc_goto
|
||||
movb $0xe5, %al
|
||||
movw $5, %cx
|
||||
call sc_setattr
|
||||
movw $44, %cx
|
||||
movw $3, %dx
|
||||
call sc_goto
|
||||
movb $0xe1, %al
|
||||
movw $11, %cx
|
||||
call sc_setattr
|
||||
movw $44, %cx
|
||||
movw $7, %dx
|
||||
call sc_goto
|
||||
movb $0xe5, %al
|
||||
movw $10, %cx
|
||||
call sc_setattr
|
||||
|
||||
slicemode_loop:
|
||||
call sc_getc
|
||||
cmpb $0x3a, %ah # UP
|
||||
je slice_up
|
||||
cmpb $0x3d, %ah # DOWN
|
||||
je slice_down
|
||||
cmpb $0x3b, %ah # LEFT
|
||||
je slice_esc
|
||||
cmpb $0x00, %ah # ESC
|
||||
je slice_esc
|
||||
cmpb $0x1c, %ah # RETURN
|
||||
je slice_ret
|
||||
cmpb $0x34, %ah # SPC
|
||||
je slice_spc
|
||||
cmpb $0x62, %ah # f1
|
||||
je slice_spc
|
||||
jmp slicemode_loop
|
||||
slice_up:
|
||||
cmpw $0, curpartition
|
||||
je slicemode_loop
|
||||
call hide_slicecurs
|
||||
decw curpartition
|
||||
call show_slicecurs
|
||||
jmp slicemode_loop
|
||||
slice_down:
|
||||
movw curpartition, %bx
|
||||
movw npartition, %ax
|
||||
decw %ax
|
||||
cmpw %bx, %ax
|
||||
je slicemode_loop
|
||||
call hide_slicecurs
|
||||
incw curpartition
|
||||
call show_slicecurs
|
||||
jmp slicemode_loop
|
||||
slice_esc:
|
||||
movw $0, mode # Device mode
|
||||
ret
|
||||
slice_spc:
|
||||
call toggle_default
|
||||
jmp slicemode_loop
|
||||
slice_ret:
|
||||
# Test bit 7 of mid
|
||||
movw curpartition, %si
|
||||
movb $5, %cl
|
||||
shlw %cl, %si
|
||||
testb $0x80, parttable(%si)
|
||||
jnz bootable_slice
|
||||
call isforceboot
|
||||
orw %ax, %ax
|
||||
jz slicemode_loop
|
||||
bootable_slice:
|
||||
call boot
|
||||
jmp slicemode_loop
|
||||
|
||||
#
|
||||
# Main loop
|
||||
#
|
||||
.global selector
|
||||
selector:
|
||||
movw $0, curdevice # trydefault may change the curdevice.
|
||||
movw $0, mode
|
||||
|
||||
selector_loop:
|
||||
cmpw $0, mode
|
||||
je status_dev
|
||||
cmpw $1, mode
|
||||
je status_slice
|
||||
ret
|
||||
status_dev:
|
||||
call devmode
|
||||
jmp selector_loop
|
||||
status_slice:
|
||||
call slicemode
|
||||
jmp selector_loop
|
||||
|
||||
.data
|
||||
.global curpartition
|
||||
curpartition: .word 0 # current patition
|
||||
mode: .word 0
|
||||
|
||||
msg_spc: .asciz " "
|
||||
msg_slice: .asciz "Slice"
|
||||
msg_noslice: .asciz "no slice"
|
||||
msg_force: .asciz "This slice is not bootable. Continue? (Y / [N])"
|
||||
msg_forceclr: .asciz " "
|
@ -1,73 +0,0 @@
|
||||
# Copyright (c) KATO Takenori, 1999, 2000, 2007.
|
||||
#
|
||||
# All rights reserved. Unpublished rights reserved under the copyright
|
||||
# laws of Japan.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer as
|
||||
# the first lines of this file unmodified.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
.global start
|
||||
.code16
|
||||
|
||||
.text
|
||||
start:
|
||||
jmp start1
|
||||
|
||||
# Magic
|
||||
.org 0x053, 0x20
|
||||
.byte 0x4e, 0x45, 0x43
|
||||
|
||||
.org 0x8f
|
||||
.byte 0x32, 0x2e, 0x37, 0x30
|
||||
|
||||
.org 0x2d4
|
||||
start1:
|
||||
# The instruction 'call 0x9ab' can be here. See also selector.s.
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
cli
|
||||
movw %cs, %ax
|
||||
movw %ax, %ds
|
||||
movw %ss, iniss
|
||||
movw %sp, inisp
|
||||
movw %ax, %ss
|
||||
movw $0xfffe, %sp
|
||||
sti
|
||||
xorw %ax, %ax
|
||||
movw %ax, %es
|
||||
call main
|
||||
|
||||
cli
|
||||
movw %cs:iniss, %ss
|
||||
movw %cs:inisp, %sp
|
||||
sti
|
||||
int $0x1e
|
||||
# NOTREACHED
|
||||
lret
|
||||
|
||||
.data
|
||||
.global iniss, inisp
|
||||
iniss: .word 0
|
||||
inisp: .word 0
|
@ -1,94 +0,0 @@
|
||||
# Copyright (c) KATO Takenori, 1999, 2000.
|
||||
#
|
||||
# All rights reserved. Unpublished rights reserved under the copyright
|
||||
# laws of Japan.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer as
|
||||
# the first lines of this file unmodified.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
.code16
|
||||
|
||||
.text
|
||||
#
|
||||
# Wait 1ms
|
||||
#
|
||||
.global wait1ms
|
||||
wait1ms:
|
||||
push %cx
|
||||
movw $800, %cx
|
||||
wait_loop:
|
||||
outb %al, $0x5f
|
||||
loop wait_loop
|
||||
pop %cx
|
||||
ret
|
||||
|
||||
#
|
||||
# Read one byte from BIOS parameter block
|
||||
# %bx offset
|
||||
# %dl value
|
||||
#
|
||||
.global read_biosparam
|
||||
read_biosparam:
|
||||
movb %es:(%bx), %dl
|
||||
ret
|
||||
|
||||
#
|
||||
# Write one byte to BIOS parameter block
|
||||
# %bx offset
|
||||
# %dl value
|
||||
#
|
||||
.global write_biosparam
|
||||
write_biosparam:
|
||||
movb %dl, %es:(%bx)
|
||||
ret
|
||||
|
||||
#
|
||||
# beep
|
||||
#
|
||||
.global beep_on, beep_off, beep
|
||||
beep_on:
|
||||
movb $0x17, %ah
|
||||
int $0x18
|
||||
ret
|
||||
|
||||
beep_off:
|
||||
movb $0x18, %ah
|
||||
int $0x18
|
||||
ret
|
||||
|
||||
beep:
|
||||
push %cx
|
||||
call beep_on
|
||||
movw $100, %cx
|
||||
beep_loop1:
|
||||
call wait1ms
|
||||
loop beep_loop1
|
||||
call beep_off
|
||||
movw $50, %cx
|
||||
beep_loop2:
|
||||
call wait1ms
|
||||
loop beep_loop2
|
||||
pop %cx
|
||||
ret
|
@ -1,253 +0,0 @@
|
||||
# Copyright (c) KATO Takenori, 1999, 2000.
|
||||
#
|
||||
# All rights reserved. Unpublished rights reserved under the copyright
|
||||
# laws of Japan.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer as
|
||||
# the first lines of this file unmodified.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
.code16
|
||||
|
||||
.text
|
||||
#
|
||||
# %al character code
|
||||
# destroyed: %al, %bx
|
||||
#
|
||||
put_character:
|
||||
movw $0xe000, %bx
|
||||
movb ishireso, %ah
|
||||
orb %ah, %ah
|
||||
jne hireso_ch
|
||||
movw $0xa000, %bx
|
||||
hireso_ch:
|
||||
movw %bx, %es
|
||||
xorb %ah, %ah
|
||||
movw curpos, %bx
|
||||
movw %ax, %es:(%bx)
|
||||
xorw %ax, %ax
|
||||
movw %ax, %es
|
||||
ret
|
||||
|
||||
#
|
||||
# %al attribute
|
||||
# destroyed: %ah, %cx
|
||||
#
|
||||
set_attribute:
|
||||
movw $0xe200, %bx
|
||||
movb ishireso, %ah
|
||||
orb %ah, %ah
|
||||
jne hireso_ch
|
||||
movw $0xa200, %bx
|
||||
hireso_attr:
|
||||
movw %bx, %es
|
||||
xorb %ah, %ah
|
||||
movw curpos, %bx
|
||||
movw %ax, %es:(%bx)
|
||||
xorw %bx, %bx
|
||||
movw %bx, %es
|
||||
ret
|
||||
|
||||
#
|
||||
# Put a character
|
||||
# %al: character code
|
||||
# destroyed: %ah, %bx, %cx
|
||||
#
|
||||
.global sc_putc
|
||||
sc_putc:
|
||||
call put_character
|
||||
incw curpos
|
||||
incw curpos
|
||||
cmpw $4000, curpos
|
||||
jng putc_end
|
||||
movw $0, curpos
|
||||
putc_end:
|
||||
ret
|
||||
|
||||
#
|
||||
# Put a null terminated string
|
||||
# %di: pointer to string
|
||||
# destroyed: %ah, %cx, %di
|
||||
#
|
||||
.global sc_puts
|
||||
sc_puts:
|
||||
movb (%di), %al
|
||||
orb %al, %al
|
||||
jz puts_end
|
||||
call sc_putc
|
||||
incw %di
|
||||
jmp sc_puts
|
||||
puts_end:
|
||||
ret
|
||||
|
||||
#
|
||||
# Change the current cursor position
|
||||
# %cx: X
|
||||
# %dx: Y
|
||||
# destroyed: %ax, %bx
|
||||
#
|
||||
.global sc_goto
|
||||
sc_goto:
|
||||
movw %dx, %ax # AX=Y
|
||||
shlw %ax # AX=Y*64
|
||||
shlw %ax
|
||||
shlw %ax
|
||||
shlw %ax
|
||||
shlw %ax
|
||||
shlw %ax
|
||||
movw %dx, %bx # BX=Y
|
||||
shlw %bx # BX=Y*16
|
||||
shlw %bx
|
||||
shlw %bx
|
||||
shlw %bx
|
||||
addw %bx, %ax # AX=Y*64+Y*16=Y*80
|
||||
addw %cx, %ax
|
||||
shlw %ax
|
||||
movw %ax, curpos
|
||||
ret
|
||||
|
||||
#
|
||||
# Clear screen
|
||||
# destroyed: %ax, %bx
|
||||
#
|
||||
.global sc_clean
|
||||
sc_clean:
|
||||
movb $0x16, %ah
|
||||
movw $0xe120, %dx
|
||||
int $0x18 # KBD/CRT BIOS
|
||||
movw $0, curpos
|
||||
ret
|
||||
|
||||
#
|
||||
# Set sttribute code
|
||||
# %al: attribute
|
||||
# %cx: count
|
||||
# destroyed: %ax, %bx, %cx
|
||||
#
|
||||
.global sc_setattr
|
||||
sc_setattr:
|
||||
call set_attribute
|
||||
incw curpos
|
||||
incw curpos
|
||||
loop sc_setattr
|
||||
|
||||
#
|
||||
# Sense the state of shift key
|
||||
# destroyed: %ax
|
||||
#
|
||||
.global sc_getshiftkey
|
||||
sc_getshiftkey:
|
||||
movb $2, %ah # Sense KB_SHIFT_COD
|
||||
int $0x18 # KBD/CRT BIOS
|
||||
xorb %ah, %ah
|
||||
ret
|
||||
|
||||
#
|
||||
# Check KBD buffer
|
||||
#
|
||||
.global sc_iskeypress
|
||||
sc_iskeypress:
|
||||
mov $1, %ah
|
||||
int $0x18 # KBD/CRT BIOS
|
||||
testb $1, %bh
|
||||
jz no_key
|
||||
movw $1, %ax
|
||||
ret
|
||||
no_key:
|
||||
xorw %ax, %ax
|
||||
ret
|
||||
|
||||
#
|
||||
# Read from KBD
|
||||
#
|
||||
.global sc_getc
|
||||
sc_getc:
|
||||
xorb %ah, %ah
|
||||
int $0x18
|
||||
ret
|
||||
|
||||
#
|
||||
# Initialize CRT (normal mode)
|
||||
#
|
||||
init_screen_normal:
|
||||
# Disable graphic screen
|
||||
movb $0x41, %ah
|
||||
int $0x18
|
||||
# Init graphic screen
|
||||
movb $0x42, %al
|
||||
movb $0xc0, %ch
|
||||
int $0x18
|
||||
# 80x25 mode
|
||||
movw $0x0a00, %ax
|
||||
int $0x18
|
||||
ret
|
||||
|
||||
#
|
||||
# Initialize CRT (hireso mode)
|
||||
#
|
||||
init_screen_hireso:
|
||||
# Init RAM window
|
||||
movb $8, %al
|
||||
outb %al, $0x91
|
||||
movb $0x0a, %al
|
||||
outb %al, $0x93
|
||||
# 80x31 mode
|
||||
movw $0x0a00, %ax
|
||||
int $0x18
|
||||
ret
|
||||
|
||||
#
|
||||
# Initialize screen (internal)
|
||||
#
|
||||
init_screen:
|
||||
movb ishireso, %ah
|
||||
orb %ah, %ah
|
||||
jne hireso_ini
|
||||
call init_screen_normal
|
||||
jmp init_next
|
||||
hireso_ini:
|
||||
call init_screen_hireso
|
||||
init_next:
|
||||
movb $0x0c, %ah
|
||||
int $0x18
|
||||
# cursor home and off
|
||||
xorw %dx, %dx
|
||||
movb $0x13, %ah
|
||||
int $0x18
|
||||
movb $0x12, %ah
|
||||
int $0x18
|
||||
ret
|
||||
|
||||
#
|
||||
# Initialize screeen
|
||||
#
|
||||
.global sc_init
|
||||
sc_init:
|
||||
call init_screen
|
||||
call sc_clean
|
||||
movw $0, curpos
|
||||
ret
|
||||
|
||||
.data
|
||||
curpos: .word 0 # Current cursor position
|
@ -1,19 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= ${BOOT}
|
||||
INTERNALPROG=
|
||||
FILES= ${BOOT}
|
||||
MAN=
|
||||
SRCS= ${BOOT}.s
|
||||
CLEANFILES= ${BOOT}
|
||||
|
||||
BOOT= boot0
|
||||
|
||||
# The base address that we the boot0 code to to run it. Don't change this
|
||||
# unless you are glutton for punishment.
|
||||
BOOT_BOOT0_ORG?= 0x0000
|
||||
ORG=${BOOT_BOOT0_ORG}
|
||||
|
||||
LDFLAGS=${LDFLAGS_BIN}
|
||||
|
||||
.include <bsd.prog.mk>
|
@ -1,108 +0,0 @@
|
||||
# Copyright (c) KATO Takenori, 1999, 2000.
|
||||
#
|
||||
# All rights reserved. Unpublished rights reserved under the copyright
|
||||
# laws of Japan.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer as
|
||||
# the first lines of this file unmodified.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# 3. The name of the author may not be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# $FreeBSD$
|
||||
|
||||
.globl start
|
||||
.code16
|
||||
start:
|
||||
jmp main
|
||||
|
||||
.org 4
|
||||
.ascii "IPL1"
|
||||
.byte 0, 0, 0
|
||||
|
||||
.globl start
|
||||
main:
|
||||
xor %ax, %ax
|
||||
mov %ax, %ds
|
||||
mov (0x584), %al # DA/UA
|
||||
mov %al, %ah
|
||||
and $0xf0, %ah
|
||||
cmp $0x90, %ah
|
||||
je fdd
|
||||
|
||||
# hdd
|
||||
mov $6, %ah
|
||||
mov $0x3000, %bx
|
||||
mov %bx, %es
|
||||
mov $0x2000, %bx
|
||||
xor %cx, %cx
|
||||
xor %dx, %dx
|
||||
xor %bp, %bp
|
||||
int $0x1b
|
||||
jc error_hdd
|
||||
|
||||
push %ax
|
||||
mov %es, %ax
|
||||
add $0x40, %ax
|
||||
mov %ax, %es
|
||||
pop %ax
|
||||
push %es
|
||||
push %bp
|
||||
lret
|
||||
|
||||
# fdd
|
||||
fdd:
|
||||
xor %di, %di
|
||||
fdd_retry:
|
||||
mov $0xd6, %ah
|
||||
mov $0x3000, %bx
|
||||
mov %bx, %es
|
||||
mov $0x2000, %bx
|
||||
mov $0x0200, %cx
|
||||
mov $0x0001, %dx
|
||||
xor %bp, %bp
|
||||
int $0x1b
|
||||
jc error
|
||||
push %ax
|
||||
mov %es, %ax
|
||||
add $0x40, %ax
|
||||
mov %ax, %es
|
||||
pop %ax
|
||||
push %es
|
||||
push %bp
|
||||
lret
|
||||
|
||||
error:
|
||||
or %di, %di
|
||||
jnz error_hdd
|
||||
and $0x0f, %al
|
||||
or $0x30, %al
|
||||
jmp fdd_retry
|
||||
|
||||
error_hdd:
|
||||
jmp error
|
||||
|
||||
.org 0x1fa
|
||||
.byte 0 # defflag_off
|
||||
.byte 0 # defpart_off
|
||||
.byte 1 # menu version
|
||||
.byte 0
|
||||
.word 0xaa55
|
@ -1,116 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.include <bsd.own.mk>
|
||||
|
||||
FILES= boot boot1 boot2
|
||||
|
||||
NM?= nm
|
||||
|
||||
BOOT_COMCONSOLE_PORT?= 0x238
|
||||
BOOT_COMCONSOLE_SPEED?= 9600
|
||||
B2SIOFMT?= 0x3
|
||||
|
||||
REL1= 0x700
|
||||
ORG1= 0
|
||||
ORG2= 0x2000
|
||||
|
||||
# Decide level of UFS support.
|
||||
BOOT2_UFS?= UFS1_AND_UFS2
|
||||
#BOOT2_UFS?= UFS2_ONLY
|
||||
#BOOT2_UFS?= UFS1_ONLY
|
||||
|
||||
CFLAGS= -fomit-frame-pointer \
|
||||
-mrtd \
|
||||
-mregparm=3 \
|
||||
-D${BOOT2_UFS} \
|
||||
-DFLAGS=${BOOT_BOOT1_FLAGS} \
|
||||
-DSIOPRT=${BOOT_COMCONSOLE_PORT} \
|
||||
-DSIOFMT=${B2SIOFMT} \
|
||||
-DSIOSPD=${BOOT_COMCONSOLE_SPEED} \
|
||||
-I${.CURDIR}/../../.. \
|
||||
-I${.CURDIR}/../../i386/boot2 \
|
||||
-I${.CURDIR}/../../common \
|
||||
-I${.CURDIR}/../btx/lib -I. \
|
||||
-Wall -Waggregate-return -Wbad-function-cast -Wcast-align \
|
||||
-Wmissing-declarations -Wmissing-prototypes -Wnested-externs \
|
||||
-Wpointer-arith -Wshadow -Wstrict-prototypes -Wwrite-strings \
|
||||
-Winline
|
||||
|
||||
CFLAGS.gcc+= -Os \
|
||||
-fno-guess-branch-probability \
|
||||
-fno-unit-at-a-time \
|
||||
--param max-inline-insns-single=100
|
||||
.if ${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} <= 40201
|
||||
CFLAGS.gcc+= -mno-align-long-strings
|
||||
.endif
|
||||
|
||||
# Set machine type to PC98_SYSTEM_PARAMETER
|
||||
#CFLAGS+= -DSET_MACHINE_TYPE
|
||||
|
||||
# Initialize the bi_bios_geom using the BIOS geometry
|
||||
#CFLAGS+= -DGET_BIOSGEOM
|
||||
|
||||
CFLAGS.clang+= -Oz ${CLANG_OPT_SMALL}
|
||||
|
||||
LD_FLAGS=${LD_FLAGS_BIN}
|
||||
|
||||
# Pick up ../Makefile.inc early.
|
||||
.include <bsd.init.mk>
|
||||
|
||||
.PATH: ${.CURDIR}/../../i386/boot2
|
||||
|
||||
CLEANFILES= boot
|
||||
|
||||
boot: boot1 boot2
|
||||
cat boot1 boot2 > boot
|
||||
|
||||
CLEANFILES+= boot1 boot1.out boot1.o
|
||||
|
||||
boot1: boot1.out
|
||||
${OBJCOPY} -S -O binary boot1.out ${.TARGET}
|
||||
|
||||
boot1.out: boot1.o
|
||||
${LD} ${LD_FLAGS} -e start -Ttext ${ORG1} -o ${.TARGET} boot1.o
|
||||
|
||||
CLEANFILES+= boot2 boot2.ld boot2.ldr boot2.bin boot2.out boot2.o \
|
||||
boot2.s boot2.s.tmp boot2.h sio.o
|
||||
|
||||
boot2: boot2.ld
|
||||
@set -- `ls -l boot2.ld`; x=$$((7680-$$5)); \
|
||||
echo "$$x bytes available"; test $$x -ge 0
|
||||
${DD} if=boot2.ld of=${.TARGET} obs=7680 conv=osync
|
||||
|
||||
boot2.ld: boot2.ldr boot2.bin ${BTXKERN}
|
||||
btxld -v -E ${ORG2} -f bin -b ${BTXKERN} -l boot2.ldr \
|
||||
-o ${.TARGET} -P 1 boot2.bin
|
||||
|
||||
boot2.ldr:
|
||||
${DD} if=/dev/zero of=${.TARGET} bs=276 count=1
|
||||
|
||||
boot2.bin: boot2.out
|
||||
${OBJCOPY} -S -O binary boot2.out ${.TARGET}
|
||||
|
||||
boot2.out: ${BTXCRT} boot2.o sio.o
|
||||
${LD} ${LD_FLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC}
|
||||
|
||||
boot2.o: boot2.s
|
||||
${CC} ${ACFLAGS} -c boot2.s
|
||||
|
||||
SRCS= boot2.c boot2.h
|
||||
|
||||
boot2.s: boot2.c boot2.h ${.CURDIR}/../../common/ufsread.c
|
||||
${CC} ${CFLAGS} -S -o boot2.s.tmp ${.CURDIR}/boot2.c
|
||||
sed -e '/align/d' -e '/nop/d' < boot2.s.tmp > boot2.s
|
||||
rm -f boot2.s.tmp
|
||||
|
||||
boot2.h: boot1.out
|
||||
${NM} -t d ${.ALLSRC} | awk '/([0-9])+ T (read|putc)/ \
|
||||
{ x = $$1 - ORG1; \
|
||||
printf("#define %sORG %#x\n", toupper($$3), REL1 + x) }' \
|
||||
ORG1=`printf "%d" ${ORG1}` \
|
||||
REL1=`printf "%d" ${REL1}` > ${.TARGET}
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
||||
# XXX: clang integrated-as doesn't grok .codeNN directives yet
|
||||
CFLAGS.boot1.S= ${CLANG_NO_IAS}
|
@ -1,395 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2008-2009 TAKAHASHI Yoshihiro
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/* Memory Locations */
|
||||
.set STACK_OFF,0x6000 # Stack offset
|
||||
.set LOAD_SIZE,8192 # Load size
|
||||
.set DAUA,0x0584 # DA/UA
|
||||
.set MEM_REL,0x700 # Relocation address
|
||||
.set MEM_ARG,0x900 # Arguments
|
||||
.set MEM_BUF,0x8cec # Load area
|
||||
.set MEM_BTX,0x9000 # BTX start
|
||||
.set MEM_JMP,0x9010 # BTX entry point
|
||||
.set MEM_USR,0xa000 # Client start
|
||||
|
||||
/* PC98 machine type from sys/pc98/pc98/pc98_machdep.h */
|
||||
.set MEM_SYS, 0xa100 # System common area segment
|
||||
.set PC98_MACHINE_TYPE, 0x0620 # PC98 machine type
|
||||
.set EPSON_ID, 0x0624 # EPSON machine id
|
||||
|
||||
.set M_NEC_PC98, 0x0001
|
||||
.set M_EPSON_PC98, 0x0002
|
||||
.set M_NOT_H98, 0x0010
|
||||
.set M_H98, 0x0020
|
||||
.set M_NOTE, 0x0040
|
||||
.set M_NORMAL, 0x1000
|
||||
.set M_8M, 0x8000
|
||||
|
||||
/* Partition Constants */
|
||||
.set PRT_OFF,0x1be # Partition offset
|
||||
|
||||
/* Misc. Constants */
|
||||
.set SIZ_PAG,0x1000 # Page size
|
||||
.set SIZ_SEC,0x200 # Sector size
|
||||
|
||||
.set NSECT,0x10
|
||||
|
||||
.globl start
|
||||
.globl read
|
||||
.globl putc
|
||||
.code16
|
||||
|
||||
start: jmp main
|
||||
|
||||
boot_cyl: .org 4
|
||||
.ascii "IPL1 "
|
||||
|
||||
main: cld
|
||||
|
||||
/* Setup the stack */
|
||||
xor %si,%si
|
||||
mov %si,%ss
|
||||
mov $STACK_OFF,%sp
|
||||
|
||||
push %cx
|
||||
|
||||
/* Relocate ourself to MEM_REL */
|
||||
push %cs
|
||||
pop %ds
|
||||
mov %si,%es
|
||||
mov $MEM_REL,%di
|
||||
mov $SIZ_SEC,%cx
|
||||
rep
|
||||
movsb
|
||||
|
||||
/* Transfer PC-9801 system common area */
|
||||
xor %ax,%ax
|
||||
mov %ax,%si
|
||||
mov %ax,%ds
|
||||
mov %ax,%di
|
||||
mov $MEM_SYS,%ax
|
||||
mov %ax,%es
|
||||
mov $0x0600,%cx
|
||||
rep
|
||||
movsb
|
||||
|
||||
/* Transfer EPSON machine type */
|
||||
mov $0xfd00,%ax
|
||||
mov %ax,%ds
|
||||
mov (0x804),%eax
|
||||
and $0x00ffffff,%eax
|
||||
mov %eax,%es:(EPSON_ID)
|
||||
|
||||
/* Set machine type to PC98_SYSTEM_PARAMETER */
|
||||
#ifdef SET_MACHINE_TYPE
|
||||
call set_machine_type
|
||||
#else
|
||||
mov $M_NEC_PC98+M_NOT_H98,%eax
|
||||
mov %eax,%es:(PC98_MACHINE_TYPE)
|
||||
#endif
|
||||
|
||||
/* Setup graphic screen */
|
||||
mov $0x42,%ah /* 640x400 */
|
||||
mov $0xc0,%ch
|
||||
int $0x18
|
||||
mov $0x40,%ah /* graph on */
|
||||
int $0x18
|
||||
|
||||
/* Setup text screen */
|
||||
mov $0x0a00,%ax /* 80x25 */
|
||||
int $0x18
|
||||
mov $0x0c,%ah /* text on */
|
||||
int $0x18
|
||||
mov $0x13,%ah /* cursor home */
|
||||
xor %dx,%dx
|
||||
int $0x18
|
||||
mov $0x11,%ah /* cursor on */
|
||||
int $0x18
|
||||
|
||||
/* Setup keyboard */
|
||||
mov $0x03,%ah
|
||||
int $0x18
|
||||
|
||||
pop %cx
|
||||
|
||||
/* bootstrap passes */
|
||||
xor %edi,%edi
|
||||
mov %di,%ds
|
||||
mov %di,%es
|
||||
mov %cs,%bx
|
||||
cmp $0x1fe0,%bx
|
||||
jz boot_fd
|
||||
cmp $0x1fc0,%bx
|
||||
jnz boot_hd
|
||||
xor %cx,%cx
|
||||
mov (DAUA),%al
|
||||
and $0xf0,%al
|
||||
cmp $0x30,%al
|
||||
jz boot_fd
|
||||
cmp $0x90,%al
|
||||
jnz boot_hd
|
||||
boot_fd: xor %cx,%cx
|
||||
jmp boot_load
|
||||
boot_hd: test %cx,%cx
|
||||
jnz boot_load
|
||||
mov %cs:(boot_cyl),%cx
|
||||
boot_load: mov %cx,MEM_ARG /* Save cylinder number */
|
||||
mov %cx,%di
|
||||
xor %dx,%dx
|
||||
mov $LOAD_SIZE,%bx
|
||||
mov $MEM_BUF,%bp
|
||||
push %cs
|
||||
callw read
|
||||
jc error
|
||||
|
||||
/* Transfer boot2.bin */
|
||||
mov $MEM_BTX,%bx
|
||||
mov 0xa(%bx),%si /* BTX size */
|
||||
add %bx,%si /* start of boot2.bin */
|
||||
mov $MEM_USR+SIZ_PAG*2,%di
|
||||
mov $MEM_BTX+(NSECT-1)*SIZ_SEC,%cx
|
||||
sub %si,%cx
|
||||
rep
|
||||
movsb
|
||||
|
||||
/* Enable A20 */
|
||||
xor %ax,%ax
|
||||
outb %al,$0xf2
|
||||
mov $0x02,%al
|
||||
outb %al,$0xf6
|
||||
|
||||
/* Start BTX */
|
||||
ljmp $0x0000,$MEM_JMP
|
||||
|
||||
/*
|
||||
* Reads sectors from the disk.
|
||||
* Call with:
|
||||
*
|
||||
* %bx - bytes to read
|
||||
* %cx - cylinder
|
||||
* %dh - head
|
||||
* %dl - sector
|
||||
* %edi - lba
|
||||
* %es:(%bp) - buffer to read data into
|
||||
*/
|
||||
read: xor %ax,%ax
|
||||
mov %ax,%ds
|
||||
mov $0x06,%ah
|
||||
mov (DAUA),%al
|
||||
mov %ax,%si
|
||||
and $0xf0,%al
|
||||
cmp $0x30,%al /* 1.44MB FDD */
|
||||
jz read_fd
|
||||
cmp $0x90,%al /* 1MB FDD */
|
||||
jz read_fd
|
||||
cmp $0xa0,%al /* Is SCSI device? */
|
||||
jnz read_load
|
||||
push %cx
|
||||
mov %si,%cx
|
||||
and $0x0f,%cl
|
||||
inc %cl
|
||||
mov (0x482),%ah
|
||||
shr %cl,%ah /* Is SCSI HDD? */
|
||||
pop %cx
|
||||
jc read_load
|
||||
and $0xff7f,%si /* SCSI MO */
|
||||
mov %di,%cx
|
||||
shr $16,%edi
|
||||
mov %di,%dx
|
||||
jmp read_load
|
||||
read_fd: or $0xd000,%si
|
||||
or $0x0200,%cx
|
||||
inc %dx
|
||||
read_load: mov %si,%ax
|
||||
int $0x1b
|
||||
lret
|
||||
|
||||
/*
|
||||
* Print out the error message, wait for a keypress, and then reboot
|
||||
* the machine.
|
||||
*/
|
||||
error: push %cs
|
||||
pop %ds
|
||||
mov $msg_eread,%si
|
||||
call putstr
|
||||
xor %ax,%ax /* Get keypress */
|
||||
int $0x18
|
||||
xor %ax,%ax /* CPU reset */
|
||||
outb %al,$0xf0
|
||||
halt: hlt
|
||||
jmp halt /* Spin */
|
||||
|
||||
/*
|
||||
* Display a null-terminated string.
|
||||
*/
|
||||
putstr.0: push %cs
|
||||
callw putc
|
||||
putstr: lodsb
|
||||
test %al,%al
|
||||
jne putstr.0
|
||||
ret
|
||||
|
||||
/*
|
||||
* Display a single char.
|
||||
*/
|
||||
putc: pusha
|
||||
xor %dx,%dx
|
||||
mov %dx,%ds
|
||||
mov MEM_REL+cursor-start,%di
|
||||
mov $0xa000,%bx
|
||||
mov %bx,%es
|
||||
mov $(80*2),%cx
|
||||
|
||||
cmp $0x08,%al
|
||||
je putc.bs
|
||||
cmp $0x0d,%al
|
||||
je putc.cr
|
||||
cmp $0x0a,%al
|
||||
je putc.lf
|
||||
cmp $0x5c,%al /* \ */
|
||||
jne 1f
|
||||
mov $0xfc,%al
|
||||
1: movb $0xe1,%es:0x2000(%di)
|
||||
stosw
|
||||
jmp putc.scr
|
||||
putc.bs: test %di,%di
|
||||
jz putc.move
|
||||
dec %di
|
||||
dec %di
|
||||
movb $0xe1,%es:0x2000(%di)
|
||||
movw $0x20,%es:(%di)
|
||||
jmp putc.move
|
||||
putc.cr: mov %di,%ax
|
||||
div %cx
|
||||
sub %dx,%di
|
||||
jmp putc.move
|
||||
putc.lf: add %cx,%di
|
||||
putc.scr: cmp $(80*2*25),%di /* Scroll screen */
|
||||
jb putc.move
|
||||
push %ds
|
||||
mov %bx,%ds
|
||||
mov $(80*2),%si
|
||||
xor %di,%di
|
||||
mov $(80*24/2),%cx
|
||||
rep
|
||||
movsl
|
||||
xor %ax,%ax
|
||||
mov $0x20,%al
|
||||
mov $80,%cl
|
||||
rep
|
||||
stosw
|
||||
pop %ds
|
||||
mov $(80*24*2),%di
|
||||
putc.move: mov %di,MEM_REL+cursor-start /* Move cursor */
|
||||
mov $0x13,%ah
|
||||
mov %di,%dx
|
||||
int $0x18
|
||||
popa
|
||||
lret
|
||||
|
||||
cursor: .word 0
|
||||
|
||||
#ifdef SET_MACHINE_TYPE
|
||||
/*
|
||||
* Set machine type to PC98_SYSTEM_PARAMETER.
|
||||
*/
|
||||
set_machine_type:
|
||||
xor %edx,%edx
|
||||
mov %dx,%ds
|
||||
// mov $MEM_SYS,%ax
|
||||
// mov %ax,%es
|
||||
|
||||
/* Wait V-SYNC */
|
||||
vsync.1: inb $0x60,%al
|
||||
test $0x20,%al
|
||||
jnz vsync.1
|
||||
vsync.2: inb $0x60,%al
|
||||
test $0x20,%al
|
||||
jz vsync.2
|
||||
|
||||
/* ANK 'A' font */
|
||||
xor %al,%al
|
||||
outb %al,$0xa1
|
||||
mov $0x41,%al
|
||||
outb %al,$0xa3
|
||||
|
||||
/* Get 'A' font from CG window */
|
||||
push %ds
|
||||
mov $0xa400,%ax
|
||||
mov %ax,%ds
|
||||
xor %eax,%eax
|
||||
xor %bx,%bx
|
||||
mov $4,%cx
|
||||
font.1: add (%bx),%eax
|
||||
add $4,%bx
|
||||
loop font.1
|
||||
pop %ds
|
||||
cmp $0x6efc58fc,%eax
|
||||
jnz m_epson
|
||||
|
||||
m_pc98: or $M_NEC_PC98,%edx
|
||||
mov $0x0458,%bx
|
||||
mov (%bx),%al
|
||||
test $0x80,%al
|
||||
jz m_not_h98
|
||||
or $M_H98,%edx
|
||||
jmp 1f
|
||||
m_epson: or $M_EPSON_PC98,%edx
|
||||
m_not_h98: or $M_NOT_H98,%edx
|
||||
|
||||
1: inb $0x42,%al
|
||||
test $0x20,%al
|
||||
jz 1f
|
||||
or $M_8M,%edx
|
||||
|
||||
1: mov $0x0400,%bx
|
||||
mov (%bx),%al
|
||||
test $0x80,%al
|
||||
jz 1f
|
||||
or $M_NOTE,%edx
|
||||
|
||||
1: mov $PC98_MACHINE_TYPE,%bx
|
||||
mov %edx,%es:(%bx)
|
||||
ret
|
||||
#endif
|
||||
|
||||
/* Messages */
|
||||
|
||||
msg_eread: .asciz "Error\r\n"
|
||||
|
||||
.org PRT_OFF,0x90
|
||||
|
||||
/* Partition table */
|
||||
|
||||
.fill 0x30,0x1,0x0
|
||||
.byte 0x80, 0x00, 0x01, 0x00
|
||||
.byte 0xa5, 0xff, 0xff, 0xff
|
||||
.byte 0x00, 0x00, 0x00, 0x00
|
||||
.byte 0x50, 0xc3, 0x00, 0x00
|
||||
|
||||
.word 0xaa55 # Magic number
|
@ -1,803 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2008-2009 TAKAHASHI Yoshihiro
|
||||
* Copyright (c) 1998 Robert Nordier
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are freely
|
||||
* permitted provided that the above copyright notice and this
|
||||
* paragraph and the following disclaimer are duplicated in all
|
||||
* such forms.
|
||||
*
|
||||
* This software is provided "AS IS" and without any express or
|
||||
* implied warranties, including, without limitation, the implied
|
||||
* warranties of merchantability and fitness for a particular
|
||||
* purpose.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/diskpc98.h>
|
||||
#include <sys/dirent.h>
|
||||
#include <sys/reboot.h>
|
||||
|
||||
#include <machine/bootinfo.h>
|
||||
#include <machine/cpufunc.h>
|
||||
#include <machine/elf.h>
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <a.out.h>
|
||||
|
||||
#include <btxv86.h>
|
||||
|
||||
#include "boot2.h"
|
||||
#include "lib.h"
|
||||
#include "paths.h"
|
||||
#include "rbx.h"
|
||||
|
||||
/* Define to 0 to omit serial support */
|
||||
#ifndef SERIAL
|
||||
#define SERIAL 0
|
||||
#endif
|
||||
|
||||
#define IO_KEYBOARD 1
|
||||
#define IO_SERIAL 2
|
||||
|
||||
#if SERIAL
|
||||
#define DO_KBD (ioctrl & IO_KEYBOARD)
|
||||
#define DO_SIO (ioctrl & IO_SERIAL)
|
||||
#else
|
||||
#define DO_KBD (1)
|
||||
#define DO_SIO (0)
|
||||
#endif
|
||||
|
||||
#define SECOND 1 /* Circa that many ticks in a second. */
|
||||
|
||||
#define ARGS 0x900
|
||||
#define NOPT 14
|
||||
#define NDEV 3
|
||||
|
||||
#define DRV_DISK 0xf0
|
||||
#define DRV_UNIT 0x0f
|
||||
|
||||
#define TYPE_AD 0
|
||||
#define TYPE_DA 1
|
||||
#define TYPE_FD 2
|
||||
|
||||
extern uint32_t _end;
|
||||
|
||||
static const char optstr[NOPT] = "DhaCcdgmnpqrsv"; /* Also 'P', 'S' */
|
||||
static const unsigned char flags[NOPT] = {
|
||||
RBX_DUAL,
|
||||
RBX_SERIAL,
|
||||
RBX_ASKNAME,
|
||||
RBX_CDROM,
|
||||
RBX_CONFIG,
|
||||
RBX_KDB,
|
||||
RBX_GDB,
|
||||
RBX_MUTE,
|
||||
RBX_NOINTR,
|
||||
RBX_PAUSE,
|
||||
RBX_QUIET,
|
||||
RBX_DFLTROOT,
|
||||
RBX_SINGLE,
|
||||
RBX_VERBOSE
|
||||
};
|
||||
|
||||
static const char *const dev_nm[NDEV] = {"ad", "da", "fd"};
|
||||
static const unsigned char dev_maj[NDEV] = {30, 4, 2};
|
||||
static const unsigned char dev_daua[NDEV] = {0x80, 0xa0, 0x90};
|
||||
|
||||
static struct dsk {
|
||||
unsigned daua;
|
||||
unsigned type;
|
||||
unsigned disk;
|
||||
unsigned unit;
|
||||
unsigned head;
|
||||
unsigned sec;
|
||||
uint8_t slice;
|
||||
uint8_t part;
|
||||
unsigned start;
|
||||
} dsk;
|
||||
static char cmd[512], cmddup[512], knamebuf[1024];
|
||||
static const char *kname;
|
||||
uint32_t opts;
|
||||
static struct bootinfo bootinfo;
|
||||
#if SERIAL
|
||||
static int comspeed = SIOSPD;
|
||||
static uint8_t ioctrl = IO_KEYBOARD;
|
||||
#endif
|
||||
|
||||
int main(void);
|
||||
void exit(int);
|
||||
static void load(void);
|
||||
static int parse(void);
|
||||
static int dskread(void *, unsigned, unsigned);
|
||||
static void printf(const char *,...);
|
||||
static void putchar(int);
|
||||
static int drvread(void *, unsigned);
|
||||
static int keyhit(unsigned);
|
||||
static int xputc(int);
|
||||
static int xgetc(int);
|
||||
static inline int getc(int);
|
||||
|
||||
static void memcpy(void *, const void *, int);
|
||||
static void
|
||||
memcpy(void *dst, const void *src, int len)
|
||||
{
|
||||
const char *s = src;
|
||||
char *d = dst;
|
||||
|
||||
while (len--)
|
||||
*d++ = *s++;
|
||||
}
|
||||
|
||||
static inline int
|
||||
strcmp(const char *s1, const char *s2)
|
||||
{
|
||||
for (; *s1 == *s2 && *s1; s1++, s2++);
|
||||
return (unsigned char)*s1 - (unsigned char)*s2;
|
||||
}
|
||||
|
||||
#define UFS_SMALL_CGBASE
|
||||
#include "ufsread.c"
|
||||
|
||||
static inline int
|
||||
xfsread(ufs_ino_t inode, void *buf, size_t nbyte)
|
||||
{
|
||||
if ((size_t)fsread(inode, buf, nbyte) != nbyte) {
|
||||
printf("Invalid %s\n", "format");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
getstr(void)
|
||||
{
|
||||
char *s;
|
||||
int c;
|
||||
|
||||
s = cmd;
|
||||
for (;;) {
|
||||
switch (c = xgetc(0)) {
|
||||
case 0:
|
||||
break;
|
||||
case '\177':
|
||||
case '\b':
|
||||
if (s > cmd) {
|
||||
s--;
|
||||
printf("\b \b");
|
||||
}
|
||||
break;
|
||||
case '\n':
|
||||
case '\r':
|
||||
*s = 0;
|
||||
return;
|
||||
default:
|
||||
if (s - cmd < sizeof(cmd) - 1)
|
||||
*s++ = c;
|
||||
putchar(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
putc(int c)
|
||||
{
|
||||
|
||||
v86.ctl = V86_ADDR | V86_CALLF | V86_FLAGS;
|
||||
v86.addr = PUTCORG; /* call to putc in boot1 */
|
||||
v86.eax = c;
|
||||
v86int();
|
||||
v86.ctl = V86_FLAGS;
|
||||
}
|
||||
|
||||
static inline int
|
||||
is_scsi_hd(void)
|
||||
{
|
||||
|
||||
if ((*(u_char *)PTOV(0x482) >> dsk.unit) & 0x01)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
fix_sector_size(void)
|
||||
{
|
||||
u_char *p;
|
||||
|
||||
p = (u_char *)PTOV(0x460 + dsk.unit * 4); /* SCSI equipment parameter */
|
||||
|
||||
if ((p[0] & 0x1f) == 7) { /* SCSI MO */
|
||||
if (!(p[3] & 0x30)) { /* 256B / sector */
|
||||
p[3] |= 0x10; /* forced set 512B / sector */
|
||||
p[3 + 0xa1000] |= 0x10;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
get_diskinfo(void)
|
||||
{
|
||||
|
||||
if (dsk.disk == 0x30) { /* 1440KB FD */
|
||||
/* 80 cylinders, 2 heads, 18 sectors */
|
||||
return (80 << 16) | (2 << 8) | 18;
|
||||
} else if (dsk.disk == 0x90) { /* 1200KB FD */
|
||||
/* 80 cylinders, 2 heads, 15 sectors */
|
||||
return (80 << 16) | (2 << 8) | 15;
|
||||
} else if (dsk.disk == 0x80 || is_scsi_hd()) { /* IDE or SCSI HDD */
|
||||
v86.addr = 0x1b;
|
||||
v86.eax = 0x8400 | dsk.daua;
|
||||
v86int();
|
||||
return (v86.ecx << 16) | v86.edx;
|
||||
}
|
||||
|
||||
/* SCSI MO or CD */
|
||||
fix_sector_size(); /* SCSI MO */
|
||||
|
||||
/* other SCSI devices */
|
||||
return (65535 << 16) | (8 << 8) | 32;
|
||||
}
|
||||
|
||||
static void
|
||||
set_dsk(void)
|
||||
{
|
||||
uint32_t di;
|
||||
|
||||
di = get_diskinfo();
|
||||
|
||||
dsk.head = (di >> 8) & 0xff;
|
||||
dsk.sec = di & 0xff;
|
||||
dsk.start = 0;
|
||||
}
|
||||
|
||||
#ifdef GET_BIOSGEOM
|
||||
static uint32_t
|
||||
bd_getbigeom(int bunit)
|
||||
{
|
||||
int hds = 0;
|
||||
int unit = 0x80; /* IDE HDD */
|
||||
u_int addr = 0x55d;
|
||||
|
||||
while (unit < 0xa7) {
|
||||
if (*(u_char *)PTOV(addr) & (1 << (unit & 0x0f)))
|
||||
if (hds++ == bunit)
|
||||
break;
|
||||
|
||||
if (unit >= 0xA0) {
|
||||
int media = ((unsigned *)PTOV(0x460))[unit & 0x0F] & 0x1F;
|
||||
|
||||
if (media == 7 && hds++ == bunit) /* SCSI MO */
|
||||
return(0xFFFE0820); /* C:65535 H:8 S:32 */
|
||||
}
|
||||
if (++unit == 0x84) {
|
||||
unit = 0xA0; /* SCSI HDD */
|
||||
addr = 0x482;
|
||||
}
|
||||
}
|
||||
if (unit == 0xa7)
|
||||
return 0x4F020F; /* 1200KB FD C:80 H:2 S:15 */
|
||||
v86.addr = 0x1b;
|
||||
v86.eax = 0x8400 | unit;
|
||||
v86int();
|
||||
if (V86_CY(v86.efl))
|
||||
return 0x4F020F; /* 1200KB FD C:80 H:2 S:15 */
|
||||
return ((v86.ecx & 0xffff) << 16) | (v86.edx & 0xffff);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
check_slice(void)
|
||||
{
|
||||
struct pc98_partition *dp;
|
||||
char *sec;
|
||||
unsigned i, cyl;
|
||||
|
||||
sec = dmadat->secbuf;
|
||||
cyl = *(uint16_t *)PTOV(ARGS);
|
||||
set_dsk();
|
||||
|
||||
if (dsk.type == TYPE_FD)
|
||||
return (WHOLE_DISK_SLICE);
|
||||
if (drvread(sec, PC98_BBSECTOR))
|
||||
return (WHOLE_DISK_SLICE); /* Read error */
|
||||
dp = (void *)(sec + PC98_PARTOFF);
|
||||
for (i = 0; i < PC98_NPARTS; i++) {
|
||||
if (dp[i].dp_mid == DOSMID_386BSD) {
|
||||
if (dp[i].dp_scyl <= cyl && cyl <= dp[i].dp_ecyl)
|
||||
return (BASE_SLICE + i);
|
||||
}
|
||||
}
|
||||
|
||||
return (WHOLE_DISK_SLICE);
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
#ifdef GET_BIOSGEOM
|
||||
int i;
|
||||
#endif
|
||||
uint8_t autoboot;
|
||||
ufs_ino_t ino;
|
||||
size_t nbyte;
|
||||
|
||||
dmadat = (void *)(roundup2(__base + (int32_t)&_end, 0x10000) - __base);
|
||||
v86.ctl = V86_FLAGS;
|
||||
v86.efl = PSL_RESERVED_DEFAULT | PSL_I;
|
||||
dsk.daua = *(uint8_t *)PTOV(0x584);
|
||||
dsk.disk = dsk.daua & DRV_DISK;
|
||||
dsk.unit = dsk.daua & DRV_UNIT;
|
||||
if (dsk.disk == 0x80)
|
||||
dsk.type = TYPE_AD;
|
||||
else if (dsk.disk == 0xa0)
|
||||
dsk.type = TYPE_DA;
|
||||
else /* if (dsk.disk == 0x30 || dsk.disk == 0x90) */
|
||||
dsk.type = TYPE_FD;
|
||||
dsk.slice = check_slice();
|
||||
#ifdef GET_BIOSGEOM
|
||||
for (i = 0; i < N_BIOS_GEOM; i++)
|
||||
bootinfo.bi_bios_geom[i] = bd_getbigeom(i);
|
||||
#endif
|
||||
bootinfo.bi_version = BOOTINFO_VERSION;
|
||||
bootinfo.bi_size = sizeof(bootinfo);
|
||||
|
||||
/* Process configuration file */
|
||||
|
||||
autoboot = 1;
|
||||
|
||||
if ((ino = lookup(PATH_CONFIG)) ||
|
||||
(ino = lookup(PATH_DOTCONFIG))) {
|
||||
nbyte = fsread(ino, cmd, sizeof(cmd) - 1);
|
||||
cmd[nbyte] = '\0';
|
||||
}
|
||||
|
||||
if (*cmd) {
|
||||
memcpy(cmddup, cmd, sizeof(cmd));
|
||||
if (parse())
|
||||
autoboot = 0;
|
||||
if (!OPT_CHECK(RBX_QUIET))
|
||||
printf("%s: %s", PATH_CONFIG, cmddup);
|
||||
/* Do not process this command twice */
|
||||
*cmd = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to exec stage 3 boot loader. If interrupted by a keypress,
|
||||
* or in case of failure, try to load a kernel directly instead.
|
||||
*/
|
||||
|
||||
if (!kname) {
|
||||
kname = PATH_LOADER;
|
||||
if (autoboot && !keyhit(3*SECOND)) {
|
||||
load();
|
||||
kname = PATH_KERNEL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Present the user with the boot2 prompt. */
|
||||
|
||||
for (;;) {
|
||||
if (!autoboot || !OPT_CHECK(RBX_QUIET))
|
||||
printf("\nFreeBSD/pc98 boot\n"
|
||||
"Default: %u:%s(%u,%c)%s\n"
|
||||
"boot: ",
|
||||
dsk.unit, dev_nm[dsk.type], dsk.unit,
|
||||
'a' + dsk.part, kname);
|
||||
if (DO_SIO)
|
||||
sio_flush();
|
||||
if (!autoboot || keyhit(3*SECOND))
|
||||
getstr();
|
||||
else if (!autoboot || !OPT_CHECK(RBX_QUIET))
|
||||
putchar('\n');
|
||||
autoboot = 0;
|
||||
if (parse())
|
||||
putchar('\a');
|
||||
else
|
||||
load();
|
||||
}
|
||||
}
|
||||
|
||||
/* XXX - Needed for btxld to link the boot2 binary; do not remove. */
|
||||
void
|
||||
exit(int x)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
load(void)
|
||||
{
|
||||
union {
|
||||
struct exec ex;
|
||||
Elf32_Ehdr eh;
|
||||
} hdr;
|
||||
static Elf32_Phdr ep[2];
|
||||
static Elf32_Shdr es[2];
|
||||
caddr_t p;
|
||||
ufs_ino_t ino;
|
||||
uint32_t addr;
|
||||
int k;
|
||||
uint8_t i, j;
|
||||
|
||||
if (!(ino = lookup(kname))) {
|
||||
if (!ls)
|
||||
printf("No %s\n", kname);
|
||||
return;
|
||||
}
|
||||
if (xfsread(ino, &hdr, sizeof(hdr)))
|
||||
return;
|
||||
|
||||
if (N_GETMAGIC(hdr.ex) == ZMAGIC) {
|
||||
addr = hdr.ex.a_entry & 0xffffff;
|
||||
p = PTOV(addr);
|
||||
fs_off = PAGE_SIZE;
|
||||
if (xfsread(ino, p, hdr.ex.a_text))
|
||||
return;
|
||||
p += roundup2(hdr.ex.a_text, PAGE_SIZE);
|
||||
if (xfsread(ino, p, hdr.ex.a_data))
|
||||
return;
|
||||
} else if (IS_ELF(hdr.eh)) {
|
||||
fs_off = hdr.eh.e_phoff;
|
||||
for (j = k = 0; k < hdr.eh.e_phnum && j < 2; k++) {
|
||||
if (xfsread(ino, ep + j, sizeof(ep[0])))
|
||||
return;
|
||||
if (ep[j].p_type == PT_LOAD)
|
||||
j++;
|
||||
}
|
||||
for (i = 0; i < 2; i++) {
|
||||
p = PTOV(ep[i].p_paddr & 0xffffff);
|
||||
fs_off = ep[i].p_offset;
|
||||
if (xfsread(ino, p, ep[i].p_filesz))
|
||||
return;
|
||||
}
|
||||
p += roundup2(ep[1].p_memsz, PAGE_SIZE);
|
||||
bootinfo.bi_symtab = VTOP(p);
|
||||
if (hdr.eh.e_shnum == hdr.eh.e_shstrndx + 3) {
|
||||
fs_off = hdr.eh.e_shoff + sizeof(es[0]) *
|
||||
(hdr.eh.e_shstrndx + 1);
|
||||
if (xfsread(ino, &es, sizeof(es)))
|
||||
return;
|
||||
for (i = 0; i < 2; i++) {
|
||||
*(Elf32_Word *)p = es[i].sh_size;
|
||||
p += sizeof(es[i].sh_size);
|
||||
fs_off = es[i].sh_offset;
|
||||
if (xfsread(ino, p, es[i].sh_size))
|
||||
return;
|
||||
p += es[i].sh_size;
|
||||
}
|
||||
}
|
||||
addr = hdr.eh.e_entry & 0xffffff;
|
||||
bootinfo.bi_esymtab = VTOP(p);
|
||||
} else {
|
||||
printf("Invalid %s\n", "format");
|
||||
return;
|
||||
}
|
||||
|
||||
bootinfo.bi_kernelname = VTOP(kname);
|
||||
bootinfo.bi_bios_dev = dsk.daua;
|
||||
__exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK),
|
||||
MAKEBOOTDEV(dev_maj[dsk.type], dsk.slice, dsk.unit, dsk.part),
|
||||
0, 0, 0, VTOP(&bootinfo));
|
||||
}
|
||||
|
||||
static int
|
||||
parse()
|
||||
{
|
||||
char *arg = cmd;
|
||||
char *ep, *p, *q;
|
||||
const char *cp;
|
||||
unsigned int drv;
|
||||
int c, i, j;
|
||||
size_t k;
|
||||
|
||||
while ((c = *arg++)) {
|
||||
if (c == ' ' || c == '\t' || c == '\n')
|
||||
continue;
|
||||
for (p = arg; *p && *p != '\n' && *p != ' ' && *p != '\t'; p++);
|
||||
ep = p;
|
||||
if (*p)
|
||||
*p++ = 0;
|
||||
if (c == '-') {
|
||||
while ((c = *arg++)) {
|
||||
if (c == 'P') {
|
||||
if (*(uint8_t *)PTOV(0x481) & 0x48) {
|
||||
cp = "yes";
|
||||
} else {
|
||||
opts |= OPT_SET(RBX_DUAL) | OPT_SET(RBX_SERIAL);
|
||||
cp = "no";
|
||||
}
|
||||
printf("Keyboard: %s\n", cp);
|
||||
continue;
|
||||
#if SERIAL
|
||||
} else if (c == 'S') {
|
||||
j = 0;
|
||||
while ((unsigned int)(i = *arg++ - '0') <= 9)
|
||||
j = j * 10 + i;
|
||||
if (j > 0 && i == -'0') {
|
||||
comspeed = j;
|
||||
break;
|
||||
}
|
||||
/* Fall through to error below ('S' not in optstr[]). */
|
||||
#endif
|
||||
}
|
||||
for (i = 0; c != optstr[i]; i++)
|
||||
if (i == NOPT - 1)
|
||||
return -1;
|
||||
opts ^= OPT_SET(flags[i]);
|
||||
}
|
||||
#if SERIAL
|
||||
ioctrl = OPT_CHECK(RBX_DUAL) ? (IO_SERIAL|IO_KEYBOARD) :
|
||||
OPT_CHECK(RBX_SERIAL) ? IO_SERIAL : IO_KEYBOARD;
|
||||
if (DO_SIO) {
|
||||
if (sio_init(115200 / comspeed) != 0)
|
||||
ioctrl &= ~IO_SERIAL;
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
for (q = arg--; *q && *q != '('; q++);
|
||||
if (*q) {
|
||||
drv = -1;
|
||||
if (arg[1] == ':') {
|
||||
drv = *arg - '0';
|
||||
if (drv > 9)
|
||||
return (-1);
|
||||
arg += 2;
|
||||
}
|
||||
if (q - arg != 2)
|
||||
return -1;
|
||||
for (i = 0; arg[0] != dev_nm[i][0] ||
|
||||
arg[1] != dev_nm[i][1]; i++)
|
||||
if (i == NDEV - 1)
|
||||
return -1;
|
||||
dsk.type = i;
|
||||
arg += 3;
|
||||
dsk.unit = *arg - '0';
|
||||
if (arg[1] != ',' || dsk.unit > 9)
|
||||
return -1;
|
||||
arg += 2;
|
||||
dsk.slice = WHOLE_DISK_SLICE;
|
||||
if (arg[1] == ',') {
|
||||
dsk.slice = *arg - '0' + 1;
|
||||
if (dsk.slice > PC98_NPARTS + 1)
|
||||
return -1;
|
||||
arg += 2;
|
||||
}
|
||||
if (arg[1] != ')')
|
||||
return -1;
|
||||
dsk.part = *arg - 'a';
|
||||
if (dsk.part > 7)
|
||||
return (-1);
|
||||
arg += 2;
|
||||
if (drv == -1)
|
||||
drv = dsk.unit;
|
||||
dsk.disk = dev_daua[dsk.type];
|
||||
dsk.daua = dsk.disk | dsk.unit;
|
||||
dsk_meta = 0;
|
||||
}
|
||||
k = ep - arg;
|
||||
if (k > 0) {
|
||||
if (k >= sizeof(knamebuf))
|
||||
return -1;
|
||||
memcpy(knamebuf, arg, k + 1);
|
||||
kname = knamebuf;
|
||||
}
|
||||
}
|
||||
arg = p;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
dskread(void *buf, unsigned lba, unsigned nblk)
|
||||
{
|
||||
struct pc98_partition *dp;
|
||||
struct disklabel *d;
|
||||
char *sec;
|
||||
unsigned i;
|
||||
uint8_t sl;
|
||||
u_char *p;
|
||||
const char *reason;
|
||||
|
||||
if (!dsk_meta) {
|
||||
sec = dmadat->secbuf;
|
||||
set_dsk();
|
||||
if (dsk.type == TYPE_FD)
|
||||
goto unsliced;
|
||||
if (drvread(sec, PC98_BBSECTOR))
|
||||
return -1;
|
||||
dp = (void *)(sec + PC98_PARTOFF);
|
||||
sl = dsk.slice;
|
||||
if (sl < BASE_SLICE) {
|
||||
for (i = 0; i < PC98_NPARTS; i++)
|
||||
if (dp[i].dp_mid == DOSMID_386BSD) {
|
||||
sl = BASE_SLICE + i;
|
||||
break;
|
||||
}
|
||||
dsk.slice = sl;
|
||||
}
|
||||
if (sl != WHOLE_DISK_SLICE) {
|
||||
dp += sl - BASE_SLICE;
|
||||
if (dp->dp_mid != DOSMID_386BSD) {
|
||||
reason = "slice";
|
||||
goto error;
|
||||
}
|
||||
dsk.start = dp->dp_scyl * dsk.head * dsk.sec +
|
||||
dp->dp_shd * dsk.sec + dp->dp_ssect;
|
||||
}
|
||||
if (drvread(sec, dsk.start + LABELSECTOR))
|
||||
return -1;
|
||||
d = (void *)(sec + LABELOFFSET);
|
||||
if (d->d_magic != DISKMAGIC || d->d_magic2 != DISKMAGIC) {
|
||||
if (dsk.part != RAW_PART) {
|
||||
reason = "label";
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
if (dsk.part >= d->d_npartitions ||
|
||||
!d->d_partitions[dsk.part].p_size) {
|
||||
reason = "partition";
|
||||
goto error;
|
||||
}
|
||||
dsk.start += d->d_partitions[dsk.part].p_offset;
|
||||
dsk.start -= d->d_partitions[RAW_PART].p_offset;
|
||||
}
|
||||
unsliced: ;
|
||||
}
|
||||
for (p = buf; nblk; p += 512, lba++, nblk--) {
|
||||
if ((i = drvread(p, dsk.start + lba)))
|
||||
return i;
|
||||
}
|
||||
return 0;
|
||||
error:
|
||||
printf("Invalid %s\n", reason);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void
|
||||
printf(const char *fmt,...)
|
||||
{
|
||||
va_list ap;
|
||||
static char buf[10];
|
||||
char *s;
|
||||
unsigned u;
|
||||
int c;
|
||||
|
||||
va_start(ap, fmt);
|
||||
while ((c = *fmt++)) {
|
||||
if (c == '%') {
|
||||
c = *fmt++;
|
||||
switch (c) {
|
||||
case 'c':
|
||||
putchar(va_arg(ap, int));
|
||||
continue;
|
||||
case 's':
|
||||
for (s = va_arg(ap, char *); *s; s++)
|
||||
putchar(*s);
|
||||
continue;
|
||||
case 'u':
|
||||
u = va_arg(ap, unsigned);
|
||||
s = buf;
|
||||
do
|
||||
*s++ = '0' + u % 10U;
|
||||
while (u /= 10U);
|
||||
while (--s >= buf)
|
||||
putchar(*s);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
putchar(c);
|
||||
}
|
||||
va_end(ap);
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
putchar(int c)
|
||||
{
|
||||
if (c == '\n')
|
||||
xputc('\r');
|
||||
xputc(c);
|
||||
}
|
||||
|
||||
static int
|
||||
drvread(void *buf, unsigned lba)
|
||||
{
|
||||
static unsigned c = 0x2d5c7c2f;
|
||||
unsigned bpc, x, cyl, head, sec;
|
||||
|
||||
bpc = dsk.sec * dsk.head;
|
||||
cyl = lba / bpc;
|
||||
x = lba % bpc;
|
||||
head = x / dsk.sec;
|
||||
sec = x % dsk.sec;
|
||||
|
||||
if (!OPT_CHECK(RBX_QUIET)) {
|
||||
xputc(c = c << 8 | c >> 24);
|
||||
xputc('\b');
|
||||
}
|
||||
v86.ctl = V86_ADDR | V86_CALLF | V86_FLAGS;
|
||||
v86.addr = READORG; /* call to read in boot1 */
|
||||
v86.ecx = cyl;
|
||||
v86.edx = (head << 8) | sec;
|
||||
v86.edi = lba;
|
||||
v86.ebx = 512;
|
||||
v86.es = VTOPSEG(buf);
|
||||
v86.ebp = VTOPOFF(buf);
|
||||
v86int();
|
||||
v86.ctl = V86_FLAGS;
|
||||
if (V86_CY(v86.efl)) {
|
||||
printf("error %u c/h/s %u/%u/%u lba %u\n", v86.eax >> 8 & 0xff,
|
||||
cyl, head, sec, lba);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
delay(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = 800;
|
||||
do {
|
||||
outb(0x5f, 0); /* about 600ns */
|
||||
} while (--i >= 0);
|
||||
}
|
||||
|
||||
static int
|
||||
keyhit(unsigned sec)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
if (OPT_CHECK(RBX_NOINTR))
|
||||
return 0;
|
||||
for (i = 0; i < sec * 1000; i++) {
|
||||
if (xgetc(1))
|
||||
return 1;
|
||||
delay();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
xputc(int c)
|
||||
{
|
||||
if (DO_KBD)
|
||||
putc(c);
|
||||
if (DO_SIO)
|
||||
sio_putc(c);
|
||||
return c;
|
||||
}
|
||||
|
||||
static int
|
||||
getc(int fn)
|
||||
{
|
||||
v86.addr = 0x18;
|
||||
v86.eax = fn << 8;
|
||||
v86int();
|
||||
if (fn)
|
||||
return (v86.ebx >> 8) & 0x01;
|
||||
else
|
||||
return v86.eax & 0xff;
|
||||
}
|
||||
|
||||
static int
|
||||
xgetc(int fn)
|
||||
{
|
||||
if (OPT_CHECK(RBX_NOINTR))
|
||||
return 0;
|
||||
for (;;) {
|
||||
if (DO_KBD && getc(1))
|
||||
return fn ? 1 : getc(0);
|
||||
if (DO_SIO && sio_ischar())
|
||||
return fn ? 1 : sio_getc();
|
||||
if (fn)
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SUBDIR= btx btxldr lib
|
||||
|
||||
.include <bsd.subdir.mk>
|
@ -1,3 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.include "../Makefile.inc"
|
@ -1,33 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= btx
|
||||
INTERNALPROG=
|
||||
MAN=
|
||||
SRCS= btx.S
|
||||
|
||||
.if defined(BOOT_BTX_NOHANG)
|
||||
BOOT_BTX_FLAGS=0x1
|
||||
.else
|
||||
BOOT_BTX_FLAGS=0x0
|
||||
.endif
|
||||
|
||||
CFLAGS+=-DBTX_FLAGS=${BOOT_BTX_FLAGS}
|
||||
CFLAGS+=-I${.CURDIR}/../../../i386/common
|
||||
|
||||
.if defined(BTX_SERIAL)
|
||||
BOOT_COMCONSOLE_PORT?= 0x238
|
||||
BOOT_COMCONSOLE_SPEED?= 9600
|
||||
B2SIOFMT?= 0x3
|
||||
|
||||
CFLAGS+=-DBTX_SERIAL -DSIOPRT=${BOOT_COMCONSOLE_PORT} \
|
||||
-DSIOFMT=${B2SIOFMT} -DSIOSPD=${BOOT_COMCONSOLE_SPEED}
|
||||
.endif
|
||||
|
||||
ORG= 0x9000
|
||||
|
||||
LDFLAGS=${LDFLAGS_BIN}
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
||||
# XXX: clang integrated-as doesn't grok .codeNN directives yet
|
||||
CFLAGS.btx.S= ${CLANG_NO_IAS}
|
File diff suppressed because it is too large
Load Diff
@ -1,21 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= btxldr
|
||||
INTERNALPROG=
|
||||
MAN=
|
||||
SRCS= btxldr.S
|
||||
|
||||
CFLAGS+=-DLOADER_ADDRESS=${LOADER_ADDRESS}
|
||||
CFLAGS+=-I${.CURDIR}/../../../i386/common
|
||||
|
||||
.if defined(BTXLDR_VERBOSE)
|
||||
CFLAGS+=-DBTXLDR_VERBOSE
|
||||
.endif
|
||||
|
||||
ORG=${LOADER_ADDRESS}
|
||||
LDFLAGS=${LDFLAGS_BIN}
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
||||
# XXX: clang integrated-as doesn't grok .codeNN directives yet
|
||||
CFLAGS.btxldr.S= ${CLANG_NO_IAS}
|
@ -1,430 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1998 Robert Nordier
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are freely
|
||||
* permitted provided that the above copyright notice and this
|
||||
* paragraph and the following disclaimer are duplicated in all
|
||||
* such forms.
|
||||
*
|
||||
* This software is provided "AS IS" and without any express or
|
||||
* implied warranties, including, without limitation, the implied
|
||||
* warranties of merchantability and fitness for a particular
|
||||
* purpose.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include <bootargs.h>
|
||||
|
||||
/*
|
||||
* Prototype BTX loader program, written in a couple of hours. The
|
||||
* real thing should probably be more flexible, and in C.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Memory locations.
|
||||
*/
|
||||
.set MEM_STUB,0x600 # Real mode stub
|
||||
.set MEM_ESP,0x1000 # New stack pointer
|
||||
.set MEM_TBL,0x5000 # BTX page tables
|
||||
.set MEM_ENTRY,0x9010 # BTX entry point
|
||||
.set MEM_DATA,start+0x1000 # Data segment
|
||||
/*
|
||||
* Segment selectors.
|
||||
*/
|
||||
.set SEL_SCODE,0x8 # 4GB code
|
||||
.set SEL_SDATA,0x10 # 4GB data
|
||||
.set SEL_RCODE,0x18 # 64K code
|
||||
.set SEL_RDATA,0x20 # 64K data
|
||||
/*
|
||||
* Paging constants.
|
||||
*/
|
||||
.set PAG_SIZ,0x1000 # Page size
|
||||
.set PAG_ENT,0x4 # Page entry size
|
||||
/*
|
||||
* Screen constants.
|
||||
*/
|
||||
.set SCR_MAT,0xe1 # Mode/attribute
|
||||
.set SCR_COL,0x50 # Columns per row
|
||||
.set SCR_ROW,0x19 # Rows per screen
|
||||
/*
|
||||
* BIOS Data Area locations.
|
||||
*/
|
||||
.set BDA_MEM,0xa1501 # Free memory
|
||||
.set BDA_POS,0xa153e # Cursor position
|
||||
/*
|
||||
* Required by aout gas inadequacy.
|
||||
*/
|
||||
.set SIZ_STUB,0x1a # Size of stub
|
||||
/*
|
||||
* We expect to be loaded by boot2 at the origin defined in ./Makefile.
|
||||
*/
|
||||
.globl start
|
||||
/*
|
||||
* BTX program loader for ELF clients.
|
||||
*/
|
||||
start: cld # String ops inc
|
||||
cli
|
||||
gdcwait.1: inb $0x60,%al
|
||||
testb $0x04,%al
|
||||
jz gdcwait.1
|
||||
movb $0xe0,%al
|
||||
outb %al,$0x62
|
||||
nop
|
||||
gdcwait.2: inb $0x60,%al
|
||||
testb $0x01,%al
|
||||
jz gdcwait.2
|
||||
inb $0x62,%al
|
||||
movb %al,%dl
|
||||
inb $0x62,%al
|
||||
movb %al,%dh
|
||||
inb $0x62,%al
|
||||
inb $0x62,%al
|
||||
inb $0x62,%al
|
||||
shlw $1,%dx
|
||||
movl $BDA_POS,%ebx
|
||||
movw %dx,(%ebx)
|
||||
movl $m_logo,%esi # Identify
|
||||
call putstr # ourselves
|
||||
movzwl BDA_MEM,%eax # Get base memory
|
||||
andl $0x7,%eax
|
||||
incl %eax
|
||||
shll $0x11,%eax # in bytes
|
||||
movl %eax,%ebp # Base of user stack
|
||||
#ifdef BTXLDR_VERBOSE
|
||||
movl $m_mem,%esi # Display
|
||||
call hexout # amount of
|
||||
call putstr # base memory
|
||||
#endif
|
||||
lgdt gdtdesc # Load new GDT
|
||||
/*
|
||||
* Relocate caller's arguments.
|
||||
*/
|
||||
#ifdef BTXLDR_VERBOSE
|
||||
movl $m_esp,%esi # Display
|
||||
movl %esp,%eax # caller
|
||||
call hexout # stack
|
||||
call putstr # pointer
|
||||
movl $m_args,%esi # Format string
|
||||
leal 0x4(%esp),%ebx # First argument
|
||||
movl $0x6,%ecx # Count
|
||||
start.1: movl (%ebx),%eax # Get argument and
|
||||
addl $0x4,%ebx # bump pointer
|
||||
call hexout # Display it
|
||||
loop start.1 # Till done
|
||||
call putstr # End message
|
||||
#endif
|
||||
movl BA_BOOTINFO+4(%esp),%esi # Source: bootinfo
|
||||
cmpl $0x0, %esi # If the bootinfo pointer
|
||||
je start_null_bi # is null, don't copy it
|
||||
movl BI_SIZE(%esi),%ecx # Allocate space
|
||||
subl %ecx,%ebp # for bootinfo
|
||||
movl %ebp,%edi # Destination
|
||||
rep # Copy
|
||||
movsb # it
|
||||
movl %ebp,BA_BOOTINFO+4(%esp) # Update pointer
|
||||
movl %edi,%ebp # Restore base pointer
|
||||
#ifdef BTXLDR_VERBOSE
|
||||
movl $m_rel_bi,%esi # Display
|
||||
movl %ebp,%eax # bootinfo
|
||||
call hexout # relocation
|
||||
call putstr # message
|
||||
#endif
|
||||
start_null_bi: movl $BOOTARGS_SIZE,%ecx # Fixed size of arguments
|
||||
testl $KARGS_FLAGS_EXTARG, BA_BOOTFLAGS+4(%esp) # Check for extra data
|
||||
jz start_fixed # Skip if the flag is not set
|
||||
addl BOOTARGS_SIZE+4(%esp),%ecx # Add size of variable args
|
||||
start_fixed: subl $ARGOFF,%ebp # Place args at fixed offset
|
||||
leal 0x4(%esp),%esi # Source
|
||||
movl %ebp,%edi # Destination
|
||||
rep # Copy
|
||||
movsb # them
|
||||
#ifdef BTXLDR_VERBOSE
|
||||
movl $m_rel_args,%esi # Display
|
||||
movl %ebp,%eax # argument
|
||||
call hexout # relocation
|
||||
call putstr # message
|
||||
#endif
|
||||
/*
|
||||
* Set up BTX kernel.
|
||||
*/
|
||||
movl $MEM_ESP,%esp # Set up new stack
|
||||
movl $MEM_DATA,%ebx # Data segment
|
||||
movl $m_vers,%esi # Display BTX
|
||||
call putstr # version message
|
||||
movb 0x5(%ebx),%al # Get major version
|
||||
addb $'0',%al # Display
|
||||
call putchr # it
|
||||
movb $'.',%al # And a
|
||||
call putchr # dot
|
||||
movb 0x6(%ebx),%al # Get minor
|
||||
xorb %ah,%ah # version
|
||||
movb $0xa,%dl # Divide
|
||||
divb %dl,%al # by 10
|
||||
addb $'0',%al # Display
|
||||
call putchr # tens
|
||||
movb %ah,%al # Get units
|
||||
addb $'0',%al # Display
|
||||
call putchr # units
|
||||
call putstr # End message
|
||||
movl %ebx,%esi # BTX image
|
||||
movzwl 0x8(%ebx),%edi # Compute
|
||||
orl $PAG_SIZ/PAG_ENT-1,%edi # the
|
||||
incl %edi # BTX
|
||||
shll $0x2,%edi # load
|
||||
addl $MEM_TBL,%edi # address
|
||||
pushl %edi # Save load address
|
||||
movzwl 0xa(%ebx),%ecx # Image size
|
||||
#ifdef BTXLDR_VERBOSE
|
||||
pushl %ecx # Save image size
|
||||
#endif
|
||||
rep # Relocate
|
||||
movsb # BTX
|
||||
movl %esi,%ebx # Keep place
|
||||
#ifdef BTXLDR_VERBOSE
|
||||
movl $m_rel_btx,%esi # Restore
|
||||
popl %eax # parameters
|
||||
call hexout # and
|
||||
#endif
|
||||
popl %ebp # display
|
||||
#ifdef BTXLDR_VERBOSE
|
||||
movl %ebp,%eax # the
|
||||
call hexout # relocation
|
||||
call putstr # message
|
||||
#endif
|
||||
addl $PAG_SIZ,%ebp # Display
|
||||
#ifdef BTXLDR_VERBOSE
|
||||
movl $m_base,%esi # the
|
||||
movl %ebp,%eax # user
|
||||
call hexout # base
|
||||
call putstr # address
|
||||
#endif
|
||||
/*
|
||||
* Set up ELF-format client program.
|
||||
*/
|
||||
cmpl $0x464c457f,(%ebx) # ELF magic number?
|
||||
je start.3 # Yes
|
||||
movl $e_fmt,%esi # Display error
|
||||
call putstr # message
|
||||
start.2: jmp start.2 # Hang
|
||||
start.3:
|
||||
#ifdef BTXLDR_VERBOSE
|
||||
movl $m_elf,%esi # Display ELF
|
||||
call putstr # message
|
||||
movl $m_segs,%esi # Format string
|
||||
#endif
|
||||
movl $0x2,%edi # Segment count
|
||||
movl 0x1c(%ebx),%edx # Get e_phoff
|
||||
addl %ebx,%edx # To pointer
|
||||
movzwl 0x2c(%ebx),%ecx # Get e_phnum
|
||||
start.4: cmpl $0x1,(%edx) # Is p_type PT_LOAD?
|
||||
jne start.6 # No
|
||||
#ifdef BTXLDR_VERBOSE
|
||||
movl 0x4(%edx),%eax # Display
|
||||
call hexout # p_offset
|
||||
movl 0x8(%edx),%eax # Display
|
||||
call hexout # p_vaddr
|
||||
movl 0x10(%edx),%eax # Display
|
||||
call hexout # p_filesz
|
||||
movl 0x14(%edx),%eax # Display
|
||||
call hexout # p_memsz
|
||||
call putstr # End message
|
||||
#endif
|
||||
pushl %esi # Save
|
||||
pushl %edi # working
|
||||
pushl %ecx # registers
|
||||
movl 0x4(%edx),%esi # Get p_offset
|
||||
addl %ebx,%esi # as pointer
|
||||
movl 0x8(%edx),%edi # Get p_vaddr
|
||||
addl %ebp,%edi # as pointer
|
||||
movl 0x10(%edx),%ecx # Get p_filesz
|
||||
rep # Set up
|
||||
movsb # segment
|
||||
movl 0x14(%edx),%ecx # Any bytes
|
||||
subl 0x10(%edx),%ecx # to zero?
|
||||
jz start.5 # No
|
||||
xorb %al,%al # Then
|
||||
rep # zero
|
||||
stosb # them
|
||||
start.5: popl %ecx # Restore
|
||||
popl %edi # working
|
||||
popl %esi # registers
|
||||
decl %edi # Segments to do
|
||||
je start.7 # If none
|
||||
start.6: addl $0x20,%edx # To next entry
|
||||
loop start.4 # Till done
|
||||
start.7:
|
||||
#ifdef BTXLDR_VERBOSE
|
||||
movl $m_done,%esi # Display done
|
||||
call putstr # message
|
||||
#endif
|
||||
movl $start.8,%esi # Real mode stub
|
||||
movl $MEM_STUB,%edi # Destination
|
||||
movl $start.9-start.8,%ecx # Size
|
||||
rep # Relocate
|
||||
movsb # it
|
||||
ljmp $SEL_RCODE,$MEM_STUB # To 16-bit code
|
||||
.code16
|
||||
start.8: xorw %ax,%ax # Data
|
||||
movb $SEL_RDATA,%al # selector
|
||||
movw %ax,%ss # Reload SS
|
||||
movw %ax,%ds # Reset
|
||||
movw %ax,%es # other
|
||||
movw %ax,%fs # segment
|
||||
movw %ax,%gs # limits
|
||||
movl %cr0,%eax # Switch to
|
||||
decw %ax # real
|
||||
movl %eax,%cr0 # mode
|
||||
ljmp $0,$MEM_ENTRY # Jump to BTX entry point
|
||||
start.9:
|
||||
.code32
|
||||
/*
|
||||
* Output message [ESI] followed by EAX in hex.
|
||||
*/
|
||||
hexout: pushl %eax # Save
|
||||
call putstr # Display message
|
||||
popl %eax # Restore
|
||||
pushl %esi # Save
|
||||
pushl %edi # caller's
|
||||
movl $buf,%edi # Buffer
|
||||
pushl %edi # Save
|
||||
call hex32 # To hex
|
||||
xorb %al,%al # Terminate
|
||||
stosb # string
|
||||
popl %esi # Restore
|
||||
hexout.1: lodsb # Get a char
|
||||
cmpb $'0',%al # Leading zero?
|
||||
je hexout.1 # Yes
|
||||
testb %al,%al # End of string?
|
||||
jne hexout.2 # No
|
||||
decl %esi # Undo
|
||||
hexout.2: decl %esi # Adjust for inc
|
||||
call putstr # Display hex
|
||||
popl %edi # Restore
|
||||
popl %esi # caller's
|
||||
ret # To caller
|
||||
/*
|
||||
* Output zero-terminated string [ESI] to the console.
|
||||
*/
|
||||
putstr.0: call putchr # Output char
|
||||
putstr: lodsb # Load char
|
||||
testb %al,%al # End of string?
|
||||
jne putstr.0 # No
|
||||
ret # To caller
|
||||
/*
|
||||
* Output character AL to the console.
|
||||
*/
|
||||
putchr: pusha # Save
|
||||
xorl %ecx,%ecx # Zero for loops
|
||||
movb $SCR_MAT,%ah # Mode/attribute
|
||||
movl $BDA_POS,%ebx # BDA pointer
|
||||
movw (%ebx),%dx # Cursor position
|
||||
movl $0xa0000,%edi # Regen buffer (color)
|
||||
putchr.1: cmpb $0xa,%al # New line?
|
||||
je putchr.2 # Yes
|
||||
movw %dx,%cx
|
||||
movb %al,(%edi,%ecx,1) # Write char
|
||||
addl $0x2000,%ecx
|
||||
movb %ah,(%edi,%ecx,1) # Write attr
|
||||
addw $0x2,%dx
|
||||
jmp putchr.3
|
||||
putchr.2: movw %dx,%ax
|
||||
movb $SCR_COL*2,%dl
|
||||
div %dl
|
||||
incb %al
|
||||
mul %dl
|
||||
movw %ax,%dx
|
||||
putchr.3: cmpw $SCR_COL*SCR_ROW*2,%dx
|
||||
jb putchr.4 # No
|
||||
leal 2*SCR_COL(%edi),%esi # New top line
|
||||
movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move
|
||||
rep # Scroll
|
||||
movsl # screen
|
||||
movb $' ',%al # Space
|
||||
xorb %ah,%ah
|
||||
movb $SCR_COL,%cl # Columns to clear
|
||||
rep # Clear
|
||||
stosw # line
|
||||
movw $(SCR_ROW-1)*SCR_COL*2,%dx
|
||||
putchr.4: movw %dx,(%ebx) # Update position
|
||||
shrw $1,%dx
|
||||
gdcwait.3: inb $0x60,%al
|
||||
testb $0x04,%al
|
||||
jz gdcwait.3
|
||||
movb $0x49,%al
|
||||
outb %al,$0x62
|
||||
movb %dl,%al
|
||||
outb %al,$0x60
|
||||
movb %dh,%al
|
||||
outb %al,$0x60
|
||||
popa # Restore
|
||||
ret # To caller
|
||||
/*
|
||||
* Convert EAX, AX, or AL to hex, saving the result to [EDI].
|
||||
*/
|
||||
hex32: pushl %eax # Save
|
||||
shrl $0x10,%eax # Do upper
|
||||
call hex16 # 16
|
||||
popl %eax # Restore
|
||||
hex16: call hex16.1 # Do upper 8
|
||||
hex16.1: xchgb %ah,%al # Save/restore
|
||||
hex8: pushl %eax # Save
|
||||
shrb $0x4,%al # Do upper
|
||||
call hex8.1 # 4
|
||||
popl %eax # Restore
|
||||
hex8.1: andb $0xf,%al # Get lower 4
|
||||
cmpb $0xa,%al # Convert
|
||||
sbbb $0x69,%al # to hex
|
||||
das # digit
|
||||
orb $0x20,%al # To lower case
|
||||
stosb # Save char
|
||||
ret # (Recursive)
|
||||
|
||||
.data
|
||||
.p2align 4
|
||||
/*
|
||||
* Global descriptor table.
|
||||
*/
|
||||
gdt: .word 0x0,0x0,0x0,0x0 # Null entry
|
||||
.word 0xffff,0x0,0x9a00,0xcf # SEL_SCODE
|
||||
.word 0xffff,0x0,0x9200,0xcf # SEL_SDATA
|
||||
.word 0xffff,0x0,0x9a00,0x0 # SEL_RCODE
|
||||
.word 0xffff,0x0,0x9200,0x0 # SEL_RDATA
|
||||
gdt.1:
|
||||
gdtdesc: .word gdt.1-gdt-1 # Limit
|
||||
.long gdt # Base
|
||||
/*
|
||||
* Messages.
|
||||
*/
|
||||
m_logo: .asciz " \nBTX loader 1.00 "
|
||||
m_vers: .asciz "BTX version is \0\n"
|
||||
e_fmt: .asciz "Error: Client format not supported\n"
|
||||
#ifdef BTXLDR_VERBOSE
|
||||
m_mem: .asciz "Starting in protected mode (base mem=\0)\n"
|
||||
m_esp: .asciz "Arguments passed (esp=\0):\n"
|
||||
m_args: .asciz"<howto="
|
||||
.asciz" bootdev="
|
||||
.asciz" junk="
|
||||
.asciz" "
|
||||
.asciz" "
|
||||
.asciz" bootinfo=\0>\n"
|
||||
m_rel_bi: .asciz "Relocated bootinfo (size=48) to \0\n"
|
||||
m_rel_args: .asciz "Relocated arguments (size=18) to \0\n"
|
||||
m_rel_btx: .asciz "Relocated kernel (size=\0) to \0\n"
|
||||
m_base: .asciz "Client base address is \0\n"
|
||||
m_elf: .asciz "Client format is ELF\n"
|
||||
m_segs: .asciz "text segment: offset="
|
||||
.asciz " vaddr="
|
||||
.asciz " filesz="
|
||||
.asciz " memsz=\0\n"
|
||||
.asciz "data segment: offset="
|
||||
.asciz " vaddr="
|
||||
.asciz " filesz="
|
||||
.asciz " memsz=\0\n"
|
||||
m_done: .asciz "Loading complete\n"
|
||||
#endif
|
||||
/*
|
||||
* Uninitialized data area.
|
||||
*/
|
||||
buf: # Scratch buffer
|
@ -1,10 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= crt0.o
|
||||
INTERNALPROG=
|
||||
MAN=
|
||||
SRCS= btxcsu.S btxsys.s btxv86.s
|
||||
CFLAGS+=-I${.CURDIR}/../../../i386/common
|
||||
LDFLAGS=-Wl,-r
|
||||
|
||||
.include <bsd.prog.mk>
|
@ -1,49 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 1998 Robert Nordier
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms are freely
|
||||
# permitted provided that the above copyright notice and this
|
||||
# paragraph and the following disclaimer are duplicated in all
|
||||
# such forms.
|
||||
#
|
||||
# This software is provided "AS IS" and without any express or
|
||||
# implied warranties, including, without limitation, the implied
|
||||
# warranties of merchantability and fitness for a particular
|
||||
# purpose.
|
||||
#
|
||||
|
||||
# $FreeBSD$
|
||||
|
||||
#include <bootargs.h>
|
||||
|
||||
#
|
||||
# BTX C startup code (ELF).
|
||||
#
|
||||
|
||||
#
|
||||
# Globals.
|
||||
#
|
||||
.global _start
|
||||
#
|
||||
# Client entry point.
|
||||
#
|
||||
_start: cld
|
||||
pushl %eax
|
||||
movl $_edata,%edi
|
||||
movl $_end,%ecx
|
||||
subl %edi, %ecx
|
||||
xorb %al, %al
|
||||
rep
|
||||
stosb
|
||||
popl __base
|
||||
movl %esp,%eax # Set
|
||||
addl $ARGADJ,%eax # argument
|
||||
movl %eax,__args # pointer
|
||||
call main # Invoke client main()
|
||||
call exit # Invoke client exit()
|
||||
#
|
||||
# Data.
|
||||
#
|
||||
.comm __base,4 # Client base address
|
||||
.comm __args,4 # Client arguments
|
@ -1,40 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 1998 Robert Nordier
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms are freely
|
||||
# permitted provided that the above copyright notice and this
|
||||
# paragraph and the following disclaimer are duplicated in all
|
||||
# such forms.
|
||||
#
|
||||
# This software is provided "AS IS" and without any express or
|
||||
# implied warranties, including, without limitation, the implied
|
||||
# warranties of merchantability and fitness for a particular
|
||||
# purpose.
|
||||
#
|
||||
|
||||
# $FreeBSD$
|
||||
|
||||
#
|
||||
# BTX system calls.
|
||||
#
|
||||
|
||||
#
|
||||
# Globals.
|
||||
#
|
||||
.global __exit
|
||||
.global __exec
|
||||
#
|
||||
# Constants.
|
||||
#
|
||||
.set INT_SYS,0x30 # Interrupt number
|
||||
#
|
||||
# System call: exit
|
||||
#
|
||||
__exit: xorl %eax,%eax # BTX system
|
||||
int $INT_SYS # call 0x0
|
||||
#
|
||||
# System call: exec
|
||||
#
|
||||
__exec: movl $0x1,%eax # BTX system
|
||||
int $INT_SYS # call 0x1
|
@ -1,67 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1998 Robert Nordier
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are freely
|
||||
* permitted provided that the above copyright notice and this
|
||||
* paragraph and the following disclaimer are duplicated in all
|
||||
* such forms.
|
||||
*
|
||||
* This software is provided "AS IS" and without any express or
|
||||
* implied warranties, including, without limitation, the implied
|
||||
* warranties of merchantability and fitness for a particular
|
||||
* purpose.
|
||||
*/
|
||||
|
||||
/*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _BTXV86_H_
|
||||
#define _BTXV86_H_
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <machine/psl.h>
|
||||
|
||||
#define V86_ADDR 0x10000 /* Segment:offset address */
|
||||
#define V86_CALLF 0x20000 /* Emulate far call */
|
||||
#define V86_FLAGS 0x40000 /* Return flags */
|
||||
|
||||
struct __v86 {
|
||||
uint32_t ctl; /* Control flags */
|
||||
uint32_t addr; /* Interrupt number or address */
|
||||
uint32_t es; /* V86 ES register */
|
||||
uint32_t ds; /* V86 DS register */
|
||||
uint32_t fs; /* V86 FS register */
|
||||
uint32_t gs; /* V86 GS register */
|
||||
uint32_t eax; /* V86 EAX register */
|
||||
uint32_t ecx; /* V86 ECX register */
|
||||
uint32_t edx; /* V86 EDX register */
|
||||
uint32_t ebx; /* V86 EBX register */
|
||||
uint32_t efl; /* V86 eflags register */
|
||||
uint32_t ebp; /* V86 EBP register */
|
||||
uint32_t esi; /* V86 ESI register */
|
||||
uint32_t edi; /* V86 EDI register */
|
||||
};
|
||||
|
||||
extern struct __v86 __v86; /* V86 interface structure */
|
||||
void __v86int(void);
|
||||
|
||||
#define v86 __v86
|
||||
#define v86int __v86int
|
||||
|
||||
extern u_int32_t __base;
|
||||
extern u_int32_t __args;
|
||||
|
||||
#define PTOV(pa) ((caddr_t)(pa) - __base)
|
||||
#define VTOP(va) ((vm_offset_t)(va) + __base)
|
||||
#define VTOPSEG(va) (u_int16_t)(VTOP((caddr_t)va) >> 4)
|
||||
#define VTOPOFF(va) (u_int16_t)(VTOP((caddr_t)va) & 0xf)
|
||||
|
||||
#define V86_CY(x) ((x) & PSL_C)
|
||||
#define V86_ZR(x) ((x) & PSL_Z)
|
||||
|
||||
void __exit(int) __attribute__((__noreturn__));
|
||||
void __exec(caddr_t, ...);
|
||||
|
||||
#endif /* !_BTXV86_H_ */
|
@ -1,85 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 1998 Robert Nordier
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms are freely
|
||||
# permitted provided that the above copyright notice and this
|
||||
# paragraph and the following disclaimer are duplicated in all
|
||||
# such forms.
|
||||
#
|
||||
# This software is provided "AS IS" and without any express or
|
||||
# implied warranties, including, without limitation, the implied
|
||||
# warranties of merchantability and fitness for a particular
|
||||
# purpose.
|
||||
#
|
||||
|
||||
# $FreeBSD$
|
||||
|
||||
#
|
||||
# BTX V86 interface.
|
||||
#
|
||||
|
||||
#
|
||||
# Globals.
|
||||
#
|
||||
.global __v86int
|
||||
#
|
||||
# Fields in V86 interface structure.
|
||||
#
|
||||
.set V86_CTL,0x0 # Control flags
|
||||
.set V86_ADDR,0x4 # Int number/address
|
||||
.set V86_ES,0x8 # V86 ES
|
||||
.set V86_DS,0xc # V86 DS
|
||||
.set V86_FS,0x10 # V86 FS
|
||||
.set V86_GS,0x14 # V86 GS
|
||||
.set V86_EAX,0x18 # V86 EAX
|
||||
.set V86_ECX,0x1c # V86 ECX
|
||||
.set V86_EDX,0x20 # V86 EDX
|
||||
.set V86_EBX,0x24 # V86 EBX
|
||||
.set V86_EFL,0x28 # V86 eflags
|
||||
.set V86_EBP,0x2c # V86 EBP
|
||||
.set V86_ESI,0x30 # V86 ESI
|
||||
.set V86_EDI,0x34 # V86 EDI
|
||||
#
|
||||
# Other constants.
|
||||
#
|
||||
.set INT_V86,0x31 # Interrupt number
|
||||
.set SIZ_V86,0x38 # Size of V86 structure
|
||||
#
|
||||
# V86 interface function.
|
||||
#
|
||||
__v86int: popl __v86ret # Save return address
|
||||
pushl $__v86 # Push pointer
|
||||
call __v86_swap # Load V86 registers
|
||||
int $INT_V86 # To BTX
|
||||
call __v86_swap # Load user registers
|
||||
addl $0x4,%esp # Discard pointer
|
||||
pushl __v86ret # Restore return address
|
||||
ret # To user
|
||||
#
|
||||
# Swap V86 and user registers.
|
||||
#
|
||||
__v86_swap: xchgl %ebp,0x4(%esp,1) # Swap pointer, EBP
|
||||
xchgl %eax,V86_EAX(%ebp) # Swap EAX
|
||||
xchgl %ecx,V86_ECX(%ebp) # Swap ECX
|
||||
xchgl %edx,V86_EDX(%ebp) # Swap EDX
|
||||
xchgl %ebx,V86_EBX(%ebp) # Swap EBX
|
||||
pushl %eax # Save
|
||||
pushf # Put eflags
|
||||
popl %eax # in EAX
|
||||
xchgl %eax,V86_EFL(%ebp) # Swap
|
||||
pushl %eax # Put EAX
|
||||
popf # in eflags
|
||||
movl 0x8(%esp,1),%eax # Load EBP
|
||||
xchgl %eax,V86_EBP(%ebp) # Swap
|
||||
movl %eax,0x8(%esp,1) # Save EBP
|
||||
popl %eax # Restore
|
||||
xchgl %esi,V86_ESI(%ebp) # Swap ESI
|
||||
xchgl %edi,V86_EDI(%ebp) # Swap EDI
|
||||
xchgl %ebp,0x4(%esp,1) # Swap pointer, EBP
|
||||
ret # To caller
|
||||
#
|
||||
# V86 interface structure.
|
||||
#
|
||||
.comm __v86,SIZ_V86
|
||||
.comm __v86ret,4
|
@ -1,18 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= cdboot
|
||||
STRIP=
|
||||
BINMODE=${NOBINMODE}
|
||||
MAN=
|
||||
SRCS= ${PROG}.S
|
||||
|
||||
CFLAGS+=-I${.CURDIR}/../../i386/common
|
||||
|
||||
ORG= 0x0000
|
||||
|
||||
LDFLAGS=${LDFLAGS_BIN}
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
||||
# XXX: clang integrated-as doesn't grok .codeNN directives yet
|
||||
CFLAGS.cdboot.S= ${CLANG_NO_IAS}
|
@ -1,805 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 2006 TAKAHASHI Yoshihiro <nyan@FreeBSD.org>
|
||||
# Copyright (c) 2001 John Baldwin <jhb@FreeBSD.org>
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
# SUCH DAMAGE.
|
||||
#
|
||||
|
||||
# $FreeBSD$
|
||||
|
||||
#
|
||||
# Basically, we first create a set of boot arguments to pass to the loaded
|
||||
# binary. Then we attempt to load /boot/loader from the CD we were booted
|
||||
# off of.
|
||||
#
|
||||
|
||||
#include <bootargs.h>
|
||||
|
||||
#
|
||||
# Memory locations.
|
||||
#
|
||||
.set STACK_OFF,0x6000 # Stack offset
|
||||
.set LOAD_SEG,0x0700 # Load segment
|
||||
.set LOAD_SIZE,2048 # Load size
|
||||
.set DAUA,0x0584 # DA/UA
|
||||
|
||||
.set MEM_PAGE_SIZE,0x1000 # memory page size, 4k
|
||||
.set MEM_ARG,0x900 # Arguments at start
|
||||
.set MEM_ARG_BTX,0xa100 # Where we move them to so the
|
||||
# BTX client can see them
|
||||
.set MEM_ARG_SIZE,0x18 # Size of the arguments
|
||||
.set MEM_BTX_ADDRESS,0x9000 # where BTX lives
|
||||
.set MEM_BTX_ENTRY,0x9010 # where BTX starts to execute
|
||||
.set MEM_BTX_OFFSET,MEM_PAGE_SIZE # offset of BTX in the loader
|
||||
.set MEM_BTX_CLIENT,0xa000 # where BTX clients live
|
||||
#
|
||||
# PC98 machine type from sys/pc98/pc98/pc98_machdep.h
|
||||
#
|
||||
.set MEM_SYS, 0xa100 # System common area segment
|
||||
.set PC98_MACHINE_TYPE, 0x0620 # PC98 machine type
|
||||
.set EPSON_ID, 0x0624 # EPSON machine id
|
||||
|
||||
.set M_NEC_PC98, 0x0001
|
||||
.set M_EPSON_PC98, 0x0002
|
||||
.set M_NOT_H98, 0x0010
|
||||
.set M_H98, 0x0020
|
||||
.set M_NOTE, 0x0040
|
||||
.set M_NORMAL, 0x1000
|
||||
.set M_8M, 0x8000
|
||||
#
|
||||
# Signature Constants
|
||||
#
|
||||
.set SIG1_OFF,0x1fe # Signature offset
|
||||
.set SIG2_OFF,0x7fe # Signature offset
|
||||
#
|
||||
# a.out header fields
|
||||
#
|
||||
.set AOUT_TEXT,0x04 # text segment size
|
||||
.set AOUT_DATA,0x08 # data segment size
|
||||
.set AOUT_BSS,0x0c # zero'd BSS size
|
||||
.set AOUT_SYMBOLS,0x10 # symbol table
|
||||
.set AOUT_ENTRY,0x14 # entry point
|
||||
.set AOUT_HEADER,MEM_PAGE_SIZE # size of the a.out header
|
||||
#
|
||||
# Segment selectors.
|
||||
#
|
||||
.set SEL_SDATA,0x8 # Supervisor data
|
||||
.set SEL_RDATA,0x10 # Real mode data
|
||||
.set SEL_SCODE,0x18 # PM-32 code
|
||||
.set SEL_SCODE16,0x20 # PM-16 code
|
||||
#
|
||||
# BTX constants
|
||||
#
|
||||
.set INT_SYS,0x30 # BTX syscall interrupt
|
||||
#
|
||||
# Constants for reading from the CD.
|
||||
#
|
||||
.set ERROR_TIMEOUT,0x90 # BIOS timeout on read
|
||||
.set NUM_RETRIES,3 # Num times to retry
|
||||
.set SECTOR_SIZE,0x800 # size of a sector
|
||||
.set SECTOR_SHIFT,11 # number of place to shift
|
||||
.set BUFFER_LEN,0x100 # number of sectors in buffer
|
||||
.set MAX_READ,0xf800 # max we can read at a time
|
||||
.set MAX_READ_SEC,MAX_READ >> SECTOR_SHIFT
|
||||
.set MEM_READ_BUFFER,0x9000 # buffer to read from CD
|
||||
.set MEM_VOLDESC,MEM_READ_BUFFER # volume descriptor
|
||||
.set MEM_DIR,MEM_VOLDESC+SECTOR_SIZE # Lookup buffer
|
||||
.set VOLDESC_LBA,0x10 # LBA of vol descriptor
|
||||
.set VD_PRIMARY,1 # Primary VD
|
||||
.set VD_END,255 # VD Terminator
|
||||
.set VD_ROOTDIR,156 # Offset of Root Dir Record
|
||||
.set DIR_LEN,0 # Offset of Dir Record length
|
||||
.set DIR_EA_LEN,1 # Offset of EA length
|
||||
.set DIR_EXTENT,2 # Offset of 64-bit LBA
|
||||
.set DIR_SIZE,10 # Offset of 64-bit length
|
||||
.set DIR_NAMELEN,32 # Offset of 8-bit name len
|
||||
.set DIR_NAME,33 # Offset of dir name
|
||||
|
||||
#
|
||||
# Program start.
|
||||
#
|
||||
.code16
|
||||
.globl start
|
||||
|
||||
start: jmp main
|
||||
|
||||
.org 4
|
||||
.ascii "IPL1 "
|
||||
|
||||
main: cld
|
||||
|
||||
/* Setup the stack */
|
||||
xor %ax,%ax
|
||||
mov %ax,%ss
|
||||
mov $STACK_OFF,%sp
|
||||
|
||||
push %ecx
|
||||
|
||||
/* Setup graphic screen */
|
||||
mov $0x42,%ah # 640x400
|
||||
mov $0xc0,%ch
|
||||
int $0x18
|
||||
mov $0x40,%ah # graph on
|
||||
int $0x18
|
||||
|
||||
/* Setup text screen */
|
||||
mov $0x0a00,%ax # 80x25
|
||||
int $0x18
|
||||
mov $0x0c,%ah # text on
|
||||
int $0x18
|
||||
mov $0x13,%ah # cursor home
|
||||
xor %dx,%dx
|
||||
int $0x18
|
||||
mov $0x11,%ah # cursor on
|
||||
int $0x18
|
||||
|
||||
/* Setup keyboard */
|
||||
mov $0x03,%ah
|
||||
int $0x18
|
||||
|
||||
/* Transfer PC-9801 system common area */
|
||||
xor %ax,%ax
|
||||
mov %ax,%si
|
||||
mov %ax,%ds
|
||||
mov %ax,%di
|
||||
mov $MEM_SYS,%ax
|
||||
mov %ax,%es
|
||||
mov $0x0600,%cx
|
||||
rep
|
||||
movsb
|
||||
|
||||
/* Transfer EPSON machine type */
|
||||
mov $0xfd00,%ax
|
||||
mov %ax,%ds
|
||||
mov (0x804),%eax
|
||||
and $0x00ffffff,%eax
|
||||
mov %eax,%es:(EPSON_ID)
|
||||
|
||||
/* Set machine type to PC98_SYSTEM_PARAMETER */
|
||||
call machine_check
|
||||
|
||||
/* Load cdboot */
|
||||
xor %ax,%ax
|
||||
mov %ax,%ds
|
||||
mov $0x06,%ah /* Read data */
|
||||
mov (DAUA),%al /* Read drive */
|
||||
pop %ecx /* cylinder */
|
||||
xor %dx,%dx /* head / sector */
|
||||
mov $LOAD_SEG,%bx /* Load address */
|
||||
mov %bx,%es
|
||||
xor %bp,%bp
|
||||
mov $LOAD_SIZE,%bx /* Load size */
|
||||
int $0x1b
|
||||
mov $msg_readerr,%si
|
||||
jc error
|
||||
|
||||
/* Jump to cdboot */
|
||||
ljmp $LOAD_SEG,$cdboot
|
||||
|
||||
#
|
||||
# Set machine type to PC98_SYSTEM_PARAMETER.
|
||||
#
|
||||
machine_check: xor %edx,%edx
|
||||
mov %dx,%ds
|
||||
mov $MEM_SYS,%ax
|
||||
mov %ax,%es
|
||||
|
||||
/* Wait V-SYNC */
|
||||
vsync.1: inb $0x60,%al
|
||||
test $0x20,%al
|
||||
jnz vsync.1
|
||||
vsync.2: inb $0x60,%al
|
||||
test $0x20,%al
|
||||
jz vsync.2
|
||||
|
||||
/* ANK 'A' font */
|
||||
xor %al,%al
|
||||
outb %al,$0xa1
|
||||
mov $0x41,%al
|
||||
outb %al,$0xa3
|
||||
|
||||
/* Get 'A' font from CG window */
|
||||
push %ds
|
||||
mov $0xa400,%ax
|
||||
mov %ax,%ds
|
||||
xor %eax,%eax
|
||||
xor %bx,%bx
|
||||
mov $4,%cx
|
||||
font.1: add (%bx),%eax
|
||||
add $4,%bx
|
||||
loop font.1
|
||||
pop %ds
|
||||
cmp $0x6efc58fc,%eax
|
||||
jnz m_epson
|
||||
|
||||
m_pc98: or $M_NEC_PC98,%edx
|
||||
mov $0x0458,%bx
|
||||
mov (%bx),%al
|
||||
test $0x80,%al
|
||||
jz m_not_h98
|
||||
or $M_H98,%edx
|
||||
jmp 1f
|
||||
m_epson: or $M_EPSON_PC98,%edx
|
||||
m_not_h98: or $M_NOT_H98,%edx
|
||||
|
||||
1: inb $0x42,%al
|
||||
test $0x20,%al
|
||||
jz 1f
|
||||
or $M_8M,%edx
|
||||
|
||||
1: mov $0x0400,%bx
|
||||
mov (%bx),%al
|
||||
test $0x80,%al
|
||||
jz 1f
|
||||
or $M_NOTE,%edx
|
||||
|
||||
1: mov $PC98_MACHINE_TYPE,%bx
|
||||
mov %edx,%es:(%bx)
|
||||
ret
|
||||
|
||||
#
|
||||
# Print out the error message at [SI], wait for a keypress, and then
|
||||
# reboot the machine.
|
||||
#
|
||||
error: call putstr
|
||||
mov $msg_keypress,%si
|
||||
call putstr
|
||||
xor %ax,%ax # Get keypress
|
||||
int $0x18
|
||||
xor %ax,%ax # CPU reset
|
||||
outb %al,$0xf0
|
||||
halt: hlt
|
||||
jmp halt # Spin
|
||||
|
||||
#
|
||||
# Display a null-terminated string at [SI].
|
||||
#
|
||||
# Trashes: AX, BX, CX, DX, SI, DI
|
||||
#
|
||||
putstr: push %ds
|
||||
push %es
|
||||
mov %cs,%ax
|
||||
mov %ax,%ds
|
||||
mov $0xa000,%ax
|
||||
mov %ax,%es
|
||||
mov cursor,%di
|
||||
mov $0x00e1,%bx # Attribute
|
||||
mov $160,%cx
|
||||
putstr.0: lodsb
|
||||
testb %al,%al
|
||||
jz putstr.done
|
||||
cmp $0x0d,%al
|
||||
jz putstr.cr
|
||||
cmp $0x0a,%al
|
||||
jz putstr.lf
|
||||
mov %bl,%es:0x2000(%di)
|
||||
stosb
|
||||
inc %di
|
||||
jmp putstr.move
|
||||
putstr.cr: xor %dx,%dx
|
||||
mov %di,%ax
|
||||
div %cx
|
||||
sub %dx,%di
|
||||
jmp putstr.move
|
||||
putstr.lf: add %cx,%di
|
||||
putstr.move: mov %di,%dx
|
||||
mov $0x13,%ah # Move cursor
|
||||
int $0x18
|
||||
jmp putstr.0
|
||||
putstr.done: mov %di,cursor
|
||||
pop %es
|
||||
pop %ds
|
||||
ret
|
||||
|
||||
#
|
||||
# Display a single char at [AL], but don't move a cursor.
|
||||
#
|
||||
putc: push %es
|
||||
push %di
|
||||
push %bx
|
||||
mov $0xa000,%bx
|
||||
mov %bx,%es
|
||||
mov cursor,%di
|
||||
mov $0xe1,%bl # Attribute
|
||||
mov %bl,%es:0x2000(%di)
|
||||
stosb
|
||||
pop %bx
|
||||
pop %di
|
||||
pop %es
|
||||
ret
|
||||
|
||||
msg_readerr: .asciz "Read Error\r\n"
|
||||
msg_keypress: .asciz "\r\nPress any key to reboot\r\n"
|
||||
|
||||
/* Boot signature */
|
||||
|
||||
.org SIG1_OFF,0x90
|
||||
|
||||
.word 0xaa55 # Magic number
|
||||
|
||||
#
|
||||
# cdboot
|
||||
#
|
||||
cdboot: mov %cs,%ax
|
||||
mov %ax,%ds
|
||||
xor %ax,%ax
|
||||
mov %ax,%es
|
||||
mov %es:(DAUA),%al # Save BIOS boot device
|
||||
mov %al,drive
|
||||
mov %cx,cylinder # Save BIOS boot cylinder
|
||||
|
||||
mov $msg_welcome,%si # %ds:(%si) -> welcome message
|
||||
call putstr # display the welcome message
|
||||
#
|
||||
# Setup the arguments that the loader is expecting from boot[12]
|
||||
#
|
||||
mov $msg_bootinfo,%si # %ds:(%si) -> boot args message
|
||||
call putstr # display the message
|
||||
mov $MEM_ARG,%bx # %ds:(%bx) -> boot args
|
||||
mov %bx,%di # %es:(%di) -> boot args
|
||||
xor %eax,%eax # zero %eax
|
||||
mov $(MEM_ARG_SIZE/4),%cx # Size of arguments in 32-bit
|
||||
# dwords
|
||||
rep # Clear the arguments
|
||||
stosl # to zero
|
||||
mov drive,%dl # Store BIOS boot device
|
||||
mov %dl,%es:0x4(%bx) # in kargs->bootdev
|
||||
or $KARGS_FLAGS_CD,%es:0x8(%bx) # kargs->bootflags |=
|
||||
# KARGS_FLAGS_CD
|
||||
#
|
||||
# Load Volume Descriptor
|
||||
#
|
||||
mov $VOLDESC_LBA,%eax # Set LBA of first VD
|
||||
load_vd: push %eax # Save %eax
|
||||
mov $1,%dh # One sector
|
||||
mov $MEM_VOLDESC,%ebx # Destination
|
||||
call read # Read it in
|
||||
cmpb $VD_PRIMARY,%es:(%bx) # Primary VD?
|
||||
je have_vd # Yes
|
||||
pop %eax # Prepare to
|
||||
inc %eax # try next
|
||||
cmpb $VD_END,%es:(%bx) # Last VD?
|
||||
jne load_vd # No, read next
|
||||
mov $msg_novd,%si # No VD
|
||||
jmp error # Halt
|
||||
have_vd: # Have Primary VD
|
||||
#
|
||||
# Try to look up the loader binary using the paths in the loader_paths
|
||||
# array.
|
||||
#
|
||||
mov $loader_paths,%si # Point to start of array
|
||||
lookup_path: push %si # Save file name pointer
|
||||
call lookup # Try to find file
|
||||
pop %di # Restore file name pointer
|
||||
jnc lookup_found # Found this file
|
||||
push %es
|
||||
mov %cs,%ax
|
||||
mov %ax,%es
|
||||
xor %al,%al # Look for next
|
||||
mov $0xffff,%cx # path name by
|
||||
repnz # scanning for
|
||||
scasb # nul char
|
||||
pop %es
|
||||
mov %di,%si # Point %si at next path
|
||||
mov (%si),%al # Get first char of next path
|
||||
or %al,%al # Is it double nul?
|
||||
jnz lookup_path # No, try it.
|
||||
mov $msg_failed,%si # Failed message
|
||||
jmp error # Halt
|
||||
lookup_found: # Found a loader file
|
||||
#
|
||||
# Load the binary into the buffer. Due to real mode addressing limitations
|
||||
# we have to read it in 64k chunks.
|
||||
#
|
||||
mov %es:DIR_SIZE(%bx),%eax # Read file length
|
||||
add $SECTOR_SIZE-1,%eax # Convert length to sectors
|
||||
shr $SECTOR_SHIFT,%eax
|
||||
cmp $BUFFER_LEN,%eax
|
||||
jbe load_sizeok
|
||||
mov $msg_load2big,%si # Error message
|
||||
jmp error
|
||||
load_sizeok: movzbw %al,%cx # Num sectors to read
|
||||
mov %es:DIR_EXTENT(%bx),%eax # Load extent
|
||||
xor %edx,%edx
|
||||
mov %es:DIR_EA_LEN(%bx),%dl
|
||||
add %edx,%eax # Skip extended
|
||||
mov $MEM_READ_BUFFER,%ebx # Read into the buffer
|
||||
load_loop: mov %cl,%dh
|
||||
cmp $MAX_READ_SEC,%cl # Truncate to max read size
|
||||
jbe load_notrunc
|
||||
mov $MAX_READ_SEC,%dh
|
||||
load_notrunc: sub %dh,%cl # Update count
|
||||
push %eax # Save
|
||||
call read # Read it in
|
||||
pop %eax # Restore
|
||||
add $MAX_READ_SEC,%eax # Update LBA
|
||||
add $MAX_READ,%ebx # Update dest addr
|
||||
jcxz load_done # Done?
|
||||
jmp load_loop # Keep going
|
||||
load_done:
|
||||
#
|
||||
# Turn on the A20 address line
|
||||
#
|
||||
xor %ax,%ax # Turn A20 on
|
||||
outb %al,$0xf2
|
||||
mov $0x02,%al
|
||||
outb %al,$0xf6
|
||||
#
|
||||
# Relocate the loader and BTX using a very lazy protected mode
|
||||
#
|
||||
mov $msg_relocate,%si # Display the
|
||||
call putstr # relocation message
|
||||
mov %es:(MEM_READ_BUFFER+AOUT_ENTRY),%edi # %edi is the destination
|
||||
mov $(MEM_READ_BUFFER+AOUT_HEADER),%esi # %esi is
|
||||
# the start of the text
|
||||
# segment
|
||||
mov %es:(MEM_READ_BUFFER+AOUT_TEXT),%ecx # %ecx = length of the text
|
||||
# segment
|
||||
push %edi # Save entry point for later
|
||||
lgdt gdtdesc # setup our own gdt
|
||||
cli # turn off interrupts
|
||||
mov %cr0,%eax # Turn on
|
||||
or $0x1,%al # protected
|
||||
mov %eax,%cr0 # mode
|
||||
ljmp $SEL_SCODE,$pm_start # long jump to clear the
|
||||
# instruction pre-fetch queue
|
||||
.code32
|
||||
pm_start: mov $SEL_SDATA,%ax # Initialize
|
||||
mov %ax,%ds # %ds and
|
||||
mov %ax,%es # %es to a flat selector
|
||||
rep # Relocate the
|
||||
movsb # text segment
|
||||
add $(MEM_PAGE_SIZE - 1),%edi # pad %edi out to a new page
|
||||
and $~(MEM_PAGE_SIZE - 1),%edi # for the data segment
|
||||
mov MEM_READ_BUFFER+AOUT_DATA,%ecx # size of the data segment
|
||||
rep # Relocate the
|
||||
movsb # data segment
|
||||
mov MEM_READ_BUFFER+AOUT_BSS,%ecx # size of the bss
|
||||
xor %eax,%eax # zero %eax
|
||||
add $3,%cl # round %ecx up to
|
||||
shr $2,%ecx # a multiple of 4
|
||||
rep # zero the
|
||||
stosl # bss
|
||||
mov MEM_READ_BUFFER+AOUT_ENTRY,%esi # %esi -> relocated loader
|
||||
add $MEM_BTX_OFFSET,%esi # %esi -> BTX in the loader
|
||||
mov $MEM_BTX_ADDRESS,%edi # %edi -> where BTX needs to go
|
||||
movzwl 0xa(%esi),%ecx # %ecx -> length of BTX
|
||||
rep # Relocate
|
||||
movsb # BTX
|
||||
ljmp $SEL_SCODE16,$pm_16 # Jump to 16-bit PM
|
||||
.code16
|
||||
pm_16: mov $SEL_RDATA,%ax # Initialize
|
||||
mov %ax,%ds # %ds and
|
||||
mov %ax,%es # %es to a real mode selector
|
||||
mov %cr0,%eax # Turn off
|
||||
and $~0x1,%al # protected
|
||||
mov %eax,%cr0 # mode
|
||||
ljmp $LOAD_SEG,$pm_end # Long jump to clear the
|
||||
# instruction pre-fetch queue
|
||||
pm_end: sti # Turn interrupts back on now
|
||||
#
|
||||
# Copy the BTX client to MEM_BTX_CLIENT
|
||||
#
|
||||
mov %cs,%ax
|
||||
mov %ax,%ds
|
||||
xor %ax,%ax
|
||||
mov %ax,%es
|
||||
mov $MEM_BTX_CLIENT,%di # Prepare to relocate
|
||||
mov $btx_client,%si # the simple btx client
|
||||
mov $(btx_client_end-btx_client),%cx # length of btx client
|
||||
rep # Relocate the
|
||||
movsb # simple BTX client
|
||||
#
|
||||
# Copy the boot[12] args to where the BTX client can see them
|
||||
#
|
||||
xor %ax,%ax
|
||||
mov %ax,%ds
|
||||
mov $MEM_ARG,%si # where the args are at now
|
||||
mov $MEM_ARG_BTX,%di # where the args are moving to
|
||||
mov $(MEM_ARG_SIZE/4),%cx # size of the arguments in longs
|
||||
rep # Relocate
|
||||
movsl # the words
|
||||
#
|
||||
# Save the entry point so the client can get to it later on
|
||||
#
|
||||
pop %eax # Restore saved entry point
|
||||
stosl # and add it to the end of
|
||||
# the arguments
|
||||
#
|
||||
# Now we just start up BTX and let it do the rest
|
||||
#
|
||||
mov $msg_jump,%si # Display the
|
||||
call putstr # jump message
|
||||
ljmp $0,$MEM_BTX_ENTRY # Jump to the BTX entry point
|
||||
|
||||
#
|
||||
# Lookup the file in the path at [SI] from the root directory.
|
||||
#
|
||||
# Trashes: All but BX
|
||||
# Returns: CF = 0 (success), BX = pointer to record
|
||||
# CF = 1 (not found)
|
||||
#
|
||||
lookup: mov $VD_ROOTDIR+MEM_VOLDESC,%bx # Root directory record
|
||||
push %bx
|
||||
push %si
|
||||
mov $msg_lookup,%si # Display lookup message
|
||||
call putstr
|
||||
pop %si
|
||||
push %si
|
||||
call putstr
|
||||
mov $msg_lookup2,%si
|
||||
call putstr
|
||||
pop %si
|
||||
pop %bx
|
||||
lookup_dir: lodsb # Get first char of path
|
||||
cmp $0,%al # Are we done?
|
||||
je lookup_done # Yes
|
||||
cmp $'/',%al # Skip path separator.
|
||||
je lookup_dir
|
||||
dec %si # Undo lodsb side effect
|
||||
call find_file # Lookup first path item
|
||||
jnc lookup_dir # Try next component
|
||||
mov $msg_lookupfail,%si # Not found message
|
||||
push %bx
|
||||
call putstr
|
||||
pop %bx
|
||||
stc # Set carry
|
||||
ret
|
||||
lookup_done: mov $msg_lookupok,%si # Success message
|
||||
push %bx
|
||||
call putstr
|
||||
pop %bx
|
||||
clc # Clear carry
|
||||
ret
|
||||
|
||||
#
|
||||
# Lookup file at [SI] in directory whose record is at [BX].
|
||||
#
|
||||
# Trashes: All but returns
|
||||
# Returns: CF = 0 (success), BX = pointer to record, SI = next path item
|
||||
# CF = 1 (not found), SI = preserved
|
||||
#
|
||||
find_file: mov %es:DIR_EXTENT(%bx),%eax # Load extent
|
||||
xor %edx,%edx
|
||||
mov %es:DIR_EA_LEN(%bx),%dl
|
||||
add %edx,%eax # Skip extended attributes
|
||||
mov %eax,rec_lba # Save LBA
|
||||
mov %es:DIR_SIZE(%bx),%eax # Save size
|
||||
mov %eax,rec_size
|
||||
xor %cl,%cl # Zero length
|
||||
push %si # Save
|
||||
ff.namelen: inc %cl # Update length
|
||||
lodsb # Read char
|
||||
cmp $0,%al # Nul?
|
||||
je ff.namedone # Yes
|
||||
cmp $'/',%al # Path separator?
|
||||
jnz ff.namelen # No, keep going
|
||||
ff.namedone: dec %cl # Adjust length and save
|
||||
mov %cl,name_len
|
||||
pop %si # Restore
|
||||
ff.load: mov rec_lba,%eax # Load LBA
|
||||
mov $MEM_DIR,%ebx # Address buffer
|
||||
mov $1,%dh # One sector
|
||||
call read # Read directory block
|
||||
incl rec_lba # Update LBA to next block
|
||||
ff.scan: mov %ebx,%edx # Check for EOF
|
||||
sub $MEM_DIR,%edx
|
||||
cmp %edx,rec_size
|
||||
ja ff.scan.1
|
||||
stc # EOF reached
|
||||
ret
|
||||
ff.scan.1: cmpb $0,%es:DIR_LEN(%bx) # Last record in block?
|
||||
je ff.nextblock
|
||||
push %si # Save
|
||||
movzbw %es:DIR_NAMELEN(%bx),%si # Find end of string
|
||||
ff.checkver: cmpb $'0',%es:DIR_NAME-1(%bx,%si) # Less than '0'?
|
||||
jb ff.checkver.1
|
||||
cmpb $'9',%es:DIR_NAME-1(%bx,%si) # Greater than '9'?
|
||||
ja ff.checkver.1
|
||||
dec %si # Next char
|
||||
jnz ff.checkver
|
||||
jmp ff.checklen # All numbers in name, so
|
||||
# no version
|
||||
ff.checkver.1: movzbw %es:DIR_NAMELEN(%bx),%cx
|
||||
cmp %cx,%si # Did we find any digits?
|
||||
je ff.checkdot # No
|
||||
cmpb $';',%es:DIR_NAME-1(%bx,%si) # Check for semicolon
|
||||
jne ff.checkver.2
|
||||
dec %si # Skip semicolon
|
||||
mov %si,%cx
|
||||
mov %cl,%es:DIR_NAMELEN(%bx) # Adjust length
|
||||
jmp ff.checkdot
|
||||
ff.checkver.2: mov %cx,%si # Restore %si to end of string
|
||||
ff.checkdot: cmpb $'.',%es:DIR_NAME-1(%bx,%si) # Trailing dot?
|
||||
jne ff.checklen # No
|
||||
decb %es:DIR_NAMELEN(%bx) # Adjust length
|
||||
ff.checklen: pop %si # Restore
|
||||
movzbw name_len,%cx # Load length of name
|
||||
cmp %cl,%es:DIR_NAMELEN(%bx) # Does length match?
|
||||
je ff.checkname # Yes, check name
|
||||
ff.nextrec: add %es:DIR_LEN(%bx),%bl # Next record
|
||||
adc $0,%bh
|
||||
jmp ff.scan
|
||||
ff.nextblock: subl $SECTOR_SIZE,rec_size # Adjust size
|
||||
jnc ff.load # If subtract ok, keep going
|
||||
ret # End of file, so not found
|
||||
ff.checkname: lea DIR_NAME(%bx),%di # Address name in record
|
||||
push %si # Save
|
||||
repe cmpsb # Compare name
|
||||
je ff.match # We have a winner!
|
||||
pop %si # Restore
|
||||
jmp ff.nextrec # Keep looking.
|
||||
ff.match: add $2,%sp # Discard saved %si
|
||||
clc # Clear carry
|
||||
ret
|
||||
|
||||
#
|
||||
# Load DH sectors starting at LBA EAX into [EBX].
|
||||
#
|
||||
# Trashes: EAX
|
||||
#
|
||||
read: push %es # Save
|
||||
push %bp
|
||||
push %dx
|
||||
push %cx
|
||||
push %ebx
|
||||
mov %bx,%bp # Set destination address
|
||||
and $0x000f,%bp
|
||||
shr $4,%ebx
|
||||
mov %bx,%es
|
||||
xor %bx,%bx # Set read bytes
|
||||
mov %dh,%bl
|
||||
shl $SECTOR_SHIFT,%bx # 2048 bytes/sec
|
||||
mov %ax,%cx # Set LBA
|
||||
shr $16,%eax
|
||||
mov %ax,%dx
|
||||
read.retry: mov $0x06,%ah # BIOS device read
|
||||
mov drive,%al
|
||||
and $0x7f,%al
|
||||
call twiddle # Entertain the user
|
||||
int $0x1b # Call BIOS
|
||||
jc read.fail # Worked?
|
||||
pop %ebx # Restore
|
||||
pop %cx
|
||||
pop %dx
|
||||
pop %bp
|
||||
pop %es
|
||||
ret # Return
|
||||
read.fail: cmp $ERROR_TIMEOUT,%ah # Timeout?
|
||||
je read.retry # Yes, Retry.
|
||||
read.error: mov %ah,%al # Save error
|
||||
mov $hex_error,%di # Format it
|
||||
call hex8 # as hex
|
||||
mov $msg_badread,%si # Display Read error message
|
||||
jmp error
|
||||
|
||||
#
|
||||
# Output the "twiddle"
|
||||
#
|
||||
twiddle: push %ax # Save
|
||||
push %bx # Save
|
||||
mov twiddle_index,%al # Load index
|
||||
mov $twiddle_chars,%bx # Address table
|
||||
inc %al # Next
|
||||
and $3,%al # char
|
||||
mov %al,twiddle_index # Save index for next call
|
||||
xlat # Get char
|
||||
call putc # Output it
|
||||
pop %bx # Restore
|
||||
pop %ax # Restore
|
||||
ret
|
||||
|
||||
#
|
||||
# Convert AL to hex, saving the result to [EDI].
|
||||
#
|
||||
hex8: pushl %eax # Save
|
||||
shrb $0x4,%al # Do upper
|
||||
call hex8.1 # 4
|
||||
popl %eax # Restore
|
||||
hex8.1: andb $0xf,%al # Get lower 4
|
||||
cmpb $0xa,%al # Convert
|
||||
sbbb $0x69,%al # to hex
|
||||
das # digit
|
||||
orb $0x20,%al # To lower case
|
||||
mov %al,(%di) # Save char
|
||||
inc %di
|
||||
ret # (Recursive)
|
||||
|
||||
#
|
||||
# BTX client to start btxldr
|
||||
#
|
||||
.code32
|
||||
btx_client: mov $(MEM_ARG_BTX-MEM_BTX_CLIENT+MEM_ARG_SIZE-4), %esi
|
||||
# %ds:(%esi) -> end
|
||||
# of boot[12] args
|
||||
mov $(MEM_ARG_SIZE/4),%ecx # Number of words to push
|
||||
std # Go backwards
|
||||
push_arg: lodsl # Read argument
|
||||
push %eax # Push it onto the stack
|
||||
loop push_arg # Push all of the arguments
|
||||
cld # In case anyone depends on this
|
||||
pushl MEM_ARG_BTX-MEM_BTX_CLIENT+MEM_ARG_SIZE # Entry point of
|
||||
# the loader
|
||||
push %eax # Emulate a near call
|
||||
mov $0x1,%eax # 'exec' system call
|
||||
int $INT_SYS # BTX system call
|
||||
btx_client_end:
|
||||
.code16
|
||||
|
||||
.p2align 4
|
||||
#
|
||||
# Global descriptor table.
|
||||
#
|
||||
gdt: .word 0x0,0x0,0x0,0x0 # Null entry
|
||||
.word 0xffff,0x0000,0x9200,0x00cf # SEL_SDATA
|
||||
.word 0xffff,0x0000,0x9200,0x0000 # SEL_RDATA
|
||||
.word 0xffff,LOAD_SEG<<4,0x9a00,0x00cf # SEL_SCODE (32-bit)
|
||||
.word 0xffff,LOAD_SEG<<4,0x9a00,0x008f # SEL_SCODE16 (16-bit)
|
||||
gdt.1:
|
||||
#
|
||||
# Pseudo-descriptors.
|
||||
#
|
||||
gdtdesc: .word gdt.1-gdt-1 # Limit
|
||||
.long LOAD_SEG<<4 + gdt # Base
|
||||
|
||||
#
|
||||
# BOOT device
|
||||
#
|
||||
drive: .byte 0
|
||||
cylinder: .word 0
|
||||
|
||||
#
|
||||
# State for searching dir
|
||||
#
|
||||
rec_lba: .long 0x0 # LBA (adjusted for EA)
|
||||
rec_size: .long 0x0 # File size
|
||||
name_len: .byte 0x0 # Length of current name
|
||||
|
||||
cursor: .word 0
|
||||
twiddle_index: .byte 0x0
|
||||
|
||||
msg_welcome: .asciz "CD Loader 1.2\r\n\n"
|
||||
msg_bootinfo: .asciz "Building the boot loader arguments\r\n"
|
||||
msg_relocate: .asciz "Relocating the loader and the BTX\r\n"
|
||||
msg_jump: .asciz "Starting the BTX loader\r\n"
|
||||
msg_badread: .ascii "Read Error: 0x"
|
||||
hex_error: .asciz "00\r\n"
|
||||
msg_novd: .asciz "Could not find Primary Volume Descriptor\r\n"
|
||||
msg_lookup: .asciz "Looking up "
|
||||
msg_lookup2: .asciz "... "
|
||||
msg_lookupok: .asciz "Found\r\n"
|
||||
msg_lookupfail: .asciz "File not found\r\n"
|
||||
msg_load2big: .asciz "File too big\r\n"
|
||||
msg_failed: .asciz "Boot failed\r\n"
|
||||
twiddle_chars: .ascii "|/-\\"
|
||||
loader_paths: .asciz "/BOOT.PC98/LOADER"
|
||||
.asciz "/boot.pc98/loader"
|
||||
.asciz "/BOOT/LOADER"
|
||||
.asciz "/boot/loader"
|
||||
.byte 0
|
||||
|
||||
/* Boot signature */
|
||||
|
||||
.org SIG2_OFF,0x90
|
||||
|
||||
.word 0xaa55 # Magic number
|
@ -1,20 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= kgzldr.o
|
||||
STRIP=
|
||||
BINMODE=${LIBMODE}
|
||||
BINDIR= ${LIBDIR}
|
||||
MAN=
|
||||
|
||||
SRCS= start.s boot.c inflate.c lib.c crt.s sio.s
|
||||
CFLAGS= -Os
|
||||
CFLAGS+=-DKZIP
|
||||
NO_SHARED=
|
||||
LDFLAGS=-Wl,-r
|
||||
.PATH: ${.CURDIR}/../../../kern
|
||||
.PATH: ${.CURDIR}/../../i386/kgzldr
|
||||
|
||||
BOOT_COMCONSOLE_PORT?= 0x238
|
||||
AFLAGS+=--defsym SIO_PRT=${BOOT_COMCONSOLE_PORT}
|
||||
|
||||
.include <bsd.prog.mk>
|
@ -1,89 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 1999 Global Technology Associates, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
|
||||
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# From: btx.s 1.10 1999/02/25 16:27:41 rnordier
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
# Screen defaults and assumptions.
|
||||
|
||||
.set SCR_MAT,0xe1 # Mode/attribute
|
||||
.set SCR_COL,0x50 # Columns per row
|
||||
.set SCR_ROW,0x19 # Rows per screen
|
||||
|
||||
# BIOS Data Area locations.
|
||||
|
||||
.set BDA_POS,0x53e # Cursor position
|
||||
|
||||
.globl crt_putchr
|
||||
|
||||
# void crt_putchr(int c)
|
||||
|
||||
crt_putchr: movb 0x4(%esp,1),%al # Get character
|
||||
pusha # Save
|
||||
xorl %ecx,%ecx # Zero for loops
|
||||
movb $SCR_MAT,%ah # Mode/attribute
|
||||
movl $BDA_POS,%ebx # BDA pointer
|
||||
movw (%ebx),%dx # Cursor position
|
||||
movl $0xa0000,%edi
|
||||
crt_putchr.1: cmpb $0xa,%al # New line?
|
||||
je crt_putchr.2 # Yes
|
||||
movw %dx,%cx
|
||||
movb %al,(%edi,%ecx,1) # Write char
|
||||
addl $0x2000,%ecx
|
||||
movb %ah,(%edi,%ecx,1) # Write attr
|
||||
addw $0x02,%dx
|
||||
jmp crt_putchr.3
|
||||
crt_putchr.2: movw %dx,%ax
|
||||
movb $SCR_COL*2,%dl
|
||||
div %dl
|
||||
incb %al
|
||||
mul %dl
|
||||
movw %ax,%dx
|
||||
crt_putchr.3: cmpw $SCR_ROW*SCR_COL*2,%dx
|
||||
jb crt_putchr.4 # No
|
||||
leal 2*SCR_COL(%edi),%esi # New top line
|
||||
movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move
|
||||
rep # Scroll
|
||||
movsl # screen
|
||||
movb $' ',%al # Space
|
||||
xorb %ah,%ah
|
||||
movb $SCR_COL,%cl # Columns to clear
|
||||
rep # Clear
|
||||
stosw # line
|
||||
movw $(SCR_ROW-1)*SCR_COL*2,%dx
|
||||
crt_putchr.4: movw %dx,(%ebx) # Update position
|
||||
shrw $1,%dx
|
||||
crt_putchr.5: inb $0x60,%al # Move cursor
|
||||
testb $0x04,%al
|
||||
jz crt_putchr.5
|
||||
movb $0x49,%al
|
||||
outb %al,$0x62
|
||||
movb %dl,%al
|
||||
outb %al,$0x60
|
||||
movb %dh,%al
|
||||
outb %al,$0x60
|
||||
popa # Restore
|
||||
ret # To caller
|
@ -1,51 +0,0 @@
|
||||
# $FreeBSD$
|
||||
#
|
||||
LIB= pc98
|
||||
INTERNALLIB=
|
||||
|
||||
.PATH: ${.CURDIR}/../../i386/libi386
|
||||
|
||||
SRCS= bioscd.c biosdisk.c biosmem.c biospnp.c \
|
||||
biospci.c biossmap.c bootinfo.c bootinfo32.c \
|
||||
comconsole.c devicename.c elf32_freebsd.c \
|
||||
i386_copy.c i386_module.c nullconsole.c pc98_sys.c pxe.c pxetramp.s \
|
||||
time.c vidconsole.c
|
||||
.PATH: ${.CURDIR}/../../zfs
|
||||
SRCS+= devicename_stubs.c
|
||||
|
||||
# Enable PXE TFTP or NFS support, not both.
|
||||
.if defined(LOADER_TFTP_SUPPORT)
|
||||
CFLAGS+= -DLOADER_TFTP_SUPPORT
|
||||
.else
|
||||
CFLAGS+= -DLOADER_NFS_SUPPORT
|
||||
.endif
|
||||
|
||||
BOOT_COMCONSOLE_PORT?= 0x238
|
||||
CFLAGS+= -DCOMPORT=${BOOT_COMCONSOLE_PORT}
|
||||
|
||||
BOOT_COMCONSOLE_SPEED?= 9600
|
||||
CFLAGS+= -DCOMSPEED=${BOOT_COMCONSOLE_SPEED}
|
||||
|
||||
.ifdef(BOOT_BIOSDISK_DEBUG)
|
||||
# Make the disk code more talkative
|
||||
CFLAGS+= -DDISK_DEBUG
|
||||
.endif
|
||||
|
||||
# Include simple terminal emulation (cons25-compatible)
|
||||
CFLAGS+= -DTERM_EMU
|
||||
|
||||
# XXX: make alloca() useable
|
||||
CFLAGS+= -Dalloca=__builtin_alloca
|
||||
|
||||
CFLAGS+= -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/i386 \
|
||||
-I${.CURDIR}/../../common \
|
||||
-I${.CURDIR}/../btx/lib \
|
||||
-I${.CURDIR}/../../i386/libi386 \
|
||||
-I${.CURDIR}/../../.. -I.
|
||||
# the location of libstand
|
||||
CFLAGS+= -I${.CURDIR}/../../../../lib/libstand/
|
||||
|
||||
# Handle FreeBSD specific %b and %D printf format specifiers
|
||||
CFLAGS+= ${FORMAT_EXTENSIONS}
|
||||
|
||||
.include <bsd.lib.mk>
|
@ -1,420 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
|
||||
* Copyright (c) 2001 John H. Baldwin <jhb@FreeBSD.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
/*
|
||||
* BIOS CD device handling for CD's that have been booted off of via no
|
||||
* emulation booting as defined in the El Torito standard.
|
||||
*
|
||||
* Ideas and algorithms from:
|
||||
*
|
||||
* - FreeBSD libi386/biosdisk.c
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stand.h>
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <machine/bootinfo.h>
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <bootstrap.h>
|
||||
#include <btxv86.h>
|
||||
#include "libi386.h"
|
||||
|
||||
#define BIOSCD_SECSIZE 2048
|
||||
#define BUFSIZE (1 * BIOSCD_SECSIZE)
|
||||
#define MAXBCDEV 1
|
||||
|
||||
/* Major numbers for devices we frontend for. */
|
||||
#define ACDMAJOR 117
|
||||
#define CDMAJOR 15
|
||||
|
||||
#ifdef DISK_DEBUG
|
||||
# define DEBUG(fmt, args...) printf("%s: " fmt "\n" , __func__ , ## args)
|
||||
#else
|
||||
# define DEBUG(fmt, args...)
|
||||
#endif
|
||||
|
||||
struct specification_packet {
|
||||
u_char sp_size;
|
||||
u_char sp_bootmedia;
|
||||
u_char sp_drive;
|
||||
u_char sp_controller;
|
||||
u_int sp_lba;
|
||||
u_short sp_devicespec;
|
||||
u_short sp_buffersegment;
|
||||
u_short sp_loadsegment;
|
||||
u_short sp_sectorcount;
|
||||
u_short sp_cylsec;
|
||||
u_char sp_head;
|
||||
};
|
||||
|
||||
/*
|
||||
* List of BIOS devices, translation from disk unit number to
|
||||
* BIOS unit number.
|
||||
*/
|
||||
static struct bcinfo {
|
||||
int bc_unit; /* BIOS unit number */
|
||||
struct specification_packet bc_sp;
|
||||
int bc_open; /* reference counter */
|
||||
void *bc_bcache; /* buffer cache data */
|
||||
} bcinfo [MAXBCDEV];
|
||||
static int nbcinfo = 0;
|
||||
|
||||
#define BC(dev) (bcinfo[(dev)->d_unit])
|
||||
|
||||
static int bc_read(int unit, daddr_t dblk, int blks, caddr_t dest);
|
||||
static int bc_init(void);
|
||||
static int bc_strategy(void *devdata, int flag, daddr_t dblk,
|
||||
size_t size, char *buf, size_t *rsize);
|
||||
static int bc_realstrategy(void *devdata, int flag, daddr_t dblk,
|
||||
size_t size, char *buf, size_t *rsize);
|
||||
static int bc_open(struct open_file *f, ...);
|
||||
static int bc_close(struct open_file *f);
|
||||
static int bc_print(int verbose);
|
||||
|
||||
struct devsw bioscd = {
|
||||
"cd",
|
||||
DEVT_CD,
|
||||
bc_init,
|
||||
bc_strategy,
|
||||
bc_open,
|
||||
bc_close,
|
||||
noioctl,
|
||||
bc_print,
|
||||
NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* Translate between BIOS device numbers and our private unit numbers.
|
||||
*/
|
||||
int
|
||||
bc_bios2unit(int biosdev)
|
||||
{
|
||||
int i;
|
||||
|
||||
DEBUG("looking for bios device 0x%x", biosdev);
|
||||
for (i = 0; i < nbcinfo; i++) {
|
||||
DEBUG("bc unit %d is BIOS device 0x%x", i, bcinfo[i].bc_unit);
|
||||
if (bcinfo[i].bc_unit == biosdev)
|
||||
return(i);
|
||||
}
|
||||
return(-1);
|
||||
}
|
||||
|
||||
int
|
||||
bc_unit2bios(int unit)
|
||||
{
|
||||
if ((unit >= 0) && (unit < nbcinfo))
|
||||
return(bcinfo[unit].bc_unit);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* We can't quiz, we have to be told what device to use, so this functoin
|
||||
* doesn't do anything. Instead, the loader calls bc_add() with the BIOS
|
||||
* device number to add.
|
||||
*/
|
||||
static int
|
||||
bc_init(void)
|
||||
{
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
bc_add(int biosdev)
|
||||
{
|
||||
|
||||
if (nbcinfo >= MAXBCDEV)
|
||||
return (-1);
|
||||
bcinfo[nbcinfo].bc_unit = biosdev;
|
||||
|
||||
/* SCSI CD-ROM only */
|
||||
if ((biosdev & 0xf0) != 0xa0)
|
||||
return (-1);
|
||||
if ((((uint32_t *)PTOV(0xA1460))[biosdev & 0x0f] & 0x1f) != 5)
|
||||
return (-1);
|
||||
|
||||
printf("BIOS CD is cd%d\n", nbcinfo);
|
||||
nbcinfo++;
|
||||
bcache_add_dev(nbcinfo); /* register cd device in bcache */
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Print information about disks
|
||||
*/
|
||||
static int
|
||||
bc_print(int verbose)
|
||||
{
|
||||
char line[80];
|
||||
int i, ret = 0;
|
||||
|
||||
if (nbcinfo == 0)
|
||||
return (0);
|
||||
|
||||
printf("%s devices:", bioscd.dv_name);
|
||||
if ((ret = pager_output("\n")) != 0)
|
||||
return (ret);
|
||||
|
||||
for (i = 0; i < nbcinfo; i++) {
|
||||
sprintf(line, " cd%d: Device 0x%x\n", i,
|
||||
bcinfo[i].bc_sp.sp_devicespec);
|
||||
if ((ret = pager_output(line)) != 0)
|
||||
break;
|
||||
}
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/*
|
||||
* Attempt to open the disk described by (dev) for use by (f).
|
||||
*/
|
||||
static int
|
||||
bc_open(struct open_file *f, ...)
|
||||
{
|
||||
va_list ap;
|
||||
struct i386_devdesc *dev;
|
||||
|
||||
va_start(ap, f);
|
||||
dev = va_arg(ap, struct i386_devdesc *);
|
||||
va_end(ap);
|
||||
if (dev->d_unit >= nbcinfo) {
|
||||
DEBUG("attempt to open nonexistent disk");
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
BC(dev).bc_open++;
|
||||
if (BC(dev).bc_bcache == NULL)
|
||||
BC(dev).bc_bcache = bcache_allocate();
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int
|
||||
bc_close(struct open_file *f)
|
||||
{
|
||||
struct i386_devdesc *dev;
|
||||
|
||||
dev = (struct i386_devdesc *)f->f_devdata;
|
||||
BC(dev).bc_open--;
|
||||
if (BC(dev).bc_open == 0) {
|
||||
bcache_free(BC(dev).bc_bcache);
|
||||
BC(dev).bc_bcache = NULL;
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int
|
||||
bc_strategy(void *devdata, int rw, daddr_t dblk, size_t size,
|
||||
char *buf, size_t *rsize)
|
||||
{
|
||||
struct bcache_devdata bcd;
|
||||
struct i386_devdesc *dev;
|
||||
|
||||
dev = (struct i386_devdesc *)devdata;
|
||||
bcd.dv_strategy = bc_realstrategy;
|
||||
bcd.dv_devdata = devdata;
|
||||
bcd.dv_cache = BC(dev).bc_bcache;
|
||||
|
||||
return (bcache_strategy(&bcd, rw, dblk, size, buf, rsize));
|
||||
}
|
||||
|
||||
static int
|
||||
bc_realstrategy(void *devdata, int rw, daddr_t dblk, size_t size,
|
||||
char *buf, size_t *rsize)
|
||||
{
|
||||
struct i386_devdesc *dev;
|
||||
int unit;
|
||||
int blks;
|
||||
#ifdef BD_SUPPORT_FRAGS
|
||||
char fragbuf[BIOSCD_SECSIZE];
|
||||
size_t fragsize;
|
||||
|
||||
fragsize = size % BIOSCD_SECSIZE;
|
||||
#else
|
||||
if (size % BIOSCD_SECSIZE)
|
||||
return (EINVAL);
|
||||
#endif
|
||||
|
||||
if (rw != F_READ)
|
||||
return(EROFS);
|
||||
dev = (struct i386_devdesc *)devdata;
|
||||
unit = dev->d_unit;
|
||||
blks = size / BIOSCD_SECSIZE;
|
||||
if (dblk % (BIOSCD_SECSIZE / DEV_BSIZE) != 0)
|
||||
return (EINVAL);
|
||||
dblk /= (BIOSCD_SECSIZE / DEV_BSIZE);
|
||||
DEBUG("read %d from %lld to %p", blks, dblk, buf);
|
||||
|
||||
if (rsize)
|
||||
*rsize = 0;
|
||||
if (blks && bc_read(unit, dblk, blks, buf)) {
|
||||
DEBUG("read error");
|
||||
return (EIO);
|
||||
}
|
||||
#ifdef BD_SUPPORT_FRAGS
|
||||
DEBUG("frag read %d from %lld+%d to %p",
|
||||
fragsize, dblk, blks, buf + (blks * BIOSCD_SECSIZE));
|
||||
if (fragsize && bc_read(unit, dblk + blks, 1, fragbuf)) {
|
||||
DEBUG("frag read error");
|
||||
return(EIO);
|
||||
}
|
||||
bcopy(fragbuf, buf + (blks * BIOSCD_SECSIZE), fragsize);
|
||||
#endif
|
||||
if (rsize)
|
||||
*rsize = size;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Max number of sectors to bounce-buffer at a time. */
|
||||
#define CD_BOUNCEBUF 8
|
||||
|
||||
static int
|
||||
bc_read(int unit, daddr_t dblk, int blks, caddr_t dest)
|
||||
{
|
||||
u_int maxfer, resid, result, retry, x;
|
||||
caddr_t bbuf, p, xp;
|
||||
int biosdev;
|
||||
#ifdef DISK_DEBUG
|
||||
int error;
|
||||
#endif
|
||||
|
||||
/* Just in case some idiot actually tries to read -1 blocks... */
|
||||
if (blks < 0)
|
||||
return (-1);
|
||||
|
||||
/* If nothing to do, just return succcess. */
|
||||
if (blks == 0)
|
||||
return (0);
|
||||
|
||||
/* Decide whether we have to bounce */
|
||||
if (VTOP(dest) >> 20 != 0) {
|
||||
/*
|
||||
* The destination buffer is above first 1MB of
|
||||
* physical memory so we have to arrange a suitable
|
||||
* bounce buffer.
|
||||
*/
|
||||
x = min(CD_BOUNCEBUF, (unsigned)blks);
|
||||
bbuf = alloca(x * BIOSCD_SECSIZE);
|
||||
maxfer = x;
|
||||
} else {
|
||||
bbuf = NULL;
|
||||
maxfer = 0;
|
||||
}
|
||||
|
||||
biosdev = bc_unit2bios(unit);
|
||||
resid = blks;
|
||||
p = dest;
|
||||
|
||||
while (resid > 0) {
|
||||
if (bbuf)
|
||||
xp = bbuf;
|
||||
else
|
||||
xp = p;
|
||||
x = resid;
|
||||
if (maxfer > 0)
|
||||
x = min(x, maxfer);
|
||||
|
||||
/*
|
||||
* Loop retrying the operation a couple of times. The BIOS
|
||||
* may also retry.
|
||||
*/
|
||||
for (retry = 0; retry < 3; retry++) {
|
||||
/* If retrying, reset the drive */
|
||||
if (retry > 0) {
|
||||
v86.ctl = V86_FLAGS;
|
||||
v86.addr = 0x1b;
|
||||
v86.eax = 0x0300 | biosdev;
|
||||
v86int();
|
||||
}
|
||||
|
||||
v86.ctl = V86_FLAGS;
|
||||
v86.addr = 0x1b;
|
||||
v86.eax = 0x0600 | (biosdev & 0x7f);
|
||||
v86.ebx = x * BIOSCD_SECSIZE;
|
||||
v86.ecx = dblk & 0xffff;
|
||||
v86.edx = (dblk >> 16) & 0xffff;
|
||||
v86.ebp = VTOPOFF(xp);
|
||||
v86.es = VTOPSEG(xp);
|
||||
v86int();
|
||||
result = V86_CY(v86.efl);
|
||||
if (result == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef DISK_DEBUG
|
||||
error = (v86.eax >> 8) & 0xff;
|
||||
#endif
|
||||
DEBUG("%d sectors from %lld to %p (0x%x) %s", x, dblk, p,
|
||||
VTOP(p), result ? "failed" : "ok");
|
||||
DEBUG("unit %d status 0x%x", unit, error);
|
||||
if (bbuf != NULL)
|
||||
bcopy(bbuf, p, x * BIOSCD_SECSIZE);
|
||||
p += (x * BIOSCD_SECSIZE);
|
||||
dblk += x;
|
||||
resid -= x;
|
||||
}
|
||||
|
||||
/* hexdump(dest, (blks * BIOSCD_SECSIZE)); */
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return a suitable dev_t value for (dev).
|
||||
*/
|
||||
int
|
||||
bc_getdev(struct i386_devdesc *dev)
|
||||
{
|
||||
int biosdev, unit, device;
|
||||
int major;
|
||||
int rootdev;
|
||||
|
||||
unit = dev->d_unit;
|
||||
biosdev = bc_unit2bios(unit);
|
||||
DEBUG("unit %d BIOS device %d", unit, biosdev);
|
||||
if (biosdev == -1) /* not a BIOS device */
|
||||
return(-1);
|
||||
|
||||
device = biosdev & 0xf0;
|
||||
if (device == 0x80)
|
||||
major = ACDMAJOR;
|
||||
else if (device == 0xa0)
|
||||
major = CDMAJOR;
|
||||
else
|
||||
return (-1);
|
||||
|
||||
unit = 0; /* XXX */
|
||||
|
||||
/* XXX: Assume partition 'a'. */
|
||||
rootdev = MAKEBOOTDEV(major, 0, unit, 0);
|
||||
DEBUG("dev is 0x%x\n", rootdev);
|
||||
return(rootdev);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,64 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
/*
|
||||
* Obtain memory configuration information from the BIOS
|
||||
*/
|
||||
#include <stand.h>
|
||||
#include "libi386.h"
|
||||
#include "btxv86.h"
|
||||
|
||||
vm_offset_t memtop, memtop_copyin, high_heap_base;
|
||||
uint32_t bios_basemem, bios_extmem, high_heap_size;
|
||||
|
||||
/*
|
||||
* The minimum amount of memory to reserve in bios_extmem for the heap.
|
||||
*/
|
||||
#define HEAP_MIN (64 * 1024 * 1024)
|
||||
|
||||
void
|
||||
bios_getmem(void)
|
||||
{
|
||||
|
||||
bios_basemem = ((*(u_char *)PTOV(0xA1501) & 0x07) + 1) * 128 * 1024;
|
||||
bios_extmem = *(u_char *)PTOV(0xA1401) * 128 * 1024 +
|
||||
*(u_int16_t *)PTOV(0xA1594) * 1024 * 1024;
|
||||
|
||||
/* Set memtop to actual top of memory */
|
||||
memtop = memtop_copyin = 0x100000 + bios_extmem;
|
||||
|
||||
/*
|
||||
* If we have extended memory, use the last 3MB of 'extended' memory
|
||||
* as a high heap candidate.
|
||||
*/
|
||||
if (bios_extmem >= HEAP_MIN) {
|
||||
high_heap_size = HEAP_MIN;
|
||||
high_heap_base = memtop - HEAP_MIN;
|
||||
}
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2006 TAKAHASHI Yoshihiro <nyan@FreeBSD.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stand.h>
|
||||
#include <sys/param.h>
|
||||
#include "libi386.h"
|
||||
|
||||
void
|
||||
bios_addsmapdata(struct preloaded_file *kfp)
|
||||
{
|
||||
|
||||
}
|
@ -1,367 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1998 Michael Smith (msmith@freebsd.org)
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stand.h>
|
||||
#include <bootstrap.h>
|
||||
#include <machine/cpufunc.h>
|
||||
#include <dev/ic/ns16550.h>
|
||||
#include <dev/pci/pcireg.h>
|
||||
#include "libi386.h"
|
||||
|
||||
#define COMC_FMT 0x3 /* 8N1 */
|
||||
#define COMC_TXWAIT 0x40000 /* transmit timeout */
|
||||
#define COMC_BPS(x) (115200 / (x)) /* speed to DLAB divisor */
|
||||
#define COMC_DIV2BPS(x) (115200 / (x)) /* DLAB divisor to speed */
|
||||
|
||||
#ifndef COMPORT
|
||||
#define COMPORT 0x238
|
||||
#endif
|
||||
#ifndef COMSPEED
|
||||
#define COMSPEED 9600
|
||||
#endif
|
||||
|
||||
static void comc_probe(struct console *cp);
|
||||
static int comc_init(int arg);
|
||||
static void comc_putchar(int c);
|
||||
static int comc_getchar(void);
|
||||
static int comc_getspeed(void);
|
||||
static int comc_ischar(void);
|
||||
static int comc_parseint(const char *string);
|
||||
static uint32_t comc_parse_pcidev(const char *string);
|
||||
static int comc_pcidev_set(struct env_var *ev, int flags,
|
||||
const void *value);
|
||||
static int comc_pcidev_handle(uint32_t locator);
|
||||
static int comc_port_set(struct env_var *ev, int flags,
|
||||
const void *value);
|
||||
static void comc_setup(int speed, int port);
|
||||
static int comc_speed_set(struct env_var *ev, int flags,
|
||||
const void *value);
|
||||
|
||||
static int comc_curspeed;
|
||||
static int comc_port = COMPORT;
|
||||
static uint32_t comc_locator;
|
||||
|
||||
struct console comconsole = {
|
||||
"comconsole",
|
||||
"serial port",
|
||||
0,
|
||||
comc_probe,
|
||||
comc_init,
|
||||
comc_putchar,
|
||||
comc_getchar,
|
||||
comc_ischar
|
||||
};
|
||||
|
||||
static void
|
||||
comc_probe(struct console *cp)
|
||||
{
|
||||
char intbuf[16];
|
||||
char *cons, *env;
|
||||
int speed, port;
|
||||
uint32_t locator;
|
||||
|
||||
if (comc_curspeed == 0) {
|
||||
comc_curspeed = COMSPEED;
|
||||
/*
|
||||
* Assume that the speed was set by an earlier boot loader if
|
||||
* comconsole is already the preferred console.
|
||||
*/
|
||||
cons = getenv("console");
|
||||
if ((cons != NULL && strcmp(cons, comconsole.c_name) == 0) ||
|
||||
getenv("boot_multicons") != NULL) {
|
||||
comc_curspeed = comc_getspeed();
|
||||
}
|
||||
|
||||
env = getenv("comconsole_speed");
|
||||
if (env != NULL) {
|
||||
speed = comc_parseint(env);
|
||||
if (speed > 0)
|
||||
comc_curspeed = speed;
|
||||
}
|
||||
|
||||
sprintf(intbuf, "%d", comc_curspeed);
|
||||
unsetenv("comconsole_speed");
|
||||
env_setenv("comconsole_speed", EV_VOLATILE, intbuf, comc_speed_set,
|
||||
env_nounset);
|
||||
|
||||
env = getenv("comconsole_port");
|
||||
if (env != NULL) {
|
||||
port = comc_parseint(env);
|
||||
if (port > 0)
|
||||
comc_port = port;
|
||||
}
|
||||
|
||||
sprintf(intbuf, "%d", comc_port);
|
||||
unsetenv("comconsole_port");
|
||||
env_setenv("comconsole_port", EV_VOLATILE, intbuf, comc_port_set,
|
||||
env_nounset);
|
||||
|
||||
env = getenv("comconsole_pcidev");
|
||||
if (env != NULL) {
|
||||
locator = comc_parse_pcidev(env);
|
||||
if (locator != 0)
|
||||
comc_pcidev_handle(locator);
|
||||
}
|
||||
|
||||
unsetenv("comconsole_pcidev");
|
||||
env_setenv("comconsole_pcidev", EV_VOLATILE, env, comc_pcidev_set,
|
||||
env_nounset);
|
||||
}
|
||||
comc_setup(comc_curspeed, comc_port);
|
||||
}
|
||||
|
||||
static int
|
||||
comc_init(int arg)
|
||||
{
|
||||
|
||||
comc_setup(comc_curspeed, comc_port);
|
||||
|
||||
if ((comconsole.c_flags & (C_PRESENTIN | C_PRESENTOUT)) ==
|
||||
(C_PRESENTIN | C_PRESENTOUT))
|
||||
return (CMD_OK);
|
||||
return (CMD_ERROR);
|
||||
}
|
||||
|
||||
static void
|
||||
comc_putchar(int c)
|
||||
{
|
||||
int wait;
|
||||
|
||||
for (wait = COMC_TXWAIT; wait > 0; wait--)
|
||||
if (inb(comc_port + com_lsr) & LSR_TXRDY) {
|
||||
outb(comc_port + com_data, (u_char)c);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
comc_getchar(void)
|
||||
{
|
||||
return (comc_ischar() ? inb(comc_port + com_data) : -1);
|
||||
}
|
||||
|
||||
static int
|
||||
comc_ischar(void)
|
||||
{
|
||||
return (inb(comc_port + com_lsr) & LSR_RXRDY);
|
||||
}
|
||||
|
||||
static int
|
||||
comc_speed_set(struct env_var *ev, int flags, const void *value)
|
||||
{
|
||||
int speed;
|
||||
|
||||
if (value == NULL || (speed = comc_parseint(value)) <= 0) {
|
||||
printf("Invalid speed\n");
|
||||
return (CMD_ERROR);
|
||||
}
|
||||
|
||||
if (comc_curspeed != speed)
|
||||
comc_setup(speed, comc_port);
|
||||
|
||||
env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL);
|
||||
|
||||
return (CMD_OK);
|
||||
}
|
||||
|
||||
static int
|
||||
comc_port_set(struct env_var *ev, int flags, const void *value)
|
||||
{
|
||||
int port;
|
||||
|
||||
if (value == NULL || (port = comc_parseint(value)) <= 0) {
|
||||
printf("Invalid port\n");
|
||||
return (CMD_ERROR);
|
||||
}
|
||||
|
||||
if (comc_port != port)
|
||||
comc_setup(comc_curspeed, port);
|
||||
|
||||
env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL);
|
||||
|
||||
return (CMD_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
* Input: bus:dev:func[:bar]. If bar is not specified, it is 0x10.
|
||||
* Output: bar[24:16] bus[15:8] dev[7:3] func[2:0]
|
||||
*/
|
||||
static uint32_t
|
||||
comc_parse_pcidev(const char *string)
|
||||
{
|
||||
char *p, *p1;
|
||||
uint8_t bus, dev, func, bar;
|
||||
uint32_t locator;
|
||||
int pres;
|
||||
|
||||
pres = strtol(string, &p, 0);
|
||||
if (p == string || *p != ':' || pres < 0 )
|
||||
return (0);
|
||||
bus = pres;
|
||||
p1 = ++p;
|
||||
|
||||
pres = strtol(p1, &p, 0);
|
||||
if (p == string || *p != ':' || pres < 0 )
|
||||
return (0);
|
||||
dev = pres;
|
||||
p1 = ++p;
|
||||
|
||||
pres = strtol(p1, &p, 0);
|
||||
if (p == string || (*p != ':' && *p != '\0') || pres < 0 )
|
||||
return (0);
|
||||
func = pres;
|
||||
|
||||
if (*p == ':') {
|
||||
p1 = ++p;
|
||||
pres = strtol(p1, &p, 0);
|
||||
if (p == string || *p != '\0' || pres <= 0 )
|
||||
return (0);
|
||||
bar = pres;
|
||||
} else
|
||||
bar = 0x10;
|
||||
|
||||
locator = (bar << 16) | biospci_locator(bus, dev, func);
|
||||
return (locator);
|
||||
}
|
||||
|
||||
static int
|
||||
comc_pcidev_handle(uint32_t locator)
|
||||
{
|
||||
char intbuf[64];
|
||||
uint32_t port;
|
||||
|
||||
if (biospci_read_config(locator & 0xffff,
|
||||
(locator & 0xff0000) >> 16, 2, &port) == -1) {
|
||||
printf("Cannot read bar at 0x%x\n", locator);
|
||||
return (CMD_ERROR);
|
||||
}
|
||||
if (!PCI_BAR_IO(port)) {
|
||||
printf("Memory bar at 0x%x\n", locator);
|
||||
return (CMD_ERROR);
|
||||
}
|
||||
port &= PCIM_BAR_IO_BASE;
|
||||
|
||||
sprintf(intbuf, "%d", port);
|
||||
unsetenv("comconsole_port");
|
||||
env_setenv("comconsole_port", EV_VOLATILE, intbuf,
|
||||
comc_port_set, env_nounset);
|
||||
|
||||
comc_setup(comc_curspeed, port);
|
||||
comc_locator = locator;
|
||||
|
||||
return (CMD_OK);
|
||||
}
|
||||
|
||||
static int
|
||||
comc_pcidev_set(struct env_var *ev, int flags, const void *value)
|
||||
{
|
||||
uint32_t locator;
|
||||
int error;
|
||||
|
||||
if (value == NULL || (locator = comc_parse_pcidev(value)) <= 0) {
|
||||
printf("Invalid pcidev\n");
|
||||
return (CMD_ERROR);
|
||||
}
|
||||
if ((comconsole.c_flags & (C_ACTIVEIN | C_ACTIVEOUT)) != 0 &&
|
||||
comc_locator != locator) {
|
||||
error = comc_pcidev_handle(locator);
|
||||
if (error != CMD_OK)
|
||||
return (error);
|
||||
}
|
||||
env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL);
|
||||
return (CMD_OK);
|
||||
}
|
||||
|
||||
static void
|
||||
comc_setup(int speed, int port)
|
||||
{
|
||||
static int TRY_COUNT = 1000000;
|
||||
char intbuf[64];
|
||||
int tries;
|
||||
|
||||
unsetenv("hw.uart.console");
|
||||
comc_curspeed = speed;
|
||||
comc_port = port;
|
||||
if ((comconsole.c_flags & (C_ACTIVEIN | C_ACTIVEOUT)) == 0)
|
||||
return;
|
||||
|
||||
outb(comc_port + com_cfcr, CFCR_DLAB | COMC_FMT);
|
||||
outb(comc_port + com_dlbl, COMC_BPS(speed) & 0xff);
|
||||
outb(comc_port + com_dlbh, COMC_BPS(speed) >> 8);
|
||||
outb(comc_port + com_cfcr, COMC_FMT);
|
||||
outb(comc_port + com_mcr, MCR_RTS | MCR_DTR);
|
||||
|
||||
tries = 0;
|
||||
do
|
||||
inb(comc_port + com_data);
|
||||
while (inb(comc_port + com_lsr) & LSR_RXRDY && ++tries < TRY_COUNT);
|
||||
|
||||
if (tries < TRY_COUNT) {
|
||||
comconsole.c_flags |= (C_PRESENTIN | C_PRESENTOUT);
|
||||
sprintf(intbuf, "io:%d,br:%d", comc_port, comc_curspeed);
|
||||
env_setenv("hw.uart.console", EV_VOLATILE, intbuf, NULL, NULL);
|
||||
} else
|
||||
comconsole.c_flags &= ~(C_PRESENTIN | C_PRESENTOUT);
|
||||
}
|
||||
|
||||
static int
|
||||
comc_parseint(const char *speedstr)
|
||||
{
|
||||
char *p;
|
||||
int speed;
|
||||
|
||||
speed = strtol(speedstr, &p, 0);
|
||||
if (p == speedstr || *p != '\0' || speed <= 0)
|
||||
return (-1);
|
||||
|
||||
return (speed);
|
||||
}
|
||||
|
||||
static int
|
||||
comc_getspeed(void)
|
||||
{
|
||||
u_int divisor;
|
||||
u_char dlbh;
|
||||
u_char dlbl;
|
||||
u_char cfcr;
|
||||
|
||||
cfcr = inb(comc_port + com_cfcr);
|
||||
outb(comc_port + com_cfcr, CFCR_DLAB | cfcr);
|
||||
|
||||
dlbl = inb(comc_port + com_dlbl);
|
||||
dlbh = inb(comc_port + com_dlbh);
|
||||
|
||||
outb(comc_port + com_cfcr, cfcr);
|
||||
|
||||
divisor = dlbh << 8 | dlbl;
|
||||
|
||||
/* XXX there should be more sanity checking. */
|
||||
if (divisor == 0)
|
||||
return (COMSPEED);
|
||||
return (COMC_DIV2BPS(divisor));
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2009 TAKAHASHI Yoshihiro <nyan@FreeBSD.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
void set_machine_type(void);
|
@ -1,78 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2009 TAKAHASHI Yoshihiro <nyan@FreeBSD.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <btxv86.h>
|
||||
#include <machine/cpufunc.h>
|
||||
#define _KERNEL
|
||||
#include <pc98/pc98/pc98_machdep.h>
|
||||
|
||||
/*
|
||||
* Set machine type to PC98_SYSTEM_PARAMETER.
|
||||
*/
|
||||
void
|
||||
set_machine_type(void)
|
||||
{
|
||||
int i;
|
||||
u_long ret, data;
|
||||
|
||||
/* PC98_SYSTEM_PARAMETER (0x501) */
|
||||
ret = ((*(u_char *)PTOV(0xA1501)) & 0x08) >> 3;
|
||||
|
||||
/* Wait V-SYNC */
|
||||
while (inb(0x60) & 0x20) {}
|
||||
while (!(inb(0x60) & 0x20)) {}
|
||||
|
||||
/* ANK 'A' font */
|
||||
outb(0xa1, 0x00);
|
||||
outb(0xa3, 0x41);
|
||||
|
||||
/* M_NORMAL, use CG window (all NEC OK) */
|
||||
for (i = data = 0; i < 4; i++)
|
||||
data += *((u_long *)PTOV(0xA4000) + i); /* 0xa4000 */
|
||||
if (data == 0x6efc58fc) /* DA data */
|
||||
ret |= M_NEC_PC98;
|
||||
else
|
||||
ret |= M_EPSON_PC98;
|
||||
ret |= (inb(0x42) & 0x20) ? M_8M : 0;
|
||||
|
||||
/* PC98_SYSTEM_PARAMETER(0x400) */
|
||||
if ((*(u_char *)PTOV(0xA1400)) & 0x80)
|
||||
ret |= M_NOTE;
|
||||
if (ret & M_NEC_PC98) {
|
||||
/* PC98_SYSTEM_PARAMETER(0x458) */
|
||||
if ((*(u_char *)PTOV(0xA1458)) & 0x80)
|
||||
ret |= M_H98;
|
||||
else
|
||||
ret |= M_NOT_H98;
|
||||
} else
|
||||
ret |= M_NOT_H98;
|
||||
|
||||
(*(u_long *)PTOV(0xA1620)) = ret;
|
||||
}
|
@ -1,98 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stand.h>
|
||||
#include <btxv86.h>
|
||||
#include <machine/cpufunc.h>
|
||||
#include "bootstrap.h"
|
||||
#include "libi386.h"
|
||||
|
||||
static int bios_seconds(void);
|
||||
|
||||
/*
|
||||
* Return the BIOS time-of-day value.
|
||||
*
|
||||
* XXX uses undocumented BCD support from libstand.
|
||||
*/
|
||||
static int
|
||||
bios_seconds(void)
|
||||
{
|
||||
int hr, minute, sec;
|
||||
unsigned char bios_time[6];
|
||||
|
||||
v86.ctl = 0;
|
||||
v86.addr = 0x1c; /* int 0x1c, function 0 */
|
||||
v86.eax = 0x0000;
|
||||
v86.es = VTOPSEG(bios_time);
|
||||
v86.ebx = VTOPOFF(bios_time);
|
||||
v86int();
|
||||
|
||||
hr = bcd2bin(bios_time[3]);
|
||||
minute = bcd2bin(bios_time[4]);
|
||||
sec = bcd2bin(bios_time[5]);
|
||||
|
||||
return (hr * 3600 + minute * 60 + sec);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the time in seconds since the beginning of the day.
|
||||
*/
|
||||
time_t
|
||||
time(time_t *t)
|
||||
{
|
||||
static time_t lasttime;
|
||||
time_t now;
|
||||
|
||||
now = bios_seconds();
|
||||
|
||||
if (now < lasttime)
|
||||
now += 24 * 3600;
|
||||
lasttime = now;
|
||||
|
||||
if (t != NULL)
|
||||
*t = now;
|
||||
return(now);
|
||||
}
|
||||
|
||||
/*
|
||||
* Use the BIOS Wait function to pause for (period) microseconds.
|
||||
*
|
||||
* Resolution of this function is variable, but typically around
|
||||
* 1ms.
|
||||
*/
|
||||
void
|
||||
delay(int period)
|
||||
{
|
||||
int i;
|
||||
|
||||
period = (period + 500) / 1000;
|
||||
for( ; period != 0 ; period--)
|
||||
for(i=800;i != 0; i--)
|
||||
outb(0x5f,0); /* wait 600ns */
|
||||
}
|
@ -1,596 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1998 Michael Smith (msmith@freebsd.org)
|
||||
* Copyright (c) 1997 Kazutaka YOKOTA (yokota@zodiac.mech.utsunomiya-u.ac.jp)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Id: probe_keyboard.c,v 1.13 1997/06/09 05:10:55 bde Exp
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stand.h>
|
||||
#include <bootstrap.h>
|
||||
#include <btxv86.h>
|
||||
#include <machine/cpufunc.h>
|
||||
#include "libi386.h"
|
||||
|
||||
#if KEYBOARD_PROBE
|
||||
#include <machine/cpufunc.h>
|
||||
|
||||
static int probe_keyboard(void);
|
||||
#endif
|
||||
static void vidc_probe(struct console *cp);
|
||||
static int vidc_init(int arg);
|
||||
static void vidc_putchar(int c);
|
||||
static int vidc_getchar(void);
|
||||
static int vidc_ischar(void);
|
||||
|
||||
static int vidc_started;
|
||||
|
||||
#ifdef TERM_EMU
|
||||
#define MAXARGS 8
|
||||
#define DEFAULT_FGCOLOR 7
|
||||
#define DEFAULT_BGCOLOR 0
|
||||
|
||||
void end_term(void);
|
||||
void bail_out(int c);
|
||||
void vidc_term_emu(int c);
|
||||
void get_pos(void);
|
||||
void curs_move(int x, int y);
|
||||
void write_char(int c, int fg, int bg);
|
||||
void scroll_up(int rows, int fg, int bg);
|
||||
void CD(void);
|
||||
void CM(void);
|
||||
void HO(void);
|
||||
|
||||
static int args[MAXARGS], argc;
|
||||
static int fg_c, bg_c, curx, cury;
|
||||
static int esc;
|
||||
#endif
|
||||
|
||||
static unsigned short *crtat, *Crtat;
|
||||
static int row = 25, col = 80;
|
||||
#ifdef TERM_EMU
|
||||
static u_int8_t ibmpc_to_pc98[256] = {
|
||||
0x01, 0x21, 0x81, 0xa1, 0x41, 0x61, 0xc1, 0xe1,
|
||||
0x09, 0x29, 0x89, 0xa9, 0x49, 0x69, 0xc9, 0xe9,
|
||||
0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25,
|
||||
0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25,
|
||||
0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
|
||||
0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
|
||||
0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
|
||||
0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
|
||||
0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45,
|
||||
0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45,
|
||||
0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65,
|
||||
0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65,
|
||||
0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5,
|
||||
0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5,
|
||||
0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5,
|
||||
0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5,
|
||||
|
||||
0x03, 0x23, 0x83, 0xa3, 0x43, 0x63, 0xc3, 0xe3,
|
||||
0x0b, 0x2b, 0x8b, 0xab, 0x4b, 0x6b, 0xcb, 0xeb,
|
||||
0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f,
|
||||
0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f,
|
||||
0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
|
||||
0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
|
||||
0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
|
||||
0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
|
||||
0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
|
||||
0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
|
||||
0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f,
|
||||
0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f,
|
||||
0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf,
|
||||
0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf,
|
||||
0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef,
|
||||
0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef,
|
||||
};
|
||||
#define at2pc98(fg_at, bg_at) ibmpc_to_pc98[((bg_at) << 4) | (fg_at)]
|
||||
#endif /* TERM_EMU */
|
||||
|
||||
struct console vidconsole = {
|
||||
"vidconsole",
|
||||
"internal video/keyboard",
|
||||
0,
|
||||
vidc_probe,
|
||||
vidc_init,
|
||||
vidc_putchar,
|
||||
vidc_getchar,
|
||||
vidc_ischar
|
||||
};
|
||||
|
||||
static void
|
||||
vidc_probe(struct console *cp)
|
||||
{
|
||||
|
||||
/* look for a keyboard */
|
||||
#if KEYBOARD_PROBE
|
||||
if (probe_keyboard())
|
||||
#endif
|
||||
{
|
||||
|
||||
cp->c_flags |= C_PRESENTIN;
|
||||
}
|
||||
|
||||
/* XXX for now, always assume we can do BIOS screen output */
|
||||
cp->c_flags |= C_PRESENTOUT;
|
||||
}
|
||||
|
||||
static int
|
||||
vidc_init(int arg)
|
||||
{
|
||||
int i, hw_cursor;
|
||||
|
||||
if (vidc_started && arg == 0)
|
||||
return (0);
|
||||
vidc_started = 1;
|
||||
Crtat = (unsigned short *)PTOV(0xA0000);
|
||||
while ((inb(0x60) & 0x04) == 0)
|
||||
;
|
||||
outb(0x62, 0xe0);
|
||||
while ((inb(0x60) & 0x01) == 0)
|
||||
;
|
||||
hw_cursor = inb(0x62);
|
||||
hw_cursor |= (inb(0x62) << 8);
|
||||
inb(0x62);
|
||||
inb(0x62);
|
||||
inb(0x62);
|
||||
crtat = Crtat + hw_cursor;
|
||||
#ifdef TERM_EMU
|
||||
/* Init terminal emulator */
|
||||
end_term();
|
||||
get_pos();
|
||||
curs_move(curx, cury);
|
||||
fg_c = DEFAULT_FGCOLOR;
|
||||
bg_c = DEFAULT_BGCOLOR;
|
||||
#endif
|
||||
for (i = 0; i < 10 && vidc_ischar(); i++)
|
||||
(void)vidc_getchar();
|
||||
return (0); /* XXX reinit? */
|
||||
}
|
||||
|
||||
static void
|
||||
beep(void)
|
||||
{
|
||||
|
||||
outb(0x37, 6);
|
||||
delay(40000);
|
||||
outb(0x37, 7);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void
|
||||
vidc_biosputchar(int c)
|
||||
{
|
||||
unsigned short *cp;
|
||||
int i, pos;
|
||||
|
||||
#ifdef TERM_EMU
|
||||
*crtat = (c == 0x5c ? 0xfc : c);
|
||||
*(crtat + 0x1000) = at2pc98(fg, bg);
|
||||
#else
|
||||
switch(c) {
|
||||
case '\b':
|
||||
crtat--;
|
||||
break;
|
||||
case '\r':
|
||||
crtat -= (crtat - Crtat) % col;
|
||||
break;
|
||||
case '\n':
|
||||
crtat += col;
|
||||
break;
|
||||
default:
|
||||
*crtat = (c == 0x5c ? 0xfc : c);
|
||||
*(crtat++ + 0x1000) = 0xe1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (crtat >= Crtat + col * row) {
|
||||
cp = Crtat;
|
||||
for (i = 1; i < row; i++) {
|
||||
bcopy((void *)(cp + col), (void *)cp, col * 2);
|
||||
cp += col;
|
||||
}
|
||||
for (i = 0; i < col; i++) {
|
||||
*cp++ = ' ';
|
||||
}
|
||||
crtat -= col;
|
||||
}
|
||||
pos = crtat - Crtat;
|
||||
while ((inb(0x60) & 0x04) == 0) {}
|
||||
outb(0x62, 0x49);
|
||||
outb(0x60, pos & 0xff);
|
||||
outb(0x60, pos >> 8);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
vidc_rawputchar(int c)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (c == '\t')
|
||||
/* lame tab expansion */
|
||||
for (i = 0; i < 8; i++)
|
||||
vidc_rawputchar(' ');
|
||||
else {
|
||||
/* Emulate AH=0eh (teletype output) */
|
||||
switch(c) {
|
||||
case '\a':
|
||||
beep();
|
||||
return;
|
||||
case '\r':
|
||||
curx = 0;
|
||||
curs_move(curx, cury);
|
||||
return;
|
||||
case '\n':
|
||||
cury++;
|
||||
if (cury > 24) {
|
||||
scroll_up(1, fg_c, bg_c);
|
||||
cury--;
|
||||
} else {
|
||||
curs_move(curx, cury);
|
||||
}
|
||||
return;
|
||||
case '\b':
|
||||
if (curx > 0) {
|
||||
curx--;
|
||||
curs_move(curx, cury);
|
||||
/* write_char(' ', fg_c, bg_c); XXX destructive(!) */
|
||||
return;
|
||||
}
|
||||
return;
|
||||
default:
|
||||
write_char(c, fg_c, bg_c);
|
||||
curx++;
|
||||
if (curx > 79) {
|
||||
curx = 0;
|
||||
cury++;
|
||||
}
|
||||
if (cury > 24) {
|
||||
curx = 0;
|
||||
scroll_up(1, fg_c, bg_c);
|
||||
cury--;
|
||||
}
|
||||
}
|
||||
curs_move(curx, cury);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef TERM_EMU
|
||||
|
||||
/* Get cursor position on the screen. Result is in edx. Sets
|
||||
* curx and cury appropriately.
|
||||
*/
|
||||
void
|
||||
get_pos(void)
|
||||
{
|
||||
int pos = crtat - Crtat;
|
||||
|
||||
curx = pos % col;
|
||||
cury = pos / col;
|
||||
}
|
||||
|
||||
/* Move cursor to x rows and y cols (0-based). */
|
||||
void
|
||||
curs_move(int x, int y)
|
||||
{
|
||||
int pos;
|
||||
|
||||
pos = x + y * col;
|
||||
crtat = Crtat + pos;
|
||||
pos = crtat - Crtat;
|
||||
while((inb(0x60) & 0x04) == 0) {}
|
||||
outb(0x62, 0x49);
|
||||
outb(0x60, pos & 0xff);
|
||||
outb(0x60, pos >> 8);
|
||||
curx = x;
|
||||
cury = y;
|
||||
#define isvisible(c) (((c) >= 32) && ((c) < 255))
|
||||
if (!isvisible(*crtat & 0x00ff)) {
|
||||
write_char(' ', fg_c, bg_c);
|
||||
}
|
||||
}
|
||||
|
||||
/* Scroll up the whole window by a number of rows. If rows==0,
|
||||
* clear the window. fg and bg are attributes for the new lines
|
||||
* inserted in the window.
|
||||
*/
|
||||
void
|
||||
scroll_up(int rows, int fgcol, int bgcol)
|
||||
{
|
||||
unsigned short *cp;
|
||||
int i;
|
||||
|
||||
if (rows == 0)
|
||||
rows = 25;
|
||||
cp = Crtat;
|
||||
for (i = rows; i < row; i++) {
|
||||
bcopy((void *)(cp + col), (void *)cp, col * 2);
|
||||
cp += col;
|
||||
}
|
||||
for (i = 0; i < col; i++) {
|
||||
*(cp + 0x1000) = at2pc98(fgcol, bgcol);
|
||||
*cp++ = ' ';
|
||||
}
|
||||
}
|
||||
|
||||
/* Write character and attribute at cursor position. */
|
||||
void
|
||||
write_char(int c, int fgcol, int bgcol)
|
||||
{
|
||||
|
||||
*crtat = (c == 0x5c ? 0xfc : (c & 0xff));
|
||||
*(crtat + 0x1000) = at2pc98(fgcol, bgcol);
|
||||
}
|
||||
|
||||
/**************************************************************/
|
||||
/*
|
||||
* Screen manipulation functions. They use accumulated data in
|
||||
* args[] and argc variables.
|
||||
*
|
||||
*/
|
||||
|
||||
/* Clear display from current position to end of screen */
|
||||
void
|
||||
CD(void)
|
||||
{
|
||||
int pos;
|
||||
|
||||
get_pos();
|
||||
for (pos = 0; crtat + pos <= Crtat + col * row; pos++) {
|
||||
*(crtat + pos) = ' ';
|
||||
*(crtat + pos + 0x1000) = at2pc98(fg_c, bg_c);
|
||||
}
|
||||
end_term();
|
||||
}
|
||||
|
||||
/* Absolute cursor move to args[0] rows and args[1] columns
|
||||
* (the coordinates are 1-based).
|
||||
*/
|
||||
void
|
||||
CM(void)
|
||||
{
|
||||
|
||||
if (args[0] > 0)
|
||||
args[0]--;
|
||||
if (args[1] > 0)
|
||||
args[1]--;
|
||||
curs_move(args[1], args[0]);
|
||||
end_term();
|
||||
}
|
||||
|
||||
/* Home cursor (left top corner) */
|
||||
void
|
||||
HO(void)
|
||||
{
|
||||
|
||||
argc = 1;
|
||||
args[0] = args[1] = 1;
|
||||
CM();
|
||||
}
|
||||
|
||||
/* Clear internal state of the terminal emulation code */
|
||||
void
|
||||
end_term(void)
|
||||
{
|
||||
|
||||
esc = 0;
|
||||
argc = -1;
|
||||
}
|
||||
|
||||
/* Gracefully exit ESC-sequence processing in case of misunderstanding */
|
||||
void
|
||||
bail_out(int c)
|
||||
{
|
||||
char buf[16], *ch;
|
||||
int i;
|
||||
|
||||
if (esc) {
|
||||
vidc_rawputchar('\033');
|
||||
if (esc != '\033')
|
||||
vidc_rawputchar(esc);
|
||||
for (i = 0; i <= argc; ++i) {
|
||||
sprintf(buf, "%d", args[i]);
|
||||
ch = buf;
|
||||
while (*ch)
|
||||
vidc_rawputchar(*ch++);
|
||||
}
|
||||
}
|
||||
vidc_rawputchar(c);
|
||||
end_term();
|
||||
}
|
||||
|
||||
static void
|
||||
get_arg(int c)
|
||||
{
|
||||
|
||||
if (argc < 0)
|
||||
argc = 0;
|
||||
args[argc] *= 10;
|
||||
args[argc] += c - '0';
|
||||
}
|
||||
|
||||
/* Emulate basic capabilities of cons25 terminal */
|
||||
void
|
||||
vidc_term_emu(int c)
|
||||
{
|
||||
static int ansi_col[] = {
|
||||
0, 4, 2, 6, 1, 5, 3, 7,
|
||||
};
|
||||
int t;
|
||||
int i;
|
||||
|
||||
switch (esc) {
|
||||
case 0:
|
||||
switch (c) {
|
||||
case '\033':
|
||||
esc = c;
|
||||
break;
|
||||
default:
|
||||
vidc_rawputchar(c);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case '\033':
|
||||
switch (c) {
|
||||
case '[':
|
||||
esc = c;
|
||||
args[0] = 0;
|
||||
argc = -1;
|
||||
break;
|
||||
default:
|
||||
bail_out(c);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case '[':
|
||||
switch (c) {
|
||||
case ';':
|
||||
if (argc < 0) /* XXX */
|
||||
argc = 0;
|
||||
else if (argc + 1 >= MAXARGS)
|
||||
bail_out(c);
|
||||
else
|
||||
args[++argc] = 0;
|
||||
break;
|
||||
case 'H':
|
||||
if (argc < 0)
|
||||
HO();
|
||||
else if (argc == 1)
|
||||
CM();
|
||||
else
|
||||
bail_out(c);
|
||||
break;
|
||||
case 'J':
|
||||
if (argc < 0)
|
||||
CD();
|
||||
else
|
||||
bail_out(c);
|
||||
break;
|
||||
case 'm':
|
||||
if (argc < 0) {
|
||||
fg_c = DEFAULT_FGCOLOR;
|
||||
bg_c = DEFAULT_BGCOLOR;
|
||||
}
|
||||
for (i = 0; i <= argc; ++i) {
|
||||
switch (args[i]) {
|
||||
case 0: /* back to normal */
|
||||
fg_c = DEFAULT_FGCOLOR;
|
||||
bg_c = DEFAULT_BGCOLOR;
|
||||
break;
|
||||
case 1: /* bold */
|
||||
fg_c |= 0x8;
|
||||
break;
|
||||
case 4: /* underline */
|
||||
case 5: /* blink */
|
||||
bg_c |= 0x8;
|
||||
break;
|
||||
case 7: /* reverse */
|
||||
t = fg_c;
|
||||
fg_c = bg_c;
|
||||
bg_c = t;
|
||||
break;
|
||||
case 30: case 31: case 32: case 33:
|
||||
case 34: case 35: case 36: case 37:
|
||||
fg_c = ansi_col[args[i] - 30];
|
||||
break;
|
||||
case 39: /* normal */
|
||||
fg_c = DEFAULT_FGCOLOR;
|
||||
break;
|
||||
case 40: case 41: case 42: case 43:
|
||||
case 44: case 45: case 46: case 47:
|
||||
bg_c = ansi_col[args[i] - 40];
|
||||
break;
|
||||
case 49: /* normal */
|
||||
bg_c = DEFAULT_BGCOLOR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
end_term();
|
||||
break;
|
||||
default:
|
||||
if (isdigit(c))
|
||||
get_arg(c);
|
||||
else
|
||||
bail_out(c);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
bail_out(c);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
vidc_putchar(int c)
|
||||
{
|
||||
#ifdef TERM_EMU
|
||||
vidc_term_emu(c);
|
||||
#else
|
||||
vidc_rawputchar(c);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int
|
||||
vidc_getchar(void)
|
||||
{
|
||||
|
||||
if (vidc_ischar()) {
|
||||
v86.ctl = 0;
|
||||
v86.addr = 0x18;
|
||||
v86.eax = 0x0;
|
||||
v86int();
|
||||
return (v86.eax & 0xff);
|
||||
} else {
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
vidc_ischar(void)
|
||||
{
|
||||
|
||||
v86.ctl = 0;
|
||||
v86.addr = 0x18;
|
||||
v86.eax = 0x100;
|
||||
v86int();
|
||||
return ((v86.ebx >> 8) & 0x1);
|
||||
}
|
||||
|
||||
#if KEYBOARD_PROBE
|
||||
static int
|
||||
probe_keyboard(void)
|
||||
{
|
||||
return (*(u_char *)PTOV(0xA1481) & 0x48);
|
||||
}
|
||||
#endif /* KEYBOARD_PROBE */
|
@ -1,99 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.include <src.opts.mk>
|
||||
MK_SSP= no
|
||||
MAN=
|
||||
|
||||
LOADER?= loader
|
||||
PROG= ${LOADER}.sym
|
||||
INTERNALPROG=
|
||||
NEWVERSWHAT= "bootstrap loader" pc98
|
||||
VERSION_FILE= ${.CURDIR}/../../i386/loader/version
|
||||
|
||||
# architecture-specific loader code
|
||||
SRCS= main.c conf.c vers.c
|
||||
.PATH: ${.CURDIR}/../../i386/loader
|
||||
|
||||
# Enable PXE TFTP or NFS support, not both.
|
||||
.if defined(LOADER_TFTP_SUPPORT)
|
||||
CFLAGS+= -DLOADER_TFTP_SUPPORT
|
||||
.else
|
||||
CFLAGS+= -DLOADER_NFS_SUPPORT
|
||||
.endif
|
||||
|
||||
# Include bcache code.
|
||||
HAVE_BCACHE= yes
|
||||
|
||||
# Enable PnP and ISA-PnP code.
|
||||
HAVE_PNP= yes
|
||||
HAVE_ISABUS= yes
|
||||
|
||||
.if ${MK_FORTH} != "no"
|
||||
# Enable BootForth
|
||||
BOOT_FORTH= yes
|
||||
CFLAGS+= -DBOOT_FORTH -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/i386
|
||||
LIBFICL= ${.OBJDIR}/../../ficl/libficl.a
|
||||
.endif
|
||||
|
||||
.if defined(LOADER_BZIP2_SUPPORT)
|
||||
CFLAGS+= -DLOADER_BZIP2_SUPPORT
|
||||
.endif
|
||||
.if !defined(LOADER_NO_GZIP_SUPPORT)
|
||||
CFLAGS+= -DLOADER_GZIP_SUPPORT
|
||||
.endif
|
||||
|
||||
# Always add MI sources
|
||||
.PATH: ${.CURDIR}/../../common
|
||||
.include "${.CURDIR}/../../common/Makefile.inc"
|
||||
CFLAGS+= -I${.CURDIR}/../../common
|
||||
CFLAGS+= -I${.CURDIR}/../../i386
|
||||
CFLAGS+= -I.
|
||||
|
||||
CLEANFILES= ${LOADER} ${LOADER}.bin loader.help
|
||||
|
||||
CFLAGS+= -Wall
|
||||
LDFLAGS= -static -Ttext 0x0
|
||||
|
||||
# pc98 standalone support library
|
||||
LIBPC98= ${.OBJDIR}/../libpc98/libpc98.a
|
||||
CFLAGS+= -I${.CURDIR}/..
|
||||
|
||||
LIBSTAND= ${.OBJDIR}/../../libstand32/libstand.a
|
||||
|
||||
# BTX components
|
||||
CFLAGS+= -I${.CURDIR}/../btx/lib
|
||||
|
||||
# Debug me!
|
||||
#CFLAGS+= -g
|
||||
#LDFLAGS+= -g
|
||||
|
||||
# Pick up ../Makefile.inc early.
|
||||
.include <bsd.init.mk>
|
||||
|
||||
${LOADER}: ${LOADER}.bin ${BTXLDR} ${BTXKERN}
|
||||
btxld -v -f aout -e ${LOADER_ADDRESS} -o ${.TARGET} -l ${BTXLDR} \
|
||||
-b ${BTXKERN} ${LOADER}.bin
|
||||
|
||||
${LOADER}.bin: ${LOADER}.sym
|
||||
cp ${.ALLSRC} ${.TARGET}
|
||||
strip -R .comment -R .note ${.TARGET}
|
||||
|
||||
loader.help: help.common help.pc98
|
||||
cat ${.ALLSRC} | awk -f ${.CURDIR}/../../common/merge_help.awk > ${.TARGET}
|
||||
|
||||
FILES= ${LOADER}
|
||||
# XXX INSTALLFLAGS_loader= -b
|
||||
FILESMODE_${LOADER}= ${BINMODE} -b
|
||||
|
||||
.PATH: ${.CURDIR}/../../forth
|
||||
.include "${.CURDIR}/../../forth/Makefile.inc"
|
||||
|
||||
FILES+= ${.CURDIR}/../../i386/loader/loader.rc menu.rc
|
||||
|
||||
# XXX crt0.o needs to be first for pxeboot(8) to work
|
||||
OBJS= ${BTXCRT}
|
||||
|
||||
DPADD= ${LIBFICL} ${LIBPC98} ${LIBSTAND}
|
||||
LDADD= ${LIBFICL} ${LIBPC98} ${LIBSTAND}
|
||||
|
||||
.include <bsd.prog.mk>
|
@ -1,116 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stand.h>
|
||||
#include <bootstrap.h>
|
||||
#include "libi386/libi386.h"
|
||||
|
||||
/*
|
||||
* We could use linker sets for some or all of these, but
|
||||
* then we would have to control what ended up linked into
|
||||
* the bootstrap. So it's easier to conditionalise things
|
||||
* here.
|
||||
*
|
||||
* XXX rename these arrays to be consistent and less namespace-hostile
|
||||
*
|
||||
* XXX as libi386 and biosboot merge, some of these can become linker sets.
|
||||
*/
|
||||
|
||||
/* Exported for libstand */
|
||||
struct devsw *devsw[] = {
|
||||
&bioscd,
|
||||
&biosdisk,
|
||||
#if defined(LOADER_NFS_SUPPORT) || defined(LOADER_TFTP_SUPPORT)
|
||||
&pxedisk,
|
||||
#endif
|
||||
NULL
|
||||
};
|
||||
|
||||
struct fs_ops *file_system[] = {
|
||||
&ufs_fsops,
|
||||
&ext2fs_fsops,
|
||||
&dosfs_fsops,
|
||||
&cd9660_fsops,
|
||||
#ifdef LOADER_NFS_SUPPORT
|
||||
&nfs_fsops,
|
||||
#endif
|
||||
#ifdef LOADER_TFTP_SUPPORT
|
||||
&tftp_fsops,
|
||||
#endif
|
||||
#ifdef LOADER_GZIP_SUPPORT
|
||||
&gzipfs_fsops,
|
||||
#endif
|
||||
#ifdef LOADER_BZIP2_SUPPORT
|
||||
&bzipfs_fsops,
|
||||
#endif
|
||||
&splitfs_fsops,
|
||||
NULL
|
||||
};
|
||||
|
||||
/* Exported for i386 only */
|
||||
/*
|
||||
* Sort formats so that those that can detect based on arguments
|
||||
* rather than reading the file go first.
|
||||
*/
|
||||
extern struct file_format i386_elf;
|
||||
extern struct file_format i386_elf_obj;
|
||||
|
||||
struct file_format *file_formats[] = {
|
||||
&i386_elf,
|
||||
&i386_elf_obj,
|
||||
NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* Consoles
|
||||
*
|
||||
* We don't prototype these in libi386.h because they require
|
||||
* data structures from bootstrap.h as well.
|
||||
*/
|
||||
extern struct console vidconsole;
|
||||
extern struct console comconsole;
|
||||
extern struct console nullconsole;
|
||||
|
||||
struct console *consoles[] = {
|
||||
&vidconsole,
|
||||
&comconsole,
|
||||
&nullconsole,
|
||||
NULL
|
||||
};
|
||||
|
||||
extern struct pnphandler isapnphandler;
|
||||
extern struct pnphandler biospnphandler;
|
||||
extern struct pnphandler biospcihandler;
|
||||
|
||||
struct pnphandler *pnphandlers[] = {
|
||||
&biospnphandler, /* should go first, as it may set isapnp_readport */
|
||||
&isapnphandler,
|
||||
&biospcihandler,
|
||||
NULL
|
||||
};
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user