エミュレータで動かす場合には、クロック周波数を上げても速度が変わらない場合があります。
vblank の周期も上がらないとダメな模様。
PPU はほどほどに手抜きしてあります。
88 側は 8 色しか使えないので、R 面と G 面を BG 専用にして 4 階調を割り当て、
残りの B 面をスプライト専用に割り当てています。色は白で固定。
スプライトは 8x16 モードや上下反転は未実装。かろうじて左右反転は欲しかったので
あらかじめビットを入れ替えた状態のテーブルを作って実現しています。
0 番スプライトヒットとか当然のように無し。
スクロール機能も実装していません。無理。
解像度は本来 256x240 なのですが、88 は 縦 200 ラインなので 40 ラインが可視範囲外になります。
カーソルキーの上下でこの可視範囲を切り替えられるようにしてあります。
横解像度は 2 倍に引き延ばしています。テーブルで 2 倍のビットイメージに変換してから表示しています。
BG は更新されたところだけ書き換える方式なのですが、ネームテーブル 4 つに対し更新テーブルは 1 つなので変になるかも。
スプライトは全部毎回書き換えます。ドット単位の動きは 8x8 単位に変換しています。
$2002 は毎回 vblank を返します。というか、そうしないと起動しなかった。
NMI は 88 側の 8 フレームに 1 回起動するようにしています。
これを少なくすると画面更新頻度が上がる代わりに CPU エミュレーションがおろそかに、
逆にすると CPU エミュレーションにかかりきりになります。
未公開命令実装記念とか言っていますが、そもそもマ○オは未公開命令を使っていません。
スプライトを持ったマシンとかキャラジェネのあるマシンならもう少し違った表現ができたかな?
どうせ色数制限が付くならモノクロ GB という手もあるのですが、アレはアレで
メモリ空間がやたら広かったりいろいろ大変なので。でもいつか書きたいなぁ。
メモリマップとか。
88側 MAIN_RAM
0000-7FFF : NES RAM(0000-07FF)
: NES PPU(2000-2007)
8000-BFFF : 本体・エミュレータ
C000-FFFF : VRAM
88側 EXT-RAM BANK#0
0000-7FFF : NES PRG ROM(8000-FFFF)
16KB ROMは後半(C000-FFFF)なので 4000-7FFF に配置
88側 EXT-RAM BANK#1
0000-1FFF : NES CHR ROM(0000-1FFF)
2000-7FFF : PPU-RAM(ネームテーブル他)
スプライトの内部バッファなどは本体の方に統合。
|
ディスク使用状況
track.0 sector.1- : ipl
track.1 sector.1- : 本体
track.9 sector.1- : NES-PRG
track.17 sector.1- : NES-CHR
|
88でもちゃんとしたものを作りたい気持ちはあるんですが、環境が…。
昔は実機+紙上デバッグで当たり前にやっていたのが信じられないです。
その頃の効率で今やるのは流石に無理があるんですよね。。。
今回のコレも随分苦労しました。