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

📄 mcr.c

📁 这个是延伸mame的在wince平台下的游戏模拟器的代码
💻 C
📖 第 1 页 / 共 2 页
字号:



void rampage_delayed_write (int param)
{
	pia_1_portb_w (0, (param >> 1) & 0x0f);
	pia_1_ca1_w (0, ~param & 0x01);
}

void rampage_writeport(int port,int value)
{
	switch (port)
	{
		case 0x04:
		case 0x05:
			break;

		case 0x06:
			timer_set (TIME_NOW, value, rampage_delayed_write);
	   	break;

		case 0x07:
		   break;

		default:
			mcr_writeport(port,value);
			break;
	}
}



void maxrpm_writeport(int port,int value)
{
	switch (port)
	{
		case 0x04:
			break;

		case 0x05:
			maxrpm_mux = (value >> 1) & 3;
			break;

		case 0x06:
			timer_set (TIME_NOW, value, rampage_delayed_write);
			break;

		case 0x07:
		   break;

		default:
			mcr_writeport(port,value);
			break;
	}
}



void sarge_delayed_write (int param)
{
	pia_1_portb_w (0, (param >> 1) & 0x0f);
	pia_1_ca1_w (0, ~param & 0x01);
}

void sarge_writeport(int port,int value)
{
	switch (port)
	{
		case 0x04:
		case 0x05:
			break;

		case 0x06:
			timer_set (TIME_NOW, value, sarge_delayed_write);
			break;

		case 0x07:
		   break;

		default:
			mcr_writeport(port,value);
			break;
	}
}



void dotron_delayed_write (int param)
{
	pia_1_porta_w (0, ~param & 0x0f);
	pia_1_cb1_w (0, ~param & 0x10);
	dotron_change_light (param >> 6);
}

void dotron_writeport(int port,int value)
{
	switch (port)
	{
		case 0x04:
			timer_set (TIME_NOW, value, dotron_delayed_write);
			break;

		case 0x05:
		case 0x06:
		case 0x07:
		   break;

		default:
			mcr_writeport(port,value);
			break;
	}
}


void crater_writeport(int port,int value)
{
	switch (port)
	{
		case 0x84:
			spyhunt_scrollx = (spyhunt_scrollx & ~0xff) | value;
			break;

		case 0x85:
			spyhunt_scrollx = (spyhunt_scrollx & 0xff) | ((value & 0x07) << 8);
			spyhunt_scrolly = (spyhunt_scrolly & 0xff) | ((value & 0x80) << 1);
			break;

		case 0x86:
			spyhunt_scrolly = (spyhunt_scrolly & ~0xff) | value;
			break;

		default:
			mcr_writeport(port,value);
			break;
	}
}


/***************************************************************************

  Game-specific input handlers

***************************************************************************/

/* Max RPM -- multiplexed steering wheel/gas pedals */
int maxrpm_IN1_r(int offset)
{
	return readinputport (6 + maxrpm_mux);
}

int maxrpm_IN2_r(int offset)
{
	static int shift_bits[5] = { 0x00, 0x05, 0x06, 0x01, 0x02 };
	int start = readinputport (0);
	int shift = readinputport (10);

	/* reset on a start */
	if (!(start & 0x08))
		maxrpm_p1_shift = 0;
	if (!(start & 0x04))
		maxrpm_p2_shift = 0;

	/* increment, decrement on falling edge */
	if (!(shift & 0x01) && (maxrpm_last_shift & 0x01))
	{
		maxrpm_p1_shift++;
		if (maxrpm_p1_shift > 4)
			maxrpm_p1_shift = 4;
	}
	if (!(shift & 0x02) && (maxrpm_last_shift & 0x02))
	{
		maxrpm_p1_shift--;
		if (maxrpm_p1_shift < 0)
			maxrpm_p1_shift = 0;
	}
	if (!(shift & 0x04) && (maxrpm_last_shift & 0x04))
	{
		maxrpm_p2_shift++;
		if (maxrpm_p2_shift > 4)
			maxrpm_p2_shift = 4;
	}
	if (!(shift & 0x08) && (maxrpm_last_shift & 0x08))
	{
		maxrpm_p2_shift--;
		if (maxrpm_p2_shift < 0)
			maxrpm_p2_shift = 0;
	}

	maxrpm_last_shift = shift;

	return ~((shift_bits[maxrpm_p1_shift] << 4) + shift_bits[maxrpm_p2_shift]);
}


/* Spy Hunter -- normal port plus CSD status bits */
int spyhunt_port_1_r(int offset)
{
	return input_port_1_r(offset) | ((pia_1_portb_r (0) & 0x30) << 1);
}


/* Spy Hunter -- multiplexed steering wheel/gas pedal */
int spyhunt_port_2_r(int offset)
{
	int accel = readinputport (6);
	int steer = readinputport (7);

	/* mux high bit on means return steering wheel */
	if (spyhunt_mux & 0x80)
	{
	   return steer;
	}

	/* mux high bit off means return gas pedal */
	else
	{
	   return accel;
	}
}


/* Destruction Derby -- 6 bits of steering plus 2 bits of normal inputs */
int destderb_port_r(int offset)
{
	return readinputport (1 + offset);
}


/* Kozmik Krooz'r -- dial reader */
int kroozr_dial_r(int offset)
{
	int dial = readinputport (7);
	int val = readinputport (1);

	val |= (dial & 0x80) >> 1;
	val |= (dial & 0x70) >> 4;

	return val;
}


/* Kozmik Krooz'r -- joystick readers */
int kroozr_trakball_x_r(int data)
{
	int val = readinputport (6);

	if (val & 0x02)		/* left */
		return 0x64 - 0x34;
	if (val & 0x01)		/* right */
		return 0x64 + 0x34;
	return 0x64;
}

int kroozr_trakball_y_r(int data)
{
	int val = readinputport (6);

	if (val & 0x08)		/* up */
		return 0x64 - 0x34;
	if (val & 0x04)		/* down */
		return 0x64 + 0x34;
	return 0x64;
}

/* Discs of Tron -- remap up and down on the mouse to aim up and down */
int dotron_IN2_r(int offset)
{
	int data;
	static int delta = 0;
	char fake;
	static char lastfake = 0;
	static int mask = 0x00FF;
	static int count = 0;

	data = input_port_2_r(offset);
	fake = input_port_6_r(offset);

	delta += (fake - lastfake);
	lastfake = fake;

	/* Map to "aim up" */
	if (delta > 5)
	{
		mask = 0x00EF;
		count = 5;
		delta = 0;
	}
	/* Map to "aim down" */
	else if (delta < -5)
	{
		mask = 0x00DF;
		count = 5;
		delta = 0;
	}

	if ((count--) <= 0)
	{
		count = 0;
		mask = 0x00FF;
	}

	data &= mask;

	return data;
}


/***************************************************************************

  Sound board-specific PIA handlers

***************************************************************************/

void mcr_pia_1_w (int offset, int data)
{
	if (!(data & 0xff000000))
		pia_1_w (offset, (data >> 8) & 0xff);
}

int mcr_pia_1_r (int offset)
{
	return pia_1_r (offset) << 8;
}


/*
 *		Chip Squeak Deluxe (Spy Hunter) board
 *
 *		MC68000, 1 PIA, 10-bit DAC
 */
static void csd_porta_w (int offset, int data)
{
	int temp;
	dacval = (dacval & ~0x3fc) | (data << 2);
	temp = dacval/2;
	if (temp > 0xff) temp = 0xff;
	DAC_data_w (0, temp);
}

static void csd_portb_w (int offset, int data)
{
	dacval = (dacval & ~0x003) | (data >> 6);
	/* only update when the MSB's are changed */
}

static void csd_irq (void)
{
	/* generate a sound interrupt */
  	cpu_cause_interrupt (2, 4);
}


/*
 *		Sounds Good (Rampage) board
 *
 *		MC68000, 1 PIA, 10-bit DAC
 */
static void sg_porta_w (int offset, int data)
{
	int temp;
	dacval = (dacval & ~0x3fc) | (data << 2);
	temp = dacval/2;
	if (temp > 0xff) temp = 0xff;
	DAC_data_w (0, temp);
}

static void sg_portb_w (int offset, int data)
{
	dacval = (dacval & ~0x003) | (data >> 6);
	/* only update when the MSB's are changed */
}

static void sg_irq (void)
{
	/* generate a sound interrupt */
  	cpu_cause_interrupt (1, 4);
}


/*
 *		Turbo Chip Squeak (Sarge) board
 *
 *		MC6809, 1 PIA, 8-bit DAC
 */
static void tcs_irq (void)
{
	/* generate a sound interrupt */
	cpu_cause_interrupt (1, M6809_INT_IRQ);
}


/*
 *		Squawk & Talk (Discs of Tron) board
 *
 *		MC6802, 2 PIAs, TMS5220, AY8912 (not used), 8-bit DAC (not used)
 */
static int tms_command;
static int tms_strobes;

static void snt_porta1_w (int offset, int data)
{
	/*printf ("Write to AY-8912\n");*/
}

static void snt_porta2_w (int offset, int data)
{
	tms_command = data;
}

static void snt_portb2_w (int offset, int data)
{
	/* bits 0-1 select read/write strobes on the TMS5220 */
	data &= 0x03;
	if (((data ^ tms_strobes) & 0x02) && !(data & 0x02))
	{
		tms5220_data_w (offset, tms_command);

		/* DoT expects the ready line to transition on a command/write here, so we oblige */
		pia_2_ca2_w (0,1);
		pia_2_ca2_w (0,0);
	}
	else if (((data ^ tms_strobes) & 0x01) && !(data & 0x01))
	{
		pia_2_porta_w (0,tms5220_status_r(offset));

		/* DoT expects the ready line to transition on a command/write here, so we oblige */
		pia_2_ca2_w (0,1);
		pia_2_ca2_w (0,0);
	}
	tms_strobes = data;
}

static void snt_irq (void)
{
	cpu_cause_interrupt (2, M6808_INT_IRQ);
}

⌨️ 快捷键说明

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