8月26日、Xには「8051でLinuxがブートしそう」という別件のRTが流れていた。これは今回のPS1 Linuxとは別の話だが、こういう無茶なハードウェアにLinuxを載せる話には、つい反応してしまう。
そして8月31日20:13、PS2 Linuxについての話をRTした直後、20:14に「初代プレステ Linux これかな??」とリンクを投げた。ここが今回の本当の起点だった。
元になったのは、Xで見つけた吉野@連邦さんの「初代プレイステーションに、Linuxが勝手移植!!」という投稿だった。
標準PS1の2MB RAMでLinux 2.4系が実機起動し、CD-Rからシェルまで表示できる。しかもDuckStation用の8MB版も動作確認済み。これはもう、試すしかない。
初代PlayStationといえば、ゲームをする機械という認識しかなかった。そこにLinuxを載せて、しかも標準機の2MB RAMでシェルを出すという。スペックだけ見ると「本当に入るの?」というサイズである。記事を読みながら、これは面白そうだな、でも自分でビルドするところまで行くのかな、と半分くらい他人事で眺めていた。
というわけで、Codexに「焼いて」と丸投げした。いつものことであるw
ちょうどBlackrooのイメージが用意されていたので、まずはCodexにISOを焼かせた。焼き込みは無事に成功し、SCPH-3500へ入れてみるところまでは進んだ。
イメージはBINとCUEの組み合わせだった。普通のISOを焼く感覚で済むのかと思ったら、PS1用はMode 2/2352のディスクイメージで、CUEが参照するBINを同じ場所に置いて扱う必要がある。ここで早くも「CD-Rに焼く」という一言の中に、いくつかの細かい作法があることを知った。
ただし、画面には何も映らない。起動していないのか、映像方式の問題なのかも分からない。CD-Rを焼くところまではできたのに、いきなり「何も見えない」という非常に分かりやすい壁にぶつかった。
焼き込みが成功したことと、実機で画面が出ることは別問題だった。ディスクは回っている。しかしテレビには何も出ない。この時点では、焼きミスなのか、リージョンなのか、起動ファイルなのか、映像方式なのか、候補だけが増えていった。
最初のCD-RはPAL版のイメージだった。日本版のSCPH-3500はNTSCなので、起動していても画面が出ない。ここでは「焼けた」と「実機で見える」が別物だということを、いきなり思い知らされた。
画面が出ない原因を調べると、最初に焼いたイメージはPAL版だった。8月31日21:19には、すでにNTSC化すべくビルド中と投稿している。つまりPAL発覚は21:53ではなく、初回焼きのあと、NTSC版を作り始める前の出来事だった。
最初のCD-Rは、焼き方に失敗したわけではない。PALの映像信号をNTSC実機で見ようとしていただけだった。原因が分かれば話は早い。「仕方ない、NTSCでビルドし直そう」となった。
最初は「設定を一か所変えて、もう一度ビルドすれば終わり」くらいに考えていた。ところが、古いPS1向けソース、ブートローダー、カーネル、PS-EXE、CDイメージがそれぞれ別の工程になっている。画面方式だけを直したつもりでも、どの成果物を使っているのか分からなくなる。ここから、イメージの世代管理と、実際に焼いたCUE/BINを確認する作業も重要になった。
ここからが本番だった。古いMIPS向けLinux 2.4のビルド環境を、いまどきのMacで再現しなければならない。まずMac Studioに投げてソースを全ビルドした。
まずMacBook Neo(メモリ8GB)で挑戦した。しかし、古いEGCS 2.91.66系の32bit Linuxツールチェーン、MIPS little-endian、macOSのコマンド差、ISO生成ツールなど、相手があまりにも古い。メモリ8GBのMacBook Neoでは環境構築とビルドを最後まで安定して進めるのは厳しく、ここは潔く断念した。
そしてMac Studioへ移行。ローカルではDockerを使わず、Mac Studio側でブートローダーとISOを生成する構成に切り替えた。-mcpu/-mtune、little-endian指定、macOSのsed、ホストツールの扱いなどを一つずつ調整し、ようやくNTSC版の生成にこぎつけた。
MacBook Neoで粘っていると、ビルドそのものより環境の面倒を見る時間が長くなっていく。そこでMac Studioへ切り替えた。結果的には、ソースを転送し、Mac Studioで生成し、完成したCUE/BINをSCPで戻す、という役割分担が一番分かりやすかった。
生成したNTSC版を21:43にCD-Rへ焼き、21:53にはSCPH-3500実機で起動した様子を投稿した。ここで、ようやく画面が映った。
NTSCでビルドし直したイメージを試すと、ようやく画面が映った。ここで一息つけるかと思ったら、次の問題が出た。画面は見える。しかしキーボード入力ができない。
NTSC版として焼き直したCD-Rと、分解されたSCPH-3500を並べて確認する。最初の「映らないCD-R」とは違い、今度は映像が出るところまで来た。
そもそもPS1にはUSBポートがない。USBキーボードを直接つなげるわけがない。そこで本体を調べていくと、背面端子にシリアルポートがある。これがSIO1だった。
「PS1にシリアルポートがあるなら、ここから入出力できるのでは?」ということで、映像問題とは別の、通信経路の調査が始まった。
ここでようやく、画面が映った先に何が必要なのかが見えてきた。Linuxが起動しても、入力できなければシェルを操作できない。PS1にはUSBキーボードを挿す場所がない以上、昔の本体に残されている通信機能を使うしかない。ゲーム機としては普段意識しない背面端子が、急に開発用の入口に見えてきた。
SIO1に接続するため、PS1を分解して基板のハンダ面を確認した。8ピン部のピンアサインを調べ、RXD、TXD、GNDの位置を特定する。
分解したPS1、CD-R、M5Stackを同じ机の上に並べると、ソフトウェアの話だったはずのものが、急に工作の話になる。ここから先は、ソースコードだけでは完結しない。
基板のハンダ面を見ながら、SIO1の8ピン部の並びを確認する。ピン番号の並びは、コネクタをどちら側から見ているかで簡単に逆転するので、写真だけで決め打ちしない。
M5Stack bridgeをCodexに作らせながら、私は横でPS1の基板にせっせとはんだ付けをする。ところが、ChatGPTが自信満々に出してきたピン情報が、実際の基板とどうも合わない。AIの回答を信じて煙を出すわけにはいかないので、結局はテスタを当てて導通を確認した。
テスタで実物を確認し、RX・TX・GNDをはんだ付けして外へ引き出した。AIにコードを書かせるのは便利だが、基板のピンは最後に自分で測る。今回の教訓である。
基板のハンダ面は、写真を見ただけでは左右や上下を取り違えやすい。だから最後は、番号を信じるのではなく、実物の導通と電圧を測った。RX、TX、GNDを確定してから配線したことで、ようやく安心して電源を入れられた。
PS1から来る文字を表示し、外部から入力した文字をPS1へ返すため、M5Stack CoreS3をUART bridgeにした。PS1のSIO1から引き出したRX・TX・GNDをCoreS3へ接続し、PS1とホストの間を取り持たせる。
ソースコードはM5Stack UART bridgeのPR #1にまとめた。LCDは黒背景に黄緑文字、小さめのフォント。見た目はだいぶそれっぽくなった。
CoreS3は、PS1から来るSIO1の文字をLCDへ表示するだけではなく、USBシリアル側から受け取った文字をPS1へ返す役目も持たせた。つまり、PS1とMacの間に小さな通訳を一人置くようなものだった。
実際に配線して電源を入れると、M5Stackの小さな画面にBlackroo Linuxの文字が出てくる。PS1の中で動いているLinuxの出力が、SIO1を通って、机の上のM5Stackに現れる。ここはかなりテンションが上がる瞬間だった。
ところが、今度は改行が変だった。CRLF、LF、LFCRが混ざっていて、CRを改行として扱うと余分な空行が出る。そこで、CRは行頭へ戻るだけ、LFは次の行へ進む、という端末本来の動作に戻した。最下行まで来たらスクロールAPIに頼らず、画面をクリアして先頭から表示する仕様にした。
このあたりは、見た目の問題に見えて実際には端末の状態管理の問題だった。CRを「改行」として扱うと、行頭へ戻る動作と次の行へ進む動作が一度に起きてしまう。CRとLFの役割を分け、CRLFでもLFCRでも余分な空行を作らないようにした。
シェル側も、出力は/dev/console、入力は/dev/brconへ分けた。DuckStationのRedirectToTTY = trueは出力をTTYへ送るだけで、TTYからPS1へ入力を返してくれる魔法ではなかった。そこを直して、SIO1からのキー入力が通るようになった。
起動ログを見ると、PSX joined card: detecting card in slot 3まで進んでしまう。M5Stackの表示バグかと思ったが、原因は起動していたISOが古かったことと、Linuxカーネル側も8スロットを走査していたことだった。
今回必要なのはmultitapの全階層ではなく、直接接続された2ポートだけ。カーネルとブートローダーを2スロット対応へ揃え、余計な検出を止めた。
ログが先へ進むこと自体は、最初は動いている証拠にも見えた。けれども、存在しないスロットまで探し続けるので、どこまで行けば正常なのかが分かりにくい。必要な2スロットだけに絞ることで、起動ログも実機の構成に合った、読みやすいものになった。
Mac Studioでカーネル、ブートローダー、ISOを生成し、完成したCUE/BINをSCPで戻した。古いDuckStationプロセスが新しいCUEを読み込まず、ゲームリストだけ表示されることもあったので、既存プロセスを終了してCLIから起動し直した。
そしてついに、MacからプレステのLinuxにログインできた!? というところまで到達した。ここまで来ると、最初に「焼いて」と丸投げした人間としては、かなり満足である。寝る!
最初はXで見つけた記事を見て「動くらしい」と思っただけだった。それが、CD-Rを焼き、PALとNTSCで悩み、MacBook Neoを諦め、Mac Studioへ移り、PS1を分解してテスタを当て、はんだ付けまでしている。気づけば、単なるエミュレータ上の実験ではなく、手元のSCPH-3500でLinuxへログインするところまで来ていた。
NTSC設定の修正版をDuckStationで起動した画面。VIDEO: 320x240 60HZ、NTSC-J、シェルメニューとSIO1コンソールの表示を確認できる。
時刻はX投稿、会話ログ、Gitコミットを突き合わせたJSTです。
| 時刻(JST) | できごと |
|---|---|
| 8/26 00:06 | RT @pgate1。8051でLinuxがブートしそう、という別件 |
| 8/31 20:13 | RT @yunkya2。PS2 Linuxは2.6/MMUあり、今回のPS1は2.4/2MB |
| 8/31 20:14 | 初代プレステ Linux これかな??。今回の起点 |
| 8/31 20:41 | CodexがISOを焼いたという引用 |
| 8/31 20:57 | PS1でLinux、果たして起動できるのか?!と動画を投稿 |
| 8/31 21:19 | NTSC化ビルドのハードルを記録 |
| 8/31 21:35 | Mac Studioに投げてソースを全ビルド |
| 8/31 21:43 | ビルド成果をCD-Rへ焼いた |
| 8/31 21:53 | SCPH-3500実機でNTSC版を起動。Macビルドから実機へ |
| 8/31 23:01 | SIO用UART bridgeをM5Stack CoreS3で作成。PCから入力する方針 |
| 8/31 23:10 | シリアル経由でアクセス可能に |
| 8/31 23:13 | Macからキー入力できるようにした動画を投稿 |
| 8/31 23:35 | MacからプレステLinuxへログインできた。ここで就寝 |
| 8/31 23:36 | RT @otani_ai_memo。「いじれると分かってからの速度が異常」 |
| 8/31 23:40 | 返信 @ooba。Linuxを起動してodでダンプする話 |
| 8/31 23:49 | RT @pgate1。自作エミュでLinuxをブートしかけ、キーボード未実装で停止した話 |
| 9/1 06:58 | 返信 @Imaha486。「昨日PS1でLinuxが動くと知ってしまい」 |
| 9/1 07:40 | RT @yunkya2。PS1はMMUなし、PS2はMMUあり。当時uClinuxは本家未マージ |
| 9/1 07:41 | 引用。PS2 LinuxのSync on Greenについて |
| 9/1 08:17 | RT @crazybocan。「起きたらPS1 Linuxなってた」 |
| 9/1 10:35 | SIO1のキー入力対応をソース改変。Macからログイン成功、UART bridgeはM5Stack |
| 9/1 10:47 | NTSCパッチを公開。デフォルトPALでは実機で画面が出ないことを説明 |
| 9/1 13:02 | RT @hanyazou。初代プレイステーションでLinuxが動く話 |
| 9/1 13:03 | RT @yoshinokentarou。標準2MBでLinux 2.4を実機起動、CD-Rブート、DuckStation 8MB版の紹介 |
- NTSCの実機映像を確認
- SIO1キー入力を実機で確認
- M5Stack CoreS3 UART bridgeを実機転送し、LCD表示を確認
- CR/LFを端末標準の動作へ修正
- メモリーカード検出を2スロットへ限定
- Mac Studioでカーネル、ブートローダー、ISOを生成
- PR #1〜#5をすべてマージ、Issue #6〜#7をすべてクローズ
- 元のGitHubリポジトリ(arkwise/blackroolinux)
- GOROman fork
- PR #1: Add M5Stack CoreS3 UART bridge — merged
- PR #2: Use NTSC as the default video mode — merged
- PR #3: Fix SIO1 shell input — merged
- PR #4: Limit memory card detection to two slots — merged
- PR #5: Add macOS build portability — merged
- Issue #6: [NTSC] No video output on target console — closed
- Issue #7: SIO1に文字は表示されるがキー入力できない — closed









