ROMファイルを作ってみた

2017/5/17 | 投稿者: ghost

自身としては今更ながら初めての経験となる、フルアセンブラのROMファイルをアセンブルしてみたテスト。


<アセンブルからテスト実行まで>

スペインでROMカートリッジの製造・販売をやっていて、MSXDev主催者の一人でもあるマニュエル=パゾス氏に教えてもらったオンラインZ80アセンブラを使ってテストコードをアセンブルし、生成されたバイナリファイルをWebMSXに読み込ませて実行するまでの一連の流れを動画にしてみた。拍子抜けするほど簡単、しかも(当たり前のことだが)MSX自身によるセルフ・アセンブルに比して圧倒的に速い。

テストコードはPuzzle Invisible rev.II、およびゼビモドキで使ったBGM/SEドライバをROMフォーマットに翻案したもので、これに名称未定の新作のメインテーマ(Triumphのブラックドラゴンのテーマ曲のアレンジ版)を演奏させている。

全部流用じゃねーか、と言ってしまえばそれまでなのだが、これが存外面倒臭い話で、件のBGM/SEドライバは音階をPSG値に変換する参照テーブルの隙間にワークエリアを配する、というふざけた造りになっていたのだが、今回はROMフォーマットを採用している都合上、こういったやりかたができない。

当該アドレスはROM、すなわち読み取り専用メモリであり、ワークエリアはRAMが割り当てられるアドレスに設定しなければならない。同じ理由から、ROMフォーマット開発では自己書き換え型のコードも禁忌となる。

こればかりは仕方がないのでチマチマと当該部を修正し、結果的に音階テーブルにオクターブ毎に8バイトずつ現れるもったいない隙間には、新たに追加したビブラート機能の音程調整用データを入れることにした。メロディがふわふわいってるのがそれ。転んでもタダでは起きないのだ、ま、別に転んでなんかいなんだけども。

それはそれとして、動画の途中(1分30秒目)あたりで一旦WebMSXをリスタートしているのは、この時点でWebMSXのモードを日本版MSXからヨーロッパ版MSXに切り替えているから。


MSXの垂直同期(VSYNC)に60Hzと50Hzの二種類があることは拙稿中でも繰り返し触れていて、前作の開発に際してはあやうくこれに関わる無駄なことをしてしまいそうなところをIMANOKに救われたことも、覚えている人は覚えていると思う(いや、んなワケない)が、VSYNCを任意に切り替えれるようになったのは実はMSX2以降の話であって、初代無印MSXはハードウェア毎にVSYNCが50/60Hzに固定されている。

なので、前作開発時に「なんで無印MSX用じゃないんだ!」と散々文句を言われたことを根に持って今回は無印MSXでやってやろうじゃねーかモードになっている今回こそは、何らかの対策を講じないと、たとえば日本版MSX(VSYNC:60Hz)を前提に開発したゲームのBGMがヨーロッパ版MSX(VSYNC:50Hz)ではモタついて聴こえる、ということが起こるのである。動画を見てもらえばわかるように、それぞれのVSYNCにおいてBGM演奏速度に違いは感じられないと思う(厳密にはちょっと違う、後述)。

原理的には何も難しいことはないのだ。

音符毎の音の長さ(x音符の間にVSYNCをn回数える)はテーブル構造になっているので、これを50/60Hzそれぞれに用意しておき、起動時にMSXに本体のROMの002Bh番地の第7ビットを読んでVSYNCを判別し、このテーブル構造を16バイトのRAMへコピー、以降はRAMにコピーされた音長を参照して動作させればよい。

クリックすると元のサイズで表示します

上掲表に示したのが今回採用している音長テーブルである。音楽に通じている人ならば、コレを見ただけで既にピンと来ているだろうとは思うのだが、十六分音符までを使う分にはまったく問題はない。問題が起こるのは三十二分音符、さらには十二分音符(いわゆる三連符)を使う段に至ってである。

たとえば十二分音符を例に見ていくが、十二分音符とは四分音符を三分したものである。ということは、十二分音符の音長を3倍すると四分音符のそれにならなければならない。が、上表では60Hzの場合これが成り立っていない。28は3で割り切れないからである。「なら、十六分音符までで曲を作ればいいじゃん」と言ってしまえばそれまでなのだが、今回のメインテーマにはどうしても三連符を含む曲が使いたかった……というか、一度そういう曲をやりたい、と思い浮かんだらそれ以外に何も思い浮かばなくなってしまった、と言うのが正しい……ので、無理矢理これを実現することにした。

これも原理は簡単なのである、面倒臭いことを除いて。

要するに、十二分音符とは別に“調整用十二分音符”というものをデッチあげてやればいい。これの長さをVSYNC:60Hzの場合に10と定め、三連符が現れる毎にたとえば最後の1回だけはこの調整用十二分音符を使ってやる。すると、9+9+10=28で、意図通り四分音符と同じ長さになる。厳密に言えば本来あるべき発声時間に比して0.0005秒だけ前のめりになっていることになるが、まぁ、普通の人の耳ではこれはわからないから実用上は何の問題もないのである。演奏用データを入力する際、さらにはそのデバッグをする際にとても面倒臭い、ということを除いて。

ちなみに、VSYNC:50Hzの音長テーブルでは、十二分音符と調整用十二分音符の長さは共に8になっている。こちらは四分音符の音長が24であり3で割り切れるからだ。

とまぁ、こういうどうでもいい地味な作業の積み重ねで冒頭の動画の演奏が実現されているのだ、という話を誰かにしたかったので書いてみた。なお、この動画を作ってからやはりアレンジが気に入らなかったので、ティンパニ(のつもりなのだよ、アレは)パートとベースパートの配分を入れ替えた。完成版ではまた異なるアレンジをお届けすることになると思う。

こんな調子で進めて完成すれば、の話だが。
タグ: MSX Z80



コメントを書く

名前
メールアドレス
コメント本文(1000文字まで)
URL





AutoPage最新お知らせ