いまさらだけどゲームマシン語入門

ねぇ、マシン語ってしってる?

こんにちは、こたかです。

マシン語って言われて何を想像しますでしょうか。
CPUが直接理解できる言語と聞いたことがありましたが、想像がつきませんでした。
「マシン語は数字でできています。」さらに謎が深まるばかり。それって数字に意味があるってことですよね。

じゃあ、「CPUが理解できる言葉をちょっとでもいいから教えてくださいよ。」そう思っていました。

はい。16進数で失礼しますが「CD21」。INT 21H なんちゃって。システムコールです。
ASCIIコードのようにCPUにも命令セットというものがあり、数字と命令のマップがあります。

IA-32 アーキテクチャマニュアル
https://www.intel.co.jp/content/dam/www/public/ijkk/jp/ja/documents/developer/IA32_Arh_Dev_Man_Vol2A_i.pdf
pdf内を検索:「INT imm8」3-382ページ。「CD id」となっています。
このドキュメントは「複写禁止」なので、出回っていないということだと思います。
「命令セット リファレンス A~M」なので、ドキュメントが多すぎて、分割されているようです。
IA32_Arh_Dev_Man_Vol2A_i.pdf (A-Mまで)
IA32_Arh_Dev_Man_Vol2B_i.pdf (N-Zまで)
これを理解するにはAXレジスターやキャリーフラグなど、CPU内の役割を持った変数について調べることをおすすめします。

これがマシン語の答えですね。

それで、CPUによって共通の命令とCPU仕様に依存した命令があります。
例えば、MMX命令はMMXに対応したCPUでないと理解できない数字の列となっています。

x86系命令であれば、x86系CPUは解釈できます。これがCPUの互換性になっているわけです。

それで、マシン語ってなにかメリットある?

今となってはC言語コンパイラーが良い感じにマシン語を生成してくれます。
CPU依存命令に対応している場合もあります。なので、マシン語自体にはほとんどメリットないです。

ただ、一部どうしてもマシン語を使う時があります。
APIフックを使う時の、先頭部分などです。呼び出し規約やスタックをずらす時に役立ちます。

これってほとんどコンピュータウィルスと同じ手口ですが、多くはシステム監視のために作られ、組織のシステムを守っています。

マシン語は昔、魅力的だった

マシン語はCPUがそのまま実行できるので、余分な変換が無く高速と言われていました。
その昔、NECのN88BASICはパソコンに標準装備されている言語でした。
BASICはリターンキー(今のEnterキーですね)で命令文を入力した瞬間、部分的に数字に変換されます。

実行しやすい形、つまりスクリプトをBASICの命令の対応する数字に置き換えていると推測されます。なので、DISK版とDOS版でソースを読み直すと、命令が変わってしまう現象が起きていました。FDISK文だったかな。

そして、BASICは実行が遅かったのです。ゲームを作りたければ386以上のCPUが欲しかったわけです。
しかし、私のPCはV30。8086、16MHzのCPUです。ESP32の方が速い!!!

そこで、マシン語を使って、画像転送だけ高速化します。Direct2Dのサーフェス間のメモリコピーのようなものです。
N88Basicは半透明処理が苦手で、PNGファイルのAlpha0%/100%合成のようなことをすると、2回描画する必要があるのです。
なので私は1回で描画できるようにマシン語で関数を作りました。

この関数のおかげで、ゲームが成り立つ程度まで速度アップできました。

その他、ランレングス圧縮ロジックと組み合わせて、フロッピーからキャラクターロードの時間を50%短縮したりできました。
この技術ではRPGの敵キャラが出るまでの時間を短縮できました。

限界を超えることのできる「魔法」だったのですが、現代では失われた古代魔法、しかも価値が下がってしまって、残念です。

魔法の本

現代での魅力ある「魔法」はどうなってる?

2023.02.10現在での現代に感じる魔法は、「オープンソース」です。
沢山の開発者の方たちが提供している、MITライセンスのライブラリは、著しく開発時間の短縮に貢献します。
ゲームの実行速度が速くなるのではなく、開発が速くなるのです。
良い時代になってきました。まだまだ奇跡は起こりますね。

それでは、また次の記事でお会いしましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です