Windowsなどのエミュレータ上のNSF演奏では、ファミリーコンピュータ実機での演奏を意識しないでも正常演奏することが出来ます。
TNS−HFC4・TNS−HFC3・TNS−HFP1・TNS−HFC2は、NSFフォーマット
Ver 1.61に基づいて設計しておりますが、このファミリーコンピュータと
エミュレータの極一部の差異が、TNS−HFC4・TNS−HFC3・TNS−HFP1・TNS−HFC2でのNSFデータ演奏の妨げになる場合があります。
ファミリーコンピュータ(以下、ファミコンと表記)に使用されているCPUでは、以下のアドレスに特別な意味があります。
アドレス | 意味 |
$FFFA | NMIベクタ |
$FFFC | リセットベクタ |
$FFFE | IRQベクタ |
このアドレスに書かれている内容は、割り込み要求がCPUに入力されたφ2サイクルの次の命令サイクルでCPUに読み込まれます。
ここで、NSF標準仕様バンク切換レジスタにアクセスを行った場合の動作不具合例を示します。
CPUアドレス | 対応バンクレジスタ | バンク番号 |
$8000〜8FFF | $5FF8 | $00 |
$9000〜9FFF | $5FF9 | $01 |
$A000〜AFFF | $5FFA | $02 |
$B000〜BFFF | $5FFB | $03 |
$C000〜CFFF | $5FFC | $04 |
$D000〜DFFF | $5FFD | $05 |
$E000〜EFFF | $5FFE | $06 |
$F000〜FFFF | $5FFF | $07 |
この状態では前出の3つの割り込みベクタは、バンク番号$07内のアドレス$0FFA〜0FFFに書き込まれています。
そこで、CPU側のアプリケーションから、バンクレジスタを操作します。
CPUアドレス | 対応バンクレジスタ | バンク番号 |
$8000〜8FFF | $5FF8 | $00 |
$9000〜9FFF | $5FF9 | $01 |
$A000〜AFFF | $5FFA | $02 |
$B000〜BFFF | $5FFB | $03 |
$C000〜CFFF | $5FFC | $04→0A |
$D000〜DFFF | $5FFD | $05→0B |
$E000〜EFFF | $5FFE | $06→00 |
$F000〜FFFF | $5FFF | $07→00 |
CPUから見たアドレスでは、$F000〜FFFFから読み出すデータは、$8000〜8FFFに書き込まれているデータと同じになります。
つまり、割り込みが発生した場合にCPUが読み出すベクタアドレスは$8FFA〜8FFFとなり、このアドレスに有効なアドレスが
書き込まれていない場合には、割り込みジャンプ先が正しくないため、アプリケーションは暴走します。
アプリケーションを暴走させないバンク切換の方法には以下の2つ方法があります。
CPUアドレス | 対応バンクレジスタ | TNS-HFC4 バンク番号 |
TNS-HFC3 (1024KB版) バンク番号 |
TNS-HFC2 バンク番号 |
TNS-HFP1 バンク番号 |
$8000〜8FFF | $5FF8 | $00〜FE可変 | $00〜FF可変 | $00〜7F可変 | $00〜1E可変 |
$9000〜9FFF | $5FF9 | $00〜FE可変 | $00〜FF可変 | $00〜7F可変 | $00〜1E可変 |
$A000〜AFFF | $5FFA | $00〜FE可変 | $00〜FF可変 | $00〜7F可変 | $00〜1E可変 |
$B000〜BFFF | $5FFB | $00〜FE可変 | $00〜FF可変 | $00〜7F可変 | $00〜1E可変 |
$C000〜CFFF | $5FFC | $00〜FE可変 | $00〜FF可変 | $00〜7F可変 | $00〜1E可変 |
$D000〜DFFF | $5FFD | $00〜FE可変 | $00〜FF可変 | $00〜7F可変 | $00〜1E可変 |
$E000〜EFFF | $5FFE | $00〜FE可変 | $00〜FF可変 | $00〜7F可変 | $00〜1E可変 |
$F000〜FFFF | $5FFF | $07固定 | $07固定 | $07固定 | $07固定 |
CPUアドレス | 対応バンクレジスタ | TNS-HFC4 バンク番号 |
TNS-HFC3 (1024KB版) バンク番号 |
TNS-HFC2 バンク番号 |
TNS-HFP1 バンク番号 |
$8000〜8FFF | $5FF8 | $00 | $00 | $00 | $00 |
$9000〜9FFF | $5FF9 | $01 | $01 | $01 | $01 |
$A000〜AFFF | $5FFA | $00〜FE可変 | $00〜FF可変 | $00〜7F可変 | $00〜1E可変 |
$B000〜BFFF | $5FFB | $00〜FE可変 | $00〜FF可変 | $00〜7F可変 | $00〜1E可変 |
$C000〜CFFF | $5FFC | $00〜FE可変 | $00〜FF可変 | $00〜7F可変 | $00〜1E可変 |
$D000〜DFFF | $5FFD | $00〜FE可変 | $00〜FF可変 | $00〜7F可変 | $00〜1E可変 |
$E000〜EFFF | $5FFE | $00〜FE可変 | $00〜FF可変 | $00〜7F可変 | $00〜1E可変 |
$F000〜FFFF | $5FFF | $00 | $00 | $00 | $00 |
TNS−HFC4では、メインメモリとバンクメモリを共有する方式となっています。
メインメモリとバンクメモリを共有している関係上、最大使用可能NSFファイルサイズは「1040512byte」までとなります。
CPUアドレス | バンク番号 | NSFデータ領域 | 備考 |
$5000〜5EFF | $FF | 割当不可 | 拡張音源I/Oアドレスはメモリ割当無 |
$6000〜6FFF | $FE | 使用可能 | 常時リードライト可(書き込み保護無) |
$7000〜7FFF | $FD | 使用可能 | 常時リードライト可(書き込み保護無) |
TNS−HFC4は、8KBのキャラクタメモリを内蔵しています。
PPUアドレス | アドレスミラー制御 | 備考 |
$0000〜3FFF | 可 | リセット時は水平モード(bit3=0) |
アドレスミラー(水平・垂直方向)制御は$4025に配置したレジスタ(bit3)を使用します。
CPUからPPUへのメモリ転送は、ユーザアプリケーション側で対応する必要があります。
ディスクシステム音源を有効した場合に発生する、$8000〜DFFFに書き込みを実行するとメモリが破壊されるという現象は
TNS−HFC4では発生いたしません。書き込みデータは全て拡張音源スロット(オプション品)またはTNS−HFX4に渡されます。
TNS−HFP1では、メインメモリとバンクメモリを共有する方式となっています。
メインメモリとバンクメモリを共有している関係上、最大使用可能NSFファイルサイズは「126720byte」までとなります。
CPUアドレス | バンク番号 | NSFデータ領域 | 備考 |
$0000〜0FFF | $31 | 割当不可 | ファミコン標準は2KB($0000〜$07FF)まで |
$1000〜1FFF | $30 | 条件付きで 使用可能 |
プロセッサ間通信ポート空間($1F00〜$1FFF)は使用禁止 |
$2000〜3FFF | − | − | PPUレジスタ$2000〜$2007をイメージマッピング |
$4000〜5EFF | − | − | CPU内蔵I/Oレジスタ等 |
$6000〜6FFF | $29 | 使用可能 | 常時リードライト可(書き込み保護無) |
$7000〜7FFF | $28 | 使用可能 | 常時リードライト可(書き込み保護無) |
TNS−HFP1は、2KBのテーブルメモリと8KBのキャラクタメモリを内蔵しています。
PPUアドレス | アドレスミラー制御 | 備考 |
$0000〜3FFF | 可 | リセット時は水平モード(bit7=0) |
アドレスミラー(水平・垂直方向)制御は$5FEDに配置したレジスタ(bit7)を使用します。
CPUからPPUへのメモリ転送は、ユーザアプリケーション側で対応する必要があります。
ディスクシステム音源を有効した場合に発生する、$8000〜DFFFに書き込みを実行するとメモリが破壊されるという現象は
TNS−HFP1では発生いたしません。書き込みデータは全てキャンセルされます。
TNS−HFC3・TNS−HFC2では、ファミコンが標準で装備している2KBx2以外にも、以下の表のようなメモリを実装しています。
CPUアドレス | アドレス出現制御 | 備考 |
$4800〜4FFF | 可 | Namcot 106音源使用時は無効 |
$5000〜5EFF | 可 | MMC5音源使用時は無効 |
$6000〜7FFF | 常時占有 | 常時リードライト可(書き込み保護無) |
アドレス出現制御は$5FECに配置したレジスタを使用します。
PPUアドレス | アドレスミラー制御 | 備考 |
$0000〜3FFF | 可 | リセット時は水平モード(bit7=0) |
アドレスミラー(水平・垂直方向)制御は$5FEDに配置したレジスタ(bit7)を使用します。
CPUからPPUへのメモリ転送は、ユーザアプリケーション側で対応する必要があります。
CPUアドレス$6000〜7FFFを占有しているメモリは、Windowsなどのエミュレータ上のNSF演奏で
ディスクシステム音源を有効にした場合に出現するメモリと同じ扱いとなります。
Windowsなどのエミュレータ上のNSF演奏でディスクシステム音源を有効とした状態とは違い、TNS-HFC3・TNS-HFC2は、$5FF6および$5FF7を用いて
$6000-$6FFFおよび$7000-$7FFFのバンク切り替えはできません。$6000-$7FFFは(バックアップ機能無)RAM領域としての解釈となります。(h7氏より指摘)
音源ドライバー本体をこのメモリ空間に移動させたり、前述の割り込みベクタの処理ルーチンを配置したりなどに使えます。
ディスクシステム音源を有効した場合に発生する、$8000〜DFFFに書き込みを実行するとメモリが破壊されるという現象は
TNS−HFC3・TNS−HFC2では発生いたしません。
書き込みデータは、TNS−HFC3では、拡張音源スロット(オプション品)またはTNS−HFX4に渡し、
TNS−HFC2では、外部拡張音源スロットユニットTNS−HFE4に渡します。
拡張スロットユニットでは、相互干渉が発生する拡張音源の実アドレスレジスタを移動して
相互干渉問題を解決しております。
特にSUNSOFT5B音源に関しては、NSFファイル内の全領域をソフトウェアで検索して
以下の表に示す内容で、オンボードSSG音源YMZ294(φ≒1.78MHz)アドレス変換を行っています。
VRC7音源は、オンボードFM音源YM2413(φ≒3.58MHz)へのソフトウェアによるアドレス代替処理は行っていません。
拡張音源名称 | 拡張音源 本来のアドレス |
TNS-HFX4上の アドレス |
TNS-HFE4上の アドレス |
SUNSOFT5B | $C000 | $5FE0 | $5FE0 |
〃 | $E000 | $5FE1 | $5FE1 |
VRC7 | $9010 | $9010 DIPSW ON時のみ |
機能無 |
〃 | 〃 | $5F90 DIPSW OFF時 |
機能無 |
〃 | $9030 | $9030 DIPSW ON時のみ |
機能無 |
〃 | 〃 | $5FB0 DIPSW OFF時 |
機能無 |
拡張スロットユニット上の全デバイスは、全て書き込み専用となっています。
拡張音源レジスタ読み込みを実行しても不定な値を返してしまいますので、
プログラミングの際には拡張音源へのアクセスを書き込み専用にて設計をお願いします。
平成18年4月1日 初版
平成18年4月16日 $6000-$7FFF領域の機能訂正
平成18年4月20日 バックアップ有無表記の追加
平成19年9月11日 TNS−HFP1バンク仕様追記
平成21年9月11日 TNS−HFC3バンク仕様追記
平成25年2月11日 TNS−HFC4バンク仕様追記
平成25年8月1日 拡張スロットユニットのオンボード音源仕様追記