converted tait8741 mcu hack to a device, kept it as 4 pack since driver anyway have to use real mcu in future (nw)

This commit is contained in:
Miodrag Milanovic 2014-04-01 08:08:59 +00:00
parent 1770428c40
commit 09802006a1
6 changed files with 350 additions and 273 deletions

View File

@ -200,60 +200,51 @@ WRITE8_MEMBER(gladiatr_state::gladiatr_bankswitch_w)
} }
static READ8_HANDLER( gladiator_dsw1_r ) READ8_MEMBER(gladiatr_state::gladiator_dsw1_r )
{ {
int orig = space.machine().root_device().ioport("DSW1")->read()^0xff; int orig = ioport("DSW1")->read()^0xff;
return BITSWAP8(orig, 0,1,2,3,4,5,6,7); return BITSWAP8(orig, 0,1,2,3,4,5,6,7);
} }
static READ8_HANDLER( gladiator_dsw2_r ) READ8_MEMBER(gladiatr_state::gladiator_dsw2_r )
{ {
int orig = space.machine().root_device().ioport("DSW2")->read()^0xff; int orig = ioport("DSW2")->read()^0xff;
return BITSWAP8(orig, 2,3,4,5,6,7,1,0); return BITSWAP8(orig, 2,3,4,5,6,7,1,0);
} }
static READ8_HANDLER( gladiator_controls_r ) READ8_MEMBER(gladiatr_state::gladiator_controls_r )
{ {
int coins = 0; int coins = 0;
if( space.machine().root_device().ioport("COINS")->read() & 0xc0 ) coins = 0x80; if(ioport("COINS")->read() & 0xc0 ) coins = 0x80;
switch(offset) switch(offset)
{ {
case 0x01: /* start button , coins */ case 0x01: /* start button , coins */
return space.machine().root_device().ioport("IN0")->read() | coins; return ioport("IN0")->read() | coins;
case 0x02: /* Player 1 Controller , coins */ case 0x02: /* Player 1 Controller , coins */
return space.machine().root_device().ioport("IN1")->read() | coins; return ioport("IN1")->read() | coins;
case 0x04: /* Player 2 Controller , coins */ case 0x04: /* Player 2 Controller , coins */
return space.machine().root_device().ioport("IN2")->read() | coins; return ioport("IN2")->read() | coins;
} }
/* unknown */ /* unknown */
return 0; return 0;
} }
static READ8_HANDLER( gladiator_button3_r ) READ8_MEMBER(gladiatr_state::gladiator_button3_r )
{ {
switch(offset) switch(offset)
{ {
case 0x01: /* button 3 */ case 0x01: /* button 3 */
return space.machine().root_device().ioport("IN3")->read(); return ioport("IN3")->read();
} }
/* unknown */ /* unknown */
return 0; return 0;
} }
static const struct TAITO8741interface gladiator_8741interface=
{
4, /* 4 chips */
{TAITO8741_MASTER,TAITO8741_SLAVE,TAITO8741_PORT,TAITO8741_PORT},/* program mode */
{1,0,0,0}, /* serial port connection */
{gladiator_dsw1_r,gladiator_dsw2_r,gladiator_button3_r,gladiator_controls_r} /* port handler */
};
MACHINE_RESET_MEMBER(gladiatr_state,gladiator) MACHINE_RESET_MEMBER(gladiatr_state,gladiator)
{ {
TAITO8741_start(&gladiator_8741interface);
/* 6809 bank memory set */ /* 6809 bank memory set */
{ {
UINT8 *rom = memregion("audiocpu")->base() + 0x10000; UINT8 *rom = memregion("audiocpu")->base() + 0x10000;
@ -437,17 +428,17 @@ static ADDRESS_MAP_START( gladiatr_cpu1_io, AS_IO, 8, gladiatr_state )
AM_RANGE(0xc002, 0xc002) AM_WRITE(gladiatr_bankswitch_w) AM_RANGE(0xc002, 0xc002) AM_WRITE(gladiatr_bankswitch_w)
AM_RANGE(0xc004, 0xc004) AM_WRITE(gladiatr_irq_patch_w) /* !!! patch to 2nd CPU IRQ !!! */ AM_RANGE(0xc004, 0xc004) AM_WRITE(gladiatr_irq_patch_w) /* !!! patch to 2nd CPU IRQ !!! */
AM_RANGE(0xc007, 0xc007) AM_WRITE(gladiatr_flipscreen_w) AM_RANGE(0xc007, 0xc007) AM_WRITE(gladiatr_flipscreen_w)
AM_RANGE(0xc09e, 0xc09f) AM_READWRITE_LEGACY(TAITO8741_0_r, TAITO8741_0_w) AM_RANGE(0xc09e, 0xc09f) AM_DEVREADWRITE("taito8741", taito8741_4pack_device, read_0, write_0)
AM_RANGE(0xc0bf, 0xc0bf) AM_NOP // watchdog_reset_w doesn't work AM_RANGE(0xc0bf, 0xc0bf) AM_NOP // watchdog_reset_w doesn't work
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( gladiatr_cpu2_io, AS_IO, 8, gladiatr_state ) static ADDRESS_MAP_START( gladiatr_cpu2_io, AS_IO, 8, gladiatr_state )
ADDRESS_MAP_GLOBAL_MASK(0xff) ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write) AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write)
AM_RANGE(0x20, 0x21) AM_READWRITE_LEGACY(TAITO8741_1_r, TAITO8741_1_w) AM_RANGE(0x20, 0x21) AM_DEVREADWRITE("taito8741", taito8741_4pack_device, read_1, write_1)
AM_RANGE(0x40, 0x40) AM_NOP // WRITE(sub_irq_ack_w) AM_RANGE(0x40, 0x40) AM_NOP // WRITE(sub_irq_ack_w)
AM_RANGE(0x60, 0x61) AM_READWRITE_LEGACY(TAITO8741_2_r, TAITO8741_2_w) AM_RANGE(0x60, 0x61) AM_DEVREADWRITE("taito8741", taito8741_4pack_device, read_2, write_2)
AM_RANGE(0x80, 0x81) AM_READWRITE_LEGACY(TAITO8741_3_r, TAITO8741_3_w) AM_RANGE(0x80, 0x81) AM_DEVREADWRITE("taito8741", taito8741_4pack_device, read_3, write_3)
AM_RANGE(0xa0, 0xa7) AM_NOP // filters on sound output AM_RANGE(0xa0, 0xa7) AM_NOP // filters on sound output
AM_RANGE(0xe0, 0xe0) AM_WRITE(glad_cpu_sound_command_w) AM_RANGE(0xe0, 0xe0) AM_WRITE(glad_cpu_sound_command_w)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -716,6 +707,11 @@ static MACHINE_CONFIG_START( gladiatr, gladiatr_state )
MCFG_MACHINE_RESET_OVERRIDE(gladiatr_state,gladiator) MCFG_MACHINE_RESET_OVERRIDE(gladiatr_state,gladiator)
MCFG_NVRAM_ADD_0FILL("nvram") MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_TAITO8741_ADD("taito8741")
MCFG_TAITO8741_MODES(TAITO8741_MASTER,TAITO8741_SLAVE,TAITO8741_PORT,TAITO8741_PORT)
MCFG_TAITO8741_CONNECT(1,0,0,0)
MCFG_TAITO8741_PORT_HANDLERS(READ8(gladiatr_state,gladiator_dsw1_r),READ8(gladiatr_state,gladiator_dsw2_r),READ8(gladiatr_state,gladiator_button3_r),READ8(gladiatr_state,gladiator_controls_r))
/* video hardware */ /* video hardware */
MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_REFRESH_RATE(60)

View File

@ -150,7 +150,7 @@ reg: 0->1 (main->2nd) / : (1->0) 2nd->main :
#if 0 #if 0
int ::gsword_coins_in(void) int gsword_state::gsword_coins_in(void)
{ {
/* emulate 8741 coin slot */ /* emulate 8741 coin slot */
if (ioport("IN4")->read() & 0xc0) if (ioport("IN4")->read() & 0xc0)
@ -186,16 +186,16 @@ READ8_MEMBER(gsword_state::gsword_hack_r)
return data; return data;
} }
static READ8_HANDLER( gsword_8741_2_r ) READ8_MEMBER(gsword_state::gsword_8741_2_r )
{ {
switch (offset) switch (offset)
{ {
case 0x01: /* start button , coins */ case 0x01: /* start button , coins */
return space.machine().root_device().ioport("IN0")->read(); return ioport("IN0")->read();
case 0x02: /* Player 1 Controller */ case 0x02: /* Player 1 Controller */
return space.machine().root_device().ioport("IN1")->read(); return ioport("IN1")->read();
case 0x04: /* Player 2 Controller */ case 0x04: /* Player 2 Controller */
return space.machine().root_device().ioport("IN3")->read(); return ioport("IN3")->read();
// default: // default:
// logerror("8741-2 unknown read %d PC=%04x\n",offset,space.device().safe_pc()); // logerror("8741-2 unknown read %d PC=%04x\n",offset,space.device().safe_pc());
} }
@ -203,48 +203,33 @@ static READ8_HANDLER( gsword_8741_2_r )
return 0; return 0;
} }
static READ8_HANDLER( gsword_8741_3_r ) READ8_MEMBER(gsword_state::gsword_8741_3_r )
{ {
switch (offset) switch (offset)
{ {
case 0x01: /* start button */ case 0x01: /* start button */
return space.machine().root_device().ioport("IN2")->read(); return ioport("IN2")->read();
case 0x02: /* Player 1 Controller? */ case 0x02: /* Player 1 Controller? */
return space.machine().root_device().ioport("IN1")->read(); return ioport("IN1")->read();
case 0x04: /* Player 2 Controller? */ case 0x04: /* Player 2 Controller? */
return space.machine().root_device().ioport("IN3")->read(); return ioport("IN3")->read();
} }
/* unknown */ /* unknown */
// logerror("8741-3 unknown read %d PC=%04x\n",offset,space.device().safe_pc()); // logerror("8741-3 unknown read %d PC=%04x\n",offset,space.device().safe_pc());
return 0; return 0;
} }
static const struct TAITO8741interface gsword_8741interface=
{
4, /* 4 chips */
{ TAITO8741_MASTER,TAITO8741_SLAVE,TAITO8741_PORT,TAITO8741_PORT }, /* program mode */
{ 1,0,0,0 }, /* serial port connection */
{ NULL,NULL,gsword_8741_2_r,gsword_8741_3_r }, /* port handler */
{ "DSW2","DSW1",NULL,NULL }
};
MACHINE_RESET_MEMBER(gsword_state,gsword) MACHINE_RESET_MEMBER(gsword_state,gsword)
{ {
int i;
for(i=0;i<4;i++) TAITO8741_reset(i);
m_coins = 0; m_coins = 0;
/* snd CPU mask NMI during reset phase */ /* snd CPU mask NMI during reset phase */
m_nmi_enable = 0; m_nmi_enable = 0;
m_protect_hack = 0; m_protect_hack = 0;
TAITO8741_start(&gsword_8741interface);
} }
MACHINE_RESET_MEMBER(gsword_state,josvolly) MACHINE_RESET_MEMBER(gsword_state,josvolly)
{ {
josvolly_8741_reset();
} }
INTERRUPT_GEN_MEMBER(gsword_state::gsword_snd_interrupt) INTERRUPT_GEN_MEMBER(gsword_state::gsword_snd_interrupt)
@ -339,12 +324,12 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( cpu1_io_map, AS_IO, 8, gsword_state ) static ADDRESS_MAP_START( cpu1_io_map, AS_IO, 8, gsword_state )
ADDRESS_MAP_GLOBAL_MASK(0xff) ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x7e, 0x7f) AM_WRITE_LEGACY(TAITO8741_0_w) AM_READ_LEGACY(TAITO8741_0_r) AM_RANGE(0x7e, 0x7f) AM_DEVREADWRITE("taito8741", taito8741_4pack_device, read_0, write_0)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( josvolly_cpu1_io_map, AS_IO, 8, gsword_state ) static ADDRESS_MAP_START( josvolly_cpu1_io_map, AS_IO, 8, gsword_state )
ADDRESS_MAP_GLOBAL_MASK(0xff) ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x7e, 0x7f) AM_WRITE_LEGACY(josvolly_8741_0_w) AM_READ_LEGACY(josvolly_8741_0_r) AM_RANGE(0x7e, 0x7f) AM_DEVREADWRITE("josvolly_8741", josvolly8741_4pack_device, read_0, write_0)
ADDRESS_MAP_END ADDRESS_MAP_END
// //
@ -356,9 +341,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( cpu2_io_map, AS_IO, 8, gsword_state ) static ADDRESS_MAP_START( cpu2_io_map, AS_IO, 8, gsword_state )
ADDRESS_MAP_GLOBAL_MASK(0xff) ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x01) AM_READWRITE_LEGACY(TAITO8741_2_r,TAITO8741_2_w) AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("taito8741", taito8741_4pack_device, read_2, write_2)
AM_RANGE(0x20, 0x21) AM_READWRITE_LEGACY(TAITO8741_3_r,TAITO8741_3_w) AM_RANGE(0x20, 0x21) AM_DEVREADWRITE("taito8741", taito8741_4pack_device, read_3, write_3)
AM_RANGE(0x40, 0x41) AM_READWRITE_LEGACY(TAITO8741_1_r,TAITO8741_1_w) AM_RANGE(0x40, 0x41) AM_DEVREADWRITE("taito8741", taito8741_4pack_device, read_1, write_1)
AM_RANGE(0x60, 0x60) AM_READWRITE(gsword_fake_0_r, gsword_AY8910_control_port_0_w) AM_RANGE(0x60, 0x60) AM_READWRITE(gsword_fake_0_r, gsword_AY8910_control_port_0_w)
AM_RANGE(0x61, 0x61) AM_DEVREADWRITE("ay1", ay8910_device, data_r, data_w) AM_RANGE(0x61, 0x61) AM_DEVREADWRITE("ay1", ay8910_device, data_r, data_w)
AM_RANGE(0x80, 0x80) AM_READWRITE(gsword_fake_1_r, gsword_AY8910_control_port_1_w) AM_RANGE(0x80, 0x80) AM_READWRITE(gsword_fake_1_r, gsword_AY8910_control_port_1_w)
@ -388,7 +373,7 @@ static ADDRESS_MAP_START( josvolly_cpu2_map, AS_PROGRAM, 8, gsword_state )
AM_RANGE(0x8002, 0x8002) AM_READ_PORT("IN0") // START AM_RANGE(0x8002, 0x8002) AM_READ_PORT("IN0") // START
// AM_RANGE(0x6000, 0x6000) AM_WRITE(adpcm_soundcommand_w) // AM_RANGE(0x6000, 0x6000) AM_WRITE(adpcm_soundcommand_w)
AM_RANGE(0xA000, 0xA001) AM_WRITE_LEGACY(josvolly_8741_1_w) AM_READ_LEGACY(josvolly_8741_1_r) AM_RANGE(0xA000, 0xA001) AM_DEVREADWRITE("josvolly_8741", josvolly8741_4pack_device, read_1, write_1)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( josvolly_cpu2_io_map, AS_IO, 8, gsword_state ) static ADDRESS_MAP_START( josvolly_cpu2_io_map, AS_IO, 8, gsword_state )
@ -398,7 +383,7 @@ static ADDRESS_MAP_START( josvolly_cpu2_io_map, AS_IO, 8, gsword_state )
AM_RANGE(0x40, 0x40) AM_READWRITE(gsword_fake_1_r, gsword_AY8910_control_port_1_w) AM_RANGE(0x40, 0x40) AM_READWRITE(gsword_fake_1_r, gsword_AY8910_control_port_1_w)
AM_RANGE(0x41, 0x41) AM_DEVREADWRITE("ay2", ay8910_device, data_r, data_w) AM_RANGE(0x41, 0x41) AM_DEVREADWRITE("ay2", ay8910_device, data_r, data_w)
AM_RANGE(0x81, 0x81) AM_WRITE_LEGACY(josvolly_nmi_enable_w) AM_RANGE(0x81, 0x81) AM_DEVWRITE("josvolly_8741", josvolly8741_4pack_device, nmi_enable_w)
AM_RANGE(0xC1, 0xC1) AM_NOP // irq clear AM_RANGE(0xC1, 0xC1) AM_NOP // irq clear
ADDRESS_MAP_END ADDRESS_MAP_END
@ -666,6 +651,10 @@ static MACHINE_CONFIG_START( gsword, gsword_state )
MCFG_MACHINE_RESET_OVERRIDE(gsword_state,gsword) MCFG_MACHINE_RESET_OVERRIDE(gsword_state,gsword)
MCFG_TAITO8741_ADD("taito8741")
MCFG_TAITO8741_MODES(TAITO8741_MASTER,TAITO8741_SLAVE,TAITO8741_PORT,TAITO8741_PORT)
MCFG_TAITO8741_CONNECT(1,0,0,0)
MCFG_TAITO8741_PORT_HANDLERS(IOPORT("DSW2"),IOPORT("DSW1"),READ8(gsword_state,gsword_8741_2_r),READ8(gsword_state,gsword_8741_3_r))
#if 1 #if 1
/* to MCU timeout champbbj */ /* to MCU timeout champbbj */
MCFG_QUANTUM_TIME(attotime::from_hz(6000)) MCFG_QUANTUM_TIME(attotime::from_hz(6000))
@ -715,6 +704,11 @@ static MACHINE_CONFIG_START( josvolly, gsword_state )
MCFG_MACHINE_RESET_OVERRIDE(gsword_state,josvolly) MCFG_MACHINE_RESET_OVERRIDE(gsword_state,josvolly)
MCFG_JOSVOLLY8741_ADD("josvolly_8741")
MCFG_JOSVOLLY8741_CONNECT(1,0,0,0)
MCFG_JOSVOLLY8741_PORT_HANDLERS(IOPORT("DSW1"),IOPORT("DSW2"),IOPORT("DSW1"),IOPORT("DSW2"))
/* video hardware */ /* video hardware */
MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_REFRESH_RATE(60)

View File

@ -39,6 +39,11 @@ public:
int m_fg_tile_bank; int m_fg_tile_bank;
int m_bg_tile_bank; int m_bg_tile_bank;
DECLARE_READ8_MEMBER( gladiator_dsw1_r );
DECLARE_READ8_MEMBER( gladiator_dsw2_r );
DECLARE_READ8_MEMBER( gladiator_controls_r );
DECLARE_READ8_MEMBER( gladiator_button3_r );
DECLARE_WRITE8_MEMBER(gladiatr_videoram_w); DECLARE_WRITE8_MEMBER(gladiatr_videoram_w);
DECLARE_WRITE8_MEMBER(gladiatr_colorram_w); DECLARE_WRITE8_MEMBER(gladiatr_colorram_w);
DECLARE_WRITE8_MEMBER(gladiatr_textram_w); DECLARE_WRITE8_MEMBER(gladiatr_textram_w);

View File

@ -44,6 +44,8 @@ public:
DECLARE_WRITE8_MEMBER(gsword_AY8910_control_port_1_w); DECLARE_WRITE8_MEMBER(gsword_AY8910_control_port_1_w);
DECLARE_READ8_MEMBER(gsword_fake_0_r); DECLARE_READ8_MEMBER(gsword_fake_0_r);
DECLARE_READ8_MEMBER(gsword_fake_1_r); DECLARE_READ8_MEMBER(gsword_fake_1_r);
DECLARE_READ8_MEMBER( gsword_8741_2_r );
DECLARE_READ8_MEMBER( gsword_8741_3_r );
DECLARE_WRITE8_MEMBER(gsword_adpcm_data_w); DECLARE_WRITE8_MEMBER(gsword_adpcm_data_w);
DECLARE_DRIVER_INIT(gsword); DECLARE_DRIVER_INIT(gsword);
DECLARE_DRIVER_INIT(gsword2); DECLARE_DRIVER_INIT(gsword2);

View File

@ -31,38 +31,26 @@ gladiatr and Great Swordsman set.
#define CMD_08 1 #define CMD_08 1
#define CMD_4a 2 #define CMD_4a 2
struct I8741 { const device_type TAITO8741_4PACK = &device_creator<taito8741_4pack_device>;
UINT8 toData; /* to host data */
UINT8 fromData; /* from host data */
UINT8 fromCmd; /* from host command */
UINT8 status; /* b0 = rd ready,b1 = wd full,b2 = cmd ?? */
UINT8 mode;
UINT8 phase;
UINT8 txd[8];
UINT8 rxd[8];
UINT8 parallelselect;
UINT8 txpoint;
int connect;
UINT8 pending4a;
int serial_out;
int coins;
read8_space_func portHandler;
const char *portName;
};
static const struct TAITO8741interface *intf; taito8741_4pack_device::taito8741_4pack_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
//static I8741 *taito8741; : device_t(mconfig, TAITO8741_4PACK, "Taito 8741 MCU 4 pack", tag, owner, clock, "taito8741_4pack", __FILE__),
static I8741 taito8741[MAX_TAITO8741]; m_port_handler_0_r(*this),
m_port_handler_1_r(*this),
m_port_handler_2_r(*this),
m_port_handler_3_r(*this)
{
}
/* for host data , write */ /* for host data , write */
static void taito8741_hostdata_w(I8741 *st,int data) void taito8741_4pack_device::hostdata_w(I8741 *st,int data)
{ {
st->toData = data; st->toData = data;
st->status |= 0x01; st->status |= 0x01;
} }
/* from host data , read */ /* from host data , read */
static int taito8741_hostdata_r(I8741 *st) int taito8741_4pack_device::hostdata_r(I8741 *st)
{ {
if( !(st->status & 0x02) ) return -1; if( !(st->status & 0x02) ) return -1;
st->status &= 0xfd; st->status &= 0xfd;
@ -70,7 +58,7 @@ static int taito8741_hostdata_r(I8741 *st)
} }
/* from host command , read */ /* from host command , read */
static int taito8741_hostcmd_r(I8741 *st) int taito8741_4pack_device::hostcmd_r(I8741 *st)
{ {
if(!(st->status & 0x04)) return -1; if(!(st->status & 0x04)) return -1;
st->status &= 0xfb; st->status &= 0xfb;
@ -80,16 +68,16 @@ static int taito8741_hostcmd_r(I8741 *st)
/* TAITO8741 I8741 emulation */ /* TAITO8741 I8741 emulation */
static void taito8741_serial_rx(I8741 *st,UINT8 *data) void taito8741_4pack_device::serial_rx(I8741 *st,UINT8 *data)
{ {
memcpy(st->rxd,data,8); memcpy(st->rxd,data,8);
} }
/* timer callback of serial tx finish */ /* timer callback of serial tx finish */
static TIMER_CALLBACK( taito8741_serial_tx ) TIMER_CALLBACK_MEMBER( taito8741_4pack_device::serial_tx )
{ {
int num = param; int num = param;
I8741 *st = &taito8741[num]; I8741 *st = &m_taito8741[num];
I8741 *sst; I8741 *sst;
if( st->mode==TAITO8741_MASTER) if( st->mode==TAITO8741_MASTER)
@ -98,18 +86,21 @@ static TIMER_CALLBACK( taito8741_serial_tx )
st->txpoint = 1; st->txpoint = 1;
if(st->connect >= 0 ) if(st->connect >= 0 )
{ {
sst = &taito8741[st->connect]; sst = &m_taito8741[st->connect];
/* transfer data */ /* transfer data */
taito8741_serial_rx(sst,st->txd); serial_rx(sst,st->txd);
LOG(("8741-%d Serial data TX to %d\n",num,st->connect)); LOG(("8741-%d Serial data TX to %d\n",num,st->connect));
if( sst->mode==TAITO8741_SLAVE) if( sst->mode==TAITO8741_SLAVE)
sst->serial_out = 1; sst->serial_out = 1;
} }
} }
void TAITO8741_reset(int num) void taito8741_4pack_device::device_reset()
{ {
I8741 *st = &taito8741[num]; for (int i=0;i<4;i++)
{
I8741 *st = &m_taito8741[i];
st->number = i;
st->status = 0x00; st->status = 0x00;
st->phase = 0; st->phase = 0;
st->parallelselect = 0; st->parallelselect = 0;
@ -119,10 +110,11 @@ void TAITO8741_reset(int num)
st->coins = 0; st->coins = 0;
memset(st->rxd,0,8); memset(st->rxd,0,8);
memset(st->txd,0,8); memset(st->txd,0,8);
}
} }
/* 8741 update */ /* 8741 update */
static void taito8741_update(address_space &space, int num) void taito8741_4pack_device::update(int num)
{ {
I8741 *st,*sst; I8741 *st,*sst;
int next = num; int next = num;
@ -130,9 +122,9 @@ static void taito8741_update(address_space &space, int num)
do{ do{
num = next; num = next;
st = &taito8741[num]; st = &m_taito8741[num];
if( st->connect != -1 ) if( st->connect != -1 )
sst = &taito8741[st->connect]; sst = &m_taito8741[st->connect];
else sst = 0; else sst = 0;
next = -1; next = -1;
/* check pending command */ /* check pending command */
@ -149,14 +141,14 @@ static void taito8741_update(address_space &space, int num)
case CMD_4a: /* wait for syncronus ? */ case CMD_4a: /* wait for syncronus ? */
if(!st->pending4a) if(!st->pending4a)
{ {
taito8741_hostdata_w(st,0); hostdata_w(st,0);
st->phase = CMD_IDLE; st->phase = CMD_IDLE;
next = num; /* continue this chip */ next = num; /* continue this chip */
} }
break; break;
case CMD_IDLE: case CMD_IDLE:
/* ----- data in port check ----- */ /* ----- data in port check ----- */
data = taito8741_hostdata_r(st); data = hostdata_r(st);
if( data != -1 ) if( data != -1 )
{ {
switch(st->mode) switch(st->mode)
@ -177,18 +169,18 @@ static void taito8741_update(address_space &space, int num)
else else
{ /* port select */ { /* port select */
st->parallelselect = data & 0x07; st->parallelselect = data & 0x07;
taito8741_hostdata_w(st,st->portHandler ? st->portHandler(space,st->parallelselect,0xff) : st->portName ? space.machine().root_device().ioport(st->portName)->read() : 0); hostdata_w(st,port_read(st->number,st->parallelselect));
} }
} }
} }
/* ----- new command fetch ----- */ /* ----- new command fetch ----- */
data = taito8741_hostcmd_r(st); data = hostcmd_r(st);
switch( data ) switch( data )
{ {
case -1: /* no command data */ case -1: /* no command data */
break; break;
case 0x00: /* read from parallel port */ case 0x00: /* read from parallel port */
taito8741_hostdata_w(st,st->portHandler ? st->portHandler(space,0,0xff) : st->portName ? space.machine().root_device().ioport(st->portName)->read() : 0 ); hostdata_w(st,port_read(st->number,0));
break; break;
case 0x01: /* read receive buffer 0 */ case 0x01: /* read receive buffer 0 */
case 0x02: /* read receive buffer 1 */ case 0x02: /* read receive buffer 1 */
@ -198,13 +190,13 @@ static void taito8741_update(address_space &space, int num)
case 0x06: /* read receive buffer 5 */ case 0x06: /* read receive buffer 5 */
case 0x07: /* read receive buffer 6 */ case 0x07: /* read receive buffer 6 */
//if (data == 2 && num==0 && st->rxd[data-1]&0x80) logerror("Coin Get\n"); //if (data == 2 && num==0 && st->rxd[data-1]&0x80) logerror("Coin Get\n");
taito8741_hostdata_w(st,st->rxd[data-1]); hostdata_w(st,st->rxd[data-1]);
break; break;
case 0x08: /* latch received serial data */ case 0x08: /* latch received serial data */
st->txd[0] = st->portHandler ? st->portHandler(space,0,0xff) : st->portName ? space.machine().root_device().ioport(st->portName)->read() : 0; st->txd[0] = port_read(st->number,0);
if( sst ) if( sst )
{ {
space.machine().scheduler().synchronize(FUNC(taito8741_serial_tx), num); machine().scheduler().synchronize(timer_expired_delegate(FUNC(taito8741_4pack_device::serial_tx),this), num);
st->serial_out = 0; st->serial_out = 0;
st->status |= 0x04; st->status |= 0x04;
st->phase = CMD_08; st->phase = CMD_08;
@ -230,17 +222,17 @@ static void taito8741_update(address_space &space, int num)
if(sst->pending4a) if(sst->pending4a)
{ {
sst->pending4a = 0; /* syncronus */ sst->pending4a = 0; /* syncronus */
taito8741_hostdata_w(st,0); /* return for host */ hostdata_w(st,0); /* return for host */
next = st->connect; next = st->connect;
} }
else st->phase = CMD_4a; else st->phase = CMD_4a;
} }
break; break;
case 0x80: /* 8741-3 : return check code */ case 0x80: /* 8741-3 : return check code */
taito8741_hostdata_w(st,0x66); hostdata_w(st,0x66);
break; break;
case 0x81: /* 8741-2 : return check code */ case 0x81: /* 8741-2 : return check code */
taito8741_hostdata_w(st,0x48); hostdata_w(st,0x48);
break; break;
case 0xf0: /* GSWORD 8741-1 : initialize ?? */ case 0xf0: /* GSWORD 8741-1 : initialize ?? */
break; break;
@ -252,120 +244,77 @@ static void taito8741_update(address_space &space, int num)
}while(next>=0); }while(next>=0);
} }
int TAITO8741_start(const struct TAITO8741interface *taito8741intf) void taito8741_4pack_device::device_start()
{ {
int i; m_port_handler_0_r.resolve_safe(0);
m_port_handler_1_r.resolve_safe(0);
intf = taito8741intf; m_port_handler_2_r.resolve_safe(0);
m_port_handler_3_r.resolve_safe(0);
//taito8741 = (I8741 *)malloc(intf->num*sizeof(I8741));
//if( taito8741 == 0 ) return 1;
for(i=0;i<intf->num;i++)
{
taito8741[i].connect = intf->serial_connect[i];
taito8741[i].portHandler = intf->portHandler_r[i];
taito8741[i].portName = intf->portName_r[i];
taito8741[i].mode = intf->mode[i];
TAITO8741_reset(i);
}
return 0;
} }
/* read status port */ /* read status port */
static int I8741_status_r(address_space &space, int num) int taito8741_4pack_device::status_r(int num)
{ {
I8741 *st = &taito8741[num]; I8741 *st = &m_taito8741[num];
taito8741_update(space, num); update(num);
LOG(("%s:8741-%d ST Read %02x\n",space.machine().describe_context(),num,st->status)); LOG(("%s:8741-%d ST Read %02x\n",machine().describe_context(),num,st->status));
return st->status; return st->status;
} }
/* read data port */ /* read data port */
static int I8741_data_r(address_space &space, int num) int taito8741_4pack_device::data_r(int num)
{ {
I8741 *st = &taito8741[num]; I8741 *st = &m_taito8741[num];
int ret = st->toData; int ret = st->toData;
st->status &= 0xfe; st->status &= 0xfe;
LOG(("%s:8741-%d DATA Read %02x\n",space.machine().describe_context(),num,ret)); LOG(("%s:8741-%d DATA Read %02x\n",machine().describe_context(),num,ret));
/* update chip */ /* update chip */
taito8741_update(space, num); update(num);
switch( st->mode ) switch( st->mode )
{ {
case TAITO8741_PORT: /* parallel data */ case TAITO8741_PORT: /* parallel data */
taito8741_hostdata_w(st,st->portHandler ? st->portHandler(space, st->parallelselect, 0xff) : st->portName ? space.machine().root_device().ioport(st->portName)->read() : 0); hostdata_w(st,port_read(st->number,st->parallelselect));
break; break;
} }
return ret; return ret;
} }
/* Write data port */ /* Write data port */
static void I8741_data_w(address_space &space, int num, int data) void taito8741_4pack_device::data_w(int num, int data)
{ {
I8741 *st = &taito8741[num]; I8741 *st = &m_taito8741[num];
LOG(("%s:8741-%d DATA Write %02x\n",space.machine().describe_context(),num,data)); LOG(("%s:8741-%d DATA Write %02x\n",machine().describe_context(),num,data));
st->fromData = data; st->fromData = data;
st->status |= 0x02; st->status |= 0x02;
/* update chip */ /* update chip */
taito8741_update(space, num); update(num);
} }
/* Write command port */ /* Write command port */
static void I8741_command_w(address_space &space, int num, int data) void taito8741_4pack_device::command_w(int num, int data)
{ {
I8741 *st = &taito8741[num]; I8741 *st = &m_taito8741[num];
LOG(("%s:8741-%d CMD Write %02x\n",space.machine().describe_context(),num,data)); LOG(("%s:8741-%d CMD Write %02x\n",machine().describe_context(),num,data));
st->fromCmd = data; st->fromCmd = data;
st->status |= 0x04; st->status |= 0x04;
/* update chip */ /* update chip */
taito8741_update(space,num); update(num);
} }
/* Write port handler */ UINT8 taito8741_4pack_device::port_read(int num, int offset)
WRITE8_HANDLER( TAITO8741_0_w )
{ {
if(offset&1) I8741_command_w(space,0,data); switch(num)
else I8741_data_w(space,0,data); {
} case 0 : return m_port_handler_0_r(offset);
WRITE8_HANDLER( TAITO8741_1_w ) case 1 : return m_port_handler_1_r(offset);
{ case 2 : return m_port_handler_2_r(offset);
if(offset&1) I8741_command_w(space,1,data); case 3 : return m_port_handler_3_r(offset);
else I8741_data_w(space,1,data); default : return 0;
} }
WRITE8_HANDLER( TAITO8741_2_w )
{
if(offset&1) I8741_command_w(space,2,data);
else I8741_data_w(space,2,data);
}
WRITE8_HANDLER( TAITO8741_3_w )
{
if(offset&1) I8741_command_w(space,3,data);
else I8741_data_w(space,3,data);
} }
/* Read port handler */
READ8_HANDLER( TAITO8741_0_r )
{
if(offset&1) return I8741_status_r(space,0);
return I8741_data_r(space,0);
}
READ8_HANDLER( TAITO8741_1_r )
{
if(offset&1) return I8741_status_r(space,1);
return I8741_data_r(space,1);
}
READ8_HANDLER( TAITO8741_2_r )
{
if(offset&1) return I8741_status_r(space,2);
return I8741_data_r(space,2);
}
READ8_HANDLER( TAITO8741_3_r )
{
if(offset&1) return I8741_status_r(space,3);
return I8741_data_r(space,3);
}
/**************************************************************************** /****************************************************************************
joshi Vollyball set. joshi Vollyball set.
@ -378,56 +327,48 @@ joshi Vollyball set.
****************************************************************************/ ****************************************************************************/
static int josvolly_nmi_enable; const device_type JOSVOLLY8741_4PACK = &device_creator<josvolly8741_4pack_device>;
struct JV8741 { josvolly8741_4pack_device::josvolly8741_4pack_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
UINT8 cmd; : device_t(mconfig, JOSVOLLY8741_4PACK, "joshi Vollyball 8741 MCU 4 pack", tag, owner, clock, "josvolly8741_4pack", __FILE__),
UINT8 sts; m_port_handler_0_r(*this),
UINT8 txd; m_port_handler_1_r(*this),
UINT8 outport; m_port_handler_2_r(*this),
UINT8 rxd; m_port_handler_3_r(*this)
UINT8 connect;
UINT8 rst;
const char *initReadPort;
};
static JV8741 i8741[4];
void josvolly_8741_reset(void)
{ {
int i; }
josvolly_nmi_enable = 0; void josvolly8741_4pack_device::device_start()
{
m_port_handler_0_r.resolve_safe(0);
m_port_handler_1_r.resolve_safe(0);
m_port_handler_2_r.resolve_safe(0);
m_port_handler_3_r.resolve_safe(0);
}
for(i=0;i<4;i++)
void josvolly8741_4pack_device::device_reset()
{
m_nmi_enable = 0;
for(int i=0;i<4;i++)
{ {
i8741[i].cmd = 0; m_i8741[i].cmd = 0;
i8741[i].sts = 0; // 0xf0; /* init flag */ m_i8741[i].sts = 0; // 0xf0; /* init flag */
i8741[i].txd = 0; m_i8741[i].txd = 0;
i8741[i].outport = 0xff; m_i8741[i].outport = 0xff;
i8741[i].rxd = 0; m_i8741[i].rxd = 0;
i8741[i].rst = 1;
m_i8741[i].rst = 1;
} }
i8741[0].connect = 1;
i8741[1].connect = 0;
i8741[0].initReadPort = "DSW1"; /* DSW1 */
i8741[1].initReadPort = "DSW2"; /* DSW2 */
i8741[2].initReadPort = "DSW1"; /* DUMMY */
i8741[3].initReadPort = "DSW2"; /* DUMMY */
} }
/* transmit data finish callback */ /* transmit data finish callback */
static TIMER_CALLBACK( josvolly_8741_tx ) TIMER_CALLBACK_MEMBER( josvolly8741_4pack_device::tx )
{ {
int num = param; int num = param;
JV8741 *src = &i8741[num]; JV8741 *src = &m_i8741[num];
JV8741 *dst = &i8741[src->connect]; JV8741 *dst = &m_i8741[src->connect];
dst->rxd = src->txd; dst->rxd = src->txd;
@ -435,22 +376,22 @@ static TIMER_CALLBACK( josvolly_8741_tx )
dst->sts |= 0x01; /* RX ready ? */ dst->sts |= 0x01; /* RX ready ? */
} }
static void josvolly_8741_do(running_machine &machine, int num) void josvolly8741_4pack_device::update(int num)
{ {
if( (i8741[num].sts & 0x02) ) if( (m_i8741[num].sts & 0x02) )
{ {
/* transmit data */ /* transmit data */
machine.scheduler().timer_set (attotime::from_usec(1), FUNC(josvolly_8741_tx), num); machine().scheduler().timer_set (attotime::from_usec(1), timer_expired_delegate(FUNC(josvolly8741_4pack_device::tx),this), num);
} }
} }
static void josvolly_8741_w(address_space &space, int num, int offset, int data) void josvolly8741_4pack_device::write(int num, int offset, int data)
{ {
JV8741 *mcu = &i8741[num]; JV8741 *mcu = &m_i8741[num];
if(offset==1) if(offset==1)
{ {
LOG(("%s:8741[%d] CW %02X\n", space.machine().describe_context(), num, data)); LOG(("%s:8741[%d] CW %02X\n", machine().describe_context(), num, data));
/* read pointer */ /* read pointer */
mcu->cmd = data; mcu->cmd = data;
@ -472,7 +413,7 @@ static void josvolly_8741_w(address_space &space, int num, int offset, int data)
break; break;
case 2: case 2:
#if 1 #if 1
mcu->rxd = space.machine().root_device().ioport("DSW2")->read(); mcu->rxd = port_read(1);
mcu->sts |= 0x01; /* RD ready */ mcu->sts |= 0x01; /* RD ready */
#endif #endif
break; break;
@ -488,7 +429,7 @@ static void josvolly_8741_w(address_space &space, int num, int offset, int data)
else else
{ {
/* data */ /* data */
LOG(("%s:8741[%d] DW %02X\n", space.machine().describe_context(), num, data)); LOG(("%s:8741[%d] DW %02X\n", machine().describe_context(), num, data));
mcu->txd = data ^ 0x40; /* parity reverce ? */ mcu->txd = data ^ 0x40; /* parity reverce ? */
mcu->sts |= 0x02; /* TXD busy */ mcu->sts |= 0x02; /* TXD busy */
@ -496,46 +437,49 @@ static void josvolly_8741_w(address_space &space, int num, int offset, int data)
/* interrupt ? */ /* interrupt ? */
if(num == 0) if(num == 0)
{ {
if(josvolly_nmi_enable) if(m_nmi_enable)
{ {
space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE); machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE);
josvolly_nmi_enable = 0; m_nmi_enable = 0;
} }
} }
#endif #endif
} }
josvolly_8741_do(space.machine(), num); update(num);
} }
static INT8 josvolly_8741_r(address_space &space,int num,int offset) UINT8 josvolly8741_4pack_device::read(int num,int offset)
{ {
JV8741 *mcu = &i8741[num]; JV8741 *mcu = &m_i8741[num];
int ret; int ret;
if(offset==1) if(offset==1)
{ {
if(mcu->rst) if(mcu->rst)
mcu->rxd = space.machine().root_device().ioport(mcu->initReadPort)->read(); /* port in */ mcu->rxd = port_read(num); /* port in */
ret = mcu->sts; ret = mcu->sts;
LOG(("%s:8741[%d] SR %02X\n",space.machine().describe_context(),num,ret)); LOG(("%s:8741[%d] SR %02X\n",machine().describe_context(),num,ret));
} }
else else
{ {
/* clear status port */ /* clear status port */
mcu->sts &= ~0x01; /* RD ready */ mcu->sts &= ~0x01; /* RD ready */
ret = mcu->rxd; ret = mcu->rxd;
LOG(("%s:8741[%d] DR %02X\n",space.machine().describe_context(),num,ret)); LOG(("%s:8741[%d] DR %02X\n",machine().describe_context(),num,ret));
mcu->rst = 0; mcu->rst = 0;
} }
return ret; return ret;
} }
WRITE8_HANDLER( josvolly_8741_0_w ){ josvolly_8741_w(space,0,offset,data); } UINT8 josvolly8741_4pack_device::port_read(int num)
READ8_HANDLER( josvolly_8741_0_r ) { return josvolly_8741_r(space,0,offset); }
WRITE8_HANDLER( josvolly_8741_1_w ) { josvolly_8741_w(space,1,offset,data); }
READ8_HANDLER( josvolly_8741_1_r ) { return josvolly_8741_r(space,1,offset); }
WRITE8_HANDLER( josvolly_nmi_enable_w )
{ {
josvolly_nmi_enable = 1; switch(num)
{
case 0 : return m_port_handler_0_r(0);
case 1 : return m_port_handler_1_r(0);
case 2 : return m_port_handler_2_r(0);
case 3 : return m_port_handler_3_r(0);
default : return 0;
}
} }

View File

@ -6,46 +6,182 @@
gladiatr and Great Swordsman set. gladiatr and Great Swordsman set.
****************************************************************************/ ****************************************************************************/
#define MAX_TAITO8741 4
/* NEC 8741 program mode */ /* NEC 8741 program mode */
#define TAITO8741_MASTER 0 #define TAITO8741_MASTER 0
#define TAITO8741_SLAVE 1 #define TAITO8741_SLAVE 1
#define TAITO8741_PORT 2 #define TAITO8741_PORT 2
struct TAITO8741interface #define MCFG_TAITO8741_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, TAITO8741_4PACK, 0)
#define MCFG_TAITO8741_PORT_HANDLERS(_devcb0, _devcb1, _devcb2, _devcb3) \
devcb = &taito8741_4pack_device::set_port_handler_0_callback(*device, DEVCB2_##_devcb0); \
devcb = &taito8741_4pack_device::set_port_handler_1_callback(*device, DEVCB2_##_devcb1); \
devcb = &taito8741_4pack_device::set_port_handler_2_callback(*device, DEVCB2_##_devcb2); \
devcb = &taito8741_4pack_device::set_port_handler_3_callback(*device, DEVCB2_##_devcb3);
#define MCFG_TAITO8741_MODES(_mode0, _mode1, _mode2, _mode3) \
taito8741_4pack_device::static_set_mode(*device, 0, _mode0); \
taito8741_4pack_device::static_set_mode(*device, 1, _mode1); \
taito8741_4pack_device::static_set_mode(*device, 2, _mode2); \
taito8741_4pack_device::static_set_mode(*device, 3, _mode3);
#define MCFG_TAITO8741_CONNECT(_con0, _con1, _con2, _con3) \
taito8741_4pack_device::static_set_connect(*device, 0, _con0); \
taito8741_4pack_device::static_set_connect(*device, 1, _con1); \
taito8741_4pack_device::static_set_connect(*device, 2, _con2); \
taito8741_4pack_device::static_set_connect(*device, 3, _con3);
class taito8741_4pack_device : public device_t
{ {
int num; struct I8741 {
int mode[MAX_TAITO8741]; /* program select */ int number;
int serial_connect[MAX_TAITO8741]; /* serial port connection */ UINT8 toData; /* to host data */
read8_space_func portHandler_r[MAX_TAITO8741]; /* parallel port handler */ UINT8 fromData; /* from host data */
const char *portName_r[MAX_TAITO8741]; UINT8 fromCmd; /* from host command */
UINT8 status; /* b0 = rd ready,b1 = wd full,b2 = cmd ?? */
UINT8 mode;
UINT8 phase;
UINT8 txd[8];
UINT8 rxd[8];
UINT8 parallelselect;
UINT8 txpoint;
int connect;
UINT8 pending4a;
int serial_out;
int coins;
};
public:
taito8741_4pack_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
~taito8741_4pack_device() {}
template<class _Object> static devcb2_base &set_port_handler_0_callback(device_t &device, _Object object) { return downcast<taito8741_4pack_device &>(device).m_port_handler_0_r.set_callback(object); }
template<class _Object> static devcb2_base &set_port_handler_1_callback(device_t &device, _Object object) { return downcast<taito8741_4pack_device &>(device).m_port_handler_1_r.set_callback(object); }
template<class _Object> static devcb2_base &set_port_handler_2_callback(device_t &device, _Object object) { return downcast<taito8741_4pack_device &>(device).m_port_handler_2_r.set_callback(object); }
template<class _Object> static devcb2_base &set_port_handler_3_callback(device_t &device, _Object object) { return downcast<taito8741_4pack_device &>(device).m_port_handler_3_r.set_callback(object); }
static void static_set_mode(device_t &device, int num, UINT8 mode) { downcast<taito8741_4pack_device &>(device).m_taito8741[num].mode = mode; }
static void static_set_connect(device_t &device, int num, int conn) { downcast<taito8741_4pack_device &>(device).m_taito8741[num].connect = conn; }
DECLARE_READ8_MEMBER( read_0 ) { if(offset&1) return status_r(0); else return data_r(0); }
DECLARE_WRITE8_MEMBER( write_0 ) { if(offset&1) command_w(0,data); else data_w(0,data); }
DECLARE_READ8_MEMBER( read_1 ) { if(offset&1) return status_r(1); else return data_r(1); }
DECLARE_WRITE8_MEMBER( write_1 ) { if(offset&1) command_w(1,data); else data_w(1,data); }
DECLARE_READ8_MEMBER( read_2 ) { if(offset&1) return status_r(2); else return data_r(2); }
DECLARE_WRITE8_MEMBER( write_2 ) { if(offset&1) command_w(2,data); else data_w(2,data); }
DECLARE_READ8_MEMBER( read_3 ) { if(offset&1) return status_r(3); else return data_r(3); }
DECLARE_WRITE8_MEMBER( write_3 ) { if(offset&1) command_w(3,data); else data_w(3,data); }
TIMER_CALLBACK_MEMBER( serial_tx );
void update(int num);
int status_r(int num);
int data_r(int num);
void data_w(int num, int data);
void command_w(int num, int data);
UINT8 port_read(int num, int offset);
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
private:
void hostdata_w(I8741 *st,int data);
int hostdata_r(I8741 *st);
int hostcmd_r(I8741 *st);
void serial_rx(I8741 *st,UINT8 *data);
// internal state
I8741 m_taito8741[4];
devcb2_read8 m_port_handler_0_r;
devcb2_read8 m_port_handler_1_r;
devcb2_read8 m_port_handler_2_r;
devcb2_read8 m_port_handler_3_r;
}; };
int TAITO8741_start(const struct TAITO8741interface *taito8741intf);
void TAITO8741_reset(int num); extern const device_type TAITO8741_4PACK;
/* write handler */
DECLARE_WRITE8_HANDLER( TAITO8741_0_w );
DECLARE_WRITE8_HANDLER( TAITO8741_1_w );
DECLARE_WRITE8_HANDLER( TAITO8741_2_w );
DECLARE_WRITE8_HANDLER( TAITO8741_3_w );
/* read handler */
DECLARE_READ8_HANDLER( TAITO8741_0_r );
DECLARE_READ8_HANDLER( TAITO8741_1_r );
DECLARE_READ8_HANDLER( TAITO8741_2_r );
DECLARE_READ8_HANDLER( TAITO8741_3_r );
/**************************************************************************** /****************************************************************************
joshi Volleyball set. joshi Volleyball set.
****************************************************************************/ ****************************************************************************/
void josvolly_8741_reset(void); #define MCFG_JOSVOLLY8741_ADD(_tag) \
DECLARE_WRITE8_HANDLER( josvolly_8741_0_w ); MCFG_DEVICE_ADD(_tag, JOSVOLLY8741_4PACK, 0)
DECLARE_WRITE8_HANDLER( josvolly_8741_1_w );
DECLARE_READ8_HANDLER( josvolly_8741_0_r ); #define MCFG_JOSVOLLY8741_PORT_HANDLERS(_devcb0, _devcb1, _devcb2, _devcb3) \
DECLARE_READ8_HANDLER( josvolly_8741_1_r ); devcb = &josvolly8741_4pack_device::set_port_handler_0_callback(*device, DEVCB2_##_devcb0); \
DECLARE_WRITE8_HANDLER( josvolly_nmi_enable_w ); devcb = &josvolly8741_4pack_device::set_port_handler_1_callback(*device, DEVCB2_##_devcb1); \
devcb = &josvolly8741_4pack_device::set_port_handler_2_callback(*device, DEVCB2_##_devcb2); \
devcb = &josvolly8741_4pack_device::set_port_handler_3_callback(*device, DEVCB2_##_devcb3);
#define MCFG_JOSVOLLY8741_CONNECT(_con0, _con1, _con2, _con3) \
josvolly8741_4pack_device::static_set_connect(*device, 0, _con0); \
josvolly8741_4pack_device::static_set_connect(*device, 1, _con1); \
josvolly8741_4pack_device::static_set_connect(*device, 2, _con2); \
josvolly8741_4pack_device::static_set_connect(*device, 3, _con3);
class josvolly8741_4pack_device : public device_t
{
struct JV8741 {
UINT8 cmd;
UINT8 sts;
UINT8 txd;
UINT8 outport;
UINT8 rxd;
UINT8 connect;
UINT8 rst;
};
public:
josvolly8741_4pack_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
~josvolly8741_4pack_device() {}
template<class _Object> static devcb2_base &set_port_handler_0_callback(device_t &device, _Object object) { return downcast<josvolly8741_4pack_device &>(device).m_port_handler_0_r.set_callback(object); }
template<class _Object> static devcb2_base &set_port_handler_1_callback(device_t &device, _Object object) { return downcast<josvolly8741_4pack_device &>(device).m_port_handler_1_r.set_callback(object); }
template<class _Object> static devcb2_base &set_port_handler_2_callback(device_t &device, _Object object) { return downcast<josvolly8741_4pack_device &>(device).m_port_handler_2_r.set_callback(object); }
template<class _Object> static devcb2_base &set_port_handler_3_callback(device_t &device, _Object object) { return downcast<josvolly8741_4pack_device &>(device).m_port_handler_3_r.set_callback(object); }
static void static_set_connect(device_t &device, int num, int conn) { downcast<josvolly8741_4pack_device &>(device).m_i8741[num].connect = conn; }
DECLARE_READ8_MEMBER( read_0 ) { return read(0,offset); }
DECLARE_WRITE8_MEMBER( write_0 ) { write(0,offset,data); }
DECLARE_READ8_MEMBER( read_1 ) { return read(1,offset); }
DECLARE_WRITE8_MEMBER( write_1 ) { write(1,offset,data); }
DECLARE_WRITE8_HANDLER( nmi_enable_w ) { m_nmi_enable = 1; }
TIMER_CALLBACK_MEMBER( tx );
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
private:
void update(int num);
void write(int num, int offset, int data);
UINT8 read(int num,int offset);
UINT8 port_read(int num);
// internal state
JV8741 m_i8741[4];
int m_nmi_enable;
devcb2_read8 m_port_handler_0_r;
devcb2_read8 m_port_handler_1_r;
devcb2_read8 m_port_handler_2_r;
devcb2_read8 m_port_handler_3_r;
};
extern const device_type JOSVOLLY8741_4PACK;
#endif #endif