TNS−HFC4・TNS−HFC3・TNS−HFP1・TNS−HFC2バンク切換方法と
メモリ利用のガイドライン

拡張スロットユニットのオンボード音源ガイドライン


はじめに

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標準仕様バンク切換レジスタにアクセスを行った場合の動作不具合例を示します。

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となり、このアドレスに有効なアドレスが
書き込まれていない場合には、割り込みジャンプ先が正しくないため、アプリケーションは暴走します。


TNS−HFC4・TNS−HFP1・ファミコン実機演奏に対応したバンク切換の方法

アプリケーションを暴走させないバンク切換の方法には以下の2つ方法があります。

  1. 割り込みベクタ専用バンク番号を確保する
    具体例としては、
    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固定
    以上のようなバンクレジスタ設定で、バンク番号$07に割り込みベクタ(ベクタはCPUアドレス$F000〜FFFF内に設定)を記述します。
    ただしアプリケーションによっては、メモリ利用効率は悪くなる場合があります。
  2. バンク内の特定アドレスに正しい割り込みベクタを常に記述する
    具体例としては、
    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
    以上のようなバンクレジスタ設定で、バンク番号$00のアドレス$0FFA〜0FFFに割り込みベクタを記述します。
    アプリケーションを記述する際には、CPUアドレス$8FFA〜8FFFにプログラムを配置することは出来ませんので、
    ジャンプ命令などで避けたり、メモリを6バイト予約する必要があります。

TNS−HFC4拡張メモリの利用方法

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拡張メモリの利用方法

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拡張メモリの利用方法

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に渡します。


TNS−HFX4・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日 拡張スロットユニットのオンボード音源仕様追記