NRTDRV for PC-8801


img
X1 用のサウンドドライバとして公開されている NRTDRV を PC-8801 で動くように移植してみました。
88 + OPM 拡張ボードというかなりレアな環境で、聞き慣れた OPN サウンドとはひと味違う音が楽しめます。



■ NRTDRV を PC-8801 シリーズで動かす

NRTDRV の概要および使用方法については本家サイトをご覧ください。

NRTDRV for PC-8801 Series 20170303版 (D88 イメージとソースコード)

対応機種は 0x32,0x44,0x45 の I/O ポートが使える機種(=SR以降)ということになりますが、ソースを書き換えれば 80SR でも動きます(後述)。
PC88 での演奏には HAL 研究所が発売していた YM2151 搭載ボード"響" が必要となります。
"響"は 1 枚しか刺せない(と思う)ので、扱える曲データは OPM 8ch + PSG 3ch が最大です。

ひとまず、環境を構築して MML のコンパイルが出来る状態であるとして説明します。

本アーカイブを解凍すると、以下のように展開されます。srcdos と srcnrt88 はプログラムソースが入っているだけなので消してかまいません。



MML のコンパイルに成功すると NRTDRV\hoot\x1 の中に x1nrtdrv.zip ファイルが生成されますが、使用するのは ZIP ファイルの中の拡張子が NRD のファイルだけです。
その NRD ファイルを、mus フォルダにコピーしてください。127 曲まで 2D ディスクイメージの容量の許す限り(320KBほど)格納できます。
コピーしたら、makenrt.bat ファイルをダブルクリックすると、mus フォルダ内の NRD 曲データがディスクイメージ nrtdrv88.d88 に書き込まれます。
曲のファイル名は 8+3 形式(ファイル名 8 文字 + 拡張子 3 文字)制限があります。長いファイル名や空白はダメです。

mus フォルダの中には nrt88.bin というファイルが最初から入っていますが、これは NRTDRV88 本体なので、消さないでください。

!注意!NRTDRV のバージョンアップに伴い、過去の NRD ファイルがそのまま使えないことがあります。MML ファイルから再コンパイルが必要です。

c:\>udostool nrtdrv88.d88 mus  
mus フォルダの中にあるファイルを一括書き込みします。
添付の makenrt88.bat をダブルクリックしても同じ動作になります。

c:\>udostool nrtdrv88.d88 SONG.NRD -a 
とすると、1曲ずつ追加が出来ます。

c:\>udostool nrtdrv88.d88 SONG.NRD -d 
とすると、1曲ずつ削除が出来ます。

c:\>udostool nrtdrv88.d88 -l 
とすると、入っているファイルのリストが表示されます。



できあがったディスクイメージを起動するとオートスタートします。
ファイル選択画面から再生したい曲を選んで Return キーを押すと再生を開始します。

エミュレータで実行するには、"響"をエミュレートする拡張モジュールが必要です。
今のところ M88 に PcgSound.m88 を組み合わせる方法で鳴らすことが出来ています。

PcgSound.m88 は 80mkII愛友会で公開されています。
素晴らしいエミュレータとモジュールを公開していただき感謝します。

JAVA 環境で動く 88エミュレータ j80 でも動作可能になりました。

音源エミュレータ hoot にも PC88 + 響の環境が組み込まれているようなのですが、NRTDRV を聞く限りでは意味が無いので割愛します。

本 88 移植版には本家 NRTDRV のコードの一部が含まれています。
NRTDRV を開発された naruto さん、NRTDRV developers の皆さんに謝意を表します。


道具(=ドライバ)を弄るばかりで使わないのは勿体ないので、いくつか曲を置いておきます。

7th Dragon より <26:タウン−カザン> RETRO version.
7th Dragon より <30:タウン−マレアイア> RETRO version.

NRTDRV でやる意味がある曲なのかといわれるとアレなんですが。

■ メモ

X1 で鳴らす場合と比べて、FM/PSG の音量バランス、マスタークロックのわずかな違い、テンポ管理方法の違いなどがあります。

88 本体で使っているのは OPN の PSG 部分と Timer-A と RTC タイマー割り込みだけです。
元のドライバにはソースレベルで極力手を加えず、メモリマップもほぼそのまま、少々のパッチ部を追加した程度です。
パッチを当てた後は演奏開始を指示して UI 以外は空ループを回しているだけなので、元の NRTDRV のエントリもそのまま使えるはずです。

 MAIN_RAM
 $0000-$02FF iosys メイン側ディスクルーチン(768byte)      
 $0300-$04FF ディスクルーチン用バッファ(512byte)
 $0500-$0CFF ファイル情報格納バッファ(2048byte)
 $0D00-$17FF NRT88 本体 SP=$1800
 $1800-$39B1 NRTDRV オリジナル 2016.12.17版
 $4000-      曲オブジェクト


テンポが遅いです。初めはテンポの変換(X1CTC -> 88Timer)を間違えているのかと思ったのですが、エミュレータのクロックを上げていくと正常になるので
普通に処理が重いという結論に…。ただ、X1 で 16 音鳴るのに 88 の 8 音でこの重さは謎です。
せめてレベルメータくらいはつけようと思っていたのですが、この重さ(と原因)を目にした結果、あえなくキャンセルとなりました。

→ 第2版で修正しました。

今後の本家のバージョンアップに追従できるかどうかは分かりませんが、短いので少し弄るだけで大丈夫だと思います。

ディスク使用状況。
 trk.0  sec.1 - trk.0 sec.9 : 簡易 DOS
 trk.1  sec.1 -             : NRTDRV88 & 曲データオブジェクト   


ソースファイルからコンパイルする場合は、オリジナルの NRTDRV.ASM が必要です。
3カ所ほど修正が必要になります。 nrt88.z80 をご覧ください。


本家を参考に鍵盤以外のプレイヤー部を実装しました。
X1 版はキーオンを拾っておらず、前の音程と違う場合にのみ画面を更新するようで、
MML で ccccc など連続して同じ音程が来た場合、最初の 1 音のみレベルメータが反応するようです(未確認)。
88 版は多少強引にキーオンを取得するようにしましたが、完全では無いです。c&c&c などの 2 音目以降も反応。
これ以上は元のコードに大きく手を入れることになるのでご了承ください。

*80SRへの対応メモ*

j80の作者の HAL8999 さんに 80SR 環境でも動くとご報告いただきました。
  1. ロードすべき RAM 領域の R/W を指定する。 I/O ポート 0xE2 の bit4=1 で Write可、bit0=1 で Read可。
    ROM 内ルーチンを使ってロードする場合は Write=可 Read=不可にしておく必要がある。
  2. OPNサウンド割り込み部分の変更。 88版で I/O ポート 0x32 の bit7 の所を 80SR では 0x33 の bit1 にする。
それから、88系 と 80系はテキストアトリビュートの扱いが違うので UI の見栄えが多少悪くなります。
画面設定は 0xE668 からの 4byte のワークに 0x00,0xFF,80,20(25?) を入れてから ROM 内ルーチンの 0x1467 を call すると良いとのこと。

■ 更新履歴

2013.10.27 初版
 本家の ver.131013 に対応。返信待ちの間に PSGPCM を実装して MDX+PDX->PC88 をやってみたものの流石に音質が。満場一致でボツ。

2013.11.01 第2版
 テンポ遅れバグ修正。ご協力いただいた皆さんに感謝。
 CTC1 相当の RTCタイマ割り込みを極力 1/60 秒に収束するように多重割り込み化。キー入力周りのバグ修正。
 ささやかなプレイヤー画面を追加。白い。

2014.06.06 第3版
 本家 2014.05.15版に追従。
 ささやかなファイル選択画面を追加。色気づいた。

2014.11.07 第4版
 ディスク周りを少し変えた。
 ファイルシステムは「汎用ディスクルーチン」のものを多少弄ってある。主にメモリ配置や機能を削ってのダイエット等々。

2015.05.08 第5版
 本家 2015.04.21版に追従。

2016.12.26 第6版
 本家 2016.12.17版に追従。
 バージョンアップに伴い、過去の NRD ファイルがそのまま使えないので MML からの再コンパイルが必要。
 自己書き換えが増えてきて少し苦労した。RETI にしてある意味が良く分からない。

2017.03.03 第7版
 本家 2017.03.03版に追従。
 ドライバ(本家)の内部バージョン番号が 2 になっている。
 MML はそのままでも NRTDRV.EXE の出力する NRD ファイルが変わっているので、以前の NRD ファイルでは演奏がおかしくなることがある。

▲ TOP