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

📄 screen.hpp

📁 SNES game emulator. C and asm files.
💻 HPP
字号:
/*	SCREEN.HPP - Header file for Screen.cpp.  Declarations of functions.
*/

#ifndef _SCREEN_HPP
#define _SCREEN_HPP

extern int debugscreen;
extern int memdumpoffset, vramdumpoffset, oamdumpoffset, cgramdumpoffset;
extern int vramblitoffset, vramblitcdepth;
extern int debug_sprmin, debug_sprmax;

#pragma pack (push,4)
struct bginfo {
		// Line-based info
	int cdepth;
	int scrollx, scrolly;
	union {
		boolean width64;
		int dummy1;
	};
	union {
		boolean height64;
		int dummy1a;
	};
	union {
		boolean tile16x16;
		int dummy1b;
	};		
	int width8x8, width8x8and;
	int height8x8, height8x8and;
	byte *tilemap;
	int tcharbase;
	int tcharshift;
	int lastbgrow;
		// Frame-based info
	union {	byte bgnum;
		int dummy2;
	};
	union { byte cgoffs;
		int dummy3;
	};
};
#pragma pack (pop)

union cachetile {
	byte pixel[64];
	dword dwpixel[16];
};

#pragma pack(push,1)
struct cachetilemap {
	union cachetile *tile;
	byte pal_or;
	byte empty, solid; // 8 bits, 1 for each scanline of the tile.
	boolean prio;  // priority, 0 or 1
};
#pragma pack(pop)

extern "C" {
	extern struct cachetilemap ctmap[4][128][128], sprmap[128][8][8];
	extern byte cstatus [4096];
	extern byte csolid [2][4096], cempty [2][4096];
	extern byte spr8x8size[128];
	extern union cachetile ctile [4][4096];
	extern struct bginfo bg[4], *curbg;
}

extern byte cstatus [4096];
	// b0-1: cdepth
	// b4-7: which flip settings have been cached.
extern byte csolid [2][4096], cempty [2][4096];  // 8 bits, 1 for each scanline of the tile.
	// ccdepth set to 0xFF when tile is invalidated.

extern byte spr8x8size [128]; // Set to 0 when cache entry is invalidated.
extern boolean oamposchange;

void rendersnesscreen ();

void drawdebug (int x);
	// Debug screens:
	// 0 - Snes Screen
	// 1 - Main debug trace
	// 2 - Main debug--alternate
	// 3 - Memory dump
	// 4 - VRAM dump
	// 5 - CGRAM dump
	// 6 - OAM dump
	// 7 - Register screen
	// 8 - VRAM tile blit

void adddebugline (char *text, boolean showregs, char asterisk = ' ');

void resetscreenframe ();

void getbgframeinfo (int plane);
void getbglineinfo (int plane);

void drawnextscanline ();
void dobglinedraw (int plane, int on, boolean priority);
void updatetilemaprow (int row);
	void updatetilemap32 (byte *tilemap, struct cachetilemap *ctmap, int tcharbase);
	void updatetilemap64_16x16 (byte *tilemap, struct cachetilemap *ctmap, int tcharbase, boolean secondrow);
void blitbgline (int row, int offsy, int col, byte *scrstart, byte *mustcopy);
void blitmode7line (void);

void buildspritetable ();
void dospritelinedraw (byte priority);
void blitspriteline (struct cachetilemap *ctmap, int numtiles, int yoffs, byte *scrstart, byte &mustcopy);
void buildsprlinelist ();

void doframedraw();

extern "C" {
	void __cdecl blitbglineasm (void);
}

extern char vramcmpfn[40];
extern byte debug_vram[65536];

// Nifty things
#define memcpy_16(dest,src,mult16) (fpucopy ? memcpy_fpu16 (dest,src,mult16) : memcpy_int16 (dest,src,mult16))
extern void memcpy_fpu16 (void *dest, void *src, int mult16);
extern void memcpy_int16 (void *dest, void *src, int mult16);

#pragma aux memcpy_fpu16 =\
"TOP:    FILD    QWORD PTR [ESI]"\
"        FILD    QWORD PTR [ESI+8]"\
"        FXCH"\
"        FISTP   QWORD PTR [EDI]"\
"        FISTP   QWORD PTR [EDI+8]"\
"        ADD     ESI, 16"\
"        ADD     EDI, 16"\
"        DEC     ECX"\
"        JNZ     TOP"\
		parm   [esi] [edi] [ecx]\
		modify [esi edi ecx];

#pragma aux memcpy_int16 =\
"TOP:    mov ebx, [esi]"\
"        mov eax, [esi+4]"\
"        mov [edi], ebx"\
"        mov [edi+4], eax"\
"        mov ebx, [esi+8]"\
"        mov eax, [esi+12]"\
"        mov [edi+8], ebx"\
"        mov [edi+12], eax"\
"        add esi, 16"\
"        add edi, 16"\
"        dec ecx"\
"        jnz TOP"\
		parm   [esi] [edi]  [ecx]\
		modify [esi edi ecx];

#endif

⌨️ 快捷键说明

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