mirror of
https://github.com/holub/mame
synced 2025-07-01 16:19:38 +03:00
- irem/m119.cpp, sega/winclub.cpp: corrected copy paste errors / typos
- konami/mainevt.cpp, konami/mikie.cpp, konami/pandoras.cpp, konami/pingpong.cpp, konami/pooyan.cpp, konami/sbasketb.cpp, konami/tp84.cpp: consolidated drivers in single files, minor cleanups
This commit is contained in:
parent
49d421177c
commit
e0cd6b8252
@ -117,7 +117,7 @@ ROM_START( scumimon )
|
||||
ROM_LOAD16_BYTE( "scu1.b-c1.ic2", 0x000001, 0x200000, CRC(adff81ba) SHA1(a176b9ab5b2f47abb89e817699d742dbf876a4c7) )
|
||||
|
||||
ROM_REGION(0x200000, "ymz", 0)
|
||||
ROM_LOAD( "scu1.a-pr00-c.ic43", 0x000000, 0x100000, CRC(819e4bbd) SHA1(e0ca76a7b97b05bbffdb96866a8bdd460fc589b2) ) // FIXED BITS (xxxxxxxxxxxxx1xx)
|
||||
ROM_LOAD( "scu1.a-v0-.ic35", 0x000000, 0x100000, CRC(819e4bbd) SHA1(e0ca76a7b97b05bbffdb96866a8bdd460fc589b2) ) // FIXED BITS (xxxxxxxxxxxxx1xx)
|
||||
|
||||
// TODO: 2x PLDs once identified
|
||||
ROM_END
|
||||
|
@ -2,8 +2,8 @@
|
||||
// copyright-holders:Bryan McPhail
|
||||
/***************************************************************************
|
||||
|
||||
The Main Event, (c) 1988 Konami
|
||||
Devastators, (c) 1988 Konami
|
||||
The Main Event, (c) 1988 Konami (GX799)
|
||||
Devastators, (c) 1988 Konami (GX890)
|
||||
|
||||
Emulation by Bryan McPhail, mish@tendril.co.uk
|
||||
|
||||
@ -17,7 +17,7 @@ Notes:
|
||||
- Devastators: sprite zooming for the planes in level 2 is particularly bad.
|
||||
|
||||
- Devastators: title screen white backdrop is always supposed to flicker,
|
||||
it currently do that only from second/fourth attract cycles (supposed to always
|
||||
it currently does that only from second/fourth attract cycles (supposed to always
|
||||
flicker from PCB video);
|
||||
|
||||
Both games run on Konami's PWB351024A PCB
|
||||
@ -27,48 +27,259 @@ Both games run on Konami's PWB351024A PCB
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "mainevt.h"
|
||||
|
||||
#include "k051733.h"
|
||||
#include "k051960.h"
|
||||
#include "k052109.h"
|
||||
#include "konami_helper.h"
|
||||
#include "konamipt.h"
|
||||
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "cpu/m6809/hd6309.h"
|
||||
#include "cpu/m6809/m6809.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/gen_latch.h"
|
||||
#include "sound/k007232.h"
|
||||
#include "sound/upd7759.h"
|
||||
#include "sound/ymopm.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
|
||||
|
||||
void mainevt_state::dv_nmienable_w(uint8_t data)
|
||||
// configurable logging
|
||||
#define LOG_SHBANK (1U << 1)
|
||||
|
||||
//#define VERBOSE (LOG_GENERAL | LOG_SHBANK)
|
||||
|
||||
#include "logmacro.h"
|
||||
|
||||
#define LOGSHBANK(...) LOGMASKED(LOG_SHBANK, __VA_ARGS__)
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class base_state : public driver_device
|
||||
{
|
||||
public:
|
||||
base_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_k007232(*this, "k007232")
|
||||
, m_k052109(*this, "k052109")
|
||||
, m_k051960(*this, "k051960")
|
||||
, m_rombank(*this, "rombank")
|
||||
, m_leds(*this, "led%u", 0U)
|
||||
{ }
|
||||
|
||||
void devstors(machine_config &config);
|
||||
void mainevt(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
|
||||
// devices
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<k007232_device> m_k007232;
|
||||
required_device<k052109_device> m_k052109;
|
||||
required_device<k051960_device> m_k051960;
|
||||
|
||||
required_memory_bank m_rombank;
|
||||
output_finder<4> m_leds;
|
||||
|
||||
// misc
|
||||
uint8_t m_sound_irq_mask = 0;
|
||||
|
||||
void bankswitch_w(uint8_t data);
|
||||
void coin_w(uint8_t data);
|
||||
void sh_irqtrigger_w(uint8_t data);
|
||||
uint8_t k052109_051960_r(offs_t offset);
|
||||
void k052109_051960_w(offs_t offset, uint8_t data);
|
||||
void volume_callback(uint8_t data);
|
||||
};
|
||||
|
||||
class mainevt_state : public base_state
|
||||
{
|
||||
public:
|
||||
mainevt_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: base_state(mconfig, type, tag)
|
||||
, m_upd7759(*this, "upd")
|
||||
{ }
|
||||
|
||||
void mainevt(machine_config &config);
|
||||
|
||||
private:
|
||||
// devices
|
||||
required_device<upd7759_device> m_upd7759;
|
||||
|
||||
void sh_irqcontrol_w(uint8_t data);
|
||||
void sh_bankswitch_w(uint8_t data);
|
||||
uint8_t sh_busy_r();
|
||||
INTERRUPT_GEN_MEMBER(sound_timer_irq);
|
||||
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
K052109_CB_MEMBER(tile_callback);
|
||||
K051960_CB_MEMBER(sprite_callback);
|
||||
|
||||
void main_map(address_map &map);
|
||||
void sound_map(address_map &map);
|
||||
};
|
||||
|
||||
class devstors_state : public base_state
|
||||
{
|
||||
public:
|
||||
devstors_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: base_state(mconfig, type, tag)
|
||||
{ }
|
||||
|
||||
void devstors(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
|
||||
private:
|
||||
// misc
|
||||
uint8_t m_nmi_enable = 0;
|
||||
|
||||
void nmienable_w(uint8_t data);
|
||||
void sh_irqcontrol_w(uint8_t data);
|
||||
void sh_bankswitch_w(uint8_t data);
|
||||
INTERRUPT_GEN_MEMBER(sound_timer_irq);
|
||||
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(vblank_w);
|
||||
K052109_CB_MEMBER(tile_callback);
|
||||
K051960_CB_MEMBER(sprite_callback);
|
||||
|
||||
void main_map(address_map &map);
|
||||
void sound_map(address_map &map);
|
||||
};
|
||||
|
||||
|
||||
// video
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Callbacks for the K052109
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
K052109_CB_MEMBER(mainevt_state::tile_callback)
|
||||
{
|
||||
static const int layer_colorbase[] = { 0 / 16, 128 / 16, 64 / 16 };
|
||||
|
||||
*flags = (*color & 0x02) ? TILE_FLIPX : 0;
|
||||
|
||||
// priority relative to HALF priority sprites
|
||||
*priority = (layer == 2) ? (*color & 0x20) >> 5 : 0;
|
||||
*code |= ((*color & 0x01) << 8) | ((*color & 0x1c) << 7);
|
||||
*color = layer_colorbase[layer] + ((*color & 0xc0) >> 6);
|
||||
}
|
||||
|
||||
K052109_CB_MEMBER(devstors_state::tile_callback)
|
||||
{
|
||||
static const int layer_colorbase[] = { 0 / 16, 0 / 16, 64 / 16 };
|
||||
|
||||
// (color & 0x02) is flip y handled internally by the 052109
|
||||
*code |= ((*color & 0x01) << 8) | ((*color & 0x3c) << 7);
|
||||
*color = layer_colorbase[layer] + ((*color & 0xc0) >> 6);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Callbacks for the K051960
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
K051960_CB_MEMBER(mainevt_state::sprite_callback)
|
||||
{
|
||||
enum { sprite_colorbase = 192 / 16 };
|
||||
|
||||
// bit 5 = priority over layer B (has precedence)
|
||||
// bit 6 = HALF priority over layer B (used for crowd when you get out of the ring)
|
||||
if (*color & 0x20)
|
||||
*priority = 0xff00;
|
||||
else if (*color & 0x40)
|
||||
*priority = 0xff00 | 0xf0f0;
|
||||
else
|
||||
*priority = 0xff00 | 0xf0f0 | 0xcccc;
|
||||
// bit 7 is shadow, not used
|
||||
|
||||
*color = sprite_colorbase + (*color & 0x03);
|
||||
}
|
||||
|
||||
K051960_CB_MEMBER(devstors_state::sprite_callback)
|
||||
{
|
||||
enum { sprite_colorbase = 128 / 16 };
|
||||
|
||||
// TODO: the priority/shadow handling (bits 5-7) seems to be quite complex (see PROM)
|
||||
*color = sprite_colorbase + (*color & 0x07);
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
uint32_t mainevt_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
m_k052109->tilemap_update();
|
||||
|
||||
screen.priority().fill(0, cliprect);
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 1);
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 1, 2); // low priority part of layer
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 0, 4); // high priority part of layer
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 8);
|
||||
|
||||
m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), -1, -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t devstors_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
m_k052109->tilemap_update();
|
||||
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 0);
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 0, 0);
|
||||
m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), 0, 0);
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// machine
|
||||
|
||||
void devstors_state::nmienable_w(uint8_t data)
|
||||
{
|
||||
m_nmi_enable = data;
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(mainevt_state::dv_vblank_w)
|
||||
WRITE_LINE_MEMBER(devstors_state::vblank_w)
|
||||
{
|
||||
if (state && m_nmi_enable)
|
||||
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
|
||||
}
|
||||
|
||||
|
||||
void mainevt_state::mainevt_bankswitch_w(uint8_t data)
|
||||
void base_state::bankswitch_w(uint8_t data)
|
||||
{
|
||||
/* bit 0-1 ROM bank select */
|
||||
// bit 0-1 ROM bank select
|
||||
m_rombank->set_entry(data & 0x03);
|
||||
|
||||
/* TODO: bit 5 = select work RAM or palette? */
|
||||
// TODO: bit 5 = select work RAM or palette?
|
||||
//palette_selected = data & 0x20;
|
||||
|
||||
/* bit 6 = enable char ROM reading through the video RAM */
|
||||
// bit 6 = enable char ROM reading through the video RAM
|
||||
m_k052109->set_rmrd_line((data & 0x40) ? ASSERT_LINE : CLEAR_LINE);
|
||||
|
||||
/* bit 7 = NINITSET (unknown) */
|
||||
// bit 7 = NINITSET (unknown)
|
||||
|
||||
/* other bits unused */
|
||||
// other bits unused
|
||||
}
|
||||
|
||||
void mainevt_state::mainevt_coin_w(uint8_t data)
|
||||
void base_state::coin_w(uint8_t data)
|
||||
{
|
||||
machine().bookkeeping().coin_counter_w(0, data & 0x10);
|
||||
machine().bookkeeping().coin_counter_w(1, data & 0x20);
|
||||
@ -78,17 +289,17 @@ void mainevt_state::mainevt_coin_w(uint8_t data)
|
||||
m_leds[3] = BIT(data, 3);
|
||||
}
|
||||
|
||||
void mainevt_state::mainevt_sh_irqtrigger_w(uint8_t data)
|
||||
void base_state::sh_irqtrigger_w(uint8_t data)
|
||||
{
|
||||
m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80
|
||||
}
|
||||
|
||||
uint8_t mainevt_state::mainevt_sh_busy_r()
|
||||
uint8_t mainevt_state::sh_busy_r()
|
||||
{
|
||||
return m_upd7759->busy_r();
|
||||
}
|
||||
|
||||
void mainevt_state::mainevt_sh_irqcontrol_w(uint8_t data)
|
||||
void mainevt_state::sh_irqcontrol_w(uint8_t data)
|
||||
{
|
||||
m_upd7759->reset_w(data & 2);
|
||||
m_upd7759->start_w(data & 1);
|
||||
@ -96,39 +307,35 @@ void mainevt_state::mainevt_sh_irqcontrol_w(uint8_t data)
|
||||
m_sound_irq_mask = data & 4;
|
||||
}
|
||||
|
||||
void mainevt_state::devstor_sh_irqcontrol_w(uint8_t data)
|
||||
void devstors_state::sh_irqcontrol_w(uint8_t data)
|
||||
{
|
||||
m_sound_irq_mask = data & 4;
|
||||
}
|
||||
|
||||
void mainevt_state::mainevt_sh_bankswitch_w(uint8_t data)
|
||||
void mainevt_state::sh_bankswitch_w(uint8_t data)
|
||||
{
|
||||
int bank_A, bank_B;
|
||||
LOGSHBANK("CPU #1 PC: %04x bank switch = %02x\n", m_audiocpu->pc(), data);
|
||||
|
||||
//logerror("CPU #1 PC: %04x bank switch = %02x\n", m_audiocpu->pc(),data);
|
||||
// bits 0-3 select the 007232 banks
|
||||
int const bank_a = (data & 0x3);
|
||||
int const bank_b = ((data >> 2) & 0x3);
|
||||
m_k007232->set_bank(bank_a, bank_b);
|
||||
|
||||
/* bits 0-3 select the 007232 banks */
|
||||
bank_A = (data & 0x3);
|
||||
bank_B = ((data >> 2) & 0x3);
|
||||
m_k007232->set_bank(bank_A, bank_B);
|
||||
|
||||
/* bits 4-5 select the UPD7759 bank */
|
||||
// bits 4-5 select the UPD7759 bank
|
||||
m_upd7759->set_rom_bank((data >> 4) & 0x03);
|
||||
}
|
||||
|
||||
void mainevt_state::dv_sh_bankswitch_w(uint8_t data)
|
||||
void devstors_state::sh_bankswitch_w(uint8_t data)
|
||||
{
|
||||
int bank_A, bank_B;
|
||||
LOGSHBANK("CPU #1 PC: %04x bank switch = %02x\n", m_audiocpu->pc(), data);
|
||||
|
||||
//logerror("CPU #1 PC: %04x bank switch = %02x\n",m_audiocpu->pc(),data);
|
||||
|
||||
/* bits 0-3 select the 007232 banks */
|
||||
bank_A = (data & 0x3);
|
||||
bank_B = ((data >> 2) & 0x3);
|
||||
m_k007232->set_bank(bank_A, bank_B);
|
||||
// bits 0-3 select the 007232 banks
|
||||
int const bank_a = (data & 0x3);
|
||||
int const bank_b = ((data >> 2) & 0x3);
|
||||
m_k007232->set_bank(bank_a, bank_b);
|
||||
}
|
||||
|
||||
uint8_t mainevt_state::k052109_051960_r(offs_t offset)
|
||||
uint8_t base_state::k052109_051960_r(offs_t offset)
|
||||
{
|
||||
if (m_k052109->get_rmrd_line() == CLEAR_LINE)
|
||||
{
|
||||
@ -143,7 +350,7 @@ uint8_t mainevt_state::k052109_051960_r(offs_t offset)
|
||||
return m_k052109->read(offset);
|
||||
}
|
||||
|
||||
void mainevt_state::k052109_051960_w(offs_t offset, uint8_t data)
|
||||
void base_state::k052109_051960_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
if (offset >= 0x3800 && offset < 0x3808)
|
||||
m_k051960->k051937_w(offset - 0x3800, data);
|
||||
@ -154,15 +361,15 @@ void mainevt_state::k052109_051960_w(offs_t offset, uint8_t data)
|
||||
}
|
||||
|
||||
|
||||
void mainevt_state::mainevt_map(address_map &map)
|
||||
void mainevt_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x3fff).rw(FUNC(mainevt_state::k052109_051960_r), FUNC(mainevt_state::k052109_051960_w));
|
||||
|
||||
map(0x1f80, 0x1f80).w(FUNC(mainevt_state::mainevt_bankswitch_w));
|
||||
map(0x1f84, 0x1f84).w("soundlatch", FUNC(generic_latch_8_device::write)); /* probably */
|
||||
map(0x1f88, 0x1f88).w(FUNC(mainevt_state::mainevt_sh_irqtrigger_w)); /* probably */
|
||||
map(0x1f8c, 0x1f8d).nopw(); /* ??? */
|
||||
map(0x1f90, 0x1f90).w(FUNC(mainevt_state::mainevt_coin_w)); /* coin counters + lamps */
|
||||
map(0x1f80, 0x1f80).w(FUNC(mainevt_state::bankswitch_w));
|
||||
map(0x1f84, 0x1f84).w("soundlatch", FUNC(generic_latch_8_device::write)); // probably
|
||||
map(0x1f88, 0x1f88).w(FUNC(mainevt_state::sh_irqtrigger_w)); // probably
|
||||
map(0x1f8c, 0x1f8d).nopw(); // ???
|
||||
map(0x1f90, 0x1f90).w(FUNC(mainevt_state::coin_w)); // coin counters + lamps
|
||||
|
||||
map(0x1f94, 0x1f94).portr("SYSTEM");
|
||||
map(0x1f95, 0x1f95).portr("P1");
|
||||
@ -175,19 +382,19 @@ void mainevt_state::mainevt_map(address_map &map)
|
||||
|
||||
map(0x4000, 0x5dff).ram();
|
||||
map(0x5e00, 0x5fff).ram().w("palette", FUNC(palette_device::write8)).share("palette");
|
||||
map(0x6000, 0x7fff).bankr("rombank");
|
||||
map(0x6000, 0x7fff).bankr(m_rombank);
|
||||
map(0x8000, 0xffff).rom();
|
||||
}
|
||||
|
||||
|
||||
void mainevt_state::devstors_map(address_map &map)
|
||||
void devstors_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x3fff).rw(FUNC(mainevt_state::k052109_051960_r), FUNC(mainevt_state::k052109_051960_w));
|
||||
map(0x0000, 0x3fff).rw(FUNC(devstors_state::k052109_051960_r), FUNC(devstors_state::k052109_051960_w));
|
||||
|
||||
map(0x1f80, 0x1f80).w(FUNC(mainevt_state::mainevt_bankswitch_w));
|
||||
map(0x1f84, 0x1f84).w("soundlatch", FUNC(generic_latch_8_device::write)); /* probably */
|
||||
map(0x1f88, 0x1f88).w(FUNC(mainevt_state::mainevt_sh_irqtrigger_w)); /* probably */
|
||||
map(0x1f90, 0x1f90).w(FUNC(mainevt_state::mainevt_coin_w)); /* coin counters + lamps */
|
||||
map(0x1f80, 0x1f80).w(FUNC(devstors_state::bankswitch_w));
|
||||
map(0x1f84, 0x1f84).w("soundlatch", FUNC(generic_latch_8_device::write)); // probably
|
||||
map(0x1f88, 0x1f88).w(FUNC(devstors_state::sh_irqtrigger_w)); // probably
|
||||
map(0x1f90, 0x1f90).w(FUNC(devstors_state::coin_w)); // coin counters + lamps
|
||||
|
||||
map(0x1f94, 0x1f94).portr("SYSTEM");
|
||||
map(0x1f95, 0x1f95).portr("P1");
|
||||
@ -196,36 +403,36 @@ void mainevt_state::devstors_map(address_map &map)
|
||||
map(0x1f98, 0x1f98).portr("DSW3");
|
||||
map(0x1f9b, 0x1f9b).portr("DSW2");
|
||||
map(0x1fa0, 0x1fbf).rw("k051733", FUNC(k051733_device::read), FUNC(k051733_device::write));
|
||||
map(0x1fb2, 0x1fb2).w(FUNC(mainevt_state::dv_nmienable_w));
|
||||
map(0x1fb2, 0x1fb2).w(FUNC(devstors_state::nmienable_w));
|
||||
|
||||
map(0x4000, 0x5dff).ram();
|
||||
map(0x5e00, 0x5fff).ram().w("palette", FUNC(palette_device::write8)).share("palette");
|
||||
map(0x6000, 0x7fff).bankr("rombank");
|
||||
map(0x6000, 0x7fff).bankr(m_rombank);
|
||||
map(0x8000, 0xffff).rom();
|
||||
}
|
||||
|
||||
|
||||
void mainevt_state::mainevt_sound_map(address_map &map)
|
||||
void mainevt_state::sound_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x7fff).rom();
|
||||
map(0x8000, 0x83ff).ram();
|
||||
map(0x9000, 0x9000).w(m_upd7759, FUNC(upd7759_device::port_w));
|
||||
map(0xa000, 0xa000).r("soundlatch", FUNC(generic_latch_8_device::read));
|
||||
map(0xb000, 0xb00d).rw(m_k007232, FUNC(k007232_device::read), FUNC(k007232_device::write));
|
||||
map(0xd000, 0xd000).r(FUNC(mainevt_state::mainevt_sh_busy_r));
|
||||
map(0xe000, 0xe000).w(FUNC(mainevt_state::mainevt_sh_irqcontrol_w));
|
||||
map(0xf000, 0xf000).w(FUNC(mainevt_state::mainevt_sh_bankswitch_w));
|
||||
map(0xd000, 0xd000).r(FUNC(mainevt_state::sh_busy_r));
|
||||
map(0xe000, 0xe000).w(FUNC(mainevt_state::sh_irqcontrol_w));
|
||||
map(0xf000, 0xf000).w(FUNC(mainevt_state::sh_bankswitch_w));
|
||||
}
|
||||
|
||||
void mainevt_state::devstors_sound_map(address_map &map)
|
||||
void devstors_state::sound_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x7fff).rom();
|
||||
map(0x8000, 0x83ff).ram();
|
||||
map(0xa000, 0xa000).r("soundlatch", FUNC(generic_latch_8_device::read));
|
||||
map(0xb000, 0xb00d).rw(m_k007232, FUNC(k007232_device::read), FUNC(k007232_device::write));
|
||||
map(0xc000, 0xc001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
|
||||
map(0xe000, 0xe000).w(FUNC(mainevt_state::devstor_sh_irqcontrol_w));
|
||||
map(0xf000, 0xf000).w(FUNC(mainevt_state::dv_sh_bankswitch_w));
|
||||
map(0xe000, 0xe000).w(FUNC(devstors_state::sh_irqcontrol_w));
|
||||
map(0xf000, 0xf000).w(FUNC(devstors_state::sh_bankswitch_w));
|
||||
}
|
||||
|
||||
|
||||
@ -272,15 +479,15 @@ static INPUT_PORTS_START( mainevt )
|
||||
PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) )
|
||||
PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) )
|
||||
PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x10, 0x10, "SW1:5" ) /* Listed as "Unused" */
|
||||
PORT_DIPUNUSED_DIPLOC( 0x20, 0x20, "SW1:6" ) /* Listed as "Unused" */
|
||||
PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW1:7" ) /* Listed as "Unused" */
|
||||
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW1:8" ) /* Listed as "Unused" */
|
||||
PORT_DIPUNUSED_DIPLOC( 0x10, 0x10, "SW1:5" ) // Listed as "Unused"
|
||||
PORT_DIPUNUSED_DIPLOC( 0x20, 0x20, "SW1:6" ) // Listed as "Unused"
|
||||
PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW1:7" ) // Listed as "Unused"
|
||||
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW1:8" ) // Listed as "Unused"
|
||||
|
||||
PORT_START("DSW2")
|
||||
PORT_DIPUNUSED_DIPLOC( 0x01, 0x01, "SW2:1" ) /* Listed as "Unused" */
|
||||
PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW2:2" ) /* Listed as "Unused" */
|
||||
PORT_DIPUNUSED_DIPLOC( 0x04, 0x04, "SW2:3" ) /* Listed as "Unused" */
|
||||
PORT_DIPUNUSED_DIPLOC( 0x01, 0x01, "SW2:1" ) // Listed as "Unused"
|
||||
PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW2:2" ) // Listed as "Unused"
|
||||
PORT_DIPUNUSED_DIPLOC( 0x04, 0x04, "SW2:3" ) // Listed as "Unused"
|
||||
PORT_DIPNAME( 0x18, 0x10, "Bonus Energy" ) PORT_DIPLOCATION("SW2:4,5") // Typo on US manual "SW2:1,2"
|
||||
PORT_DIPSETTING( 0x00, "60" )
|
||||
PORT_DIPSETTING( 0x08, "70" )
|
||||
@ -299,9 +506,9 @@ static INPUT_PORTS_START( mainevt )
|
||||
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1")
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW3:2" ) /* Listed as "Unused" */
|
||||
PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW3:2" ) // Listed as "Unused"
|
||||
PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW3:4" ) /* Listed as "Unused" */
|
||||
PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW3:4" ) // Listed as "Unused"
|
||||
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||
INPUT_PORTS_END
|
||||
|
||||
@ -309,7 +516,7 @@ static INPUT_PORTS_START( mainev2p )
|
||||
PORT_INCLUDE( mainevt )
|
||||
|
||||
PORT_MODIFY("SYSTEM")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* no keys for P3 & P4 */
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no keys for P3 & P4
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
@ -336,13 +543,13 @@ static INPUT_PORTS_START( devstors )
|
||||
PORT_INCLUDE( mainev2p )
|
||||
|
||||
PORT_MODIFY("SYSTEM")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* no service2 */
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no service2
|
||||
|
||||
PORT_MODIFY("P1")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* no 3rd button */
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no 3rd button
|
||||
|
||||
PORT_MODIFY("P2")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* no 3rd button */
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no 3rd button
|
||||
|
||||
PORT_MODIFY("P3")
|
||||
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||
@ -350,9 +557,9 @@ static INPUT_PORTS_START( devstors )
|
||||
PORT_MODIFY("P4")
|
||||
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||
|
||||
PORT_MODIFY("DSW1") /* like mainevt, but different 0x00 settings */
|
||||
PORT_MODIFY("DSW1") // like mainevt, but different 0x00 settings
|
||||
KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1)
|
||||
/* "Invalid" = both coin slots disabled */
|
||||
// "Invalid" = both coin slots disabled
|
||||
|
||||
PORT_MODIFY("DSW2")
|
||||
PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
|
||||
@ -360,7 +567,7 @@ static INPUT_PORTS_START( devstors )
|
||||
PORT_DIPSETTING( 0x02, "3" ) // factory default
|
||||
PORT_DIPSETTING( 0x01, "5" )
|
||||
PORT_DIPSETTING( 0x00, "7" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x04, 0x04, "SW2:3" ) /* Listed as "Unused" */
|
||||
PORT_DIPUNUSED_DIPLOC( 0x04, 0x04, "SW2:3" ) // Listed as "Unused"
|
||||
PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5")
|
||||
PORT_DIPSETTING( 0x18, "150 and every 200" )
|
||||
PORT_DIPSETTING( 0x10, "150 and every 250" ) // factory default
|
||||
@ -368,7 +575,7 @@ static INPUT_PORTS_START( devstors )
|
||||
PORT_DIPSETTING( 0x00, "200 Only" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
/* Same as 'devstors', but additional "Cocktail" Dip Switch (even if I don't see the use) */
|
||||
// Same as 'devstors', but additional "Cocktail" Dip Switch (even if I don't see the use)
|
||||
static INPUT_PORTS_START( devstors_ct )
|
||||
PORT_INCLUDE( devstors )
|
||||
|
||||
@ -380,55 +587,62 @@ INPUT_PORTS_END
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
void mainevt_state::volume_callback(uint8_t data)
|
||||
void base_state::volume_callback(uint8_t data)
|
||||
{
|
||||
m_k007232->set_volume(0, (data >> 4) * 0x11, 0);
|
||||
m_k007232->set_volume(1, 0, (data & 0x0f) * 0x11);
|
||||
}
|
||||
|
||||
void mainevt_state::machine_start()
|
||||
void base_state::machine_start()
|
||||
{
|
||||
m_leds.resolve();
|
||||
m_rombank->configure_entries(0, 4, memregion("maincpu")->base(), 0x2000);
|
||||
|
||||
save_item(NAME(m_sound_irq_mask));
|
||||
}
|
||||
|
||||
void devstors_state::machine_start()
|
||||
{
|
||||
base_state::machine_start();
|
||||
|
||||
save_item(NAME(m_nmi_enable));
|
||||
}
|
||||
|
||||
void mainevt_state::machine_reset()
|
||||
void devstors_state::machine_reset()
|
||||
{
|
||||
m_nmi_enable = 0;
|
||||
}
|
||||
|
||||
INTERRUPT_GEN_MEMBER(mainevt_state::mainevt_sound_timer_irq)
|
||||
INTERRUPT_GEN_MEMBER(mainevt_state::sound_timer_irq)
|
||||
{
|
||||
if(m_sound_irq_mask)
|
||||
if (m_sound_irq_mask)
|
||||
m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
|
||||
}
|
||||
|
||||
INTERRUPT_GEN_MEMBER(mainevt_state::devstors_sound_timer_irq)
|
||||
INTERRUPT_GEN_MEMBER(devstors_state::sound_timer_irq)
|
||||
{
|
||||
if(m_sound_irq_mask)
|
||||
if (m_sound_irq_mask)
|
||||
m_audiocpu->set_input_line(0, HOLD_LINE);
|
||||
}
|
||||
|
||||
void mainevt_state::mainevt(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
// basic machine hardware
|
||||
HD6309E(config, m_maincpu, 24_MHz_XTAL / 8); // E & Q generated by 052109
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &mainevt_state::mainevt_map);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &mainevt_state::main_map);
|
||||
|
||||
Z80(config, m_audiocpu, 3.579545_MHz_XTAL); /* 3.579545 MHz */
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &mainevt_state::mainevt_sound_map);
|
||||
m_audiocpu->set_periodic_int(FUNC(mainevt_state::mainevt_sound_timer_irq), attotime::from_hz(8*60)); /* ??? */
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &mainevt_state::sound_map);
|
||||
m_audiocpu->set_periodic_int(FUNC(mainevt_state::sound_timer_irq), attotime::from_hz(8 * 60)); // ???
|
||||
|
||||
/* video hardware */
|
||||
// video hardware
|
||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
||||
// screen.set_refresh_hz(60);
|
||||
// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
||||
// screen.set_size(64*8, 32*8);
|
||||
// screen.set_visarea(14*8, (64-14)*8-1, 2*8, 30*8-1);
|
||||
screen.set_raw(XTAL(24'000'000)/3, 528, 14*8, (64-14)*8, 256, 16, 240); // same hardware as Devastators so assume 59.17
|
||||
screen.set_screen_update(FUNC(mainevt_state::screen_update_mainevt));
|
||||
screen.set_raw(XTAL(24'000'000) / 3, 528, 14 * 8, (64 - 14) * 8, 256, 16, 240); // same hardware as Devastators so assume 59.17
|
||||
screen.set_screen_update(FUNC(mainevt_state::screen_update));
|
||||
screen.set_palette("palette");
|
||||
|
||||
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 256).enable_shadows();
|
||||
@ -436,15 +650,15 @@ void mainevt_state::mainevt(machine_config &config)
|
||||
K052109(config, m_k052109, 24_MHz_XTAL);
|
||||
m_k052109->set_palette("palette");
|
||||
m_k052109->set_screen("screen");
|
||||
m_k052109->set_tile_callback(FUNC(mainevt_state::mainevt_tile_callback));
|
||||
m_k052109->set_tile_callback(FUNC(mainevt_state::tile_callback));
|
||||
m_k052109->irq_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
|
||||
|
||||
K051960(config, m_k051960, 24_MHz_XTAL);
|
||||
m_k051960->set_palette("palette");
|
||||
m_k051960->set_screen("screen");
|
||||
m_k051960->set_sprite_callback(FUNC(mainevt_state::mainevt_sprite_callback));
|
||||
m_k051960->set_sprite_callback(FUNC(mainevt_state::sprite_callback));
|
||||
|
||||
/* sound hardware */
|
||||
// sound hardware
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
GENERIC_LATCH_8(config, "soundlatch");
|
||||
@ -459,43 +673,43 @@ void mainevt_state::mainevt(machine_config &config)
|
||||
}
|
||||
|
||||
|
||||
void mainevt_state::devstors(machine_config &config)
|
||||
void devstors_state::devstors(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
// basic machine hardware
|
||||
HD6309E(config, m_maincpu, 24_MHz_XTAL / 8); // E & Q generated by 052109
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &mainevt_state::devstors_map);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &devstors_state::main_map);
|
||||
|
||||
Z80(config, m_audiocpu, 3.579545_MHz_XTAL);
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &mainevt_state::devstors_sound_map);
|
||||
m_audiocpu->set_periodic_int(FUNC(mainevt_state::devstors_sound_timer_irq), attotime::from_hz(4*60)); /* ??? */
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &devstors_state::sound_map);
|
||||
m_audiocpu->set_periodic_int(FUNC(devstors_state::sound_timer_irq), attotime::from_hz(4 * 60)); // ???
|
||||
|
||||
/* video hardware */
|
||||
// video hardware
|
||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
||||
// screen.set_refresh_hz(60);
|
||||
// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
||||
// screen.set_size(64*8, 32*8);
|
||||
// screen.set_visarea(13*8, (64-13)*8-1, 2*8, 30*8-1);
|
||||
screen.set_raw(XTAL(24'000'000)/3, 528, 13*8, (64-13)*8, 256, 16, 240); // measured 59.17
|
||||
screen.set_screen_update(FUNC(mainevt_state::screen_update_dv));
|
||||
screen.set_raw(XTAL(24'000'000) / 3, 528, 13 * 8, (64 - 13) * 8, 256, 16, 240); // measured 59.17
|
||||
screen.set_screen_update(FUNC(devstors_state::screen_update));
|
||||
screen.set_palette("palette");
|
||||
screen.screen_vblank().set(FUNC(mainevt_state::dv_vblank_w));
|
||||
screen.screen_vblank().set(FUNC(devstors_state::vblank_w));
|
||||
|
||||
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 256).enable_shadows();
|
||||
|
||||
K052109(config, m_k052109, 24_MHz_XTAL);
|
||||
m_k052109->set_palette("palette");
|
||||
m_k052109->set_screen("screen");
|
||||
m_k052109->set_tile_callback(FUNC(mainevt_state::dv_tile_callback));
|
||||
m_k052109->set_tile_callback(FUNC(devstors_state::tile_callback));
|
||||
m_k052109->irq_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
|
||||
|
||||
K051960(config, m_k051960, 24_MHz_XTAL);
|
||||
m_k051960->set_palette("palette");
|
||||
m_k051960->set_screen("screen");
|
||||
m_k051960->set_sprite_callback(FUNC(mainevt_state::dv_sprite_callback));
|
||||
m_k051960->set_sprite_callback(FUNC(devstors_state::sprite_callback));
|
||||
|
||||
K051733(config, "k051733", 0);
|
||||
|
||||
/* sound hardware */
|
||||
// sound hardware
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
GENERIC_LATCH_8(config, "soundlatch");
|
||||
@ -503,7 +717,7 @@ void mainevt_state::devstors(machine_config &config)
|
||||
YM2151(config, "ymsnd", 3.579545_MHz_XTAL).add_route(0, "mono", 0.30).add_route(1, "mono", 0.30);
|
||||
|
||||
K007232(config, m_k007232, 3.579545_MHz_XTAL);
|
||||
m_k007232->port_write().set(FUNC(mainevt_state::volume_callback));
|
||||
m_k007232->port_write().set(FUNC(devstors_state::volume_callback));
|
||||
m_k007232->add_route(0, "mono", 0.20);
|
||||
m_k007232->add_route(1, "mono", 0.20);
|
||||
}
|
||||
@ -517,111 +731,111 @@ void mainevt_state::devstors(machine_config &config)
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
ROM_START( mainevt ) /* 4 players - English title screen - No "Warning" message in the ROM */
|
||||
ROM_START( mainevt ) // 4 players - English title screen - No "Warning" message in the ROM
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
ROM_LOAD( "799y02.k11", 0x00000, 0x10000, CRC(e2e7dbd5) SHA1(80314cd42a9f47f7bb82a2160fb5ef2ddc6dff30) )
|
||||
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 )
|
||||
ROM_LOAD( "799c01.f7", 0x00000, 0x08000, CRC(447c4c5c) SHA1(86e42132793c59cc6feece143516f7ecd4ed14e8) )
|
||||
|
||||
ROM_REGION( 0x20000, "k052109", 0 ) /* tiles */
|
||||
ROM_REGION( 0x20000, "k052109", 0 ) // tiles
|
||||
ROM_LOAD32_BYTE( "799c06.f22", 0x00000, 0x08000, CRC(f839cb58) SHA1(b36202ca2b68b6249c3f972ad09501e28a0162f7) )
|
||||
ROM_LOAD32_BYTE( "799c07.h22", 0x00001, 0x08000, CRC(176df538) SHA1(379e1de81afb85b1559de170cd2ab9f4af2b137e) )
|
||||
ROM_LOAD32_BYTE( "799c08.j22", 0x00002, 0x08000, CRC(d01e0078) SHA1(7ac242eb24271ac2783ec4d9e97ae051f1f3363a) )
|
||||
ROM_LOAD32_BYTE( "799c09.k22", 0x00003, 0x08000, CRC(9baec75e) SHA1(a8f6102c8fd46f18678f336bc44be31458ca9256) )
|
||||
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) // sprites
|
||||
ROM_LOAD32_WORD( "799b04.h4", 0x00000, 0x80000, CRC(323e0c2b) SHA1(c108d656b6ceff13c910739e4ca760acbb640de3) )
|
||||
ROM_LOAD32_WORD( "799b05.k4", 0x00002, 0x80000, CRC(571c5831) SHA1(2a18f0bcf6946ada6e0bde7edbd11afd4db1c170) )
|
||||
|
||||
ROM_REGION( 0x0100, "proms", 0 )
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(61f6c8d1) SHA1(c70f1f8e434aaaffb89e30e2230a08374ef324ad) ) /* priority encoder (not used) */
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(61f6c8d1) SHA1(c70f1f8e434aaaffb89e30e2230a08374ef324ad) ) // priority encoder (not used)
|
||||
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) /* 512k for 007232 samples */
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) // samples
|
||||
ROM_LOAD( "799b03.d4", 0x00000, 0x80000, CRC(f1cfd342) SHA1(079afc5c631de7f5b652d0ce6fd44b3aacd14a1b) )
|
||||
|
||||
ROM_REGION( 0x80000, "upd", 0 ) /* 512k for the UPD7759C samples */
|
||||
ROM_REGION( 0x80000, "upd", 0 ) // samples
|
||||
ROM_LOAD( "799b06.c22", 0x00000, 0x80000, CRC(2c8c47d7) SHA1(18a899767177ddfd870df9ed156d8bbc04b58a19) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( mainevto ) /* 4 players - English title screen - No "Warning" message in the ROM */
|
||||
ROM_START( mainevto ) // 4 players - English title screen - No "Warning" message in the ROM
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
ROM_LOAD( "799f02.k11", 0x00000, 0x10000, CRC(c143596b) SHA1(5da7efaf0f7c7a493cc242eae115f278bc9c134b) )
|
||||
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 )
|
||||
ROM_LOAD( "799c01.f7", 0x00000, 0x08000, CRC(447c4c5c) SHA1(86e42132793c59cc6feece143516f7ecd4ed14e8) )
|
||||
|
||||
ROM_REGION( 0x20000, "k052109", 0 ) /* tiles */
|
||||
ROM_REGION( 0x20000, "k052109", 0 ) // tiles
|
||||
ROM_LOAD32_BYTE( "799c06.f22", 0x00000, 0x08000, CRC(f839cb58) SHA1(b36202ca2b68b6249c3f972ad09501e28a0162f7) )
|
||||
ROM_LOAD32_BYTE( "799c07.h22", 0x00001, 0x08000, CRC(176df538) SHA1(379e1de81afb85b1559de170cd2ab9f4af2b137e) )
|
||||
ROM_LOAD32_BYTE( "799c08.j22", 0x00002, 0x08000, CRC(d01e0078) SHA1(7ac242eb24271ac2783ec4d9e97ae051f1f3363a) )
|
||||
ROM_LOAD32_BYTE( "799c09.k22", 0x00003, 0x08000, CRC(9baec75e) SHA1(a8f6102c8fd46f18678f336bc44be31458ca9256) )
|
||||
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) // sprites
|
||||
ROM_LOAD32_WORD( "799b04.h4", 0x00000, 0x80000, CRC(323e0c2b) SHA1(c108d656b6ceff13c910739e4ca760acbb640de3) )
|
||||
ROM_LOAD32_WORD( "799b05.k4", 0x00002, 0x80000, CRC(571c5831) SHA1(2a18f0bcf6946ada6e0bde7edbd11afd4db1c170) )
|
||||
|
||||
ROM_REGION( 0x0100, "proms", 0 )
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(61f6c8d1) SHA1(c70f1f8e434aaaffb89e30e2230a08374ef324ad) ) /* priority encoder (not used) */
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(61f6c8d1) SHA1(c70f1f8e434aaaffb89e30e2230a08374ef324ad) ) // priority encoder (not used)
|
||||
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) /* 512k for 007232 samples */
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) // samples
|
||||
ROM_LOAD( "799b03.d4", 0x00000, 0x80000, CRC(f1cfd342) SHA1(079afc5c631de7f5b652d0ce6fd44b3aacd14a1b) )
|
||||
|
||||
ROM_REGION( 0x80000, "upd", 0 ) /* 512k for the UPD7759C samples */
|
||||
ROM_REGION( 0x80000, "upd", 0 ) // samples
|
||||
ROM_LOAD( "799b06.c22", 0x00000, 0x80000, CRC(2c8c47d7) SHA1(18a899767177ddfd870df9ed156d8bbc04b58a19) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( mainevt2p ) /* 2 players - English title screen - "Warning" message in the ROM (not displayed) */
|
||||
ROM_START( mainevt2p ) // 2 players - English title screen - "Warning" message in the ROM (not displayed)
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
ROM_LOAD( "799x02.k11", 0x00000, 0x10000, CRC(42cfc650) SHA1(2d1918ebc0d93a2356ad995a6854dbde7c3b8daf) )
|
||||
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 )
|
||||
ROM_LOAD( "799c01.f7", 0x00000, 0x08000, CRC(447c4c5c) SHA1(86e42132793c59cc6feece143516f7ecd4ed14e8) )
|
||||
|
||||
ROM_REGION( 0x20000, "k052109", 0 ) /* tiles */
|
||||
ROM_REGION( 0x20000, "k052109", 0 ) // tiles
|
||||
ROM_LOAD32_BYTE( "799c06.f22", 0x00000, 0x08000, CRC(f839cb58) SHA1(b36202ca2b68b6249c3f972ad09501e28a0162f7) )
|
||||
ROM_LOAD32_BYTE( "799c07.h22", 0x00001, 0x08000, CRC(176df538) SHA1(379e1de81afb85b1559de170cd2ab9f4af2b137e) )
|
||||
ROM_LOAD32_BYTE( "799c08.j22", 0x00002, 0x08000, CRC(d01e0078) SHA1(7ac242eb24271ac2783ec4d9e97ae051f1f3363a) )
|
||||
ROM_LOAD32_BYTE( "799c09.k22", 0x00003, 0x08000, CRC(9baec75e) SHA1(a8f6102c8fd46f18678f336bc44be31458ca9256) )
|
||||
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) // sprites
|
||||
ROM_LOAD32_WORD( "799b04.h4", 0x00000, 0x80000, CRC(323e0c2b) SHA1(c108d656b6ceff13c910739e4ca760acbb640de3) )
|
||||
ROM_LOAD32_WORD( "799b05.k4", 0x00002, 0x80000, CRC(571c5831) SHA1(2a18f0bcf6946ada6e0bde7edbd11afd4db1c170) )
|
||||
|
||||
ROM_REGION( 0x0100, "proms", 0 )
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(61f6c8d1) SHA1(c70f1f8e434aaaffb89e30e2230a08374ef324ad) ) /* priority encoder (not used) */
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(61f6c8d1) SHA1(c70f1f8e434aaaffb89e30e2230a08374ef324ad) ) // priority encoder (not used)
|
||||
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) /* 512k for 007232 samples */
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) // samples
|
||||
ROM_LOAD( "799b03.d4", 0x00000, 0x80000, CRC(f1cfd342) SHA1(079afc5c631de7f5b652d0ce6fd44b3aacd14a1b) )
|
||||
|
||||
ROM_REGION( 0x80000, "upd", 0 ) /* 512k for the UPD7759C samples */
|
||||
ROM_REGION( 0x80000, "upd", 0 ) // samples
|
||||
ROM_LOAD( "799b06.c22", 0x00000, 0x80000, CRC(2c8c47d7) SHA1(18a899767177ddfd870df9ed156d8bbc04b58a19) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( ringohja ) /* 2 players - Japan title screen - "Warning" message in the ROM (displayed) */
|
||||
ROM_START( ringohja ) // 2 players - Japan title screen - "Warning" message in the ROM (displayed)
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
ROM_LOAD( "799n02.k11", 0x00000, 0x10000, CRC(f9305dd0) SHA1(7135053be9d46ac9c09ab63eca1eb71825a71a13) )
|
||||
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 )
|
||||
ROM_LOAD( "799c01.f7", 0x00000, 0x08000, CRC(447c4c5c) SHA1(86e42132793c59cc6feece143516f7ecd4ed14e8) )
|
||||
|
||||
ROM_REGION( 0x20000, "k052109", 0 ) /* tiles */
|
||||
ROM_REGION( 0x20000, "k052109", 0 ) // tiles
|
||||
ROM_LOAD32_BYTE( "799c06.f22", 0x00000, 0x08000, CRC(f839cb58) SHA1(b36202ca2b68b6249c3f972ad09501e28a0162f7) )
|
||||
ROM_LOAD32_BYTE( "799c07.h22", 0x00001, 0x08000, CRC(176df538) SHA1(379e1de81afb85b1559de170cd2ab9f4af2b137e) )
|
||||
ROM_LOAD32_BYTE( "799c08.j22", 0x00002, 0x08000, CRC(d01e0078) SHA1(7ac242eb24271ac2783ec4d9e97ae051f1f3363a) )
|
||||
ROM_LOAD32_BYTE( "799c09.k22", 0x00003, 0x08000, CRC(9baec75e) SHA1(a8f6102c8fd46f18678f336bc44be31458ca9256) )
|
||||
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) // sprites
|
||||
ROM_LOAD32_WORD( "799b04.h4", 0x00000, 0x80000, CRC(323e0c2b) SHA1(c108d656b6ceff13c910739e4ca760acbb640de3) )
|
||||
ROM_LOAD32_WORD( "799b05.k4", 0x00002, 0x80000, CRC(571c5831) SHA1(2a18f0bcf6946ada6e0bde7edbd11afd4db1c170) )
|
||||
|
||||
ROM_REGION( 0x0100, "proms", 0 )
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(61f6c8d1) SHA1(c70f1f8e434aaaffb89e30e2230a08374ef324ad) ) /* priority encoder (not used) */
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(61f6c8d1) SHA1(c70f1f8e434aaaffb89e30e2230a08374ef324ad) ) // priority encoder (not used)
|
||||
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) /* 512k for 007232 samples */
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) // samples
|
||||
ROM_LOAD( "799b03.d4", 0x00000, 0x80000, CRC(f1cfd342) SHA1(079afc5c631de7f5b652d0ce6fd44b3aacd14a1b) )
|
||||
|
||||
ROM_REGION( 0x80000, "upd", 0 ) /* 512k for the UPD7759C samples */
|
||||
ROM_REGION( 0x80000, "upd", 0 ) // samples
|
||||
ROM_LOAD( "799b06.c22", 0x00000, 0x80000, CRC(2c8c47d7) SHA1(18a899767177ddfd870df9ed156d8bbc04b58a19) )
|
||||
ROM_END
|
||||
|
||||
@ -633,20 +847,20 @@ ROM_START( devstors )
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 )
|
||||
ROM_LOAD( "890k01.f7", 0x00000, 0x08000, CRC(d44b3eb0) SHA1(26109fc56668b65f1a5aa6d8ec2c08fd70ca7c51) )
|
||||
|
||||
ROM_REGION( 0x40000, "k052109", 0 ) /* tiles */
|
||||
ROM_REGION( 0x40000, "k052109", 0 ) // tiles
|
||||
ROM_LOAD32_BYTE( "890f06.f22", 0x00000, 0x10000, CRC(26592155) SHA1(aa1f8662f091ca1eb495223e41a35edd861ae9e9) )
|
||||
ROM_LOAD32_BYTE( "890f07.h22", 0x00001, 0x10000, CRC(6c74fa2e) SHA1(419a2ad31d269fafe4c474bf512e935d5e018846) )
|
||||
ROM_LOAD32_BYTE( "890f08.j22", 0x00002, 0x10000, CRC(29e12e80) SHA1(6d09e190055218e2dfd07838f1446dfb5f801206) )
|
||||
ROM_LOAD32_BYTE( "890f09.k22", 0x00003, 0x10000, CRC(67ca40d5) SHA1(ff719f55d2534ff076fbdd2bcb7d12c683bfe958) )
|
||||
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) // sprites
|
||||
ROM_LOAD32_WORD( "890f04.h4", 0x00000, 0x80000, CRC(f16cd1fa) SHA1(60ea19c19918a71aded3c9ea398c956908e217f1) )
|
||||
ROM_LOAD32_WORD( "890f05.k4", 0x00002, 0x80000, CRC(da37db05) SHA1(0b48d1021cf0dec78dae0ef183b4c61fea783533) )
|
||||
|
||||
ROM_REGION( 0x0100, "proms", 0 )
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(d3620106) SHA1(528a0a34754902d0f262a9619c6105da6de99354) ) /* priority encoder (not used) */
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(d3620106) SHA1(528a0a34754902d0f262a9619c6105da6de99354) ) // priority encoder (not used)
|
||||
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) /* 512k for 007232 samples */
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) // samples
|
||||
ROM_LOAD( "890f03.d4", 0x00000, 0x80000, CRC(19065031) SHA1(12c47fbe28f85fa2f901fe52601188a5e9633f22) )
|
||||
ROM_END
|
||||
|
||||
@ -657,20 +871,20 @@ ROM_START( devstorsx )
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 )
|
||||
ROM_LOAD( "890k01.f7", 0x00000, 0x08000, CRC(d44b3eb0) SHA1(26109fc56668b65f1a5aa6d8ec2c08fd70ca7c51) )
|
||||
|
||||
ROM_REGION( 0x40000, "k052109", 0 ) /* tiles */
|
||||
ROM_REGION( 0x40000, "k052109", 0 ) // tiles
|
||||
ROM_LOAD32_BYTE( "890f06.f22", 0x00000, 0x10000, CRC(26592155) SHA1(aa1f8662f091ca1eb495223e41a35edd861ae9e9) )
|
||||
ROM_LOAD32_BYTE( "890f07.h22", 0x00001, 0x10000, CRC(6c74fa2e) SHA1(419a2ad31d269fafe4c474bf512e935d5e018846) )
|
||||
ROM_LOAD32_BYTE( "890f08.j22", 0x00002, 0x10000, CRC(29e12e80) SHA1(6d09e190055218e2dfd07838f1446dfb5f801206) )
|
||||
ROM_LOAD32_BYTE( "890f09.k22", 0x00003, 0x10000, CRC(67ca40d5) SHA1(ff719f55d2534ff076fbdd2bcb7d12c683bfe958) )
|
||||
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) // sprites
|
||||
ROM_LOAD32_WORD( "890f04.h4", 0x00000, 0x80000, CRC(f16cd1fa) SHA1(60ea19c19918a71aded3c9ea398c956908e217f1) )
|
||||
ROM_LOAD32_WORD( "890f05.k4", 0x00002, 0x80000, CRC(da37db05) SHA1(0b48d1021cf0dec78dae0ef183b4c61fea783533) )
|
||||
|
||||
ROM_REGION( 0x0100, "proms", 0 )
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(d3620106) SHA1(528a0a34754902d0f262a9619c6105da6de99354) ) /* priority encoder (not used) */
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(d3620106) SHA1(528a0a34754902d0f262a9619c6105da6de99354) ) // priority encoder (not used)
|
||||
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) /* 512k for 007232 samples */
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) // samples
|
||||
ROM_LOAD( "890f03.d4", 0x00000, 0x80000, CRC(19065031) SHA1(12c47fbe28f85fa2f901fe52601188a5e9633f22) )
|
||||
ROM_END
|
||||
|
||||
@ -681,20 +895,20 @@ ROM_START( devstorsv )
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 )
|
||||
ROM_LOAD( "890k01.f7", 0x00000, 0x08000, CRC(d44b3eb0) SHA1(26109fc56668b65f1a5aa6d8ec2c08fd70ca7c51) )
|
||||
|
||||
ROM_REGION( 0x40000, "k052109", 0 ) /* tiles */
|
||||
ROM_REGION( 0x40000, "k052109", 0 ) // tiles
|
||||
ROM_LOAD32_BYTE( "890f06.f22", 0x00000, 0x10000, CRC(26592155) SHA1(aa1f8662f091ca1eb495223e41a35edd861ae9e9) )
|
||||
ROM_LOAD32_BYTE( "890f07.h22", 0x00001, 0x10000, CRC(6c74fa2e) SHA1(419a2ad31d269fafe4c474bf512e935d5e018846) )
|
||||
ROM_LOAD32_BYTE( "890f08.j22", 0x00002, 0x10000, CRC(29e12e80) SHA1(6d09e190055218e2dfd07838f1446dfb5f801206) )
|
||||
ROM_LOAD32_BYTE( "890f09.k22", 0x00003, 0x10000, CRC(67ca40d5) SHA1(ff719f55d2534ff076fbdd2bcb7d12c683bfe958) )
|
||||
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) // sprites
|
||||
ROM_LOAD32_WORD( "890f04.h4", 0x00000, 0x80000, CRC(f16cd1fa) SHA1(60ea19c19918a71aded3c9ea398c956908e217f1) )
|
||||
ROM_LOAD32_WORD( "890f05.k4", 0x00002, 0x80000, CRC(da37db05) SHA1(0b48d1021cf0dec78dae0ef183b4c61fea783533) )
|
||||
|
||||
ROM_REGION( 0x0100, "proms", 0 )
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(d3620106) SHA1(528a0a34754902d0f262a9619c6105da6de99354) ) /* priority encoder (not used) */
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(d3620106) SHA1(528a0a34754902d0f262a9619c6105da6de99354) ) // priority encoder (not used)
|
||||
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) /* 512k for 007232 samples */
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) // samples
|
||||
ROM_LOAD( "890f03.d4", 0x00000, 0x80000, CRC(19065031) SHA1(12c47fbe28f85fa2f901fe52601188a5e9633f22) )
|
||||
ROM_END
|
||||
|
||||
@ -705,20 +919,20 @@ ROM_START( devstors2 )
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 )
|
||||
ROM_LOAD( "890k01.f7", 0x00000, 0x08000, CRC(d44b3eb0) SHA1(26109fc56668b65f1a5aa6d8ec2c08fd70ca7c51) )
|
||||
|
||||
ROM_REGION( 0x40000, "k052109", 0 ) /* tiles */
|
||||
ROM_REGION( 0x40000, "k052109", 0 ) // tiles
|
||||
ROM_LOAD32_BYTE( "890f06.f22", 0x00000, 0x10000, CRC(26592155) SHA1(aa1f8662f091ca1eb495223e41a35edd861ae9e9) )
|
||||
ROM_LOAD32_BYTE( "890f07.h22", 0x00001, 0x10000, CRC(6c74fa2e) SHA1(419a2ad31d269fafe4c474bf512e935d5e018846) )
|
||||
ROM_LOAD32_BYTE( "890f08.j22", 0x00002, 0x10000, CRC(29e12e80) SHA1(6d09e190055218e2dfd07838f1446dfb5f801206) )
|
||||
ROM_LOAD32_BYTE( "890f09.k22", 0x00003, 0x10000, CRC(67ca40d5) SHA1(ff719f55d2534ff076fbdd2bcb7d12c683bfe958) )
|
||||
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) // sprites
|
||||
ROM_LOAD32_WORD( "890f04.h4", 0x00000, 0x80000, CRC(f16cd1fa) SHA1(60ea19c19918a71aded3c9ea398c956908e217f1) )
|
||||
ROM_LOAD32_WORD( "890f05.k4", 0x00002, 0x80000, CRC(da37db05) SHA1(0b48d1021cf0dec78dae0ef183b4c61fea783533) )
|
||||
|
||||
ROM_REGION( 0x0100, "proms", 0 )
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(d3620106) SHA1(528a0a34754902d0f262a9619c6105da6de99354) ) /* priority encoder (not used) */
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(d3620106) SHA1(528a0a34754902d0f262a9619c6105da6de99354) ) // priority encoder (not used)
|
||||
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) /* 512k for 007232 samples */
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) // samples
|
||||
ROM_LOAD( "890f03.d4", 0x00000, 0x80000, CRC(19065031) SHA1(12c47fbe28f85fa2f901fe52601188a5e9633f22) )
|
||||
ROM_END
|
||||
|
||||
@ -729,31 +943,32 @@ ROM_START( garuka )
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 )
|
||||
ROM_LOAD( "890k01.f7", 0x00000, 0x08000, CRC(d44b3eb0) SHA1(26109fc56668b65f1a5aa6d8ec2c08fd70ca7c51) )
|
||||
|
||||
ROM_REGION( 0x40000, "k052109", 0 ) /* tiles */
|
||||
ROM_REGION( 0x40000, "k052109", 0 ) // tiles
|
||||
ROM_LOAD32_BYTE( "890f06.f22", 0x00000, 0x10000, CRC(26592155) SHA1(aa1f8662f091ca1eb495223e41a35edd861ae9e9) )
|
||||
ROM_LOAD32_BYTE( "890f07.h22", 0x00001, 0x10000, CRC(6c74fa2e) SHA1(419a2ad31d269fafe4c474bf512e935d5e018846) )
|
||||
ROM_LOAD32_BYTE( "890f08.j22", 0x00002, 0x10000, CRC(29e12e80) SHA1(6d09e190055218e2dfd07838f1446dfb5f801206) )
|
||||
ROM_LOAD32_BYTE( "890f09.k22", 0x00003, 0x10000, CRC(67ca40d5) SHA1(ff719f55d2534ff076fbdd2bcb7d12c683bfe958) )
|
||||
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */
|
||||
ROM_REGION( 0x100000, "k051960", 0 ) // sprites
|
||||
ROM_LOAD32_WORD( "890f04.h4", 0x00000, 0x80000, CRC(f16cd1fa) SHA1(60ea19c19918a71aded3c9ea398c956908e217f1) )
|
||||
ROM_LOAD32_WORD( "890f05.k4", 0x00002, 0x80000, CRC(da37db05) SHA1(0b48d1021cf0dec78dae0ef183b4c61fea783533) )
|
||||
|
||||
ROM_REGION( 0x0100, "proms", 0 )
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(d3620106) SHA1(528a0a34754902d0f262a9619c6105da6de99354) ) /* priority encoder (not used) */
|
||||
ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(d3620106) SHA1(528a0a34754902d0f262a9619c6105da6de99354) ) // priority encoder (not used)
|
||||
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) /* 512k for 007232 samples */
|
||||
ROM_REGION( 0x80000, "k007232", 0 ) // samples
|
||||
ROM_LOAD( "890f03.d4", 0x00000, 0x80000, CRC(19065031) SHA1(12c47fbe28f85fa2f901fe52601188a5e9633f22) )
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
GAME( 1988, mainevt, 0, mainevt, mainevt, mainevt_state, empty_init, ROT0, "Konami", "The Main Event (4 Players ver. Y)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, mainevto, mainevt, mainevt, mainevt, mainevt_state, empty_init, ROT0, "Konami", "The Main Event (4 Players ver. F)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, mainevt2p, mainevt, mainevt, mainev2p, mainevt_state, empty_init, ROT0, "Konami", "The Main Event (2 Players ver. X)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, ringohja, mainevt, mainevt, mainev2p, mainevt_state, empty_init, ROT0, "Konami", "Ring no Ohja (Japan 2 Players ver. N)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, devstors, 0, devstors, devstors, mainevt_state, empty_init, ROT90, "Konami", "Devastators (ver. Z)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION )
|
||||
GAME( 1988, devstorsx, devstors, devstors, devstors_ct, mainevt_state, empty_init, ROT90, "Konami", "Devastators (ver. X)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION )
|
||||
GAME( 1988, devstorsv, devstors, devstors, devstors, mainevt_state, empty_init, ROT90, "Konami", "Devastators (ver. V)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION )
|
||||
GAME( 1988, devstors2, devstors, devstors, devstors_ct, mainevt_state, empty_init, ROT90, "Konami", "Devastators (ver. 2)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION )
|
||||
GAME( 1988, garuka, devstors, devstors, devstors_ct, mainevt_state, empty_init, ROT90, "Konami", "Garuka (Japan ver. W)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION )
|
||||
GAME( 1988, mainevt, 0, mainevt, mainevt, mainevt_state, empty_init, ROT0, "Konami", "The Main Event (4 Players ver. Y)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, mainevto, mainevt, mainevt, mainevt, mainevt_state, empty_init, ROT0, "Konami", "The Main Event (4 Players ver. F)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, mainevt2p, mainevt, mainevt, mainev2p, mainevt_state, empty_init, ROT0, "Konami", "The Main Event (2 Players ver. X)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, ringohja, mainevt, mainevt, mainev2p, mainevt_state, empty_init, ROT0, "Konami", "Ring no Ohja (Japan 2 Players ver. N)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, devstors, 0, devstors, devstors, devstors_state, empty_init, ROT90, "Konami", "Devastators (ver. Z)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION )
|
||||
GAME( 1988, devstorsx, devstors, devstors, devstors_ct, devstors_state, empty_init, ROT90, "Konami", "Devastators (ver. X)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION )
|
||||
GAME( 1988, devstorsv, devstors, devstors, devstors, devstors_state, empty_init, ROT90, "Konami", "Devastators (ver. V)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION )
|
||||
GAME( 1988, devstors2, devstors, devstors, devstors_ct, devstors_state, empty_init, ROT90, "Konami", "Devastators (ver. 2)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION )
|
||||
GAME( 1988, garuka, devstors, devstors, devstors_ct, devstors_state, empty_init, ROT90, "Konami", "Garuka (Japan ver. W)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION )
|
||||
|
@ -1,84 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Bryan McPhail
|
||||
/*************************************************************************
|
||||
|
||||
The Main Event / Devastators
|
||||
|
||||
*************************************************************************/
|
||||
#ifndef MAME_INCLUDES_MAINEVT_H
|
||||
#define MAME_INCLUDES_MAINEVT_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "sound/upd7759.h"
|
||||
#include "sound/k007232.h"
|
||||
#include "k052109.h"
|
||||
#include "k051960.h"
|
||||
#include "k051733.h"
|
||||
#include "konami_helper.h"
|
||||
|
||||
class mainevt_state : public driver_device
|
||||
{
|
||||
public:
|
||||
mainevt_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_upd7759(*this, "upd")
|
||||
, m_k007232(*this, "k007232")
|
||||
, m_k052109(*this, "k052109")
|
||||
, m_k051960(*this, "k051960")
|
||||
, m_rombank(*this, "rombank")
|
||||
, m_leds(*this, "led%u", 0U)
|
||||
{ }
|
||||
|
||||
void devstors(machine_config &config);
|
||||
void mainevt(machine_config &config);
|
||||
|
||||
private:
|
||||
void dv_nmienable_w(uint8_t data);
|
||||
void mainevt_bankswitch_w(uint8_t data);
|
||||
void mainevt_coin_w(uint8_t data);
|
||||
void mainevt_sh_irqtrigger_w(uint8_t data);
|
||||
void mainevt_sh_irqcontrol_w(uint8_t data);
|
||||
void devstor_sh_irqcontrol_w(uint8_t data);
|
||||
void mainevt_sh_bankswitch_w(uint8_t data);
|
||||
uint8_t k052109_051960_r(offs_t offset);
|
||||
void k052109_051960_w(offs_t offset, uint8_t data);
|
||||
uint8_t mainevt_sh_busy_r();
|
||||
void dv_sh_bankswitch_w(uint8_t data);
|
||||
uint32_t screen_update_mainevt(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
uint32_t screen_update_dv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(dv_vblank_w);
|
||||
INTERRUPT_GEN_MEMBER(mainevt_sound_timer_irq);
|
||||
INTERRUPT_GEN_MEMBER(devstors_sound_timer_irq);
|
||||
void volume_callback(uint8_t data);
|
||||
K052109_CB_MEMBER(mainevt_tile_callback);
|
||||
K052109_CB_MEMBER(dv_tile_callback);
|
||||
K051960_CB_MEMBER(mainevt_sprite_callback);
|
||||
K051960_CB_MEMBER(dv_sprite_callback);
|
||||
void devstors_map(address_map &map);
|
||||
void devstors_sound_map(address_map &map);
|
||||
void mainevt_map(address_map &map);
|
||||
void mainevt_sound_map(address_map &map);
|
||||
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
|
||||
/* misc */
|
||||
int m_nmi_enable = 0;
|
||||
uint8_t m_sound_irq_mask = 0;
|
||||
|
||||
/* devices */
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
optional_device<upd7759_device> m_upd7759;
|
||||
required_device<k007232_device> m_k007232;
|
||||
required_device<k052109_device> m_k052109;
|
||||
required_device<k051960_device> m_k051960;
|
||||
|
||||
required_memory_bank m_rombank;
|
||||
output_finder<4> m_leds;
|
||||
};
|
||||
|
||||
#endif // MAME_INCLUDES_MAINEVT_H
|
@ -1,100 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Bryan McPhail
|
||||
/***************************************************************************
|
||||
|
||||
video.c
|
||||
|
||||
Functions to emulate the video hardware of the machine.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "mainevt.h"
|
||||
#include "screen.h"
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Callbacks for the K052109
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
K052109_CB_MEMBER(mainevt_state::mainevt_tile_callback)
|
||||
{
|
||||
static const int layer_colorbase[] = { 0 / 16, 128 / 16, 64 / 16 };
|
||||
|
||||
*flags = (*color & 0x02) ? TILE_FLIPX : 0;
|
||||
|
||||
/* priority relative to HALF priority sprites */
|
||||
*priority = (layer == 2) ? (*color & 0x20) >> 5 : 0;
|
||||
*code |= ((*color & 0x01) << 8) | ((*color & 0x1c) << 7);
|
||||
*color = layer_colorbase[layer] + ((*color & 0xc0) >> 6);
|
||||
}
|
||||
|
||||
K052109_CB_MEMBER(mainevt_state::dv_tile_callback)
|
||||
{
|
||||
static const int layer_colorbase[] = { 0 / 16, 0 / 16, 64 / 16 };
|
||||
|
||||
/* (color & 0x02) is flip y handled internally by the 052109 */
|
||||
*code |= ((*color & 0x01) << 8) | ((*color & 0x3c) << 7);
|
||||
*color = layer_colorbase[layer] + ((*color & 0xc0) >> 6);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Callbacks for the K051960
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
K051960_CB_MEMBER(mainevt_state::mainevt_sprite_callback)
|
||||
{
|
||||
enum { sprite_colorbase = 192 / 16 };
|
||||
|
||||
/* bit 5 = priority over layer B (has precedence) */
|
||||
/* bit 6 = HALF priority over layer B (used for crowd when you get out of the ring) */
|
||||
if (*color & 0x20)
|
||||
*priority = 0xff00;
|
||||
else if (*color & 0x40)
|
||||
*priority = 0xff00 | 0xf0f0;
|
||||
else
|
||||
*priority = 0xff00 | 0xf0f0 | 0xcccc;
|
||||
/* bit 7 is shadow, not used */
|
||||
|
||||
*color = sprite_colorbase + (*color & 0x03);
|
||||
}
|
||||
|
||||
K051960_CB_MEMBER(mainevt_state::dv_sprite_callback)
|
||||
{
|
||||
enum { sprite_colorbase = 128 / 16 };
|
||||
|
||||
/* TODO: the priority/shadow handling (bits 5-7) seems to be quite complex (see PROM) */
|
||||
*color = sprite_colorbase + (*color & 0x07);
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
uint32_t mainevt_state::screen_update_mainevt(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
m_k052109->tilemap_update();
|
||||
|
||||
screen.priority().fill(0, cliprect);
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 1);
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 1, 2); /* low priority part of layer */
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 0, 4); /* high priority part of layer */
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 8);
|
||||
|
||||
m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), -1, -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t mainevt_state::screen_update_dv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
m_k052109->tilemap_update();
|
||||
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 0);
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 0, 0);
|
||||
m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), 0, 0);
|
||||
m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 0);
|
||||
return 0;
|
||||
}
|
@ -1,8 +1,10 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Allard van der Bas
|
||||
// copyright-holders: Allard van der Bas
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Mikie memory map (preliminary)
|
||||
GX469
|
||||
|
||||
driver by Allard van der Bas
|
||||
|
||||
@ -39,26 +41,235 @@ Stephh's notes (based on the games M6809 code and some tests) :
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "mikie.h"
|
||||
|
||||
#include "konamipt.h"
|
||||
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "cpu/m6809/m6809.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/74259.h"
|
||||
#include "machine/gen_latch.h"
|
||||
#include "machine/watchdog.h"
|
||||
#include "sound/sn76496.h"
|
||||
#include "video/resnet.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
|
||||
#define MIKIE_TIMER_RATE 512
|
||||
namespace {
|
||||
|
||||
#define XTAL 14318180
|
||||
#define OSC 18432000
|
||||
#define CLK XTAL/4
|
||||
class mikie_state : public driver_device
|
||||
{
|
||||
public:
|
||||
mikie_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_colorram(*this, "colorram"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_audiocpu(*this, "audiocpu"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void mikie(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
virtual void video_start() override;
|
||||
|
||||
private:
|
||||
// memory pointers
|
||||
required_shared_ptr<uint8_t> m_spriteram;
|
||||
required_shared_ptr<uint8_t> m_colorram;
|
||||
required_shared_ptr<uint8_t> m_videoram;
|
||||
|
||||
// devices
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
// video-related
|
||||
tilemap_t *m_bg_tilemap = nullptr;
|
||||
uint8_t m_palettebank = 0;
|
||||
|
||||
uint8_t m_irq_mask = 0;
|
||||
|
||||
uint8_t sh_timer_r();
|
||||
DECLARE_WRITE_LINE_MEMBER(sh_irqtrigger_w);
|
||||
template <uint8_t Which> DECLARE_WRITE_LINE_MEMBER(coin_counter_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(irq_mask_w);
|
||||
void videoram_w(offs_t offset, uint8_t data);
|
||||
void colorram_w(offs_t offset, uint8_t data);
|
||||
void palettebank_w(uint8_t data);
|
||||
DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
void palette(palette_device &palette) const;
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
|
||||
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void main_map(address_map &map);
|
||||
void sound_map(address_map &map);
|
||||
};
|
||||
|
||||
|
||||
// video
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Convert the color PROMs into a more useable format.
|
||||
|
||||
Mikie has three 256x4 palette PROMs (one per gun) and two 256x4 lookup
|
||||
table PROMs (one for characters, one for sprites).
|
||||
I don't know for sure how the palette PROMs are connected to the RGB
|
||||
output, but it's probably the usual:
|
||||
|
||||
bit 3 -- 220 ohm resistor -- RED/GREEN/BLUE
|
||||
-- 470 ohm resistor -- RED/GREEN/BLUE
|
||||
-- 1 kohm resistor -- RED/GREEN/BLUE
|
||||
bit 0 -- 2.2kohm resistor -- RED/GREEN/BLUE
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void mikie_state::palette(palette_device &palette) const
|
||||
{
|
||||
uint8_t const *color_prom = memregion("proms")->base();
|
||||
static constexpr int resistances[4] = { 2200, 1000, 470, 220 };
|
||||
|
||||
// compute the color output resistor weights
|
||||
double rweights[4], gweights[4], bweights[4];
|
||||
compute_resistor_weights(0, 255, -1.0,
|
||||
4, resistances, rweights, 470, 0,
|
||||
4, resistances, gweights, 470, 0,
|
||||
4, resistances, bweights, 470, 0);
|
||||
|
||||
// create a lookup table for the palette
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
int bit0, bit1, bit2, bit3;
|
||||
|
||||
// red component
|
||||
bit0 = BIT(color_prom[i + 0x000], 0);
|
||||
bit1 = BIT(color_prom[i + 0x000], 1);
|
||||
bit2 = BIT(color_prom[i + 0x000], 2);
|
||||
bit3 = BIT(color_prom[i + 0x000], 3);
|
||||
int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
|
||||
|
||||
// green component
|
||||
bit0 = BIT(color_prom[i + 0x100], 0);
|
||||
bit1 = BIT(color_prom[i + 0x100], 1);
|
||||
bit2 = BIT(color_prom[i + 0x100], 2);
|
||||
bit3 = BIT(color_prom[i + 0x100], 3);
|
||||
int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
|
||||
|
||||
// blue component
|
||||
bit0 = BIT(color_prom[i + 0x200], 0);
|
||||
bit1 = BIT(color_prom[i + 0x200], 1);
|
||||
bit2 = BIT(color_prom[i + 0x200], 2);
|
||||
bit3 = BIT(color_prom[i + 0x200], 3);
|
||||
int const b = combine_weights(bweights, bit0, bit1, bit2, bit3);
|
||||
|
||||
palette.set_indirect_color(i, rgb_t(r, g, b));
|
||||
}
|
||||
|
||||
// color_prom now points to the beginning of the lookup table,
|
||||
color_prom += 0x300;
|
||||
|
||||
// characters use colors 0x10-0x1f of each 0x20 color bank, while sprites use colors 0-0x0f
|
||||
for (int i = 0; i < 0x200; i++)
|
||||
{
|
||||
for (int j = 0; j < 8; j++)
|
||||
{
|
||||
uint8_t const ctabentry = (j << 5) | ((~i & 0x100) >> 4) | (color_prom[i] & 0x0f);
|
||||
m_palette->set_pen_indirect(((i & 0x100) << 3) | (j << 8) | (i & 0xff), ctabentry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void mikie_state::videoram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_videoram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
void mikie_state::colorram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_colorram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
void mikie_state::palettebank_w(uint8_t data)
|
||||
{
|
||||
if (m_palettebank != (data & 0x07))
|
||||
{
|
||||
m_palettebank = data & 0x07;
|
||||
machine().tilemap().mark_all_dirty();
|
||||
}
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(mikie_state::flipscreen_w)
|
||||
{
|
||||
flip_screen_set(state);
|
||||
machine().tilemap().mark_all_dirty();
|
||||
}
|
||||
|
||||
TILE_GET_INFO_MEMBER(mikie_state::get_bg_tile_info)
|
||||
{
|
||||
int const code = m_videoram[tile_index] + ((m_colorram[tile_index] & 0x20) << 3);
|
||||
int const color = (m_colorram[tile_index] & 0x0f) + 16 * m_palettebank;
|
||||
int const flags = ((m_colorram[tile_index] & 0x40) ? TILE_FLIPX : 0) | ((m_colorram[tile_index] & 0x80) ? TILE_FLIPY : 0);
|
||||
if (m_colorram[tile_index] & 0x10)
|
||||
tileinfo.category = 1;
|
||||
else
|
||||
tileinfo.category = 0;
|
||||
|
||||
tileinfo.set(0, code, color, flags);
|
||||
}
|
||||
|
||||
void mikie_state::video_start()
|
||||
{
|
||||
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(mikie_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
}
|
||||
|
||||
void mikie_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
for (int offs = 0; offs < m_spriteram.bytes(); offs += 4)
|
||||
{
|
||||
int const gfxbank = (m_spriteram[offs + 2] & 0x40) ? 2 : 1;
|
||||
int const code = (m_spriteram[offs + 2] & 0x3f) + ((m_spriteram[offs + 2] & 0x80) >> 1) + ((m_spriteram[offs] & 0x40) << 1);
|
||||
int const color = (m_spriteram[offs] & 0x0f) + 16 * m_palettebank;
|
||||
int const sx = m_spriteram[offs + 3];
|
||||
int sy = 244 - m_spriteram[offs + 1];
|
||||
int const flipx = ~m_spriteram[offs] & 0x10;
|
||||
int flipy = m_spriteram[offs] & 0x20;
|
||||
|
||||
if (flip_screen())
|
||||
{
|
||||
sy = 242 - sy;
|
||||
flipy = !flipy;
|
||||
}
|
||||
|
||||
|
||||
m_gfxdecode->gfx(gfxbank)->transpen(bitmap, cliprect,
|
||||
code, color,
|
||||
flipx, flipy,
|
||||
sx, sy, 0);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t mikie_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(0), 0);
|
||||
draw_sprites(bitmap, cliprect);
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(1), 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// machine
|
||||
|
||||
/*************************************
|
||||
*
|
||||
@ -66,9 +277,11 @@ Stephh's notes (based on the games M6809 code and some tests) :
|
||||
*
|
||||
*************************************/
|
||||
|
||||
uint8_t mikie_state::mikie_sh_timer_r()
|
||||
uint8_t mikie_state::sh_timer_r()
|
||||
{
|
||||
int clock = m_audiocpu->total_cycles() / MIKIE_TIMER_RATE;
|
||||
static constexpr int MIKIE_TIMER_RATE = 512;
|
||||
|
||||
int const clock = m_audiocpu->total_cycles() / MIKIE_TIMER_RATE;
|
||||
|
||||
return clock;
|
||||
}
|
||||
@ -82,14 +295,10 @@ WRITE_LINE_MEMBER(mikie_state::sh_irqtrigger_w)
|
||||
}
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(mikie_state::coin_counter_1_w)
|
||||
template <uint8_t Which>
|
||||
WRITE_LINE_MEMBER(mikie_state::coin_counter_w)
|
||||
{
|
||||
machine().bookkeeping().coin_counter_w(0, state);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(mikie_state::coin_counter_2_w)
|
||||
{
|
||||
machine().bookkeeping().coin_counter_w(1, state);
|
||||
machine().bookkeeping().coin_counter_w(Which, state);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(mikie_state::irq_mask_w)
|
||||
@ -105,12 +314,12 @@ WRITE_LINE_MEMBER(mikie_state::irq_mask_w)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void mikie_state::mikie_map(address_map &map)
|
||||
void mikie_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x00ff).ram();
|
||||
map(0x2000, 0x2007).w("mainlatch", FUNC(ls259_device::write_d0));
|
||||
map(0x2100, 0x2100).w("watchdog", FUNC(watchdog_timer_device::reset_w));
|
||||
map(0x2200, 0x2200).w(FUNC(mikie_state::mikie_palettebank_w));
|
||||
map(0x2200, 0x2200).w(FUNC(mikie_state::palettebank_w));
|
||||
map(0x2300, 0x2300).nopw(); // ???
|
||||
map(0x2400, 0x2400).portr("SYSTEM").w("soundlatch", FUNC(generic_latch_8_device::write));
|
||||
map(0x2401, 0x2401).portr("P1");
|
||||
@ -118,11 +327,11 @@ void mikie_state::mikie_map(address_map &map)
|
||||
map(0x2403, 0x2403).portr("DSW3");
|
||||
map(0x2500, 0x2500).portr("DSW1");
|
||||
map(0x2501, 0x2501).portr("DSW2");
|
||||
map(0x2800, 0x288f).ram().share("spriteram");
|
||||
map(0x2800, 0x288f).ram().share(m_spriteram);
|
||||
map(0x2890, 0x37ff).ram();
|
||||
map(0x3800, 0x3bff).ram().w(FUNC(mikie_state::mikie_colorram_w)).share("colorram");
|
||||
map(0x3c00, 0x3fff).ram().w(FUNC(mikie_state::mikie_videoram_w)).share("videoram");
|
||||
map(0x4000, 0x5fff).rom(); // Machine checks for extra rom
|
||||
map(0x3800, 0x3bff).ram().w(FUNC(mikie_state::colorram_w)).share(m_colorram);
|
||||
map(0x3c00, 0x3fff).ram().w(FUNC(mikie_state::videoram_w)).share(m_videoram);
|
||||
map(0x4000, 0x5fff).rom(); // Machine checks for extra ROM
|
||||
map(0x6000, 0xffff).rom();
|
||||
}
|
||||
|
||||
@ -135,7 +344,7 @@ void mikie_state::sound_map(address_map &map)
|
||||
map(0x8002, 0x8002).w("sn1", FUNC(sn76489a_device::write)); // trigger read of latch
|
||||
map(0x8003, 0x8003).r("soundlatch", FUNC(generic_latch_8_device::read));
|
||||
map(0x8004, 0x8004).w("sn2", FUNC(sn76489a_device::write)); // trigger read of latch
|
||||
map(0x8005, 0x8005).r(FUNC(mikie_state::mikie_sh_timer_r));
|
||||
map(0x8005, 0x8005).r(FUNC(mikie_state::sh_timer_r));
|
||||
map(0x8079, 0x8079).nopw(); // ???
|
||||
map(0xa003, 0xa003).nopw(); // ???
|
||||
}
|
||||
@ -146,7 +355,7 @@ void mikie_state::sound_map(address_map &map)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
/* verified from M6809 code */
|
||||
// verified from M6809 code
|
||||
static INPUT_PORTS_START( mikie )
|
||||
PORT_START("SYSTEM")
|
||||
KONAMI8_SYSTEM_UNK
|
||||
@ -159,7 +368,7 @@ static INPUT_PORTS_START( mikie )
|
||||
|
||||
PORT_START("DSW1")
|
||||
KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1)
|
||||
/* "No Coin B" = coins produce sound, but no effect on coin counter */
|
||||
// "No Coin B" = coins produce sound, but no effect on coin counter
|
||||
|
||||
PORT_START("DSW2")
|
||||
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
|
||||
@ -184,7 +393,7 @@ static INPUT_PORTS_START( mikie )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
|
||||
/* DSW3 is not mounted on PCB nor listed in manual */
|
||||
// DSW3 is not mounted on PCB nor listed in manual
|
||||
PORT_START("DSW3")
|
||||
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Flip_Screen ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
@ -204,17 +413,6 @@ INPUT_PORTS_END
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static const gfx_layout charlayout =
|
||||
{
|
||||
8,8, /* 8*8 characters */
|
||||
512, /* 512 characters */
|
||||
4, /* 4 bits per pixel */
|
||||
{ 0, 1, 2, 3 }, /* the bitplanes are packed */
|
||||
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
|
||||
{ 0*4*8, 1*4*8, 2*4*8, 3*4*8, 4*4*8, 5*4*8, 6*4*8, 7*4*8 },
|
||||
8*4*8 /* every char takes 32 consecutive bytes */
|
||||
};
|
||||
|
||||
static const gfx_layout spritelayout =
|
||||
{
|
||||
16,16, /* 16*16 sprites */
|
||||
@ -229,9 +427,9 @@ static const gfx_layout spritelayout =
|
||||
};
|
||||
|
||||
static GFXDECODE_START( gfx_mikie )
|
||||
GFXDECODE_ENTRY( "gfx1", 0x0000, charlayout, 0, 16*8 )
|
||||
GFXDECODE_ENTRY( "gfx2", 0x0000, spritelayout, 16*8*16, 16*8 )
|
||||
GFXDECODE_ENTRY( "gfx2", 0x0001, spritelayout, 16*8*16, 16*8 )
|
||||
GFXDECODE_ENTRY( "tiles", 0x0000, gfx_8x8x4_packed_msb, 0, 16*8 )
|
||||
GFXDECODE_ENTRY( "sprites", 0x0000, spritelayout, 16*8*16, 16*8 )
|
||||
GFXDECODE_ENTRY( "sprites", 0x0001, spritelayout, 16*8*16, 16*8 )
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
@ -260,16 +458,20 @@ WRITE_LINE_MEMBER(mikie_state::vblank_irq)
|
||||
|
||||
void mikie_state::mikie(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
MC6809E(config, m_maincpu, OSC/12); // 9A (surface scratched)
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &mikie_state::mikie_map);
|
||||
static constexpr XTAL AUDIO_XTAL = XTAL(14'318'181);
|
||||
static constexpr XTAL OSC = XTAL(18'432'000);
|
||||
static constexpr XTAL CLK = AUDIO_XTAL / 4;
|
||||
|
||||
// basic machine hardware
|
||||
MC6809E(config, m_maincpu, OSC / 12); // 9A (surface scratched)
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &mikie_state::main_map);
|
||||
|
||||
Z80(config, m_audiocpu, CLK); // 4E (surface scratched)
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &mikie_state::sound_map);
|
||||
|
||||
ls259_device &mainlatch(LS259(config, "mainlatch")); // 6I
|
||||
mainlatch.q_out_cb<0>().set(FUNC(mikie_state::coin_counter_1_w)); // COIN1
|
||||
mainlatch.q_out_cb<1>().set(FUNC(mikie_state::coin_counter_2_w)); // COIN2
|
||||
mainlatch.q_out_cb<0>().set(FUNC(mikie_state::coin_counter_w<0>)); // COIN1
|
||||
mainlatch.q_out_cb<1>().set(FUNC(mikie_state::coin_counter_w<1>)); // COIN2
|
||||
mainlatch.q_out_cb<2>().set(FUNC(mikie_state::sh_irqtrigger_w)); // SOUNDON
|
||||
mainlatch.q_out_cb<3>().set_nop(); // END (not used?)
|
||||
mainlatch.q_out_cb<6>().set(FUNC(mikie_state::flipscreen_w)); // FLIP
|
||||
@ -277,25 +479,25 @@ void mikie_state::mikie(machine_config &config)
|
||||
|
||||
WATCHDOG_TIMER(config, "watchdog");
|
||||
|
||||
/* video hardware */
|
||||
// video hardware
|
||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
||||
screen.set_refresh_hz(60.59);
|
||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
||||
screen.set_size(32*8, 32*8);
|
||||
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
|
||||
screen.set_screen_update(FUNC(mikie_state::screen_update_mikie));
|
||||
screen.set_screen_update(FUNC(mikie_state::screen_update));
|
||||
screen.set_palette(m_palette);
|
||||
screen.screen_vblank().set(FUNC(mikie_state::vblank_irq));
|
||||
|
||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mikie);
|
||||
PALETTE(config, m_palette, FUNC(mikie_state::mikie_palette), 16*8*16+16*8*16, 256);
|
||||
PALETTE(config, m_palette, FUNC(mikie_state::palette), 16*8*16+16*8*16, 256);
|
||||
|
||||
/* sound hardware */
|
||||
// sound hardware
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
GENERIC_LATCH_8(config, "soundlatch");
|
||||
|
||||
SN76489A(config, "sn1", XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.60);
|
||||
SN76489A(config, "sn1", AUDIO_XTAL / 8).add_route(ALL_OUTPUTS, "mono", 0.60);
|
||||
|
||||
SN76489A(config, "sn2", CLK).add_route(ALL_OUTPUTS, "mono", 0.60);
|
||||
}
|
||||
@ -315,10 +517,10 @@ ROM_START( mikie )
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 )
|
||||
ROM_LOAD( "n10.6e", 0x0000, 0x2000, CRC(2cf9d670) SHA1(b324b92aff70d7878160128611dd5fdec6949659) )
|
||||
|
||||
ROM_REGION( 0x4000, "gfx1", 0 )
|
||||
ROM_REGION( 0x4000, "tiles", 0 )
|
||||
ROM_LOAD( "o11.8i", 0x0000, 0x4000, CRC(3c82aaf3) SHA1(c84256ac5fd5e40b197651c56e303c69aae72950) )
|
||||
|
||||
ROM_REGION( 0x10000, "gfx2", 0 )
|
||||
ROM_REGION( 0x10000, "sprites", 0 )
|
||||
ROM_LOAD( "001.f1", 0x0000, 0x4000, CRC(a2ba0df5) SHA1(873d49c1c2efbb222d1bf63396729d4b7d9477c3) )
|
||||
ROM_LOAD( "003.f3", 0x4000, 0x4000, CRC(9775ab32) SHA1(0271567c5f5a6bb2eaffb9d5dc2af6b8142dc8a9) )
|
||||
ROM_LOAD( "005.h1", 0x8000, 0x4000, CRC(ba44aeef) SHA1(410bfd9146242254a920092e280af87586709527) )
|
||||
@ -341,10 +543,10 @@ ROM_START( mikiej )
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 )
|
||||
ROM_LOAD( "n10.6e", 0x0000, 0x2000, CRC(2cf9d670) SHA1(b324b92aff70d7878160128611dd5fdec6949659) )
|
||||
|
||||
ROM_REGION( 0x4000, "gfx1", 0 )
|
||||
ROM_REGION( 0x4000, "tiles", 0 )
|
||||
ROM_LOAD( "q11.8i", 0x0000, 0x4000, CRC(c48b269b) SHA1(d7fcfa44fcda90f1a7df6c974210716ae82c47a3) )
|
||||
|
||||
ROM_REGION( 0x10000, "gfx2", 0 )
|
||||
ROM_REGION( 0x10000, "sprites", 0 )
|
||||
ROM_LOAD( "q01.f1", 0x0000, 0x4000, CRC(31551987) SHA1(b6cbdb8b511d99b27546a6c4d01f2948d5ad3a42) )
|
||||
ROM_LOAD( "q03.f3", 0x4000, 0x4000, CRC(34414df0) SHA1(0189deac6f19de386b4e49cfe6322b212e74264a) )
|
||||
ROM_LOAD( "q05.h1", 0x8000, 0x4000, CRC(f9e1ebb1) SHA1(c88c1fc22f21b3e7d558c47de2716dac01fdd621) )
|
||||
@ -367,10 +569,10 @@ ROM_START( mikiek )
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 )
|
||||
ROM_LOAD( "n10.6e", 0x0000, 0x2000, CRC(2cf9d670) SHA1(b324b92aff70d7878160128611dd5fdec6949659) )
|
||||
|
||||
ROM_REGION( 0x4000, "gfx1", 0 )
|
||||
ROM_REGION( 0x4000, "tiles", 0 )
|
||||
ROM_LOAD( "q11.8i", 0x0000, 0x4000, CRC(29286fce) SHA1(699706cf7300c98352e355f81ba40635b4380d7a) )
|
||||
|
||||
ROM_REGION( 0x10000, "gfx2", 0 )
|
||||
ROM_REGION( 0x10000, "sprites", 0 )
|
||||
ROM_LOAD( "q01.f1", 0x0000, 0x4000, CRC(31551987) SHA1(b6cbdb8b511d99b27546a6c4d01f2948d5ad3a42) )
|
||||
ROM_LOAD( "q03.f3", 0x4000, 0x4000, CRC(707cc98e) SHA1(850c973053f3ae8a93e7c630d69298f25708941e) )
|
||||
ROM_LOAD( "q05.h1", 0x8000, 0x4000, CRC(f9e1ebb1) SHA1(c88c1fc22f21b3e7d558c47de2716dac01fdd621) )
|
||||
@ -393,10 +595,10 @@ ROM_START( mikiehs )
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 )
|
||||
ROM_LOAD( "h10.6e", 0x0000, 0x2000, CRC(4ed887d2) SHA1(953218a3b41019e2e52932dd3522741812c46c75) )
|
||||
|
||||
ROM_REGION( 0x4000, "gfx1", 0 )
|
||||
ROM_REGION( 0x4000, "tiles", 0 )
|
||||
ROM_LOAD( "l11.8i", 0x0000, 0x4000, CRC(5ba9d86b) SHA1(2246795dd68a62efb2c70a9177ee97a58ccb2566) )
|
||||
|
||||
ROM_REGION( 0x10000, "gfx2", 0 )
|
||||
ROM_REGION( 0x10000, "sprites", 0 )
|
||||
ROM_LOAD( "i01.f1", 0x0000, 0x4000, CRC(0c0cab5f) SHA1(c3eb4c3a432e86f4664329a0de5583cb5de7b6f5) )
|
||||
ROM_LOAD( "i03.f3", 0x4000, 0x4000, CRC(694da32f) SHA1(02bd83d77f42822e42e48977856dfa0e3abfcab0) )
|
||||
ROM_LOAD( "i05.h1", 0x8000, 0x4000, CRC(00e357e1) SHA1(d5b46709083d74950d0deedecb4fd631d0e74afb) )
|
||||
@ -410,6 +612,9 @@ ROM_START( mikiehs )
|
||||
ROM_LOAD( "d18.f9", 0x0400, 0x0100, CRC(7396b374) SHA1(fedcc421a61d6623dc9c41b0a3e164efeb50ec7c) ) // sprite lookup table
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Game driver(s)
|
||||
|
@ -1,70 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Allard van der Bas
|
||||
/*************************************************************************
|
||||
|
||||
Mikie
|
||||
|
||||
*************************************************************************/
|
||||
#ifndef MAME_INCLUDES_MIKIE_H
|
||||
#define MAME_INCLUDES_MIKIE_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "emupal.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
class mikie_state : public driver_device
|
||||
{
|
||||
public:
|
||||
mikie_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_colorram(*this, "colorram"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_audiocpu(*this, "audiocpu"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void mikie(machine_config &config);
|
||||
|
||||
private:
|
||||
/* memory pointers */
|
||||
required_shared_ptr<uint8_t> m_spriteram;
|
||||
required_shared_ptr<uint8_t> m_colorram;
|
||||
required_shared_ptr<uint8_t> m_videoram;
|
||||
|
||||
/* video-related */
|
||||
tilemap_t *m_bg_tilemap = nullptr;
|
||||
int m_palettebank = 0;
|
||||
|
||||
/* devices */
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
uint8_t m_irq_mask = 0;
|
||||
uint8_t mikie_sh_timer_r();
|
||||
DECLARE_WRITE_LINE_MEMBER(sh_irqtrigger_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_counter_1_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_counter_2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(irq_mask_w);
|
||||
void mikie_videoram_w(offs_t offset, uint8_t data);
|
||||
void mikie_colorram_w(offs_t offset, uint8_t data);
|
||||
void mikie_palettebank_w(uint8_t data);
|
||||
DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
virtual void video_start() override;
|
||||
void mikie_palette(palette_device &palette) const;
|
||||
uint32_t screen_update_mikie(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
|
||||
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void mikie_map(address_map &map);
|
||||
void sound_map(address_map &map);
|
||||
};
|
||||
|
||||
#endif // MAME_INCLUDES_MIKIE_H
|
@ -1,168 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Allard van der Bas
|
||||
/***************************************************************************
|
||||
|
||||
video.c
|
||||
|
||||
Functions to emulate the video hardware of the machine.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "video/resnet.h"
|
||||
#include "mikie.h"
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Convert the color PROMs into a more useable format.
|
||||
|
||||
Mikie has three 256x4 palette PROMs (one per gun) and two 256x4 lookup
|
||||
table PROMs (one for characters, one for sprites).
|
||||
I don't know for sure how the palette PROMs are connected to the RGB
|
||||
output, but it's probably the usual:
|
||||
|
||||
bit 3 -- 220 ohm resistor -- RED/GREEN/BLUE
|
||||
-- 470 ohm resistor -- RED/GREEN/BLUE
|
||||
-- 1 kohm resistor -- RED/GREEN/BLUE
|
||||
bit 0 -- 2.2kohm resistor -- RED/GREEN/BLUE
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void mikie_state::mikie_palette(palette_device &palette) const
|
||||
{
|
||||
uint8_t const *color_prom = memregion("proms")->base();
|
||||
static constexpr int resistances[4] = { 2200, 1000, 470, 220 };
|
||||
|
||||
// compute the color output resistor weights
|
||||
double rweights[4], gweights[4], bweights[4];
|
||||
compute_resistor_weights(0, 255, -1.0,
|
||||
4, resistances, rweights, 470, 0,
|
||||
4, resistances, gweights, 470, 0,
|
||||
4, resistances, bweights, 470, 0);
|
||||
|
||||
// create a lookup table for the palette
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
int bit0, bit1, bit2, bit3;
|
||||
|
||||
// red component
|
||||
bit0 = BIT(color_prom[i + 0x000], 0);
|
||||
bit1 = BIT(color_prom[i + 0x000], 1);
|
||||
bit2 = BIT(color_prom[i + 0x000], 2);
|
||||
bit3 = BIT(color_prom[i + 0x000], 3);
|
||||
int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
|
||||
|
||||
// green component
|
||||
bit0 = BIT(color_prom[i + 0x100], 0);
|
||||
bit1 = BIT(color_prom[i + 0x100], 1);
|
||||
bit2 = BIT(color_prom[i + 0x100], 2);
|
||||
bit3 = BIT(color_prom[i + 0x100], 3);
|
||||
int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
|
||||
|
||||
// blue component
|
||||
bit0 = BIT(color_prom[i + 0x200], 0);
|
||||
bit1 = BIT(color_prom[i + 0x200], 1);
|
||||
bit2 = BIT(color_prom[i + 0x200], 2);
|
||||
bit3 = BIT(color_prom[i + 0x200], 3);
|
||||
int const b = combine_weights(bweights, bit0, bit1, bit2, bit3);
|
||||
|
||||
palette.set_indirect_color(i, rgb_t(r, g, b));
|
||||
}
|
||||
|
||||
// color_prom now points to the beginning of the lookup table,
|
||||
color_prom += 0x300;
|
||||
|
||||
// characters use colors 0x10-0x1f of each 0x20 color bank, while sprites use colors 0-0x0f
|
||||
for (int i = 0; i < 0x200; i++)
|
||||
{
|
||||
for (int j = 0; j < 8; j++)
|
||||
{
|
||||
uint8_t const ctabentry = (j << 5) | ((~i & 0x100) >> 4) | (color_prom[i] & 0x0f);
|
||||
m_palette->set_pen_indirect(((i & 0x100) << 3) | (j << 8) | (i & 0xff), ctabentry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void mikie_state::mikie_videoram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_videoram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
void mikie_state::mikie_colorram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_colorram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
void mikie_state::mikie_palettebank_w(uint8_t data)
|
||||
{
|
||||
if (m_palettebank != (data & 0x07))
|
||||
{
|
||||
m_palettebank = data & 0x07;
|
||||
machine().tilemap().mark_all_dirty();
|
||||
}
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(mikie_state::flipscreen_w)
|
||||
{
|
||||
flip_screen_set(state);
|
||||
machine().tilemap().mark_all_dirty();
|
||||
}
|
||||
|
||||
TILE_GET_INFO_MEMBER(mikie_state::get_bg_tile_info)
|
||||
{
|
||||
int code = m_videoram[tile_index] + ((m_colorram[tile_index] & 0x20) << 3);
|
||||
int color = (m_colorram[tile_index] & 0x0f) + 16 * m_palettebank;
|
||||
int flags = ((m_colorram[tile_index] & 0x40) ? TILE_FLIPX : 0) | ((m_colorram[tile_index] & 0x80) ? TILE_FLIPY : 0);
|
||||
if (m_colorram[tile_index] & 0x10)
|
||||
tileinfo.category = 1;
|
||||
else
|
||||
tileinfo.category = 0;
|
||||
|
||||
tileinfo.set(0, code, color, flags);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void mikie_state::video_start()
|
||||
{
|
||||
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(mikie_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
}
|
||||
|
||||
void mikie_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
uint8_t *spriteram = m_spriteram;
|
||||
int offs;
|
||||
|
||||
for (offs = 0; offs < m_spriteram.bytes(); offs += 4)
|
||||
{
|
||||
int gfxbank = (spriteram[offs + 2] & 0x40) ? 2 : 1;
|
||||
int code = (spriteram[offs + 2] & 0x3f) + ((spriteram[offs + 2] & 0x80) >> 1) + ((spriteram[offs] & 0x40) << 1);
|
||||
int color = (spriteram[offs] & 0x0f) + 16 * m_palettebank;
|
||||
int sx = spriteram[offs + 3];
|
||||
int sy = 244 - spriteram[offs + 1];
|
||||
int flipx = ~spriteram[offs] & 0x10;
|
||||
int flipy = spriteram[offs] & 0x20;
|
||||
|
||||
if (flip_screen())
|
||||
{
|
||||
sy = 242 - sy;
|
||||
flipy = !flipy;
|
||||
}
|
||||
|
||||
|
||||
m_gfxdecode->gfx(gfxbank)->transpen(bitmap,cliprect,
|
||||
code, color,
|
||||
flipx,flipy,
|
||||
sx,sy, 0);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t mikie_state::screen_update_mikie(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(0), 0);
|
||||
draw_sprites(bitmap, cliprect);
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(1), 0);
|
||||
return 0;
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Manuel Abadia
|
||||
// copyright-holders: Manuel Abadia
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Pandora's Palace(GX328) (c) 1984 Konami/Interlogic
|
||||
@ -24,23 +25,263 @@ Boards:
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "pandoras.h"
|
||||
|
||||
#include "konamipt.h"
|
||||
|
||||
#include "cpu/m6809/m6809.h"
|
||||
#include "cpu/mcs48/mcs48.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/74259.h"
|
||||
#include "machine/gen_latch.h"
|
||||
#include "machine/watchdog.h"
|
||||
#include "sound/ay8910.h"
|
||||
#include "sound/dac.h"
|
||||
#include "video/resnet.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
|
||||
#define MASTER_CLOCK XTAL(18'432'000)
|
||||
#define SOUND_CLOCK XTAL(14'318'181)
|
||||
namespace {
|
||||
|
||||
class pandoras_state : public driver_device
|
||||
{
|
||||
public:
|
||||
pandoras_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_colorram(*this, "colorram"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_subcpu(*this, "sub"),
|
||||
m_audiocpu(*this, "audiocpu"),
|
||||
m_mcu(*this, "mcu"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void pandoras(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
virtual void video_start() override;
|
||||
|
||||
private:
|
||||
// memory pointers
|
||||
required_shared_ptr<uint8_t> m_spriteram;
|
||||
required_shared_ptr<uint8_t> m_colorram;
|
||||
required_shared_ptr<uint8_t> m_videoram;
|
||||
|
||||
// devices
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_subcpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<i8039_device> m_mcu;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
// video-related
|
||||
tilemap_t *m_layer0 = nullptr;
|
||||
|
||||
uint8_t m_irq_enable_a = 0;
|
||||
uint8_t m_irq_enable_b = 0;
|
||||
uint8_t m_firq_old_data_a = 0;
|
||||
uint8_t m_firq_old_data_b = 0;
|
||||
uint8_t m_i8039_status = 0;
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(cpua_irq_enable_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(cpub_irq_enable_w);
|
||||
void cpua_irqtrigger_w(uint8_t data);
|
||||
void cpub_irqtrigger_w(uint8_t data);
|
||||
void i8039_irqtrigger_w(uint8_t data);
|
||||
void i8039_irqen_and_status_w(uint8_t data);
|
||||
void z80_irqtrigger_w(uint8_t data);
|
||||
template <uint8_t Which> DECLARE_WRITE_LINE_MEMBER(coin_counter_w);
|
||||
void vram_w(offs_t offset, uint8_t data);
|
||||
void cram_w(offs_t offset, uint8_t data);
|
||||
void scrolly_w(uint8_t data);
|
||||
uint8_t porta_r();
|
||||
uint8_t portb_r();
|
||||
TILE_GET_INFO_MEMBER(get_tile_info0);
|
||||
void palette(palette_device &palette) const;
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
|
||||
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t* sr);
|
||||
|
||||
void i8039_io_map(address_map &map);
|
||||
void i8039_map(address_map &map);
|
||||
void master_map(address_map &map);
|
||||
void slave_map(address_map &map);
|
||||
void sound_map(address_map &map);
|
||||
};
|
||||
|
||||
|
||||
// video
|
||||
|
||||
/***********************************************************************
|
||||
|
||||
Convert the color PROMs into a more useable format.
|
||||
|
||||
Pandora's Palace has one 32x8 palette PROM and two 256x4 lookup table
|
||||
PROMs (one for characters, one for sprites).
|
||||
The palette PROM is connected to the RGB output this way:
|
||||
|
||||
bit 7 -- 220 ohm resistor -- BLUE
|
||||
-- 470 ohm resistor -- BLUE
|
||||
-- 220 ohm resistor -- GREEN
|
||||
-- 470 ohm resistor -- GREEN
|
||||
-- 1 kohm resistor -- GREEN
|
||||
-- 220 ohm resistor -- RED
|
||||
-- 470 ohm resistor -- RED
|
||||
bit 0 -- 1 kohm resistor -- RED
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void pandoras_state::palette(palette_device &palette) const
|
||||
{
|
||||
const uint8_t *color_prom = memregion("proms")->base();
|
||||
static constexpr int resistances_rg[3] = { 1000, 470, 220 };
|
||||
static constexpr int resistances_b [2] = { 470, 220 };
|
||||
|
||||
// compute the color output resistor weights
|
||||
double rweights[3], gweights[3], bweights[2];
|
||||
compute_resistor_weights(0, 255, -1.0,
|
||||
3, &resistances_rg[0], rweights, 1000, 0,
|
||||
3, &resistances_rg[0], gweights, 1000, 0,
|
||||
2, &resistances_b[0], bweights, 1000, 0);
|
||||
|
||||
// create a lookup table for the palette
|
||||
for (int i = 0; i < 0x20; i++)
|
||||
{
|
||||
int bit0, bit1, bit2;
|
||||
|
||||
// red component
|
||||
bit0 = BIT(color_prom[i], 0);
|
||||
bit1 = BIT(color_prom[i], 1);
|
||||
bit2 = BIT(color_prom[i], 2);
|
||||
int const r = combine_weights(rweights, bit0, bit1, bit2);
|
||||
|
||||
// green component
|
||||
bit0 = BIT(color_prom[i], 3);
|
||||
bit1 = BIT(color_prom[i], 4);
|
||||
bit2 = BIT(color_prom[i], 5);
|
||||
int const g = combine_weights(gweights, bit0, bit1, bit2);
|
||||
|
||||
// blue component
|
||||
bit0 = BIT(color_prom[i], 6);
|
||||
bit1 = BIT(color_prom[i], 7);
|
||||
int const b = combine_weights(bweights, bit0, bit1);
|
||||
|
||||
palette.set_indirect_color(i, rgb_t(r, g, b));
|
||||
}
|
||||
|
||||
// color_prom now points to the beginning of the lookup table
|
||||
color_prom += 0x20;
|
||||
|
||||
// sprites
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
uint8_t const ctabentry = color_prom[i] & 0x0f;
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
|
||||
// characters
|
||||
for (int i = 0x100; i < 0x200; i++)
|
||||
{
|
||||
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Callbacks for the TileMap code
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
TILE_GET_INFO_MEMBER(pandoras_state::get_tile_info0)
|
||||
{
|
||||
uint8_t const attr = m_colorram[tile_index];
|
||||
tileinfo.set(1,
|
||||
m_videoram[tile_index] + ((attr & 0x10) << 4),
|
||||
attr & 0x0f,
|
||||
TILE_FLIPYX((attr & 0xc0) >> 6));
|
||||
tileinfo.category = (attr & 0x20) >> 5;
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Start the video hardware emulation.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void pandoras_state::video_start()
|
||||
{
|
||||
m_layer0 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pandoras_state::get_tile_info0)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Memory Handlers
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void pandoras_state::vram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_layer0->mark_tile_dirty(offset);
|
||||
m_videoram[offset] = data;
|
||||
}
|
||||
|
||||
void pandoras_state::cram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_layer0->mark_tile_dirty(offset);
|
||||
m_colorram[offset] = data;
|
||||
}
|
||||
|
||||
void pandoras_state::scrolly_w(uint8_t data)
|
||||
{
|
||||
m_layer0->set_scrolly(0, data);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Screen Refresh
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void pandoras_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t* sr)
|
||||
{
|
||||
for (int offs = 0; offs < 0x100; offs += 4)
|
||||
{
|
||||
int const sx = sr[offs + 1];
|
||||
int const sy = 240 - sr[offs];
|
||||
int const color = sr[offs + 3] & 0x0f;
|
||||
int const nflipx = sr[offs + 3] & 0x40;
|
||||
int const nflipy = sr[offs + 3] & 0x80;
|
||||
|
||||
m_gfxdecode->gfx(0)->transmask(bitmap, cliprect,
|
||||
sr[offs + 2],
|
||||
color,
|
||||
!nflipx, !nflipy,
|
||||
sx, sy,
|
||||
m_palette->transpen_mask(*m_gfxdecode->gfx(0), color, 0));
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t pandoras_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
m_layer0->draw(screen, bitmap, cliprect, 1 ,0);
|
||||
draw_sprites(bitmap, cliprect, &m_spriteram[0x800]);
|
||||
m_layer0->draw(screen, bitmap, cliprect, 0 ,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// machine
|
||||
|
||||
WRITE_LINE_MEMBER(pandoras_state::vblank_irq)
|
||||
{
|
||||
@ -64,7 +305,7 @@ WRITE_LINE_MEMBER(pandoras_state::cpub_irq_enable_w)
|
||||
m_irq_enable_b = state;
|
||||
}
|
||||
|
||||
void pandoras_state::pandoras_cpua_irqtrigger_w(uint8_t data)
|
||||
void pandoras_state::cpua_irqtrigger_w(uint8_t data)
|
||||
{
|
||||
if (!m_firq_old_data_a && data)
|
||||
m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
|
||||
@ -72,7 +313,7 @@ void pandoras_state::pandoras_cpua_irqtrigger_w(uint8_t data)
|
||||
m_firq_old_data_a = data;
|
||||
}
|
||||
|
||||
void pandoras_state::pandoras_cpub_irqtrigger_w(uint8_t data)
|
||||
void pandoras_state::cpub_irqtrigger_w(uint8_t data)
|
||||
{
|
||||
if (!m_firq_old_data_b && data)
|
||||
m_subcpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
|
||||
@ -80,90 +321,86 @@ void pandoras_state::pandoras_cpub_irqtrigger_w(uint8_t data)
|
||||
m_firq_old_data_b = data;
|
||||
}
|
||||
|
||||
void pandoras_state::pandoras_i8039_irqtrigger_w(uint8_t data)
|
||||
void pandoras_state::i8039_irqtrigger_w(uint8_t data)
|
||||
{
|
||||
m_mcu->set_input_line(0, ASSERT_LINE);
|
||||
}
|
||||
|
||||
void pandoras_state::i8039_irqen_and_status_w(uint8_t data)
|
||||
{
|
||||
/* bit 7 enables IRQ */
|
||||
// bit 7 enables IRQ
|
||||
if ((data & 0x80) == 0)
|
||||
m_mcu->set_input_line(0, CLEAR_LINE);
|
||||
|
||||
/* bit 5 goes to 8910 port A */
|
||||
// bit 5 goes to 8910 port A
|
||||
m_i8039_status = (data & 0x20) >> 5;
|
||||
}
|
||||
|
||||
void pandoras_state::pandoras_z80_irqtrigger_w(uint8_t data)
|
||||
void pandoras_state::z80_irqtrigger_w(uint8_t data)
|
||||
{
|
||||
m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(pandoras_state::coin_counter_1_w)
|
||||
template <uint8_t Which>
|
||||
WRITE_LINE_MEMBER(pandoras_state::coin_counter_w)
|
||||
{
|
||||
machine().bookkeeping().coin_counter_w(0, state);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(pandoras_state::coin_counter_2_w)
|
||||
{
|
||||
machine().bookkeeping().coin_counter_w(1, state);
|
||||
machine().bookkeeping().coin_counter_w(Which, state);
|
||||
}
|
||||
|
||||
|
||||
void pandoras_state::pandoras_master_map(address_map &map)
|
||||
void pandoras_state::master_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x0fff).ram().share("spriteram"); /* Work RAM (Shared with CPU B) */
|
||||
map(0x1000, 0x13ff).ram().w(FUNC(pandoras_state::pandoras_cram_w)).share("colorram"); /* Color RAM (shared with CPU B) */
|
||||
map(0x1400, 0x17ff).ram().w(FUNC(pandoras_state::pandoras_vram_w)).share("videoram"); /* Video RAM (shared with CPU B) */
|
||||
map(0x1800, 0x1807).w("mainlatch", FUNC(ls259_device::write_d0)); /* INT control */
|
||||
map(0x1a00, 0x1a00).w(FUNC(pandoras_state::pandoras_scrolly_w)); /* bg scroll */
|
||||
map(0x1c00, 0x1c00).w(FUNC(pandoras_state::pandoras_z80_irqtrigger_w)); /* cause INT on the Z80 */
|
||||
map(0x1e00, 0x1e00).w("soundlatch", FUNC(generic_latch_8_device::write)); /* sound command to the Z80 */
|
||||
map(0x2000, 0x2000).w(FUNC(pandoras_state::pandoras_cpub_irqtrigger_w)); /* cause FIRQ on CPU B */
|
||||
map(0x2001, 0x2001).w("watchdog", FUNC(watchdog_timer_device::reset_w)); /* watchdog reset */
|
||||
map(0x4000, 0x5fff).rom(); /* space for diagnostic ROM */
|
||||
map(0x6000, 0x67ff).ram().share("share4"); /* Shared RAM with CPU B */
|
||||
map(0x8000, 0xffff).rom(); /* ROM */
|
||||
map(0x0000, 0x0fff).ram().share(m_spriteram); // shared with CPU B
|
||||
map(0x1000, 0x13ff).ram().w(FUNC(pandoras_state::cram_w)).share(m_colorram); // shared with CPU B
|
||||
map(0x1400, 0x17ff).ram().w(FUNC(pandoras_state::vram_w)).share(m_videoram); // shared with CPU B
|
||||
map(0x1800, 0x1807).w("mainlatch", FUNC(ls259_device::write_d0)); // INT control
|
||||
map(0x1a00, 0x1a00).w(FUNC(pandoras_state::scrolly_w));
|
||||
map(0x1c00, 0x1c00).w(FUNC(pandoras_state::z80_irqtrigger_w));
|
||||
map(0x1e00, 0x1e00).w("soundlatch", FUNC(generic_latch_8_device::write));
|
||||
map(0x2000, 0x2000).w(FUNC(pandoras_state::cpub_irqtrigger_w));
|
||||
map(0x2001, 0x2001).w("watchdog", FUNC(watchdog_timer_device::reset_w));
|
||||
map(0x4000, 0x5fff).rom(); // space for diagnostic ROM
|
||||
map(0x6000, 0x67ff).ram().share("cpua_cpub");
|
||||
map(0x8000, 0xffff).rom();
|
||||
}
|
||||
|
||||
void pandoras_state::pandoras_slave_map(address_map &map)
|
||||
void pandoras_state::slave_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x0fff).ram().share("spriteram"); /* Work RAM (Shared with CPU A) */
|
||||
map(0x1000, 0x13ff).ram().w(FUNC(pandoras_state::pandoras_cram_w)).share("colorram"); /* Color RAM (shared with CPU A) */
|
||||
map(0x1400, 0x17ff).ram().w(FUNC(pandoras_state::pandoras_vram_w)).share("videoram"); /* Video RAM (shared with CPU A) */
|
||||
map(0x0000, 0x0fff).ram().share(m_spriteram); // shared with CPU A
|
||||
map(0x1000, 0x13ff).ram().w(FUNC(pandoras_state::cram_w)).share(m_colorram); // shared with CPU A
|
||||
map(0x1400, 0x17ff).ram().w(FUNC(pandoras_state::vram_w)).share(m_videoram); // shared with CPU A
|
||||
map(0x1800, 0x1800).portr("DSW1");
|
||||
map(0x1800, 0x1807).w("mainlatch", FUNC(ls259_device::write_d0)); /* INT control */
|
||||
map(0x1800, 0x1807).w("mainlatch", FUNC(ls259_device::write_d0)); // INT control
|
||||
map(0x1a00, 0x1a00).portr("SYSTEM");
|
||||
map(0x1a01, 0x1a01).portr("P1");
|
||||
map(0x1a02, 0x1a02).portr("P2");
|
||||
map(0x1a03, 0x1a03).portr("DSW3");
|
||||
map(0x1c00, 0x1c00).portr("DSW2");
|
||||
// map(0x1e00, 0x1e00).nopr(); /* ??? seems to be important */
|
||||
map(0x8000, 0x8000).w("watchdog", FUNC(watchdog_timer_device::reset_w)); /* watchdog reset */
|
||||
map(0xa000, 0xa000).w(FUNC(pandoras_state::pandoras_cpua_irqtrigger_w)); /* cause FIRQ on CPU A */
|
||||
map(0xc000, 0xc7ff).ram().share("share4"); /* Shared RAM with the CPU A */
|
||||
map(0xe000, 0xffff).rom(); /* ROM */
|
||||
// map(0x1e00, 0x1e00).nopr(); // ??? seems to be important
|
||||
map(0x8000, 0x8000).w("watchdog", FUNC(watchdog_timer_device::reset_w));
|
||||
map(0xa000, 0xa000).w(FUNC(pandoras_state::cpua_irqtrigger_w));
|
||||
map(0xc000, 0xc7ff).ram().share("cpua_cpub");
|
||||
map(0xe000, 0xffff).rom();
|
||||
}
|
||||
|
||||
void pandoras_state::pandoras_sound_map(address_map &map)
|
||||
void pandoras_state::sound_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x1fff).rom(); /* ROM */
|
||||
map(0x2000, 0x23ff).ram(); /* RAM */
|
||||
map(0x0000, 0x1fff).rom();
|
||||
map(0x2000, 0x23ff).ram();
|
||||
map(0x4000, 0x4000).r("soundlatch", FUNC(generic_latch_8_device::read));
|
||||
map(0x6000, 0x6000).w("aysnd", FUNC(ay8910_device::address_w)); /* AY-8910 */
|
||||
map(0x6001, 0x6001).r("aysnd", FUNC(ay8910_device::data_r)); /* AY-8910 */
|
||||
map(0x6002, 0x6002).w("aysnd", FUNC(ay8910_device::data_w)); /* AY-8910 */
|
||||
map(0x8000, 0x8000).w(FUNC(pandoras_state::pandoras_i8039_irqtrigger_w)); /* cause INT on the 8039 */
|
||||
map(0xa000, 0xa000).w("soundlatch2", FUNC(generic_latch_8_device::write)); /* sound command to the 8039 */
|
||||
map(0x6000, 0x6000).w("aysnd", FUNC(ay8910_device::address_w));
|
||||
map(0x6001, 0x6001).r("aysnd", FUNC(ay8910_device::data_r));
|
||||
map(0x6002, 0x6002).w("aysnd", FUNC(ay8910_device::data_w));
|
||||
map(0x8000, 0x8000).w(FUNC(pandoras_state::i8039_irqtrigger_w));
|
||||
map(0xa000, 0xa000).w("soundlatch2", FUNC(generic_latch_8_device::write));
|
||||
}
|
||||
|
||||
void pandoras_state::pandoras_i8039_map(address_map &map)
|
||||
void pandoras_state::i8039_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x0fff).rom();
|
||||
}
|
||||
|
||||
void pandoras_state::pandoras_i8039_io_map(address_map &map)
|
||||
void pandoras_state::i8039_io_map(address_map &map)
|
||||
{
|
||||
map(0x00, 0xff).r("soundlatch2", FUNC(generic_latch_8_device::read));
|
||||
}
|
||||
@ -178,7 +415,7 @@ void pandoras_state::pandoras_i8039_io_map(address_map &map)
|
||||
static INPUT_PORTS_START( pandoras )
|
||||
PORT_START("DSW1")
|
||||
KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1)
|
||||
/* "No Coin B" = coins produce sound, but no effect on coin counter */
|
||||
// "No Coin B" = coins produce sound, but no effect on coin counter
|
||||
|
||||
PORT_START("DSW2")
|
||||
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
|
||||
@ -257,8 +494,8 @@ static const gfx_layout spritelayout =
|
||||
};
|
||||
|
||||
static GFXDECODE_START( gfx_pandoras )
|
||||
GFXDECODE_ENTRY( "gfx1", 0, spritelayout, 0, 16 )
|
||||
GFXDECODE_ENTRY( "gfx2", 0, gfx_8x8x4_packed_msb, 16*16, 16 )
|
||||
GFXDECODE_ENTRY( "sprites", 0, spritelayout, 0, 16 )
|
||||
GFXDECODE_ENTRY( "tiles", 0, gfx_8x8x4_packed_msb, 16*16, 16 )
|
||||
GFXDECODE_END
|
||||
|
||||
/***************************************************************************
|
||||
@ -283,69 +520,72 @@ void pandoras_state::machine_reset()
|
||||
m_i8039_status = 0;
|
||||
}
|
||||
|
||||
uint8_t pandoras_state::pandoras_portA_r()
|
||||
uint8_t pandoras_state::porta_r()
|
||||
{
|
||||
return m_i8039_status;
|
||||
}
|
||||
|
||||
uint8_t pandoras_state::pandoras_portB_r()
|
||||
uint8_t pandoras_state::portb_r()
|
||||
{
|
||||
return (m_audiocpu->total_cycles() / 512) & 0x0f;
|
||||
}
|
||||
|
||||
void pandoras_state::pandoras(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
MC6809E(config, m_maincpu, MASTER_CLOCK/6); /* CPU A */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &pandoras_state::pandoras_master_map);
|
||||
static constexpr XTAL MASTER_CLOCK = XTAL(18'432'000);
|
||||
static constexpr XTAL SOUND_CLOCK = XTAL(14'318'181);
|
||||
|
||||
MC6809E(config, m_subcpu, MASTER_CLOCK/6); /* CPU B */
|
||||
m_subcpu->set_addrmap(AS_PROGRAM, &pandoras_state::pandoras_slave_map);
|
||||
// basic machine hardware
|
||||
MC6809E(config, m_maincpu, MASTER_CLOCK / 6); // CPU A
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &pandoras_state::master_map);
|
||||
|
||||
Z80(config, m_audiocpu, SOUND_CLOCK/8);
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &pandoras_state::pandoras_sound_map);
|
||||
MC6809E(config, m_subcpu, MASTER_CLOCK / 6); // CPU B
|
||||
m_subcpu->set_addrmap(AS_PROGRAM, &pandoras_state::slave_map);
|
||||
|
||||
I8039(config, m_mcu, SOUND_CLOCK/2);
|
||||
m_mcu->set_addrmap(AS_PROGRAM, &pandoras_state::pandoras_i8039_map);
|
||||
m_mcu->set_addrmap(AS_IO, &pandoras_state::pandoras_i8039_io_map);
|
||||
Z80(config, m_audiocpu, SOUND_CLOCK / 8);
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &pandoras_state::sound_map);
|
||||
|
||||
I8039(config, m_mcu, SOUND_CLOCK / 2);
|
||||
m_mcu->set_addrmap(AS_PROGRAM, &pandoras_state::i8039_map);
|
||||
m_mcu->set_addrmap(AS_IO, &pandoras_state::i8039_io_map);
|
||||
m_mcu->p1_out_cb().set("dac", FUNC(dac_byte_interface::data_w));
|
||||
m_mcu->p2_out_cb().set(FUNC(pandoras_state::i8039_irqen_and_status_w));
|
||||
|
||||
config.set_maximum_quantum(attotime::from_hz(6000)); /* 100 CPU slices per frame - needed for correct synchronization of the sound CPUs */
|
||||
config.set_maximum_quantum(attotime::from_hz(6000)); // 100 CPU slices per frame - needed for correct synchronization of the sound CPUs
|
||||
|
||||
ls259_device &mainlatch(LS259(config, "mainlatch")); // C3
|
||||
mainlatch.q_out_cb<0>().set(FUNC(pandoras_state::cpua_irq_enable_w)); // ENA
|
||||
mainlatch.q_out_cb<1>().set_nop(); // OFSET - unknown
|
||||
mainlatch.q_out_cb<2>().set(FUNC(pandoras_state::coin_counter_1_w));
|
||||
mainlatch.q_out_cb<3>().set(FUNC(pandoras_state::coin_counter_2_w));
|
||||
mainlatch.q_out_cb<5>().set(FUNC(pandoras_state::flipscreen_w)); // FLIP
|
||||
mainlatch.q_out_cb<2>().set(FUNC(pandoras_state::coin_counter_w<0>));
|
||||
mainlatch.q_out_cb<3>().set(FUNC(pandoras_state::coin_counter_w<1>));
|
||||
mainlatch.q_out_cb<5>().set(FUNC(pandoras_state::flip_screen_set)); // FLIP
|
||||
mainlatch.q_out_cb<6>().set(FUNC(pandoras_state::cpub_irq_enable_w)); // ENB
|
||||
mainlatch.q_out_cb<7>().set_inputline(m_subcpu, INPUT_LINE_RESET).invert(); // RESETB
|
||||
|
||||
WATCHDOG_TIMER(config, "watchdog");
|
||||
|
||||
/* video hardware */
|
||||
// video hardware
|
||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
||||
screen.set_refresh_hz(60);
|
||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
||||
screen.set_size(32*8, 32*8);
|
||||
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
|
||||
screen.set_screen_update(FUNC(pandoras_state::screen_update_pandoras));
|
||||
screen.set_screen_update(FUNC(pandoras_state::screen_update));
|
||||
screen.set_palette(m_palette);
|
||||
screen.screen_vblank().set(FUNC(pandoras_state::vblank_irq));
|
||||
|
||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pandoras);
|
||||
PALETTE(config, m_palette, FUNC(pandoras_state::pandoras_palette), 16*16+16*16, 32);
|
||||
PALETTE(config, m_palette, FUNC(pandoras_state::palette), 16*16+16*16, 32);
|
||||
|
||||
/* sound hardware */
|
||||
// sound hardware
|
||||
SPEAKER(config, "speaker").front_center();
|
||||
|
||||
GENERIC_LATCH_8(config, "soundlatch");
|
||||
GENERIC_LATCH_8(config, "soundlatch2");
|
||||
|
||||
ay8910_device &aysnd(AY8910(config, "aysnd", SOUND_CLOCK/8));
|
||||
aysnd.port_a_read_callback().set(FUNC(pandoras_state::pandoras_portA_r)); // not used
|
||||
aysnd.port_b_read_callback().set(FUNC(pandoras_state::pandoras_portB_r));
|
||||
ay8910_device &aysnd(AY8910(config, "aysnd", SOUND_CLOCK / 8));
|
||||
aysnd.port_a_read_callback().set(FUNC(pandoras_state::porta_r)); // not used
|
||||
aysnd.port_b_read_callback().set(FUNC(pandoras_state::portb_r));
|
||||
aysnd.add_route(ALL_OUTPUTS, "speaker", 0.4);
|
||||
|
||||
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.12); // unknown DAC
|
||||
@ -397,35 +637,37 @@ KOSUKA
|
||||
|
||||
*/
|
||||
ROM_START( pandoras )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 ) /* 64K for the CPU A */
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
ROM_LOAD( "pand_j13.cpu", 0x08000, 0x02000, CRC(7a0fe9c5) SHA1(e68c8d76d1abb69ac72b0e2cd8c1dfc540064ee3) )
|
||||
ROM_LOAD( "pand_j12.cpu", 0x0a000, 0x02000, CRC(7dc4bfe1) SHA1(359c3051e5d7a34d0e49578e4c168fd19c73e202) )
|
||||
ROM_LOAD( "pand_j10.cpu", 0x0c000, 0x02000, CRC(be3af3b7) SHA1(91321b53e17e58b674104cb95b1c35ee8fecae22) )
|
||||
ROM_LOAD( "pand_j9.cpu", 0x0e000, 0x02000, CRC(e674a17a) SHA1(a4b096dc455425dd60298acf2203659ef6f8d857) )
|
||||
|
||||
ROM_REGION( 0x10000, "sub", 0 ) /* 64K for the CPU B */
|
||||
ROM_REGION( 0x10000, "sub", 0 )
|
||||
ROM_LOAD( "pand_j5.cpu", 0x0e000, 0x02000, CRC(4aab190b) SHA1(d2204953d6b6b34cea851bfc9c2b31426e75f90b) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64K for the Sound CPU */
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 )
|
||||
ROM_LOAD( "pand_6c.snd", 0x00000, 0x02000, CRC(0c1f109d) SHA1(4e6cdee99261764bd2fea5abbd49d800baba0dc5) )
|
||||
|
||||
ROM_REGION( 0x2000, "mcu", 0 ) /* 4K for the Sound CPU 2 (Data is mirrored to fit into an 8K rom) */
|
||||
ROM_REGION( 0x2000, "mcu", 0 )
|
||||
ROM_LOAD( "pand_7e.snd", 0x00000, 0x02000, CRC(1071c1ba) SHA1(3693be69f4b32fb3031bcdee8cac0d46ec8c2804) )
|
||||
|
||||
ROM_REGION( 0x6000, "gfx1", 0 )
|
||||
ROM_LOAD( "pand_j18.cpu", 0x00000, 0x02000, CRC(99a696c5) SHA1(35a27cd5ecc51a9a1acf01eb8078a1028f03be32) ) /* sprites */
|
||||
ROM_REGION( 0x6000, "sprites", 0 )
|
||||
ROM_LOAD( "pand_j18.cpu", 0x00000, 0x02000, CRC(99a696c5) SHA1(35a27cd5ecc51a9a1acf01eb8078a1028f03be32) )
|
||||
ROM_LOAD( "pand_j17.cpu", 0x02000, 0x02000, CRC(38a03c21) SHA1(b0c8f642787bab3cd1d76657e56f07f4f6f9073c) )
|
||||
ROM_LOAD( "pand_j16.cpu", 0x04000, 0x02000, CRC(e0708a78) SHA1(9dbd08b6ca8a66a61e128d1806888696273de848) )
|
||||
|
||||
ROM_REGION( 0x4000, "gfx2", 0 )
|
||||
ROM_LOAD( "pand_a18.cpu", 0x00000, 0x02000, CRC(23706d4a) SHA1(cca92e6ff90e3006a79a214f1211fd659771de53) ) /* tiles */
|
||||
ROM_REGION( 0x4000, "tiles", 0 )
|
||||
ROM_LOAD( "pand_a18.cpu", 0x00000, 0x02000, CRC(23706d4a) SHA1(cca92e6ff90e3006a79a214f1211fd659771de53) )
|
||||
ROM_LOAD( "pand_a19.cpu", 0x02000, 0x02000, CRC(a463b3f9) SHA1(549b7ee6e47325b80186441da11879fb8b1b47be) )
|
||||
|
||||
ROM_REGION( 0x0220, "proms", 0 )
|
||||
ROM_LOAD( "pandora.2a", 0x0000, 0x020, CRC(4d56f939) SHA1(a8dac604bfdaf4b153b75dbf165de113152b6daa) ) /* palette */
|
||||
ROM_LOAD( "pandora.17g", 0x0020, 0x100, CRC(c1a90cfc) SHA1(c6581f2d543e38f1de399774183cf0698e61dab5) ) /* sprite lookup table */
|
||||
ROM_LOAD( "pandora.16b", 0x0120, 0x100, CRC(c89af0c3) SHA1(4072c8d61521b34ce4dbce1d48f546402e9539cd) ) /* character lookup table */
|
||||
ROM_LOAD( "pandora.2a", 0x0000, 0x020, CRC(4d56f939) SHA1(a8dac604bfdaf4b153b75dbf165de113152b6daa) ) // palette
|
||||
ROM_LOAD( "pandora.17g", 0x0020, 0x100, CRC(c1a90cfc) SHA1(c6581f2d543e38f1de399774183cf0698e61dab5) ) // sprite lookup table
|
||||
ROM_LOAD( "pandora.16b", 0x0120, 0x100, CRC(c89af0c3) SHA1(4072c8d61521b34ce4dbce1d48f546402e9539cd) ) // character lookup table
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
GAME( 1984, pandoras, 0, pandoras, pandoras, pandoras_state, empty_init, ROT90, "Konami / Interlogic", "Pandora's Palace", MACHINE_SUPPORTS_SAVE )
|
||||
|
@ -1,87 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Manuel Abadia
|
||||
/*************************************************************************
|
||||
|
||||
Pandora's Palace
|
||||
|
||||
*************************************************************************/
|
||||
#ifndef MAME_INCLUDES_PANDORAS_H
|
||||
#define MAME_INCLUDES_PANDORAS_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cpu/mcs48/mcs48.h"
|
||||
#include "emupal.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
class pandoras_state : public driver_device
|
||||
{
|
||||
public:
|
||||
pandoras_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_colorram(*this, "colorram"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_subcpu(*this, "sub"),
|
||||
m_audiocpu(*this, "audiocpu"),
|
||||
m_mcu(*this, "mcu"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
/* memory pointers */
|
||||
required_shared_ptr<uint8_t> m_spriteram;
|
||||
required_shared_ptr<uint8_t> m_colorram;
|
||||
required_shared_ptr<uint8_t> m_videoram;
|
||||
|
||||
/* video-related */
|
||||
tilemap_t *m_layer0 = nullptr;
|
||||
int m_flipscreen = 0;
|
||||
|
||||
int m_irq_enable_a = 0;
|
||||
int m_irq_enable_b = 0;
|
||||
int m_firq_old_data_a = 0;
|
||||
int m_firq_old_data_b = 0;
|
||||
int m_i8039_status = 0;
|
||||
|
||||
/* devices */
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_subcpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<i8039_device> m_mcu;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(cpua_irq_enable_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(cpub_irq_enable_w);
|
||||
void pandoras_cpua_irqtrigger_w(uint8_t data);
|
||||
void pandoras_cpub_irqtrigger_w(uint8_t data);
|
||||
void pandoras_i8039_irqtrigger_w(uint8_t data);
|
||||
void i8039_irqen_and_status_w(uint8_t data);
|
||||
void pandoras_z80_irqtrigger_w(uint8_t data);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_counter_1_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_counter_2_w);
|
||||
void pandoras_vram_w(offs_t offset, uint8_t data);
|
||||
void pandoras_cram_w(offs_t offset, uint8_t data);
|
||||
void pandoras_scrolly_w(uint8_t data);
|
||||
DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
|
||||
uint8_t pandoras_portA_r();
|
||||
uint8_t pandoras_portB_r();
|
||||
TILE_GET_INFO_MEMBER(get_tile_info0);
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
virtual void video_start() override;
|
||||
void pandoras_palette(palette_device &palette) const;
|
||||
uint32_t screen_update_pandoras(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
|
||||
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t* sr );
|
||||
void pandoras(machine_config &config);
|
||||
void pandoras_i8039_io_map(address_map &map);
|
||||
void pandoras_i8039_map(address_map &map);
|
||||
void pandoras_master_map(address_map &map);
|
||||
void pandoras_slave_map(address_map &map);
|
||||
void pandoras_sound_map(address_map &map);
|
||||
};
|
||||
|
||||
#endif // MAME_INCLUDES_PANDORAS_H
|
@ -1,173 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Manuel Abadia
|
||||
#include "emu.h"
|
||||
#include "pandoras.h"
|
||||
#include "video/resnet.h"
|
||||
|
||||
/***********************************************************************
|
||||
|
||||
Convert the color PROMs into a more useable format.
|
||||
|
||||
Pandora's Palace has one 32x8 palette PROM and two 256x4 lookup table
|
||||
PROMs (one for characters, one for sprites).
|
||||
The palette PROM is connected to the RGB output this way:
|
||||
|
||||
bit 7 -- 220 ohm resistor -- BLUE
|
||||
-- 470 ohm resistor -- BLUE
|
||||
-- 220 ohm resistor -- GREEN
|
||||
-- 470 ohm resistor -- GREEN
|
||||
-- 1 kohm resistor -- GREEN
|
||||
-- 220 ohm resistor -- RED
|
||||
-- 470 ohm resistor -- RED
|
||||
bit 0 -- 1 kohm resistor -- RED
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void pandoras_state::pandoras_palette(palette_device &palette) const
|
||||
{
|
||||
const uint8_t *color_prom = memregion("proms")->base();
|
||||
static constexpr int resistances_rg[3] = { 1000, 470, 220 };
|
||||
static constexpr int resistances_b [2] = { 470, 220 };
|
||||
|
||||
// compute the color output resistor weights
|
||||
double rweights[3], gweights[3], bweights[2];
|
||||
compute_resistor_weights(0, 255, -1.0,
|
||||
3, &resistances_rg[0], rweights, 1000, 0,
|
||||
3, &resistances_rg[0], gweights, 1000, 0,
|
||||
2, &resistances_b[0], bweights, 1000, 0);
|
||||
|
||||
// create a lookup table for the palette
|
||||
for (int i = 0; i < 0x20; i++)
|
||||
{
|
||||
int bit0, bit1, bit2;
|
||||
|
||||
// red component
|
||||
bit0 = BIT(color_prom[i], 0);
|
||||
bit1 = BIT(color_prom[i], 1);
|
||||
bit2 = BIT(color_prom[i], 2);
|
||||
int const r = combine_weights(rweights, bit0, bit1, bit2);
|
||||
|
||||
// green component
|
||||
bit0 = BIT(color_prom[i], 3);
|
||||
bit1 = BIT(color_prom[i], 4);
|
||||
bit2 = BIT(color_prom[i], 5);
|
||||
int const g = combine_weights(gweights, bit0, bit1, bit2);
|
||||
|
||||
// blue component
|
||||
bit0 = BIT(color_prom[i], 6);
|
||||
bit1 = BIT(color_prom[i], 7);
|
||||
int const b = combine_weights(bweights, bit0, bit1);
|
||||
|
||||
palette.set_indirect_color(i, rgb_t(r, g, b));
|
||||
}
|
||||
|
||||
// color_prom now points to the beginning of the lookup table
|
||||
color_prom += 0x20;
|
||||
|
||||
// sprites
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
uint8_t const ctabentry = color_prom[i] & 0x0f;
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
|
||||
// characters
|
||||
for (int i = 0x100; i < 0x200; i++)
|
||||
{
|
||||
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Callbacks for the TileMap code
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
TILE_GET_INFO_MEMBER(pandoras_state::get_tile_info0)
|
||||
{
|
||||
uint8_t attr = m_colorram[tile_index];
|
||||
tileinfo.set(1,
|
||||
m_videoram[tile_index] + ((attr & 0x10) << 4),
|
||||
attr & 0x0f,
|
||||
TILE_FLIPYX((attr & 0xc0) >> 6));
|
||||
tileinfo.category = (attr & 0x20) >> 5;
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Start the video hardware emulation.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void pandoras_state::video_start()
|
||||
{
|
||||
m_layer0 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pandoras_state::get_tile_info0)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
|
||||
save_item(NAME(m_flipscreen));
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Memory Handlers
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void pandoras_state::pandoras_vram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_layer0->mark_tile_dirty(offset);
|
||||
m_videoram[offset] = data;
|
||||
}
|
||||
|
||||
void pandoras_state::pandoras_cram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_layer0->mark_tile_dirty(offset);
|
||||
m_colorram[offset] = data;
|
||||
}
|
||||
|
||||
void pandoras_state::pandoras_scrolly_w(uint8_t data)
|
||||
{
|
||||
m_layer0->set_scrolly(0, data);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(pandoras_state::flipscreen_w)
|
||||
{
|
||||
m_flipscreen = state;
|
||||
machine().tilemap().set_flip_all(m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Screen Refresh
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void pandoras_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t* sr )
|
||||
{
|
||||
int offs;
|
||||
|
||||
for (offs = 0; offs < 0x100; offs += 4)
|
||||
{
|
||||
int sx = sr[offs + 1];
|
||||
int sy = 240 - sr[offs];
|
||||
int color = sr[offs + 3] & 0x0f;
|
||||
int nflipx = sr[offs + 3] & 0x40;
|
||||
int nflipy = sr[offs + 3] & 0x80;
|
||||
|
||||
m_gfxdecode->gfx(0)->transmask(bitmap,cliprect,
|
||||
sr[offs + 2],
|
||||
color,
|
||||
!nflipx,!nflipy,
|
||||
sx,sy,
|
||||
m_palette->transpen_mask(*m_gfxdecode->gfx(0), color, 0));
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t pandoras_state::screen_update_pandoras(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
m_layer0->draw(screen, bitmap, cliprect, 1 ,0);
|
||||
draw_sprites(bitmap, cliprect, &m_spriteram[0x800] );
|
||||
m_layer0->draw(screen, bitmap, cliprect, 0 ,0);
|
||||
return 0;
|
||||
}
|
@ -1,108 +1,333 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Jarek Parchanski
|
||||
// copyright-holders: Jarek Parchanski
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Ping Pong (c) 1985 Konami
|
||||
GX555
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "pingpong.h"
|
||||
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "sound/sn76496.h"
|
||||
#include "machine/nvram.h"
|
||||
#include "machine/timer.h"
|
||||
#include "machine/watchdog.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
void pingpong_state::cashquiz_question_bank_high_w(uint8_t data)
|
||||
class pingpong_state : public driver_device
|
||||
{
|
||||
if( data != 0xff )
|
||||
{
|
||||
int i;
|
||||
public:
|
||||
pingpong_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this,"maincpu"),
|
||||
m_colorram(*this, "colorram"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
for(i=0;i<8;i++)
|
||||
void merlinmm(machine_config &config);
|
||||
void pingpong(machine_config &config);
|
||||
|
||||
void init_merlinmm();
|
||||
|
||||
protected:
|
||||
virtual void video_start() override;
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
|
||||
void merlinmm_map(address_map &map);
|
||||
|
||||
private:
|
||||
required_shared_ptr<uint8_t> m_colorram;
|
||||
required_shared_ptr<uint8_t> m_videoram;
|
||||
required_shared_ptr<uint8_t> m_spriteram;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
tilemap_t *m_bg_tilemap = nullptr;
|
||||
uint8_t m_int_enable = 0;
|
||||
|
||||
void coin_w(uint8_t data);
|
||||
void videoram_w(offs_t offset, uint8_t data);
|
||||
void colorram_w(offs_t offset, uint8_t data);
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
void palette(palette_device &palette) const;
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(pingpong_interrupt);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(merlinmm_interrupt);
|
||||
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
void pingpong_map(address_map &map);
|
||||
};
|
||||
|
||||
class cashquiz_state : public pingpong_state
|
||||
{
|
||||
public:
|
||||
cashquiz_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
pingpong_state(mconfig, type, tag),
|
||||
m_banks(*this, "bank%d", 1U)
|
||||
{ }
|
||||
|
||||
void cashquiz(machine_config &config);
|
||||
|
||||
void init_cashquiz();
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
|
||||
private:
|
||||
required_memory_bank_array<8> m_banks;
|
||||
|
||||
uint32_t m_question_addr_high = 0;
|
||||
|
||||
void question_bank_high_w(uint8_t data);
|
||||
void question_bank_low_w(uint8_t data);
|
||||
|
||||
void prg_map(address_map &map);
|
||||
};
|
||||
|
||||
|
||||
// video
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Convert the color PROMs into a more useable format.
|
||||
|
||||
Ping Pong has a 32 bytes palette PROM and two 256 bytes color lookup table
|
||||
PROMs (one for sprites, one for characters).
|
||||
I don't know for sure how the palette PROM is connected to the RGB output,
|
||||
but it's probably the usual:
|
||||
|
||||
bit 7 -- 220 ohm resistor -- BLUE
|
||||
-- 470 ohm resistor -- BLUE
|
||||
-- 220 ohm resistor -- GREEN
|
||||
-- 470 ohm resistor -- GREEN
|
||||
-- 1 kohm resistor -- GREEN
|
||||
-- 220 ohm resistor -- RED
|
||||
-- 470 ohm resistor -- RED
|
||||
bit 0 -- 1 kohm resistor -- RED
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void pingpong_state::palette(palette_device &palette) const
|
||||
{
|
||||
const uint8_t *color_prom = memregion("proms")->base();
|
||||
|
||||
// create a lookup table for the palette
|
||||
for (int i = 0; i < 0x20; i++)
|
||||
{
|
||||
int bit0, bit1, bit2;
|
||||
|
||||
// red component
|
||||
bit0 = BIT(color_prom[i], 0);
|
||||
bit1 = BIT(color_prom[i], 1);
|
||||
bit2 = BIT(color_prom[i], 2);
|
||||
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||
|
||||
// green component
|
||||
bit0 = BIT(color_prom[i], 3);
|
||||
bit1 = BIT(color_prom[i], 4);
|
||||
bit2 = BIT(color_prom[i], 5);
|
||||
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||
|
||||
// blue component
|
||||
bit0 = 0;
|
||||
bit1 = BIT(color_prom[i], 6);
|
||||
bit2 = BIT(color_prom[i], 7);
|
||||
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||
|
||||
palette.set_indirect_color(i, rgb_t(r, g, b));
|
||||
}
|
||||
|
||||
// color_prom now points to the beginning of the lookup table
|
||||
color_prom += 0x20;
|
||||
|
||||
// characters
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
|
||||
// sprites
|
||||
for (int i = 0x100; i < 0x200; i++)
|
||||
{
|
||||
uint8_t const ctabentry = bitswap<8>(color_prom[i], 7, 6, 5, 4, 0, 1, 2, 3);
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
}
|
||||
|
||||
void pingpong_state::videoram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_videoram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
void pingpong_state::colorram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_colorram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
TILE_GET_INFO_MEMBER(pingpong_state::get_bg_tile_info)
|
||||
{
|
||||
int const attr = m_colorram[tile_index];
|
||||
int const code = m_videoram[tile_index] + ((attr & 0x20) << 3);
|
||||
int const color = attr & 0x1f;
|
||||
int const flags = ((attr & 0x40) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0);
|
||||
|
||||
tileinfo.set(0, code, color, flags);
|
||||
}
|
||||
|
||||
void pingpong_state::video_start()
|
||||
{
|
||||
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pingpong_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
|
||||
save_item(NAME(m_int_enable));
|
||||
}
|
||||
|
||||
void pingpong_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
/* This is strange; it's unlikely that the sprites actually have a hardware
|
||||
clipping region, but I haven't found another way to have them masked by
|
||||
the characters at the top and bottom of the screen. */
|
||||
const rectangle spritevisiblearea(0*8, 32*8-1, 4*8, 29*8-1);
|
||||
|
||||
for (int offs = m_spriteram.bytes() - 4;offs >= 0;offs -= 4)
|
||||
{
|
||||
int const sx = m_spriteram[offs + 3];
|
||||
int const sy = 241 - m_spriteram[offs + 1];
|
||||
|
||||
int const flipx = m_spriteram[offs] & 0x40;
|
||||
int const flipy = m_spriteram[offs] & 0x80;
|
||||
int const color = m_spriteram[offs] & 0x1f;
|
||||
int const schar = m_spriteram[offs + 2] & 0x7f;
|
||||
|
||||
m_gfxdecode->gfx(1)->transmask(bitmap, spritevisiblearea,
|
||||
schar,
|
||||
color,
|
||||
flipx, flipy,
|
||||
sx, sy,
|
||||
m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 0));
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t pingpong_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
||||
draw_sprites(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// machine
|
||||
|
||||
void cashquiz_state::machine_start()
|
||||
{
|
||||
|
||||
// configure banks and setup defaults
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
m_banks[i]->configure_entries(0, 1024, memregion("questions")->base(), 0x100);
|
||||
m_banks[i]->set_entry(i);
|
||||
}
|
||||
|
||||
save_item(NAME(m_question_addr_high));
|
||||
}
|
||||
|
||||
void cashquiz_state::question_bank_high_w(uint8_t data)
|
||||
{
|
||||
if (data != 0xff)
|
||||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
if((~data & 0xff) == 1 << i)
|
||||
if ((~data & 0xff) == 1 << i)
|
||||
{
|
||||
m_question_addr_high = i*0x8000;
|
||||
m_question_addr_high = i;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void pingpong_state::cashquiz_question_bank_low_w(uint8_t data)
|
||||
void cashquiz_state::question_bank_low_w(uint8_t data)
|
||||
{
|
||||
if(data >= 0x60 && data <= 0xdf)
|
||||
if (data >= 0x60 && data <= 0xdf)
|
||||
{
|
||||
int bankaddr = m_question_addr_high | ((data - 0x60) * 0x100);
|
||||
uint8_t *questions = memregion("user1")->base() + bankaddr;
|
||||
m_banks[data & 7]->set_base(questions);
|
||||
|
||||
int const bankaddr = (m_question_addr_high << 7) | (data - 0x60);
|
||||
m_banks[data & 7]->set_entry(bankaddr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void pingpong_state::coin_w(uint8_t data)
|
||||
{
|
||||
/* bit 2 = irq enable, bit 3 = nmi enable */
|
||||
m_intenable = data & 0x0c;
|
||||
// bit 2 = irq enable, bit 3 = nmi enable
|
||||
m_int_enable = data & 0x0c;
|
||||
|
||||
/* bit 0/1 = coin counters */
|
||||
machine().bookkeeping().coin_counter_w(0,data & 1);
|
||||
machine().bookkeeping().coin_counter_w(1,data & 2);
|
||||
// bit 0/1 = coin counters
|
||||
machine().bookkeeping().coin_counter_w(0, data & 1);
|
||||
machine().bookkeeping().coin_counter_w(1, data & 2);
|
||||
|
||||
/* other bits unknown */
|
||||
// other bits unknown
|
||||
}
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(pingpong_state::pingpong_interrupt)
|
||||
{
|
||||
int scanline = param;
|
||||
int const scanline = param;
|
||||
|
||||
if (scanline == 240)
|
||||
{
|
||||
if (m_intenable & 0x04) m_maincpu->set_input_line(0, HOLD_LINE);
|
||||
if (m_int_enable & 0x04) m_maincpu->set_input_line(0, HOLD_LINE);
|
||||
}
|
||||
else if ((scanline % 32) == 0)
|
||||
{
|
||||
if (m_intenable & 0x08) m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
|
||||
if (m_int_enable & 0x08) m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
|
||||
}
|
||||
}
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(pingpong_state::merlinmm_interrupt)
|
||||
{
|
||||
int scanline = param;
|
||||
int const scanline = param;
|
||||
|
||||
if (scanline == 240)
|
||||
{
|
||||
if (m_intenable & 0x04) m_maincpu->set_input_line(0, HOLD_LINE);
|
||||
if (m_int_enable & 0x04) m_maincpu->set_input_line(0, HOLD_LINE);
|
||||
}
|
||||
else if (scanline == 0)
|
||||
{
|
||||
if (m_intenable & 0x08) m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
|
||||
if (m_int_enable & 0x08) m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
|
||||
}
|
||||
}
|
||||
|
||||
void pingpong_state::pingpong_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x7fff).rom();
|
||||
map(0x8000, 0x83ff).ram().w(FUNC(pingpong_state::pingpong_colorram_w)).share("colorram");
|
||||
map(0x8400, 0x87ff).ram().w(FUNC(pingpong_state::pingpong_videoram_w)).share("videoram");
|
||||
map(0x8000, 0x83ff).ram().w(FUNC(pingpong_state::colorram_w)).share(m_colorram);
|
||||
map(0x8400, 0x87ff).ram().w(FUNC(pingpong_state::videoram_w)).share(m_videoram);
|
||||
map(0x9000, 0x9002).ram();
|
||||
map(0x9003, 0x9052).ram().share("spriteram");
|
||||
map(0x9003, 0x9052).ram().share(m_spriteram);
|
||||
map(0x9053, 0x97ff).ram();
|
||||
map(0xa000, 0xa000).w(FUNC(pingpong_state::coin_w)); // coin counters + irq enables
|
||||
map(0xa200, 0xa200).nopw(); // SN76496 data latch
|
||||
map(0xa400, 0xa400).w("snsnd", FUNC(sn76496_device::write)); // trigger read
|
||||
map(0xa600, 0xa600).w("watchdog", FUNC(watchdog_timer_device::reset_w));
|
||||
map(0xa800, 0xa800).portr("SYSTEM");
|
||||
map(0xa880, 0xa880).portr("INPUTS");
|
||||
map(0xa900, 0xa900).portr("DSW1");
|
||||
map(0xa980, 0xa980).portr("DSW2");
|
||||
map(0xa000, 0xa000).w(FUNC(pingpong_state::coin_w)); /* coin counters + irq enables */
|
||||
map(0xa200, 0xa200).nopw(); /* SN76496 data latch */
|
||||
map(0xa400, 0xa400).w("snsnd", FUNC(sn76496_device::write)); /* trigger read */
|
||||
map(0xa600, 0xa600).w("watchdog", FUNC(watchdog_timer_device::reset_w));
|
||||
}
|
||||
|
||||
void pingpong_state::merlinmm_map(address_map &map)
|
||||
@ -110,39 +335,39 @@ void pingpong_state::merlinmm_map(address_map &map)
|
||||
map(0x0000, 0x3fff).rom();
|
||||
map(0x5000, 0x53ff).ram().share("nvram");
|
||||
map(0x5400, 0x57ff).ram();
|
||||
map(0x6000, 0x6007).nopw(); /* solenoid writes */
|
||||
map(0x6000, 0x6007).nopw(); // solenoid writes
|
||||
map(0x7000, 0x7000).portr("IN4");
|
||||
map(0x8000, 0x83ff).ram().w(FUNC(pingpong_state::pingpong_colorram_w)).share("colorram");
|
||||
map(0x8400, 0x87ff).ram().w(FUNC(pingpong_state::pingpong_videoram_w)).share("videoram");
|
||||
map(0x8000, 0x83ff).ram().w(FUNC(pingpong_state::colorram_w)).share(m_colorram);
|
||||
map(0x8400, 0x87ff).ram().w(FUNC(pingpong_state::videoram_w)).share(m_videoram);
|
||||
map(0x9000, 0x9002).ram();
|
||||
map(0x9003, 0x9052).ram().share("spriteram");
|
||||
map(0x9003, 0x9052).ram().share(m_spriteram);
|
||||
map(0x9053, 0x97ff).ram();
|
||||
map(0xa000, 0xa000).w(FUNC(pingpong_state::coin_w)); /* irq enables */
|
||||
map(0xa000, 0xa000).w(FUNC(pingpong_state::coin_w)); // irq enables
|
||||
map(0xa000, 0xa000).portr("IN0");
|
||||
map(0xa080, 0xa080).portr("IN1");
|
||||
map(0xa100, 0xa100).portr("IN2");
|
||||
map(0xa180, 0xa180).portr("IN3");
|
||||
map(0xa200, 0xa200).nopw(); /* SN76496 data latch */
|
||||
map(0xa400, 0xa400).w("snsnd", FUNC(sn76496_device::write)); /* trigger read */
|
||||
map(0xa200, 0xa200).nopw(); // SN76496 data latch
|
||||
map(0xa400, 0xa400).w("snsnd", FUNC(sn76496_device::write)); // trigger read
|
||||
map(0xa600, 0xa600).w("watchdog", FUNC(watchdog_timer_device::reset_w));
|
||||
}
|
||||
|
||||
void pingpong_state::cashquiz_map(address_map &map)
|
||||
void cashquiz_state::prg_map(address_map &map)
|
||||
{
|
||||
merlinmm_map(map);
|
||||
map(0x5000, 0x57ff).unmaprw();
|
||||
|
||||
map(0x4000, 0x4000).w(FUNC(pingpong_state::cashquiz_question_bank_high_w));
|
||||
map(0x4001, 0x4001).w(FUNC(pingpong_state::cashquiz_question_bank_low_w));
|
||||
map(0x4000, 0x4000).w(FUNC(cashquiz_state::question_bank_high_w));
|
||||
map(0x4001, 0x4001).w(FUNC(cashquiz_state::question_bank_low_w));
|
||||
|
||||
map(0x5000, 0x50ff).bankr("bank1");
|
||||
map(0x5100, 0x51ff).bankr("bank2");
|
||||
map(0x5200, 0x52ff).bankr("bank3");
|
||||
map(0x5300, 0x53ff).bankr("bank4");
|
||||
map(0x5400, 0x54ff).bankr("bank5");
|
||||
map(0x5500, 0x55ff).bankr("bank6");
|
||||
map(0x5600, 0x56ff).bankr("bank7");
|
||||
map(0x5700, 0x57ff).bankr("bank8");
|
||||
map(0x5000, 0x50ff).bankr(m_banks[0]);
|
||||
map(0x5100, 0x51ff).bankr(m_banks[1]);
|
||||
map(0x5200, 0x52ff).bankr(m_banks[2]);
|
||||
map(0x5300, 0x53ff).bankr(m_banks[3]);
|
||||
map(0x5400, 0x54ff).bankr(m_banks[4]);
|
||||
map(0x5500, 0x55ff).bankr(m_banks[5]);
|
||||
map(0x5600, 0x56ff).bankr(m_banks[6]);
|
||||
map(0x5700, 0x57ff).bankr(m_banks[7]);
|
||||
}
|
||||
|
||||
|
||||
@ -433,63 +658,63 @@ INPUT_PORTS_END
|
||||
|
||||
static const gfx_layout charlayout =
|
||||
{
|
||||
8,8, /* 8*8 characters */
|
||||
512, /* 512 characters */
|
||||
2, /* 2 bits per pixel */
|
||||
{ 4, 0 }, /* the bitplanes are packed in one nibble */
|
||||
{ 3, 2, 1, 0, 8*8+3, 8*8+2, 8*8+1, 8*8+0 }, /* x bit */
|
||||
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, /* y bit */
|
||||
16*8 /* every char takes 16 consecutive bytes */
|
||||
8,8, // 8*8 characters
|
||||
512, // 512 characters
|
||||
2, // 2 bits per pixel
|
||||
{ 4, 0 }, // the bitplanes are packed in one nibble
|
||||
{ 3, 2, 1, 0, 8*8+3, 8*8+2, 8*8+1, 8*8+0 }, // x bit
|
||||
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, // y bit
|
||||
16*8 // every char takes 16 consecutive bytes
|
||||
};
|
||||
|
||||
static const gfx_layout spritelayout =
|
||||
{
|
||||
16,16, /* 16*16 sprites */
|
||||
128, /* 128 sprites */
|
||||
2, /* 2 bits per pixel */
|
||||
{ 4, 0 }, /* the bitplanes are packed in one nibble */
|
||||
16,16, // 16*16 sprites */
|
||||
128, // 128 sprites */
|
||||
2, // 2 bits per pixel */
|
||||
{ 4, 0 }, // the bitplanes are packed in one nibble */
|
||||
{ 12*16+3,12*16+2,12*16+1,12*16+0,
|
||||
8*16+3, 8*16+2, 8*16+1, 8*16+0,
|
||||
4*16+3, 4*16+2, 4*16+1, 4*16+0,
|
||||
3, 2, 1, 0 }, /* x bit */
|
||||
3, 2, 1, 0 }, // x bit
|
||||
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
|
||||
32*8, 33*8, 34*8, 35*8, 36*8, 37*8, 38*8, 39*8 }, /* y bit */
|
||||
64*8 /* every char takes 64 consecutive bytes */
|
||||
32*8, 33*8, 34*8, 35*8, 36*8, 37*8, 38*8, 39*8 }, // y bit
|
||||
64*8 // every char takes 64 consecutive bytes
|
||||
};
|
||||
|
||||
static GFXDECODE_START( gfx_pingpong )
|
||||
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 64 )
|
||||
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 64*4, 64 )
|
||||
GFXDECODE_ENTRY( "tiles", 0, charlayout, 0, 64 )
|
||||
GFXDECODE_ENTRY( "sprites", 0, spritelayout, 64*4, 64 )
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
void pingpong_state::pingpong(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
Z80(config, m_maincpu,18432000/6); /* 3.072 MHz (probably) */
|
||||
// basic machine hardware
|
||||
Z80(config, m_maincpu,18'432'000 / 6); // 3.072 MHz (probably)
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &pingpong_state::pingpong_map);
|
||||
TIMER(config, "scantimer").configure_scanline(FUNC(pingpong_state::pingpong_interrupt), "screen", 0, 1);
|
||||
WATCHDOG_TIMER(config, "watchdog");
|
||||
|
||||
/* video hardware */
|
||||
// video hardware
|
||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
||||
screen.set_refresh_hz(60);
|
||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
||||
screen.set_size(456, 262);
|
||||
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
|
||||
screen.set_screen_update(FUNC(pingpong_state::screen_update_pingpong));
|
||||
screen.set_screen_update(FUNC(pingpong_state::screen_update));
|
||||
screen.set_palette(m_palette);
|
||||
|
||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pingpong);
|
||||
PALETTE(config, m_palette, FUNC(pingpong_state::pingpong_palette), 64*4+64*4, 32);
|
||||
PALETTE(config, m_palette, FUNC(pingpong_state::palette), 64*4+64*4, 32);
|
||||
|
||||
/* sound hardware */
|
||||
// sound hardware
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
SN76496(config, "snsnd", 18432000/8).add_route(ALL_OUTPUTS, "mono", 1.0);
|
||||
SN76496(config, "snsnd", 18'432'000 / 8).add_route(ALL_OUTPUTS, "mono", 1.0);
|
||||
}
|
||||
|
||||
/* too fast! */
|
||||
// too fast!
|
||||
void pingpong_state::merlinmm(machine_config &config)
|
||||
{
|
||||
pingpong(config);
|
||||
@ -499,10 +724,10 @@ void pingpong_state::merlinmm(machine_config &config)
|
||||
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
|
||||
}
|
||||
|
||||
void pingpong_state::cashquiz(machine_config &config)
|
||||
void cashquiz_state::cashquiz(machine_config &config)
|
||||
{
|
||||
merlinmm(config);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &pingpong_state::cashquiz_map);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &cashquiz_state::prg_map);
|
||||
}
|
||||
|
||||
|
||||
@ -512,45 +737,45 @@ void pingpong_state::cashquiz(machine_config &config)
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
ROM_START( pingpong ) /* GX555 - PWB200222A */
|
||||
ROM_START( pingpong ) // GX555 - PWB200222A
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
ROM_LOAD( "555_e04.7a", 0x0000, 0x4000, CRC(18552f8f) SHA1(cb03659b5e8a68003e72182a20979384d829280f) )
|
||||
ROM_LOAD( "555_e03.6a", 0x4000, 0x4000, CRC(ae5f01e8) SHA1(f0d6a2c64822f2662fed3f601e279db18246f894) )
|
||||
|
||||
ROM_REGION( 0x2000, "gfx1", 0 )
|
||||
ROM_REGION( 0x2000, "tiles", 0 )
|
||||
ROM_LOAD( "555_e01.7h", 0x0000, 0x2000, CRC(d1d6f090) SHA1(7b7d7cb90bed746dda871227463145263e4b0c5a) )
|
||||
|
||||
ROM_REGION( 0x2000, "gfx2", 0 )
|
||||
ROM_REGION( 0x2000, "sprites", 0 )
|
||||
ROM_LOAD( "555_e02.12c", 0x0000, 0x2000, CRC(33c687e0) SHA1(7c90de4d163d2ffad00c8cb6a194fa6125a4f4c1) )
|
||||
|
||||
ROM_REGION( 0x0220, "proms", 0 )
|
||||
ROM_LOAD( "555e06.3j", 0x0000, 0x0020, CRC(3e04f06e) SHA1(a642c350f148e062d56eb2a2fc53c470603000e3) ) /* palette (this might be bad) */
|
||||
ROM_LOAD( "555e05.5h", 0x0020, 0x0100, CRC(8456046a) SHA1(8226f1325c14eb8aed5cd3c3d6bad9f9fd88c5fa) ) /* characters */
|
||||
ROM_LOAD( "555e07.11j", 0x0120, 0x0100, CRC(09d96b08) SHA1(81405e33eacc47f91ea4c7221d122f7e6f5b1e5d) ) /* sprites */
|
||||
ROM_LOAD( "555e06.3j", 0x0000, 0x0020, CRC(3e04f06e) SHA1(a642c350f148e062d56eb2a2fc53c470603000e3) ) // palette (this might be bad)
|
||||
ROM_LOAD( "555e05.5h", 0x0020, 0x0100, CRC(8456046a) SHA1(8226f1325c14eb8aed5cd3c3d6bad9f9fd88c5fa) ) // characters
|
||||
ROM_LOAD( "555e07.11j", 0x0120, 0x0100, CRC(09d96b08) SHA1(81405e33eacc47f91ea4c7221d122f7e6f5b1e5d) ) // sprites
|
||||
ROM_END
|
||||
|
||||
ROM_START( merlinmm )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
ROM_LOAD( "merlinmm.ic2", 0x0000, 0x4000, CRC(ea5b6590) SHA1(fdd5873c67761955e33260743cc45075dea34fb4) )
|
||||
|
||||
ROM_REGION( 0x2000, "gfx1", 0 )
|
||||
ROM_REGION( 0x2000, "tiles", 0 )
|
||||
ROM_LOAD( "merlinmm.7h", 0x0000, 0x2000, CRC(f7d535aa) SHA1(65f100c15b07ec3aa21f5ed132e2fbf6e9120dbe) )
|
||||
|
||||
ROM_REGION( 0x2000, "gfx2", 0 )
|
||||
ROM_REGION( 0x2000, "sprites", 0 )
|
||||
ROM_LOAD( "merl_sp.12c", 0x0000, 0x2000, CRC(517ecd57) SHA1(b0d4e2d106cddd6d19acd0e10f2d32544c84a900) )
|
||||
|
||||
ROM_REGION( 0x0220, "proms", 0 )
|
||||
ROM_LOAD( "merlinmm.3j", 0x0000, 0x0020, CRC(d56e91f4) SHA1(152d88e4d168f697030d96c02ab9aeb220cc765d) ) /* palette */
|
||||
ROM_LOAD( "pingpong.5h", 0x0020, 0x0100, CRC(8456046a) SHA1(8226f1325c14eb8aed5cd3c3d6bad9f9fd88c5fa) ) /* characters */
|
||||
ROM_LOAD( "pingpong.11j", 0x0120, 0x0100, CRC(09d96b08) SHA1(81405e33eacc47f91ea4c7221d122f7e6f5b1e5d) ) /* sprites */
|
||||
ROM_LOAD( "merlinmm.3j", 0x0000, 0x0020, CRC(d56e91f4) SHA1(152d88e4d168f697030d96c02ab9aeb220cc765d) ) // palette
|
||||
ROM_LOAD( "pingpong.5h", 0x0020, 0x0100, CRC(8456046a) SHA1(8226f1325c14eb8aed5cd3c3d6bad9f9fd88c5fa) ) // characters
|
||||
ROM_LOAD( "pingpong.11j", 0x0120, 0x0100, CRC(09d96b08) SHA1(81405e33eacc47f91ea4c7221d122f7e6f5b1e5d) ) // sprites
|
||||
ROM_END
|
||||
|
||||
ROM_START( cashquiz )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
ROM_LOAD( "cashqcv5.ic3", 0x0000, 0x4000, CRC(8e9e2bed) SHA1(1894d40f89226a810c703ce5e49fdfd64d70287f) )
|
||||
/* 0x4000 - 0x7fff = extra hardware for question board */
|
||||
// 0x4000 - 0x7fff = extra hardware for question board
|
||||
|
||||
ROM_REGION( 0x40000, "user1", 0 ) /* Question roms */
|
||||
ROM_REGION( 0x40000, "questions", 0 )
|
||||
ROM_LOAD( "q30_soaps.ic1", 0x02000, 0x6000, CRC(b35a30ac) SHA1(5daf52a6d973f5a1b1ec3395962bcab690c54e43) )
|
||||
ROM_CONTINUE( 0x00000, 0x2000 )
|
||||
ROM_LOAD( "q10.ic2", 0x0a000, 0x6000, CRC(54962e11) SHA1(3c89ac26ebc002b2bc723f1424a7ba3db7a98e5f) )
|
||||
@ -568,46 +793,44 @@ ROM_START( cashquiz )
|
||||
ROM_LOAD( "q19.ic8", 0x3a000, 0x6000, CRC(9f3f77e6) SHA1(aa1600215e774b090f379a0aae520027cd1795c1) )
|
||||
ROM_CONTINUE( 0x38000, 0x2000 )
|
||||
|
||||
ROM_REGION( 0x2000, "gfx1", 0 )
|
||||
ROM_REGION( 0x2000, "tiles", 0 )
|
||||
ROM_LOAD( "cashq.7h", 0x0000, 0x2000, CRC(44b72a4f) SHA1(a993f1570cf9d8f86d4229198e9b1a0d6a92e51f) )
|
||||
ROM_CONTINUE( 0x0000, 0x2000 ) /* rom is a 27128 in a 2764 socket */
|
||||
ROM_CONTINUE( 0x0000, 0x2000 ) // ROM is a 27128 in a 2764 socket
|
||||
|
||||
ROM_REGION( 0x2000, "gfx2", 0 )
|
||||
ROM_REGION( 0x2000, "sprites", 0 )
|
||||
ROM_LOAD( "cashq.12c", 0x0000, 0x2000, NO_DUMP ) // missing :-(
|
||||
|
||||
ROM_REGION( 0x0220, "proms", 0 )
|
||||
ROM_LOAD( "cashquiz.3j", 0x0000, 0x0020, CRC(dc70e23b) SHA1(90948f76d5c61eb57838e013aa93d733913a2d92) ) /* palette */
|
||||
ROM_LOAD( "pingpong.5h", 0x0020, 0x0100, CRC(8456046a) SHA1(8226f1325c14eb8aed5cd3c3d6bad9f9fd88c5fa) ) /* characters */
|
||||
ROM_LOAD( "pingpong.11j", 0x0120, 0x0100, CRC(09d96b08) SHA1(81405e33eacc47f91ea4c7221d122f7e6f5b1e5d) ) /* sprites */
|
||||
ROM_LOAD( "cashquiz.3j", 0x0000, 0x0020, CRC(dc70e23b) SHA1(90948f76d5c61eb57838e013aa93d733913a2d92) ) // palette
|
||||
ROM_LOAD( "pingpong.5h", 0x0020, 0x0100, CRC(8456046a) SHA1(8226f1325c14eb8aed5cd3c3d6bad9f9fd88c5fa) ) // characters
|
||||
ROM_LOAD( "pingpong.11j", 0x0120, 0x0100, CRC(09d96b08) SHA1(81405e33eacc47f91ea4c7221d122f7e6f5b1e5d) ) // sprites
|
||||
ROM_END
|
||||
|
||||
void pingpong_state::init_merlinmm()
|
||||
{
|
||||
uint8_t *ROM = memregion("maincpu")->base();
|
||||
uint8_t *rom = memregion("maincpu")->base();
|
||||
|
||||
/* decrypt program code */
|
||||
// decrypt program code
|
||||
for (int i = 0; i < 0x4000; i++)
|
||||
ROM[i] = bitswap<8>(ROM[i],0,1,2,3,4,5,6,7);
|
||||
rom[i] = bitswap<8>(rom[i], 0, 1, 2, 3, 4, 5, 6, 7);
|
||||
}
|
||||
|
||||
void pingpong_state::init_cashquiz()
|
||||
void cashquiz_state::init_cashquiz()
|
||||
{
|
||||
/* decrypt program code */
|
||||
uint8_t *ROM = memregion("maincpu")->base();
|
||||
// decrypt program code
|
||||
uint8_t *rom = memregion("maincpu")->base();
|
||||
for (int i = 0; i < 0x4000; i++)
|
||||
ROM[i] = bitswap<8>(ROM[i],0,1,2,3,4,5,6,7);
|
||||
rom[i] = bitswap<8>(rom[i], 0, 1, 2, 3, 4, 5, 6, 7);
|
||||
|
||||
/* decrypt questions */
|
||||
ROM = memregion("user1")->base();
|
||||
// decrypt questions
|
||||
rom = memregion("questions")->base();
|
||||
for (int i = 0; i < 0x40000; i++)
|
||||
ROM[i] = bitswap<8>(ROM[i],0,1,2,3,4,5,6,7);
|
||||
|
||||
// setup default banks
|
||||
for(int i=0; i<8; i++)
|
||||
m_banks[i]->set_base(memregion("user1")->base() + 0x100*i);
|
||||
rom[i] = bitswap<8>(rom[i], 0, 1, 2, 3, 4, 5, 6, 7);
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
GAME( 1985, pingpong, 0, pingpong, pingpong, pingpong_state, empty_init, ROT0, "Konami", "Konami's Ping-Pong", 0 )
|
||||
GAME( 1986, merlinmm, 0, merlinmm, merlinmm, pingpong_state, init_merlinmm, ROT90, "Zilec-Zenitone", "Merlins Money Maze", 0 )
|
||||
GAME( 1986, cashquiz, 0, cashquiz, cashquiz, pingpong_state, init_cashquiz, ROT0, "Zilec-Zenitone", "Cash Quiz (Type B, Version 5)", MACHINE_IMPERFECT_GRAPHICS )
|
||||
|
||||
GAME( 1985, pingpong, 0, pingpong, pingpong, pingpong_state, empty_init, ROT0, "Konami", "Konami's Ping-Pong", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1986, merlinmm, 0, merlinmm, merlinmm, pingpong_state, init_merlinmm, ROT90, "Zilec-Zenitone", "Merlins Money Maze", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1986, cashquiz, 0, cashquiz, cashquiz, cashquiz_state, init_cashquiz, ROT0, "Zilec-Zenitone", "Cash Quiz (Type B, Version 5)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
|
||||
|
@ -1,59 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Jarek Parchanski
|
||||
#ifndef MAME_INCLUDES_PINGPONG_H
|
||||
#define MAME_INCLUDES_PINGPONG_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "machine/timer.h"
|
||||
#include "emupal.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
class pingpong_state : public driver_device
|
||||
{
|
||||
public:
|
||||
pingpong_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this,"maincpu"),
|
||||
m_colorram(*this, "colorram"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_palette(*this, "palette"),
|
||||
m_banks(*this, "bank%d", 1U)
|
||||
{ }
|
||||
|
||||
int m_intenable = 0;
|
||||
int m_question_addr_high = 0;
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_shared_ptr<uint8_t> m_colorram;
|
||||
required_shared_ptr<uint8_t> m_videoram;
|
||||
required_shared_ptr<uint8_t> m_spriteram;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
optional_memory_bank_array<8> m_banks;
|
||||
tilemap_t *m_bg_tilemap = nullptr;
|
||||
|
||||
void cashquiz_question_bank_high_w(uint8_t data);
|
||||
void cashquiz_question_bank_low_w(uint8_t data);
|
||||
void coin_w(uint8_t data);
|
||||
void pingpong_videoram_w(offs_t offset, uint8_t data);
|
||||
void pingpong_colorram_w(offs_t offset, uint8_t data);
|
||||
void init_cashquiz();
|
||||
void init_merlinmm();
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
virtual void video_start() override;
|
||||
void pingpong_palette(palette_device &palette) const;
|
||||
uint32_t screen_update_pingpong(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(pingpong_interrupt);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(merlinmm_interrupt);
|
||||
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect );
|
||||
void merlinmm(machine_config &config);
|
||||
void pingpong(machine_config &config);
|
||||
void cashquiz(machine_config &config);
|
||||
void merlinmm_map(address_map &map);
|
||||
void pingpong_map(address_map &map);
|
||||
void cashquiz_map(address_map &map);
|
||||
};
|
||||
|
||||
#endif // MAME_INCLUDES_PINGPONG_H
|
@ -1,147 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Jarek Parchanski
|
||||
/***************************************************************************
|
||||
|
||||
video.c
|
||||
|
||||
Functions to emulate the video hardware of the machine.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "pingpong.h"
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Convert the color PROMs into a more useable format.
|
||||
|
||||
Ping Pong has a 32 bytes palette PROM and two 256 bytes color lookup table
|
||||
PROMs (one for sprites, one for characters).
|
||||
I don't know for sure how the palette PROM is connected to the RGB output,
|
||||
but it's probably the usual:
|
||||
|
||||
bit 7 -- 220 ohm resistor -- BLUE
|
||||
-- 470 ohm resistor -- BLUE
|
||||
-- 220 ohm resistor -- GREEN
|
||||
-- 470 ohm resistor -- GREEN
|
||||
-- 1 kohm resistor -- GREEN
|
||||
-- 220 ohm resistor -- RED
|
||||
-- 470 ohm resistor -- RED
|
||||
bit 0 -- 1 kohm resistor -- RED
|
||||
|
||||
***************************************************************************/
|
||||
void pingpong_state::pingpong_palette(palette_device &palette) const
|
||||
{
|
||||
const uint8_t *color_prom = memregion("proms")->base();
|
||||
|
||||
// create a lookup table for the palette
|
||||
for (int i = 0; i < 0x20; i++)
|
||||
{
|
||||
int bit0, bit1, bit2;
|
||||
|
||||
// red component
|
||||
bit0 = BIT(color_prom[i], 0);
|
||||
bit1 = BIT(color_prom[i], 1);
|
||||
bit2 = BIT(color_prom[i], 2);
|
||||
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||
|
||||
// green component
|
||||
bit0 = BIT(color_prom[i], 3);
|
||||
bit1 = BIT(color_prom[i], 4);
|
||||
bit2 = BIT(color_prom[i], 5);
|
||||
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||
|
||||
// blue component
|
||||
bit0 = 0;
|
||||
bit1 = BIT(color_prom[i], 6);
|
||||
bit2 = BIT(color_prom[i], 7);
|
||||
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||
|
||||
palette.set_indirect_color(i, rgb_t(r, g, b));
|
||||
}
|
||||
|
||||
// color_prom now points to the beginning of the lookup table
|
||||
color_prom += 0x20;
|
||||
|
||||
// characters
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
|
||||
// sprites
|
||||
for (int i = 0x100; i < 0x200; i++)
|
||||
{
|
||||
uint8_t const ctabentry = bitswap<8>(color_prom[i],7,6,5,4,0,1,2,3);
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
}
|
||||
|
||||
void pingpong_state::pingpong_videoram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_videoram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
void pingpong_state::pingpong_colorram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_colorram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
TILE_GET_INFO_MEMBER(pingpong_state::get_bg_tile_info)
|
||||
{
|
||||
int attr = m_colorram[tile_index];
|
||||
int code = m_videoram[tile_index] + ((attr & 0x20) << 3);
|
||||
int color = attr & 0x1f;
|
||||
int flags = ((attr & 0x40) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0);
|
||||
|
||||
tileinfo.set(0, code, color, flags);
|
||||
}
|
||||
|
||||
void pingpong_state::video_start()
|
||||
{
|
||||
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pingpong_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
}
|
||||
|
||||
void pingpong_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect )
|
||||
{
|
||||
/* This is strange; it's unlikely that the sprites actually have a hardware */
|
||||
/* clipping region, but I haven't found another way to have them masked by */
|
||||
/* the characters at the top and bottom of the screen. */
|
||||
const rectangle spritevisiblearea(0*8, 32*8-1, 4*8, 29*8-1);
|
||||
|
||||
uint8_t *spriteram = m_spriteram;
|
||||
int offs;
|
||||
|
||||
for (offs = m_spriteram.bytes() - 4;offs >= 0;offs -= 4)
|
||||
{
|
||||
int sx,sy,flipx,flipy,color,schar;
|
||||
|
||||
|
||||
sx = spriteram[offs + 3];
|
||||
sy = 241 - spriteram[offs + 1];
|
||||
|
||||
flipx = spriteram[offs] & 0x40;
|
||||
flipy = spriteram[offs] & 0x80;
|
||||
color = spriteram[offs] & 0x1f;
|
||||
schar = spriteram[offs + 2] & 0x7f;
|
||||
|
||||
m_gfxdecode->gfx(1)->transmask(bitmap,spritevisiblearea,
|
||||
schar,
|
||||
color,
|
||||
flipx,flipy,
|
||||
sx,sy,
|
||||
m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 0));
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t pingpong_state::screen_update_pingpong(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
||||
draw_sprites(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
@ -1,8 +1,10 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Allard van der Bas
|
||||
// copyright-holders: Allard van der Bas
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Pooyan
|
||||
GX320
|
||||
|
||||
Original driver by Allard van der Bas
|
||||
|
||||
@ -11,19 +13,252 @@
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "pooyan.h"
|
||||
|
||||
#include "konamipt.h"
|
||||
#include "timeplt_a.h"
|
||||
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/74259.h"
|
||||
#include "machine/watchdog.h"
|
||||
#include "video/resnet.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
|
||||
#define MASTER_CLOCK XTAL(18'432'000)
|
||||
namespace {
|
||||
|
||||
class pooyan_state : public driver_device
|
||||
{
|
||||
public:
|
||||
pooyan_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_palette(*this, "palette"),
|
||||
m_colorram(*this, "colorram"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_spriteram(*this, "spriteram%u", 1U)
|
||||
{ }
|
||||
|
||||
void pooyan(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
virtual void video_start() override;
|
||||
|
||||
private:
|
||||
// devices
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
// memory pointers
|
||||
required_shared_ptr<uint8_t> m_colorram;
|
||||
required_shared_ptr<uint8_t> m_videoram;
|
||||
required_shared_ptr_array<uint8_t, 2> m_spriteram;
|
||||
|
||||
// video-related
|
||||
tilemap_t *m_bg_tilemap = nullptr;
|
||||
|
||||
// misc
|
||||
uint8_t m_irq_enable = 0;
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(irq_enable_w);
|
||||
template <uint8_t Which> DECLARE_WRITE_LINE_MEMBER(coin_counter_w);
|
||||
void videoram_w(offs_t offset, uint8_t data);
|
||||
void colorram_w(offs_t offset, uint8_t data);
|
||||
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
|
||||
void palette(palette_device &palette) const;
|
||||
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
|
||||
void main_map(address_map &map);
|
||||
};
|
||||
|
||||
|
||||
// video
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Convert the color PROMs into a more useable format.
|
||||
|
||||
Pooyan has one 32x8 palette PROM and two 256x4 lookup table PROMs
|
||||
(one for characters, one for sprites).
|
||||
The palette PROM is connected to the RGB output this way:
|
||||
|
||||
bit 7 -- 220 ohm resistor -- BLUE
|
||||
-- 470 ohm resistor -- BLUE
|
||||
-- 220 ohm resistor -- GREEN
|
||||
-- 470 ohm resistor -- GREEN
|
||||
-- 1 kohm resistor -- GREEN
|
||||
-- 220 ohm resistor -- RED
|
||||
-- 470 ohm resistor -- RED
|
||||
bit 0 -- 1 kohm resistor -- RED
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void pooyan_state::palette(palette_device &palette) const
|
||||
{
|
||||
const uint8_t *color_prom = memregion("proms")->base();
|
||||
static constexpr int resistances_rg[3] = { 1000, 470, 220 };
|
||||
static constexpr int resistances_b [2] = { 470, 220 };
|
||||
|
||||
// compute the color output resistor weights
|
||||
double rweights[3], gweights[3], bweights[2];
|
||||
compute_resistor_weights(0, 255, -1.0,
|
||||
3, resistances_rg, rweights, 1000, 0,
|
||||
3, resistances_rg, gweights, 1000, 0,
|
||||
2, resistances_b, bweights, 1000, 0);
|
||||
|
||||
// create a lookup table for the palette
|
||||
for (int i = 0; i < 0x20; i++)
|
||||
{
|
||||
int bit0, bit1, bit2;
|
||||
|
||||
// red component
|
||||
bit0 = BIT(color_prom[i], 0);
|
||||
bit1 = BIT(color_prom[i], 1);
|
||||
bit2 = BIT(color_prom[i], 2);
|
||||
int const r = combine_weights(rweights, bit0, bit1, bit2);
|
||||
|
||||
// green component
|
||||
bit0 = BIT(color_prom[i], 3);
|
||||
bit1 = BIT(color_prom[i], 4);
|
||||
bit2 = BIT(color_prom[i], 5);
|
||||
int const g = combine_weights(gweights, bit0, bit1, bit2);
|
||||
|
||||
// blue component
|
||||
bit0 = BIT(color_prom[i], 6);
|
||||
bit1 = BIT(color_prom[i], 7);
|
||||
int const b = combine_weights(bweights, bit0, bit1);
|
||||
|
||||
palette.set_indirect_color(i, rgb_t(r, g, b));
|
||||
}
|
||||
|
||||
// color_prom now points to the beginning of the lookup table
|
||||
color_prom += 0x20;
|
||||
|
||||
// characters
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
|
||||
// sprites
|
||||
for (int i = 0x100; i < 0x200; i++)
|
||||
{
|
||||
uint8_t const ctabentry = color_prom[i] & 0x0f;
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Tilemap info callback
|
||||
*
|
||||
*************************************/
|
||||
|
||||
TILE_GET_INFO_MEMBER(pooyan_state::get_bg_tile_info)
|
||||
{
|
||||
int const attr = m_colorram[tile_index];
|
||||
int const code = m_videoram[tile_index];
|
||||
int const color = attr & 0x0f;
|
||||
int const flags = TILE_FLIPYX(attr >> 6);
|
||||
|
||||
tileinfo.set(0, code, color, flags);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Video startup
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void pooyan_state::video_start()
|
||||
{
|
||||
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pooyan_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Memory write handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void pooyan_state::videoram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_videoram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
|
||||
void pooyan_state::colorram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_colorram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Sprite rendering
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void pooyan_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
for (int offs = 0x10; offs < 0x40; offs += 2)
|
||||
{
|
||||
int const sx = m_spriteram[0][offs];
|
||||
int const sy = 240 - m_spriteram[1][offs + 1];
|
||||
|
||||
int const code = m_spriteram[0][offs + 1];
|
||||
int const color = m_spriteram[1][offs] & 0x0f;
|
||||
int const flipx = ~m_spriteram[1][offs] & 0x40;
|
||||
int const flipy = m_spriteram[1][offs] & 0x80;
|
||||
|
||||
|
||||
m_gfxdecode->gfx(1)->transmask(bitmap, cliprect,
|
||||
code,
|
||||
color,
|
||||
flipx, flipy,
|
||||
sx, sy,
|
||||
m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 0));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Video update
|
||||
*
|
||||
*************************************/
|
||||
|
||||
uint32_t pooyan_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
||||
draw_sprites(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// machine
|
||||
|
||||
/*************************************
|
||||
*
|
||||
@ -46,15 +281,10 @@ WRITE_LINE_MEMBER(pooyan_state::irq_enable_w)
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(pooyan_state::coin_counter_1_w)
|
||||
template <uint8_t Which>
|
||||
WRITE_LINE_MEMBER(pooyan_state::coin_counter_w)
|
||||
{
|
||||
machine().bookkeeping().coin_counter_w(0, state);
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(pooyan_state::coin_counter_2_w)
|
||||
{
|
||||
machine().bookkeeping().coin_counter_w(1, state);
|
||||
machine().bookkeeping().coin_counter_w(Which, state);
|
||||
}
|
||||
|
||||
|
||||
@ -67,11 +297,11 @@ WRITE_LINE_MEMBER(pooyan_state::coin_counter_2_w)
|
||||
void pooyan_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x7fff).rom();
|
||||
map(0x8000, 0x83ff).ram().w(FUNC(pooyan_state::colorram_w)).share("colorram");
|
||||
map(0x8400, 0x87ff).ram().w(FUNC(pooyan_state::videoram_w)).share("videoram");
|
||||
map(0x8000, 0x83ff).ram().w(FUNC(pooyan_state::colorram_w)).share(m_colorram);
|
||||
map(0x8400, 0x87ff).ram().w(FUNC(pooyan_state::videoram_w)).share(m_videoram);
|
||||
map(0x8800, 0x8fff).ram();
|
||||
map(0x9000, 0x90ff).mirror(0x0b00).ram().share("spriteram");
|
||||
map(0x9400, 0x94ff).mirror(0x0b00).ram().share("spriteram2");
|
||||
map(0x9000, 0x90ff).mirror(0x0b00).ram().share(m_spriteram[0]);
|
||||
map(0x9400, 0x94ff).mirror(0x0b00).ram().share(m_spriteram[1]);
|
||||
map(0xa000, 0xa000).mirror(0x5e7f).portr("DSW1");
|
||||
map(0xa080, 0xa080).mirror(0x5e1f).portr("IN0");
|
||||
map(0xa0a0, 0xa0a0).mirror(0x5e1f).portr("IN1");
|
||||
@ -115,7 +345,7 @@ static INPUT_PORTS_START( pooyan )
|
||||
|
||||
PORT_START("DSW0")
|
||||
KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1)
|
||||
/* Invalid = both coin slots disabled */
|
||||
// Invalid = both coin slots disabled
|
||||
|
||||
PORT_START("DSW1")
|
||||
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
|
||||
@ -175,8 +405,8 @@ static const gfx_layout spritelayout =
|
||||
|
||||
|
||||
static GFXDECODE_START( gfx_pooyan )
|
||||
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 16 )
|
||||
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 16*16, 16 )
|
||||
GFXDECODE_ENTRY( "tiles", 0, charlayout, 0, 16 )
|
||||
GFXDECODE_ENTRY( "sprites", 0, spritelayout, 16*16, 16 )
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
@ -195,22 +425,24 @@ void pooyan_state::machine_start()
|
||||
|
||||
void pooyan_state::pooyan(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
Z80(config, m_maincpu, MASTER_CLOCK/3/2);
|
||||
static constexpr XTAL MASTER_CLOCK = XTAL(18'432'000);
|
||||
|
||||
// basic machine hardware
|
||||
Z80(config, m_maincpu, MASTER_CLOCK / 3 / 2);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &pooyan_state::main_map);
|
||||
|
||||
ls259_device &mainlatch(LS259(config, "mainlatch")); // B2
|
||||
mainlatch.q_out_cb<0>().set(FUNC(pooyan_state::irq_enable_w));
|
||||
mainlatch.q_out_cb<1>().set("timeplt_audio", FUNC(timeplt_audio_device::sh_irqtrigger_w));
|
||||
mainlatch.q_out_cb<2>().set("timeplt_audio", FUNC(timeplt_audio_device::mute_w));
|
||||
mainlatch.q_out_cb<3>().set(FUNC(pooyan_state::coin_counter_1_w));
|
||||
mainlatch.q_out_cb<4>().set(FUNC(pooyan_state::coin_counter_2_w));
|
||||
mainlatch.q_out_cb<3>().set(FUNC(pooyan_state::coin_counter_w<0>));
|
||||
mainlatch.q_out_cb<4>().set(FUNC(pooyan_state::coin_counter_w<1>));
|
||||
mainlatch.q_out_cb<5>().set_nop(); // PAY OUT - not used
|
||||
mainlatch.q_out_cb<7>().set(FUNC(pooyan_state::flipscreen_w));
|
||||
mainlatch.q_out_cb<7>().set(FUNC(pooyan_state::flip_screen_set)).invert();
|
||||
|
||||
WATCHDOG_TIMER(config, "watchdog");
|
||||
|
||||
/* video hardware */
|
||||
// video hardware
|
||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
||||
screen.set_refresh_hz(60);
|
||||
screen.set_size(32*8, 32*8);
|
||||
@ -220,9 +452,9 @@ void pooyan_state::pooyan(machine_config &config)
|
||||
screen.screen_vblank().set(FUNC(pooyan_state::vblank_irq));
|
||||
|
||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pooyan);
|
||||
PALETTE(config, m_palette, FUNC(pooyan_state::pooyan_palette), 16*16+16*16, 32);
|
||||
PALETTE(config, m_palette, FUNC(pooyan_state::palette), 16*16+16*16, 32);
|
||||
|
||||
/* sound hardware */
|
||||
// sound hardware
|
||||
TIMEPLT_AUDIO(config, "timeplt_audio");
|
||||
}
|
||||
|
||||
@ -244,18 +476,18 @@ ROM_START( pooyan )
|
||||
ROM_LOAD( "xx.7a", 0x0000, 0x1000, CRC(fbe2b368) SHA1(5689a84ef110bdc0039ad1a6c5778e0b8eccfce0) )
|
||||
ROM_LOAD( "xx.8a", 0x1000, 0x1000, CRC(e1795b3d) SHA1(9ab4e5362f9f7d9b46b750e14b1d9d71c57be40f) )
|
||||
|
||||
ROM_REGION( 0x2000, "gfx1", 0 )
|
||||
ROM_REGION( 0x2000, "tiles", 0 )
|
||||
ROM_LOAD( "8.10g", 0x0000, 0x1000, CRC(931b29eb) SHA1(0325c1c1fdb44e0044b82b7c79b5eeabf5c11ce7) )
|
||||
ROM_LOAD( "7.9g", 0x1000, 0x1000, CRC(bbe6d6e4) SHA1(de5447d59a99c4c08c4f40c0b7dd3c3c609c11d4) )
|
||||
|
||||
ROM_REGION( 0x2000, "gfx2", 0 )
|
||||
ROM_REGION( 0x2000, "sprites", 0 )
|
||||
ROM_LOAD( "6.9a", 0x0000, 0x1000, CRC(b2d8c121) SHA1(189ad488869f34d7a38b82ef70eb805acfe04312) )
|
||||
ROM_LOAD( "5.8a", 0x1000, 0x1000, CRC(1097c2b6) SHA1(c815f0d27593efd23923511bdd13835456ef7f76) )
|
||||
|
||||
ROM_REGION( 0x0220, "proms", 0 )
|
||||
ROM_LOAD( "pooyan.pr1", 0x0000, 0x0020, CRC(a06a6d0e) SHA1(ae131320b66d76d4bc9108da6708f6f874b2e123) ) /* palette */
|
||||
ROM_LOAD( "pooyan.pr3", 0x0020, 0x0100, CRC(8cd4cd60) SHA1(e0188ecd5b53a8e6e28c1de80def676740772334) ) /* characters */
|
||||
ROM_LOAD( "pooyan.pr2", 0x0120, 0x0100, CRC(82748c0b) SHA1(9ce8eb92e482eba5a9077e9db99841d65b011346) ) /* sprites */
|
||||
ROM_LOAD( "pooyan.pr1", 0x0000, 0x0020, CRC(a06a6d0e) SHA1(ae131320b66d76d4bc9108da6708f6f874b2e123) ) // palette
|
||||
ROM_LOAD( "pooyan.pr3", 0x0020, 0x0100, CRC(8cd4cd60) SHA1(e0188ecd5b53a8e6e28c1de80def676740772334) ) // characters
|
||||
ROM_LOAD( "pooyan.pr2", 0x0120, 0x0100, CRC(82748c0b) SHA1(9ce8eb92e482eba5a9077e9db99841d65b011346) ) // sprites
|
||||
ROM_END
|
||||
|
||||
ROM_START( pooyans )
|
||||
@ -269,18 +501,18 @@ ROM_START( pooyans )
|
||||
ROM_LOAD( "xx.7a", 0x0000, 0x1000, CRC(fbe2b368) SHA1(5689a84ef110bdc0039ad1a6c5778e0b8eccfce0) )
|
||||
ROM_LOAD( "xx.8a", 0x1000, 0x1000, CRC(e1795b3d) SHA1(9ab4e5362f9f7d9b46b750e14b1d9d71c57be40f) )
|
||||
|
||||
ROM_REGION( 0x2000, "gfx1", 0 )
|
||||
ROM_REGION( 0x2000, "tiles", 0 )
|
||||
ROM_LOAD( "ic13_g10.cpu", 0x0000, 0x1000, CRC(7433aea9) SHA1(a5ad6311f097fefb6e7b747ebe9d01d72d7755d0) )
|
||||
ROM_LOAD( "ic14_g9.cpu", 0x1000, 0x1000, CRC(87c1789e) SHA1(7637a9604a3ad4f9a27105d87252de3d923672aa) )
|
||||
|
||||
ROM_REGION( 0x2000, "gfx2", 0 )
|
||||
ROM_REGION( 0x2000, "sprites", 0 )
|
||||
ROM_LOAD( "6.9a", 0x0000, 0x1000, CRC(b2d8c121) SHA1(189ad488869f34d7a38b82ef70eb805acfe04312) )
|
||||
ROM_LOAD( "5.8a", 0x1000, 0x1000, CRC(1097c2b6) SHA1(c815f0d27593efd23923511bdd13835456ef7f76) )
|
||||
|
||||
ROM_REGION( 0x0220, "proms", 0 )
|
||||
ROM_LOAD( "pooyan.pr1", 0x0000, 0x0020, CRC(a06a6d0e) SHA1(ae131320b66d76d4bc9108da6708f6f874b2e123) ) /* palette */
|
||||
ROM_LOAD( "pooyan.pr3", 0x0020, 0x0100, CRC(8cd4cd60) SHA1(e0188ecd5b53a8e6e28c1de80def676740772334) ) /* characters */
|
||||
ROM_LOAD( "pooyan.pr2", 0x0120, 0x0100, CRC(82748c0b) SHA1(9ce8eb92e482eba5a9077e9db99841d65b011346) ) /* sprites */
|
||||
ROM_LOAD( "pooyan.pr1", 0x0000, 0x0020, CRC(a06a6d0e) SHA1(ae131320b66d76d4bc9108da6708f6f874b2e123) ) // palette
|
||||
ROM_LOAD( "pooyan.pr3", 0x0020, 0x0100, CRC(8cd4cd60) SHA1(e0188ecd5b53a8e6e28c1de80def676740772334) ) // characters
|
||||
ROM_LOAD( "pooyan.pr2", 0x0120, 0x0100, CRC(82748c0b) SHA1(9ce8eb92e482eba5a9077e9db99841d65b011346) ) // sprites
|
||||
ROM_END
|
||||
|
||||
ROM_START( pootan )
|
||||
@ -294,20 +526,21 @@ ROM_START( pootan )
|
||||
ROM_LOAD( "xx.7a", 0x0000, 0x1000, CRC(fbe2b368) SHA1(5689a84ef110bdc0039ad1a6c5778e0b8eccfce0) )
|
||||
ROM_LOAD( "xx.8a", 0x1000, 0x1000, CRC(e1795b3d) SHA1(9ab4e5362f9f7d9b46b750e14b1d9d71c57be40f) )
|
||||
|
||||
ROM_REGION( 0x2000, "gfx1", 0 )
|
||||
ROM_REGION( 0x2000, "tiles", 0 )
|
||||
ROM_LOAD( "poo_ic13.bin", 0x0000, 0x1000, CRC(0be802e4) SHA1(07adc17bcb7332ddc00b7c71bf4919eda80b0bdb) )
|
||||
ROM_LOAD( "poo_ic14.bin", 0x1000, 0x1000, CRC(cba29096) SHA1(b5a4cf75089cf04f7361e00074816facd57452b2) )
|
||||
|
||||
ROM_REGION( 0x2000, "gfx2", 0 )
|
||||
ROM_REGION( 0x2000, "sprites", 0 )
|
||||
ROM_LOAD( "6.9a", 0x0000, 0x1000, CRC(b2d8c121) SHA1(189ad488869f34d7a38b82ef70eb805acfe04312) )
|
||||
ROM_LOAD( "5.8a", 0x1000, 0x1000, CRC(1097c2b6) SHA1(c815f0d27593efd23923511bdd13835456ef7f76) )
|
||||
|
||||
ROM_REGION( 0x0220, "proms", 0 )
|
||||
ROM_LOAD( "pooyan.pr1", 0x0000, 0x0020, CRC(a06a6d0e) SHA1(ae131320b66d76d4bc9108da6708f6f874b2e123) ) /* palette */
|
||||
ROM_LOAD( "pooyan.pr3", 0x0020, 0x0100, CRC(8cd4cd60) SHA1(e0188ecd5b53a8e6e28c1de80def676740772334) ) /* characters */
|
||||
ROM_LOAD( "pooyan.pr2", 0x0120, 0x0100, CRC(82748c0b) SHA1(9ce8eb92e482eba5a9077e9db99841d65b011346) ) /* sprites */
|
||||
ROM_LOAD( "pooyan.pr1", 0x0000, 0x0020, CRC(a06a6d0e) SHA1(ae131320b66d76d4bc9108da6708f6f874b2e123) ) // palette
|
||||
ROM_LOAD( "pooyan.pr3", 0x0020, 0x0100, CRC(8cd4cd60) SHA1(e0188ecd5b53a8e6e28c1de80def676740772334) ) // characters
|
||||
ROM_LOAD( "pooyan.pr2", 0x0120, 0x0100, CRC(82748c0b) SHA1(9ce8eb92e482eba5a9077e9db99841d65b011346) ) // sprites
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
/*************************************
|
||||
@ -316,7 +549,7 @@ ROM_END
|
||||
*
|
||||
*************************************/
|
||||
|
||||
// YEAR, NAME, PARENT, MACHINE,INPUT, INIT,MONITOR,COMPANY,FULLNAME,FLAGS
|
||||
GAME( 1982, pooyan, 0, pooyan, pooyan, pooyan_state, empty_init, ROT90, "Konami", "Pooyan", MACHINE_SUPPORTS_SAVE )
|
||||
// YEAR, NAME, PARENT, MACHINE,INPUT, STATE, INIT, MONITOR,COMPANY, FULLNAME, FLAGS
|
||||
GAME( 1982, pooyan, 0, pooyan, pooyan, pooyan_state, empty_init, ROT90, "Konami", "Pooyan", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, pooyans, pooyan, pooyan, pooyan, pooyan_state, empty_init, ROT90, "Konami (Stern Electronics license)", "Pooyan (Stern Electronics)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, pootan, pooyan, pooyan, pooyan, pooyan_state, empty_init, ROT90, "bootleg", "Pootan", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, pootan, pooyan, pooyan, pooyan, pooyan_state, empty_init, ROT90, "bootleg", "Pootan", MACHINE_SUPPORTS_SAVE )
|
||||
|
@ -1,65 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Allard van der Bas
|
||||
#ifndef MAME_INCLUDES_POOYAN_H
|
||||
#define MAME_INCLUDES_POOYAN_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "emupal.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
class pooyan_state : public driver_device
|
||||
{
|
||||
public:
|
||||
pooyan_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_palette(*this, "palette"),
|
||||
m_colorram(*this, "colorram"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_spriteram2(*this, "spriteram2")
|
||||
{ }
|
||||
|
||||
void pooyan(machine_config &config);
|
||||
|
||||
private:
|
||||
/* devices */
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
/* memory pointers */
|
||||
required_shared_ptr<uint8_t> m_colorram;
|
||||
required_shared_ptr<uint8_t> m_videoram;
|
||||
required_shared_ptr<uint8_t> m_spriteram;
|
||||
required_shared_ptr<uint8_t> m_spriteram2;
|
||||
|
||||
/* video-related */
|
||||
tilemap_t *m_bg_tilemap = nullptr;
|
||||
|
||||
/* misc */
|
||||
uint8_t m_irq_enable = 0;
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(irq_enable_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_counter_1_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_counter_2_w);
|
||||
void videoram_w(offs_t offset, uint8_t data);
|
||||
void colorram_w(offs_t offset, uint8_t data);
|
||||
DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
|
||||
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
|
||||
virtual void machine_start() override;
|
||||
virtual void video_start() override;
|
||||
void pooyan_palette(palette_device &palette) const;
|
||||
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
|
||||
void main_map(address_map &map);
|
||||
};
|
||||
|
||||
#endif // MAME_INCLUDES_POOYAN_H
|
@ -1,189 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Allard van der Bas
|
||||
/***************************************************************************
|
||||
|
||||
Pooyan
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "video/resnet.h"
|
||||
#include "pooyan.h"
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Convert the color PROMs into a more useable format.
|
||||
|
||||
Pooyan has one 32x8 palette PROM and two 256x4 lookup table PROMs
|
||||
(one for characters, one for sprites).
|
||||
The palette PROM is connected to the RGB output this way:
|
||||
|
||||
bit 7 -- 220 ohm resistor -- BLUE
|
||||
-- 470 ohm resistor -- BLUE
|
||||
-- 220 ohm resistor -- GREEN
|
||||
-- 470 ohm resistor -- GREEN
|
||||
-- 1 kohm resistor -- GREEN
|
||||
-- 220 ohm resistor -- RED
|
||||
-- 470 ohm resistor -- RED
|
||||
bit 0 -- 1 kohm resistor -- RED
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void pooyan_state::pooyan_palette(palette_device &palette) const
|
||||
{
|
||||
const uint8_t *color_prom = memregion("proms")->base();
|
||||
static constexpr int resistances_rg[3] = { 1000, 470, 220 };
|
||||
static constexpr int resistances_b [2] = { 470, 220 };
|
||||
|
||||
// compute the color output resistor weights
|
||||
double rweights[3], gweights[3], bweights[2];
|
||||
compute_resistor_weights(0, 255, -1.0,
|
||||
3, resistances_rg, rweights, 1000, 0,
|
||||
3, resistances_rg, gweights, 1000, 0,
|
||||
2, resistances_b, bweights, 1000, 0);
|
||||
|
||||
// create a lookup table for the palette
|
||||
for (int i = 0; i < 0x20; i++)
|
||||
{
|
||||
int bit0, bit1, bit2;
|
||||
|
||||
// red component
|
||||
bit0 = BIT(color_prom[i], 0);
|
||||
bit1 = BIT(color_prom[i], 1);
|
||||
bit2 = BIT(color_prom[i], 2);
|
||||
int const r = combine_weights(rweights, bit0, bit1, bit2);
|
||||
|
||||
// green component
|
||||
bit0 = BIT(color_prom[i], 3);
|
||||
bit1 = BIT(color_prom[i], 4);
|
||||
bit2 = BIT(color_prom[i], 5);
|
||||
int const g = combine_weights(gweights, bit0, bit1, bit2);
|
||||
|
||||
// blue component
|
||||
bit0 = BIT(color_prom[i], 6);
|
||||
bit1 = BIT(color_prom[i], 7);
|
||||
int const b = combine_weights(bweights, bit0, bit1);
|
||||
|
||||
palette.set_indirect_color(i, rgb_t(r, g, b));
|
||||
}
|
||||
|
||||
// color_prom now points to the beginning of the lookup table
|
||||
color_prom += 0x20;
|
||||
|
||||
// characters
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
|
||||
// sprites
|
||||
for (int i = 0x100; i < 0x200; i++)
|
||||
{
|
||||
uint8_t const ctabentry = color_prom[i] & 0x0f;
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Tilemap info callback
|
||||
*
|
||||
*************************************/
|
||||
|
||||
TILE_GET_INFO_MEMBER(pooyan_state::get_bg_tile_info)
|
||||
{
|
||||
int attr = m_colorram[tile_index];
|
||||
int code = m_videoram[tile_index];
|
||||
int color = attr & 0x0f;
|
||||
int flags = TILE_FLIPYX(attr >> 6);
|
||||
|
||||
tileinfo.set(0, code, color, flags);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Video startup
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void pooyan_state::video_start()
|
||||
{
|
||||
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(pooyan_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Memory write handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void pooyan_state::videoram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_videoram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
|
||||
void pooyan_state::colorram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_colorram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(pooyan_state::flipscreen_w)
|
||||
{
|
||||
flip_screen_set(!state);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Sprite rendering
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void pooyan_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
|
||||
{
|
||||
for (int offs = 0x10; offs < 0x40; offs += 2)
|
||||
{
|
||||
int sx = m_spriteram[offs];
|
||||
int sy = 240 - m_spriteram2[offs + 1];
|
||||
|
||||
int code = m_spriteram[offs + 1];
|
||||
int color = m_spriteram2[offs] & 0x0f;
|
||||
int flipx = ~m_spriteram2[offs] & 0x40;
|
||||
int flipy = m_spriteram2[offs] & 0x80;
|
||||
|
||||
|
||||
m_gfxdecode->gfx(1)->transmask(bitmap,cliprect,
|
||||
code,
|
||||
color,
|
||||
flipx, flipy,
|
||||
sx, sy,
|
||||
m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 0));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Video update
|
||||
*
|
||||
*************************************/
|
||||
|
||||
uint32_t pooyan_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
||||
draw_sprites(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Zsolt Vasvari
|
||||
// copyright-holders: Zsolt Vasvari
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Super Basketball memory map (preliminary)
|
||||
@ -30,7 +31,7 @@ Sound Board Parts:
|
||||
14.31818MHz @ x1
|
||||
3.579545MHz @ x2
|
||||
SN76489AN @ 8d (According to the schematics, part number scratched off)
|
||||
4118 or 6116 @ 10a (According to the schematics pins match these two types of sram, part number scratched off)
|
||||
4118 or 6116 @ 10a (According to the schematics pins match these two types of SRAM, part number scratched off)
|
||||
|
||||
|
||||
CPU/Video Board Parts:
|
||||
@ -41,32 +42,275 @@ CPU/Video Board Parts:
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "sbasketb.h"
|
||||
|
||||
#include "konami1.h"
|
||||
#include "konamipt.h"
|
||||
#include "trackfld_a.h"
|
||||
|
||||
#include "cpu/m6809/m6809.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/74259.h"
|
||||
#include "machine/gen_latch.h"
|
||||
#include "konami1.h"
|
||||
#include "machine/watchdog.h"
|
||||
#include "sound/dac.h"
|
||||
#include "sound/sn76496.h"
|
||||
#include "sound/vlm5030.h"
|
||||
#include "video/resnet.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
|
||||
void sbasketb_state::sbasketb_sh_irqtrigger_w(uint8_t data)
|
||||
namespace {
|
||||
|
||||
class sbasketb_state : public driver_device
|
||||
{
|
||||
public:
|
||||
sbasketb_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_colorram(*this, "colorram"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_palettebank(*this, "palettebank"),
|
||||
m_scroll(*this, "scroll"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_audiocpu(*this, "audiocpu"),
|
||||
m_sn(*this, "snsnd"),
|
||||
m_vlm(*this, "vlm"),
|
||||
m_screen(*this, "screen"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void sbasketb(machine_config &config);
|
||||
void sbasketbu(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void video_start() override;
|
||||
|
||||
private:
|
||||
// memory pointers
|
||||
required_shared_ptr<uint8_t> m_colorram;
|
||||
required_shared_ptr<uint8_t> m_videoram;
|
||||
required_shared_ptr<uint8_t> m_spriteram;
|
||||
required_shared_ptr<uint8_t> m_palettebank;
|
||||
required_shared_ptr<uint8_t> m_scroll;
|
||||
|
||||
// devices
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<sn76489_device> m_sn;
|
||||
required_device<vlm5030_device> m_vlm;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
// video-related
|
||||
tilemap_t *m_bg_tilemap = nullptr;
|
||||
bool m_spriteram_select = false;
|
||||
|
||||
bool m_irq_mask = false;
|
||||
uint8_t m_sn76496_latch = 0;
|
||||
|
||||
void sh_irqtrigger_w(uint8_t data);
|
||||
template <uint8_t Which> DECLARE_WRITE_LINE_MEMBER(coin_counter_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(irq_mask_w);
|
||||
void videoram_w(offs_t offset, uint8_t data);
|
||||
void colorram_w(offs_t offset, uint8_t data);
|
||||
DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(spriteram_select_w);
|
||||
void konami_sn76496_latch_w(uint8_t data) { m_sn76496_latch = data; }
|
||||
void konami_sn76496_w(uint8_t data) { m_sn->write(m_sn76496_latch); }
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
void palette(palette_device &palette) const;
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
|
||||
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
void main_map(address_map &map);
|
||||
void sound_map(address_map &map);
|
||||
};
|
||||
|
||||
|
||||
// video
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Convert the color PROMs into a more useable format.
|
||||
|
||||
Super Basketball has three 256x4 palette PROMs (one per gun) and two 256x4
|
||||
lookup table PROMs (one for characters, one for sprites).
|
||||
I don't know for sure how the palette PROMs are connected to the RGB
|
||||
output, but it's probably the usual:
|
||||
|
||||
bit 3 -- 220 ohm resistor -- RED/GREEN/BLUE
|
||||
-- 470 ohm resistor -- RED/GREEN/BLUE
|
||||
-- 1 kohm resistor -- RED/GREEN/BLUE
|
||||
bit 0 -- 2.2kohm resistor -- RED/GREEN/BLUE
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void sbasketb_state::palette(palette_device &palette) const
|
||||
{
|
||||
const uint8_t *color_prom = memregion("proms")->base();
|
||||
static constexpr int resistances[4] = { 2000, 1000, 470, 220 };
|
||||
|
||||
// compute the color output resistor weights
|
||||
double rweights[4], gweights[4], bweights[4];
|
||||
compute_resistor_weights(0, 255, -1.0,
|
||||
4, resistances, rweights, 1000, 0,
|
||||
4, resistances, gweights, 1000, 0,
|
||||
4, resistances, bweights, 1000, 0);
|
||||
|
||||
// create a lookup table for the palette
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
int bit0, bit1, bit2, bit3;
|
||||
|
||||
// red component
|
||||
bit0 = BIT(color_prom[i | 0x000], 0);
|
||||
bit1 = BIT(color_prom[i | 0x000], 1);
|
||||
bit2 = BIT(color_prom[i | 0x000], 2);
|
||||
bit3 = BIT(color_prom[i | 0x000], 3);
|
||||
int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
|
||||
|
||||
// green component
|
||||
bit0 = BIT(color_prom[i | 0x100], 0);
|
||||
bit1 = BIT(color_prom[i | 0x100], 1);
|
||||
bit2 = BIT(color_prom[i | 0x100], 2);
|
||||
bit3 = BIT(color_prom[i | 0x100], 3);
|
||||
int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
|
||||
|
||||
// blue component
|
||||
bit0 = BIT(color_prom[i | 0x200], 0);
|
||||
bit1 = BIT(color_prom[i | 0x200], 1);
|
||||
bit2 = BIT(color_prom[i | 0x200], 2);
|
||||
bit3 = BIT(color_prom[i | 0x200], 3);
|
||||
int const b = combine_weights(bweights, bit0, bit1, bit2, bit3);
|
||||
|
||||
palette.set_indirect_color(i, rgb_t(r, g, b));
|
||||
}
|
||||
|
||||
// color_prom now points to the beginning of the lookup table
|
||||
color_prom += 0x300;
|
||||
|
||||
// characters use colors 0xf0-0xff
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0xf0;
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
|
||||
// sprites use colors 0-256 (?) in 16 banks
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
for (int j = 0; j < 0x10; j++)
|
||||
{
|
||||
uint8_t const ctabentry = (j << 4) | (color_prom[i + 0x100] & 0x0f);
|
||||
palette.set_pen_indirect(0x100 + ((j << 8) | i), ctabentry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sbasketb_state::videoram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_videoram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
void sbasketb_state::colorram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_colorram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(sbasketb_state::flipscreen_w)
|
||||
{
|
||||
flip_screen_set(state);
|
||||
machine().tilemap().mark_all_dirty();
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(sbasketb_state::spriteram_select_w)
|
||||
{
|
||||
m_spriteram_select = state;
|
||||
}
|
||||
|
||||
TILE_GET_INFO_MEMBER(sbasketb_state::get_bg_tile_info)
|
||||
{
|
||||
int const code = m_videoram[tile_index] + ((m_colorram[tile_index] & 0x20) << 3);
|
||||
int const color = m_colorram[tile_index] & 0x0f;
|
||||
int const flags = ((m_colorram[tile_index] & 0x40) ? TILE_FLIPX : 0) | ((m_colorram[tile_index] & 0x80) ? TILE_FLIPY : 0);
|
||||
|
||||
tileinfo.set(0, code, color, flags);
|
||||
}
|
||||
|
||||
void sbasketb_state::video_start()
|
||||
{
|
||||
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sbasketb_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
m_bg_tilemap->set_scroll_cols(32);
|
||||
|
||||
save_item(NAME(m_spriteram_select));
|
||||
save_item(NAME(m_irq_mask));
|
||||
save_item(NAME(m_sn76496_latch));
|
||||
}
|
||||
|
||||
void sbasketb_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
int offs = m_spriteram_select ? 0x100 : 0;
|
||||
|
||||
for (int i = 0; i < 64; i++, offs += 4)
|
||||
{
|
||||
int sx = m_spriteram[offs + 2];
|
||||
int sy = m_spriteram[offs + 3];
|
||||
|
||||
if (sx || sy)
|
||||
{
|
||||
int const code = m_spriteram[offs + 0] | ((m_spriteram[offs + 1] & 0x20) << 3);
|
||||
int const color = (m_spriteram[offs + 1] & 0x0f) + 16 * *m_palettebank;
|
||||
int flipx = m_spriteram[offs + 1] & 0x40;
|
||||
int flipy = m_spriteram[offs + 1] & 0x80;
|
||||
|
||||
if (flip_screen())
|
||||
{
|
||||
sx = 240 - sx;
|
||||
sy = 240 - sy;
|
||||
flipx = !flipx;
|
||||
flipy = !flipy;
|
||||
}
|
||||
|
||||
|
||||
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect,
|
||||
code, color,
|
||||
flipx, flipy,
|
||||
sx, sy, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t sbasketb_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
for (int col = 6; col < 32; col++)
|
||||
m_bg_tilemap->set_scrolly(col, *m_scroll);
|
||||
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
||||
draw_sprites(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// machine
|
||||
|
||||
void sbasketb_state::sh_irqtrigger_w(uint8_t data)
|
||||
{
|
||||
m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(sbasketb_state::coin_counter_1_w)
|
||||
template <uint8_t Which>
|
||||
WRITE_LINE_MEMBER(sbasketb_state::coin_counter_w)
|
||||
{
|
||||
machine().bookkeeping().coin_counter_w(0, state);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(sbasketb_state::coin_counter_2_w)
|
||||
{
|
||||
machine().bookkeeping().coin_counter_w(1, state);
|
||||
machine().bookkeeping().coin_counter_w(Which, state);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(sbasketb_state::irq_mask_w)
|
||||
@ -76,19 +320,19 @@ WRITE_LINE_MEMBER(sbasketb_state::irq_mask_w)
|
||||
m_maincpu->set_input_line(0, CLEAR_LINE);
|
||||
}
|
||||
|
||||
void sbasketb_state::sbasketb_map(address_map &map)
|
||||
void sbasketb_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x2000, 0x2fff).ram();
|
||||
map(0x3000, 0x33ff).ram().w(FUNC(sbasketb_state::sbasketb_colorram_w)).share(m_colorram);
|
||||
map(0x3400, 0x37ff).ram().w(FUNC(sbasketb_state::sbasketb_videoram_w)).share(m_videoram);
|
||||
map(0x3000, 0x33ff).ram().w(FUNC(sbasketb_state::colorram_w)).share(m_colorram);
|
||||
map(0x3400, 0x37ff).ram().w(FUNC(sbasketb_state::videoram_w)).share(m_videoram);
|
||||
map(0x3800, 0x39ff).ram().share(m_spriteram);
|
||||
map(0x3a00, 0x3bff).ram(); /* Probably unused, but initialized */
|
||||
map(0x3a00, 0x3bff).ram(); // Probably unused, but initialized
|
||||
map(0x3c00, 0x3c00).w("watchdog", FUNC(watchdog_timer_device::reset_w));
|
||||
map(0x3c10, 0x3c10).nopr(); /* ???? */
|
||||
map(0x3c10, 0x3c10).nopr(); // ????
|
||||
map(0x3c20, 0x3c20).writeonly().share(m_palettebank);
|
||||
map(0x3c80, 0x3c87).w("mainlatch", FUNC(ls259_device::write_d0));
|
||||
map(0x3d00, 0x3d00).w("soundlatch", FUNC(generic_latch_8_device::write));
|
||||
map(0x3d80, 0x3d80).w(FUNC(sbasketb_state::sbasketb_sh_irqtrigger_w));
|
||||
map(0x3d80, 0x3d80).w(FUNC(sbasketb_state::sh_irqtrigger_w));
|
||||
map(0x3e00, 0x3e00).portr("SYSTEM");
|
||||
map(0x3e01, 0x3e01).portr("P1");
|
||||
map(0x3e02, 0x3e02).portr("P2");
|
||||
@ -99,17 +343,17 @@ void sbasketb_state::sbasketb_map(address_map &map)
|
||||
map(0x6000, 0xffff).rom();
|
||||
}
|
||||
|
||||
void sbasketb_state::sbasketb_sound_map(address_map &map)
|
||||
void sbasketb_state::sound_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x1fff).rom();
|
||||
map(0x4000, 0x43ff).ram();
|
||||
map(0x6000, 0x6000).r("soundlatch", FUNC(generic_latch_8_device::read));
|
||||
map(0x8000, 0x8000).r(m_soundbrd, FUNC(trackfld_audio_device::hyperspt_sh_timer_r));
|
||||
map(0xa000, 0xa000).w(m_vlm, FUNC(vlm5030_device::data_w)); /* speech data */
|
||||
map(0xc000, 0xdfff).w(m_soundbrd, FUNC(trackfld_audio_device::hyperspt_sound_w)); /* speech and output control */
|
||||
map(0xe000, 0xe000).w(m_dac, FUNC(dac_byte_interface::data_w));
|
||||
map(0xe001, 0xe001).w(FUNC(sbasketb_state::konami_SN76496_latch_w)); /* Loads the snd command into the snd latch */
|
||||
map(0xe002, 0xe002).w(FUNC(sbasketb_state::konami_SN76496_w)); /* This address triggers the SN chip to read the data port. */
|
||||
map(0x8000, 0x8000).r("soundbrd", FUNC(trackfld_audio_device::hyperspt_sh_timer_r));
|
||||
map(0xa000, 0xa000).w(m_vlm, FUNC(vlm5030_device::data_w)); // speech
|
||||
map(0xc000, 0xdfff).w("soundbrd", FUNC(trackfld_audio_device::hyperspt_sound_w)); // speech and output control
|
||||
map(0xe000, 0xe000).w("dac", FUNC(dac_byte_interface::data_w));
|
||||
map(0xe001, 0xe001).w(FUNC(sbasketb_state::konami_sn76496_latch_w)); // Loads the snd command into the snd latch
|
||||
map(0xe002, 0xe002).w(FUNC(sbasketb_state::konami_sn76496_w)); // This address triggers the SN chip to read the data port.
|
||||
}
|
||||
|
||||
|
||||
@ -154,35 +398,9 @@ INPUT_PORTS_END
|
||||
|
||||
|
||||
|
||||
static const gfx_layout charlayout =
|
||||
{
|
||||
8,8, /* 8*8 characters */
|
||||
512, /* 512 characters */
|
||||
4, /* 4 bits per pixel */
|
||||
{ 0, 1, 2, 3 }, /* the bitplanes are packed */
|
||||
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
|
||||
{ 0*4*8, 1*4*8, 2*4*8, 3*4*8, 4*4*8, 5*4*8, 6*4*8, 7*4*8 },
|
||||
8*4*8 /* every char takes 32 consecutive bytes */
|
||||
};
|
||||
|
||||
static const gfx_layout spritelayout =
|
||||
{
|
||||
16,16, /* 16*16 sprites */
|
||||
128 * 3,/* 384 sprites */
|
||||
4, /* 4 bits per pixel */
|
||||
{ 0, 1, 2, 3 }, /* the bitplanes are packed */
|
||||
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4,
|
||||
8*4, 9*4, 10*4, 11*4, 12*4, 13*4, 14*4, 15*4 },
|
||||
{ 0*4*16, 1*4*16, 2*4*16, 3*4*16, 4*4*16, 5*4*16, 6*4*16, 7*4*16,
|
||||
8*4*16, 9*4*16, 10*4*16, 11*4*16, 12*4*16, 13*4*16, 14*4*16, 15*4*16 },
|
||||
32*4*8 /* every sprite takes 128 consecutive bytes */
|
||||
};
|
||||
|
||||
|
||||
|
||||
static GFXDECODE_START( gfx_sbasketb )
|
||||
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 16 )
|
||||
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 16*16, 16*16 )
|
||||
GFXDECODE_ENTRY( "tiles", 0, gfx_8x8x4_packed_msb, 0, 16 )
|
||||
GFXDECODE_ENTRY( "sprites", 0, gfx_16x16x4_packed_msb, 16*16, 16*16 )
|
||||
GFXDECODE_END
|
||||
|
||||
WRITE_LINE_MEMBER(sbasketb_state::vblank_irq)
|
||||
@ -193,56 +411,56 @@ WRITE_LINE_MEMBER(sbasketb_state::vblank_irq)
|
||||
|
||||
void sbasketb_state::sbasketb(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
KONAMI1(config, m_maincpu, 1400000); /* 1.400 MHz ??? */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &sbasketb_state::sbasketb_map);
|
||||
// basic machine hardware
|
||||
KONAMI1(config, m_maincpu, 1'400'000); // 1.400 MHz ??? TODO: From a 18.432 MHz XTAL this doesn't seem probable
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &sbasketb_state::main_map);
|
||||
|
||||
Z80(config, m_audiocpu, XTAL(14'318'181) / 4); /* 3.5795 MHz */
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &sbasketb_state::sbasketb_sound_map);
|
||||
Z80(config, m_audiocpu, XTAL(14'318'181) / 4); // 3.5795 MHz
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &sbasketb_state::sound_map);
|
||||
|
||||
ls259_device &mainlatch(LS259(config, "mainlatch")); // B3
|
||||
mainlatch.q_out_cb<0>().set(FUNC(sbasketb_state::flipscreen_w)); // FLIP
|
||||
mainlatch.q_out_cb<1>().set(FUNC(sbasketb_state::irq_mask_w)); // INTST
|
||||
mainlatch.q_out_cb<2>().set_nop(); // MUT - not used?
|
||||
mainlatch.q_out_cb<3>().set(FUNC(sbasketb_state::coin_counter_1_w)); // COIN 1
|
||||
mainlatch.q_out_cb<4>().set(FUNC(sbasketb_state::coin_counter_2_w)); // COIN 2
|
||||
mainlatch.q_out_cb<3>().set(FUNC(sbasketb_state::coin_counter_w<0>)); // COIN 1
|
||||
mainlatch.q_out_cb<4>().set(FUNC(sbasketb_state::coin_counter_w<1>)); // COIN 2
|
||||
mainlatch.q_out_cb<5>().set(FUNC(sbasketb_state::spriteram_select_w)); // OBJ CHE
|
||||
mainlatch.q_out_cb<6>().set_nop(); // END - not used
|
||||
|
||||
WATCHDOG_TIMER(config, "watchdog");
|
||||
|
||||
/* video hardware */
|
||||
// video hardware
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_refresh_hz(60);
|
||||
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
||||
m_screen->set_size(32*8, 32*8);
|
||||
m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
|
||||
m_screen->set_screen_update(FUNC(sbasketb_state::screen_update_sbasketb));
|
||||
m_screen->set_screen_update(FUNC(sbasketb_state::screen_update));
|
||||
m_screen->set_palette(m_palette);
|
||||
m_screen->screen_vblank().set(FUNC(sbasketb_state::vblank_irq));
|
||||
|
||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sbasketb);
|
||||
PALETTE(config, m_palette, FUNC(sbasketb_state::sbasketb_palette), 16*16+16*16*16, 256);
|
||||
PALETTE(config, m_palette, FUNC(sbasketb_state::palette), 16*16+16*16*16, 256);
|
||||
|
||||
/* sound hardware */
|
||||
// sound hardware
|
||||
SPEAKER(config, "speaker").front_center();
|
||||
|
||||
GENERIC_LATCH_8(config, "soundlatch");
|
||||
|
||||
TRACKFLD_AUDIO(config, m_soundbrd, 0, m_audiocpu, m_vlm);
|
||||
TRACKFLD_AUDIO(config, "soundbrd", 0, m_audiocpu, m_vlm);
|
||||
|
||||
DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // unknown DAC
|
||||
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // unknown DAC
|
||||
|
||||
SN76489(config, m_sn, XTAL(14'318'181) / 8).add_route(ALL_OUTPUTS, "speaker", 1.0);
|
||||
|
||||
VLM5030(config, m_vlm, XTAL(3'579'545)).add_route(ALL_OUTPUTS, "speaker", 1.0); /* Schematics say 3.58MHz, but board uses 3.579545MHz xtal */
|
||||
VLM5030(config, m_vlm, XTAL(3'579'545)).add_route(ALL_OUTPUTS, "speaker", 1.0); // Schematics say 3.58MHz, but board uses 3.579545MHz xtal
|
||||
}
|
||||
|
||||
void sbasketb_state::sbasketbu(machine_config &config)
|
||||
{
|
||||
sbasketb(config);
|
||||
MC6809E(config.replace(), m_maincpu, 1400000); /* 6809E at 1.400 MHz ??? */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &sbasketb_state::sbasketb_map);
|
||||
MC6809E(config.replace(), m_maincpu, 1'400'000); // 6809E at 1.400 MHz ???
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &sbasketb_state::main_map);
|
||||
}
|
||||
|
||||
|
||||
@ -259,30 +477,30 @@ void sbasketb_state::sbasketbu(machine_config &config)
|
||||
*/
|
||||
|
||||
ROM_START( sbasketb )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_REGION( 0x10000, "maincpu", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405g05.14j", 0x6000, 0x2000, CRC(336dc0ab) SHA1(0fe47fdbf183683c569785fc6b980337a9cfde95) )
|
||||
ROM_LOAD( "405i03.11j", 0x8000, 0x4000, CRC(d33b82dd) SHA1(9f0a1e2b0a43a2ec5029dd50dbd315291838fa39) )
|
||||
ROM_LOAD( "405i01.9j", 0xc000, 0x4000, CRC(1c09cc3f) SHA1(881c0a9313f7f1ca17e1fa956a7b13e77d71957c) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* roms located on Sound Board */
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) // ROMs located on Sound Board
|
||||
ROM_LOAD( "405e13.7a", 0x0000, 0x2000, CRC(1ec7458b) SHA1(a015b982bff5f9e7ece33f2e69ff8c6c2174e710) )
|
||||
|
||||
ROM_REGION( 0x04000, "gfx1", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_REGION( 0x04000, "tiles", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405e12.22f", 0x0000, 0x4000, CRC(e02c54da) SHA1(2fa19f3bce894ef05820f95e0b88428e4f946a35) )
|
||||
|
||||
ROM_REGION( 0x0c000, "gfx2", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_REGION( 0x0c000, "sprites", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405h06.14g", 0x0000, 0x4000, CRC(cfbbff07) SHA1(39b19866b21372524933b5eef511bb5b7ad92556) )
|
||||
ROM_LOAD( "405h08.17g", 0x4000, 0x4000, CRC(c75901b6) SHA1(4ff87123228da068f0c0ffffa4a3f03765eccd8d) )
|
||||
ROM_LOAD( "405h10.20g", 0x8000, 0x4000, CRC(95bc5942) SHA1(55bf35283385d0ae768210706720a3b289ebd9a2) )
|
||||
|
||||
ROM_REGION( 0x0500, "proms", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_LOAD( "405e17.5a", 0x0000, 0x0100, CRC(b4c36d57) SHA1(c4a63f57edce2b9588e2394ff54a28f91213d550) ) /* palette red component */
|
||||
ROM_LOAD( "405e16.4a", 0x0100, 0x0100, CRC(0b7b03b8) SHA1(81297cb2b0b28b0fc0939a37ff30844d69fb65ac) ) /* palette green component */
|
||||
ROM_LOAD( "405e18.6a", 0x0200, 0x0100, CRC(9e533bad) SHA1(611e7af6813caaf2bc36c311ae48a5efd30e6f0c) ) /* palette blue component */
|
||||
ROM_LOAD( "405e20.19d", 0x0300, 0x0100, CRC(8ca6de2f) SHA1(67d29708d1a07d17c5dc5793a3293e7ace3a4e19) ) /* character lookup table */
|
||||
ROM_LOAD( "405e19.16d", 0x0400, 0x0100, CRC(e0bc782f) SHA1(9f71e696d11a60f771535f6837ecad6132047b0a) ) /* sprite lookup table */
|
||||
ROM_REGION( 0x0500, "proms", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405e17.5a", 0x0000, 0x0100, CRC(b4c36d57) SHA1(c4a63f57edce2b9588e2394ff54a28f91213d550) ) // palette red component
|
||||
ROM_LOAD( "405e16.4a", 0x0100, 0x0100, CRC(0b7b03b8) SHA1(81297cb2b0b28b0fc0939a37ff30844d69fb65ac) ) // palette green component
|
||||
ROM_LOAD( "405e18.6a", 0x0200, 0x0100, CRC(9e533bad) SHA1(611e7af6813caaf2bc36c311ae48a5efd30e6f0c) ) // palette blue component
|
||||
ROM_LOAD( "405e20.19d", 0x0300, 0x0100, CRC(8ca6de2f) SHA1(67d29708d1a07d17c5dc5793a3293e7ace3a4e19) ) // character lookup table
|
||||
ROM_LOAD( "405e19.16d", 0x0400, 0x0100, CRC(e0bc782f) SHA1(9f71e696d11a60f771535f6837ecad6132047b0a) ) // sprite lookup table
|
||||
|
||||
ROM_REGION( 0x10000, "vlm", 0 ) /* 64k for speech rom, located on Sound Board */
|
||||
ROM_REGION( 0x10000, "vlm", 0 ) // speech, located on Sound Board
|
||||
ROM_LOAD( "405e15.11f", 0x0000, 0x2000, CRC(01bb5ce9) SHA1(f48477b4011befba13c8bcd83e0c9f7deb14a1e1) )
|
||||
ROM_END
|
||||
|
||||
@ -303,30 +521,30 @@ ROM_END
|
||||
*/
|
||||
|
||||
ROM_START( sbasketh )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_REGION( 0x10000, "maincpu", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405h05.14j", 0x6000, 0x2000, CRC(263ec36b) SHA1(b445b600726ba4935623311e1a178aeb4a356b0a) )
|
||||
ROM_LOAD( "405h03.11j", 0x8000, 0x4000, CRC(0a4d7a82) SHA1(2e0153b41e23284427881258a44bd55be3570eb2) )
|
||||
ROM_LOAD( "405h01.9j", 0xc000, 0x4000, CRC(4f9dd9a0) SHA1(97f4c208509d50a7ce4c1ebe8a3f643ad75e833b) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* roms located on Sound Board */
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) // ROMs located on Sound Board
|
||||
ROM_LOAD( "405e13.7a", 0x0000, 0x2000, CRC(1ec7458b) SHA1(a015b982bff5f9e7ece33f2e69ff8c6c2174e710) )
|
||||
|
||||
ROM_REGION( 0x04000, "gfx1", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_REGION( 0x04000, "tiles", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405e12.22f", 0x0000, 0x4000, CRC(e02c54da) SHA1(2fa19f3bce894ef05820f95e0b88428e4f946a35) )
|
||||
|
||||
ROM_REGION( 0x0c000, "gfx2", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_REGION( 0x0c000, "sprites", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405h06.14g", 0x0000, 0x4000, CRC(cfbbff07) SHA1(39b19866b21372524933b5eef511bb5b7ad92556) )
|
||||
ROM_LOAD( "405h08.17g", 0x4000, 0x4000, CRC(c75901b6) SHA1(4ff87123228da068f0c0ffffa4a3f03765eccd8d) )
|
||||
ROM_LOAD( "405h10.20g", 0x8000, 0x4000, CRC(95bc5942) SHA1(55bf35283385d0ae768210706720a3b289ebd9a2) )
|
||||
|
||||
ROM_REGION( 0x0500, "proms", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_LOAD( "405e17.5a", 0x0000, 0x0100, CRC(b4c36d57) SHA1(c4a63f57edce2b9588e2394ff54a28f91213d550) ) /* palette red component */
|
||||
ROM_LOAD( "405e16.4a", 0x0100, 0x0100, CRC(0b7b03b8) SHA1(81297cb2b0b28b0fc0939a37ff30844d69fb65ac) ) /* palette green component */
|
||||
ROM_LOAD( "405e18.6a", 0x0200, 0x0100, CRC(9e533bad) SHA1(611e7af6813caaf2bc36c311ae48a5efd30e6f0c) ) /* palette blue component */
|
||||
ROM_LOAD( "405e20.19d", 0x0300, 0x0100, CRC(8ca6de2f) SHA1(67d29708d1a07d17c5dc5793a3293e7ace3a4e19) ) /* character lookup table */
|
||||
ROM_LOAD( "405e19.16d", 0x0400, 0x0100, CRC(e0bc782f) SHA1(9f71e696d11a60f771535f6837ecad6132047b0a) ) /* sprite lookup table */
|
||||
ROM_REGION( 0x0500, "proms", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405e17.5a", 0x0000, 0x0100, CRC(b4c36d57) SHA1(c4a63f57edce2b9588e2394ff54a28f91213d550) ) // palette red component
|
||||
ROM_LOAD( "405e16.4a", 0x0100, 0x0100, CRC(0b7b03b8) SHA1(81297cb2b0b28b0fc0939a37ff30844d69fb65ac) ) // palette green component
|
||||
ROM_LOAD( "405e18.6a", 0x0200, 0x0100, CRC(9e533bad) SHA1(611e7af6813caaf2bc36c311ae48a5efd30e6f0c) ) // palette blue component
|
||||
ROM_LOAD( "405e20.19d", 0x0300, 0x0100, CRC(8ca6de2f) SHA1(67d29708d1a07d17c5dc5793a3293e7ace3a4e19) ) // character lookup table
|
||||
ROM_LOAD( "405e19.16d", 0x0400, 0x0100, CRC(e0bc782f) SHA1(9f71e696d11a60f771535f6837ecad6132047b0a) ) // sprite lookup table
|
||||
|
||||
ROM_REGION( 0x10000, "vlm", 0 ) /* 64k for speech rom, located on Sound Board */
|
||||
ROM_REGION( 0x10000, "vlm", 0 ) // speech, located on Sound Board
|
||||
ROM_LOAD( "405e15.11f", 0x0000, 0x2000, CRC(01bb5ce9) SHA1(f48477b4011befba13c8bcd83e0c9f7deb14a1e1) )
|
||||
ROM_END
|
||||
|
||||
@ -348,20 +566,20 @@ ROM_END
|
||||
*/
|
||||
|
||||
ROM_START( sbasketg )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_REGION( 0x10000, "maincpu", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405g05.14j", 0x6000, 0x2000, CRC(336dc0ab) SHA1(0fe47fdbf183683c569785fc6b980337a9cfde95) )
|
||||
ROM_LOAD( "405g04.13j", 0x8000, 0x2000, CRC(f064a9bc) SHA1(4f1b94a880385c6ba74cc0883b24f6fec934e35d) )
|
||||
ROM_LOAD( "405g03.11j", 0xa000, 0x2000, CRC(b9de7d53) SHA1(5a4e5491ff3511992d949367fd7b5d383c2727db) )
|
||||
ROM_LOAD( "405g02.10j", 0xc000, 0x2000, CRC(e98470a0) SHA1(79af25af941fe357a8c9f0a2f11e5558670b8027) )
|
||||
ROM_LOAD( "405g01.9j", 0xe000, 0x2000, CRC(1bd0cd2e) SHA1(d162f9b989f718d9882a02a8c64743adf3d8e239) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* roms located on Sound Board */
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) // ROMs located on Sound Board
|
||||
ROM_LOAD( "405e13.7a", 0x0000, 0x2000, CRC(1ec7458b) SHA1(a015b982bff5f9e7ece33f2e69ff8c6c2174e710) )
|
||||
|
||||
ROM_REGION( 0x04000, "gfx1", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_REGION( 0x04000, "tiles", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405e12.22f", 0x0000, 0x4000, CRC(e02c54da) SHA1(2fa19f3bce894ef05820f95e0b88428e4f946a35) )
|
||||
|
||||
ROM_REGION( 0x0c000, "gfx2", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_REGION( 0x0c000, "sprites", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405e06.14g", 0x0000, 0x2000, CRC(7e2f5bb2) SHA1(e22008c0ef7ae000dcca7f43a386d43064aaea62) )
|
||||
ROM_LOAD( "405e07.16g", 0x2000, 0x2000, CRC(963a44f9) SHA1(03cd7699668b010f27af025ba6bd44509526ec7b) )
|
||||
ROM_LOAD( "405e08.17g", 0x4000, 0x2000, CRC(63901deb) SHA1(c65d896298846ed8b70a4d38b32820746214fa5c) )
|
||||
@ -369,14 +587,14 @@ ROM_START( sbasketg )
|
||||
ROM_LOAD( "405e10.20g", 0x8000, 0x2000, CRC(824815e8) SHA1(470e9d74fa2c397605a74e0bf173a6d9db4cc721) )
|
||||
ROM_LOAD( "405e11.22g", 0xa000, 0x2000, CRC(dca9b447) SHA1(12d7e85dc2fc6bd4ea7ad9035ae0b7487e4bc4bc) )
|
||||
|
||||
ROM_REGION( 0x0500, "proms", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_LOAD( "405e17.5a", 0x0000, 0x0100, CRC(b4c36d57) SHA1(c4a63f57edce2b9588e2394ff54a28f91213d550) ) /* palette red component */
|
||||
ROM_LOAD( "405e16.4a", 0x0100, 0x0100, CRC(0b7b03b8) SHA1(81297cb2b0b28b0fc0939a37ff30844d69fb65ac) ) /* palette green component */
|
||||
ROM_LOAD( "405e18.6a", 0x0200, 0x0100, CRC(9e533bad) SHA1(611e7af6813caaf2bc36c311ae48a5efd30e6f0c) ) /* palette blue component */
|
||||
ROM_LOAD( "405e20.19d", 0x0300, 0x0100, CRC(8ca6de2f) SHA1(67d29708d1a07d17c5dc5793a3293e7ace3a4e19) ) /* character lookup table */
|
||||
ROM_LOAD( "405e19.16d", 0x0400, 0x0100, CRC(e0bc782f) SHA1(9f71e696d11a60f771535f6837ecad6132047b0a) ) /* sprite lookup table */
|
||||
ROM_REGION( 0x0500, "proms", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405e17.5a", 0x0000, 0x0100, CRC(b4c36d57) SHA1(c4a63f57edce2b9588e2394ff54a28f91213d550) ) // palette red component
|
||||
ROM_LOAD( "405e16.4a", 0x0100, 0x0100, CRC(0b7b03b8) SHA1(81297cb2b0b28b0fc0939a37ff30844d69fb65ac) ) // palette green component
|
||||
ROM_LOAD( "405e18.6a", 0x0200, 0x0100, CRC(9e533bad) SHA1(611e7af6813caaf2bc36c311ae48a5efd30e6f0c) ) // palette blue component
|
||||
ROM_LOAD( "405e20.19d", 0x0300, 0x0100, CRC(8ca6de2f) SHA1(67d29708d1a07d17c5dc5793a3293e7ace3a4e19) ) // character lookup table
|
||||
ROM_LOAD( "405e19.16d", 0x0400, 0x0100, CRC(e0bc782f) SHA1(9f71e696d11a60f771535f6837ecad6132047b0a) ) // sprite lookup table
|
||||
|
||||
ROM_REGION( 0x10000, "vlm", 0 ) /* 64k for speech rom, located on Sound Board */
|
||||
ROM_REGION( 0x10000, "vlm", 0 ) // speech, located on Sound Board
|
||||
ROM_LOAD( "405e15.11f", 0x0000, 0x2000, CRC(01bb5ce9) SHA1(f48477b4011befba13c8bcd83e0c9f7deb14a1e1) )
|
||||
ROM_END
|
||||
|
||||
@ -386,20 +604,20 @@ ROM_END
|
||||
*/
|
||||
|
||||
ROM_START( sbaskete )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_REGION( 0x10000, "maincpu", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405e05.14j", 0x6000, 0x2000, CRC(32ea5b71) SHA1(d917c31d2c9a7229396e4a930e8d27394329533a) )
|
||||
ROM_LOAD( "405e04.13j", 0x8000, 0x2000, CRC(7abf3087) SHA1(fbaaaaae0b8bed1bc6ad7f2da267c2ef8bd75b15) )
|
||||
ROM_LOAD( "405e03.11j", 0xa000, 0x2000, CRC(9c6fcdcd) SHA1(a644ec98f49f84311829149c181aba25e7681793) )
|
||||
ROM_LOAD( "405e02.10j", 0xc000, 0x2000, CRC(0f145648) SHA1(2e238eb0663295887bf6b4905f1fd386db16d82a) )
|
||||
ROM_LOAD( "405e01.9j", 0xe000, 0x2000, CRC(6a27f1b1) SHA1(38c0be98fb122a7a6ed833af011bda5663a06510) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* roms located on Sound Board */
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) // ROMs located on Sound Board
|
||||
ROM_LOAD( "405e13.7a", 0x0000, 0x2000, CRC(1ec7458b) SHA1(a015b982bff5f9e7ece33f2e69ff8c6c2174e710) )
|
||||
|
||||
ROM_REGION( 0x04000, "gfx1", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_REGION( 0x04000, "tiles", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405e12.22f", 0x0000, 0x4000, CRC(e02c54da) SHA1(2fa19f3bce894ef05820f95e0b88428e4f946a35) )
|
||||
|
||||
ROM_REGION( 0x0c000, "gfx2", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_REGION( 0x0c000, "sprites", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405e06.14g", 0x0000, 0x2000, CRC(7e2f5bb2) SHA1(e22008c0ef7ae000dcca7f43a386d43064aaea62) )
|
||||
ROM_LOAD( "405e07.16g", 0x2000, 0x2000, CRC(963a44f9) SHA1(03cd7699668b010f27af025ba6bd44509526ec7b) )
|
||||
ROM_LOAD( "405e08.17g", 0x4000, 0x2000, CRC(63901deb) SHA1(c65d896298846ed8b70a4d38b32820746214fa5c) )
|
||||
@ -407,23 +625,21 @@ ROM_START( sbaskete )
|
||||
ROM_LOAD( "405e10.20g", 0x8000, 0x2000, CRC(824815e8) SHA1(470e9d74fa2c397605a74e0bf173a6d9db4cc721) )
|
||||
ROM_LOAD( "405e11.22g", 0xa000, 0x2000, CRC(dca9b447) SHA1(12d7e85dc2fc6bd4ea7ad9035ae0b7487e4bc4bc) )
|
||||
|
||||
ROM_REGION( 0x0500, "proms", 0 ) /* roms located on the CPU/Video board */
|
||||
ROM_LOAD( "405e17.5a", 0x0000, 0x0100, CRC(b4c36d57) SHA1(c4a63f57edce2b9588e2394ff54a28f91213d550) ) /* palette red component */
|
||||
ROM_LOAD( "405e16.4a", 0x0100, 0x0100, CRC(0b7b03b8) SHA1(81297cb2b0b28b0fc0939a37ff30844d69fb65ac) ) /* palette green component */
|
||||
ROM_LOAD( "405e18.6a", 0x0200, 0x0100, CRC(9e533bad) SHA1(611e7af6813caaf2bc36c311ae48a5efd30e6f0c) ) /* palette blue component */
|
||||
ROM_LOAD( "405e20.19d", 0x0300, 0x0100, CRC(8ca6de2f) SHA1(67d29708d1a07d17c5dc5793a3293e7ace3a4e19) ) /* character lookup table */
|
||||
ROM_LOAD( "405e19.16d", 0x0400, 0x0100, CRC(e0bc782f) SHA1(9f71e696d11a60f771535f6837ecad6132047b0a) ) /* sprite lookup table */
|
||||
ROM_REGION( 0x0500, "proms", 0 ) // ROMs located on the CPU/Video board
|
||||
ROM_LOAD( "405e17.5a", 0x0000, 0x0100, CRC(b4c36d57) SHA1(c4a63f57edce2b9588e2394ff54a28f91213d550) ) // palette red component
|
||||
ROM_LOAD( "405e16.4a", 0x0100, 0x0100, CRC(0b7b03b8) SHA1(81297cb2b0b28b0fc0939a37ff30844d69fb65ac) ) // palette green component
|
||||
ROM_LOAD( "405e18.6a", 0x0200, 0x0100, CRC(9e533bad) SHA1(611e7af6813caaf2bc36c311ae48a5efd30e6f0c) ) // palette blue component
|
||||
ROM_LOAD( "405e20.19d", 0x0300, 0x0100, CRC(8ca6de2f) SHA1(67d29708d1a07d17c5dc5793a3293e7ace3a4e19) ) // character lookup table
|
||||
ROM_LOAD( "405e19.16d", 0x0400, 0x0100, CRC(e0bc782f) SHA1(9f71e696d11a60f771535f6837ecad6132047b0a) ) // sprite lookup table
|
||||
|
||||
ROM_REGION( 0x10000, "vlm", 0 ) /* 64k for speech rom, located on Sound Board */
|
||||
ROM_REGION( 0x10000, "vlm", 0 ) // speech, located on Sound Board
|
||||
ROM_LOAD( "405e15.11f", 0x0000, 0x2000, CRC(01bb5ce9) SHA1(f48477b4011befba13c8bcd83e0c9f7deb14a1e1) )
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
void sbasketb_state::init_sbasketb()
|
||||
{
|
||||
}
|
||||
|
||||
GAME( 1984, sbasketb, 0, sbasketb, sbasketb, sbasketb_state, init_sbasketb, ROT90, "Konami", "Super Basketball (version I, encrypted)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1984, sbasketh, sbasketb, sbasketbu, sbasketb, sbasketb_state, empty_init, ROT90, "Konami", "Super Basketball (version H, unprotected)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1984, sbasketg, sbasketb, sbasketb, sbasketb, sbasketb_state, init_sbasketb, ROT90, "Konami", "Super Basketball (version G, encrypted)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1984, sbaskete, sbasketb, sbasketb, sbasketb, sbasketb_state, init_sbasketb, ROT90, "Konami", "Super Basketball (version E, encrypted)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1984, sbasketb, 0, sbasketb, sbasketb, sbasketb_state, empty_init, ROT90, "Konami", "Super Basketball (version I, encrypted)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1984, sbasketh, sbasketb, sbasketbu, sbasketb, sbasketb_state, empty_init, ROT90, "Konami", "Super Basketball (version H, unprotected)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1984, sbasketg, sbasketb, sbasketb, sbasketb, sbasketb_state, empty_init, ROT90, "Konami", "Super Basketball (version G, encrypted)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1984, sbaskete, sbasketb, sbasketb, sbasketb, sbasketb_state, empty_init, ROT90, "Konami", "Super Basketball (version E, encrypted)", MACHINE_SUPPORTS_SAVE )
|
||||
|
@ -1,90 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Zsolt Vasvari
|
||||
#ifndef MAME_INCLUDES_SBASKETB_H
|
||||
#define MAME_INCLUDES_SBASKETB_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "trackfld_a.h"
|
||||
#include "sound/dac.h"
|
||||
#include "sound/sn76496.h"
|
||||
#include "sound/vlm5030.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
class sbasketb_state : public driver_device
|
||||
{
|
||||
public:
|
||||
sbasketb_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_colorram(*this, "colorram"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_palettebank(*this, "palettebank"),
|
||||
m_scroll(*this, "scroll"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_audiocpu(*this, "audiocpu"),
|
||||
m_soundbrd(*this, "trackfld_audio"),
|
||||
m_dac(*this, "dac"),
|
||||
m_sn(*this, "snsnd"),
|
||||
m_vlm(*this, "vlm"),
|
||||
m_screen(*this, "screen"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void sbasketb(machine_config &config);
|
||||
void sbasketbu(machine_config &config);
|
||||
|
||||
void init_sbasketb();
|
||||
|
||||
private:
|
||||
/* memory pointers */
|
||||
required_shared_ptr<uint8_t> m_colorram;
|
||||
required_shared_ptr<uint8_t> m_videoram;
|
||||
required_shared_ptr<uint8_t> m_spriteram;
|
||||
required_shared_ptr<uint8_t> m_palettebank;
|
||||
required_shared_ptr<uint8_t> m_scroll;
|
||||
|
||||
/* devices */
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<trackfld_audio_device> m_soundbrd;
|
||||
required_device<dac_8bit_r2r_device> m_dac;
|
||||
required_device<sn76489_device> m_sn;
|
||||
required_device<vlm5030_device> m_vlm;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
/* video-related */
|
||||
tilemap_t *m_bg_tilemap = nullptr;
|
||||
bool m_spriteram_select = false;
|
||||
|
||||
bool m_irq_mask = false;
|
||||
void sbasketb_sh_irqtrigger_w(uint8_t data);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_counter_1_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_counter_2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(irq_mask_w);
|
||||
void sbasketb_videoram_w(offs_t offset, uint8_t data);
|
||||
void sbasketb_colorram_w(offs_t offset, uint8_t data);
|
||||
DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(spriteram_select_w);
|
||||
|
||||
uint8_t m_SN76496_latch = 0;
|
||||
void konami_SN76496_latch_w(uint8_t data) { m_SN76496_latch = data; }
|
||||
void konami_SN76496_w(uint8_t data) { m_sn->write(m_SN76496_latch); }
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
virtual void video_start() override;
|
||||
void sbasketb_palette(palette_device &palette) const;
|
||||
uint32_t screen_update_sbasketb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
|
||||
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
|
||||
|
||||
void sbasketb_map(address_map &map);
|
||||
void sbasketb_sound_map(address_map &map);
|
||||
};
|
||||
|
||||
#endif // MAME_INCLUDES_SBASKETB_H
|
@ -1,178 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Zsolt Vasvari
|
||||
/***************************************************************************
|
||||
|
||||
video.c
|
||||
|
||||
Functions to emulate the video hardware of the machine.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "video/resnet.h"
|
||||
#include "sbasketb.h"
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Convert the color PROMs into a more useable format.
|
||||
|
||||
Super Basketball has three 256x4 palette PROMs (one per gun) and two 256x4
|
||||
lookup table PROMs (one for characters, one for sprites).
|
||||
I don't know for sure how the palette PROMs are connected to the RGB
|
||||
output, but it's probably the usual:
|
||||
|
||||
bit 3 -- 220 ohm resistor -- RED/GREEN/BLUE
|
||||
-- 470 ohm resistor -- RED/GREEN/BLUE
|
||||
-- 1 kohm resistor -- RED/GREEN/BLUE
|
||||
bit 0 -- 2.2kohm resistor -- RED/GREEN/BLUE
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
void sbasketb_state::sbasketb_palette(palette_device &palette) const
|
||||
{
|
||||
const uint8_t *color_prom = memregion("proms")->base();
|
||||
static constexpr int resistances[4] = { 2000, 1000, 470, 220 };
|
||||
|
||||
// compute the color output resistor weights
|
||||
double rweights[4], gweights[4], bweights[4];
|
||||
compute_resistor_weights(0, 255, -1.0,
|
||||
4, resistances, rweights, 1000, 0,
|
||||
4, resistances, gweights, 1000, 0,
|
||||
4, resistances, bweights, 1000, 0);
|
||||
|
||||
// create a lookup table for the palette
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
int bit0, bit1, bit2, bit3;
|
||||
|
||||
// red component
|
||||
bit0 = BIT(color_prom[i | 0x000], 0);
|
||||
bit1 = BIT(color_prom[i | 0x000], 1);
|
||||
bit2 = BIT(color_prom[i | 0x000], 2);
|
||||
bit3 = BIT(color_prom[i | 0x000], 3);
|
||||
int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
|
||||
|
||||
// green component
|
||||
bit0 = BIT(color_prom[i | 0x100], 0);
|
||||
bit1 = BIT(color_prom[i | 0x100], 1);
|
||||
bit2 = BIT(color_prom[i | 0x100], 2);
|
||||
bit3 = BIT(color_prom[i | 0x100], 3);
|
||||
int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
|
||||
|
||||
// blue component
|
||||
bit0 = BIT(color_prom[i | 0x200], 0);
|
||||
bit1 = BIT(color_prom[i | 0x200], 1);
|
||||
bit2 = BIT(color_prom[i | 0x200], 2);
|
||||
bit3 = BIT(color_prom[i | 0x200], 3);
|
||||
int const b = combine_weights(bweights, bit0, bit1, bit2, bit3);
|
||||
|
||||
palette.set_indirect_color(i, rgb_t(r, g, b));
|
||||
}
|
||||
|
||||
// color_prom now points to the beginning of the lookup table
|
||||
color_prom += 0x300;
|
||||
|
||||
// characters use colors 0xf0-0xff
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0xf0;
|
||||
palette.set_pen_indirect(i, ctabentry);
|
||||
}
|
||||
|
||||
// sprites use colors 0-256 (?) in 16 banks
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
for (int j = 0; j < 0x10; j++)
|
||||
{
|
||||
uint8_t const ctabentry = (j << 4) | (color_prom[i + 0x100] & 0x0f);
|
||||
palette.set_pen_indirect(0x100 + ((j << 8) | i), ctabentry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sbasketb_state::sbasketb_videoram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_videoram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
void sbasketb_state::sbasketb_colorram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
m_colorram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(sbasketb_state::flipscreen_w)
|
||||
{
|
||||
flip_screen_set(state);
|
||||
machine().tilemap().mark_all_dirty();
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(sbasketb_state::spriteram_select_w)
|
||||
{
|
||||
m_spriteram_select = state;
|
||||
}
|
||||
|
||||
TILE_GET_INFO_MEMBER(sbasketb_state::get_bg_tile_info)
|
||||
{
|
||||
int code = m_videoram[tile_index] + ((m_colorram[tile_index] & 0x20) << 3);
|
||||
int color = m_colorram[tile_index] & 0x0f;
|
||||
int flags = ((m_colorram[tile_index] & 0x40) ? TILE_FLIPX : 0) | ((m_colorram[tile_index] & 0x80) ? TILE_FLIPY : 0);
|
||||
|
||||
tileinfo.set(0, code, color, flags);
|
||||
}
|
||||
|
||||
void sbasketb_state::video_start()
|
||||
{
|
||||
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sbasketb_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
m_bg_tilemap->set_scroll_cols(32);
|
||||
|
||||
save_item(NAME(m_spriteram_select));
|
||||
}
|
||||
|
||||
void sbasketb_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
|
||||
{
|
||||
uint8_t *spriteram = m_spriteram;
|
||||
int offs = m_spriteram_select ? 0x100 : 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 64; i++, offs += 4)
|
||||
{
|
||||
int sx = spriteram[offs + 2];
|
||||
int sy = spriteram[offs + 3];
|
||||
|
||||
if (sx || sy)
|
||||
{
|
||||
int code = spriteram[offs + 0] | ((spriteram[offs + 1] & 0x20) << 3);
|
||||
int color = (spriteram[offs + 1] & 0x0f) + 16 * *m_palettebank;
|
||||
int flipx = spriteram[offs + 1] & 0x40;
|
||||
int flipy = spriteram[offs + 1] & 0x80;
|
||||
|
||||
if (flip_screen())
|
||||
{
|
||||
sx = 240 - sx;
|
||||
sy = 240 - sy;
|
||||
flipx = !flipx;
|
||||
flipy = !flipy;
|
||||
}
|
||||
|
||||
|
||||
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
|
||||
code, color,
|
||||
flipx, flipy,
|
||||
sx, sy, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t sbasketb_state::screen_update_sbasketb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
int col;
|
||||
|
||||
for (col = 6; col < 32; col++)
|
||||
m_bg_tilemap->set_scrolly(col, *m_scroll);
|
||||
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
||||
draw_sprites(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Aaron Giles
|
||||
// copyright-holders: Aaron Giles
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Time Pilot 84 (c) 1984 Konami
|
||||
@ -64,7 +65,7 @@ C004 76489 #4 trigger
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "tp84.h"
|
||||
|
||||
#include "konamipt.h"
|
||||
|
||||
#include "cpu/m6809/m6809.h"
|
||||
@ -72,11 +73,285 @@ C004 76489 #4 trigger
|
||||
#include "machine/74259.h"
|
||||
#include "machine/gen_latch.h"
|
||||
#include "machine/watchdog.h"
|
||||
#include "sound/flt_rc.h"
|
||||
#include "sound/sn76496.h"
|
||||
#include "video/resnet.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class tp84_state : public driver_device
|
||||
{
|
||||
public:
|
||||
tp84_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "cpu1"),
|
||||
m_subcpu(*this, "sub"),
|
||||
m_audiocpu(*this, "audiocpu"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_screen(*this, "screen"),
|
||||
m_palette(*this, "palette"),
|
||||
m_filter(*this, "filter%u", 1U),
|
||||
m_palette_bank(*this, "palette_bank"),
|
||||
m_scroll_x(*this, "scroll_x"),
|
||||
m_scroll_y(*this, "scroll_y"),
|
||||
m_bg_videoram(*this, "bg_videoram"),
|
||||
m_fg_videoram(*this, "fg_videoram"),
|
||||
m_bg_colorram(*this, "bg_colorram"),
|
||||
m_fg_colorram(*this, "fg_colorram"),
|
||||
m_spriteram(*this, "spriteram")
|
||||
{ }
|
||||
|
||||
void tp84(machine_config &config);
|
||||
void tp84b(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
virtual void video_start() override;
|
||||
|
||||
private:
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_subcpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
required_device_array<filter_rc_device, 3> m_filter;
|
||||
|
||||
required_shared_ptr<uint8_t> m_palette_bank;
|
||||
required_shared_ptr<uint8_t> m_scroll_x;
|
||||
required_shared_ptr<uint8_t> m_scroll_y;
|
||||
required_shared_ptr<uint8_t> m_bg_videoram;
|
||||
required_shared_ptr<uint8_t> m_fg_videoram;
|
||||
required_shared_ptr<uint8_t> m_bg_colorram;
|
||||
required_shared_ptr<uint8_t> m_fg_colorram;
|
||||
required_shared_ptr<uint8_t> m_spriteram;
|
||||
|
||||
tilemap_t *m_bg_tilemap = nullptr;
|
||||
tilemap_t *m_fg_tilemap = nullptr;
|
||||
bool m_flipscreen_x = false;
|
||||
bool m_flipscreen_y = false;
|
||||
|
||||
bool m_irq_enable = false;
|
||||
bool m_sub_irq_mask = false;
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(irq_enable_w);
|
||||
template <uint8_t Which> DECLARE_WRITE_LINE_MEMBER(coin_counter_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(flip_screen_x_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(flip_screen_y_w);
|
||||
uint8_t sh_timer_r();
|
||||
void filter_w(offs_t offset, uint8_t data);
|
||||
void sh_irqtrigger_w(uint8_t data);
|
||||
void sub_irq_mask_w(uint8_t data);
|
||||
void spriteram_w(offs_t offset, uint8_t data);
|
||||
uint8_t scanline_r();
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_fg_tile_info);
|
||||
void palette(palette_device &palette) const;
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
|
||||
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
void audio_map(address_map &map);
|
||||
void cpu2_map(address_map &map);
|
||||
void tp84_cpu1_map(address_map &map);
|
||||
void tp84b_cpu1_map(address_map &map);
|
||||
};
|
||||
|
||||
|
||||
// video
|
||||
|
||||
/*
|
||||
-The colortable is divided in 2 part:
|
||||
-The characters colors
|
||||
-The sprites colors
|
||||
|
||||
-The characters colors are indexed like this:
|
||||
-2 bits from the characters
|
||||
-4 bits from the attribute in m_bg_colorram
|
||||
-2 bits from m_palette_bank (d3-d4)
|
||||
-3 bits from m_palette_bank (d0-d1-d2)
|
||||
-So, there is 2048 bytes for the characters
|
||||
|
||||
-The sprites colors are indexed like this:
|
||||
-4 bits from the sprites (16 colors)
|
||||
-4 bits from the attribute of the sprites
|
||||
-3 bits from m_palette_bank (d0-d1-d2)
|
||||
-So, there is 2048 bytes for the sprites
|
||||
|
||||
*/
|
||||
/*
|
||||
The RGB signals are generated by 3 PROMs 256X4 (prom 2C, 2D and 1E)
|
||||
The resistors values are:
|
||||
1K ohm
|
||||
470 ohm
|
||||
220 ohm
|
||||
100 ohm
|
||||
*/
|
||||
|
||||
void tp84_state::palette(palette_device &palette) const
|
||||
{
|
||||
const uint8_t *color_prom = memregion("proms")->base();
|
||||
static constexpr int resistances[4] = { 1000, 470, 220, 100 };
|
||||
|
||||
// compute the color output resistor weights
|
||||
double weights[4];
|
||||
compute_resistor_weights(0, 255, -1.0,
|
||||
4, resistances, weights, 470, 0,
|
||||
0, nullptr, nullptr, 0, 0,
|
||||
0, nullptr, nullptr, 0, 0);
|
||||
|
||||
// create a lookup table for the palette
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
int bit0, bit1, bit2, bit3;
|
||||
|
||||
// red component
|
||||
bit0 = BIT(color_prom[i | 0x000], 0);
|
||||
bit1 = BIT(color_prom[i | 0x000], 1);
|
||||
bit2 = BIT(color_prom[i | 0x000], 2);
|
||||
bit3 = BIT(color_prom[i | 0x000], 3);
|
||||
int const r = combine_weights(weights, bit0, bit1, bit2, bit3);
|
||||
|
||||
// green component
|
||||
bit0 = BIT(color_prom[i | 0x100], 0);
|
||||
bit1 = BIT(color_prom[i | 0x100], 1);
|
||||
bit2 = BIT(color_prom[i | 0x100], 2);
|
||||
bit3 = BIT(color_prom[i | 0x100], 3);
|
||||
int const g = combine_weights(weights, bit0, bit1, bit2, bit3);
|
||||
|
||||
// blue component
|
||||
bit0 = BIT(color_prom[i | 0x200], 0);
|
||||
bit1 = BIT(color_prom[i | 0x200], 1);
|
||||
bit2 = BIT(color_prom[i | 0x200], 2);
|
||||
bit3 = BIT(color_prom[i | 0x200], 3);
|
||||
int const b = combine_weights(weights, bit0, bit1, bit2, bit3);
|
||||
|
||||
palette.set_indirect_color(i, rgb_t(r, g, b));
|
||||
}
|
||||
|
||||
// color_prom now points to the beginning of the lookup table
|
||||
color_prom += 0x300;
|
||||
|
||||
// characters use colors 0x80-0xff, sprites use colors 0-0x7f
|
||||
for (int i = 0; i < 0x200; i++)
|
||||
{
|
||||
for (int j = 0; j < 8; j++)
|
||||
{
|
||||
uint8_t const ctabentry = ((~i & 0x100) >> 1) | (j << 4) | (color_prom[i] & 0x0f);
|
||||
palette.set_pen_indirect(((i & 0x100) << 3) | (j << 8) | (i & 0xff), ctabentry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void tp84_state::spriteram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
// the game multiplexes the sprites, so update now
|
||||
// m_screen->update_now();
|
||||
m_screen->update_partial(m_screen->vpos());
|
||||
m_spriteram[offset] = data;
|
||||
}
|
||||
|
||||
|
||||
uint8_t tp84_state::scanline_r()
|
||||
{
|
||||
// reads 1V - 128V
|
||||
return m_screen->vpos();
|
||||
}
|
||||
|
||||
|
||||
TILE_GET_INFO_MEMBER(tp84_state::get_bg_tile_info)
|
||||
{
|
||||
int const code = ((m_bg_colorram[tile_index] & 0x30) << 4) | m_bg_videoram[tile_index];
|
||||
int const color = ((*m_palette_bank & 0x07) << 6) |
|
||||
((*m_palette_bank & 0x18) << 1) |
|
||||
(m_bg_colorram[tile_index] & 0x0f);
|
||||
int const flags = TILE_FLIPYX(m_bg_colorram[tile_index] >> 6);
|
||||
|
||||
tileinfo.set(0, code, color, flags);
|
||||
}
|
||||
|
||||
TILE_GET_INFO_MEMBER(tp84_state::get_fg_tile_info)
|
||||
{
|
||||
int const code = ((m_fg_colorram[tile_index] & 0x30) << 4) | m_fg_videoram[tile_index];
|
||||
int const color = ((*m_palette_bank & 0x07) << 6) |
|
||||
((*m_palette_bank & 0x18) << 1) |
|
||||
(m_fg_colorram[tile_index] & 0x0f);
|
||||
int const flags = TILE_FLIPYX(m_fg_colorram[tile_index] >> 6);
|
||||
|
||||
tileinfo.set(0, code, color, flags);
|
||||
}
|
||||
|
||||
|
||||
void tp84_state::video_start()
|
||||
{
|
||||
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(tp84_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(tp84_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
}
|
||||
|
||||
|
||||
void tp84_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
int const palette_base = ((*m_palette_bank & 0x07) << 4);
|
||||
|
||||
for (int offs = 0x5c; offs >= 0; offs -= 4)
|
||||
{
|
||||
int const x = m_spriteram[offs];
|
||||
int const y = 240 - m_spriteram[offs + 3];
|
||||
|
||||
int const code = m_spriteram[offs + 1];
|
||||
int const color = palette_base | (m_spriteram[offs + 2] & 0x0f);
|
||||
int const flip_x = ~m_spriteram[offs + 2] & 0x40;
|
||||
int const flip_y = m_spriteram[offs + 2] & 0x80;
|
||||
|
||||
m_gfxdecode->gfx(1)->transmask(bitmap, cliprect, code, color, flip_x, flip_y, x, y,
|
||||
m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, palette_base));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint32_t tp84_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
rectangle clip = cliprect;
|
||||
const rectangle &visarea = screen.visible_area();
|
||||
|
||||
if (cliprect.min_y == screen.visible_area().min_y)
|
||||
{
|
||||
machine().tilemap().mark_all_dirty();
|
||||
|
||||
m_bg_tilemap->set_scrollx(0, *m_scroll_x);
|
||||
m_bg_tilemap->set_scrolly(0, *m_scroll_y);
|
||||
|
||||
machine().tilemap().set_flip_all((m_flipscreen_x ? TILEMAP_FLIPX : 0) |
|
||||
(m_flipscreen_y ? TILEMAP_FLIPY : 0));
|
||||
}
|
||||
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
||||
draw_sprites(bitmap, cliprect);
|
||||
|
||||
// draw top status region
|
||||
clip.min_x = visarea.min_x;
|
||||
clip.max_x = visarea.min_x + 15;
|
||||
m_fg_tilemap->draw(screen, bitmap, clip, 0, 0);
|
||||
|
||||
// draw bottom status region
|
||||
clip.min_x = visarea.max_x - 15;
|
||||
clip.max_x = visarea.max_x;
|
||||
m_fg_tilemap->draw(screen, bitmap, clip, 0, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// machine
|
||||
|
||||
void tp84_state::machine_start()
|
||||
{
|
||||
save_item(NAME(m_irq_enable));
|
||||
@ -103,15 +378,10 @@ WRITE_LINE_MEMBER(tp84_state::irq_enable_w)
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(tp84_state::coin_counter_1_w)
|
||||
template <uint8_t Which>
|
||||
WRITE_LINE_MEMBER(tp84_state::coin_counter_w)
|
||||
{
|
||||
machine().bookkeeping().coin_counter_w(0, state);
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(tp84_state::coin_counter_2_w)
|
||||
{
|
||||
machine().bookkeeping().coin_counter_w(1, state);
|
||||
machine().bookkeeping().coin_counter_w(Which, state);
|
||||
}
|
||||
|
||||
|
||||
@ -127,46 +397,46 @@ WRITE_LINE_MEMBER(tp84_state::flip_screen_y_w)
|
||||
}
|
||||
|
||||
|
||||
uint8_t tp84_state::tp84_sh_timer_r()
|
||||
uint8_t tp84_state::sh_timer_r()
|
||||
{
|
||||
/* main xtal 14.318MHz, divided by 4 to get the CPU clock, further */
|
||||
/* divided by 2048 to get this timer */
|
||||
/* (divide by (2048/2), and not 1024, because the CPU cycle counter is */
|
||||
/* incremented every other state change of the clock) */
|
||||
/* main xtal 14.318MHz, divided by 4 to get the CPU clock, further
|
||||
divided by 2048 to get this timer
|
||||
(divide by (2048/2), and not 1024, because the CPU cycle counter is
|
||||
incremented every other state change of the clock) */
|
||||
return (m_audiocpu->total_cycles() / (2048/2)) & 0x0f;
|
||||
}
|
||||
|
||||
|
||||
void tp84_state::tp84_filter_w(offs_t offset, uint8_t data)
|
||||
void tp84_state::filter_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
int C;
|
||||
|
||||
/* 76489 #0 */
|
||||
// 76489 #0
|
||||
C = 0;
|
||||
if (offset & 0x008) C += 47000; /* 47000pF = 0.047uF */
|
||||
if (offset & 0x010) C += 470000; /* 470000pF = 0.47uF */
|
||||
m_filter[0]->filter_rc_set_RC(filter_rc_device::LOWPASS_3R,1000,2200,1000,CAP_P(C));
|
||||
if (offset & 0x008) C += 47000; // 47000pF = 0.047uF
|
||||
if (offset & 0x010) C += 470000; // 470000pF = 0.47uF
|
||||
m_filter[0]->filter_rc_set_RC(filter_rc_device::LOWPASS_3R, 1000, 2200, 1000, CAP_P(C));
|
||||
|
||||
/* 76489 #1 (optional) */
|
||||
// 76489 #1 (optional)
|
||||
C = 0;
|
||||
if (offset & 0x020) C += 47000; /* 47000pF = 0.047uF */
|
||||
if (offset & 0x040) C += 470000; /* 470000pF = 0.47uF */
|
||||
//m_filter[1]->filter_rc_set_RC(filter_rc_device::LOWPASS_3R,1000,2200,1000,CAP_P(C));
|
||||
if (offset & 0x020) C += 47000; // 47000pF = 0.047uF
|
||||
if (offset & 0x040) C += 470000; // 470000pF = 0.47uF
|
||||
//m_filter[1]->filter_rc_set_RC(filter_rc_device::LOWPASS_3R, 1000, 2200, 1000, CAP_P(C));
|
||||
|
||||
/* 76489 #2 */
|
||||
// 76489 #2
|
||||
C = 0;
|
||||
if (offset & 0x080) C += 470000; /* 470000pF = 0.47uF */
|
||||
m_filter[1]->filter_rc_set_RC(filter_rc_device::LOWPASS_3R,1000,2200,1000,CAP_P(C));
|
||||
if (offset & 0x080) C += 470000; // 470000pF = 0.47uF
|
||||
m_filter[1]->filter_rc_set_RC(filter_rc_device::LOWPASS_3R, 1000, 2200, 1000, CAP_P(C));
|
||||
|
||||
/* 76489 #3 */
|
||||
// 76489 #3
|
||||
C = 0;
|
||||
if (offset & 0x100) C += 470000; /* 470000pF = 0.47uF */
|
||||
m_filter[2]->filter_rc_set_RC(filter_rc_device::LOWPASS_3R,1000,2200,1000,CAP_P(C));
|
||||
if (offset & 0x100) C += 470000; // 470000pF = 0.47uF
|
||||
m_filter[2]->filter_rc_set_RC(filter_rc_device::LOWPASS_3R, 1000, 2200, 1000, CAP_P(C));
|
||||
}
|
||||
|
||||
void tp84_state::tp84_sh_irqtrigger_w(uint8_t data)
|
||||
void tp84_state::sh_irqtrigger_w(uint8_t data)
|
||||
{
|
||||
m_audiocpu->set_input_line_and_vector(0,HOLD_LINE,0xff); // Z80
|
||||
m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80
|
||||
}
|
||||
|
||||
|
||||
@ -174,42 +444,42 @@ void tp84_state::tp84_sh_irqtrigger_w(uint8_t data)
|
||||
void tp84_state::tp84_cpu1_map(address_map &map)
|
||||
{
|
||||
map(0x2000, 0x2000).w("watchdog", FUNC(watchdog_timer_device::reset_w));
|
||||
map(0x2800, 0x2800).portr("SYSTEM").writeonly().share("palette_bank");
|
||||
map(0x2800, 0x2800).portr("SYSTEM").writeonly().share(m_palette_bank);
|
||||
map(0x2820, 0x2820).portr("P1");
|
||||
map(0x2840, 0x2840).portr("P2");
|
||||
map(0x2860, 0x2860).portr("DSW1");
|
||||
map(0x3000, 0x3000).portr("DSW2");
|
||||
map(0x3000, 0x3007).w("mainlatch", FUNC(ls259_device::write_d0));
|
||||
map(0x3800, 0x3800).w(FUNC(tp84_state::tp84_sh_irqtrigger_w));
|
||||
map(0x3800, 0x3800).w(FUNC(tp84_state::sh_irqtrigger_w));
|
||||
map(0x3a00, 0x3a00).w("soundlatch", FUNC(generic_latch_8_device::write));
|
||||
map(0x3c00, 0x3c00).writeonly().share("scroll_x");
|
||||
map(0x3e00, 0x3e00).writeonly().share("scroll_y");
|
||||
map(0x4000, 0x43ff).ram().share("bg_videoram");
|
||||
map(0x4400, 0x47ff).ram().share("fg_videoram");
|
||||
map(0x4800, 0x4bff).ram().share("bg_colorram");
|
||||
map(0x4c00, 0x4fff).ram().share("fg_colorram");
|
||||
map(0x5000, 0x57ff).ram().share("share1");
|
||||
map(0x3c00, 0x3c00).writeonly().share(m_scroll_x);
|
||||
map(0x3e00, 0x3e00).writeonly().share(m_scroll_y);
|
||||
map(0x4000, 0x43ff).ram().share(m_bg_videoram);
|
||||
map(0x4400, 0x47ff).ram().share(m_fg_videoram);
|
||||
map(0x4800, 0x4bff).ram().share(m_bg_colorram);
|
||||
map(0x4c00, 0x4fff).ram().share(m_fg_colorram);
|
||||
map(0x5000, 0x57ff).ram().share("cpu1_2");
|
||||
map(0x8000, 0xffff).rom();
|
||||
}
|
||||
|
||||
void tp84_state::tp84b_cpu1_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x03ff).ram().share("bg_videoram");
|
||||
map(0x0400, 0x07ff).ram().share("fg_videoram");
|
||||
map(0x0800, 0x0bff).ram().share("bg_colorram");
|
||||
map(0x0c00, 0x0fff).ram().share("fg_colorram");
|
||||
map(0x1000, 0x17ff).ram().share("share1");
|
||||
map(0x0000, 0x03ff).ram().share(m_bg_videoram);
|
||||
map(0x0400, 0x07ff).ram().share(m_fg_videoram);
|
||||
map(0x0800, 0x0bff).ram().share(m_bg_colorram);
|
||||
map(0x0c00, 0x0fff).ram().share(m_fg_colorram);
|
||||
map(0x1000, 0x17ff).ram().share("cpu1_2");
|
||||
map(0x1800, 0x1800).w("watchdog", FUNC(watchdog_timer_device::reset_w));
|
||||
map(0x1a00, 0x1a00).portr("SYSTEM").writeonly().share("palette_bank");
|
||||
map(0x1a00, 0x1a00).portr("SYSTEM").writeonly().share(m_palette_bank);
|
||||
map(0x1a20, 0x1a20).portr("P1");
|
||||
map(0x1a40, 0x1a40).portr("P2");
|
||||
map(0x1a60, 0x1a60).portr("DSW1");
|
||||
map(0x1c00, 0x1c00).portr("DSW2");
|
||||
map(0x1c00, 0x1c07).w("mainlatch", FUNC(ls259_device::write_d0));
|
||||
map(0x1e00, 0x1e00).w(FUNC(tp84_state::tp84_sh_irqtrigger_w));
|
||||
map(0x1e00, 0x1e00).w(FUNC(tp84_state::sh_irqtrigger_w));
|
||||
map(0x1e80, 0x1e80).w("soundlatch", FUNC(generic_latch_8_device::write));
|
||||
map(0x1f00, 0x1f00).writeonly().share("scroll_x");
|
||||
map(0x1f80, 0x1f80).writeonly().share("scroll_y");
|
||||
map(0x1f00, 0x1f00).writeonly().share(m_scroll_x);
|
||||
map(0x1f80, 0x1f80).writeonly().share(m_scroll_y);
|
||||
map(0x8000, 0xffff).rom();
|
||||
}
|
||||
|
||||
@ -224,12 +494,12 @@ void tp84_state::sub_irq_mask_w(uint8_t data)
|
||||
|
||||
void tp84_state::cpu2_map(address_map &map)
|
||||
{
|
||||
// map(0x0000, 0x0000).ram(); /* Watch dog ?*/
|
||||
map(0x2000, 0x2000).r(FUNC(tp84_state::tp84_scanline_r)); /* beam position */
|
||||
// map(0x0000, 0x0000).ram(); // Watch dog ?
|
||||
map(0x2000, 0x2000).r(FUNC(tp84_state::scanline_r)); // beam position
|
||||
map(0x4000, 0x4000).w(FUNC(tp84_state::sub_irq_mask_w));
|
||||
map(0x6000, 0x679f).ram();
|
||||
map(0x67a0, 0x67ff).ram().w(FUNC(tp84_state::tp84_spriteram_w)).share("spriteram");
|
||||
map(0x8000, 0x87ff).ram().share("share1");
|
||||
map(0x67a0, 0x67ff).ram().w(FUNC(tp84_state::spriteram_w)).share(m_spriteram);
|
||||
map(0x8000, 0x87ff).ram().share("cpu1_2");
|
||||
map(0xe000, 0xffff).rom();
|
||||
}
|
||||
|
||||
@ -239,8 +509,8 @@ void tp84_state::audio_map(address_map &map)
|
||||
map(0x0000, 0x3fff).rom();
|
||||
map(0x4000, 0x43ff).ram();
|
||||
map(0x6000, 0x6000).r("soundlatch", FUNC(generic_latch_8_device::read));
|
||||
map(0x8000, 0x8000).r(FUNC(tp84_state::tp84_sh_timer_r));
|
||||
map(0xa000, 0xa1ff).w(FUNC(tp84_state::tp84_filter_w));
|
||||
map(0x8000, 0x8000).r(FUNC(tp84_state::sh_timer_r));
|
||||
map(0xa000, 0xa1ff).w(FUNC(tp84_state::filter_w));
|
||||
map(0xc000, 0xc000).nopw();
|
||||
map(0xc001, 0xc001).w("y2404_1", FUNC(y2404_device::write));
|
||||
map(0xc003, 0xc003).w("y2404_2", FUNC(y2404_device::write));
|
||||
@ -261,7 +531,7 @@ static INPUT_PORTS_START( tp84 )
|
||||
|
||||
PORT_START("DSW1")
|
||||
KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1)
|
||||
/* "Invalid" = both coin slots disabled */
|
||||
// "Invalid" = both coin slots disabled
|
||||
|
||||
PORT_START("DSW2")
|
||||
PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
|
||||
@ -324,58 +594,58 @@ static const gfx_layout spritelayout =
|
||||
};
|
||||
|
||||
static GFXDECODE_START( gfx_tp84 )
|
||||
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 64*8 )
|
||||
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 64*4*8, 16*8 )
|
||||
GFXDECODE_ENTRY( "tiles", 0, charlayout, 0, 64*8 )
|
||||
GFXDECODE_ENTRY( "sprites", 0, spritelayout, 64*4*8, 16*8 )
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
void tp84_state::tp84(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
MC6809E(config, m_maincpu, XTAL(18'432'000)/12); /* verified on pcb */
|
||||
// basic machine hardware
|
||||
MC6809E(config, m_maincpu, XTAL(18'432'000) / 12); // verified on PCB
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &tp84_state::tp84_cpu1_map);
|
||||
|
||||
MC6809E(config, m_subcpu, XTAL(18'432'000)/12); /* verified on pcb */
|
||||
MC6809E(config, m_subcpu, XTAL(18'432'000) / 12); // verified on PCB
|
||||
m_subcpu->set_addrmap(AS_PROGRAM, &tp84_state::cpu2_map);
|
||||
|
||||
Z80(config, m_audiocpu, XTAL(14'318'181)/4); /* verified on pcb */
|
||||
Z80(config, m_audiocpu, XTAL(14'318'181) / 4); // verified on PCB
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &tp84_state::audio_map);
|
||||
|
||||
config.set_maximum_quantum(attotime::from_hz(6000)); /* 100 CPU slices per frame - a high value to ensure proper */
|
||||
/* synchronization of the CPUs */
|
||||
config.set_maximum_quantum(attotime::from_hz(6000)); /* 100 CPU slices per frame - a high value to ensure proper
|
||||
synchronization of the CPUs */
|
||||
|
||||
ls259_device &mainlatch(LS259(config, "mainlatch", 0)); // 3B
|
||||
mainlatch.q_out_cb<0>().set(FUNC(tp84_state::irq_enable_w));
|
||||
mainlatch.q_out_cb<1>().set(FUNC(tp84_state::coin_counter_2_w));
|
||||
mainlatch.q_out_cb<2>().set(FUNC(tp84_state::coin_counter_1_w));
|
||||
mainlatch.q_out_cb<1>().set(FUNC(tp84_state::coin_counter_w<1>));
|
||||
mainlatch.q_out_cb<2>().set(FUNC(tp84_state::coin_counter_w<0>));
|
||||
mainlatch.q_out_cb<4>().set(FUNC(tp84_state::flip_screen_x_w));
|
||||
mainlatch.q_out_cb<5>().set(FUNC(tp84_state::flip_screen_y_w));
|
||||
|
||||
WATCHDOG_TIMER(config, "watchdog");
|
||||
|
||||
/* video hardware */
|
||||
// video hardware
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_refresh_hz(60);
|
||||
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
||||
m_screen->set_size(32*8, 32*8);
|
||||
m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
|
||||
m_screen->set_screen_update(FUNC(tp84_state::screen_update_tp84));
|
||||
m_screen->set_screen_update(FUNC(tp84_state::screen_update));
|
||||
m_screen->set_palette(m_palette);
|
||||
m_screen->screen_vblank().set(FUNC(tp84_state::vblank_irq));
|
||||
|
||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_tp84);
|
||||
PALETTE(config, m_palette, FUNC(tp84_state::tp84_palette), 4096, 256);
|
||||
PALETTE(config, m_palette, FUNC(tp84_state::palette), 4096, 256);
|
||||
|
||||
/* audio hardware */
|
||||
// audio hardware
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
GENERIC_LATCH_8(config, "soundlatch");
|
||||
|
||||
Y2404(config, "y2404_1", XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "filter1", 0.75); /* verified on pcb */
|
||||
Y2404(config, "y2404_1", XTAL(14'318'181) / 8).add_route(ALL_OUTPUTS, "filter1", 0.75); // verified on PCB
|
||||
|
||||
Y2404(config, "y2404_2", XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "filter2", 0.75); /* verified on pcb */
|
||||
Y2404(config, "y2404_2", XTAL(14'318'181) / 8).add_route(ALL_OUTPUTS, "filter2", 0.75); // verified on PCB
|
||||
|
||||
Y2404(config, "y2404_3", XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "filter3", 0.75); /* verified on pcb */
|
||||
Y2404(config, "y2404_3", XTAL(14'318'181) / 8).add_route(ALL_OUTPUTS, "filter3", 0.75); // verified on PCB
|
||||
|
||||
for (auto &filter : m_filter)
|
||||
FILTER_RC(config, filter).add_route(ALL_OUTPUTS, "mono", 1.0);
|
||||
@ -400,28 +670,28 @@ ROM_START( tp84 )
|
||||
ROM_LOAD( "388_f06.9j", 0xc000, 0x2000, CRC(dbd5333b) SHA1(65dee1fd4c940a5423d57cb55a7f2ad89c59c5c6) )
|
||||
ROM_LOAD( "388_07.10j", 0xe000, 0x2000, CRC(a45237c4) SHA1(896e31c59aedf1c7e73e6f30fbe78cc020b457ab) )
|
||||
|
||||
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
|
||||
ROM_LOAD( "388_f08.10d", 0xe000, 0x2000, CRC(36462ff1) SHA1(118a1b46ee01a583e6cf39af59b073321c76dbff) ) /* E08? */
|
||||
ROM_REGION( 0x10000, "sub", 0 )
|
||||
ROM_LOAD( "388_f08.10d", 0xe000, 0x2000, CRC(36462ff1) SHA1(118a1b46ee01a583e6cf39af59b073321c76dbff) ) // E08?
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for code of sound cpu Z80 */
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 )
|
||||
ROM_LOAD( "388j13.6a", 0x0000, 0x2000, CRC(c44414da) SHA1(981289f5bdf7dc1348f4ca547ac933ef503b6588) )
|
||||
|
||||
ROM_REGION( 0x4000, "gfx1", 0 )
|
||||
ROM_LOAD( "388_h02.2j", 0x0000, 0x2000, CRC(05c7508f) SHA1(1a3c7cd47ad34e37a7b0f3014e10c055cbb2b559) ) /* chars */
|
||||
ROM_REGION( 0x4000, "tiles", 0 )
|
||||
ROM_LOAD( "388_h02.2j", 0x0000, 0x2000, CRC(05c7508f) SHA1(1a3c7cd47ad34e37a7b0f3014e10c055cbb2b559) )
|
||||
ROM_LOAD( "388_d01.1j", 0x2000, 0x2000, CRC(498d90b7) SHA1(6975f3a1603b14132aab58329195a4845a6e28bb) )
|
||||
|
||||
ROM_REGION( 0x8000, "gfx2", 0 )
|
||||
ROM_LOAD( "388_e09.12a", 0x0000, 0x2000, CRC(cd682f30) SHA1(6f48d3efc53d63171ec655e64b225412de1374e4) ) /* sprites */
|
||||
ROM_REGION( 0x8000, "sprites", 0 )
|
||||
ROM_LOAD( "388_e09.12a", 0x0000, 0x2000, CRC(cd682f30) SHA1(6f48d3efc53d63171ec655e64b225412de1374e4) )
|
||||
ROM_LOAD( "388_e10.13a", 0x2000, 0x2000, CRC(888d4bd6) SHA1(7e2dde080bb614709561431a81b0490b2aaa42a9) )
|
||||
ROM_LOAD( "388_e11.14a", 0x4000, 0x2000, CRC(9a220b39) SHA1(792aaa4daedc8eb807d5a66d87da4641739b1660) )
|
||||
ROM_LOAD( "388_e12.15a", 0x6000, 0x2000, CRC(fac98397) SHA1(d90f99b19ab3cddfdfd37a273fb437be098088bc) )
|
||||
|
||||
ROM_REGION( 0x0500, "proms", 0 )
|
||||
ROM_LOAD( "388d14.2c", 0x0000, 0x0100, CRC(d737eaba) SHA1(e39026f87f5b995cf4a38b5d3d3fee7561762ae6) ) /* palette red component */
|
||||
ROM_LOAD( "388d15.2d", 0x0100, 0x0100, CRC(2f6a9a2a) SHA1(f09d8b92c7f9bf046cdd815c5282d0510e61b6e0) ) /* palette green component */
|
||||
ROM_LOAD( "388d16.1e", 0x0200, 0x0100, CRC(2e21329b) SHA1(9ba8af294dbd6f3a5d039c74a56e0605a913c037) ) /* palette blue component */
|
||||
ROM_LOAD( "388d18.1f", 0x0300, 0x0100, CRC(61d2d398) SHA1(3f74ad733b07b6a31cf9d4956d171eb9253dd6bf) ) /* char lookup table */
|
||||
ROM_LOAD( "388j17.16c", 0x0400, 0x0100, CRC(13c4e198) SHA1(42ab23206be99e840bd9c52cefa175c12fac8e5b) ) /* sprite lookup table */
|
||||
ROM_LOAD( "388d14.2c", 0x0000, 0x0100, CRC(d737eaba) SHA1(e39026f87f5b995cf4a38b5d3d3fee7561762ae6) ) // palette red component
|
||||
ROM_LOAD( "388d15.2d", 0x0100, 0x0100, CRC(2f6a9a2a) SHA1(f09d8b92c7f9bf046cdd815c5282d0510e61b6e0) ) // palette green component
|
||||
ROM_LOAD( "388d16.1e", 0x0200, 0x0100, CRC(2e21329b) SHA1(9ba8af294dbd6f3a5d039c74a56e0605a913c037) ) // palette blue component
|
||||
ROM_LOAD( "388d18.1f", 0x0300, 0x0100, CRC(61d2d398) SHA1(3f74ad733b07b6a31cf9d4956d171eb9253dd6bf) ) // char lookup table
|
||||
ROM_LOAD( "388j17.16c", 0x0400, 0x0100, CRC(13c4e198) SHA1(42ab23206be99e840bd9c52cefa175c12fac8e5b) ) // sprite lookup table
|
||||
ROM_END
|
||||
|
||||
ROM_START( tp84a )
|
||||
@ -431,57 +701,59 @@ ROM_START( tp84a )
|
||||
ROM_LOAD( "388_f06.9j", 0xc000, 0x2000, CRC(dbd5333b) SHA1(65dee1fd4c940a5423d57cb55a7f2ad89c59c5c6) )
|
||||
ROM_LOAD( "388_f07.10j", 0xe000, 0x2000, CRC(8fbdb4ef) SHA1(e615c4d9964ab00f6776147c54925b4b6100b360) )
|
||||
|
||||
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
|
||||
ROM_LOAD( "388_f08.10d", 0xe000, 0x2000, CRC(36462ff1) SHA1(118a1b46ee01a583e6cf39af59b073321c76dbff) ) /* E08? */
|
||||
ROM_REGION( 0x10000, "sub", 0 )
|
||||
ROM_LOAD( "388_f08.10d", 0xe000, 0x2000, CRC(36462ff1) SHA1(118a1b46ee01a583e6cf39af59b073321c76dbff) ) // E08?
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for code of sound cpu Z80 */
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 )
|
||||
ROM_LOAD( "388j13.6a", 0x0000, 0x2000, CRC(c44414da) SHA1(981289f5bdf7dc1348f4ca547ac933ef503b6588) )
|
||||
|
||||
ROM_REGION( 0x4000, "gfx1", 0 )
|
||||
ROM_LOAD( "388_h02.2j", 0x0000, 0x2000, CRC(05c7508f) SHA1(1a3c7cd47ad34e37a7b0f3014e10c055cbb2b559) ) /* chars */
|
||||
ROM_REGION( 0x4000, "tiles", 0 )
|
||||
ROM_LOAD( "388_h02.2j", 0x0000, 0x2000, CRC(05c7508f) SHA1(1a3c7cd47ad34e37a7b0f3014e10c055cbb2b559) )
|
||||
ROM_LOAD( "388_d01.1j", 0x2000, 0x2000, CRC(498d90b7) SHA1(6975f3a1603b14132aab58329195a4845a6e28bb) )
|
||||
|
||||
ROM_REGION( 0x8000, "gfx2", 0 )
|
||||
ROM_LOAD( "388_e09.12a", 0x0000, 0x2000, CRC(cd682f30) SHA1(6f48d3efc53d63171ec655e64b225412de1374e4) ) /* sprites */
|
||||
ROM_REGION( 0x8000, "sprites", 0 )
|
||||
ROM_LOAD( "388_e09.12a", 0x0000, 0x2000, CRC(cd682f30) SHA1(6f48d3efc53d63171ec655e64b225412de1374e4) )
|
||||
ROM_LOAD( "388_e10.13a", 0x2000, 0x2000, CRC(888d4bd6) SHA1(7e2dde080bb614709561431a81b0490b2aaa42a9) )
|
||||
ROM_LOAD( "388_e11.14a", 0x4000, 0x2000, CRC(9a220b39) SHA1(792aaa4daedc8eb807d5a66d87da4641739b1660) )
|
||||
ROM_LOAD( "388_e12.15a", 0x6000, 0x2000, CRC(fac98397) SHA1(d90f99b19ab3cddfdfd37a273fb437be098088bc) )
|
||||
|
||||
ROM_REGION( 0x0500, "proms", 0 )
|
||||
ROM_LOAD( "388d14.2c", 0x0000, 0x0100, CRC(d737eaba) SHA1(e39026f87f5b995cf4a38b5d3d3fee7561762ae6) ) /* palette red component */
|
||||
ROM_LOAD( "388d15.2d", 0x0100, 0x0100, CRC(2f6a9a2a) SHA1(f09d8b92c7f9bf046cdd815c5282d0510e61b6e0) ) /* palette green component */
|
||||
ROM_LOAD( "388d16.1e", 0x0200, 0x0100, CRC(2e21329b) SHA1(9ba8af294dbd6f3a5d039c74a56e0605a913c037) ) /* palette blue component */
|
||||
ROM_LOAD( "388d18.1f", 0x0300, 0x0100, CRC(61d2d398) SHA1(3f74ad733b07b6a31cf9d4956d171eb9253dd6bf) ) /* char lookup table */
|
||||
ROM_LOAD( "388d17.16c", 0x0400, 0x0100, CRC(af8f839c) SHA1(b469785a4153a221403fcf72c65c9c35ae75df5d) ) /* sprite lookup table (dump miss?)*/
|
||||
ROM_LOAD( "388d14.2c", 0x0000, 0x0100, CRC(d737eaba) SHA1(e39026f87f5b995cf4a38b5d3d3fee7561762ae6) ) // palette red component
|
||||
ROM_LOAD( "388d15.2d", 0x0100, 0x0100, CRC(2f6a9a2a) SHA1(f09d8b92c7f9bf046cdd815c5282d0510e61b6e0) ) // palette green component
|
||||
ROM_LOAD( "388d16.1e", 0x0200, 0x0100, CRC(2e21329b) SHA1(9ba8af294dbd6f3a5d039c74a56e0605a913c037) ) // palette blue component
|
||||
ROM_LOAD( "388d18.1f", 0x0300, 0x0100, CRC(61d2d398) SHA1(3f74ad733b07b6a31cf9d4956d171eb9253dd6bf) ) // char lookup table
|
||||
ROM_LOAD( "388d17.16c", 0x0400, 0x0100, CRC(af8f839c) SHA1(b469785a4153a221403fcf72c65c9c35ae75df5d) ) // sprite lookup table (dump miss?)
|
||||
ROM_END
|
||||
|
||||
ROM_START( tp84b )
|
||||
ROM_REGION( 0x10000, "cpu1", 0 )
|
||||
/* 0x6000 - 0x7fff space for diagnostic rom */
|
||||
// 0x6000 - 0x7fff space for diagnostic ROM
|
||||
ROM_LOAD( "388j05.8j", 0x8000, 0x4000, CRC(a59e2fda) SHA1(7d776d5d3fcfbe81d42580cfe93614dc4618a440) )
|
||||
ROM_LOAD( "388j07.10j", 0xc000, 0x4000, CRC(d25d18e6) SHA1(043f515cc66f6af004be81d6a6b5a92b553107ff) )
|
||||
|
||||
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
|
||||
ROM_REGION( 0x10000, "sub", 0 )
|
||||
ROM_LOAD( "388j08.10d", 0xe000, 0x2000, CRC(2aea6b42) SHA1(58c3b4852f22a766f440b98904b73c00a31eae01) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for code of sound cpu Z80 */
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 )
|
||||
ROM_LOAD( "388j13.6a", 0x0000, 0x2000, CRC(c44414da) SHA1(981289f5bdf7dc1348f4ca547ac933ef503b6588) )
|
||||
|
||||
ROM_REGION( 0x4000, "gfx1", 0 )
|
||||
ROM_LOAD( "388j02.2j", 0x0000, 0x4000, CRC(e1225f53) SHA1(59d07dc4faafc82999e9716f0bba1cb7350c03e3) ) /* chars */
|
||||
ROM_REGION( 0x4000, "tiles", 0 )
|
||||
ROM_LOAD( "388j02.2j", 0x0000, 0x4000, CRC(e1225f53) SHA1(59d07dc4faafc82999e9716f0bba1cb7350c03e3) )
|
||||
|
||||
ROM_REGION( 0x8000, "gfx2", 0 )
|
||||
ROM_LOAD( "388j09.12a", 0x0000, 0x4000, CRC(aec90936) SHA1(3420c24bbedb140cb20fdaf51acbe9493830b64a) ) /* sprites */
|
||||
ROM_REGION( 0x8000, "sprites", 0 )
|
||||
ROM_LOAD( "388j09.12a", 0x0000, 0x4000, CRC(aec90936) SHA1(3420c24bbedb140cb20fdaf51acbe9493830b64a) )
|
||||
ROM_LOAD( "388j11.14a", 0x4000, 0x4000, CRC(29257f03) SHA1(ebbb980bd226e8ada7e517e92487a32bfbc82f91) )
|
||||
|
||||
ROM_REGION( 0x0500, "proms", 0 )
|
||||
ROM_LOAD( "388j14.2c", 0x0000, 0x0100, CRC(d737eaba) SHA1(e39026f87f5b995cf4a38b5d3d3fee7561762ae6) ) /* palette red component */
|
||||
ROM_LOAD( "388j15.2d", 0x0100, 0x0100, CRC(2f6a9a2a) SHA1(f09d8b92c7f9bf046cdd815c5282d0510e61b6e0) ) /* palette green component */
|
||||
ROM_LOAD( "388j16.1e", 0x0200, 0x0100, CRC(2e21329b) SHA1(9ba8af294dbd6f3a5d039c74a56e0605a913c037) ) /* palette blue component */
|
||||
ROM_LOAD( "388j18.1f", 0x0300, 0x0100, CRC(61d2d398) SHA1(3f74ad733b07b6a31cf9d4956d171eb9253dd6bf) ) /* char lookup table */
|
||||
ROM_LOAD( "388j17.16c", 0x0400, 0x0100, CRC(13c4e198) SHA1(42ab23206be99e840bd9c52cefa175c12fac8e5b) ) /* sprite lookup table */
|
||||
ROM_LOAD( "388j14.2c", 0x0000, 0x0100, CRC(d737eaba) SHA1(e39026f87f5b995cf4a38b5d3d3fee7561762ae6) ) // palette red component
|
||||
ROM_LOAD( "388j15.2d", 0x0100, 0x0100, CRC(2f6a9a2a) SHA1(f09d8b92c7f9bf046cdd815c5282d0510e61b6e0) ) // palette green component
|
||||
ROM_LOAD( "388j16.1e", 0x0200, 0x0100, CRC(2e21329b) SHA1(9ba8af294dbd6f3a5d039c74a56e0605a913c037) ) // palette blue component
|
||||
ROM_LOAD( "388j18.1f", 0x0300, 0x0100, CRC(61d2d398) SHA1(3f74ad733b07b6a31cf9d4956d171eb9253dd6bf) ) // char lookup table
|
||||
ROM_LOAD( "388j17.16c", 0x0400, 0x0100, CRC(13c4e198) SHA1(42ab23206be99e840bd9c52cefa175c12fac8e5b) ) // sprite lookup table
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
GAME( 1984, tp84, 0, tp84, tp84, tp84_state, empty_init, ROT90, "Konami", "Time Pilot '84 (set 1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1984, tp84a, tp84, tp84, tp84a, tp84_state, empty_init, ROT90, "Konami", "Time Pilot '84 (set 2)", MACHINE_SUPPORTS_SAVE )
|
||||
|
@ -1,88 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Aaron Giles
|
||||
#ifndef MAME_INCLUDES_TP84
|
||||
#define MAME_INCLUDES_TP84
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "sound/flt_rc.h"
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
class tp84_state : public driver_device
|
||||
{
|
||||
public:
|
||||
tp84_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "cpu1"),
|
||||
m_subcpu(*this, "sub"),
|
||||
m_audiocpu(*this, "audiocpu"),
|
||||
m_palette_bank(*this, "palette_bank"),
|
||||
m_scroll_x(*this, "scroll_x"),
|
||||
m_scroll_y(*this, "scroll_y"),
|
||||
m_bg_videoram(*this, "bg_videoram"),
|
||||
m_fg_videoram(*this, "fg_videoram"),
|
||||
m_bg_colorram(*this, "bg_colorram"),
|
||||
m_fg_colorram(*this, "fg_colorram"),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_screen(*this, "screen"),
|
||||
m_palette(*this, "palette"),
|
||||
m_filter(*this, "filter%u", 1U)
|
||||
{ }
|
||||
|
||||
void tp84(machine_config &config);
|
||||
void tp84b(machine_config &config);
|
||||
|
||||
private:
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_subcpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_shared_ptr<uint8_t> m_palette_bank;
|
||||
required_shared_ptr<uint8_t> m_scroll_x;
|
||||
required_shared_ptr<uint8_t> m_scroll_y;
|
||||
required_shared_ptr<uint8_t> m_bg_videoram;
|
||||
required_shared_ptr<uint8_t> m_fg_videoram;
|
||||
required_shared_ptr<uint8_t> m_bg_colorram;
|
||||
required_shared_ptr<uint8_t> m_fg_colorram;
|
||||
required_shared_ptr<uint8_t> m_spriteram;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
required_device_array<filter_rc_device, 3> m_filter;
|
||||
tilemap_t *m_bg_tilemap = nullptr;
|
||||
tilemap_t *m_fg_tilemap = nullptr;
|
||||
bool m_flipscreen_x = false;
|
||||
bool m_flipscreen_y = false;
|
||||
|
||||
bool m_irq_enable = false;
|
||||
bool m_sub_irq_mask = false;
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(irq_enable_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_counter_1_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(coin_counter_2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(flip_screen_x_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(flip_screen_y_w);
|
||||
uint8_t tp84_sh_timer_r();
|
||||
void tp84_filter_w(offs_t offset, uint8_t data);
|
||||
void tp84_sh_irqtrigger_w(uint8_t data);
|
||||
void sub_irq_mask_w(uint8_t data);
|
||||
void tp84_spriteram_w(offs_t offset, uint8_t data);
|
||||
uint8_t tp84_scanline_r();
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_fg_tile_info);
|
||||
virtual void machine_start() override;
|
||||
virtual void video_start() override;
|
||||
void tp84_palette(palette_device &palette) const;
|
||||
uint32_t screen_update_tp84(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
|
||||
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
void audio_map(address_map &map);
|
||||
void cpu2_map(address_map &map);
|
||||
void tp84_cpu1_map(address_map &map);
|
||||
void tp84b_cpu1_map(address_map &map);
|
||||
};
|
||||
|
||||
#endif // MAME_INCLUDES_TP84
|
@ -1,200 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Aaron Giles
|
||||
/***************************************************************************
|
||||
|
||||
video.c
|
||||
|
||||
Functions to emulate the video hardware of the machine.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "video/resnet.h"
|
||||
#include "tp84.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
-The colortable is divided in 2 part:
|
||||
-The characters colors
|
||||
-The sprites colors
|
||||
|
||||
-The characters colors are indexed like this:
|
||||
-2 bits from the characters
|
||||
-4 bits from the attribute in tp84_bg_colorram
|
||||
-2 bits from palette_bank (d3-d4)
|
||||
-3 bits from palette_bank (d0-d1-d2)
|
||||
-So, there is 2048 bytes for the characters
|
||||
|
||||
-The sprites colors are indexed like this:
|
||||
-4 bits from the sprites (16 colors)
|
||||
-4 bits from the attribute of the sprites
|
||||
-3 bits from palette_bank (d0-d1-d2)
|
||||
-So, there is 2048 bytes for the sprites
|
||||
|
||||
*/
|
||||
/*
|
||||
The RGB signals are generated by 3 proms 256X4 (prom 2C, 2D and 1E)
|
||||
The resistors values are:
|
||||
1K ohm
|
||||
470 ohm
|
||||
220 ohm
|
||||
100 ohm
|
||||
*/
|
||||
void tp84_state::tp84_palette(palette_device &palette) const
|
||||
{
|
||||
const uint8_t *color_prom = memregion("proms")->base();
|
||||
static constexpr int resistances[4] = { 1000, 470, 220, 100 };
|
||||
|
||||
// compute the color output resistor weights
|
||||
double weights[4];
|
||||
compute_resistor_weights(0, 255, -1.0,
|
||||
4, resistances, weights, 470, 0,
|
||||
0, nullptr, nullptr, 0, 0,
|
||||
0, nullptr, nullptr, 0, 0);
|
||||
|
||||
// create a lookup table for the palette
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
{
|
||||
int bit0, bit1, bit2, bit3;
|
||||
|
||||
// red component
|
||||
bit0 = BIT(color_prom[i | 0x000], 0);
|
||||
bit1 = BIT(color_prom[i | 0x000], 1);
|
||||
bit2 = BIT(color_prom[i | 0x000], 2);
|
||||
bit3 = BIT(color_prom[i | 0x000], 3);
|
||||
int const r = combine_weights(weights, bit0, bit1, bit2, bit3);
|
||||
|
||||
// green component
|
||||
bit0 = BIT(color_prom[i | 0x100], 0);
|
||||
bit1 = BIT(color_prom[i | 0x100], 1);
|
||||
bit2 = BIT(color_prom[i | 0x100], 2);
|
||||
bit3 = BIT(color_prom[i | 0x100], 3);
|
||||
int const g = combine_weights(weights, bit0, bit1, bit2, bit3);
|
||||
|
||||
// blue component
|
||||
bit0 = BIT(color_prom[i | 0x200], 0);
|
||||
bit1 = BIT(color_prom[i | 0x200], 1);
|
||||
bit2 = BIT(color_prom[i | 0x200], 2);
|
||||
bit3 = BIT(color_prom[i | 0x200], 3);
|
||||
int const b = combine_weights(weights, bit0, bit1, bit2, bit3);
|
||||
|
||||
palette.set_indirect_color(i, rgb_t(r, g, b));
|
||||
}
|
||||
|
||||
// color_prom now points to the beginning of the lookup table
|
||||
color_prom += 0x300;
|
||||
|
||||
// characters use colors 0x80-0xff, sprites use colors 0-0x7f
|
||||
for (int i = 0; i < 0x200; i++)
|
||||
{
|
||||
for (int j = 0; j < 8; j++)
|
||||
{
|
||||
uint8_t const ctabentry = ((~i & 0x100) >> 1) | (j << 4) | (color_prom[i] & 0x0f);
|
||||
palette.set_pen_indirect(((i & 0x100) << 3) | (j << 8) | (i & 0xff), ctabentry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void tp84_state::tp84_spriteram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
/* the game multiplexes the sprites, so update now */
|
||||
// m_screen->update_now();
|
||||
m_screen->update_partial(m_screen->vpos());
|
||||
m_spriteram[offset] = data;
|
||||
}
|
||||
|
||||
|
||||
uint8_t tp84_state::tp84_scanline_r()
|
||||
{
|
||||
/* reads 1V - 128V */
|
||||
return m_screen->vpos();
|
||||
}
|
||||
|
||||
|
||||
TILE_GET_INFO_MEMBER(tp84_state::get_bg_tile_info)
|
||||
{
|
||||
int code = ((m_bg_colorram[tile_index] & 0x30) << 4) | m_bg_videoram[tile_index];
|
||||
int color = ((*m_palette_bank & 0x07) << 6) |
|
||||
((*m_palette_bank & 0x18) << 1) |
|
||||
(m_bg_colorram[tile_index] & 0x0f);
|
||||
int flags = TILE_FLIPYX(m_bg_colorram[tile_index] >> 6);
|
||||
|
||||
tileinfo.set(0, code, color, flags);
|
||||
}
|
||||
|
||||
TILE_GET_INFO_MEMBER(tp84_state::get_fg_tile_info)
|
||||
{
|
||||
int code = ((m_fg_colorram[tile_index] & 0x30) << 4) | m_fg_videoram[tile_index];
|
||||
int color = ((*m_palette_bank & 0x07) << 6) |
|
||||
((*m_palette_bank & 0x18) << 1) |
|
||||
(m_fg_colorram[tile_index] & 0x0f);
|
||||
int flags = TILE_FLIPYX(m_fg_colorram[tile_index] >> 6);
|
||||
|
||||
tileinfo.set(0, code, color, flags);
|
||||
}
|
||||
|
||||
|
||||
void tp84_state::video_start()
|
||||
{
|
||||
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(tp84_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(tp84_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
|
||||
}
|
||||
|
||||
|
||||
void tp84_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
int offs;
|
||||
int palette_base = ((*m_palette_bank & 0x07) << 4);
|
||||
|
||||
for (offs = 0x5c; offs >= 0; offs -= 4)
|
||||
{
|
||||
int x = m_spriteram[offs];
|
||||
int y = 240 - m_spriteram[offs + 3];
|
||||
|
||||
int code = m_spriteram[offs + 1];
|
||||
int color = palette_base | (m_spriteram[offs + 2] & 0x0f);
|
||||
int flip_x = ~m_spriteram[offs + 2] & 0x40;
|
||||
int flip_y = m_spriteram[offs + 2] & 0x80;
|
||||
|
||||
m_gfxdecode->gfx(1)->transmask(bitmap,cliprect, code, color, flip_x, flip_y, x, y,
|
||||
m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, palette_base));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint32_t tp84_state::screen_update_tp84(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
rectangle clip = cliprect;
|
||||
const rectangle &visarea = screen.visible_area();
|
||||
|
||||
if (cliprect.min_y == screen.visible_area().min_y)
|
||||
{
|
||||
machine().tilemap().mark_all_dirty();
|
||||
|
||||
m_bg_tilemap->set_scrollx(0, *m_scroll_x);
|
||||
m_bg_tilemap->set_scrolly(0, *m_scroll_y);
|
||||
|
||||
machine().tilemap().set_flip_all((m_flipscreen_x ? TILEMAP_FLIPX : 0) |
|
||||
(m_flipscreen_y ? TILEMAP_FLIPY : 0));
|
||||
}
|
||||
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
||||
draw_sprites(bitmap, cliprect);
|
||||
|
||||
/* draw top status region */
|
||||
clip.min_x = visarea.min_x;
|
||||
clip.max_x = visarea.min_x + 15;
|
||||
m_fg_tilemap->draw(screen, bitmap, clip, 0, 0);
|
||||
|
||||
/* draw bottom status region */
|
||||
clip.min_x = visarea.max_x - 15;
|
||||
clip.max_x = visarea.max_x;
|
||||
m_fg_tilemap->draw(screen, bitmap, clip, 0, 0);
|
||||
|
||||
return 0;
|
||||
}
|
@ -6,7 +6,7 @@ Winner's Club - Mighty 8 Liner
|
||||
|
||||
Many games in the series, only one dumped for now.
|
||||
|
||||
Winner's Wheel - Magical Spot (2000)
|
||||
Winner's Wheel - Magical Spot (2005)
|
||||
https://www.youtube.com/watch?v=k3REoIx7m-I
|
||||
|
||||
Hardware manufactured by Sammy
|
||||
@ -127,4 +127,4 @@ ROM_END
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
GAME( 2005, wwmspot, 0, winclub, winclub, winclub_state, empty_init, ROT0, "Sega", "Winner's Wheel - Magical Spot", MACHINE_IS_SKELETON ) // year taken for instructions on cabinet (see YouTube video)
|
||||
GAME( 2005, wwmspot, 0, winclub, winclub, winclub_state, empty_init, ROT0, "Sega", "Winner's Wheel - Magical Spot", MACHINE_IS_SKELETON ) // year taken from instructions on cabinet (see YouTube video)
|
||||
|
Loading…
Reference in New Issue
Block a user