semu-c64 - Commodore C-64でLinuxを実行
(github.com/onnokort)- Commodore C-64でLinuxを実行するために、最小限のRISC-V32エミュレーター semu をC-64向けに移植したプロジェクト
- 64KiBのメモリだけでは全体構成を収められないため、RAM Expansion Unit(REU) が必要で、実行速度は “extremely slowly” と表現されるほど非常に遅い
- 生成される
semu実行ファイルは汎用 RISCV32 エミュレーター であり、REUが0x00000000から0x01000000までのアドレス範囲にマップされていると仮定する - Linux実行には仮想メモリエミュレーションとMMUが使われ、エミュレートされたUARTはPETSCIIとASCIIの大文字・小文字変換を処理する
- ビルドは
makeで行い、mos-c64-clangが必要 - VICEで実行する際は、コンパイル済み
semu実行ファイルを含む.d64ファイルとreufile.linuxを使い、RAM Expansion Moduleを有効化したうえでサイズを 16MiB に設定する必要がある - C-64側での実行は
LOAD "SEMU",8,1の後にrunを入力する方式で、READMEによれば起動には長い待ち時間が必要 - PC向け
semuバイナリは-kオプションでreufile.linuxを読み込め、最初のキー入力前まで決定的なブートシーケンスを得る用途に使える - 永続化機能はエミュレーター状態を保存し、すでに起動済みのLinuxをより速く読み込む方式で、RISC-V CPUレジスターとUART、割り込みコントローラーの状態をREUアドレス
0xfff000から読み込む - リリースは “highly experimental” と見なされており、本番用途には適さないと明記されている
1件のコメント
Hacker News のコメント
Onno Kortman は、最小構成の RISC-V エミュレーター semu を、MOS 6502 向けの LLVM ポートである llvm-mos でクロスコンパイルし、Commodore 64 上で Linux を動かせるようにした。
Kortman は「スクリーンショットを作るのに、VICE の『warp mode』でも数時間かかった。今の状態なら、実機の C64 でも 1週間ほどあれば Linux をブートできるだろう」と書いている。
ネイティブ 6502 で RISC-V エミュレーターを書けば、実機で Linux をブートするのに 1週間ではなく 1日以内で済むかもしれない。そうなればどれだけ多くの命を救えることか、と思う。
https://www.folklore.org/StoryView.py?story=Saving_Lives.txt
https://dmitry.gr/?r=05.Projects&proj=07.%20Linux%20on%208bi... は 8ビット AVR で ARMv5 エミュレーターを使っていたが、今回は ギーク的な格好よさ では一段上だ。
すごいとは思うが、最初に思ったのは「64KB RAM に収まるわけがない!」で、実際にも収まらない。
16MB REU が必要だ。当時の C64 用 REU は 256KB と 512KB で、回路図が公開されていたため、クローンも主にそちらが作られている。
90年代後半には、元の CPU とコード互換の新 CPU である SuperCPU(65816)を載せた C64 用の「拡張」もあり、おそらくこの装置は最大 16MB まで対応できたはずだ。
その後、FPGA ベースの再実装が登場し、16MB REU も出てきた。元の SuperCPU の回路図は失われており、FPGA ベースの拡張ボードはいま数百ユーロで買えるとはいうが、実際に買った人は知らない。
だから、きれいな技術的成果ではあるものの、「C64 で動く」という言い方は、「386 で Doom 3 を動かした。ただしその 386 は現代 PC の PCI カードだ」と言っているのに近く感じる。
当時入手できたハードウェア、あるいは当時現実的に作れたハードウェアで自分の C64 上で実行できないなら、「C64 で動く」と呼ぶのは微妙だ。
REU の話に戻ると、なぜいまだに公開回路図がないのかも気になる。eBay には安い SRAM チップがたくさんあるので簡単に作れそうに思えるが、実際には SuperCPU と DMA コントローラーという 2つの構成要素をかなり大きな FPGA でエミュレートする必要があり、単純ではない。
もっと安価な FPGA や、FPGA に似た機能を持つマイクロコントローラーが出てくれば、誰かがオープンソースの SuperCPU を作るかもしれない。これまで聞いた利用者はみなエミュレーションを使っているようだ。開発にはエミュレーションが非常に有用だが、自分のレトロ趣味の楽しさは、オリジナルのハードウェアで動かすときが一番大きい。
価格が天文学的だっただけで、技術的に不可能な理由はない。SuperCPU と通常の REU を混同しているように思う。
REU は RAM の塊と、C64 と通信して RAM バンクを保存したり取り戻したりさせる ASIC にすぎず、CPU はない。6502 は 64KB を超える範囲を直接アドレス指定できないので、システム RAM を入れ替えるよう指示する仕組みだ。
SuperCPU(65816)は実際に 16MB を直接アドレス指定できるが、別物だ。元記事のプロジェクトは標準の C64 と標準の C64 CPU で動作し、ただし当時なら家一軒分の値段がしたであろう 途方もない量の RAM が必要なだけだ。
それとも、その程度でもエミュレーション純粋主義の限界に引っかかるのだろうか。
今なら 386、486、Pentium とさらに別の SoC 群を PCIe カード 1枚に載せて、パッシブ冷却もできそうだ。
Linux の話ではないが、最近 C64 のアクセサリーをいろいろ試している。
Kung Fu Flash を使ってみた。STM32 ひとつで作られた安価なソフトウェア定義カートリッジで、ほぼ何でもできる。「8-bit show and tell」で見ていた開発者体験を再現してみたくて買ったもので、「Super Snapshot」はエミュレートできるが REU はできない。多くの C64 ソフトウェアやゲームを素早く試すにはとても良い。
https://8bithardware.wixsite.com/website/post/kung-fu-flash
https://github.com/KimJorgensen/KungFuFlash
SD2IEC も持っているが、追加の DIN ソケットがあるバリエーションを買えばよかったと学んだ。悪くはないが、もともと C64 の DOS は好きではなく、この装置はその印象を強めた。D64 ディスクイメージをマウントするには
OPEN1,8,15,"CD:MYIMAGE.D64":CLOSE1と打たなければならず、いまひとつだ。C64 用の交換 ROM である JiffyDOS はこれを改善してくれて、より高速で、常駐 DOS ウェッジも含んでいる。ひとつ注文してあり、実機の 1541 ドライブと組み合わせて試すのが楽しみだ。
最近こういうものを始めるきっかけになったのは、VIC-20 用の「Penultimate +2」カートリッジだった。
https://www.youtube.com/watch?v=eNGyneXHKJQ
実のところ、このカートリッジを試したくて VIC-20 を買ったようなものだ。
チューリング等価性の実演。時間が問題にならないなら、どんなチューリング完全なコンピューターでも、別のチューリング完全なコンピューターがすることを実行できる
こうなると気になる。最新の Linuxを起動でき、なおかつ日常用途にも使える最も古いハードウェアは何だろう?
最も軽く高速なシステムを作って遅いマシンでもうまく動くようにはできるが、今のインターネットは容赦ない場所だ
ものすごく速くはないだろうが、少しの忍耐があればハードウェアが原因で行き詰まることはなさそうだ。ハードウェア動画デコード対応の GPU まで入れれば、YouTube もジャガイモ画質よりはましなレベルで見られるかもしれない
Pentium 4 / Athlon XP時代あたりを目標にしたい。ドキュメント上、初代 Pentium はサポートされていないので、本当に苦痛を受け入れるなら Pentium II までさかのぼれるかもしれない
これは LUnix と違うのか?
https://en.wikipedia.org/wiki/LUnix
これは C64 上で RISC-V エミュレーターを実行し、そのエミュレーター上で Linux の起動をエミュレートするものだ
厳密に言えば、C64 上で Linux が直接動いているわけではない
C64 がRISC-V 環境をエミュレートし、その上で Linux が実行されている。もちろんそれでも印象的だが、意味の区別は重要だ
REU ではなく、フロッピーディスク数十枚をRAM のように使って動かせるのか気になる
必要になるたびにユーザーにディスクを入れ替えさせるのはどうだろう。誰かが数か月か数年ほど余暇を持て余しているなら、実機でそれをタイムラプスで見てみたい
Commodore 64 に RAM を追加したら、それはまだ Commodore 64 なのだろうか?
さらに C64 用に 2MB REU まで拡張することも可能だ。https://www.neperos.com/article/rlut8ce90fbb7701 を参照
C64 で2MBはかなり「正当に」持てる
C64 REU でアドレス指定可能な最大メモリは16MBだ
最近、完全に動作するTRS-80 Model 4を手に入れ、そこにぼんやり Unix っぽい何かを載せる想像をよくしている
その想像は続いている
その地点から始めれば、ほどよく深いウサギ穴を見つけることになるだろう