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

📄 smashtv.c

📁 这个是延伸mame的在wince平台下的游戏模拟器的代码
💻 C
📖 第 1 页 / 共 4 页
字号:
								}
							}
							else
							{
								write_data = (*BYTE_XOR_LE(rda))&0x0f;
								if (write_data)
								{
									*wrva = wms_dma_pal | write_data;
								}
							}
							wrva++;
							wms_dma_odd_nibble++;
						}
						rda+=dma_skip/2;
					}
					break;
				case 0x8003: /* draw all pixels */
					dma_skip = ((wms_dma_cols + wms_dma_woffset+3)&(~3)) - wms_dma_cols;
					DMA_DRAW_ALL_BYTES(*BYTE_XOR_LE(rda++));
					break;
				case 0x8008: /* draw nonzero pixels as color */
					dma_skip = ((wms_dma_cols + wms_dma_woffset+3)&(~3)) - wms_dma_cols;
					DMA_DRAW_NONZERO_BYTES_INC(wms_dma_fgcol);
					break;
				case 0xc008: /* draw nonzero nibbles as color */
					dma_skip = ((wms_dma_cols + wms_dma_woffset+1)&(~1)) - wms_dma_cols;
					for (i=0;i<(wms_dma_write_rows<<9);i+=512)
					{
						wrva = &(wms_videoram[wms_dma_dst+i]);
						for (j=write_cols;j>=0;j--)
						{
							if (wms_dma_odd_nibble&0x01)
							{
								if ((*BYTE_XOR_LE(rda++))&0xf0)
								{
									*wrva = wms_dma_pal | wms_dma_fgcol;
								}
							}
							else
							{
								if ((*BYTE_XOR_LE(rda))&0x0f)
								{
									*wrva = wms_dma_pal | wms_dma_fgcol;
								}
							}
							wrva++;
							wms_dma_odd_nibble++;
						}
						rda+=dma_skip/2;
					}
					break;
				case 0x8009: /* draw nonzero pixels as color, zero as zero */
					dma_skip = ((wms_dma_cols + wms_dma_woffset+3)&(~3)) - wms_dma_cols;
					DMA_DRAW_ALL_BYTES((*BYTE_XOR_LE(rda++)?wms_dma_fgcol:0));
					break;
				case 0xe00c: /* draw all pixels as color (fill) */
				case 0x800c: /* draw all pixels as color (fill) */
					DMA_DRAW_ALL_BYTES(wms_dma_fgcol);
					break;
				case 0x8010: /* draw nothing */
					break;
				case 0xe012: /* draw only nonzero pixels x-flipped???? */
				case 0x8012: /* draw nonzero pixels x-flipped */
					dma_skip = ((wms_dma_woffset + 3 - wms_dma_cols)&(~3)) + wms_dma_cols;
					DMA_DRAW_NONZERO_BYTES_DEC(write_data);
					break;
				case 0x8013: /* draw all pixels x-flipped */
					dma_skip = ((wms_dma_woffset + 3 - wms_dma_cols)&(~3)) + wms_dma_cols;
					DMA_DRAW_ALL_BYTES(*BYTE_XOR_LE(rda--));
					break;
				case 0x8018: /* draw nonzero pixels as color x-flipped */
					dma_skip = ((wms_dma_woffset + 3 - wms_dma_cols)&(~3)) + wms_dma_cols;
					DMA_DRAW_NONZERO_BYTES_DEC(wms_dma_fgcol);
					break;
				case 0x8022: /* draw nonzero pixels y-flipped */
					dma_skip = ((wms_dma_cols + wms_dma_woffset+3)&(~3)) - wms_dma_cols;
					DMA_DRAW_NONZERO_BYTES_INC(write_data);
					break;
				case 0x8032: /* draw nonzero pixels x-flipped and y-flipped */
					dma_skip = ((wms_dma_woffset + 3 - wms_dma_cols)&(~3)) + wms_dma_cols;
					DMA_DRAW_NONZERO_BYTES_DEC(write_data);
					break;
				default:
					break;
			}
			timer_set (TIME_IN_NSEC(41*wms_dma_cols*wms_dma_rows), data, dma_callback);
			break;
		case 4:
			wms_dma_subbank = data>>3;
			wms_dma_odd_nibble=data>>2;
			break;
		case 6:
			wms_dma_bank = ((data&0xfe00)?(data-0x200)*0x2000:data*0x2000);
			break;
		case 8:
			wms_dma_x = data&0x1ff;
			break;
		case 0x0a:
			wms_dma_y = data&0x1ff;
			break;
		case 0x0c:
			wms_dma_cols = data;
			dma_skip = data;
			break;
		case 0x0e:
			wms_dma_rows = data;
			break;
		case 0x10:  /* set palette */
    		wms_dma_pal = (data&0xff00);  /* changed from rev1? */
			wms_dma_pal_word = data;
			break;
		case 0x12:  /* set color for 1-bit */
			wms_dma_fgcol = data&0xff;
			break;
		case 0x14:
			wms_dma_14 = data;
			break;
		case 0x16:
			wms_dma_16 = data;
			break;
		case 0x18:
			wms_dma_18 = data;
			break;
		case 0x1a:
			wms_dma_1a = data;
			break;
		case 0x1c:
			wms_dma_1c = data;
			break;
		case 0x1e:
			wms_dma_1e = data;
			break;
		default:
			break;
	}
}

static void wms_to_shiftreg(unsigned int address, unsigned short* shiftreg)
{
	memcpy(shiftreg, &wms_videoram[address>>3], 2*512*sizeof(unsigned short));
}

static void wms_from_shiftreg(unsigned int address, unsigned short* shiftreg)
{
	memcpy(&wms_videoram[address>>3], shiftreg, 2*512*sizeof(unsigned short));
}

void wms_01c00060_w(int offset, int data) /* protection and more */
{
	if ((data&0xfdff) == 0x0000) /* enable CMOS write */
	{
		smashtv_cmos_w_enable = 1;
	}
}
int wms_01c00060_r(int offset) /* protection and more */
{
	if (cpu_getpc() == wms_protect_s) /* protection */
	{
		TMS34010_Regs Regs;
		TMS34010_GetRegs(&Regs);
		Regs.pc = wms_protect_d; /* skip it! */
		TMS34010_SetRegs(&Regs);
		return 0xffffffff;
	}
	return 0xffffffff;
}

void wms_sysreg_w(int offset, int data)
{
	/*
	 * Narc system register
	 * ------------------
	 *
	 *   | Bit              | Use
	 * --+-FEDCBA9876543210-+------------
	 *   | xxxxxxxx-------- |   7 segment led on CPU board
	 *   | --------xx------ |   CMOS page
	 *   | ----------x----- | - OBJ PAL RAM select
	 *   | -----------x---- | - autoerase enable
	 *   | ---------------- | - watchdog
	 *
	 */
	wms_cmos_page = (data&0xc0)<<7; /* 0x2000 offsets */
	if((data&0x20)&&wms_objpalram_select) /* access VRAM */
	{
		install_mem_write_handler(0, TOBYTE(0x00000000), TOBYTE(0x001fffff), wms_vram_w);
		install_mem_read_handler (0, TOBYTE(0x00000000), TOBYTE(0x001fffff), wms_vram_r);
	}
	else if(!(data&0x20)&&!wms_objpalram_select) /* access OBJPALRAM */
	{
		install_mem_write_handler(0, TOBYTE(0x00000000), TOBYTE(0x001fffff), wms_objpalram_w);
		install_mem_read_handler (0, TOBYTE(0x00000000), TOBYTE(0x001fffff), wms_objpalram_r);
	}
	wms_objpalram_select = ((data&0x20)?0:0x40000);
	if (data&0x10) /* turn off auto-erase */
	{
		wms_autoerase_enable = 0;
	}
	else /* enable auto-erase */
	{
		if (!wms_autoerase_enable)
		{
			wms_autoerase_start  = cpu_getscanline();
		}
		wms_autoerase_enable = 1;
	}
}
void wms_sysreg2_w(int offset, int data)
{
	wms_cmos_page = (data&0xc0)<<7; /* 0x2000 offsets */
	if(data&0x20&&wms_objpalram_select) /* access VRAM */
	{
		install_mem_write_handler(0, TOBYTE(0x00000000), TOBYTE(0x003fffff), wms_vram_w);
		install_mem_read_handler (0, TOBYTE(0x00000000), TOBYTE(0x003fffff), wms_vram_r);
	}
	else if(!(data&0x20)&&!wms_objpalram_select) /* access OBJPALRAM */
	{
		install_mem_write_handler(0, TOBYTE(0x00000000), TOBYTE(0x003fffff), wms_objpalram_w);
		install_mem_read_handler (0, TOBYTE(0x00000000), TOBYTE(0x003fffff), wms_objpalram_r);
	}
	wms_objpalram_select = ((data&0x20)?0:0x40000);
}

static int narc_unknown_r (int offset)
{
	int ans = 0xffff;
	return ans;
}

void wms_cmos_w(int offset, int data)
{
	if (smashtv_cmos_w_enable)
	{
		COMBINE_WORD_MEM(&wms_cmos_ram[(offset)+wms_cmos_page], data);
	}
}
int wms_cmos_r(int offset)
{
	return READ_WORD(&wms_cmos_ram[(offset)+wms_cmos_page]);
}

static void smashtv_sound_nmi(void)
{
	cpu_cause_interrupt(1,M6809_INT_NMI);
}
static void smashtv_sound_firq(void)
{
	cpu_cause_interrupt(1,M6809_INT_FIRQ);
}

static pia6821_interface smashtv_pia_intf =
{
	1,                                              /* 1 chip */
	{ PIA_DDRA, PIA_CTLA, PIA_DDRB, PIA_CTLB },     /* offsets */
	{ 0 },                                    /* input port A */
	{ 0 },                                    /* input bit CA1 */
	{ 0 },                                    /* input bit CA2 */
	{ 0 },                                    /* input port B */
	{ 0 },                                    /* input bit CB1 */
	{ 0 },                                    /* input bit CB2 */
	{ DAC_data_w },                           /* output port A */
	{ 0 },                                    /* output port B */
	{ 0 },                                    /* output CA2 */
	{ 0 },                                    /* output CB2 */
	{ smashtv_sound_firq },                   /* IRQ A */
	{ smashtv_sound_nmi }                     /* IRQ B */
};

void smashtv_sound_bank_select_w (int offset,int data)
{
	static int bank[16] = { 0x10000, 0x30000, 0x50000, 0x10000, 0x18000, 0x38000, 0x58000, 0x18000,
							0x20000, 0x40000, 0x60000, 0x10000, 0x28000, 0x48000, 0x68000, 0x18000 };
	unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[1].memory_region];
	/* set bank address */
	cpu_setbank (5, &RAM[bank[data & 0x0f]]);
}
void narc_music_bank_select_w (int offset,int data)
{
	static int bank[8] = { 0x10000, 0x10000, 0x10000, 0x10000, 0x20000, 0x28000, 0x10000, 0x18000 };
	unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[1].memory_region];
	/* set bank address */
	cpu_setbank (5, &RAM[bank[data&0x07]]);
}
void narc_digitizer_bank_select_w (int offset,int data)
{
	static int bank[8] = { 0x40000, 0x48000, 0x30000, 0x38000, 0x20000, 0x28000, 0x10000, 0x18000 };
	unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[2].memory_region];
	/* set bank address */
	cpu_setbank (6, &RAM[bank[data&0x07]]);
}
void mk_sound_bank_select_w (int offset,int data)
{
	static int bank[8] = { 0x10000, 0x18000, 0x20000, 0x28000, 0x30000, 0x38000, 0x40000, 0x48000 };
	unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[1].memory_region];
	/* set bank address */
	cpu_setbank (5, &RAM[bank[data&0x07]]);
	cpu_setbank (6, &RAM[0x4c000]);
}

void wms_load_code_roms(void)
{
	memcpy(CODE_ROM,Machine->memory_region[Machine->drv->cpu[0].memory_region],wms_code_rom_size);
}

#define DEREF(REG, SIZE)        *(SIZE*)(&SCRATCH_RAM[TOBYTE((REG) & 0xffffff)])
#define DEREF_INT8(REG)         DEREF(REG, INT8 )
#define DEREF_INT16(REG)        DEREF(REG, INT16)
#define DEREF_INT32(REG)        DEREF(REG, INT32)
#define BURN_TIME(INST_CNT)     TMS34010_ICount -= INST_CNT * TMS34010_AVGCYCLES

#define INT32_MOD(x) BIG_DWORD_LE(x)
#define INT16_MOD(x) (x)

/* Speed up loop body */

#define DO_SPEEDUP_LOOP(OFFS1, OFFS2, A8SIZE, A7SIZE)		\
															\
	a8 = A8SIZE##_MOD(DEREF(a2+OFFS1, A8SIZE));				\
	a7 = A7SIZE##_MOD(DEREF(a2+OFFS2, A7SIZE));				\
															\
	if (a8 > a1) 											\
	{ 														\
		a4 = a0; 											\
		a0 = a2; 											\
		a1 = a8; 											\
		a5 = a7; 											\
        BURN_TIME(10);										\
		continue; 											\
	} 														\
															\
	if ((a8 == a1) && (a7 >= a5)) 							\
	{ 														\
		a4 = a0; 											\
		a0 = a2; 											\
		a1 = a8; 											\
		a5 = a7; 											\
        BURN_TIME(13);										\
		continue; 											\
	} 														\
															\
	DEREF_INT32(a4) = BIG_DWORD_LE(a2);						\
	DEREF_INT32(a0) = DEREF_INT32(a2);						\
	DEREF_INT32(a2) = BIG_DWORD_LE(a0);						\
	a4 = a2; 												\
	BURN_TIME(17);


/* Speedup catch for games using 1 location */

#define DO_SPEEDUP_LOOP_1(LOC, OFFS1, OFFS2, A8SIZE, A7SIZE)	\
															\
	UINT32 a0 = LOC;										\
	UINT32 a2;												\
	UINT32 a4 = 0;											\
	 INT32 a1 = 0x80000000;									\
	 INT32 a5 = 0x80000000;									\
	 INT32 a7,a8;											\
	while (TMS34010_ICount > 0)								\
	{														\
		a2 = BIG_DWORD_LE(DEREF_INT32(a0));					\
		if (!a2)											\
		{													\
			cpu_spinuntil_int();							\
			break;											\
		}													\
		DO_SPEEDUP_LOOP(OFFS1, OFFS2, A8SIZE, A7SIZE);		\
	}


/* Speedup catch for games using 3 locations */

#define DO_SPEEDUP_LOOP_3(LOC1, LOC2, LOC3)					\
															\
	UINT32 a0,a2,temp1,temp2,temp3;							\
	UINT32 a4 = 0;                               			\
	 INT32 a1,a5,a7,a8;										\
															\
	while (TMS34010_ICount > 0)								\
	{														\
		temp1 = BIG_DWORD_LE(DEREF_INT32(LOC1));			\
		temp2 = BIG_DWORD_LE(DEREF_INT32(LOC2));			\
		temp3 = BIG_DWORD_LE(DEREF_INT32(LOC3));			\
		if (!temp1 && !temp2 && !temp3)						\
		{													\
			cpu_spinuntil_int();							\
			break;											\
		}													\
		a0 = LOC1;											\
		a1 = 0x80000000;									\
		a5 = 0x80000000;									\
		do													\
		{													\
			a2 = BIG_DWORD_LE(DEREF_INT32(a0));				\
			if (!a2)										\
			{												\
				TMS34010_ICount -= 20;						\
				break;										\
			}												\
			DO_SPEEDUP_LOOP(0xc0, 0xa0, INT32, INT32);		\
		} while (a2);										\
															\
		a0 = LOC2;											\
		a1 = 0x80000000;									\
		a5 = 0x80000000;									\
		do													\
		{													\
			a2 = BIG_DWORD_LE(DEREF_INT32(a0));				\
			if (!a2)										\
			{												\
				TMS34010_ICount -= 20;						\
				break;										\
			}												\
			DO_SPEEDUP_LOOP(0xc0, 0xa0, INT32, INT32);		\
		} while (a2);										\
															\
		a0 = LOC3;											\
		a1 = 0x80000000;									\
		a5 = 0x80000000;									\
		do													\
		{													\
			a2 = BIG_DWORD_LE(DEREF_INT32(a0));				\
			if (!a2)										\
			{												\
				TMS34010_ICount -= 20;						\
				break;										\
			}												\
			DO_SPEEDUP_LOOP(0xc0, 0xa0, INT32, INT32);		\
		} while (a2);										\
	}


static int narc_speedup_r(int offset)
{
	if (offset)
	{
		UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0x1b310)]);

		/* Suspend cpu if it's waiting for an interrupt */
		if (cpu_getpc() == 0xffde33e0 && !value1)
		{
			DO_SPEEDUP_LOOP_1(0x1000040, 0xc0, 0xa0, INT32, INT32);
		}
		return value1;
	}
	else
	{
		return READ_WORD(&SCRATCH_RAM[TOBYTE(0x1b300)]);
	}
}
static int smashtv_speedup_r(int offset)
{
	if (offset)
	{
		return READ_WORD(&SCRATCH_RAM[TOBYTE(0x86770)]);
	}
	else
	{
		UINT32 value1 = READ_WORD(&SCRATCH_RAM[TOBYTE(0x86760)]);

		/* Suspend cpu if it's waiting for an interrupt */
		if (cpu_getpc() == 0xffe0a340 && !value1)
		{
			DO_SPEEDUP_LOOP_1(0x1000040, 0xa0, 0x80, INT16, INT32);

⌨️ 快捷键说明

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