This repository contains:
- Linux: 7.1, i386SX/DX and i486SX/DX port, with NEC PC-9800 machine support
- Debian: 13 "trixie", i486DX port, with NEC PC-9800 utils
- glibc: 2.41, i486DX port
- BusyBox: i386SX port
- qemu: 11.0, NEC PC-9800 support with compatible BIOS
- bootsimple: assembly-only FAT16 VMLINUX loader for the BusyBox images
- zedBSD: boot OS used by the Debian images (external/zedBSD submodule)
Each component is reusable for other retro PCs.
Clone it with its maintained toolchain and emulator sources:
git clone --recurse-submodules https://github.com/awemorris/linux-pc98.gitFor an existing checkout, initialize the same sources with:
git submodule update --init --recursive32-bit PC-98 systems were sold with i386SX, i386DX, i486SX, i486DX, Pentium, Pentium MMX, Pentium II, and Pentium-II-class Celeron processors. Linux/PC-98 has been ported to the i386SX, i386DX, i486SX, i486DX, and i686 execution classes needed to cover these machines.
| Physical CPU | Linux build | Userland | Packages | Minimum RAM |
|---|---|---|---|---|
| i386SX or i386DX | PC-98 i386 | i386SX-compatible static musl/BusyBox | included in the CF image | 5 MiB |
| i486SX | PC-98 i486 with software floating point | static musl/BusyBox | included in the CF image | 5 MiB |
| i486DX, Pentium, or Pentium MMX | PC-98 i486 | Debian 13/i486DX with the maintained glibc i486 port | project-built repository; publication pending | 64 MiB |
| Pentium II or Pentium-II-class Celeron | PC-98 i686 | Debian 13/i686 | official Debian packages | 64 MiB |
The i386 release image uses the i386SX baseline and therefore also runs on i386DX systems. The custom Debian port deliberately uses i486DX, including its hardware floating-point unit, as its minimum ABI. It is also the Debian choice for Pentium and Pentium MMX systems, which do not satisfy the i686 baseline used by current official Debian packages. Pentium II systems can run the official Debian userland unchanged with the PC-98 i686 kernel.
The custom i486 package repository is not public yet. Publishing its packages
is the next distribution milestone. Testing has established that both Debian
variants require at least 64 MiB of physical RAM for reliable operation; the
smaller BusyBox systems are the supported choice below that threshold. The
published i486 image bypasses /bin/login and PAM and starts a root /bin/sh
directly, avoiding login timeouts and memory exhaustion on slower machines.
| Path | Contents |
|---|---|
external/kernel/linux-2.6.7-pc98-original/ |
Immutable last-complete upstream PC-9800 source snapshot from immediately before its 2004 removal |
external/kernel/linux-7.1/ |
Linux 7.1 source tree with the clean PC-98 port integrated |
external/qemu-pc98/ |
qemu-pc98 submodule used for i386 and PC-98 validation |
external/gcc, external/musl, external/glibc |
Toolchain submodules; versioned patch inventory in external/patchsets/ |
external/debian-i486/ |
Framework and patch database for the Debian 13/i486DX package port |
configs/ |
Debian-derived i686 base and versioned PC-98 configurations |
bootsimple/ |
Assembly PC-98 IPL, FAT16 PBR, and direct VMLINUX loader for BusyBox images |
external/zedBSD/ |
zedBSD boot OS submodule used as the Debian image bootloader and menu |
external/noct/ |
NoctLang submodule used to precompile Remacs for product images |
bootloader/ |
Linux product overlay; fs/ mirrors its BOOT FAT placement |
scripts/ |
Internal build, image, test, publication scripts and disk-image tools |
build/ |
Generated kernel, rootfs, logs, and disk images; ignored by Git |
build.sh |
Single supported entry point for all project builds |
Nix is not required. The build uses standard packages available on Debian 13.
See external/TOOLCHAIN.md for the exact source baselines, local-source
integration, patch regeneration, update procedure, and automated patch
replay check.
The historical Linux 2.6.7 tree is retained as immutable source and
provenance material; it is not used by the build. The direct clean port to
the current Linux 7.1 tree is documented in external/kernel/audit/.
The supported Debian target is the glibc 2.41 i486DX port maintained in the
external/glibc submodule. It uses the i486 native atomic instructions and
serves i486DX, Pentium, and Pentium MMX machines. An exact-i386 glibc research
target also passes its dedicated validation suite, but it is not a Debian
distribution target. It depends on a versioned kernel atomic syscall because
the original 80386 lacks CMPXCHG and XADD.
After the static-musl i386 Buildroot toolchain has been built, the complete validation workflow is:
./build.sh glibc i486
./build.sh glibc-tests i486
./scripts/build-glibc-busybox.sh i486For exact-i386 research, replace i486 with i386 and additionally run
scripts/check-glibc-i386-opcodes.sh.
See external/patchsets/glibc/ for the per-release patch inventory, security
constraints and validation notes covering the exact-i386 research work. Debian
i486 packaging is tracked in external/debian-i486/.
On Debian 13, install the build, image-generation, and headless-test dependencies with:
./build.sh setupThe package inventory is kept in scripts/setup-packages.txt and can still be
passed to apt manually. Use ./build.sh setup --help for unattended and
apt update controls.
Root privileges are used when creating the Debian staging tree, installing kernel modules into it, and generating the ext4 filesystem image.
The Debian images retain the prebuilt
external/zedBSD/platform/pc98/dos/linux98.exe, stored as LINUX98.EXE in
their FAT16 boot partitions. BusyBox images do not contain this DOS loader:
their assembly-only IO.SYS loads VMLINUX directly. Normal builds therefore
do not require OpenWatcom. Maintainers rebuilding LINUX98.EXE must install
OpenWatcom 1.9 and run ./build.sh dos-loader; set WATCOM if it is not
installed at /home/awe/openwatcom-1.9.
The development image installs the same Debian 13 dependencies but keeps the
source tree outside the container. Build it from the repository root and mount
the checkout at /work/linux-pc98:
docker build -t linux-pc98-build .
docker run --rm -it \
-v "$PWD:/work/linux-pc98" \
linux-pc98-build ./build.sh --helpPass --build-arg HOST_UID=$(id -u) --build-arg HOST_GID=$(id -g) when the
host user is not UID/GID 1000. Add --device /dev/kvm only when a test
explicitly uses KVM; the normal PC-98 smoke tests use TCG. OpenWatcom is not
redistributed in the image and must be mounted separately when building
LINUX98.EXE; ordinary image builds use its checked-in binary.
Public images continue to use the PC-98 VRAM console. Reproducible private test images with a PC-98 serial console can be prepared and run with:
./build.sh test busybox-i386
./build.sh test debian13-i486The guest serial port is attached to the current terminal. Use
--prepare-only to build without starting QEMU, or run a bounded smoke test:
./build.sh test debian13-i486 --timeout 120 \
--log build/tests/debian13-i486/serial.logRun ./build.sh test --help for QEMU, BIOS, memory, and image overrides.
Linux 7.1 is the only maintained kernel tree and the default build target:
./build.sh debianOn the first run, this script creates a rootfs from Debian trixie's official
i386 archive in build/debian-i386-root. Despite the Debian architecture
name, these official binaries use an i686-class baseline and are intended for
Pentium II or newer systems. The script then builds Linux, installs the
modules, builds the PC-98 loaders, and creates:
build/qemu-pc98-linux-7.1.raw
The kernel is built out of tree in build/kernel-7.1; external/kernel/linux-7.1/ remains
a source-only directory. KERNEL_VERSION=7.1 may still be specified
explicitly for automated builds.
The individual build stages can also be run separately:
./build.sh rootfs debian13-i486
./build.sh kernel --cpu 486
./build.sh image debian13-i486-ideTo build the complete public artifact set with canonical filenames:
./build.sh release --version v0.6.0This is the only supported command for a public Release. It builds all six
disk images, standalone kernels and loaders, and qemu-pc98-win64.zip under
build/releases/. XZ_LEVEL and XZ_THREADS can override compression.
The fixed Release text is read from releases/v0.6.0.md. Maintainers may also
pass --publish-rootfs-cache to refresh the reusable rootfs archives on the
package server.
Use ./build.sh image list to list the supported variants. Every image is
created through a named profile, for example:
./build.sh image busybox-i386-ide
./build.sh image busybox-i386-scsi55
./build.sh image busybox-i386-scsi92
./build.sh image debian13-i486-ide
./build.sh image debian13-i486-scsi92
./build.sh image debian13-i486-scsi55The commands above are intended for development and may use --output for
temporary experiments. Images handed to testers or uploaded as release
artifacts must instead be generated with the canonical command:
./build.sh release-image busybox-i386-ide
./build.sh release-image busybox-i386-scsi55
./build.sh release-image busybox-i386-scsi92
./build.sh release-image debian13-i486-ide
./build.sh release-image debian13-i486-scsi55
./build.sh release-image debian13-i486-scsi92Each command writes only its fixed filename under build/releases/. It
builds a temporary image in the same directory and atomically replaces the
canonical image after successful completion, together with its SHA-256 file.
./build.sh release-image all rebuilds all six variants. Diagnostic suffixes
must not be added to files in build/releases/. Use ./build.sh release for
the complete compressed public artifact set.
The BusyBox i386 IDE image is below 160 MiB and uses H=8/S=17, which matches
most PC-98 IDE BIOS implementations. Only IDE images of 20 MiB or less use the
legacy small-disk geometry H=4/S=17. Other IDE profiles use H=8/S=17. PC-9801-92 SCSI
profiles use H=8/S=32 and therefore require a separate disk image even when
the files stored in the partitions are identical. PC-9801-55-compatible
profiles, including WINnote98, use H=8/S=17. Every release image has a
128 MiB FAT16 BOOT partition. Debian images put zedBSD's 64 MiB /swapfile
there; BusyBox images reserve the same partition size but contain only the
direct-loader files and VMLINUX. This swapfile is separate from the Linux
swap partition. The old profile names ending in plain -scsi remain aliases
for -scsi92. Partition sizes are defined in
bytes and rounded up to whole cylinders, so changing geometry does not nearly
double the SCSI image capacity. The i386 IDE image uses the small pc98_ide
driver (/dev/hda, with a second disk at /dev/hdb); i386 SCSI and both
i486/libata images use the standard
SCSI disk namespace (/dev/sda).
Both bootsimple and zedBSD/LINUX98.EXE pass the BIOS SENSE drive number and
logical H/S to Linux in SETUP_PC98_DISK setup-data records. bootsimple also
enumerates additional BIOS IDE drives. The PC-9801-55/92 driver uses the
record when decoding the boot disk's NEC98 partition table. For an older
loader which does not provide it, pc9801_scsi=55 selects the 8/17 fallback;
the default pc9801_scsi=92 fallback is 8/32.
The same argument can override the Linux IRQ and PC-98 DMA channel for a fixed-configuration or compatible board:
pc9801_scsi=55,irq=5,dma=0,clock=12
pc9801_scsi=92,irq=5,dma=0,clock=8
Valid Linux IRQ values are 3, 5, 6, 9, 12, and 13; valid DMA channels are
0, 2, and 3. A plain pc9801_scsi=55 selects the fixed WINnote98/
PC-9801-55 defaults IRQ 5 (board INT1), DMA 0, and the WD33C93 12--15 MHz
clock range used by the historical Linux/98 driver. clock= accepts 8, 12,
or 16 for the controller's 8--10, 12--15, or 16--20 MHz range. With the 92
profile, omitted IRQ and DMA values continue to be read from the board
configuration registers and the clock defaults to the 8--10 MHz range.
mode=dma and mode=async-pio select the data-transfer path. The 92
profile defaults to the historical DMA path. The 55 release images pass
mode=async-pio: on the physically tested WINnote98 the board's DMA
gate never delivers a request to the PC-98 DMA controller (its count
register stays at the programmed value), so the DMA path cannot work
there, while asynchronous PIO boots reliably. Boards with a working
DMA path can still request mode=dma explicitly.
A BlueSCSI target on PC-98 requires a bluescsi.ini on its SD card;
without it the firmware's Apple-oriented default quirks stall the
PC-9801-55/92 driver at the phase level:
[SCSI]
Quirks = 0
EnableSCSI2 = 0
MaxSyncSpeed = 5
Debug = 0BusyBox images use bootsimple. Its LBA0 enters LBA2, the selector loads the
PBR of the FAT16 partition named BOOT, and the PBR loads contiguous IO.SYS
as an ordinary FAT file. IO.SYS is assembly code which SENSEs the disk,
loads the root-directory file VMLINUX directly as ELF32, constructs Linux
boot parameters and PC-98 disk setup-data, then enters Linux. Each phase is
shown on the PC-98 text screen so a real-machine stop can be localized.
./build.sh bootsimple-test verifies the loader and generated-image layout.
Debian images retain zedBSD as the graphical boot OS. zedBSD starts /bin/sh;
the Linux product overlay supplies /etc/zinit.rc, the Noct menu, Emacs and
Holoris, and starts Linux through /bin/linux. A bare zedBSD image has no
startup script and enters the shell directly.
INST.EXE performs the three raw installation operations needed after a DOS
partitioning/formatting tool has prepared the target volume. Keep
IPL-LBA0.IMG, IPL-LBA2.IMG, IPL-PART.IMG, and IO.SYS beside
INST.EXE. Select the
target partition as the current DOS drive before installing the disk IPL:
C:
A:\INST /LBA0
A:\INST /LBA2
A:\INST /PART C:
The first two operations map the current DOS drive back to its physical IDE
disk. /PART copies IO.SYS as a hidden/system/read-only FAT16 file,
verifies its traditional contiguous system-file layout, and installs the
1024-byte PBR while preserving the BPB. BOOT.SYS, VMLINUX, and
BOOT.CFG remain ordinary DOS file copies.
Every generated BOOT partition also contains INST.EXE, IPL-LBA0.IMG,
IPL-LBA2.IMG, and IPL-PART.IMG, so the installed image itself can be used
as the source for installing BOOT98 onto another DOS-visible disk.
A test kernel can be installed while creating an image:
./build.sh image debian13-i486-ide \
--kernel build/test-kernel/vmlinux.boot \
--output build/images/test-kernel.rawTo derive a test image without rebuilding its root filesystem, pass either a local raw/raw.xz file or a package-server base name:
./build.sh image debian13-i486-ide \
--base-image debian13-i486-boot98-base \
--kernel build/test-kernel/vmlinux.boot \
--output build/images/test-from-base.rawFetched archives are verified and retained in
${XDG_CACHE_HOME:-~/.cache}/linux-pc98/images. Maintainers can publish an
exact base without exploring the rental server:
./build.sh cache publish debian13-i486-boot98-base \
build/images/debian13-i486-ide.rawThis updates only the documented
www/noctvm.io/debian-i486/images/pc98/bases/ directory and its matching
SHA-256 file.
Root filesystem trees are cached independently from complete disk images:
./build.sh rootfs-cache fetch busybox-i386-video-buildroot-2026.05
./build.sh rootfs-cache materialize debian13-i486-trixie-v1 build/rootfs-copy
./build.sh rootfs-cache store NAME ROOTFS-DIR
./build.sh rootfs-cache publish NAME ROOTFS-DIRLocal archives live under ${XDG_CACHE_HOME:-~/.cache}/linux-pc98/rootfs.
Fetches use HTTPS and verify both SHA-256 and xz integrity. Publication writes
only to www/noctvm.io/debian-i486/images/pc98/rootfs/.
The v0.6.0 Release set consists of the following persistent CF/HDD images. The Debian images use the full PC-98 kernel configuration and require 64 MiB.
| Image | Geometry and purpose | Userland | Minimum RAM | Raw size limit |
|---|---|---|---|---|
linux-pc98-i386sx-busybox-ide.img.xz |
IDE H=8/S=17 on i386SX/DX machines | static musl/BusyBox | 5 MiB | below 160 MiB |
linux-pc98-i386sx-busybox-scsi55.img.xz |
PC-9801-55-compatible SCSI H=8/S=17, including WINnote98 | static musl/BusyBox | 5 MiB | below 160 MiB |
linux-pc98-i386sx-busybox-scsi92.img.xz |
PC-9801-92 SCSI H=8/S=32 | static musl/BusyBox | 5 MiB | below 160 MiB |
linux-pc98-i486dx-debian13-ide.img.xz |
IDE H=8/S=17 on i486DX or newer | Debian 13/i486DX | 64 MiB | below 2 GB |
linux-pc98-i486dx-debian13-scsi55.img.xz |
PC-9801-55-compatible SCSI H=8/S=17 | Debian 13/i486DX | 64 MiB | below 2 GB |
linux-pc98-i486dx-debian13-scsi92.img.xz |
PC-9801-92 SCSI H=8/S=32 | Debian 13/i486DX | 64 MiB | below 2 GB |
Public images use the GDC screen and PC-98 keyboard as the console. The same
release also contains vmlinux-i386, vmlinux-i486-debian, linux98.exe,
inst.exe, ipl-lba0.bin, ipl-lba2.bin, their DOS .img copies,
ipl-part.img, IO.SYS, BOOT.SYS,
boot.cfg, and
qemu-pc98-win64.zip. The Windows ZIP contains both i386 and x86_64 QEMU,
virtpc98.exe, required DLLs, and the free PC-98 BIOS/SCSI BIOS files.
The i386 BusyBox kernel includes the PC-9801-55/92-compatible host adapter,
SCSI core, and SCSI disk support as built-ins (=y), so a SCSI root or
utility disk does not depend on modules from the low-memory root filesystem.
build/qemu-pc98-linux.raw is a single raw IDE disk with two native PC-98
partitions.
| Region | Contents |
|---|---|
| LBA 0 | ipl-lba0.bin, with the IPL1 marker |
| LBA 1 | PC-98 sixteen-entry partition table |
| LBA 2 through 15 | Replaceable ipl-lba2.bin BOOT-partition selector |
| BOOT partition reserved sector | 1024-byte FAT16 PBR/BPB (ipl-part.img) |
| BOOT partition data area | FAT16 containing contiguous IO.SYS, BOOT.SYS, boot.cfg, non-compressed VMLINUX, and LINUX98.EXE |
| Partition 2 | ext4 root filesystem, mounted as /dev/sda2 |
Native PC-98 images carry both the IPL1 marker at offset 4 and the 55 AA
signature at bytes 510–511 of LBA 0. Some later PC-9821 firmware requires the
trailing signature before it will execute a hard-disk IPL. Linux gives a valid
NEC98 table at LBA 1 priority when IPL1 is present, even though 55 AA is
also present; an unmarked 55 AA disk is left to the normal MS-DOS partition
parser.
The distributed LBA 2 selector and the NEC fixed-disk boot menu both enter the
same partition PBR. Its IPL and data-start CHS values are identical. The PBR
loads the contiguous FAT file IO.SYS; the reserved 1024 bytes are outside
the FAT cluster area and do not duplicate any part of that file.
./build.sh boot-install --partition N IMAGE VMLINUX BOOT.CFG destructively
recreates only the selected BOOT partition and preserves an NEC or third-party
disk IPL at LBA 0 and LBA 2–15. Add --install-disk-stubs when the distributed LBA 0
and LBA 2–15 stubs should also be installed.
The kernel no longer overrides the command line supplied by BOOT98.
BOOT.CFG in each image selects the matching root device. A manually
installed standalone configuration should therefore use
root=PARTLABEL=LINUXROOT (or /dev/hda2 for a fixed single-disk setup) for the
i386 IDE image and /dev/sda2 for i386 SCSI or i486/libata images.
DOS may install its own PBR and filesystem in Partition 1. Reformatting it
removes VMLINUX, so restore the kernel afterwards if the partition is to
remain Linux-bootable.
The Linux port includes a PC-98 partition-table parser so both partitions are reported through the normal Linux block-device interface.
The debian13-i486-* profiles additionally append a 128 MiB swap
partition as /dev/sda3. Its initial SysV networking policy is disabled in
/etc/default/networking, preventing boot from waiting for DHCP on machines
without a configured NIC. Enable it after installing and configuring the
desired PC-98 network adapter.
To update VMLINUX in Partition 1 without rebuilding or modifying the
Debian userland in Partition 2, derive a new image from an existing raw
image and a stripped, non-compressed ELF vmlinux:
./build.sh image debian13-i486-ide \
--base-image path/to/disk.raw \
--kernel path/to/vmlinux.boot \
--output build/images/test.rawThe main environment-variable overrides are:
| Variable | Default or purpose |
|---|---|
KERNEL_VERSION |
7.1 (the maintained kernel source) |
KERNEL_SOURCE |
linux-$KERNEL_VERSION |
JOBS |
nproc; parallel kernel build job count |
KERNEL_BUILD |
build/kernel-$KERNEL_VERSION |
CPU_FAMILY |
686; use 486 or 386 for the completed PC-98 low-generation ports |
DEVICE_PROFILE |
Linux 7.1 defaults to pc98; use full for the full Debian driver catalogue |
CONSOLE_MODE |
video; use dual only for a private GDC plus serial diagnostic build |
INSTALL_MODULES |
1; set to 0 to skip modules_install |
OUTPUT_IMAGE |
Version-specific raw image path |
ROOT_STAGE |
build/debian-i386-root |
DEBIAN_SUITE |
trixie |
DEBIAN_MIRROR |
Official Debian mirror |
DEBIAN_INCLUDE |
Comma-separated packages added to the rootfs |
ROOT_PASSWORD |
Initial local test password; default pc98 |
BOOT_MB |
FAT16 boot partition size for BusyBox profiles; default 128 MiB |
ZEDBSD_SWAPFILE_MB |
zedBSD BOOT swapfile size for Debian images; default 64 MiB (0, 32, or 64); BusyBox bootsimple images require 0 |
ROOT_MB |
ext4 root partition size; default 200 MiB |
BOOT_LOGO |
Optional 80 by 120 packed 1bpp logo for the boot screen |
DIST_IMAGE_NAME |
Filename inside dist/ before the .xz suffix |
The Debian rootfs builder stops if ROOT_STAGE already exists, preventing an
existing rootfs from being overwritten accidentally.
Use the separately maintained Debian/i486DX port rather than the official Debian archive on i486DX, Pentium, and Pentium MMX systems.
Linux 7.1 uses the pc98 device profile by default. It retains the PCI core
required by pc9821, the PC-98 IDE and framebuffer drivers, and standard
USB 1.x/2.0 UHCI/OHCI/EHCI host controllers. The framebuffer console is
built in. The Debian/i686 configuration keeps the Core-Graph Cirrus driver
as a module, while the i386 and i486 configurations disable it completely.
This prevents an untested model from replacing the working GDC console or
freezing during boot. The USB module set is limited to generic HID,
mass-storage, CDC Ethernet/NCM, ACM serial, and printer classes. The fixed
module allow-list is stored in
configs/pc9800-modules.list; it does not depend on the build host's loaded
modules. This reduces the configured module count from 3,644 in the full
Debian configuration to 23 modular Kconfig entries (22 built .ko
files).
The untrimmed Debian driver catalogue remains available for comparison:
./build.sh kernel --cpu 686 --profile fullThe external/kernel/linux-7.1/ tree is based on the official Linux v7.1 release. PC-98
support was cleanly and directly reconstructed from the official final
Linux/PC-98 2.6.7 sources, with current APIs and independently maintained
project code documented in external/kernel/audit/PC98-PORTING-REPORT.md.
Linux 7.1 changed
partition-parser logging to struct seq_buf; the NEC98 parser follows the
new API.
Linux 7.1 supports the PC-98 CONFIG_M386=y, CONFIG_M486=y, and
CONFIG_M686=y targets. The lower-generation work restores the x86 i386 and
i486 configurations removed by upstream Linux and supports i386SX, i386DX,
i486SX, and i486DX hardware. The small i386 and i486 release images use a
static musl/BusyBox userland; the i486DX release additionally provides the
custom Debian port.
The trimmed kernel and module set build successfully. The generated two-partition image boots under qemu-pc98 with TCG, mounts the Debian 13 ext4 root filesystem, reaches the login prompt, and reports Linux 7.1.0 i686.
To build and run the small BusyBox image:
./build.sh image busybox-i386-ide
qemu-system-i386 \
-M pc9801 \
-cpu 386 \
-m 8 \
-accel tcg \
-drive if=ide,bus=0,unit=0,format=raw,file=build/images/busybox-i386-ide.rawUse the named build.sh image profiles for release and routine test images.
Set BUSYBOX_WORK or ROOT_STAGE to override their default build and staging
directories when invoking the lower-level scripts directly.
The i486 image mounts its ext4 root, starts BusyBox init, reaches an interactive shell, and reports Linux 7.1.0-i486 under qemu-pc98 and on a physical PC-9821 Ra43. The i386 build has also booted on qemu-pc98 and physical i386 PC-98 systems.
The BusyBox image includes ip, ping, and udhcpc. To obtain an address
on the first non-loopback interface and install the DHCP-provided route and
DNS configuration:
net-up
ip addrThe second-stage loader clears text and graphics VRAM, displays the kernel,
code, and data sizes, and updates the transferred code and data counts while
loading the non-compressed ELF VMLINUX. An optional 80 by 120 1bpp image is
drawn in white at the lower-right corner. The loader initializes the graphics
GDC and digital palette through the standard PC-98 BIOS interface, so this
screen works with both the NEC ROM BIOS and the compatible BIOS.
The i486 kernel includes the e100 and MII drivers for the Ra43 onboard
PC-9821X-B06-compatible Intel PRO/100 adapter. Linux matches its primary
PCI ID 8086:1229; the NEC subsystem ID 1033:8000 needs no separate
driver-table entry. The adapter has been detected on physical Ra43 hardware.
./build.sh runUse KERNEL_VERSION=7.1 ./build.sh run for
build/qemu-pc98-linux-7.1.raw.
This image requires the PC-98-enabled qemu-pc98 build; upstream QEMU does not provide the required machine and device implementations.
The official Debian 13 i386 archive uses an i686/P6 baseline including
instructions such as cmov, so that image requires at least a Pentium II.
Disable the advertised CPU APIC feature with the current PC-98 machine:
-cpu pentium2,-apic
A representative command line is:
qemu-system-i386 \
-M pc9821 \
-cpu pentium2,-apic \
-m 128 \
-accel tcg \
-drive if=ide,bus=0,unit=0,format=raw,file=build/qemu-pc98-linux.rawQEMU, BIOS_DIR, MACHINE, CPU, MEMORY, ACCEL, and
DISPLAY_BACKEND can override the defaults used by scripts/run-qemu.sh.
For i486DX, Pentium, and Pentium MMX machines, use the project's Debian 13/i486DX image and package repository instead. Debian operation has a tested minimum of 64 MiB RAM on both the i486DX and i686 paths.
The boot console starts on the PC-98 GDC 80x25 text console. In a Debian/i686
installation on a confirmed Core-Graph machine, loading pc98cirrusfb
selects an 800x600x16 framebuffer by default and fbcon takes over.
FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is disabled because the non-PnP Cirrus
child is not a conventional PCI VGA function. Japanese glyph support is not
required to reach the Debian direct shell.
The PC-98 framebuffer drivers are:
pc98cirrusfbfor the qemu-pc98 Core-Graph Cirrus GD5440; the Debian/i686 configuration provides this as an explicitly loaded module, while i386 and i486 set it tonpc98tridentfbfor the integrated Trident TGUI9660/9680/9682 used by NEC Mate R systems; this remains an optional module
The driver is deliberately limited to the fixed-interface Core-Graph path;
PCI GD754x/755x laptop LCD support remains outside its scope. The 1 MiB
Core-Graph framebuffer supports exactly 640x480-24,
800x600-16, and 1024x768-8. The default prioritizes usable colour depth
for X11. The module exports no hardware alias and is not listed in any
modules-load configuration, so udev cannot select it automatically. On a
confirmed machine, load it immediately before X with
modprobe pc98cirrusfb; select another initial mode with
modprobe pc98cirrusfb mode=<mode>. An fbdev client can also request one of
these exact resolution/depth pairs with FBIOPUT_VSCREENINFO.
The PC-98 keyboard driver already reports keys through the Linux input
subsystem. The normal i486/i686 Linux 7.1 profiles now enable evdev, so the
keyboard is available as /dev/input/event0 as well as the console keyboard.
The native IRQ 13 PC-98 bus mouse is handled by the pc98busmouse module and
reports through both mousedev and evdev after modprobe pc98busmouse. In the
qemu-pc98 validation run these were /dev/input/mouse0 and
/dev/input/event1; event numbers are not a stable ABI. It reports relative
X/Y and three buttons to the standard input API, so Xorg, gpm, SDL and other
non-X programs can use it without a special X-only driver.
The deliberately tiny 80386 profile does not enable evdev or the mouse
driver. In the normal build the linked evdev and pc98busmouse objects add
about 10 KiB of kernel text/data; no USB HID support is required for these
native devices.
The Trident driver is based on the register sequences documented in Suika3
98disp_trident.c. It handles the PC-98 BAR1 MMIO window, CR21 linear
aperture, display relay, and 640x480 8-bpp initialization. On Ra hardware,
long streams of direct aperture writes can be dropped during scanout. The
driver therefore exposes a system-RAM shadow framebuffer and copies changed
rows to VRAM with paced, read-back-verified writes.
pc98tridentfb deliberately has no PCI module alias, so Debian will not switch
away from the GDC console merely because udev discovers the Trident device.
Load it explicitly before starting an fbdev application or X server:
modprobe pc98tridentfbPhysical Ra43 testing still shows vertical colour bars after explicit module loading. The remaining register-initialization mismatch is deferred; the GDC console remains the supported display path for the current i486 work.
See external/kernel/audit/ and the boot-chain sections above for further
implementation and validation details. The PC-98 machine model itself lives
in the external/qemu-pc98 submodule.