いきなり何の話?という感じですが、最近私の中でMSXがブームでして、今後MSXのエントリを書いていこうと思ってます。MSXでのプログラミングだけでなく、色々調べているうちにMSX自体を自作できるんじゃないか?とも無謀にも思い立って、色々と部品を集めようともしています。
その第一回目として、そこに至った経緯を書いておこうと思います。(ほぼ日記です)
私にとってのMSXとは
みなさんはそもそも MSX をご存知でしょうか・・? リアルタイムで知っている人はおそらく40代以上の方々でしょうね。
MSX の詳細は Wikipedia に任せるとして、さらっと概要だけ書きますと、かつて日本の電機メーカー各社が売り出していた家庭用パソコンの共通規格の名称です。実際は規格名というよりは規格に準拠したパソコンそのものをMSXと呼ぶことが多いように思います。ゲーム機のようにテレビにつなげてプログラミングやゲームなどで遊ぶことができる、身近なパソコンでした。
学生の頃 MSX にハマっていまして、私にとってはソフトウェアエンジニアを目指すきっかけを与えてくれた、非常に思い出深いパソコンです。MSX で BASIC、マシン語(Z80アセンブラ)などを覚え、プログラミングの楽しさ、奥深さを知りました。今の私の土台を作ってくれたと言っても過言ではありません。
きっかけ MSX0 の登場
とはいえ、ハマっていたのは遠い昔・・もうずっとMSXを思い出すこともありませんでした。
再び熱が上がってきたのは、MSX の生みの親である西和彦さんが2023年の1月にクラウドファンディングで MSX0 の支援を募ったことがきっかけでした。どうやら2023年でMSX生誕40年なんだそうです。思わず支援してしまいました。
40年の月日を感じますね。こんな小さい筐体で、パソコンではなくESP32というマイコンでMSX2台を同時にエミュレートできてしまうのですから。MSX の CPU の動作クロックは 3.8MHz です。最新PCの1000分の1です。
高校生頃に作りかけていたゲーム
MSX0が来たので昔に作っていたゲームを動かそうと、昔バックアップしてたFDDのイメージを掘り出して動かしてみました。
30年近く前のプログラムもMSX0で動くものですね。ただ、画面描画にマシン語を使っているとはいえ、かなりカクカクで「なんとか動いてる」というレベルであり、「遊べる」レベルには遠く及ばない状態でした。
高校生の自分への挑戦
どれどれ、今の自分が作ったらどのくらいになるのかな? と思って、上記ゲームを作り直してみようと色々MSX関連を調べ始めたのですが、それは懐かしくて懐かしくて・・・
過去書籍で出版されていた「MSX2テクニカル・ハンドブック」と「MSX Datapack」が一般公開されていました。
MSX2テクニカル・ハンドブックは私も昔持っていました。使わないけどなかなか捨てられなかった本で、スキャンすれば捨ててもいいかと決心しまして、今でもスキャンしたものが手元にあります。
MSX Datapackも学校の先輩から貸していただいて読んだことがあります。必要なところをコピー機でめっちゃコピーしたのを覚えてます。200枚位以上あったんじゃないかな?
Wiki形式になっていると全文検索もできるので本より使い勝手がいいですね。権利関係がどうなっているのかわからないですが、誰にでもアクセスできる形で公開してくれているので大変ありがたいです。
開発環境としては、MSX0に付属の、中学生時代高くて手が出なかったあの MSX-C が使えるのですが、MSX0で開発するのは厳しいので、クロスコンパイルすることにしました。
z88dk という Z80 系のレトロコンピュータ向けのコンパイラがあって、これを使ってC言語+Z80アセンブラで書いてみました。
カーソルキーによるスクロールだけですが、VDPレジスタを直接叩いてVRAMに書き込むようにして画面描画を行ってみた結果がこちら
上記動画はROM形式でビルドしてしまったためMSX0では動かせず、openMSXを使って動作確認しました。思っていたより高速に書き換えられていてゲームにできそうな描画速度は出てそうです。
C言語なので楽に書けるかなと思ったのですが、レジスタ数が極端に少ないZ80の場合かなり無駄が多いコードとなってしまうようです。C言語ではABIが厳密に決まっているので関数の出入り口でのレジスタ保存復帰系がだいぶ冗長になっていそうに見えました。
なので、メインループ以外はインラインアセンブラ+アセンブラで書いています。
そして現在・・
MSX Datapack wiki化計画 などの資料を読んでいて思ったのは、
読める!読めるぞ!
ということでした。高校生時代は読んでも分からない箇所が数多くあったのですが、今だと大体読み解けることにちょっと感動しました。あんなに難しかったのに。エンジニアとして成長した証ですね(仕事にしてるくらいだからあたりまえか)
で、しばらく懐かしさから資料を読んでいて、改めて思ったのはよくできたアーキテクチャだなぁと。特に拡張カートリッジのところですね。
カートリッジには、Z80のアドレスバスとデータバスが全て出ていて、大体のものは繋げられるようになってます。また、起動時に各カートリッジを探しに行って、そのコードを呼び出すようになっています。そのカートリッジがゲームならゲームが起動するし、機器だったら、機器のドライバが初期化されます。
どの会社の機械でも使える、共通規格のプラグアンドプレイをもう40年前に実現していたんですね。当時20代の若さでこれを考案した西さんの天才ぶりが垣間見えます。
もう1つ資料を読んで思ったことは、だいぶシンプルな作りだなということ。テクニカルハンドブックやDatapack にはMSX の参考回路図が載っているのですが、ざっと見てみると主要なチップは
- CPU(Z80)
- VDP(V9958)
- 音源チップ(AY-3-8910) ※Joystickポートもここを経由
- キーボード/プリンタポート用PPI (8255)
- ROM/RAM
くらいしかないんですね。めちゃくちゃシンプル。(もちろん細かいものはたくさんありますよ)
ってことはあれですよ。ROMイメージさえあれば、自作MSXも夢じゃないんじゃないかと。ちょっとおもしろそうじゃないですか。
ということで、しばらくMSXをいじってみようと思います。