Changed the 6522 VIA implementation to be a device

This commit is contained in:
Nathan Woods 2008-12-14 01:08:14 +00:00
parent 5b13d131ea
commit f2c32190ea
14 changed files with 617 additions and 668 deletions

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
Rockwell 6522 VIA interface and emulation Rockwell 6522 VIA interface and emulation
This function emulates all the functionality of up to 8 6522 This function emulates all the functionality of 6522
versatile interface adapters. versatile interface adapters.
This is based on the M6821 emulation in MAME. This is based on the M6821 emulation in MAME.
@ -19,7 +19,15 @@
MACROS / CONSTANTS MACROS / CONSTANTS
***************************************************************************/ ***************************************************************************/
#define MAX_VIA 8 #define VIA6522 DEVICE_GET_INFO_NAME(via6522)
#define MDRV_VIA6522_ADD(_tag, _clock, _intrf) \
MDRV_DEVICE_ADD(_tag, VIA6522) \
MDRV_DEVICE_CONFIG_DATA32(via6522_inline_config, clck, _clock) \
MDRV_DEVICE_CONFIG(_intrf)
#define MDRV_VIA6522_REMOVE(_tag) \
MDRV_DEVICE_REMOVE(_tag, VIA6522)
#define VIA_PB 0 #define VIA_PB 0
#define VIA_PA 1 #define VIA_PA 1
@ -46,19 +54,25 @@
typedef struct _via6522_interface via6522_interface; typedef struct _via6522_interface via6522_interface;
struct _via6522_interface struct _via6522_interface
{ {
read8_space_func in_a_func; read8_device_func in_a_func;
read8_space_func in_b_func; read8_device_func in_b_func;
read8_space_func in_ca1_func; read8_device_func in_ca1_func;
read8_space_func in_cb1_func; read8_device_func in_cb1_func;
read8_space_func in_ca2_func; read8_device_func in_ca2_func;
read8_space_func in_cb2_func; read8_device_func in_cb2_func;
write8_space_func out_a_func; write8_device_func out_a_func;
write8_space_func out_b_func; write8_device_func out_b_func;
write8_space_func out_ca1_func; write8_device_func out_ca1_func;
write8_space_func out_cb1_func; write8_device_func out_cb1_func;
write8_space_func out_ca2_func; write8_device_func out_ca2_func;
write8_space_func out_cb2_func; write8_device_func out_cb2_func;
void (*irq_func)(running_machine *machine, int state); void (*irq_func)(const device_config *device, int state);
};
typedef struct _via6522_inline_config via6522_inline_config;
struct _via6522_inline_config
{
int clck;
}; };
@ -66,144 +80,27 @@ struct _via6522_interface
PROTOTYPES PROTOTYPES
***************************************************************************/ ***************************************************************************/
void via_set_clock(int which,int clck); DEVICE_GET_INFO(via6522);
void via_config(int which, const via6522_interface *intf);
void via_reset(void);
int via_read(running_machine *machine, int which, int offset);
void via_write(running_machine *machine, int which, int offset, int data);
void via_set_input_a(int which, int data);
void via_set_input_ca1(running_machine *machine, int which, int data);
void via_set_input_ca2(running_machine *machine, int which, int data);
void via_set_input_b(int which, int data);
void via_set_input_cb1(running_machine *machine, int which, int data);
void via_set_input_cb2(running_machine *machine, int which, int data);
/******************* Standard 8-bit CPU interfaces, D0-D7 *******************/ READ8_DEVICE_HANDLER(via_r);
WRITE8_DEVICE_HANDLER(via_w);
READ8_HANDLER( via_0_r ); READ8_DEVICE_HANDLER(via_porta_r);
READ8_HANDLER( via_1_r ); WRITE8_DEVICE_HANDLER(via_porta_w);
READ8_HANDLER( via_2_r );
READ8_HANDLER( via_3_r );
READ8_HANDLER( via_4_r );
READ8_HANDLER( via_5_r );
READ8_HANDLER( via_6_r );
READ8_HANDLER( via_7_r );
WRITE8_HANDLER( via_0_w ); READ8_DEVICE_HANDLER(via_portb_r);
WRITE8_HANDLER( via_1_w ); WRITE8_DEVICE_HANDLER(via_portb_w);
WRITE8_HANDLER( via_2_w );
WRITE8_HANDLER( via_3_w );
WRITE8_HANDLER( via_4_w );
WRITE8_HANDLER( via_5_w );
WRITE8_HANDLER( via_6_w );
WRITE8_HANDLER( via_7_w );
/******************* 8-bit A/B port interfaces *******************/ READ8_DEVICE_HANDLER(via_ca1_r);
WRITE8_DEVICE_HANDLER(via_ca1_w);
WRITE8_HANDLER( via_0_porta_w ); READ8_DEVICE_HANDLER(via_ca2_r);
WRITE8_HANDLER( via_1_porta_w ); WRITE8_DEVICE_HANDLER(via_ca2_w);
WRITE8_HANDLER( via_2_porta_w );
WRITE8_HANDLER( via_3_porta_w );
WRITE8_HANDLER( via_4_porta_w );
WRITE8_HANDLER( via_5_porta_w );
WRITE8_HANDLER( via_6_porta_w );
WRITE8_HANDLER( via_7_porta_w );
WRITE8_HANDLER( via_0_portb_w ); READ8_DEVICE_HANDLER(via_cb1_r);
WRITE8_HANDLER( via_1_portb_w ); WRITE8_DEVICE_HANDLER(via_cb1_w);
WRITE8_HANDLER( via_2_portb_w );
WRITE8_HANDLER( via_3_portb_w );
WRITE8_HANDLER( via_4_portb_w );
WRITE8_HANDLER( via_5_portb_w );
WRITE8_HANDLER( via_6_portb_w );
WRITE8_HANDLER( via_7_portb_w );
READ8_HANDLER( via_0_porta_r ); READ8_DEVICE_HANDLER(via_cb2_r);
READ8_HANDLER( via_1_porta_r ); WRITE8_DEVICE_HANDLER(via_cb2_w);
READ8_HANDLER( via_2_porta_r );
READ8_HANDLER( via_3_porta_r );
READ8_HANDLER( via_4_porta_r );
READ8_HANDLER( via_5_porta_r );
READ8_HANDLER( via_6_porta_r );
READ8_HANDLER( via_7_porta_r );
READ8_HANDLER( via_0_portb_r );
READ8_HANDLER( via_1_portb_r );
READ8_HANDLER( via_2_portb_r );
READ8_HANDLER( via_3_portb_r );
READ8_HANDLER( via_4_portb_r );
READ8_HANDLER( via_5_portb_r );
READ8_HANDLER( via_6_portb_r );
READ8_HANDLER( via_7_portb_r );
/******************* 1-bit CA1/CA2/CB1/CB2 port interfaces *******************/
WRITE8_HANDLER( via_0_ca1_w );
WRITE8_HANDLER( via_1_ca1_w );
WRITE8_HANDLER( via_2_ca1_w );
WRITE8_HANDLER( via_3_ca1_w );
WRITE8_HANDLER( via_4_ca1_w );
WRITE8_HANDLER( via_5_ca1_w );
WRITE8_HANDLER( via_6_ca1_w );
WRITE8_HANDLER( via_7_ca1_w );
WRITE8_HANDLER( via_0_ca2_w );
WRITE8_HANDLER( via_1_ca2_w );
WRITE8_HANDLER( via_2_ca2_w );
WRITE8_HANDLER( via_3_ca2_w );
WRITE8_HANDLER( via_4_ca2_w );
WRITE8_HANDLER( via_5_ca2_w );
WRITE8_HANDLER( via_6_ca2_w );
WRITE8_HANDLER( via_7_ca2_w );
WRITE8_HANDLER( via_0_cb1_w );
WRITE8_HANDLER( via_1_cb1_w );
WRITE8_HANDLER( via_2_cb1_w );
WRITE8_HANDLER( via_3_cb1_w );
WRITE8_HANDLER( via_4_cb1_w );
WRITE8_HANDLER( via_5_cb1_w );
WRITE8_HANDLER( via_6_cb1_w );
WRITE8_HANDLER( via_7_cb1_w );
WRITE8_HANDLER( via_0_cb2_w );
WRITE8_HANDLER( via_1_cb2_w );
WRITE8_HANDLER( via_2_cb2_w );
WRITE8_HANDLER( via_3_cb2_w );
WRITE8_HANDLER( via_4_cb2_w );
WRITE8_HANDLER( via_5_cb2_w );
WRITE8_HANDLER( via_6_cb2_w );
WRITE8_HANDLER( via_7_cb2_w );
READ8_HANDLER( via_0_ca1_r );
READ8_HANDLER( via_1_ca1_r );
READ8_HANDLER( via_2_ca1_r );
READ8_HANDLER( via_3_ca1_r );
READ8_HANDLER( via_4_ca1_r );
READ8_HANDLER( via_5_ca1_r );
READ8_HANDLER( via_6_ca1_r );
READ8_HANDLER( via_7_ca1_r );
READ8_HANDLER( via_0_ca2_r );
READ8_HANDLER( via_1_ca2_r );
READ8_HANDLER( via_2_ca2_r );
READ8_HANDLER( via_3_ca2_r );
READ8_HANDLER( via_4_ca2_r );
READ8_HANDLER( via_5_ca2_r );
READ8_HANDLER( via_6_ca2_r );
READ8_HANDLER( via_7_ca2_r );
READ8_HANDLER( via_0_cb1_r );
READ8_HANDLER( via_1_cb1_r );
READ8_HANDLER( via_2_cb1_r );
READ8_HANDLER( via_3_cb1_r );
READ8_HANDLER( via_4_cb1_r );
READ8_HANDLER( via_5_cb1_r );
READ8_HANDLER( via_6_cb1_r );
READ8_HANDLER( via_7_cb1_r );
READ8_HANDLER( via_0_cb2_r );
READ8_HANDLER( via_1_cb2_r );
READ8_HANDLER( via_2_cb2_r );
READ8_HANDLER( via_3_cb2_r );
READ8_HANDLER( via_4_cb2_r );
READ8_HANDLER( via_5_cb2_r );
READ8_HANDLER( via_6_cb2_r );
READ8_HANDLER( via_7_cb2_r );
#endif /* __6522VIA_H__ */ #endif /* __6522VIA_H__ */

View File

@ -336,20 +336,21 @@ static READ8_HANDLER( switch_6502_r )
* D5 = LED (out) * D5 = LED (out)
*/ */
static WRITE8_HANDLER( via_pa_w ) static WRITE8_DEVICE_HANDLER( via_pa_w )
{ {
tms5220_out_data = data; tms5220_out_data = data;
} }
static READ8_HANDLER( via_pa_r ) static READ8_DEVICE_HANDLER( via_pa_r )
{ {
return tms5220_in_data; return tms5220_in_data;
} }
static WRITE8_HANDLER( via_pb_w ) static WRITE8_DEVICE_HANDLER( via_pb_w )
{ {
const address_space *space = cpu_get_address_space(device->machine->cpu[0], ADDRESS_SPACE_PROGRAM);
UINT8 old = tms5220_ctl; UINT8 old = tms5220_ctl;
tms5220_ctl = data; tms5220_ctl = data;
@ -367,7 +368,7 @@ static WRITE8_HANDLER( via_pb_w )
} }
static READ8_HANDLER( via_pb_r ) static READ8_DEVICE_HANDLER( via_pb_r )
{ {
return (!tms5220_ready_r() << 2) | (!tms5220_int_r() << 3); return (!tms5220_ready_r() << 2) | (!tms5220_int_r() << 3);
} }
@ -439,7 +440,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x0fff) AM_RAM AM_RANGE(0x0000, 0x0fff) AM_RAM
AM_RANGE(0x1000, 0x100f) AM_READWRITE(via_0_r, via_0_w) AM_RANGE(0x1000, 0x100f) AM_DEVREADWRITE(VIA6522, "via6522_0", via_r, via_w)
AM_RANGE(0x1800, 0x1800) AM_WRITE(ym2151_register_port_0_w) AM_RANGE(0x1800, 0x1800) AM_WRITE(ym2151_register_port_0_w)
AM_RANGE(0x1800, 0x1801) AM_READWRITE(ym2151_status_port_0_r, ym2151_data_port_0_w) AM_RANGE(0x1800, 0x1801) AM_READWRITE(ym2151_status_port_0_r, ym2151_data_port_0_w)
AM_RANGE(0x1810, 0x1810) AM_READWRITE(atarigen_6502_sound_r, atarigen_6502_sound_w) AM_RANGE(0x1810, 0x1810) AM_READWRITE(atarigen_6502_sound_r, atarigen_6502_sound_w)
@ -738,6 +739,9 @@ static MACHINE_DRIVER_START( atarisy1 )
MDRV_SOUND_ADD("tms", TMS5220, ATARI_CLOCK_14MHz/2/11) MDRV_SOUND_ADD("tms", TMS5220, ATARI_CLOCK_14MHz/2/11)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 1.0) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 1.0)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 1.0) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 1.0)
/* via */
MDRV_VIA6522_ADD("via6522_0", 0, via_interface)
MACHINE_DRIVER_END MACHINE_DRIVER_END
@ -2141,8 +2145,6 @@ ROM_END
static DRIVER_INIT( marble ) static DRIVER_INIT( marble )
{ {
via_config(0, &via_interface);
atarigen_eeprom_default = NULL; atarigen_eeprom_default = NULL;
atarigen_slapstic_init(machine, 0, 0x080000, 0, 103); atarigen_slapstic_init(machine, 0, 0x080000, 0, 103);
@ -2153,8 +2155,6 @@ static DRIVER_INIT( marble )
static DRIVER_INIT( peterpak ) static DRIVER_INIT( peterpak )
{ {
via_config(0, &via_interface);
atarigen_eeprom_default = NULL; atarigen_eeprom_default = NULL;
atarigen_slapstic_init(machine, 0, 0x080000, 0, 107); atarigen_slapstic_init(machine, 0, 0x080000, 0, 107);
@ -2165,8 +2165,6 @@ static DRIVER_INIT( peterpak )
static DRIVER_INIT( indytemp ) static DRIVER_INIT( indytemp )
{ {
via_config(0, &via_interface);
atarigen_eeprom_default = NULL; atarigen_eeprom_default = NULL;
atarigen_slapstic_init(machine, 0, 0x080000, 0, 105); atarigen_slapstic_init(machine, 0, 0x080000, 0, 105);
@ -2177,8 +2175,6 @@ static DRIVER_INIT( indytemp )
static DRIVER_INIT( roadrunn ) static DRIVER_INIT( roadrunn )
{ {
via_config(0, &via_interface);
atarigen_eeprom_default = NULL; atarigen_eeprom_default = NULL;
atarigen_slapstic_init(machine, 0, 0x080000, 0, 108); atarigen_slapstic_init(machine, 0, 0x080000, 0, 108);
@ -2189,8 +2185,6 @@ static DRIVER_INIT( roadrunn )
static DRIVER_INIT( roadb109 ) static DRIVER_INIT( roadb109 )
{ {
via_config(0, &via_interface);
atarigen_eeprom_default = NULL; atarigen_eeprom_default = NULL;
atarigen_slapstic_init(machine, 0, 0x080000, 0, 109); atarigen_slapstic_init(machine, 0, 0x080000, 0, 109);
@ -2201,8 +2195,6 @@ static DRIVER_INIT( roadb109 )
static DRIVER_INIT( roadb110 ) static DRIVER_INIT( roadb110 )
{ {
via_config(0, &via_interface);
atarigen_eeprom_default = NULL; atarigen_eeprom_default = NULL;
atarigen_slapstic_init(machine, 0, 0x080000, 0, 110); atarigen_slapstic_init(machine, 0, 0x080000, 0, 110);

View File

@ -23,7 +23,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x07ff) AM_RAM AM_RANGE(0x0000, 0x07ff) AM_RAM
// AM_RANGE(0x1000, 0x10ff) AM_READWRITE(beezer_6840_r, beezer_6840_w) // AM_RANGE(0x1000, 0x10ff) AM_READWRITE(beezer_6840_r, beezer_6840_w)
AM_RANGE(0x1800, 0x18ff) AM_READWRITE(via_1_r, via_1_w) AM_RANGE(0x1800, 0x18ff) AM_DEVREADWRITE(VIA6522, "via6522_1", via_r, via_w)
// AM_RANGE(0x8000, 0x9fff) AM_WRITE(beezer_dac_w) // AM_RANGE(0x8000, 0x9fff) AM_WRITE(beezer_dac_w)
AM_RANGE(0xe000, 0xffff) AM_ROM AM_RANGE(0xe000, 0xffff) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -98,6 +98,10 @@ static MACHINE_DRIVER_START( beezer )
MDRV_SOUND_ADD("dac", DAC, 0) MDRV_SOUND_ADD("dac", DAC, 0)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
/* via */
MDRV_VIA6522_ADD("via6522_0", 0, b_via_0_interface)
MDRV_VIA6522_ADD("via6522_1", 0, b_via_1_interface)
MACHINE_DRIVER_END MACHINE_DRIVER_END
/*************************************************************************** /***************************************************************************

View File

@ -213,39 +213,41 @@ static WRITE16_HANDLER( scroll_w )
} }
static READ16_HANDLER(via_r) static READ16_HANDLER(bmcbowl_via_r)
{ {
return via_0_r(space,offset); const device_config *via_0 = device_list_find_by_tag(space->machine->config->devicelist, VIA6522, "via6522_0");
return via_r(via_0, offset);
} }
static WRITE16_HANDLER(via_w) static WRITE16_HANDLER(bmcbowl_via_w)
{ {
via_0_w(space,offset,data); const device_config *via_0 = device_list_find_by_tag(space->machine->config->devicelist, VIA6522, "via6522_0");
via_w(via_0, offset, data);
} }
static READ8_HANDLER(via_b_in) static READ8_DEVICE_HANDLER(via_b_in)
{ {
return input_port_read(space->machine, "IN3"); return input_port_read(device->machine, "IN3");
} }
static WRITE8_HANDLER(via_a_out) static WRITE8_DEVICE_HANDLER(via_a_out)
{ {
// related to video hw ? BG scroll ? // related to video hw ? BG scroll ?
} }
static WRITE8_HANDLER(via_b_out) static WRITE8_DEVICE_HANDLER(via_b_out)
{ {
//used //used
} }
static WRITE8_HANDLER(via_ca2_out) static WRITE8_DEVICE_HANDLER(via_ca2_out)
{ {
//used //used
} }
static void via_irq(running_machine *machine, int state) static void via_irq(const device_config *device, int state)
{ {
//used //used
} }
@ -333,7 +335,7 @@ static ADDRESS_MAP_START( bmcbowl_mem, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x091000, 0x091001) AM_WRITE(SMH_NOP) AM_RANGE(0x091000, 0x091001) AM_WRITE(SMH_NOP)
AM_RANGE(0x091800, 0x091801) AM_WRITE(scroll_w) AM_RANGE(0x091800, 0x091801) AM_WRITE(scroll_w)
AM_RANGE(0x092000, 0x09201f) AM_READWRITE(via_r,via_w) AM_RANGE(0x092000, 0x09201f) AM_READWRITE(bmcbowl_via_r, bmcbowl_via_w)
AM_RANGE(0x093000, 0x093003) AM_WRITE(SMH_NOP) // related to music AM_RANGE(0x093000, 0x093003) AM_WRITE(SMH_NOP) // related to music
AM_RANGE(0x092800, 0x092801) AM_WRITE(ay8910_write_port_0_msb_w ) AM_RANGE(0x092800, 0x092801) AM_WRITE(ay8910_write_port_0_msb_w )
@ -482,7 +484,6 @@ static const via6522_interface via_interface =
static MACHINE_RESET( bmcbowl ) static MACHINE_RESET( bmcbowl )
{ {
via_reset();
} }
static INTERRUPT_GEN( bmc_interrupt ) static INTERRUPT_GEN( bmc_interrupt )
@ -525,6 +526,9 @@ static MACHINE_DRIVER_START( bmcbowl )
MDRV_SOUND_CONFIG(okim6295_interface_pin7high) // clock frequency & pin 7 not verified MDRV_SOUND_CONFIG(okim6295_interface_pin7high) // clock frequency & pin 7 not verified
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 0.50) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 0.50)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.50) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.50)
/* via */
MDRV_VIA6522_ADD("via6522_0", 1000000, via_interface)
MACHINE_DRIVER_END MACHINE_DRIVER_END
ROM_START( bmcbowl ) ROM_START( bmcbowl )
@ -547,8 +551,6 @@ ROM_END
static DRIVER_INIT(bmcbowl) static DRIVER_INIT(bmcbowl)
{ {
via_config(0, &via_interface);
via_set_clock(0, 1000000);//1 MHz ?
colorram=auto_malloc(768); colorram=auto_malloc(768);
} }

View File

@ -77,9 +77,9 @@ TODO:
* *
*************************************/ *************************************/
static WRITE8_HANDLER( io_select_w ) static WRITE8_DEVICE_HANDLER( io_select_w )
{ {
gameplan_state *state = space->machine->driver_data; gameplan_state *state = device->machine->driver_data;
switch (data) switch (data)
{ {
@ -93,16 +93,16 @@ static WRITE8_HANDLER( io_select_w )
} }
static READ8_HANDLER( io_port_r ) static READ8_DEVICE_HANDLER( io_port_r )
{ {
static const char *const portnames[] = { "IN0", "IN1", "IN2", "IN3", "DSW0", "DSW1" }; static const char *const portnames[] = { "IN0", "IN1", "IN2", "IN3", "DSW0", "DSW1" };
gameplan_state *state = space->machine->driver_data; gameplan_state *state = device->machine->driver_data;
return input_port_read(space->machine, portnames[state->current_port]); return input_port_read(device->machine, portnames[state->current_port]);
} }
static WRITE8_HANDLER( coin_w ) static WRITE8_DEVICE_HANDLER( coin_w )
{ {
coin_counter_w(0, ~data & 1); coin_counter_w(0, ~data & 1);
} }
@ -125,35 +125,42 @@ static const via6522_interface via_1_interface =
* *
*************************************/ *************************************/
static WRITE8_HANDLER( audio_reset_w ) static WRITE8_DEVICE_HANDLER( audio_reset_w )
{ {
gameplan_state *state = space->machine->driver_data; gameplan_state *state = device->machine->driver_data;
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_RESET, data ? CLEAR_LINE : ASSERT_LINE); cpu_set_input_line(device->machine->cpu[1], INPUT_LINE_RESET, data ? CLEAR_LINE : ASSERT_LINE);
if (data == 0) if (data == 0)
{ {
device_reset(state->riot); device_reset(state->riot);
cpuexec_boost_interleave(space->machine, attotime_zero, ATTOTIME_IN_USEC(10)); cpuexec_boost_interleave(device->machine, attotime_zero, ATTOTIME_IN_USEC(10));
} }
} }
static WRITE8_HANDLER( audio_cmd_w ) static WRITE8_DEVICE_HANDLER( audio_cmd_w )
{ {
gameplan_state *state = space->machine->driver_data; gameplan_state *state = device->machine->driver_data;
riot6532_porta_in_set(state->riot, data, 0x7f); riot6532_porta_in_set(state->riot, data, 0x7f);
} }
static WRITE8_HANDLER( audio_trigger_w ) static WRITE8_DEVICE_HANDLER( audio_trigger_w )
{ {
gameplan_state *state = space->machine->driver_data; gameplan_state *state = device->machine->driver_data;
riot6532_porta_in_set(state->riot, data << 7, 0x80); riot6532_porta_in_set(state->riot, data << 7, 0x80);
} }
static READ8_DEVICE_HANDLER( via_soundlatch_r )
{
const address_space *space = cpu_get_address_space(device->machine->cpu[0], ADDRESS_SPACE_PROGRAM);
return soundlatch_r(space, offset);
}
static const via6522_interface via_2_interface = static const via6522_interface via_2_interface =
{ {
0, soundlatch_r, /*inputs : A/B */ 0, via_soundlatch_r, /*inputs : A/B */
0, 0, 0, 0, /*inputs : CA/B1,CA/B2 */ 0, 0, 0, 0, /*inputs : CA/B1,CA/B2 */
audio_cmd_w, 0, /*outputs: A/B */ audio_cmd_w, 0, /*outputs: A/B */
0, 0, audio_trigger_w, audio_reset_w, /*outputs: CA/B1,CA/B2 */ 0, 0, audio_trigger_w, audio_reset_w, /*outputs: CA/B1,CA/B2 */
@ -179,7 +186,6 @@ static void r6532_irq(const device_config *device, int state)
static void r6532_soundlatch_w(const device_config *device, UINT8 newdata, UINT8 olddata) static void r6532_soundlatch_w(const device_config *device, UINT8 newdata, UINT8 olddata)
{ {
const address_space *space = cpu_get_address_space(device->machine->cpu[0], ADDRESS_SPACE_PROGRAM); const address_space *space = cpu_get_address_space(device->machine->cpu[0], ADDRESS_SPACE_PROGRAM);
soundlatch_w(space, 0, newdata); soundlatch_w(space, 0, newdata);
} }
@ -207,9 +213,6 @@ static MACHINE_START( gameplan )
state->riot = device_list_find_by_tag(machine->config->devicelist, RIOT6532, "riot"); state->riot = device_list_find_by_tag(machine->config->devicelist, RIOT6532, "riot");
via_config(1, &via_1_interface);
via_config(2, &via_2_interface);
/* register for save states */ /* register for save states */
state_save_register_global(machine, state->current_port); state_save_register_global(machine, state->current_port);
} }
@ -224,7 +227,6 @@ static MACHINE_START( gameplan )
static MACHINE_RESET( gameplan ) static MACHINE_RESET( gameplan )
{ {
via_reset();
} }
@ -237,9 +239,9 @@ static MACHINE_RESET( gameplan )
static ADDRESS_MAP_START( gameplan_main_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( gameplan_main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x03ff) AM_MIRROR(0x1c00) AM_RAM AM_RANGE(0x0000, 0x03ff) AM_MIRROR(0x1c00) AM_RAM
AM_RANGE(0x2000, 0x200f) AM_MIRROR(0x07f0) AM_READWRITE(via_0_r, via_0_w) /* VIA 1 */ AM_RANGE(0x2000, 0x200f) AM_MIRROR(0x07f0) AM_DEVREADWRITE(VIA6522, "via6522_0", via_r, via_w) /* VIA 1 */
AM_RANGE(0x2800, 0x280f) AM_MIRROR(0x07f0) AM_READWRITE(via_1_r, via_1_w) /* VIA 2 */ AM_RANGE(0x2800, 0x280f) AM_MIRROR(0x07f0) AM_DEVREADWRITE(VIA6522, "via6522_1", via_r, via_w) /* VIA 2 */
AM_RANGE(0x3000, 0x300f) AM_MIRROR(0x07f0) AM_READWRITE(via_2_r, via_2_w) /* VIA 3 */ AM_RANGE(0x3000, 0x300f) AM_MIRROR(0x07f0) AM_DEVREADWRITE(VIA6522, "via6522_2", via_r, via_w) /* VIA 3 */
AM_RANGE(0x8000, 0xffff) AM_ROM AM_RANGE(0x8000, 0xffff) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -1192,6 +1194,11 @@ static MACHINE_DRIVER_START( gameplan )
MDRV_SOUND_ADD("ay", AY8910, GAMEPLAN_AY8910_CLOCK) MDRV_SOUND_ADD("ay", AY8910, GAMEPLAN_AY8910_CLOCK)
MDRV_SOUND_CONFIG(ay8910_config) MDRV_SOUND_CONFIG(ay8910_config)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.33) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.33)
/* via */
MDRV_VIA6522_ADD("via6522_0", 0, gameplan_via_0_interface)
MDRV_VIA6522_ADD("via6522_1", 0, via_1_interface)
MDRV_VIA6522_ADD("via6522_2", 0, via_2_interface)
MACHINE_DRIVER_END MACHINE_DRIVER_END
@ -1205,6 +1212,10 @@ static MACHINE_DRIVER_START( leprechn )
/* video hardware */ /* video hardware */
MDRV_IMPORT_FROM(leprechn_video) MDRV_IMPORT_FROM(leprechn_video)
/* via */
MDRV_VIA6522_REMOVE("via6522_0")
MDRV_VIA6522_ADD("via6522_0", 0, leprechn_via_0_interface)
MACHINE_DRIVER_END MACHINE_DRIVER_END

View File

@ -412,9 +412,6 @@ static MACHINE_RESET( itech32 )
sound_return = 0; sound_return = 0;
sound_int_state = 0; sound_int_state = 0;
/* reset the VIA chip (if used) */
via_reset();
/* reset the ticket dispenser */ /* reset the ticket dispenser */
ticket_dispenser_init(machine, 200, TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH); ticket_dispenser_init(machine, 200, TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
} }
@ -667,8 +664,9 @@ static READ8_HANDLER( sound_data_buffer_r )
* *
*************************************/ *************************************/
static WRITE8_HANDLER( drivedge_portb_out ) static WRITE8_DEVICE_HANDLER( drivedge_portb_out )
{ {
const address_space *space = cpu_get_address_space(device->machine->cpu[0], ADDRESS_SPACE_PROGRAM);
// logerror("PIA port B write = %02x\n", data); // logerror("PIA port B write = %02x\n", data);
/* bit 0 controls the fan light */ /* bit 0 controls the fan light */
@ -685,14 +683,15 @@ static WRITE8_HANDLER( drivedge_portb_out )
} }
static WRITE8_HANDLER( drivedge_turbo_light ) static WRITE8_DEVICE_HANDLER( drivedge_turbo_light )
{ {
set_led_status(0, data); set_led_status(0, data);
} }
static WRITE8_HANDLER( pia_portb_out ) static WRITE8_DEVICE_HANDLER( pia_portb_out )
{ {
const address_space *space = cpu_get_address_space(device->machine->cpu[0], ADDRESS_SPACE_PROGRAM);
// logerror("PIA port B write = %02x\n", data); // logerror("PIA port B write = %02x\n", data);
/* bit 4 controls the ticket dispenser */ /* bit 4 controls the ticket dispenser */
@ -710,12 +709,12 @@ static WRITE8_HANDLER( pia_portb_out )
* *
*************************************/ *************************************/
static void via_irq(running_machine *machine, int state) static void via_irq(const device_config *device, int state)
{ {
if (state) if (state)
cpu_set_input_line(machine->cpu[1], M6809_FIRQ_LINE, ASSERT_LINE); cpu_set_input_line(device->machine->cpu[1], M6809_FIRQ_LINE, ASSERT_LINE);
else else
cpu_set_input_line(machine->cpu[1], M6809_FIRQ_LINE, CLEAR_LINE); cpu_set_input_line(device->machine->cpu[1], M6809_FIRQ_LINE, CLEAR_LINE);
} }
@ -1060,7 +1059,7 @@ static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0880, 0x08bf) AM_READ(es5506_data_0_r) AM_RANGE(0x0880, 0x08bf) AM_READ(es5506_data_0_r)
AM_RANGE(0x0c00, 0x0c00) AM_WRITE(sound_bank_w) AM_RANGE(0x0c00, 0x0c00) AM_WRITE(sound_bank_w)
AM_RANGE(0x1000, 0x1000) AM_WRITENOP /* noisy */ AM_RANGE(0x1000, 0x1000) AM_WRITENOP /* noisy */
AM_RANGE(0x1400, 0x140f) AM_READWRITE(via_0_r, via_0_w) AM_RANGE(0x1400, 0x140f) AM_DEVREADWRITE(VIA6522, "via6522_0", via_r, via_w)
AM_RANGE(0x2000, 0x3fff) AM_RAM AM_RANGE(0x2000, 0x3fff) AM_RAM
AM_RANGE(0x4000, 0x7fff) AM_ROMBANK(1) AM_RANGE(0x4000, 0x7fff) AM_ROMBANK(1)
AM_RANGE(0x8000, 0xffff) AM_ROM AM_RANGE(0x8000, 0xffff) AM_ROM
@ -1709,6 +1708,9 @@ static MACHINE_DRIVER_START( timekill )
MDRV_SOUND_ADD("ensoniq", ES5506, SOUND_CLOCK) MDRV_SOUND_ADD("ensoniq", ES5506, SOUND_CLOCK)
MDRV_SOUND_CONFIG(es5506_config) MDRV_SOUND_CONFIG(es5506_config)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
/* via */
MDRV_VIA6522_ADD("via6522_0", SOUND_CLOCK/8, via_interface)
MACHINE_DRIVER_END MACHINE_DRIVER_END
@ -1760,6 +1762,9 @@ static MACHINE_DRIVER_START( sftm )
MDRV_CPU_VBLANK_INT_HACK(irq1_line_assert,4) MDRV_CPU_VBLANK_INT_HACK(irq1_line_assert,4)
MDRV_NVRAM_HANDLER(itech020) MDRV_NVRAM_HANDLER(itech020)
/* via */
MDRV_VIA6522_REMOVE("via6522_0")
MACHINE_DRIVER_END MACHINE_DRIVER_END
@ -3837,8 +3842,6 @@ static void init_program_rom(running_machine *machine)
static DRIVER_INIT( timekill ) static DRIVER_INIT( timekill )
{ {
init_program_rom(machine); init_program_rom(machine);
via_config(0, &via_interface);
via_set_clock(0, SOUND_CLOCK/8);
itech32_vram_height = 512; itech32_vram_height = 512;
itech32_planes = 2; itech32_planes = 2;
is_drivedge = 0; is_drivedge = 0;
@ -3848,8 +3851,6 @@ static DRIVER_INIT( timekill )
static DRIVER_INIT( hardyard ) static DRIVER_INIT( hardyard )
{ {
init_program_rom(machine); init_program_rom(machine);
via_config(0, &via_interface);
via_set_clock(0, SOUND_CLOCK/8);
itech32_vram_height = 1024; itech32_vram_height = 1024;
itech32_planes = 1; itech32_planes = 1;
is_drivedge = 0; is_drivedge = 0;
@ -3859,8 +3860,6 @@ static DRIVER_INIT( hardyard )
static DRIVER_INIT( bloodstm ) static DRIVER_INIT( bloodstm )
{ {
init_program_rom(machine); init_program_rom(machine);
via_config(0, &via_interface);
via_set_clock(0, SOUND_CLOCK/8);
itech32_vram_height = 1024; itech32_vram_height = 1024;
itech32_planes = 1; itech32_planes = 1;
is_drivedge = 0; is_drivedge = 0;
@ -3870,8 +3869,6 @@ static DRIVER_INIT( bloodstm )
static DRIVER_INIT( drivedge ) static DRIVER_INIT( drivedge )
{ {
init_program_rom(machine); init_program_rom(machine);
via_config(0, &drivedge_via_interface);
via_set_clock(0, SOUND_CLOCK/8);
itech32_vram_height = 1024; itech32_vram_height = 1024;
itech32_planes = 1; itech32_planes = 1;
is_drivedge = 1; is_drivedge = 1;
@ -3890,8 +3887,6 @@ static DRIVER_INIT( wcbowl )
Sound P/N 1060 Rev 0 (see Hot Memory PCB layout above) Sound P/N 1060 Rev 0 (see Hot Memory PCB layout above)
*/ */
init_program_rom(machine); init_program_rom(machine);
via_config(0, &via_interface);
via_set_clock(0, SOUND_CLOCK/8);
itech32_vram_height = 1024; itech32_vram_height = 1024;
itech32_planes = 1; itech32_planes = 1;

View File

@ -561,13 +561,20 @@ static const pia6821_interface pia_interface =
* *
*************************************/ *************************************/
static void via_irq(running_machine *machine, int state); static void via_irq(const device_config *device, int state);
static WRITE8_DEVICE_HANDLER( via_pia_portb_out )
{
const address_space *space = cpu_get_address_space(device->machine->cpu[0], ADDRESS_SPACE_PROGRAM);
pia_portb_out(space, offset, data);
}
static const via6522_interface via_interface = static const via6522_interface via_interface =
{ {
/*inputs : A/B */ 0, 0, /*inputs : A/B */ 0, 0,
/*inputs : CA/B1,CA/B2 */ 0, 0, 0, 0, /*inputs : CA/B1,CA/B2 */ 0, 0, 0, 0,
/*outputs: A/B */ 0, pia_portb_out, /*outputs: A/B */ 0, via_pia_portb_out,
/*outputs: CA/B1,CA/B2 */ 0, 0, 0, 0, /*outputs: CA/B1,CA/B2 */ 0, 0, 0, 0,
/*irq */ via_irq /*irq */ via_irq
}; };
@ -676,11 +683,6 @@ static MACHINE_RESET( itech8 )
/* reset the PIA (if used) */ /* reset the PIA (if used) */
pia_reset(); pia_reset();
/* reset the VIA chip (if used) */
via_config(0, &via_interface);
via_set_clock(0, CLOCK_8MHz/4);
via_reset();
/* reset the ticket dispenser */ /* reset the ticket dispenser */
ticket_dispenser_init(machine, 200, TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW); ticket_dispenser_init(machine, 200, TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
@ -844,12 +846,12 @@ static READ8_HANDLER( sound_data_r )
* *
*************************************/ *************************************/
static void via_irq(running_machine *machine, int state) static void via_irq(const device_config *device, int state)
{ {
if (state) if (state)
cpu_set_input_line(machine->cpu[1], M6809_FIRQ_LINE, ASSERT_LINE); cpu_set_input_line(device->machine->cpu[1], M6809_FIRQ_LINE, ASSERT_LINE);
else else
cpu_set_input_line(machine->cpu[1], M6809_FIRQ_LINE, CLEAR_LINE); cpu_set_input_line(device->machine->cpu[1], M6809_FIRQ_LINE, CLEAR_LINE);
} }
@ -1026,7 +1028,7 @@ static ADDRESS_MAP_START( sound3812_external_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x2001, 0x2001) AM_WRITE(ym3812_write_port_0_w) AM_RANGE(0x2001, 0x2001) AM_WRITE(ym3812_write_port_0_w)
AM_RANGE(0x3000, 0x37ff) AM_RAM AM_RANGE(0x3000, 0x37ff) AM_RAM
AM_RANGE(0x4000, 0x4000) AM_READWRITE(okim6295_status_0_r, okim6295_data_0_w) AM_RANGE(0x4000, 0x4000) AM_READWRITE(okim6295_status_0_r, okim6295_data_0_w)
AM_RANGE(0x5000, 0x500f) AM_READWRITE(via_0_r, via_0_w) AM_RANGE(0x5000, 0x500f) AM_DEVREADWRITE(VIA6522, "via6522_0", via_r, via_w)
AM_RANGE(0x8000, 0xffff) AM_ROM AM_RANGE(0x8000, 0xffff) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -1765,6 +1767,9 @@ static MACHINE_DRIVER_START( itech8_core_lo )
/* sound hardware */ /* sound hardware */
MDRV_SPEAKER_STANDARD_MONO("mono") MDRV_SPEAKER_STANDARD_MONO("mono")
/* via */
MDRV_VIA6522_ADD("via6522_0", CLOCK_8MHz/4, via_interface)
MACHINE_DRIVER_END MACHINE_DRIVER_END

View File

@ -46,12 +46,12 @@ static READ8_HANDLER( trvquest_question_r )
return memory_region(space->machine, "questions")[*state->trvquest_question * 0x2000 + offset]; return memory_region(space->machine, "questions")[*state->trvquest_question * 0x2000 + offset];
} }
static WRITE8_HANDLER( trvquest_coin_w ) static WRITE8_DEVICE_HANDLER( trvquest_coin_w )
{ {
coin_counter_w(0,~data & 1); coin_counter_w(0,~data & 1);
} }
static WRITE8_HANDLER( trvquest_misc_w ) static WRITE8_DEVICE_HANDLER( trvquest_misc_w )
{ {
// data & 1 -> led on/off ? // data & 1 -> led on/off ?
} }
@ -59,9 +59,9 @@ static WRITE8_HANDLER( trvquest_misc_w )
static ADDRESS_MAP_START( cpu_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( cpu_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x1fff) AM_RAM AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size) // cmos ram AM_RANGE(0x0000, 0x1fff) AM_RAM AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size) // cmos ram
AM_RANGE(0x2000, 0x27ff) AM_RAM // main ram AM_RANGE(0x2000, 0x27ff) AM_RAM // main ram
AM_RANGE(0x3800, 0x380f) AM_READWRITE(via_1_r, via_1_w) AM_RANGE(0x3800, 0x380f) AM_DEVREADWRITE(VIA6522, "via6522_1", via_r, via_w)
AM_RANGE(0x3810, 0x381f) AM_READWRITE(via_2_r, via_2_w) AM_RANGE(0x3810, 0x381f) AM_DEVREADWRITE(VIA6522, "via6522_2", via_r, via_w)
AM_RANGE(0x3820, 0x382f) AM_READWRITE(via_0_r, via_0_w) AM_RANGE(0x3820, 0x382f) AM_DEVREADWRITE(VIA6522, "via6522_0", via_r, via_w)
AM_RANGE(0x3830, 0x3830) AM_WRITE(ay8910_control_port_0_w) AM_RANGE(0x3830, 0x3830) AM_WRITE(ay8910_control_port_0_w)
AM_RANGE(0x3831, 0x3831) AM_WRITE(ay8910_write_port_0_w) AM_RANGE(0x3831, 0x3831) AM_WRITE(ay8910_write_port_0_w)
AM_RANGE(0x3840, 0x3840) AM_WRITE(ay8910_control_port_1_w) AM_RANGE(0x3840, 0x3840) AM_WRITE(ay8910_control_port_1_w)
@ -152,20 +152,31 @@ static TIMER_CALLBACK( via_irq_delayed )
cpu_set_input_line(machine->cpu[0], 0, param); cpu_set_input_line(machine->cpu[0], 0, param);
} }
static void via_irq(running_machine *machine, int state) static void via_irq(const device_config *device, int state)
{ {
// from gameplan.c // from gameplan.c
/* Kaos sits in a tight loop polling the VIA irq flags register, but that register is /* Kaos sits in a tight loop polling the VIA irq flags register, but that register is
cleared by the irq handler. Therefore, I wait a bit before triggering the irq to cleared by the irq handler. Therefore, I wait a bit before triggering the irq to
leave time for the program to see the flag change. */ leave time for the program to see the flag change. */
timer_set(machine, ATTOTIME_IN_USEC(50), NULL, state, via_irq_delayed); timer_set(device->machine, ATTOTIME_IN_USEC(50), NULL, state, via_irq_delayed);
} }
static input_port_value input_port_read_indexed(running_machine *machine, int portnum)
{
const input_port_config *port = input_port_by_index(machine->portconfig, portnum);
return input_port_read_direct(port);
}
static READ8_DEVICE_HANDLER( via_input_port_0_r ) { return input_port_read_indexed(device->machine, 0); }
static READ8_DEVICE_HANDLER( via_input_port_1_r ) { return input_port_read_indexed(device->machine, 1); }
static READ8_DEVICE_HANDLER( via_input_port_2_r ) { return input_port_read_indexed(device->machine, 2); }
static READ8_DEVICE_HANDLER( via_input_port_3_r ) { return input_port_read_indexed(device->machine, 3); }
static const via6522_interface via_1_interface = static const via6522_interface via_1_interface =
{ {
/*inputs : A/B */ input_port_0_r, input_port_1_r, /*inputs : A/B */ via_input_port_0_r, via_input_port_1_r,
/*inputs : CA/B1,CA/B2 */ NULL, NULL, NULL, NULL, /*inputs : CA/B1,CA/B2 */ NULL, NULL, NULL, NULL,
/*outputs: A/B */ NULL, NULL, /*outputs: A/B */ NULL, NULL,
/*outputs: CA/B1,CA/B2 */ NULL, NULL, trvquest_coin_w, NULL, /*outputs: CA/B1,CA/B2 */ NULL, NULL, trvquest_coin_w, NULL,
@ -174,7 +185,7 @@ static const via6522_interface via_1_interface =
static const via6522_interface via_2_interface = static const via6522_interface via_2_interface =
{ {
/*inputs : A/B */ input_port_2_r, input_port_3_r, /*inputs : A/B */ via_input_port_2_r, via_input_port_3_r,
/*inputs : CA/B1,CA/B2 */ NULL, NULL, NULL, NULL, /*inputs : CA/B1,CA/B2 */ NULL, NULL, NULL, NULL,
/*outputs: A/B */ NULL, NULL, /*outputs: A/B */ NULL, NULL,
/*outputs: CA/B1,CA/B2 */ NULL, NULL, trvquest_misc_w, NULL, /*outputs: CA/B1,CA/B2 */ NULL, NULL, trvquest_misc_w, NULL,
@ -184,20 +195,17 @@ static const via6522_interface via_2_interface =
static MACHINE_START( trvquest ) static MACHINE_START( trvquest )
{ {
via_config(1, &via_1_interface);
via_config(2, &via_2_interface);
} }
static MACHINE_RESET( trvquest ) static MACHINE_RESET( trvquest )
{ {
via_reset();
} }
static INTERRUPT_GEN( trvquest_interrupt ) static INTERRUPT_GEN( trvquest_interrupt )
{ {
const address_space *space = cpu_get_address_space(device, ADDRESS_SPACE_PROGRAM); const device_config *via_2 = device_list_find_by_tag(device->machine->config->devicelist, VIA6522, "via6522_2");
via_2_ca1_w(space,0,1); via_ca1_w(via_2, 0, 1);
via_2_ca1_w(space,0,0); via_ca1_w(via_2, 0, 0);
} }
static MACHINE_DRIVER_START( trvquest ) static MACHINE_DRIVER_START( trvquest )
@ -223,6 +231,11 @@ static MACHINE_DRIVER_START( trvquest )
MDRV_SOUND_ADD("ay2", AY8910, XTAL_6MHz/2) MDRV_SOUND_ADD("ay2", AY8910, XTAL_6MHz/2)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
/* via */
MDRV_VIA6522_ADD("via6522_0", 0, trvquest_via_0_interface)
MDRV_VIA6522_ADD("via6522_1", 0, via_1_interface)
MDRV_VIA6522_ADD("via6522_2", 0, via_2_interface)
MACHINE_DRIVER_END MACHINE_DRIVER_END
ROM_START( trvquest ) ROM_START( trvquest )

View File

@ -1,5 +1,8 @@
/*----------- defined in machine/beezer.c -----------*/ /*----------- defined in machine/beezer.c -----------*/
extern const via6522_interface b_via_0_interface;
extern const via6522_interface b_via_1_interface;
DRIVER_INIT( beezer ); DRIVER_INIT( beezer );
WRITE8_HANDLER( beezer_bankswitch_w ); WRITE8_HANDLER( beezer_bankswitch_w );

View File

@ -6,6 +6,7 @@ driver by Chris Moore
***************************************************************************/ ***************************************************************************/
#include "machine/6522via.h"
#define GAMEPLAN_MAIN_MASTER_CLOCK (XTAL_3_579545MHz) #define GAMEPLAN_MAIN_MASTER_CLOCK (XTAL_3_579545MHz)
#define GAMEPLAN_AUDIO_MASTER_CLOCK (XTAL_3_579545MHz) #define GAMEPLAN_AUDIO_MASTER_CLOCK (XTAL_3_579545MHz)
@ -36,6 +37,10 @@ struct _gameplan_state
/*----------- defined in video/gameplan.c -----------*/ /*----------- defined in video/gameplan.c -----------*/
extern const via6522_interface gameplan_via_0_interface;
extern const via6522_interface leprechn_via_0_interface;
extern const via6522_interface trvquest_via_0_interface;
MACHINE_DRIVER_EXTERN( gameplan_video ); MACHINE_DRIVER_EXTERN( gameplan_video );
MACHINE_DRIVER_EXTERN( leprechn_video ); MACHINE_DRIVER_EXTERN( leprechn_video );
MACHINE_DRIVER_EXTERN( trvquest_video ); MACHINE_DRIVER_EXTERN( trvquest_video );

View File

@ -5,20 +5,56 @@
static int pbus; static int pbus;
static READ8_HANDLER( b_via_0_pb_r ); static READ8_DEVICE_HANDLER( b_via_0_pb_r );
static WRITE8_HANDLER( b_via_0_pa_w ); static WRITE8_DEVICE_HANDLER( b_via_0_pa_w );
static WRITE8_HANDLER( b_via_0_pb_w ); static WRITE8_DEVICE_HANDLER( b_via_0_pb_w );
static READ8_HANDLER( b_via_0_ca2_r ); static READ8_DEVICE_HANDLER( b_via_0_ca2_r );
static WRITE8_HANDLER( b_via_0_ca2_w ); static WRITE8_DEVICE_HANDLER( b_via_0_ca2_w );
static void b_via_0_irq (running_machine *machine, int level); static void b_via_0_irq (const device_config *device, int level);
static READ8_HANDLER( b_via_1_pa_r ); static READ8_DEVICE_HANDLER( b_via_1_pa_r );
static READ8_HANDLER( b_via_1_pb_r ); static READ8_DEVICE_HANDLER( b_via_1_pb_r );
static WRITE8_HANDLER( b_via_1_pa_w ); static WRITE8_DEVICE_HANDLER( b_via_1_pa_w );
static WRITE8_HANDLER( b_via_1_pb_w ); static WRITE8_DEVICE_HANDLER( b_via_1_pb_w );
static void b_via_1_irq (running_machine *machine, int level); static void b_via_1_irq (const device_config *device, int level);
static const via6522_interface b_via_0_interface = static READ8_DEVICE_HANDLER( via_0_cb1_r )
{
const device_config *via_0 = device_list_find_by_tag(device->machine->config->devicelist, VIA6522, "via6522_0");
return via_cb1_r(via_0, offset);
}
static WRITE8_DEVICE_HANDLER( via_0_cb1_w )
{
const device_config *via_0 = device_list_find_by_tag(device->machine->config->devicelist, VIA6522, "via6522_0");
via_cb1_w(via_0, offset, data);
}
static READ8_DEVICE_HANDLER( via_0_cb2_r )
{
const device_config *via_0 = device_list_find_by_tag(device->machine->config->devicelist, VIA6522, "via6522_0");
return via_cb2_r(via_0, offset);
}
static READ8_DEVICE_HANDLER( via_1_ca1_r )
{
const device_config *via_1 = device_list_find_by_tag(device->machine->config->devicelist, VIA6522, "via6522_1");
return via_ca1_r(via_1, offset);
}
static WRITE8_DEVICE_HANDLER( via_1_ca1_w )
{
const device_config *via_1 = device_list_find_by_tag(device->machine->config->devicelist, VIA6522, "via6522_1");
via_ca1_w(via_1, offset, data);
}
static READ8_DEVICE_HANDLER( via_1_ca2_r )
{
const device_config *via_1 = device_list_find_by_tag(device->machine->config->devicelist, VIA6522, "via6522_1");
return via_ca2_r(via_1, offset);
}
const via6522_interface b_via_0_interface =
{ {
/*inputs : A/B */ 0, b_via_0_pb_r, /*inputs : A/B */ 0, b_via_0_pb_r,
/*inputs : CA/B1,CA/B2 */ 0, via_1_ca2_r, b_via_0_ca2_r, via_1_ca1_r, /*inputs : CA/B1,CA/B2 */ 0, via_1_ca2_r, b_via_0_ca2_r, via_1_ca1_r,
@ -27,7 +63,7 @@ static const via6522_interface b_via_0_interface =
/*irq */ b_via_0_irq /*irq */ b_via_0_irq
}; };
static const via6522_interface b_via_1_interface = const via6522_interface b_via_1_interface =
{ {
/*inputs : A/B */ b_via_1_pa_r, b_via_1_pb_r, /*inputs : A/B */ b_via_1_pa_r, b_via_1_pb_r,
/*inputs : CA/B1,CA/B2 */ via_0_cb2_r, 0, via_0_cb1_r, 0, /*inputs : CA/B1,CA/B2 */ via_0_cb2_r, 0, via_0_cb1_r, 0,
@ -36,44 +72,44 @@ static const via6522_interface b_via_1_interface =
/*irq */ b_via_1_irq /*irq */ b_via_1_irq
}; };
static READ8_HANDLER( b_via_0_ca2_r ) static READ8_DEVICE_HANDLER( b_via_0_ca2_r )
{ {
return 0; return 0;
} }
static WRITE8_HANDLER( b_via_0_ca2_w ) static WRITE8_DEVICE_HANDLER( b_via_0_ca2_w )
{ {
} }
static void b_via_0_irq (running_machine *machine, int level) static void b_via_0_irq (const device_config *device, int level)
{ {
cpu_set_input_line(machine->cpu[0], M6809_IRQ_LINE, level); cpu_set_input_line(device->machine->cpu[0], M6809_IRQ_LINE, level);
} }
static READ8_HANDLER( b_via_0_pb_r ) static READ8_DEVICE_HANDLER( b_via_0_pb_r )
{ {
return pbus; return pbus;
} }
static WRITE8_HANDLER( b_via_0_pa_w ) static WRITE8_DEVICE_HANDLER( b_via_0_pa_w )
{ {
if ((data & 0x08) == 0) if ((data & 0x08) == 0)
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_RESET, ASSERT_LINE); cpu_set_input_line(device->machine->cpu[1], INPUT_LINE_RESET, ASSERT_LINE);
else else
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_RESET, CLEAR_LINE); cpu_set_input_line(device->machine->cpu[1], INPUT_LINE_RESET, CLEAR_LINE);
if ((data & 0x04) == 0) if ((data & 0x04) == 0)
{ {
switch (data & 0x03) switch (data & 0x03)
{ {
case 0: case 0:
pbus = input_port_read(space->machine, "IN0"); pbus = input_port_read(device->machine, "IN0");
break; break;
case 1: case 1:
pbus = input_port_read(space->machine, "IN1") | (input_port_read(space->machine, "IN2") << 4); pbus = input_port_read(device->machine, "IN1") | (input_port_read(device->machine, "IN2") << 4);
break; break;
case 2: case 2:
pbus = input_port_read(space->machine, "DSWB"); pbus = input_port_read(device->machine, "DSWB");
break; break;
case 3: case 3:
pbus = 0xff; pbus = 0xff;
@ -82,40 +118,37 @@ static WRITE8_HANDLER( b_via_0_pa_w )
} }
} }
static WRITE8_HANDLER( b_via_0_pb_w ) static WRITE8_DEVICE_HANDLER( b_via_0_pb_w )
{ {
pbus = data; pbus = data;
} }
static void b_via_1_irq (running_machine *machine, int level) static void b_via_1_irq (const device_config *device, int level)
{ {
cpu_set_input_line(machine->cpu[1], M6809_IRQ_LINE, level); cpu_set_input_line(device->machine->cpu[1], M6809_IRQ_LINE, level);
} }
static READ8_HANDLER( b_via_1_pa_r ) static READ8_DEVICE_HANDLER( b_via_1_pa_r )
{ {
return pbus; return pbus;
} }
static READ8_HANDLER( b_via_1_pb_r ) static READ8_DEVICE_HANDLER( b_via_1_pb_r )
{ {
return 0xff; return 0xff;
} }
static WRITE8_HANDLER( b_via_1_pa_w ) static WRITE8_DEVICE_HANDLER( b_via_1_pa_w )
{ {
pbus = data; pbus = data;
} }
static WRITE8_HANDLER( b_via_1_pb_w ) static WRITE8_DEVICE_HANDLER( b_via_1_pb_w )
{ {
} }
DRIVER_INIT( beezer ) DRIVER_INIT( beezer )
{ {
via_config(0, &b_via_0_interface);
via_config(1, &b_via_1_interface);
via_reset();
pbus = 0; pbus = 0;
} }
@ -123,10 +156,11 @@ WRITE8_HANDLER( beezer_bankswitch_w )
{ {
if ((data & 0x07) == 0) if ((data & 0x07) == 0)
{ {
const device_config *via_0 = device_list_find_by_tag(space->machine->config->devicelist, VIA6522, "via6522_0");
memory_install_write8_handler(space, 0xc600, 0xc7ff, 0, 0, watchdog_reset_w); memory_install_write8_handler(space, 0xc600, 0xc7ff, 0, 0, watchdog_reset_w);
memory_install_write8_handler(space, 0xc800, 0xc9ff, 0, 0, beezer_map_w); memory_install_write8_handler(space, 0xc800, 0xc9ff, 0, 0, beezer_map_w);
memory_install_read8_handler(space, 0xca00, 0xcbff, 0, 0, beezer_line_r); memory_install_read8_handler(space, 0xca00, 0xcbff, 0, 0, beezer_line_r);
memory_install_readwrite8_handler(space, 0xce00, 0xcfff, 0, 0, via_0_r, via_0_w); memory_install_readwrite8_device_handler(space, via_0, 0xce00, 0xcfff, 0, 0, via_r, via_w);
} }
else else
{ {

View File

@ -7,10 +7,10 @@ static int scanline=0;
INTERRUPT_GEN( beezer_interrupt ) INTERRUPT_GEN( beezer_interrupt )
{ {
const address_space *space = cpu_get_address_space(device->machine->cpu[0], ADDRESS_SPACE_PROGRAM); const device_config *via_0 = device_list_find_by_tag(device->machine->config->devicelist, VIA6522, "via6522_0");
scanline = (scanline + 1) % 0x80; scanline = (scanline + 1) % 0x80;
via_0_ca2_w (space, 0, scanline & 0x10); via_ca2_w (via_0, 0, scanline & 0x10);
if ((scanline & 0x78) == 0x78) if ((scanline & 0x78) == 0x78)
cpu_set_input_line(device, M6809_FIRQ_LINE, ASSERT_LINE); cpu_set_input_line(device, M6809_FIRQ_LINE, ASSERT_LINE);
else else

View File

@ -116,25 +116,25 @@ static VIDEO_UPDATE( leprechn )
* *
*************************************/ *************************************/
static WRITE8_HANDLER( video_data_w ) static WRITE8_DEVICE_HANDLER( video_data_w )
{ {
gameplan_state *state = space->machine->driver_data; gameplan_state *state = device->machine->driver_data;
state->video_data = data; state->video_data = data;
} }
static WRITE8_HANDLER( gameplan_video_command_w ) static WRITE8_DEVICE_HANDLER( gameplan_video_command_w )
{ {
gameplan_state *state = space->machine->driver_data; gameplan_state *state = device->machine->driver_data;
state->video_command = data & 0x07; state->video_command = data & 0x07;
} }
static WRITE8_HANDLER( leprechn_video_command_w ) static WRITE8_DEVICE_HANDLER( leprechn_video_command_w )
{ {
gameplan_state *state = space->machine->driver_data; gameplan_state *state = device->machine->driver_data;
state->video_command = (data >> 3) & 0x07; state->video_command = (data >> 3) & 0x07;
} }
@ -142,16 +142,16 @@ static WRITE8_HANDLER( leprechn_video_command_w )
static TIMER_CALLBACK( clear_screen_done_callback ) static TIMER_CALLBACK( clear_screen_done_callback )
{ {
const address_space *space = cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM); const device_config *via = device_list_find_by_tag(machine->config->devicelist, VIA6522, "via6522_0");
/* indicate that the we are done clearing the screen */ /* indicate that the we are done clearing the screen */
via_0_ca1_w(space, 0, 0); via_ca1_w(via, 0, 0);
} }
static WRITE8_HANDLER( video_command_trigger_w ) static WRITE8_DEVICE_HANDLER( video_command_trigger_w )
{ {
gameplan_state *state = space->machine->driver_data; gameplan_state *state = device->machine->driver_data;
if (data == 0) if (data == 0)
{ {
@ -194,14 +194,17 @@ static WRITE8_HANDLER( video_command_trigger_w )
/* clear screen */ /* clear screen */
case 3: case 3:
/* indicate that the we are busy */ /* indicate that the we are busy */
via_0_ca1_w(space, 0, 1); {
const device_config *via = device_list_find_by_tag(device->machine->config->devicelist, VIA6522, "via6522_0");
via_ca1_w(via, 0, 1);
}
memset(state->videoram, state->video_data & 0x0f, state->videoram_size); memset(state->videoram, state->video_data & 0x0f, state->videoram_size);
/* set a timer for an arbitrarily short period. /* set a timer for an arbitrarily short period.
The real time it takes to clear to screen is not The real time it takes to clear to screen is not
important to the software */ important to the software */
timer_call_after_resynch(space->machine, NULL, 0, clear_screen_done_callback); timer_call_after_resynch(device->machine, NULL, 0, clear_screen_done_callback);
break; break;
} }
@ -215,23 +218,23 @@ static TIMER_CALLBACK( via_irq_delayed )
} }
static void via_irq(running_machine *machine, int state) static void via_irq(const device_config *device, int state)
{ {
/* Kaos sits in a tight loop polling the VIA irq flags register, but that register is /* Kaos sits in a tight loop polling the VIA irq flags register, but that register is
cleared by the irq handler. Therefore, I wait a bit before triggering the irq to cleared by the irq handler. Therefore, I wait a bit before triggering the irq to
leave time for the program to see the flag change. */ leave time for the program to see the flag change. */
timer_set(machine, ATTOTIME_IN_USEC(50), NULL, state, via_irq_delayed); timer_set(device->machine, ATTOTIME_IN_USEC(50), NULL, state, via_irq_delayed);
} }
static READ8_HANDLER( vblank_r ) static READ8_DEVICE_HANDLER( vblank_r )
{ {
/* this is needed for trivia quest */ /* this is needed for trivia quest */
return 0x20; return 0x20;
} }
static const via6522_interface gameplan_via_0_interface = const via6522_interface gameplan_via_0_interface =
{ {
0, vblank_r, /*inputs : A/B */ 0, vblank_r, /*inputs : A/B */
0, 0, 0, 0, /*inputs : CA/B1,CA/B2 */ 0, 0, 0, 0, /*inputs : CA/B1,CA/B2 */
@ -241,7 +244,7 @@ static const via6522_interface gameplan_via_0_interface =
}; };
static const via6522_interface leprechn_via_0_interface = const via6522_interface leprechn_via_0_interface =
{ {
0, vblank_r, /*inputs : A/B */ 0, vblank_r, /*inputs : A/B */
0, 0, 0, 0, /*inputs : CA/B1,CA/B2 */ 0, 0, 0, 0, /*inputs : CA/B1,CA/B2 */
@ -251,7 +254,7 @@ static const via6522_interface leprechn_via_0_interface =
}; };
static const via6522_interface trvquest_via_0_interface = const via6522_interface trvquest_via_0_interface =
{ {
0, vblank_r, /*inputs : A/B */ 0, vblank_r, /*inputs : A/B */
0, 0, 0, 0, /*inputs : CA/B1,CA/B2 */ 0, 0, 0, 0, /*inputs : CA/B1,CA/B2 */
@ -264,10 +267,10 @@ static const via6522_interface trvquest_via_0_interface =
static TIMER_CALLBACK( via_0_ca1_timer_callback ) static TIMER_CALLBACK( via_0_ca1_timer_callback )
{ {
gameplan_state *state = machine->driver_data; gameplan_state *state = machine->driver_data;
const address_space *space = cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM); const device_config *via = device_list_find_by_tag(machine->config->devicelist, VIA6522, "via6522_0");
/* !VBLANK is connected to CA1 */ /* !VBLANK is connected to CA1 */
via_0_ca1_w(space, 0, (UINT8)param); via_ca1_w(via, 0, (UINT8)param);
if (param) if (param)
timer_adjust_oneshot(state->via_0_ca1_timer, video_screen_get_time_until_pos(machine->primary_screen, VBSTART, 0), 0); timer_adjust_oneshot(state->via_0_ca1_timer, video_screen_get_time_until_pos(machine->primary_screen, VBSTART, 0), 0);
@ -315,24 +318,18 @@ static VIDEO_START( common )
static VIDEO_START( gameplan ) static VIDEO_START( gameplan )
{ {
via_config(0, &gameplan_via_0_interface);
VIDEO_START_CALL(common); VIDEO_START_CALL(common);
} }
static VIDEO_START( leprechn ) static VIDEO_START( leprechn )
{ {
via_config(0, &leprechn_via_0_interface);
VIDEO_START_CALL(common); VIDEO_START_CALL(common);
} }
static VIDEO_START( trvquest ) static VIDEO_START( trvquest )
{ {
via_config(0, &trvquest_via_0_interface);
VIDEO_START_CALL(common); VIDEO_START_CALL(common);
} }
@ -346,7 +343,6 @@ static VIDEO_START( trvquest )
static VIDEO_RESET( gameplan ) static VIDEO_RESET( gameplan )
{ {
via_reset();
start_via_0_timer(machine, machine->driver_data); start_via_0_timer(machine, machine->driver_data);
} }