高機能アセンブラ AILZ80ASM ですが、このところの進化が止まりません。凄いことになってきているので、最近追加された新機能について解説していきます。



  • #pragma once 多重読み込み防止
C# 等の高級言語では、プリプロセッサとして当たり前にように実装されている、多重読み込み防止指定が #pragma once です。従来は適当なラベルが定義済みかどうかで多重読み込みを防止していましたが、AILZ80ASM の機能を使えば…
AILZ80ASMの多重読み込み防止指定
このようにファイルの先頭に  #pragma once と記述するだけです。あまりに普通に使えるので、この記事を書こうと思うまで、存在すら忘れていました。基本中の基本、無くても代替え方法はありますが、これを使い始めたら、他のアセンブラがとても煩わしく感じてしまいます。


  • #LIST リスティングファイル出力指定
ソースではマクロ定義やシステム定数など、わざわざ見る必要がないのも存在します。従来のアセンブラでは、それらも全てリスティングファイルに出力されていました。システム定数なんてのは、物凄く長いんですよね。その割には、そのアドレスや定数などの定義を見る必要なんてのはなくて、意味なくリスティングファイルが長くなって読みづらくなっていました。

AILZ80ASMでは、#LIST に続いて #FALSE と指定することで、以降のリスティングファイル出力を抑止することが出来ます。そして、#TRUE にすると、元通り出力が再開します。
AILZ80ASMのリスティングファイル出力制御
Define.inc, Macro.inc, System.inc を #LIST #FALSE 指定しています。結果、リスティングファイルには
リスティングファイルで余分なコードが出力されていない
どうでしょう、綺麗さっぱり出力が抑制されています。おかげでとてもコードが読みやすくなりました。ちょっとした事ですが、あるとないとで大違いです。


  • ALIGN 境界指定
アセンブラでは、実行速度を稼ぐために、データの配置を特定位置に固定する事があります。例えば、画像データは偶数から配置する事で、最初のインクリメントでは桁上りが起きないことを保証できるので、inc l, inc hl, inc l, inc hl と 2サイクルずつ端折る事ができます。たかが2サイクルと侮るなかれ、データ位置アクセスの多くは画面表示ですから、かなりの回数の呼び出しがあります。その呼出先のループ内の2サイクルですから、結構全体で見ると大きいのです。
※ 偶数配置は ALIGN 2 と記述します。

敵管理ワークを16バイトで構成して、それを ALIGN 16 で指定しておくことで、ワークの操作を inc l, dec l だけで出来るようにもなります。xxx0 - xxxF のアドレスの範囲であれば、絶対に上位アドレスの変化がないことを利用した高速化です。これも、ALIGN 16 がなければ ORG で代用はできますが、一瞬何をやっているのか分かりにくいですよね。

他にはデータを xx00 番地から配置することで、下位アドレスの補正のための加算を省くことが出来ます。
AILZ80ASMのALIGN
計算結果に上位アドレスを入れるだけでテーブル参照アドレスが完成します。素晴らしい!

※ なんとカップヌードルにタンパク質が15gも配合!さらに低糖質で食物繊維入りという健康志向のカップヌードル。SAVASのプロテインが20g配合ですから、15gってかなりのものです。美味しくタンパク質取得で言うことなし!

  • CHECK ALIGN 256 境界跨ぎの監視
計算上、どうしても 256の範囲に収まっていないと困る処理があります。これの位置を、ALIGN で指定すると無駄な空間が出来てしまうのでそれは避けたいが、ただ 256 境界を跨いでしまうと不具合が発生するのでそれも困るという場合があります。そこで CHECK ALIGN 256 です。
AILZ80ASMのCHECK ALIGN256
このソースコードは、先日 X(Twitter)で沢山の有識者により最適化されたキー入力ルーチンです。このルーチンはプログラムの中にテーブルが仕込まれているという、かなり特殊な構造をしています。高速化のためテーブル参照も特殊ですので、この該当範囲は 256 境界内に収まっているのが大前提です。そこでこの範囲を CHECK ALIGN 256 ~ ENDC で囲むことにより、もしアセンブルの結果、境界を踏む事があれば
境界を跨ぐとエラーとして処理される
このように E6012 エラーとして出力されるというわけです。時々、256 境界を踏んで動作不良になり、都度、バグ探しをして腰砕けになる時間のムダが、これですっきり解決してなくなります。私にとってはこの恩恵はとても大きく、また他のアセンブラではこんなにスマートにはいかないので気に入っています。


  • ENUM 列挙体(ラベル連続定義)
最後に紹介するのが列挙体です。コンパイラではお馴染みの命令ですが、これが AILZ80ASM に搭載されました。この生産力は素晴らしいです。百聞は一見にしかず、まずは比較画像を見てください。
AILZ80ASMのENUMマクロ
左が従来のラベル定義、右が ENUM に置き換えたコードです。まず、なんといっても見やすさが違います。そして、最大のメリットが、ラベルの並び替えがあっという間に完了することです。アセンブラでは、処理の最適化でワークの使い方を変更することは多々あります。以前の書き方だと、いちいち equ を全て書き換える必要がありましたが、ENUM を使えば、ラベルを並び替えるだけで終わりです。また、equ の置き換えとしても優秀です。下手すると equ を全て駆逐する勢いで便利なのです。

如何でしょうか。このところの AILZ80ASM の進化は凄いです。現時点で少なくとも私はこのアセンブラが歴代ナンバーワンの素晴らしいアセンブラになっています。現状では Z80 だけが対象ですが、作者の Ishino さんによると、構造的には他の CPU にも対応可能だということです。アドレスバスが 16bit より大きくなると難しいかもですが、それ以外の 6502, 6809 から HD64180 ぐらいは対応可能かもですね。HD64180…えっと、Ishino さんに動作確認用の PC を寄贈すると作ってくれたりするかも😁
※ 責任持てませんので迂闊な行動はお控えくださいw

※こちらは塩分控えめバージョン。高血圧など、塩分の摂り過ぎは身体に良くないと言われています。でも、これなら大丈夫(食べ過ぎに注意)。加えて高齢者に多い骨粗鬆症防止にカルシウムとその吸収促進のビタミンD配合です。美味しさは定番の日清カップヌードルですから文句なしです!