ゲームを録り溜めていくと、そのうちテープに記録した構造を忘れて焦る事が多々あります。少なくとも私はそうです。そのため、そんな事が起きないように、カセットポンで mon<ret> L<ret> と入力するだけで、勝手にロードして勝手に実行する IPLもどきを作成して、ゲームプログラムの先頭に保存するようにしました。これでもう何も恐れる事はありません。

いくつか自動起動には方法がありますが、私はその中からファンクションキー処理を利用する方法を選択しました。この方式の最大のメリットは、BASICプログラムもロードする事が出来る事です。やろうと思ったら画面の初期化すら勝手に実行する事も出来ます。

ファンクションキーの入力フラグは 0xEA68 にあります。ここを 1 にするとファンクションキーが押された事になります。そして、その 1 の入力は、0xEAC0 からの文字列を使用していきます。終端コードは 0x00 です。なので、最初のマシン語ロードでこの領域を書き換えてしまえば、マシン語モニタに戻ったときにはファンクションキーが押されたと判断されて、後は勝手に処理されていくのです。

注意点としてはいくらでも命令を書いていけるわけではないという点です。私自身は限界を追求したわけではないので、アレですが、100バイトとか記述してしまうと、BASICのワークエリアの中だけに危険なかほりが漂いますよね…。さ、さて、では、以下、いくつか具体的な例を挙げてみましょう。


  • マシン語のみ
これは簡単です。手入力するのと同じように L<ret> GXXXX<ret>とするだけです、ここでは試しにプログラム開始アドレスが C000 としてプログラムを書いてみます。
; L<ret>
; GC000<ret>
;
org 0xEA68
db 0x01 ; キー入力ON
ds 0xEAC0 - 0xEA68 - 1
db "l", 0x0D, "gC000", 0x0D, 0x00
繰り返しマクロREPT では 0xEAC0 まで 0x00 で塗りつぶしていますが、ここは DS としても問題ありません。


  • BASIC + マシン語
最初にマシン語の読み込みとして、最後にBASICプログラム読み込みでカセットテープに記録します。こうする事で僅かにですが IPL部のサイズを縮める事が出来ます。
; L<ret>
; [Ctrl]+[B]
; CLOAD"BASIC"<ret>
; RUN<ret>
;
org 0xEA68
db 0x01 ; キー入力ON
ds 0xEAC0 - 0xEA68 - 1
db "l", 0x0D,
db 0x02, "CLOAD", 0x22, "BASIC", 0x22, 0x0D
db "RUN", 0x0D, 0x00


  • 画面の初期化 + マシン語
最後に画面の初期化とマシン語ロードです。BASIC+マシン語の構成でBASICで何やってんのかなって思ったら、実は画面の初期化だけだった…ての、たまーにありますからね(言い訳
; [Ctrl]+[B]
; CONSOLE0,25,0,1:WIDTH80,25:COLOR7,0,1
; MON<ret>
; L<ret>
; GC000<ret>
;
org 0xEA68
db 0x01 ; キー入力ON
ds 0xEAC0 - 0xEA68 - 1
db 0x02
db "CONSOLE0,25,0,1:WIDTH80,25:COLOR7,0,1", 0x0D
db "MON", 0x0D
db "l", 0x0D, "gC000", 0x0D, 0x00


  • アセンブルしたcmtを組み込む
上記で示したサンプルを自分用に改造してアセンブルします。出来たバイナリを ipl.cmt とします。この ipl.cmt をバイナリコピーで結合します。例えば、月刊アイオー掲載の PCGギャラクシアンを自動起動させる場合は、自動起動 IPL.cmt + マシン語プログラム galaxM.cmt + BASICプログラム galax.cmt として、Galaxian.cmt を作ります。

copy /b IPL.cmt+galaxM.cmt+galax.cmt Galaxian.cmt

あとは、この Galaxian.cmt を mon<ret> L<ret> として読み込むだけです。
PCGギャラクシアン
PCGギャラクシアン 月刊アイ・オー 1981年1月号 ©芸夢狂人

以上、皆様方の PC-8001 ゲームライフが少しでもラクになれば幸いです。