116 lines
7.4 KiB
C
116 lines
7.4 KiB
C
//////////////////////////////////////////////////////////////////////////
|
||
// //
|
||
// NES Memory Management Unit //
|
||
// Norix //
|
||
// written 2001/02/21 //
|
||
// last modify ----/--/-- //
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
#ifndef __MMU_INCLUDED__
|
||
#define __MMU_INCLUDED__
|
||
|
||
#include "typedef.h"
|
||
#include "macro.h"
|
||
|
||
// CPU メモリバンク
|
||
extern LPBYTE CPU_MEM_BANK[8]; // 8K単位
|
||
extern BYTE CPU_MEM_TYPE[8];
|
||
extern INT CPU_MEM_PAGE[8]; // ステートセーブ用
|
||
|
||
// PPU メモリバンク
|
||
extern LPBYTE PPU_MEM_BANK[12]; // 1K単位
|
||
extern BYTE PPU_MEM_TYPE[12];
|
||
extern INT PPU_MEM_PAGE[12]; // ステートセーブ用
|
||
extern BYTE CRAM_USED[16]; // ステートセーブ用
|
||
|
||
// NESメモリ
|
||
extern BYTE RAM [ 8*1024]; // NES内臓RAM
|
||
extern BYTE WRAM[128*1024]; // ワーク/バックアップRAM
|
||
extern BYTE DRAM[ 40*1024]; // ディスクシステムRAM
|
||
extern BYTE XRAM[ 8*1024]; // ダミーバンク
|
||
extern BYTE ERAM[ 32*1024]; // 拡張機器用RAM
|
||
|
||
extern BYTE CRAM[ 32*1024]; // キャラクタパターンRAM
|
||
extern BYTE VRAM[ 4*1024]; // ネームテーブル/アトリビュートRAM
|
||
|
||
extern BYTE SPRAM[0x100]; // スプライトRAM
|
||
extern BYTE BGPAL[0x10]; // BGパレット
|
||
extern BYTE SPPAL[0x10]; // SPパレット
|
||
|
||
// レジスタ
|
||
extern BYTE CPUREG[0x18]; // Nes $4000-$4017
|
||
extern BYTE PPUREG[0x04]; // Nes $2000-$2003
|
||
|
||
// Frame-IRQレジスタ($4017)
|
||
extern BYTE FrameIRQ;
|
||
|
||
// PPU内部レジスタ
|
||
extern BYTE PPU56Toggle; // $2005-$2006 Toggle
|
||
extern BYTE PPU7_Temp; // $2007 read buffer
|
||
extern WORD loopy_t; // same as $2005/$2006
|
||
extern WORD loopy_v; // same as $2005/$2006
|
||
extern WORD loopy_x; // tile x offset
|
||
|
||
// ROMデータポインタ
|
||
extern LPBYTE PROM; // PROM ptr
|
||
extern LPBYTE VROM; // VROM ptr
|
||
|
||
#ifdef _DATATRACE
|
||
// For dis...
|
||
extern LPBYTE PROM_ACCESS;
|
||
#endif
|
||
|
||
// ROM バンクサイズ
|
||
extern INT PROM_8K_SIZE, PROM_16K_SIZE, PROM_32K_SIZE;
|
||
extern INT VROM_1K_SIZE, VROM_2K_SIZE, VROM_4K_SIZE, VROM_8K_SIZE;
|
||
|
||
|
||
// 関数
|
||
extern void NesSub_MemoryInitial();
|
||
|
||
extern void SetPROM_Bank( BYTE page, LPBYTE ptr, BYTE type );
|
||
extern void SetPROM_8K_Bank ( BYTE page, INT bank );
|
||
extern void SetPROM_16K_Bank( BYTE page, INT bank );
|
||
extern void SetPROM_32K_Bank( INT bank );
|
||
extern void SetPROM_32K_Bank( INT bank0, INT bank1, INT bank2, INT bank3 );
|
||
|
||
extern void SetVROM_Bank( BYTE page, LPBYTE ptr, BYTE type );
|
||
extern void SetVROM_1K_Bank( BYTE page, INT bank );
|
||
extern void SetVROM_2K_Bank( BYTE page, INT bank );
|
||
extern void SetVROM_4K_Bank( BYTE page, INT bank );
|
||
extern void SetVROM_8K_Bank( INT bank );
|
||
extern void SetVROM_8K_Bank( INT bank0, INT bank1, INT bank2, INT bank3,
|
||
INT bank4, INT bank5, INT bank6, INT bank7 );
|
||
|
||
extern void SetCRAM_1K_Bank( BYTE page, INT bank );
|
||
extern void SetCRAM_2K_Bank( BYTE page, INT bank );
|
||
extern void SetCRAM_4K_Bank( BYTE page, INT bank );
|
||
extern void SetCRAM_8K_Bank( INT bank );
|
||
|
||
extern void SetVRAM_1K_Bank( BYTE page, INT bank );
|
||
extern void SetVRAM_Bank( INT bank0, INT bank1, INT bank2, INT bank3 );
|
||
extern void SetVRAM_Mirror( INT type );
|
||
extern void SetVRAM_Mirror( INT bank0, INT bank1, INT bank2, INT bank3 );
|
||
|
||
|
||
// メモリタイプ
|
||
// For PROM (CPU)
|
||
#define BANKTYPE_ROM 0x00
|
||
#define BANKTYPE_RAM 0xFF
|
||
#define BANKTYPE_DRAM 0x01
|
||
#define BANKTYPE_MAPPER 0x80
|
||
// For VROM/VRAM/CRAM (PPU)
|
||
#define BANKTYPE_VROM 0x00
|
||
#define BANKTYPE_CRAM 0x01
|
||
#define BANKTYPE_VRAM 0x80
|
||
|
||
// ミラータイプ
|
||
#define VRAM_HMIRROR 0x00 // Horizontal
|
||
#define VRAM_VMIRROR 0x01 // Virtical
|
||
#define VRAM_MIRROR4 0x02 // All screen
|
||
#define VRAM_MIRROR4L 0x03 // PA10 L固定 $2000-$23FFのミラー
|
||
#define VRAM_MIRROR4H 0x04 // PA10 H固定 $2400-$27FFのミラー
|
||
|
||
#endif // !__MMU_INCLUDED__
|
||
|