TNS-HFC2には,実機のキャラクタROMに相当するメモリが搭載されているんで, プログラムROM 16k + キャラクタROM 8kなプログラムであれば,簡単に実機で動かすことができます*1

真面目にやる場合

キャラクタROM相当の領域があるとは言っても,起動直後はここに何も書かれていないんで, プログラムROM領域にキャラクタデータをロードして, プログラム内で頑張ってキャラクタROM相当のメモリにコピーする必要があります.

例えばNSFのふりをしたちょっとしたローダプログラムを用意して,その後ろに本来動かしたいプログラムの プログラムROM 16k + キャラクタROM 8k をくっつけます.

こうしとくと,TNS-HFC2では以下のような状態でメモリ空間上にロードされます(ローダが8kに収まってる場合). この辺のTNS-HFC2のNSFのデータのロードやバンク切り替え等については TNS−HFC2バンク切換方法とメモリ利用のガイドライン に詳しく書かれてます.

  • $8000 - $9fff ローダプログラム(NSFヘッダつき)
  • $a000 - $dfff 動かしたいプログラムのプログラムROMのデータ
  • $e000 - $ffff 動かしたいプログラムのキャラクタROMのデータ

で,ローダプログラム内で↓な感じのことをするようにしておくと, リセット後にプログラムが動くようになります.

  1. 色々初期化
  2. $e000からの8kに展開されているキャラクタROMのデータを, $2006と$2007のレジスタを介してPPUのパターンテーブルにコピー
  3. ロードするゲームのネームテーブルのミラーモードを$5fedに設定(デフォルト垂直・%10000000で水平)
  4. 後述のバンク切り替えを行うコードを$6000にコピー
  5. $6000に飛ぶ
  6. $8000と$c000からプログラムROM 16kがマップされるように$5FF8〜$5FFFをいじってバンクを切り替える
  7. $8000に飛ぶ

手軽に済ませる場合

なんとTNS-HFC2には勝手にキャラクタROMを読み込んでくれる機能(mck virtual keyboard実行支援用らしい) がありまして, NESヘッダ 16byte + プログラムROM 32k + キャラクタROM 8k のデータを作って拡張子をNSFにしとくと, 勝手に末尾の8kのデータをキャラクタROM領域にコピーしてくれます.

元のプログラムが16k + 8kの場合,同じプログラムROMのデータを2個並べておけばOKでした.

例えば obono.nes という16k + 8kのプログラムを読ませる場合, 以下のような感じで嘘NSFファイルを作れば勝手に読み込んでくれます(UNIXなコマンドですいません).

head -n 16 obono.nes > obono_0.bin
tail -n 24576 obono.nes > obono.bin
head -n 16384 obono.bin > obono_1.bin
tail -n 8192 obono.bin > obono_2.bin
cat obono_0.bin obono_1.bin obono_1.bin obono_2.bin > obono.nsf

ただ,この場合,垂直ミラーになっちゃうんで, 水平ミラー前提の縦スクロールのゲームをちゃんと動かしたい場合は, プログラム本体に手を入れて$5fedを叩くようにするか, 最初に書いたようなローダをくっつけてきちんと初期化するのがいいかと思います.

(Socket775さんより情報を頂きました)


*1 TNS-HFC2では4k byte単位で128バンク使えるそうなんで,バンク切り替えを駆使すれば,もっとでかいプログラムも動かせるかと思います.また,キャラクタROMもRAMとして実装されているので,部分的に書き換えたりして使うとか,何か面白い使い方ができるかもしれません.あー,でも一般的なマッパーと違うっぽいんで,エミュレータを拡張したりしないと開発がしんどそう・・・.

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-09-18 (月) 21:32:28 (4414d)