⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 state.h

📁 著名的任天堂FC游戏机模拟器VirtuaNes 085版的源码!
💻 H
字号:
#ifndef	__STATE_INCLUDED__
#define	__STATE_INCLUDED__

#pragma pack( push, 1 )

typedef	struct	tagFILEHDR {	//  0123456789AB
	BYTE	ID[12];		// "VirtuaNES ST"
	WORD	Reserved;
	WORD	BlockVersion;
} FILEHDR, *LPFILEHDR;

// VirtuaNES version0.30埲崀梡
typedef	struct	tagFILEHDR2 {	//  0123456789AB
	BYTE	ID[12];		// "VirtuaNES ST"
	WORD	Reserved;
	WORD	BlockVersion;	// 0x0200 / 0x0210(v0.60埲崀)

	DWORD	Ext0;		// ROM:僾儘僌儔儉CRC	FDS:僾儘僌儔儉ID
	WORD	Ext1;		// ROM:側偟		FDS:儊乕僇乕ID
	WORD	Ext2;		// ROM:側偟		FDS:僨傿僗僋枃悢
	LONG	MovieStep;	// 捛婰(庢傝捈偟)儉乕價乕帪偺僼儗乕儉悢
	LONG	MovieOffset;	// 捛婰(庢傝捈偟)儉乕價乕帪偺僼傽僀儖僆僼僙僢僩
} FILEHDR2, *LPFILEHDR2;

typedef	struct	tagBLOCKHDR {
	BYTE	ID[8];
	WORD	Reserved;
	WORD	BlockVersion;
	DWORD	BlockSize;
} BLOCKHDR, *LPBLOCKHDR;

// CPU 儗僕僗僞
// version 0x0110傑偱
typedef	struct	tagCPUSTAT_O {
	WORD	PC;
	BYTE	A;
	BYTE	X;
	BYTE	Y;
	BYTE	S;
	BYTE	P;
	BYTE	I;	// Interrupt pending flag

	BYTE	FrameIRQ;
	BYTE	reserved[3];

	LONG	mod_cycles;	// 儉乕價乕摍偱僋儘僢僋悢偺旝柇側偢傟傪杊偖堊

	// version 0x0110
	SQWORD	emul_cycles;
	SQWORD	base_cycles;
} CPUSTAT_O, *LPCPUSTAT_O;

// version 0x0210
typedef	struct	tagCPUSTAT {
	WORD	PC;
	BYTE	A;
	BYTE	X;
	BYTE	Y;
	BYTE	S;
	BYTE	P;
	BYTE	I;	// Interrupt pending flag

	BYTE	FrameIRQ;
	BYTE	FrameIRQ_occur;
	BYTE	FrameIRQ_count;
	BYTE	FrameIRQ_type;
	LONG	FrameIRQ_cycles;

	LONG	DMA_cycles;

	SQWORD	emul_cycles;
	SQWORD	base_cycles;
} CPUSTAT, *LPCPUSTAT;

// PPU 儗僕僗僞
typedef	struct	tagPPUSTAT {
	BYTE	reg0;
	BYTE	reg1;
	BYTE	reg2;
	BYTE	reg3;
	BYTE	reg7;
	BYTE	toggle56;

	WORD	loopy_t;
	WORD	loopy_v;
	WORD	loopy_x;
} PPUSTAT, *LPPPUSTAT;

// APU 儗僕僗僞(奼挘僒僂儞僪娷傓)
typedef	struct	tagAPUSTAT_O {
	BYTE	reg[0x0018];
	BYTE	ext[0x0100];
} APUSTAT_O, *LPAPUSTAT_O;

// 僐儞僩儘乕儔儗僕僗僞
typedef	struct	tagCTRREG {
	DWORD	pad1bit;
	DWORD	pad2bit;
	DWORD	pad3bit;
	DWORD	pad4bit;
	BYTE	strobe;
} CTRREG, *LPCTRREG;

//
// 儗僕僗僞僨乕僞
// ID "REG DATA"
// ver 0x0110傑偱
typedef	struct	tagREGSTAT_O {
	union	uniCPUREG {
		BYTE	cpudata[32];
		CPUSTAT_O	cpu;
	} cpureg;
	union	uniPPUREG {
		BYTE	ppudata[32];
		PPUSTAT	ppu;
	} ppureg;
	APUSTAT_O	apu;
} REGSTAT_O, *LPREGSTAT_O;

// ver 0x0200埲崀
typedef	struct	tagREGSTAT {
	union	uniCPUREG {
		BYTE	cpudata[64];
		CPUSTAT	cpu;
	} cpureg;
	union	uniPPUREG {
		BYTE	ppudata[32];
		PPUSTAT	ppu;
	} ppureg;
} REGSTAT, *LPREGSTAT;


//
// 撪憻RAM僨乕僞
// ID "RAM DATA"
typedef	struct	tagRAMSTAT {
	BYTE	RAM[2*1024];	// Internal NES RAM
	BYTE	BGPAL[16];	// BG Palette
	BYTE	SPPAL[16];	// SP Palette
	BYTE	SPRAM[256];	// Sprite RAM
} RAMSTAT, *LPRAMSTAT;

//
// MMU僨乕僞
// ID "MMU DATA"
typedef	struct	tagMMUSTAT {
	BYTE	CPU_MEM_TYPE[8];
	WORD	CPU_MEM_PAGE[8];
	BYTE	PPU_MEM_TYPE[12];
	WORD	PPU_MEM_PAGE[12];
	BYTE	CRAM_USED[8];
} MMUSTAT, *LPMMUSTAT;

//
// 儅僢僷乕僨乕僞
// ID "MMC DATA"
typedef	struct	tagMMCSTAT {
	BYTE	mmcdata[256];
} MMCSTAT, *LPMMCSTAT;

//
// 僐儞僩儘乕儔僨乕僞
// ID "CTR DATA"
typedef	struct	tagCTRSTAT {
	union uniCTRDATA {
		BYTE	ctrdata[32];
		CTRREG	ctr;
	} ctrreg;
} CTRSTAT, *LPCTRSTAT;

//
// SND僨乕僞
// ID "SND DATA"
typedef	struct	tagSNDSTAT {
	BYTE	snddata[0x800];	// 2KB
} SNDSTAT, *LPSNDSTAT;

//
// 僨傿僗僋僀儊乕僕
// Ver0.24傑偱
// ID "DSIDE 0A","DSIDE 0B","DSIDE 1A","DSIDE 1B"
typedef	struct	tagDISKSTAT {
	BYTE	DiskTouch[16];
} DISKSTAT, *LPDISKSTAT;

// Ver0.30埲崀
// ID "DISKDATA"
typedef	struct	tagDISKDATA {
	LONG	DifferentSize;
} DISKDATA, *LPDISKDATA;

// 埲壓偼僨傿僗僋僙乕僽僀儊乕僕僼傽僀儖偱巊梡偡傞
// Ver0.24傑偱
typedef	struct	tagDISKIMGFILEHDR {	//  0123456789AB
	BYTE	ID[12];		// "VirtuaNES DI"
	WORD	BlockVersion;
	WORD	DiskNumber;
} DISKIMGFILEHDR, *LPDISKIMGFILEHDR;

typedef	struct	tagDISKIMGHDR {
	BYTE	ID[6];		// ID "SIDE0A","SIDE0B","SIDE1A","SIDE1B"
	BYTE	DiskTouch[16];
} DISKIMGHDR, *LPDISKIMGHDR;

// VirtuaNES version0.30埲崀梡
typedef	struct	tagDISKFILEHDR {	//  0123456789AB
	BYTE	ID[12];		// "VirtuaNES DI"
	WORD	BlockVersion;	// 0x0200:0.30	0x0210:0.31
	WORD	Reserved;
	DWORD	ProgID;		// 僾儘僌儔儉ID
	WORD	MakerID;	// 儊乕僇乕ID
	WORD	DiskNo;		// 僨傿僗僋悢
	DWORD	DifferentSize;	// 憡堘悢
} DISKFILEHDR, *LPDISKFILEHDR;

//
// 儉乕價乕僼傽僀儖
//
// VirtuaNES version0.60埲崀梡
typedef	struct	tagMOVIEFILEHDR {
	BYTE	ID[12];			// "VirtuaNES MV"
	WORD	BlockVersion;		// Movie version 0x0300
	WORD	RecordVersion;		// Record version
	DWORD	Control;		// 僐儞僩儘乕儖僶僀僩
					// 76543210(Bit)
					// E---4321
					// |   |||+-- 1P僨乕僞
					// |   ||+--- 2P僨乕僞
					// |   |+---- 3P僨乕僞
					// |   +----- 4P僨乕僞
					// +--------- 捛婰嬛巭
					// 偦偺懠僐儞僩儘乕儖偼1P乣4P(偳傟偱傕椙偄)偺曽岦僉乕偑
					// 慡偰ON偺帪丆師偺係僶僀僩偑僐儞僩儘乕儖梡僨乕僞偵側傞
	DWORD	Ext0;			// ROM:僾儘僌儔儉CRC	FDS:僾儘僌儔儉ID
	WORD	Ext1;			// ROM:側偟		FDS:儊乕僇乕ID
	WORD	Ext2;			// ROM:側偟		FDS:僨傿僗僋枃悢
	DWORD	RecordTimes;		// 婰榐夞悢(庢傝捈偟夞悢)

	BYTE	RenderMethod;		// 儗儞僟儕儞僌曽幃
	BYTE	IRQtype;		// IRQ僞僀僾
	BYTE	FrameIRQ;		// FrameIRQ嬛巭
	BYTE	VideoMode;		// NTSC/PAL

	BYTE	reserved2[8];		// 梊栺

	LONG	StateStOffset;		// Movie start state offset
	LONG	StateEdOffset;		// Movie end state offset
	LONG	MovieOffset;		// Movie data offset
	LONG	MovieStep;		// Movie steps(Frame悢)

	DWORD	CRC;			// 偙偺僨乕僞傪彍偔CRC(僀儞僠僉杊巭)
} MOVIEFILEHDR, *LPMOVIEFILEHDR;

// Famtasia Movie....
typedef	struct	tagFMVHDR {
	BYTE	ID[4];			// "FMV^Z"
	BYTE	Control1;		// R???????	0:儕僙僢僩屻偐傜婰榐丠 1:搑拞偐傜婰榐
	BYTE	Control2;		// OT??????	O:1P忣曬 T:2P忣曬
	DWORD	Unknown1;
	WORD	RecordTimes;		// 婰榐夞悢-1
	DWORD	Unknown2;
	BYTE	szEmulators[0x40];	// 婰榐偟偨僄儈儏儗乕僞
	BYTE	szTitle    [0x40];	// 僞僀僩儖
} FMVHDR, *LPFMVHDR;

// Nesticle Movie....
typedef	struct	tagNMVHDR {
	BYTE	ExRAM[0x2000];
	BYTE	S_RAM[0x0800];
	WORD	PC;
	BYTE	A;
	BYTE	P;
	BYTE	X;
	BYTE	Y;
	BYTE	SP;
	BYTE	OAM[0x0100];
	BYTE	VRAM[0x4000];
	BYTE	Other[0xC9];
	DWORD	ScanlineCycles;
	DWORD	VblankScanlines;
	DWORD	FrameScanlines;
	DWORD	VirtualFPS;
} NMVHDR, *LPNMVHDR;

// 儅僋儘
#define	SETBYTE(p,v)	{ *p = (v); p++; }
#define	SETWORD(p,v)	{ *(LPWORD)p = (v); p += sizeof(WORD); }
#define	SETDWORD(p,v)	{ *(LPDWORD)p = (v); p += sizeof(DWORD); }
#define	SETINT(p,v)	{ *(LPINT)p = (v); p += sizeof(INT); }
#define	SETBLOCK(p,v,s)	{ memcpy( p, (v), s ); p += s; }

#define	GETBYTE(p,v)	{ (v) = *p; p++; }
#define	GETWORD(p,v)	{ (v) = *(LPWORD)p; p += sizeof(WORD); }
#define	GETDWORD(p,v)	{ (v) = *(LPDWORD)p; p += sizeof(DWORD); }
#define	GETINT(p,v)	{ (v) = *(LPINT)p; p += sizeof(INT); }
#define	GETBLOCK(p,v,s)	{ memcpy( (v), p, s ); p += s; }

#pragma pack( pop )

#endif	// !__STATE_INCLUDED__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -