VIA6522: Refactored interface to use READ/WRITE_LINE.

This commit is contained in:
Curt Coder 2010-01-07 13:06:45 +00:00
parent 10b94ff0a7
commit a37b9332fa
6 changed files with 71 additions and 83 deletions

View File

@ -931,7 +931,7 @@ WRITE8_DEVICE_HANDLER(via_porta_w)
CA1 input
-------------------------------------------------*/
READ8_DEVICE_HANDLER(via_ca1_r)
READ_LINE_DEVICE_HANDLER(via_ca1_r)
{
via6522_t *v = get_token(device);
return v->in_ca1;
@ -943,20 +943,17 @@ READ8_DEVICE_HANDLER(via_ca1_r)
CA1 input
-------------------------------------------------*/
WRITE8_DEVICE_HANDLER(via_ca1_w)
WRITE_LINE_DEVICE_HANDLER(via_ca1_w)
{
via6522_t *v = get_token(device);
/* limit the data to 0 or 1 */
data = data ? 1 : 0;
/* handle the active transition */
if (data != v->in_ca1)
if (state != v->in_ca1)
{
if (TRACE_VIA)
logerror("%s:6522VIA chip %s: CA1 = %02X\n", cpuexec_describe_context(device->machine), device->tag, data);
logerror("%s:6522VIA chip %s: CA1 = %02X\n", cpuexec_describe_context(device->machine), device->tag, state);
if ((CA1_LOW_TO_HIGH(v->pcr) && data) || (CA1_HIGH_TO_LOW(v->pcr) && !data))
if ((CA1_LOW_TO_HIGH(v->pcr) && state) || (CA1_HIGH_TO_LOW(v->pcr) && !state))
{
if (PA_LATCH_ENABLE(v->acr))
{
@ -983,7 +980,7 @@ WRITE8_DEVICE_HANDLER(via_ca1_w)
}
}
v->in_ca1 = data;
v->in_ca1 = state;
}
}
@ -993,7 +990,7 @@ WRITE8_DEVICE_HANDLER(via_ca1_w)
CA2 input
-------------------------------------------------*/
READ8_DEVICE_HANDLER(via_ca2_r)
READ_LINE_DEVICE_HANDLER(via_ca2_r)
{
via6522_t *v = get_token(device);
return v->in_ca2;
@ -1005,27 +1002,24 @@ READ8_DEVICE_HANDLER(via_ca2_r)
CA2 input
-------------------------------------------------*/
WRITE8_DEVICE_HANDLER(via_ca2_w)
WRITE_LINE_DEVICE_HANDLER(via_ca2_w)
{
via6522_t *v = get_token(device);
/* limit the data to 0 or 1 */
data = data ? 1 : 0;
/* CA2 is in input mode */
if (CA2_INPUT(v->pcr))
{
/* the new state has caused a transition */
if (v->in_ca2 != data)
if (v->in_ca2 != state)
{
/* handle the active transition */
if ((data && CA2_LOW_TO_HIGH(v->pcr)) || (!data && CA2_HIGH_TO_LOW(v->pcr)))
if ((state && CA2_LOW_TO_HIGH(v->pcr)) || (!state && CA2_HIGH_TO_LOW(v->pcr)))
{
/* mark the IRQ */
via_set_int (device, INT_CA2);
}
/* set the new value for CA2 */
v->in_ca2 = data;
v->in_ca2 = state;
}
}
@ -1064,7 +1058,7 @@ WRITE8_DEVICE_HANDLER(via_portb_w)
CB1 input
-------------------------------------------------*/
READ8_DEVICE_HANDLER(via_cb1_r)
READ_LINE_DEVICE_HANDLER(via_cb1_r)
{
via6522_t *v = get_token(device);
return v->in_cb1;
@ -1076,17 +1070,14 @@ READ8_DEVICE_HANDLER(via_cb1_r)
CB1 input
-------------------------------------------------*/
WRITE8_DEVICE_HANDLER(via_cb1_w)
WRITE_LINE_DEVICE_HANDLER(via_cb1_w)
{
via6522_t *v = get_token(device);
/* limit the data to 0 or 1 */
data = data ? 1 : 0;
/* handle the active transition */
if (data != v->in_cb1)
if (state != v->in_cb1)
{
if ((CB1_LOW_TO_HIGH(v->pcr) && data) || (CB1_HIGH_TO_LOW(v->pcr) && !data))
if ((CB1_LOW_TO_HIGH(v->pcr) && state) || (CB1_HIGH_TO_LOW(v->pcr) && !state))
{
if (PB_LATCH_ENABLE(v->acr))
{
@ -1114,7 +1105,7 @@ WRITE8_DEVICE_HANDLER(via_cb1_w)
}
}
}
v->in_cb1 = data;
v->in_cb1 = state;
}
}
@ -1124,7 +1115,7 @@ WRITE8_DEVICE_HANDLER(via_cb1_w)
CB2 input
-------------------------------------------------*/
READ8_DEVICE_HANDLER(via_cb2_r)
READ_LINE_DEVICE_HANDLER(via_cb2_r)
{
via6522_t *v = get_token(device);
return v->in_cb2;
@ -1136,27 +1127,24 @@ READ8_DEVICE_HANDLER(via_cb2_r)
CB2 input
-------------------------------------------------*/
WRITE8_DEVICE_HANDLER(via_cb2_w)
WRITE_LINE_DEVICE_HANDLER(via_cb2_w)
{
via6522_t *v = get_token(device);
/* limit the data to 0 or 1 */
data = data ? 1 : 0;
/* CB2 is in input mode */
if (CB2_INPUT(v->pcr))
{
/* the new state has caused a transition */
if (v->in_cb2 != data)
if (v->in_cb2 != state)
{
/* handle the active transition */
if ((data && CB2_LOW_TO_HIGH(v->pcr)) || (!data && CB2_HIGH_TO_LOW(v->pcr)))
if ((state && CB2_LOW_TO_HIGH(v->pcr)) || (!state && CB2_HIGH_TO_LOW(v->pcr)))
{
/* mark the IRQ */
via_set_int (device, INT_CB2);
}
/* set the new value for CB2 */
v->in_cb2 = data;
v->in_cb2 = state;
}
}
}

View File

@ -82,16 +82,16 @@ WRITE8_DEVICE_HANDLER(via_porta_w);
READ8_DEVICE_HANDLER(via_portb_r);
WRITE8_DEVICE_HANDLER(via_portb_w);
READ8_DEVICE_HANDLER(via_ca1_r);
WRITE8_DEVICE_HANDLER(via_ca1_w);
READ_LINE_DEVICE_HANDLER(via_ca1_r);
WRITE_LINE_DEVICE_HANDLER(via_ca1_w);
READ8_DEVICE_HANDLER(via_ca2_r);
WRITE8_DEVICE_HANDLER(via_ca2_w);
READ_LINE_DEVICE_HANDLER(via_ca2_r);
WRITE_LINE_DEVICE_HANDLER(via_ca2_w);
READ8_DEVICE_HANDLER(via_cb1_r);
WRITE8_DEVICE_HANDLER(via_cb1_w);
READ_LINE_DEVICE_HANDLER(via_cb1_r);
WRITE_LINE_DEVICE_HANDLER(via_cb1_w);
READ8_DEVICE_HANDLER(via_cb2_r);
WRITE8_DEVICE_HANDLER(via_cb2_w);
READ_LINE_DEVICE_HANDLER(via_cb2_r);
WRITE_LINE_DEVICE_HANDLER(via_cb2_w);
#endif /* __6522VIA_H__ */

View File

@ -211,8 +211,8 @@ static MACHINE_RESET( trvquest )
static INTERRUPT_GEN( trvquest_interrupt )
{
gameplan_state *state = (gameplan_state *)device->machine->driver_data;
via_ca1_w(state->via_2, 0, 1);
via_ca1_w(state->via_2, 0, 0);
via_ca1_w(state->via_2, 1);
via_ca1_w(state->via_2, 0);
}
static MACHINE_DRIVER_START( trvquest )

View File

@ -8,8 +8,8 @@ static int pbus;
static READ8_DEVICE_HANDLER( b_via_0_pb_r );
static WRITE8_DEVICE_HANDLER( b_via_0_pa_w );
static WRITE8_DEVICE_HANDLER( b_via_0_pb_w );
static READ8_DEVICE_HANDLER( b_via_0_ca2_r );
static WRITE8_DEVICE_HANDLER( b_via_0_ca2_w );
static READ_LINE_DEVICE_HANDLER( b_via_0_ca2_r );
static WRITE_LINE_DEVICE_HANDLER( b_via_0_ca2_w );
static READ8_DEVICE_HANDLER( b_via_1_pa_r );
static READ8_DEVICE_HANDLER( b_via_1_pb_r );
@ -19,27 +19,27 @@ static WRITE8_DEVICE_HANDLER( b_via_1_pb_w );
const via6522_interface b_via_0_interface =
{
/*inputs : A/B */ DEVCB_NULL, DEVCB_HANDLER(b_via_0_pb_r),
/*inputs : CA/B1,CA/B2 */ DEVCB_NULL, DEVCB_DEVICE_HANDLER("via6522_1", via_ca2_r), DEVCB_HANDLER(b_via_0_ca2_r), DEVCB_DEVICE_HANDLER("via6522_1", via_ca1_r),
/*inputs : CA/B1,CA/B2 */ DEVCB_NULL, DEVCB_DEVICE_LINE("via6522_1", via_ca2_r), DEVCB_LINE(b_via_0_ca2_r), DEVCB_DEVICE_LINE("via6522_1", via_ca1_r),
/*outputs: A/B */ DEVCB_HANDLER(b_via_0_pa_w), DEVCB_HANDLER(b_via_0_pb_w),
/*outputs: CA/B1,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_HANDLER(b_via_0_ca2_w), DEVCB_DEVICE_HANDLER("via6522_1", via_ca1_w),
/*outputs: CA/B1,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_LINE(b_via_0_ca2_w), DEVCB_DEVICE_LINE("via6522_1", via_ca1_w),
/*irq */ DEVCB_CPU_INPUT_LINE("maincpu", M6809_IRQ_LINE)
};
const via6522_interface b_via_1_interface =
{
/*inputs : A/B */ DEVCB_HANDLER(b_via_1_pa_r), DEVCB_HANDLER(b_via_1_pb_r),
/*inputs : CA/B1,CA/B2 */ DEVCB_DEVICE_HANDLER("via6522_0", via_cb2_r), DEVCB_NULL, DEVCB_DEVICE_HANDLER("via6522_0", via_cb1_r), DEVCB_NULL,
/*inputs : CA/B1,CA/B2 */ DEVCB_DEVICE_LINE("via6522_0", via_cb2_r), DEVCB_NULL, DEVCB_DEVICE_LINE("via6522_0", via_cb1_r), DEVCB_NULL,
/*outputs: A/B */ DEVCB_HANDLER(b_via_1_pa_w), DEVCB_HANDLER(b_via_1_pb_w),
/*outputs: CA/B1,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_DEVICE_HANDLER("via6522_0", via_cb1_w), DEVCB_NULL,
/*outputs: CA/B1,CA/B2 */ DEVCB_NULL, DEVCB_NULL, DEVCB_DEVICE_LINE("via6522_0", via_cb1_w), DEVCB_NULL,
/*irq */ DEVCB_CPU_INPUT_LINE("audiocpu", M6809_IRQ_LINE)
};
static READ8_DEVICE_HANDLER( b_via_0_ca2_r )
static READ_LINE_DEVICE_HANDLER( b_via_0_ca2_r )
{
return 0;
}
static WRITE8_DEVICE_HANDLER( b_via_0_ca2_w )
static WRITE_LINE_DEVICE_HANDLER( b_via_0_ca2_w )
{
}

View File

@ -10,7 +10,7 @@ INTERRUPT_GEN( beezer_interrupt )
const device_config *via_0 = devtag_get_device(device->machine, "via6522_0");
scanline = (scanline + 1) % 0x80;
via_ca2_w (via_0, 0, scanline & 0x10);
via_ca2_w(via_0, (scanline & 0x10) ? 1 : 0);
if ((scanline & 0x78) == 0x78)
cpu_set_input_line(device, M6809_FIRQ_LINE, ASSERT_LINE);
else

View File

@ -145,60 +145,60 @@ static TIMER_CALLBACK( clear_screen_done_callback )
gameplan_state *state = (gameplan_state *)machine->driver_data;
/* indicate that the we are done clearing the screen */
via_ca1_w(state->via_0, 0, 0);
via_ca1_w(state->via_0, 0);
}
static WRITE8_DEVICE_HANDLER( video_command_trigger_w )
static WRITE_LINE_DEVICE_HANDLER( video_command_trigger_w )
{
gameplan_state *state = (gameplan_state *)device->machine->driver_data;
gameplan_state *driver_state = (gameplan_state *)device->machine->driver_data;
if (data == 0)
if (state == 0)
{
switch (state->video_command)
switch (driver_state->video_command)
{
/* draw pixel */
case 0:
/* auto-adjust X? */
if (state->video_data & 0x10)
if (driver_state->video_data & 0x10)
{
if (state->video_data & 0x40)
state->video_x = state->video_x - 1;
if (driver_state->video_data & 0x40)
driver_state->video_x = driver_state->video_x - 1;
else
state->video_x = state->video_x + 1;
driver_state->video_x = driver_state->video_x + 1;
}
/* auto-adjust Y? */
if (state->video_data & 0x20)
if (driver_state->video_data & 0x20)
{
if (state->video_data & 0x80)
state->video_y = state->video_y - 1;
if (driver_state->video_data & 0x80)
driver_state->video_y = driver_state->video_y - 1;
else
state->video_y = state->video_y + 1;
driver_state->video_y = driver_state->video_y + 1;
}
state->videoram[state->video_y * (HBSTART - HBEND) + state->video_x] = state->video_data & 0x0f;
driver_state->videoram[driver_state->video_y * (HBSTART - HBEND) + driver_state->video_x] = driver_state->video_data & 0x0f;
break;
/* load X register */
case 1:
state->video_x = state->video_data;
driver_state->video_x = driver_state->video_data;
break;
/* load Y register */
case 2:
state->video_y = state->video_data;
driver_state->video_y = driver_state->video_data;
break;
/* clear screen */
case 3:
/* indicate that the we are busy */
{
via_ca1_w(state->via_0, 0, 1);
via_ca1_w(driver_state->via_0, 1);
}
memset(state->videoram, state->video_data & 0x0f, state->videoram_size);
memset(driver_state->videoram, driver_state->video_data & 0x0f, driver_state->videoram_size);
/* set a timer for an arbitrarily short period.
The real time it takes to clear to screen is not
@ -236,31 +236,31 @@ static READ8_DEVICE_HANDLER( vblank_r )
const via6522_interface gameplan_via_0_interface =
{
DEVCB_NULL, DEVCB_HANDLER(vblank_r), /*inputs : A/B */
DEVCB_NULL, DEVCB_HANDLER(vblank_r), /*inputs : A/B */
DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, /*inputs : CA/B1,CA/B2 */
DEVCB_HANDLER(video_data_w), DEVCB_HANDLER(gameplan_video_command_w), /*outputs: A/B */
DEVCB_NULL, DEVCB_NULL, DEVCB_HANDLER(video_command_trigger_w), DEVCB_NULL, /*outputs: CA/B1,CA/B2 */
DEVCB_LINE(via_irq) /*irq */
DEVCB_HANDLER(video_data_w), DEVCB_HANDLER(gameplan_video_command_w), /*outputs: A/B */
DEVCB_NULL, DEVCB_NULL, DEVCB_LINE(video_command_trigger_w), DEVCB_NULL, /*outputs: CA/B1,CA/B2 */
DEVCB_LINE(via_irq) /*irq */
};
const via6522_interface leprechn_via_0_interface =
{
DEVCB_NULL, DEVCB_HANDLER(vblank_r), /*inputs : A/B */
DEVCB_NULL, DEVCB_HANDLER(vblank_r), /*inputs : A/B */
DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, /*inputs : CA/B1,CA/B2 */
DEVCB_HANDLER(video_data_w), DEVCB_HANDLER(leprechn_video_command_w), /*outputs: A/B */
DEVCB_NULL, DEVCB_NULL, DEVCB_HANDLER(video_command_trigger_w), DEVCB_NULL, /*outputs: CA/B1,CA/B2 */
DEVCB_LINE(via_irq) /*irq */
DEVCB_HANDLER(video_data_w), DEVCB_HANDLER(leprechn_video_command_w), /*outputs: A/B */
DEVCB_NULL, DEVCB_NULL, DEVCB_LINE(video_command_trigger_w), DEVCB_NULL, /*outputs: CA/B1,CA/B2 */
DEVCB_LINE(via_irq) /*irq */
};
const via6522_interface trvquest_via_0_interface =
{
DEVCB_NULL, DEVCB_HANDLER(vblank_r), /*inputs : A/B */
DEVCB_NULL, DEVCB_HANDLER(vblank_r), /*inputs : A/B */
DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, /*inputs : CA/B1,CA/B2 */
DEVCB_HANDLER(video_data_w), DEVCB_HANDLER(gameplan_video_command_w), /*outputs: A/B */
DEVCB_NULL, DEVCB_NULL, DEVCB_HANDLER(video_command_trigger_w), DEVCB_NULL, /*outputs: CA/B1,CA/B2 */
DEVCB_NULL /*irq */
DEVCB_HANDLER(video_data_w), DEVCB_HANDLER(gameplan_video_command_w), /*outputs: A/B */
DEVCB_NULL, DEVCB_NULL, DEVCB_LINE(video_command_trigger_w), DEVCB_NULL, /*outputs: CA/B1,CA/B2 */
DEVCB_NULL /*irq */
};
@ -269,7 +269,7 @@ static TIMER_CALLBACK( via_0_ca1_timer_callback )
gameplan_state *state = (gameplan_state *)machine->driver_data;
/* !VBLANK is connected to CA1 */
via_ca1_w(state->via_0, 0, (UINT8)param);
via_ca1_w(state->via_0, param);
if (param)
timer_adjust_oneshot(state->via_0_ca1_timer, video_screen_get_time_until_pos(machine->primary_screen, VBSTART, 0), 0);