エミュレータ初期化の方法 ======================== とりあえず、エミュレータが使う BSS は 拡張メモリ領域に固定で割り当てられる。 #include "ks_nes.h" extern GAME_NES game_nes, game_nes_audio; (必要なら fcemu audio thread, fcemu thread を作る) fcemu audio thread は必ず毎フレーム呼ばれるように thread priority などを設定。 fcemu thread は処理落ちしても構わない。ゲームフレームごとに一回呼ばれる。 「ファミコンノイズデータ」は、nes_noise.bin 64ROM に圧縮するなどして持っておき、ここで RDRAM に展開する。 「ファミコンROMデータ」は、nes_{cluclu, balloon, iceclmbr, donkey}.bin 64ROM に圧縮するなどして持っておき、ここで RDRAM に展開する。 注意: ROMデータはバージョンアップの可能性あり GAME_NES 構造体メンバの初期値設定 game_nes_audio.noise = ファミコンノイズデータの先頭番地; game_nes_audio.g.init(&game_nes_audio); /* audio を先に初期化 */ game_nes.nesrom = ファミコンROMデータの先頭番地; game_nes.cfbp[0] = フレームバッファ 0; game_nes.cfbp[1] = フレームバッファ 1; game_nes.g.init(&game_nes); エミュレータ(メイン)の通常呼び出しの前に ======================================== 64コントローラ 生データを渡す。 game_nes.n64_buttons[0..3] = 1P..4P のコントローラデータ (不要な分は 0 で初期化); デフォルトでは、Z ボタンがファミコンのセレクトボタンになります。 例えば L ボタンでもファミコンのセレクトボタンと同様に扱う場合、こうします。 if (pad[i].button & CONT_L) { game_nes.n64_buttons[i] |= CONT_Z; } game_nes.g.exec(&game_nes); エミュレータ終了の方法 ====================== priority の高い audio thread を先に終了。 game_nes_audio.g.cleanup(&game_nes_audio); game_nes.g.cleanup(&game_nes); MSG_PRENMI: でやってもらうこと while (osAfterPreNMI()) { IO_WRITE(SP_STATUS_REG, SP_CLR_RSPSIGNAL); /* これを入れないとリセット後 暴走することがある */ } アセンブルオプション asmrfc.o: asmrfc.s (など...) $(AS) -non_shared -G 0 -mips3 -32 -Wab,-r4300_mul -nostdinc -I. -I/usr/include -o $@ asmrfc.s