📄 mcr.c
字号:
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 + -