効率の良い開発を行うには、まず開発環境を揃えるという話をハードとソフトの両面で、以前説明をしました。今回はもう一歩推し進めて、開発効率を上げる工夫にをします。
最初にサンプルファイルを提示します。
debug.zip
PC6001VW4 がインストールされているPCにて、このファイルを解凍して、同フォルダに AILZ80ASM をコピーして、以下のコマンドを実行するとビルドとデバッグ実行が出来ます。最初にサンプルファイルを提示します。
debug.zip
- _asm.batをダブルクリックする
- PC6001VW4 を起動して開発フォルダ設定をする
- PC6001VW4モニタモードから bat r と入力してバッチ実行する
- [G] で実行する
- テキストエディタ
私は秀丸を使っていますので、そちらでの説明となります。別のテキストエディタを使用している人は多いと思いますので、私の設定を参考として、各自でご自分のエディタをカスタマイズしてみてください。

私は、秀丸のファイルタイプ別設定で、.z80 の拡張子に対して、アセンブラという設定を指定しています。アセンブラという設定は下記のような指定としています。
・フォント
私はMS明朝を指定しています。ゴシックと比較して I と 1 と l や、0 と O の区別が付きやすいためです。また、等幅フォントじゃないと、アセンブラの場合は特にレイアウトが崩れて見づらくなります。
MS明朝が苦手という人もよくいると思いますので、私から見てオススメのフォントを少しご紹介します。
源ノ角ゴシック Code JP
その筋では有名なフォントです。ゼロのフォントは真ん中に中黒があるのがポイントで、誰が見ても O と 0 を間違える事はないでしょう。
Ricty Diminished
0 の中黒が斜線になっています。レトロPCではよくあるデザインです。あと、半角と全角のスペースが明確に違うサイズで設定されています。
その他、少し検索するだけでかなりの量のフォントが見つかります。私は OSの再インストールのたびに、フォントを入れ直すのが面倒になり、MS明朝に落ち着いてしまってたりします💦
・タブ幅
コンパイラ系では 4 タブが主流だと思いますが、Z80 では昔のPCがタブと言えば 8 だった名残りで、少なくとも私は 8 を常に前提としています。
・スタイル
デザイン/複数行コメントに「アセンブリ語」があるのでそれを選択します。その他多数設定がありますが…、えーい面倒だ、これを食らえ!(笑
このファイルを秀丸の、その他/ファイルタイプ別の設定/デザイン/保存/読込(&V)>> ボタンから、読み込みをしてみてください。まー、この辺りの趣味は人それどれなので、あくまでも参考までにと。
※ 地震での転倒防止に。私はクランプじゃなくてドリルでラックに穴空けてボルト締め固定としています。
- アセンブル環境
今回もアセンブラは AILZ80ASM を使用します。このアセンブラを使って出力したいファイルは以下の通りです。
- -bin バイナリファイル
- -sym シンボルファイル
- -lst リスティングファイル
- -err アセンブル結果の出力テキスト
また、タブは -ts 8 としたいのですが、そうなると毎回オプションを指定する事になります。AILZ80ASM ではデフォルトオプションファイルを作成すると、これらのオプションを省略する機能もありますが、.z80 ファイル毎にオプションを変更したいので、今回はこの機能には頼りません。
また、AILZ80ASM のアセンブル結果は %ERRORLEVEL% に反映されます。そこで、いちいち自分で結果を確認せずとも、自動で対応する仕組みを作りたいところです。そこで用意したいのは、アセンブル用のバッチファイルの作成です。
サンプルとして前回用意したファイルを少し構成を変更します。
- Main.z80 テストメインプログラム
- Define.inc システム定数定義ファイル
- Work.inc ワークエリア定義ファイル
- CheckP6.z80 PC-6001 機種判定プログラム
- Interrupt.z80 システム初期化プログラム
このように分解しました。
※ 補足/本当はもう少し綺麗にまとめられるのですが、それは AILZ80ASM に -equ オプションが付いてから再度紹介します。
さて、上記のファイルは、Interrupt.z80 は独立したプログラムとなっていて、アセンブルで出力されたバイナリを、Main.z80 ソース内で include,b するという構造としています。そのため、最初に Interrupt.z80 をアセンブルした後に、エラーがなければ続いて Main.z80 をアセンブルしたいです。これを実現するバッチファイルが以下の通りです。
_asm.bat
_asm.bat
@echo off SET ASM=AILZ80ASM.exe SET EDIT="C:\Program Files\Hidemaru\Hidemaru.exe" if exist *.err del *.err if exist *.lst del *.lst if exist *.sym del *.sym if exist *.bin del *.bin echo --------------------------------------- echo システム初期化プログラムのアセンブル %ASM% InitSystem.z80 -ts 8 -bin -sym -err if %errorlevel% neq 0 ( start %EDIT% InitSystem.err exit /b 1 ) echo : echo --------------------------------------- echo メインプログラムのアセンブル %ASM% Main.z80 -ts 8 -bin -sym -lst -err if %errorlevel% neq 0 ( start %EDIT% Main.err exit /b 2 ) echo : echo : echo アセンブルが正常に終了しました。 del *.err pause exit /b 0
各項目毎に説明します。
@echo off SET ASM=AILZ80ASM.exe SET EDIT="C:\Program Files\Hidemaru\Hidemaru.exe"
表示を綺麗にするために @echo off とした後で、アセンブラとテキストエディタのパスをエイリアス定義しています。こうすることで、パス変更の際は最初の行を修正するだけで対応が完了します。%ASM% がアセンブラのパスで、%EDIT% がテキストエディタのパス指定です。
if exist *.err del *.err if exist *.lst del *.lst if exist *.sym del *.sym if exist *.bin del *.bin
新旧のファイルが混ざると混乱の元となりますので、一旦、作り直す予定のファイルは全て事前に削除してしまいます。単純に del だけ記述すると、対象ファイルがないときにエラーが表示されて気分が悪かったので、exist チェックしてファイルがあるときだけ削除しています。
echo --------------------------------------- echo システム初期化プログラムのアセンブル %ASM% InitSystem.z80 -ts 8 -bin -sym -err if %errorlevel% neq 0 ( start %EDIT% InitSystem.err exit /b 1 )
最初のアセンブル処理部分です。こちらはリスティングファイルは不要なので、ファイル出力オプションは3つとなっています。また、タブ8前提で記述していますので、-ts 8 としています。
アセンブルの結果、エラーがあると %ERRORLEVEL% が 0 以外になるので、neq 0 で判定して、0 以外なら () の処理を実行します。問題発生時はエラー箇所をタグジャンプで確認したいので、出力された .err ファイルをテキストエディタで開いてから、バッチ処理を終了しています。
echo : echo --------------------------------------- echo メインプログラムのアセンブル %ASM% Main.z80 -ts 8 -bin -sym -lst -err if %errorlevel% neq 0 ( start %EDIT% Main.err exit /b 2 )
メインプログラムのアセンブル部分です。最初に echo : としているのは、前回のビルド結果表示との間に改行を入れたかったという見た目上の理由です。メインプログラム部分はステップトレースでの逆アセンブル表示を、ソースコードで追いかけるために、リスティングファイルの出力必要でしたので、ファイル出力オプションは4つとなっています。タブも 8 としています。
アセンブルがエラーの場合の処理も、システム初期化プログラムと同様となっています。
echo : echo : echo アセンブルが正常に終了しました。 del *.err pause exit /b 0
アセンブルが正常に終了したときのみ、バッチを自動で終了させず、正常に終わったという表示を見せるために pause で処理を一時停止としています。

これで、Main.z80 を修正後、フォルダ内の一番上に配置されている _asm.bat をダブルクリックするだけで、バイナリファイルまでの一連の流れを完全に自動化できます。今回はサンプルという事で、2段階アセンブルだけですが、ゲーム規模が大きくなるとデータコンバータの処理だとかも必要になりますので、都度、_asm.bat を拡張していく事になります。
【広告】
Anker
- デバッグ環境
無事アセンブルが完了してバイナリファイルが生成できたら、次は実行して動作確認を行います。エミュレータは私は PC6001VW4 を使います。一番最初にする事は開発フォルダの設定です。PC6001VW4.exe を起動した最初のダイアログの、オプション2 タブにある開発用フォルダを、*.bin 等が出力されているフォルダに指定します。

Start Emulation ボタンを押してPC-6001を起動したら、すぐに [Alt]+[F6] を押す事で、モニタモードに入ります。通常ではここで以下のように命令を発効します。
loadlist Main.lst loadsymbol Interrupt.sym loadsymbol Main.sym loadmem Main.bin 0x8000 r pc 0x8000
最初に loadlist でリスティングファイルを読み込ませます。続いて、loadsymbol でシンボルファイルを読み込ませます。リスティングファイルは逆アセンブル時のソース表示ですが、シンボルファイルはコマンド指定時にラベルを使うようにする読み込みです。逆アセンブル指定時に、u 0x8000 とかじゃなくて、u Main とラベルで指定できるので大変便利です。

loadmem でバイナリファイルを指定アドレスに読み込みます。最後に g としただけで即座に実行するように r pc として、レジスタ内容書き換えで PC(プログラムカウンタ)をデバッグするバイナリの先頭アドレスに指定しています。
…と、毎回このように入力するのはとても手間なので、PC6001VW4 はバッチ入力の仕組みが実装されています。*.bin 等のフォルダ内に、テキストの新規作成で r.p6b として、このファイルに上記の内容を全てそのまま記入します。このファイルが出来れば、あとは、PC6001VW4 のモニタから、bat r とするだけで、全てのコマンドを自動で発生してくれます。
ちなみにファイル名の r は TINY野郎 @tiny_yarou さんが実践した命名で、試してみたところ、bat とキーボード入力した時の、最後の t を打ったキーのすぐ左側に r があるので、試すと割と流れるように bat r <enter> と入力出来るので気に入っています。
さて、必要なファイル読み込みが完了したので、いよいよデバッグですが、よく使うのは次のコマンドです。
[Alt]+[F6] モニタモードに移行。何気に実行中断キーだったりもします。
[g] 実行開始。[shift]+[g]として大文字の[G]だとモニタモードを終了します。
[u] 逆アセンブル表示。u の後にスペースを空けてからラベルが指定できます。
[r] 現在のレジスタ表示。r A 0xFF 等とするとレジスタの値を書き換えます。
[b] ブレークポインタ指定。b アドレスでPCが来たら停止します。※1
[s] ステップトレース。1命令ずつ実行します。※2
[tab] メモリ編集モードになります。もう一度 tab を押すと元に戻ります。※3
※1 ブレークポインタ
b label とか b 0x8000 のような指定の他に、例えばとこか特定のアドレスに対して、書き込みや読み込みを行っても、プログラムの実行を停止する事が出来ます。例えば、b w WRK.IsPC6001 とすると、機種判定結果をワークエリアに書き込んだ直後にプログラムが停止します。b r WRK.IsPC6001 とすれば、ワークエリアの参照で停止します。b clear で設定したブレークポインタが全て消去されます。
※2 ステップトレース
マシン語を1行ずつ実行して、レジスタやマシンの変化を確認できます。デバッグの最も重要な機能です。[shift]+[s]として大文字の[S]でトレースすると、ステップオーバーになります。これで確認不要なサブルーチンの中をいちいちステップしなくても済みます。
※3 メモリ編集
ワークエリアを一時的に書き換えて動作を確認するなどに使用します。[page up][page down]で表示位置が変更できます。この位置変更の際に [ctrl] を同時押しとすると 0x1000 単位で大きくアドレスが変わります。[end]キーを押すと表示対象が変わります。面白いのが bmp 表示で、[page up][page down]同時押しで、画面の表示モードが変わるので、例えば裏画面に現在何が表示されているのかを、見て確認する事が出来ます。
上記のコマンド以外にも、例えばブレークポインタまでの実行時間の表示機能など、PC6001VW4 は多彩な開発支援機能があります。エミュ起動直後のヘルプ、モニタモードの ? コマンド、ヘルプ/ショートカット一覧等で、確認してみてください。



基本的なデバッグ方法としては、まず最初に普通に動作させます。どこかで暴走等の異常動作をしたら、まずはメインループでステップオーバートレースして、どこでおかしくなっているかを追い込んでいきます。ある程度の場所の特定が出来たら、1行ずつトレースして、自分が意図したレジスタ変化やPCジャンプになっているかを確認していきます。コンパイラ系と違い、アセンブラではこのような地道な調査が必要になります。
最後になりましたが、サンプルプログラム debug.zip は、実行すると画面が消えるだけですが、カーソルなどのゲームキーを押すと、そのビットに応じた●が表示されます。
以上、ご参考になれば幸いです。
※ いざというときのために机の引き出しに入れておくと安心です。
コメント