昔作ったものを思い出していたら懐かしくなったので、ちょっとフォローしておくw
M.T.GODDESSはMSX-FANに載っていたゲームで、戦闘シーンがハイドライドやボコスカウォーズのように体当たりで戦うアクションになっている。敵味方はお互い複数居るが、操作できるのは自分のキャラ1人で、味方もコンピューターが動かす。
このうち味方2人分をプレイヤーがジョイスティックで操作できるように改造した。(要するに3人で協力して戦えるようにした)
戦闘シーンはマシン語で書かれている(BASICのDATA文で数値だけ書かれていたはず)ので、手で逆アセンブルして、ジョイスティックで操作できるように書き換え、ハンドアセンブルし直した。
こういった改造をしたのに、マシン語部分のバイト数が改造前と一切変わらなかった!
我ながら感動して、今でも覚えているのだw
MSXエミュレーターは今ではMSX MAGAZINE永久保存版が定番だと思うが、当時はfMSXをいじっていた。
当時のマシンスペックのこともあって実行速度が遅かったので、なんとかしたいと思った。
採ろうとしたアプローチは、対象プログラムをホストマシン上のプログラムに変換してコンパイルして実行するというもの。
プログラムはZ80のマシン語なので、逆アセンブルしてC言語に変換し、コンパイルしてfMSXとリンクするという発想。(fMSX自体がC言語で書かれているので)
しかしマシン語(Z80)というものはプログラム部とデータ部がきっちり分かれている訳ではないので、どこがプログラムとして実行されるかを全て追うのは困難。
また、マシン語ではプログラムの自己書き換えが出来るので、コンパイルするならその部分を判別してエミュレートする必要がある。
ROMのプログラムならそういうことは無さそうに思えるが、メガロムの場合はページ毎にアクセスできる場所を切り替える仕組みになっており、その実現方法はROMによってまちまち。あるROMでは特定アドレスに書き込むとページが切り替わるようになっている(ROMはread onlyなのに、そこへ書き込む!)が、汎用的な決まりなど無い。
大体のところは、メモリーにアクセスする時に直接読み書きするのでなくfMSXのアクセスルーチンを使うようにすれば解決すると思うが、それだとスピード面で全然改善にならない(苦笑)
という訳で、立ち消えになった。
MSXエミュレーターのことはさて置き、MSXでプログラムを勉強するというのは、環境面でも非常に良かったと思う。
フロッピーディスクも普及してなかった頃なので、プログラムは雑誌の紙面に載っているものを全て手打ち(笑)
何かエラーが出たら、基本的には自分が何か打ち間違えているということなので、デバッグの勉強になる。
ソースも全部見られるし全部入力するので、何をやっているのか・どういう書き方をするのか・何が定石なのかという勉強になるし、気になる部分の改造も出来る。
当然の様に、雑誌には初心者プログラマーへの解説もあった。
インターネットなんか無い時代であり、雑誌自体も種類が限られているので、MSXでプログラムを作る人はほぼ全員同じ知識を共有できていたと思う。
(たぶんMSXでプログラムを作っていた人なら、ビット演算のXORなんて常識だと思うw)
今の時代、「インターネットで情報は何でも手に入る」とか云うけれど、個別の事はともかく、全員が共有できる知識なんてものはウェブ上には無いんじゃないか。
もうちょっと言うと、自分はMSX-BASIC→Z80アセンブラ→C言語→VC++→Java→Scalaと勉強してきた。
技術要素的には、BASICで基礎を覚え、アセンブラでメモリーアクセスを覚え、C言語で構造体を覚え(ポインターはアセンブラをやってれば難しくない)、VC++でクラスとイベントドリブンを覚え、Javaでオブジェクト指向を覚え、Scalaで関数型の考え方を勉強中という感じになる。
つまり新しい言語を勉強すると言っても、今まで覚えてきたことに新しい要素を追加するだけという感じ。
ところがこれを今の人がJavaやScalaから入るとなると、覚えることが多くて、そりゃ大変だろうなぁと思う。
(MSX-BASICなら、パソコンの電源を入れたらBASICの画面になるので、PRINT "hello"って書けばもうプログラミング完了だよ。インストールもコンパイルもツールの起動も何も要らない。初心者にとってどれほど楽かw)
まぁ逆に今の時代は入門書もいっぱい出ているから、なんとかなるのかもしれないけど。(どの入門書が良いのか探すのも一苦労かもしれないけど^^;)