見出し画像

GAME言語で作ったアセンブラ

GAME言語 - TinyBASICからC言語への橋渡し

で紹介したGAME言語ですが、スーパーテキストを使ってテキストベースで動くゲームをフォント設定でそれっぽくグラフィック表示するという手抜きプログラミングをしたりしていましたが、そろそろ世に出回っているゲームの進歩が素晴らしく、作るよりも遊ぶほうが忙しくなっていたのは確かです。

ちょうどCPUを載せた拡張カードが押し寄せてきて、いろいろなアセンブラコードを書く必要に迫られていました。6502にしても、いつまでもROMに載っているミニアセンブラで済ますのは辛くなってきたこともあります。

そこでアセンブラを書こうと一念発起して、GAME言語を使って、6502、6800、6809、8080、Z-80の汎用アセンブラを作り始めました。マクロはありません。ラベルが使えるだけです。さすがにひとつのコードで全部に対応するのは面倒なので、同じパーサとコードジェネレータで、ニモニックテーブルを入れ替えればOKという作りにしました。さすがにちゃんとしたご本家と互換性のあるものを作るのは大変で、少しだけズルをして、ニモニックの後ろにアドレッシングモードのヒントを示す記号は書くことにしました。これで間接アドレス表記の違いは吸収してしまいました。まあ使う人が自分しかいないので、何も問題ではありません。ラベルの展開と相対アドレスの計算をしてくれれば十分です。0~9で始まれば10進数。$で始まれば16進数です(80系の人ごめんなさい)。A-Zで始まるのはラベルまたはニモニックで、これは行内の並び順で判断できます。

こういうのを手早く書くにはGAME言語は向いていました。6502と6800は何も考えずに動きましたし、6809はポストバイトの処理が面倒でしたが、それも数日程度の手間でした。Z-80は2バイトコードがあるのですが、6809でその処理は書いたので、使い回しです。ラベルのアドレス解決は2パスにして1パスめに解決して表を作ってしまうので、2パスめではコードを確定できます。オンメモリなんで2パスあっても気になりません。エンディアンもフラグひとつで変えられます。

本当は6809のショートブランチ、ロングブランチの使い分けなんて自動判定にしてみたかったのですが、あんまり凝るよりもはやく動くようにしたかったんです。なにせ書きたいコードが控えていたので。GAME言語で書いたので、基本的にはどのプラットフォームでもクロスアセンブルできるのは便利でした。もっともファイルの読み書きがDOSベースだったので、少しだけ移植が必要でした。

いろいろなCPUやOSを使うようになりはじめて、システムのプログラムばかりいじるようになって、コンピュータにはどんどん詳しくはなっていきましたが、いったい何がしたいのかはだんだん混沌としてきた記憶があります。

いいなと思ったら応援しよう!