FPGAで蘇る486互換PC(第2回)
2025年12月3日
はじめに
前回、Tang Console 138K 上で ao486 の動作の続きで、今回は486Tangへのi8042 PS/2コントローラの組み込みを行いました。
準備するモノ
- Tang Console 138K
- WSL(Windows Subsystem for Linux)
- Digilent社の Pmod PS/2
486Tang に i8042 PS/2 コントローラを組み込む
bochsrck GitHub 上のプロジェクト 486tang の Verilog コードとドキュメントを読み解きながら、PS/2 キーボードを「UART to PS/2 bridge 経由」ではなく、
FPGA の PMOD ポートへ直接接続する方式 へ変更してみました。
調査したモジュール構成は下図のとおりで、SoC 内には既に i8042 相当の PS/2 コントローラ(ps2.v)が存在しているため、
ホスト PC を介さずに直接 PS/2 デバイスを扱えるようにできます。
(図:486tang_ModuleConfiguration.png)

以下では、実際に行った作業手順をまとめます。
1.UART to PS/2 bridgeの削除
486Tang では、標準では USB シリアル(USB-JTAG)経由でキーボード/マウスを入力するためのブリッジ回路が組み込まれています。
直接 PS/2 を接続する場合、このブリッジは不要になるため、以下のファイルを削除します。
削除するファイル
・src/common/ps2_device.v
・src/common/uart2ps2.v
コメントアウト(削除)するモジュール登録
・src/ao486_top.v 内の uart2ps2
・src/system.sv 内の ps2_device
GOWIN のプロジェクトファイル(486tang_console138k.gprj)を開いて、これらのファイルを削除し、モジュール登録も忘れずに外します。
2.PS/2 controllerの改造
486Tang の SoC 内には、すでに i8042 互換の PS/2 コントローラ(src/soc/ps2.v) が含まれています。
このモジュールは、PS/2 の 11 ビットフレーム(Start / 8bit Data / Parity / Stop)を正しくデコードする実装があり、キーボード入力として十分に機能します。
今回は “PS/2 キーボードを直接接続” できるように、
・clock / data 信号を 双方向で扱えるように再配線
といった最小限の修正のみで対応できました。
3. PMOD ピンへの割り当て
最後に、変更した PS/2 コントローラの ps2_clk / ps2_data をTang Console 138K の PMOD0 に割り当てます。
今回は以下のピンに接続しました。
| PS/2 信号 | PMOD0 ピン番号 | FPGA |
| Clock | 1 | V18 |
| Data | 3 | F18 |
・不要な UART → PS/2 ブリッジを削除
・既存の ps2.v を双方向信号に対応させる
・PMOD ピンに PS/2 Clock/Data を割り当てる
という 3 ステップで実装は完了しました。
修正CodeのPatchはここにあります。
Bochs BIOS と VGA BIOS のビルド手順まとめ
486Tang の BIOS(boot0.rom) と VGA BIOS(boot1.rom) をソースコードからビルドする手順を、開発メモ風に整理して紹介します。
BIOS (tools/boot0.rom)
$ git clone https://github.com/bochs-emu/Bochs.git
$ cd Bochs/bochs
$ ./configure --with-nogui --disable-pci --disable-xpm --disable-gameport
$ cd bios
sed -i.bak 's/^#define[[:space:]]\+BX_APM[[:space:]]\+1/#define BX_APM 0/' rombios.h
sed -i.bak 's/^#define[[:space:]]\+BX_PNPBIOS[[:space:]]\+1/#define BX_PNPBIOS 0/' rombios.h
sed -i.bak 's/^#define[[:space:]]\+BX_USE_PS2_MOUSE[[:space:]]\+1/#define BX_USE_PS2_MOUSE 0/' rombios.h
$ make
$ git clone https://github.com/MiSTer-devel/ao486_MiSTer
$ cd sw/sysbios
$ make
VGA BIOS (tools/boot1.rom)
$ git clone https://github.com/MiSTer-devel/ao486_MiSTer
$ cd sw/vgabios
$ make
まとめ
486Tang ではキーボード/マウス入力が UART ブリッジ経由で処理されていますが、実は SoC 内部には i8042 互換の PS/2 コントローラがすでに組み込まれています。
そのため、回路を少し手直しするだけで 本物の PS/2 キーボード を直接接続できる環境を構築することが出来ました。
この仕組みが動作すれば、古典的な OS──たとえば Minix や linux-0.01 のような、i8042 を前提とした初期のシステムも正常にキーボード入力を扱える可能性があります。
こちらについても、いずれ動作検証を進めてみたいと思います。

