メインコンテンツへスキップ
見出し画像

MSXのマシン語ゲームの起動の遅さに耐えられなかったので起動ディスクを作成してみた

    毎度、rorosukeです。

    このところ、MSX1のSCREEN 3で動くインベーダー風ゲームを、AIを使って開発しています。その直近記事がこちらです。

    少し内容に触れると、ここではついにゲームプログラムのフルマシン語化を実現しました。これはもう、感無量です!

    イヤァァァアアアッハァアアアーーーーッ!!!


    思わず、「ちいかわ」のうさぎの叫び声を発してしまう私です。

    ただ、少し冷静になったところで、ひとつ、

    「ここ、どうにかならんかね?」

    と思うところが出てきました。それは……!



    ローディングがクッソ遅い問題

    ゲーム本体は、確かに全マシン語化できたのですが、起動時にはBASICでDATA文を読み取り、POKE命令でマシン語をメモリに書き込んでいます。この処理に時間がかかり、ゲームが始まるまでがとても長いのです。

    これについての解決策としては、次のようなものがあります。

    BLOAD命令で実行:
    マシン語をメモリに展開した状態で、BSAVE命令を使ってディスクに保存しておきます。次回からはBLOAD命令でまとめて読み込み、マシン語プログラムを実行します。BASICで一つずつ書き込む処理を省けるため、起動までの時間を大幅に短縮できます。

    turbo Rモードで実行:
    マシン頼みの解決案です。動作機種をturbo Rに切り替えることで、R800のパワーを使ってBASICそのものの速度を上げた状態で実行します。ローディングが高速化し、ノーマルMSXよりも起動までの時間を短縮できます。こちらは、いわばライフハック的な裏技です。

    画像

    MSXPenのオプションで調整:
    これも裏技的な方法です。MSXPenではQuick Optionsの「Z80 CPU Clock」でCPU速度を最大8倍速にできます。これを用いれば、ローディングは超短縮できます。

    画像

    BLOADを使った起動時間の短縮

    この中で、王道なのがBLOADです。これなら、起動時間は大幅に短縮できます。ただ、これを実現するためには次のお膳立てをしておく必要があります。

    1. ディスクを用意する

    2. マシン語プログラムをメモリに書き込むためのセーバープログラムを用意する(BSAVE命令を含む)

    3. プログラムを実行してマシン語プログラムをメモリに書き込み、ディスクに保存する

    4. マシン語プログラムをメモリに読み込むためのローダープログラムを用意する(BLOAD命令を含む)

    5. プログラムを実行してマシン語プログラムをメモリに読み込み、マシン語プログラムに制御を渡す

    MSXPenではディスクが扱えますし、ディスクイメージの保存と読込もできます。必要な機能はそろっているので、あとは実際に作業するだけです。



    ディスクイメージを公開します

    上記の作業をして作成した起動ディスクのディスクイメージを公開します。

    使い方

    MSXPenでディスクイメージをロードします。

    画像

    MSXをリセットします。

    画像

    これでAUTOEXEC.BASが自動的に読み込まれて実行され、マシン語プログラムがメモリにロードされ、ゲームが起動します。

    画像
    スペースキーを押すとゲームスタート
    画像

    あっという間に起動して、気分すっきり!



    起動ディスクの作成手順

    起動ディスクを自分で作成することを想定して、作成手順をまとめます。

    1.セーバープログラムとローダープログラムを用意する
    次の2つのプログラムをPCに保存します。

    セーバープログラム:INVADERS_SAVE.BAS
    マシン語プログラムをメモリに書き込んでBSAVEします。

    ローダープログラム:INVADERS_RUN.BAS
    BSAVEしたファイルをBLOADしてメモリに書き込みます。

    2.セーバープログラムをMSXPenで実行する
    INVADERS_SAVE.BASをMSXPenで実行します。メモリにマシン語プログラムが書き込まれ、完了するとディスクに、INVADERS.BINというファイル名で保存されます。
    ファイルができたかどうかは、FILES命令で確認できます。

    画像

    3.メモリ上のセーバープログラムを消去する
    いったん、セーバープログラムを削除します。それには、NEW命令を実行します。続けてLIST命令を実行して何も出てこなければ成功です。ディスクに保存したINVADERS.BINは残ります。

    画像

    4.ローダープログラムをコピーペーストする
    続けて、ローダープログラムを入力します。
    ローダープログラムをクリップボードにコピーしてから、MSXPenで次の操作をします。

    Alt+Vを押します。画面に「PASTE NOW」と表示されます。

    画像

    続けて、Ctrl+Vを押します。次のようにプログラムリストが入力されます。

    画像

    注:私の環境では、左側のプログラム入力枠に入れて「Run」を押すと、作業中のディスクが置き換わり、保存したINVADERS.BINが消えてしまいました。そのため、ここではエミュレーター画面に直接貼り付けます。

    5.AUTOEXEC.BASとして保存する
    AUTOEXEC.BASというファイル名でディスクに保存します。AUTOEXEC.BASは、MSX起動時に自動実行される特別なファイルです。

    SAVE "AUTOEXEC.BAS"

    今回の作業用ディスクにあるAUTOEXEC.BASは、上書きしてかまいません。
    保存したら、FILES命令を実行してディスクの中を確認しておきましょう。

    FILES
    画像

    6.ディスクイメージを保存する
    起動ディスクができたので、このディスクイメージをローカルに保存します。

    画像

    これでPenDisk.dskというファイルがローカルにダウンロードされます。適宜ファイル名を変更しておきましょう。



    作業中におきた問題

    この一連の作業を行っているとき、不可解な問題が起きました。それは、

    BLOAD、BSAVE命令の挙動がおかしい

    というものです。実際には、BLOAD、BSAVE命令を実行すると「SYNTAX ERR」になってしまいました。

    非常に悩んで、ついに原因がわかりました。

    なんと、マシン語プログラムを書き込んでいるときに、ディスクのワークエリアを破壊してました。これでは何がおきても不思議ではありません。

    そこで、マシン語プログラムの配置場所を、ディスクのワークエリアと重ならないところに移動したところ、おかしな挙動がなくなりました。

    現在のPCでは、通常のアプリがOSの管理領域を直接書き換えることは制限されていますが、当時のMSXでは、書き込む場所を間違えるとシステムの作業領域まで壊してしまいます。
    その意味で、ひさびさに8ビットパソコンの洗礼を受けた気分。

    やっちまったよー!



    まとめ:すっかり命令を忘れました

    久しぶりにMSXのコンソール操作と向き合うことになりましたが、完全に命令を忘れてますね。

    プログラムの全削除ってなんだっけ?  AIで確認したら「NEW」でした。

    ファイルの削除ってなんだっけ? 「DELL」だっけ? 違うか。じゃあ「REMOVE」? AIで確認したら「KILL」でした。

    覚えてねぇ!

    そんなわけで、七転八倒した結果、起動が速くなって快適です!

    以上!



    追記:続きの記事を書きました

    カートリッジROM化に挑戦しました。


    #時産時利 #AI活用 #時短術 #MSX #マシン語 #Z80 #MSXBASIC #Claude #生成AI #レトロパソコン #レトロゲーム


     
     
    AIで時間を生み出す実験をしています。 元PC系出版社編集者。 Claude・ChatGPT・Geminiを並行使用しながら、 実践した話だけを書いています。

    あなたへのおすすめ