mirror of
https://github.com/holub/mame
synced 2025-07-02 00:29:37 +03:00
karnov: Hook up MCU dumps for karnov [Brian Troha, TeamEurope, The Dumping Union, Dirk Best]
- Use dumped MCU for karnov and karnova - Use a handcrafted MCU dump based on the US version for karnovj
This commit is contained in:
parent
c9399d2377
commit
9ebe14c6ea
@ -202,45 +202,7 @@ void karnov_state::mcubl_p1_w(uint8_t data)
|
||||
|
||||
// mcu simulation below
|
||||
|
||||
/* Emulation of the protected microcontroller - for coins & general protection */
|
||||
void karnov_state::karnov_i8751_w( int data )
|
||||
{
|
||||
/* Pending coin operations may cause protection commands to be queued */
|
||||
if (m_i8751_needs_ack)
|
||||
{
|
||||
m_i8751_command_queue = data;
|
||||
return;
|
||||
}
|
||||
|
||||
m_i8751_return = 0;
|
||||
|
||||
if (data == 0x100 && m_microcontroller_id == KARNOV) /* USA version */
|
||||
m_i8751_return = 0x56b;
|
||||
|
||||
if (data == 0x100 && m_microcontroller_id == KARNOVJ) /* Japan version */
|
||||
m_i8751_return = 0x56a;
|
||||
|
||||
if ((data & 0xf00) == 0x300)
|
||||
m_i8751_return = (data & 0xff) * 0x12; /* Player sprite mapping */
|
||||
|
||||
/* I'm not sure the ones marked ^ appear in the right order */
|
||||
if (data == 0x400) m_i8751_return = 0x4000; /* Get The Map... */
|
||||
if (data == 0x402) m_i8751_return = 0x40a6; /* Ancient Ruins */
|
||||
if (data == 0x403) m_i8751_return = 0x4054; /* Forest... */
|
||||
if (data == 0x404) m_i8751_return = 0x40de; /* ^Rocky hills */
|
||||
if (data == 0x405) m_i8751_return = 0x4182; /* Sea */
|
||||
if (data == 0x406) m_i8751_return = 0x41ca; /* Town */
|
||||
if (data == 0x407) m_i8751_return = 0x421e; /* Desert */
|
||||
if (data == 0x401) m_i8751_return = 0x4138; /* ^Whistling wind */
|
||||
if (data == 0x408) m_i8751_return = 0x4276; /* ^Heavy Gates */
|
||||
|
||||
// if (!m_i8751_return && data != 0x300) logerror("%s - Unknown Write %02x intel\n", machine().describe_context(), data);
|
||||
|
||||
m_maincpu->set_input_line(6, HOLD_LINE); /* Signal main cpu task is complete */
|
||||
m_i8751_needs_ack = 1;
|
||||
}
|
||||
|
||||
void karnov_state::wndrplnt_i8751_w( int data )
|
||||
void karnov_state::wndrplnt_mcu_w( uint16_t data )
|
||||
{
|
||||
/* The last command hasn't been ACK'd (probably a conflict with coin command) */
|
||||
if (m_i8751_needs_ack)
|
||||
@ -305,7 +267,7 @@ void karnov_state::wndrplnt_i8751_w( int data )
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void karnov_state::mcusim_ack_w(u16 data)
|
||||
void karnov_state::wndrplnt_mcu_ack_w(u16 data)
|
||||
{
|
||||
m_maincpu->set_input_line(6, CLEAR_LINE);
|
||||
|
||||
@ -322,7 +284,7 @@ void karnov_state::mcusim_ack_w(u16 data)
|
||||
{
|
||||
/* Pending control command - just write it back as SECREQ */
|
||||
m_i8751_needs_ack = 0;
|
||||
mcusim_w(m_i8751_command_queue);
|
||||
wndrplnt_mcu_w(m_i8751_command_queue);
|
||||
m_i8751_command_queue = 0;
|
||||
}
|
||||
else
|
||||
@ -332,20 +294,12 @@ void karnov_state::mcusim_ack_w(u16 data)
|
||||
}
|
||||
}
|
||||
|
||||
u16 karnov_state::mcusim_r()
|
||||
u16 karnov_state::wndrplnt_mcu_r()
|
||||
{
|
||||
return m_i8751_return;
|
||||
}
|
||||
|
||||
void karnov_state::mcusim_w(u16 data)
|
||||
{
|
||||
if (m_microcontroller_id == KARNOV || m_microcontroller_id == KARNOVJ)
|
||||
karnov_i8751_w(data);
|
||||
if (m_microcontroller_id == WNDRPLNT)
|
||||
wndrplnt_i8751_w(data);
|
||||
}
|
||||
|
||||
void karnov_state::mcusim_reset_w(u16 data)
|
||||
void karnov_state::wndrplnt_mcu_reset_w(u16 data)
|
||||
{
|
||||
logerror("Reset i8751\n");
|
||||
m_i8751_needs_ack = 0;
|
||||
@ -376,23 +330,28 @@ void karnov_state::karnov_map(address_map &map)
|
||||
map(0x0a1000, 0x0a17ff).w(FUNC(karnov_state::playfield_w)).share("pf_data");
|
||||
map(0x0a1800, 0x0a1fff).lw16([this](offs_t offset, u16 data, u16 mem_mask)
|
||||
{ playfield_w(((offset & 0x1f) << 5) | ((offset & 0x3e0) >> 5), data, mem_mask); }, "pf_col_w");
|
||||
map(0x0c0000, 0x0c0001).portr("P1_P2").w(FUNC(karnov_state::mcusim_ack_w));
|
||||
map(0x0c0000, 0x0c0001).portr("P1_P2").w(FUNC(karnov_state::mcu_ack_w));
|
||||
map(0x0c0002, 0x0c0003).portr("SYSTEM");
|
||||
map(0x0c0003, 0x0c0003).w(m_soundlatch, FUNC(generic_latch_8_device::write));
|
||||
map(0x0c0004, 0x0c0005).portr("DSW").w(m_spriteram, FUNC(buffered_spriteram16_device::write));
|
||||
map(0x0c0006, 0x0c0007).rw(FUNC(karnov_state::mcusim_r), FUNC(karnov_state::mcusim_w));
|
||||
map(0x0c0006, 0x0c0007).rw(FUNC(karnov_state::mcu_r), FUNC(karnov_state::mcu_w));
|
||||
map(0x0c0008, 0x0c000b).writeonly().share("scroll");
|
||||
map(0x0c000c, 0x0c000d).w(FUNC(karnov_state::mcusim_reset_w));
|
||||
map(0x0c000e, 0x0c000f).w(FUNC(karnov_state::vint_ack_w));
|
||||
map(0x0c000e, 0x0c000f).nopr().w(FUNC(karnov_state::vint_ack_w));
|
||||
}
|
||||
|
||||
void karnov_state::chelnov_map(address_map &map)
|
||||
void karnov_state::karnovjbl_map(address_map &map)
|
||||
{
|
||||
karnov_map(map);
|
||||
map(0x0c0000, 0x0c0001).portr("P1_P2").w(FUNC(karnov_state::mcu_ack_w));
|
||||
map(0x0c0006, 0x0c0007).rw(FUNC(karnov_state::mcu_r), FUNC(karnov_state::mcu_w));
|
||||
map(0x0c000c, 0x0c000d).unmaprw();
|
||||
map(0x0c000e, 0x0c000f).nopr();
|
||||
map(0x0c0000, 0x0c0001).portr("P1_P2").nopw();
|
||||
map(0x0c0006, 0x0c0007).noprw();
|
||||
}
|
||||
|
||||
void karnov_state::wndrplnt_map(address_map &map)
|
||||
{
|
||||
karnov_map(map);
|
||||
map(0x0c0000, 0x0c0001).portr("P1_P2").w(FUNC(karnov_state::wndrplnt_mcu_ack_w));
|
||||
map(0x0c0006, 0x0c0007).rw(FUNC(karnov_state::wndrplnt_mcu_r), FUNC(karnov_state::wndrplnt_mcu_w));
|
||||
map(0x0c000c, 0x0c000d).w(FUNC(karnov_state::wndrplnt_mcu_reset_w));
|
||||
}
|
||||
|
||||
void karnov_state::base_sound_map(address_map &map)
|
||||
@ -457,10 +416,11 @@ INPUT_PORTS_END
|
||||
static INPUT_PORTS_START( karnov )
|
||||
PORT_INCLUDE( common )
|
||||
|
||||
PORT_START("COIN") /* Dummy input for i8751 */
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
|
||||
PORT_START("COIN")
|
||||
PORT_BIT( 0x1f, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_WRITE_LINE_DEVICE_MEMBER("coin", input_merger_device, in_w<0>)
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_WRITE_LINE_DEVICE_MEMBER("coin", input_merger_device, in_w<1>)
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_WRITE_LINE_DEVICE_MEMBER("coin", input_merger_device, in_w<2>)
|
||||
|
||||
PORT_START("DSW")
|
||||
PORT_DIPNAME( 0x0003, 0x0003, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2")
|
||||
@ -505,6 +465,15 @@ static INPUT_PORTS_START( karnov )
|
||||
PORT_DIPSETTING( 0x0000, "Fast" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( karnovjbl )
|
||||
PORT_INCLUDE(karnov)
|
||||
|
||||
PORT_MODIFY("COIN")
|
||||
PORT_BIT(0x1f, IP_ACTIVE_LOW, IPT_UNUSED)
|
||||
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_COIN1)
|
||||
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_COIN2)
|
||||
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_SERVICE1)
|
||||
INPUT_PORTS_END
|
||||
|
||||
/* verified from M68000 code */
|
||||
static INPUT_PORTS_START( wndrplnt )
|
||||
@ -690,7 +659,7 @@ GFXDECODE_END
|
||||
*
|
||||
*************************************/
|
||||
|
||||
WRITE_LINE_MEMBER(karnov_state::mcusim_vbint_w)
|
||||
WRITE_LINE_MEMBER(karnov_state::wndrplnt_mcusim_vbint_w)
|
||||
{
|
||||
if (!state)
|
||||
return;
|
||||
@ -698,10 +667,10 @@ WRITE_LINE_MEMBER(karnov_state::mcusim_vbint_w)
|
||||
uint8_t port = ioport("COIN")->read();
|
||||
|
||||
/* Coin input to the i8751 generates an interrupt to the main cpu */
|
||||
if (port == m_coin_mask)
|
||||
if (port == 0)
|
||||
m_latch = 1;
|
||||
|
||||
if (port != m_coin_mask && m_latch)
|
||||
if (port != 0 && m_latch)
|
||||
{
|
||||
if (m_i8751_needs_ack)
|
||||
{
|
||||
@ -769,9 +738,22 @@ void karnov_state::karnov(machine_config &config)
|
||||
M68000(config, m_maincpu, 20_MHz_XTAL/2); /* 10 MHz */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &karnov_state::karnov_map);
|
||||
|
||||
// needs a tight sync with the mcu
|
||||
config.set_perfect_quantum(m_maincpu);
|
||||
|
||||
M6502(config, m_audiocpu, 12_MHz_XTAL/8); /* Accurate */
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &karnov_state::karnov_sound_map);
|
||||
|
||||
I8751(config, m_mcu, 8_MHz_XTAL);
|
||||
m_mcu->port_in_cb<0>().set([this](){ return m_mcu_p0; });
|
||||
m_mcu->port_out_cb<0>().set([this](u8 data){ m_mcu_p0 = data; });
|
||||
m_mcu->port_in_cb<1>().set([this](){ return m_mcu_p1; });
|
||||
m_mcu->port_out_cb<1>().set([this](u8 data){ m_mcu_p1 = data; });
|
||||
m_mcu->port_out_cb<2>().set(FUNC(karnov_state::mcu_p2_w));
|
||||
m_mcu->port_in_cb<3>().set_ioport("COIN");
|
||||
|
||||
INPUT_MERGER_ANY_LOW(config, "coin").output_handler().set(FUNC(karnov_state::mcu_coin_irq));
|
||||
|
||||
/* video hardware */
|
||||
BUFFERED_SPRITERAM16(config, m_spriteram);
|
||||
|
||||
@ -782,7 +764,7 @@ void karnov_state::karnov(machine_config &config)
|
||||
m_screen->set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
|
||||
m_screen->set_screen_update(FUNC(karnov_state::screen_update));
|
||||
m_screen->set_palette(m_palette);
|
||||
m_screen->screen_vblank().set(FUNC(karnov_state::mcusim_vbint_w));
|
||||
m_screen->screen_vblank().set(FUNC(karnov_state::vbint_w));
|
||||
|
||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_karnov);
|
||||
DECO_RMC3(config, m_palette, 0, 1024); // xxxxBBBBGGGGRRRR with custom weighting
|
||||
@ -810,54 +792,44 @@ void karnov_state::karnov(machine_config &config)
|
||||
void karnov_state::karnovjbl(machine_config &config)
|
||||
{
|
||||
karnov(config);
|
||||
|
||||
/* X-TALs:
|
||||
Top board next to #9 is 20.000 MHz
|
||||
Top board next to the microcontroller is 6.000 MHz
|
||||
Bottom board next to the ribbon cable is 12.000 MHz*/
|
||||
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &karnov_state::karnovjbl_map);
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &karnov_state::karnovjbl_sound_map);
|
||||
|
||||
// different MCU
|
||||
config.device_remove("mcu");
|
||||
config.device_remove("coin");
|
||||
|
||||
ym3812_device &ym2(YM3812(config.replace(), "ym2", 3000000));
|
||||
ym2.irq_handler().set_inputline(m_audiocpu, M6502_IRQ_LINE);
|
||||
ym2.add_route(ALL_OUTPUTS, "mono", 1.0);
|
||||
}
|
||||
|
||||
void karnov_state::chelnov(machine_config &config)
|
||||
{
|
||||
karnov(config);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &karnov_state::chelnov_map);
|
||||
|
||||
I8751(config, m_mcu, 8_MHz_XTAL); // 8.000 MHz OSC next to MCU
|
||||
m_mcu->port_in_cb<0>().set([this](){ return m_mcu_p0; });
|
||||
m_mcu->port_out_cb<0>().set([this](u8 data){ m_mcu_p0 = data; });
|
||||
m_mcu->port_in_cb<1>().set([this](){ return m_mcu_p1; });
|
||||
m_mcu->port_out_cb<1>().set([this](u8 data){ m_mcu_p1 = data; });
|
||||
m_mcu->port_out_cb<2>().set(FUNC(karnov_state::mcu_p2_w));
|
||||
m_mcu->port_in_cb<3>().set_ioport("COIN");
|
||||
|
||||
INPUT_MERGER_ANY_LOW(config, "coin").output_handler().set(FUNC(karnov_state::mcu_coin_irq));
|
||||
|
||||
m_screen->screen_vblank().set(FUNC(karnov_state::vbint_w));
|
||||
}
|
||||
|
||||
void karnov_state::chelnovjbl(machine_config &config)
|
||||
{
|
||||
karnov(config);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &karnov_state::chelnov_map);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &karnov_state::karnov_map);
|
||||
|
||||
config.device_remove("mcu");
|
||||
config.device_remove("coin");
|
||||
|
||||
I8031(config, m_mcu, 8_MHz_XTAL); // info below states 8MHz for MCU
|
||||
m_mcu->set_addrmap(AS_PROGRAM, &karnov_state::chelnovjbl_mcu_map);
|
||||
m_mcu->set_addrmap(AS_IO, &karnov_state::chelnovjbl_mcu_io_map);
|
||||
m_mcu->port_out_cb<1>().set(FUNC(karnov_state::mcubl_p1_w));
|
||||
m_mcu->port_in_cb<3>().set_ioport("COIN");
|
||||
|
||||
m_screen->screen_vblank().set(FUNC(karnov_state::vbint_w));
|
||||
}
|
||||
|
||||
void karnov_state::wndrplnt(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 20_MHz_XTAL/2); /* 10 MHz */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &karnov_state::karnov_map);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &karnov_state::wndrplnt_map);
|
||||
|
||||
M6502(config, m_audiocpu, 12_MHz_XTAL/8); /* Accurate */
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &karnov_state::karnov_sound_map);
|
||||
@ -872,7 +844,7 @@ void karnov_state::wndrplnt(machine_config &config)
|
||||
screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
|
||||
screen.set_screen_update(FUNC(karnov_state::screen_update));
|
||||
screen.set_palette(m_palette);
|
||||
screen.screen_vblank().set(FUNC(karnov_state::mcusim_vbint_w));
|
||||
screen.screen_vblank().set(FUNC(karnov_state::wndrplnt_mcusim_vbint_w));
|
||||
|
||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_karnov);
|
||||
DECO_RMC3(config, m_palette, 0, 1024); // xxxxBBBBGGGGRRRR with custom weighting
|
||||
@ -916,8 +888,8 @@ ROM_START( karnov ) /* DE-0248-3 main board, DE-259-0 sub/rom board */
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 Sound CPU */
|
||||
ROM_LOAD( "dn05-5.f3", 0x8000, 0x8000, CRC(fa1a31a8) SHA1(5007a625be03c546d2a78444d72c28761b10cdb0) )
|
||||
|
||||
ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 microcontroller */
|
||||
ROM_LOAD( "dn-e.k14", 0x0000, 0x1000, NO_DUMP ) /* DN-E or DN-6? */
|
||||
ROM_REGION( 0x1000, "mcu", 0 ) // i8751 MCU (Note: Dump taken from a Rev 5 board)
|
||||
ROM_LOAD( "dn-5.k14", 0x0000, 0x1000, CRC(d056de4e) SHA1(621587ed949ff46e5ccb0d0603612655a38b69a3) )
|
||||
|
||||
ROM_REGION( 0x08000, "gfx1", 0 )
|
||||
ROM_LOAD( "dn00-.c5", 0x00000, 0x08000, CRC(0ed77c6d) SHA1(4ec86ac56c01c158a580dc13dea3e5cbdf90d0e9) ) /* Characters */
|
||||
@ -955,8 +927,8 @@ ROM_START( karnova ) /* DE-0248-3 main board, DE-259-0 sub/rom board */
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 Sound CPU */
|
||||
ROM_LOAD( "dn05-5.f3", 0x8000, 0x8000, CRC(fa1a31a8) SHA1(5007a625be03c546d2a78444d72c28761b10cdb0) )
|
||||
|
||||
ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 microcontroller */
|
||||
ROM_LOAD( "dn-5.k14", 0x0000, 0x1000, NO_DUMP )
|
||||
ROM_REGION( 0x1000, "mcu", 0 ) // i8751 MCU
|
||||
ROM_LOAD( "dn-5.k14", 0x0000, 0x1000, CRC(d056de4e) SHA1(621587ed949ff46e5ccb0d0603612655a38b69a3) )
|
||||
|
||||
ROM_REGION( 0x08000, "gfx1", 0 )
|
||||
ROM_LOAD( "dn00-.c5", 0x00000, 0x08000, CRC(0ed77c6d) SHA1(4ec86ac56c01c158a580dc13dea3e5cbdf90d0e9) ) /* Characters */
|
||||
@ -994,8 +966,8 @@ ROM_START( karnovj ) /* DE-0248-3 main board, DE-259-0 sub/rom board */
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 Sound CPU */
|
||||
ROM_LOAD( "kar5.f3", 0x8000, 0x8000, CRC(7c9158f1) SHA1(dfba7b3abd6b8d6991f0207cd252ee652a6050c2) )
|
||||
|
||||
ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 microcontroller */
|
||||
ROM_LOAD( "karnovj_i8751.k14", 0x0000, 0x1000, NO_DUMP )
|
||||
ROM_REGION( 0x1000, "mcu", 0 ) // i8751 MCU (BAD_DUMP because it was created from the US version)
|
||||
ROM_LOAD( "karnovj_i8751.k14", 0x0000, 0x1000, BAD_DUMP CRC(5a8c4d28) SHA1(58cc912d91e569503d5a20fa3180fbdca595e39f) )
|
||||
|
||||
ROM_REGION( 0x08000, "gfx1", 0 )
|
||||
ROM_LOAD( "dn00-.c5", 0x00000, 0x08000, CRC(0ed77c6d) SHA1(4ec86ac56c01c158a580dc13dea3e5cbdf90d0e9) ) /* Characters */
|
||||
@ -1304,44 +1276,19 @@ ROM_START( chelnovjbla )
|
||||
ROM_END
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Driver initialization
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void karnov_state::init_karnov()
|
||||
{
|
||||
m_microcontroller_id = KARNOV;
|
||||
m_coin_mask = 0x07;
|
||||
}
|
||||
|
||||
void karnov_state::init_karnovj()
|
||||
{
|
||||
m_microcontroller_id = KARNOVJ;
|
||||
m_coin_mask = 0x07;
|
||||
}
|
||||
|
||||
void karnov_state::init_wndrplnt()
|
||||
{
|
||||
m_microcontroller_id = WNDRPLNT;
|
||||
m_coin_mask = 0x00;
|
||||
}
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Game driver(s)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
GAME( 1987, karnov, 0, karnov, karnov, karnov_state, init_karnov, ROT0, "Data East USA", "Karnov (US, rev 6)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1987, karnova, karnov, karnov, karnov, karnov_state, init_karnov, ROT0, "Data East USA", "Karnov (US, rev 5)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1987, karnovj, karnov, karnov, karnov, karnov_state, init_karnovj, ROT0, "Data East Corporation", "Karnov (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1987, karnovjbl, karnov, karnovjbl, karnov, karnov_state, init_karnovj, ROT0, "bootleg (K. J. Corporation)", "Karnov (Japan, bootleg with NEC D8748HD)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1987, wndrplnt, 0, wndrplnt, wndrplnt, karnov_state, init_wndrplnt, ROT270, "Data East Corporation", "Wonder Planet (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, chelnov, 0, chelnov, chelnov, karnov_state, empty_init, ROT0, "Data East Corporation", "Chelnov - Atomic Runner (World)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, chelnovu, chelnov, chelnov, chelnovu, karnov_state, empty_init, ROT0, "Data East USA", "Chelnov - Atomic Runner (US)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, chelnovj, chelnov, chelnov, chelnovj, karnov_state, empty_init, ROT0, "Data East Corporation", "Chelnov - Atomic Runner (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, chelnovjbl, chelnov, chelnovjbl, chelnovjbl, karnov_state, empty_init, ROT0, "bootleg", "Chelnov - Atomic Runner (Japan, bootleg with I8031, set 1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, chelnovjbla, chelnov, chelnovjbl, chelnovjbl, karnov_state, empty_init, ROT0, "bootleg", "Chelnov - Atomic Runner (Japan, bootleg with I8031, set 2)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1987, karnov, 0, karnov, karnov, karnov_state, empty_init, ROT0, "Data East USA", "Karnov (US, rev 6)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1987, karnova, karnov, karnov, karnov, karnov_state, empty_init, ROT0, "Data East USA", "Karnov (US, rev 5)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1987, karnovj, karnov, karnov, karnov, karnov_state, empty_init, ROT0, "Data East Corporation", "Karnov (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1987, karnovjbl, karnov, karnovjbl, karnovjbl, karnov_state, empty_init, ROT0, "bootleg (K. J. Corporation)", "Karnov (Japan, bootleg with NEC D8748HD)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1987, wndrplnt, 0, wndrplnt, wndrplnt, karnov_state, empty_init, ROT270, "Data East Corporation", "Wonder Planet (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, chelnov, 0, karnov, chelnov, karnov_state, empty_init, ROT0, "Data East Corporation", "Chelnov - Atomic Runner (World)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, chelnovu, chelnov, karnov, chelnovu, karnov_state, empty_init, ROT0, "Data East USA", "Chelnov - Atomic Runner (US)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, chelnovj, chelnov, karnov, chelnovj, karnov_state, empty_init, ROT0, "Data East Corporation", "Chelnov - Atomic Runner (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, chelnovjbl, chelnov, chelnovjbl, chelnovjbl, karnov_state, empty_init, ROT0, "bootleg", "Chelnov - Atomic Runner (Japan, bootleg with I8031, set 1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, chelnovjbla, chelnov, chelnovjbl, chelnovjbl, karnov_state, empty_init, ROT0, "bootleg", "Chelnov - Atomic Runner (Japan, bootleg with I8031, set 2)", MACHINE_SUPPORTS_SAVE )
|
||||
|
@ -58,32 +58,24 @@ public:
|
||||
uint16_t m_i8751_needs_ack;
|
||||
uint16_t m_i8751_coin_pending;
|
||||
uint16_t m_i8751_command_queue;
|
||||
int m_microcontroller_id;
|
||||
int m_coin_mask;
|
||||
int m_latch;
|
||||
|
||||
u16 mcusim_r();
|
||||
void mcusim_w(u16 data);
|
||||
void mcusim_ack_w(u16 data);
|
||||
void mcusim_reset_w(u16 data);
|
||||
u16 wndrplnt_mcu_r();
|
||||
void wndrplnt_mcu_w(u16 data);
|
||||
void wndrplnt_mcu_ack_w(u16 data);
|
||||
void wndrplnt_mcu_reset_w(u16 data);
|
||||
|
||||
void vint_ack_w(u16 data);
|
||||
void videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
void playfield_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
void init_wndrplnt();
|
||||
void init_karnov();
|
||||
void init_karnovj();
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_fix_tile_info);
|
||||
DECLARE_VIDEO_START(karnov);
|
||||
DECLARE_VIDEO_START(wndrplnt);
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(mcusim_vbint_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(wndrplnt_mcusim_vbint_w);
|
||||
void vbint_w(int state);
|
||||
|
||||
void karnov_i8751_w( int data );
|
||||
void wndrplnt_i8751_w( int data );
|
||||
|
||||
void chelnov(machine_config &config);
|
||||
void chelnovjbl(machine_config &config);
|
||||
void karnov(machine_config &config);
|
||||
void wndrplnt(machine_config &config);
|
||||
@ -93,7 +85,8 @@ public:
|
||||
void chelnovjbl_mcu_map(address_map &map);
|
||||
void chelnovjbl_mcu_io_map(address_map &map);
|
||||
void karnov_map(address_map &map);
|
||||
void chelnov_map(address_map &map);
|
||||
void karnovjbl_map(address_map &map);
|
||||
void wndrplnt_map(address_map &map);
|
||||
void karnov_sound_map(address_map &map);
|
||||
void karnovjbl_sound_map(address_map &map);
|
||||
|
||||
@ -123,9 +116,3 @@ private:
|
||||
uint16_t m_maincpu_to_mcu;
|
||||
bool m_coin_state;
|
||||
};
|
||||
|
||||
enum {
|
||||
KARNOV = 0,
|
||||
KARNOVJ,
|
||||
WNDRPLNT
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user