This repository contains:
- Linux: 7.2, 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 all public images
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.2/ |
Linux 7.2 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 all public images |
external/zedBSD/ |
Retained zedBSD development submodule; not used by public images |
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.2 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.
All public images use bootsimple's assembly-only IO.SYS to load VMLINUX
directly through the PC-98 BIOS. Normal image and release builds do not
require OpenWatcom or the zedBSD boot OS.
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.
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.2 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.2.raw
The kernel is built out of tree in build/kernel-7.2; external/kernel/linux-7.2/ remains
a source-only directory. KERNEL_VERSION=7.2 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 containing only the bootsimple direct-loader
files and VMLINUX. 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).
bootsimple passes the BIOS SENSE drive number and logical H/S to Linux in
SETUP_PC98_DISK setup-data records. It 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 = 0All public 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.
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 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,
bootsimple.zip, and qemu-pc98-win64.zip. The bootsimple ZIP contains the
six release profiles, source, installer, verifier, and tests. 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 and non-compressed VMLINUX |
| 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.
bootsimple/install-image.sh recreates the selected BOOT partition and
installs the disk IPL, partition selector, IO.SYS, and VMLINUX. The image
profile compiles the matching root partition and SCSI parameters into the
bootsimple command line.
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.2 (the maintained kernel source; set 7.1 for the retained previous tree) |
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.2 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 |
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.2 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/i486 configuration builds in the Core-Graph Cirrus driver
so /dev/fb0 is available before Xorg starts, the Debian/i686 configuration
keeps it as an explicitly loaded module, and the i386 configuration disables
it. 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.2/ tree is based on the official Linux v7.2 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.
Current Linux uses
partition-parser logging to struct seq_buf; the NEC98 parser follows the
new API.
Linux 7.2 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.2.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.2.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.2 ./build.sh run for
build/qemu-pc98-linux-7.2.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. On a confirmed
Core-Graph machine, pc98cirrusfb selects the V13-tested 640x480x24
framebuffer by default and fbcon takes over. It accepts the NEC path-08h WAB
interface ID range 0x58 through 0x5d, used by physical Core-Graph variants.
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 and physical Core-Graph Cirrus GD5440; the Debian/i486 configuration builds it in, the Debian/i686 configuration provides it as an explicitly loaded module, and i386 sets 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 the three recovered StratoHAL mode streams:
640x480-8, 640x480-16, and 640x480-24. The default uses the NEC
path-08h 640x480x24 register stream confirmed by StratoHAL on physical V13
hardware. The last 256 bytes of the 1 MiB aperture are reserved for the
Cirrus MMIO registers and are not exposed as framebuffer memory. The module
exports no hardware alias and is not listed in any modules-load configuration,
so udev cannot select the i686 module automatically. On a confirmed i686
machine, load it immediately before X with
modprobe pc98cirrusfb; select another initial mode with
modprobe pc98cirrusfb mode=<mode>. The i486 image probes the built-in driver
automatically. 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.2 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.