ダウンロード
zipファイル:百鬼夜行(マシン語版)zipファイル:百鬼夜行(マシン語,左右版)
どちらも100.BASから起動します。
百鬼夜行(マシン語版)
百鬼夜行はturboRのBASICはどれくらい速いのかの検証に作ってみたゲームだったので、MSX1の機能しか使っていないのにturboR用という贅沢なものでした。
それでもアクションゲームには辛い速度だったので、今度はZ80のマシン語で作ってみるとどうなるかという実験です。(BASICと同じ内容のものをマシン語でという比較もあまりなさそうなので。)

タイトル画面です。半透明に見えるのは、BASIC版よりも多くのキャラを識別できるように点滅処理をしているイメージです。これだけ多くのキャラクタを表示しても遅くなった感じはありません。速度が遅いインデックスレジスタをバンバン使って、座標も24bitで処理し、スプライト点滅処理など、特別速度に気を使わずに作成しましたがこれくらいだとまだ大丈夫のようです。
ただこれではBASIC版より難し過ぎるのでオマケを入れてあります。タイトル画面やゲームオーバー画面で1~3キーを押すことでゲーム速度が可変します。1=100%、2=75%、3=50%となっていて、4キーはハードモード(3周クリアに相当)のトグルです。
その他BASIC版との違いは、周回クリアで1画面に登場する敵が1体ずつ増える、シュッと移動するときの無敵時間延長(BASICでは移動途中で無敵は切れていた)、ノックバックからの復帰(黄色に光る瞬間が)延長、があります。特にノックバックからの復帰は1フレームでは難しすぎるので、20フレームまで増やしてその間無敵としました。
難易度

難易度的には、17体目辺りが最初の山場になるようです。難易度調整前はこのシーンに3体の敵が同時出現していましたが、あまりにも難しいので1体を時間差で登場するようにずらしました。それでも簡単にはなりませんでしたが…。

その後のコウモリ連発と

ヒヨコの挟み撃ちが難所となっています。
この難易度もゲーム速度によってずいぶん違ってくるようです。
左右版
このゲームはBASICのもっさりした動作の為、簡単になりすぎないように(更に処理も軽くなるように)右にしか攻撃できない制限を加えて、左側から来る敵の対処法に頭を使う状況が発生すれば面白いかも、ということで振り向けないゲームデザインとしました。
しかしマシン語で動きに制限がなくなると今度は普通に左右攻撃ができればどうなるのかという部分が気になります。そこで左向きができるように変更を加えてみました。

これはこれで、少し違った操作感になりました。しかし依然として難しさは変わらないので、3体倒すごとにハートが1つ回復する機能を付けています。これだと結構回復量が多いので3周位までプレイできるようになり、敵の量も増えてアタフタ感を楽しめるようになった気がします。
プログラムの話
最初はBASIC版の動作関連部分だけをマシン語化し、表示やBGMはBASICのままを考えていました。
ところがUSRで呼び出したマシン語実行とBASICのinterval割り込みが相容れないことが分かり、表示からBGMまで全てマシン語部分で処理するようにしています。
BGMを演奏しているのはPLAY文の内部ルーチンで、MSX-Datapackを参考に取り入れたのですが、どうも動作がおかしくうまくいきません。途中で音が途切れたりするし、演奏処理をしていない効果音の方にも影響が出たりします。
Datapackのサンプルプログラムも説明に無いダミーデータがあったりとよくわかりません。
終いにはblueMSXでは正常に動作するけれど実機turboRでは何故か暴走する状態になってしまい、PLAY文の内部データを再生する簡易な互換ルーチンを自作することにしました。自作の方は内部動作がよく分かっているので変な挙動も無くなり、実機でも暴走せずに動作しています。