konami/aliens.cpp, konami/battlnts.cpp, konami/finalizr.cpp, konami/gberet.cpp, konami/gyruss.cpp, konami/ironhors.cpp, konami/jailbrek.cpp: consolidated drivers in single files, minor cleanups

This commit is contained in:
Ivan Vangelista 2022-10-03 17:40:26 +02:00
parent 1ea1b48f17
commit c0a3a08328
21 changed files with 2230 additions and 2396 deletions

View File

@ -1,8 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:Manuel Abadia
// copyright-holders: Manuel Abadia
/***************************************************************************
Aliens (c) 1990 Konami Co. Ltd
GX875 PCB
Preliminary driver by:
Manuel Abadia <emumanu+mame@gmail.com>
@ -10,53 +12,164 @@ Preliminary driver by:
***************************************************************************/
#include "emu.h"
#include "aliens.h"
#include "k051960.h"
#include "k052109.h"
#include "konamipt.h"
#include "cpu/m6809/konami.h" // for the callback and the firq irq definition
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "machine/watchdog.h"
#include "sound/k007232.h"
#include "sound/ymopm.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
void aliens_state::aliens_coin_counter_w(uint8_t data)
namespace {
class aliens_state : public driver_device
{
/* bits 0-1 = coin counters */
public:
aliens_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_soundlatch(*this, "soundlatch"),
m_paletteram_view(*this, "paletteram_view"),
m_rombank(*this, "rombank")
{ }
void aliens(machine_config &config);
protected:
virtual void machine_start() override;
private:
// devices
required_device<konami_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_device<generic_latch_8_device> m_soundlatch;
memory_view m_paletteram_view;
required_memory_bank m_rombank;
void coin_counter_w(uint8_t data);
uint8_t k052109_051960_r(offs_t offset);
void k052109_051960_w(offs_t offset, uint8_t data);
void snd_bankswitch_w(uint8_t data);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void volume_callback(uint8_t data);
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(aliens_state::tile_callback)
{
*code |= ((*color & 0x3f) << 8) | (bank << 14);
*color = layer * 4 + ((*color & 0xc0) >> 6);
}
/***************************************************************************
Callbacks for the K051960
***************************************************************************/
K051960_CB_MEMBER(aliens_state::sprite_callback)
{
enum { sprite_colorbase = 256 / 16 };
/* The PROM allows for mixed priorities, where sprites would have
priority over text but not on one or both of the other two planes. */
switch (*color & 0x70)
{
case 0x10: *priority = 0x00; break; // over ABF
case 0x00: *priority = GFX_PMASK_4; break; // over AB, not F
case 0x40: *priority = GFX_PMASK_4 | GFX_PMASK_2; break; // over A, not BF
case 0x20:
case 0x60: *priority = GFX_PMASK_4 | GFX_PMASK_2 | GFX_PMASK_1; break; // over -, not ABF
case 0x50: *priority = GFX_PMASK_2; break; // over AF, not B
case 0x30:
case 0x70: *priority = GFX_PMASK_2 | GFX_PMASK_1; break; // over F, not AB
}
*code |= (*color & 0x80) << 6;
*color = sprite_colorbase + (*color & 0x0f);
*shadow = 0; // shadows are not used by this game
}
/***************************************************************************
Display refresh
***************************************************************************/
uint32_t aliens_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_k052109->tilemap_update();
screen.priority().fill(0, cliprect);
// The background color is always from layer 1
m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 0);
m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, 0, 1);
m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 0, 2);
m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 4);
m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), -1, -1);
return 0;
}
// machine
void aliens_state::coin_counter_w(uint8_t data)
{
// bits 0-1 = coin counters
machine().bookkeeping().coin_counter_w(0, data & 0x01);
machine().bookkeeping().coin_counter_w(1, data & 0x02);
/* bit 5 = select work RAM or palette */
m_bank0000->set_bank((data & 0x20) >> 5);
// bit 5 = select work RAM or palette
m_paletteram_view.select((data & 0x20) >> 5);
/* 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);
/* other bits unknown */
#if 0
{
char baf[40];
sprintf(baf, "%02x", data);
popmessage(baf);
}
#endif
// other bits unknown
}
void aliens_state::aliens_sh_irqtrigger_w(uint8_t data)
void aliens_state::snd_bankswitch_w(uint8_t data)
{
m_soundlatch->write(data);
m_audiocpu->set_input_line(0, HOLD_LINE);
}
// b1: bank for channel A
// b0: bank for channel B
void aliens_state::aliens_snd_bankswitch_w(uint8_t data)
{
/* b1: bank for chanel A */
/* b0: bank for chanel B */
int const bank_a = BIT(data, 1);
int const bank_b = BIT(data, 0);
int bank_A = BIT(data, 1);
int bank_B = BIT(data, 0);
m_k007232->set_bank(bank_A, bank_B);
m_k007232->set_bank(bank_a, bank_b);
}
@ -85,34 +198,30 @@ void aliens_state::k052109_051960_w(offs_t offset, uint8_t data)
m_k051960->k051960_w(offset - 0x3c00, data);
}
void aliens_state::aliens_map(address_map &map)
void aliens_state::main_map(address_map &map)
{
map(0x0000, 0x03ff).m(m_bank0000, FUNC(address_map_bank_device::amap8));
map(0x0000, 0x03ff).view(m_paletteram_view);
m_paletteram_view[0](0x0000, 0x03ff).ram();
m_paletteram_view[1](0x0000, 0x03ff).ram().w("palette", FUNC(palette_device::write8)).share("palette");
map(0x0400, 0x1fff).ram();
map(0x2000, 0x3fff).bankr("rombank"); /* banked ROM */
map(0x2000, 0x3fff).bankr(m_rombank);
map(0x4000, 0x7fff).rw(FUNC(aliens_state::k052109_051960_r), FUNC(aliens_state::k052109_051960_w));
map(0x5f80, 0x5f80).portr("DSW3");
map(0x5f81, 0x5f81).portr("P1");
map(0x5f82, 0x5f82).portr("P2");
map(0x5f83, 0x5f83).portr("DSW2");
map(0x5f84, 0x5f84).portr("DSW1");
map(0x5f88, 0x5f88).r("watchdog", FUNC(watchdog_timer_device::reset_r)).w(FUNC(aliens_state::aliens_coin_counter_w)); /* coin counters */
map(0x5f8c, 0x5f8c).w(FUNC(aliens_state::aliens_sh_irqtrigger_w)); /* cause interrupt on audio CPU */
map(0x8000, 0xffff).rom().region("maincpu", 0x28000); /* ROM e24_j02.bin */
map(0x5f88, 0x5f88).r("watchdog", FUNC(watchdog_timer_device::reset_r)).w(FUNC(aliens_state::coin_counter_w));
map(0x5f8c, 0x5f8c).w("soundlatch", FUNC(generic_latch_8_device::write)); // cause interrupt on audio CPU
map(0x8000, 0xffff).rom().region("maincpu", 0x28000); // ROM e24_j02.bin
}
void aliens_state::bank0000_map(address_map &map)
void aliens_state::sound_map(address_map &map)
{
map(0x0000, 0x03ff).ram();
map(0x0400, 0x07ff).ram().w("palette", FUNC(palette_device::write8)).share("palette");
}
void aliens_state::aliens_sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom(); /* ROM g04_b03.bin */
map(0x8000, 0x87ff).ram(); /* RAM */
map(0x0000, 0x7fff).rom(); // ROM g04_b03.bin
map(0x8000, 0x87ff).ram();
map(0xa000, 0xa001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
map(0xc000, 0xc000).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0xc000, 0xc000).r("soundlatch", FUNC(generic_latch_8_device::read));
map(0xe000, 0xe00d).rw(m_k007232, FUNC(k007232_device::read), FUNC(k007232_device::write));
}
@ -126,7 +235,7 @@ void aliens_state::aliens_sound_map(address_map &map)
static INPUT_PORTS_START( aliens )
PORT_START("DSW1")
KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Credits", SW1)
/* "No Credits" = both coin slots open, but no effect on coin counters */
// "No Credits" = both coin slots open, but no effect on coin counters
PORT_START("DSW2")
PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
@ -134,9 +243,9 @@ static INPUT_PORTS_START( aliens )
PORT_DIPSETTING( 0x02, "2" )
PORT_DIPSETTING( 0x01, "3" )
PORT_DIPSETTING( 0x00, "5" )
PORT_DIPUNUSED_DIPLOC( 0x0004, 0x0004, "SW2:3" ) /* Listed as "Unused" */
PORT_DIPUNUSED_DIPLOC( 0x0008, 0x0008, "SW2:4" ) /* Listed as "Unused" */
PORT_DIPUNUSED_DIPLOC( 0x0010, 0x0010, "SW2:5" ) /* Listed as "Unused" */
PORT_DIPUNUSED_DIPLOC( 0x0004, 0x0004, "SW2:3" ) // Listed as "Unused"
PORT_DIPUNUSED_DIPLOC( 0x0008, 0x0008, "SW2:4" ) // Listed as "Unused"
PORT_DIPUNUSED_DIPLOC( 0x0010, 0x0010, "SW2:5" ) // Listed as "Unused"
PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7")
PORT_DIPSETTING( 0x60, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x40, DEF_STR( Normal ) )
@ -150,9 +259,9 @@ static INPUT_PORTS_START( aliens )
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( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
@ -184,36 +293,24 @@ void aliens_state::machine_start()
m_rombank->set_entry(0);
}
void aliens_state::machine_reset()
{
m_bank0000->set_bank(0);
}
void aliens_state::banking_callback(uint8_t data)
{
m_rombank->set_entry(data & 0x1f);
}
void aliens_state::aliens(machine_config &config)
{
/* basic machine hardware */
KONAMI(config, m_maincpu, XTAL(24'000'000)/2/4); /* 052001 (verified on pcb) */
m_maincpu->set_addrmap(AS_PROGRAM, &aliens_state::aliens_map);
m_maincpu->line().set(FUNC(aliens_state::banking_callback));
// basic machine hardware
KONAMI(config, m_maincpu, XTAL(24'000'000) / 2 / 4); // 052001 (verified on PCB)
m_maincpu->set_addrmap(AS_PROGRAM, &aliens_state::main_map);
m_maincpu->line().set_membank(m_rombank).mask(0x1f);
Z80(config, m_audiocpu, XTAL(3'579'545)); /* verified on pcb */
m_audiocpu->set_addrmap(AS_PROGRAM, &aliens_state::aliens_sound_map);
ADDRESS_MAP_BANK(config, "bank0000").set_map(&aliens_state::bank0000_map).set_options(ENDIANNESS_BIG, 8, 11, 0x400);
Z80(config, m_audiocpu, XTAL(3'579'545)); // verified on PCB
m_audiocpu->set_addrmap(AS_PROGRAM, &aliens_state::sound_map);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_raw(XTAL(24'000'000)/3, 528, 112, 400, 256, 16, 240); // measured 59.17
screen.set_raw(XTAL(24'000'000) / 3, 528, 112, 400, 256, 16, 240); // measured 59.17
// 6MHz dotclock is more realistic, however needs drawing updates. replace when ready
// screen.set_raw(XTAL(24'000'000)/4, 396, hbend, hbstart, 256, 16, 240);
screen.set_screen_update(FUNC(aliens_state::screen_update_aliens));
// screen.set_raw(XTAL(24'000'000) / 4, 396, hbend, hbstart, 256, 16, 240);
screen.set_screen_update(FUNC(aliens_state::screen_update));
screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 512).enable_shadows();
@ -229,17 +326,17 @@ void aliens_state::aliens(machine_config &config)
m_k051960->set_sprite_callback(FUNC(aliens_state::sprite_callback));
m_k051960->irq_handler().set_inputline(m_maincpu, KONAMI_IRQ_LINE);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, 0);
ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(3'579'545))); /* verified on pcb */
ymsnd.port_write_handler().set(FUNC(aliens_state::aliens_snd_bankswitch_w));
ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(3'579'545))); // verified on PCB
ymsnd.port_write_handler().set(FUNC(aliens_state::snd_bankswitch_w));
ymsnd.add_route(0, "mono", 0.60);
ymsnd.add_route(1, "mono", 0.60);
K007232(config, m_k007232, XTAL(3'579'545)); /* verified on pcb */
K007232(config, m_k007232, XTAL(3'579'545)); // verified on PCB
m_k007232->port_write().set(FUNC(aliens_state::volume_callback));
m_k007232->add_route(0, "mono", 0.20);
m_k007232->add_route(1, "mono", 0.20);
@ -253,254 +350,257 @@ void aliens_state::aliens(machine_config &config)
***************************************************************************/
ROM_START( aliens )
ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms */
ROM_REGION( 0x30000, "maincpu", 0 )
ROM_LOAD( "875_j01.c24", 0x00000, 0x20000, CRC(6a529cd6) SHA1(bff6dee33141d8ed2b2c28813cf49f52dceac364) )
ROM_LOAD( "875_j02.e24", 0x20000, 0x10000, CRC(56c20971) SHA1(af272e146705e97342466a208c64d823ebc83d83) )
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "875_b03.g04", 0x00000, 0x08000, CRC(1ac4d283) SHA1(2253f1f39c7edb6cef438b3d97f3af67a1f491ff) )
ROM_REGION( 0x200000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x200000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "875b11.k13", 0x000000, 0x80000, CRC(89c5c885) SHA1(02a1581579b6ef816e04bec312a7b3ae7c7e84f8) )
ROM_LOAD32_WORD( "875b12.k19", 0x000002, 0x80000, CRC(ea6bdc17) SHA1(a7c22370f8adc5b479283f1ff831f493df78282f) )
ROM_LOAD32_WORD( "875b07.j13", 0x100000, 0x40000, CRC(e9c56d66) SHA1(1f58949d5391aef002a6e1ee7034e57bf99cee61) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b08.j19", 0x100002, 0x40000, CRC(f9387966) SHA1(470ecc4a5a3edd08d5e0ab10b0c590db1968fb0a) )
/* second half empty */
// second half empty
ROM_REGION( 0x200000, "k051960", 0 ) /* sprites */
ROM_REGION( 0x200000, "k051960", 0 ) // sprites
ROM_LOAD32_WORD( "875b10.k08", 0x000000, 0x80000, CRC(0b1035b1) SHA1(db04020761386e79249762cd1540208375c38c7f) )
ROM_LOAD32_WORD( "875b09.k02", 0x000002, 0x80000, CRC(e76b3c19) SHA1(6838e07460b3eaaeb129208ad0696c8019bd63d9) )
ROM_LOAD32_WORD( "875b06.j08", 0x100000, 0x40000, CRC(081a0566) SHA1(3a4aa14178fe76a030224743c9e9cd974e08bd79) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b05.j02", 0x100002, 0x40000, CRC(19a261f2) SHA1(b0518fad833b3e613e0201d5d9cab73dc5e78e1d) )
/* second half empty */
// second half empty
ROM_REGION( 0x0100, "proms", 0 )
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) /* priority encoder (not used) */
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) // priority encoder (not used)
ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
ROM_REGION( 0x40000, "k007232", 0 ) // samples
ROM_LOAD( "875b04.e05", 0x00000, 0x40000, CRC(4e209ac8) SHA1(09d9eaae61bfd04bf318555ccd44d7371571d86d) )
ROM_END
ROM_START( aliens2 )
ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms */
ROM_REGION( 0x30000, "maincpu", 0 )
ROM_LOAD( "875_n01.c24", 0x00000, 0x20000, CRC(106cf59c) SHA1(78622adc02055d31cd587c83b23a6cde30c9bc22) )
ROM_LOAD( "875_p02.e24", 0x20000, 0x10000, CRC(4edd707d) SHA1(02b39068e5fd99ecb5b35a586335b65a20fde490) )
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "875_b03.g04", 0x00000, 0x08000, CRC(1ac4d283) SHA1(2253f1f39c7edb6cef438b3d97f3af67a1f491ff) )
ROM_REGION( 0x200000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x200000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "875b11.k13", 0x000000, 0x80000, CRC(89c5c885) SHA1(02a1581579b6ef816e04bec312a7b3ae7c7e84f8) )
ROM_LOAD32_WORD( "875b12.k19", 0x000002, 0x80000, CRC(ea6bdc17) SHA1(a7c22370f8adc5b479283f1ff831f493df78282f) )
ROM_LOAD32_WORD( "875b07.j13", 0x100000, 0x40000, CRC(e9c56d66) SHA1(1f58949d5391aef002a6e1ee7034e57bf99cee61) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b08.j19", 0x100002, 0x40000, CRC(f9387966) SHA1(470ecc4a5a3edd08d5e0ab10b0c590db1968fb0a) )
/* second half empty */
// second half empty
ROM_REGION( 0x200000, "k051960", 0 ) /* sprites */
ROM_REGION( 0x200000, "k051960", 0 ) // sprites
ROM_LOAD32_WORD( "875b10.k08", 0x000000, 0x80000, CRC(0b1035b1) SHA1(db04020761386e79249762cd1540208375c38c7f) )
ROM_LOAD32_WORD( "875b09.k02", 0x000002, 0x80000, CRC(e76b3c19) SHA1(6838e07460b3eaaeb129208ad0696c8019bd63d9) )
ROM_LOAD32_WORD( "875b06.j08", 0x100000, 0x40000, CRC(081a0566) SHA1(3a4aa14178fe76a030224743c9e9cd974e08bd79) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b05.j02", 0x100002, 0x40000, CRC(19a261f2) SHA1(b0518fad833b3e613e0201d5d9cab73dc5e78e1d) )
/* second half empty */
// second half empty
ROM_REGION( 0x0100, "proms", 0 )
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) /* priority encoder (not used) */
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) // priority encoder (not used)
ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
ROM_REGION( 0x40000, "k007232", 0 ) // samples
ROM_LOAD( "875b04.e05", 0x00000, 0x40000, CRC(4e209ac8) SHA1(09d9eaae61bfd04bf318555ccd44d7371571d86d) )
ROM_END
ROM_START( aliens3 )
ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms */
ROM_REGION( 0x30000, "maincpu", 0 )
ROM_LOAD( "875_c01.c24", 0x00000, 0x20000, CRC(3c0006fb) SHA1(e8730d50c358e7321dd676c74368fe44b9bbe5b2) )
ROM_LOAD( "875_w3_2.e24", 0x20000, 0x10000, CRC(f917f7b5) SHA1(ab95ad40c82f11572bbaa03d76dae35f76bacf0c) ) /* Needs correct rom label */
ROM_LOAD( "875_w3_2.e24", 0x20000, 0x10000, CRC(f917f7b5) SHA1(ab95ad40c82f11572bbaa03d76dae35f76bacf0c) ) // Needs correct ROM label
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "875_b03.g04", 0x00000, 0x08000, CRC(1ac4d283) SHA1(2253f1f39c7edb6cef438b3d97f3af67a1f491ff) )
ROM_REGION( 0x200000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x200000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "875b11.k13", 0x000000, 0x80000, CRC(89c5c885) SHA1(02a1581579b6ef816e04bec312a7b3ae7c7e84f8) )
ROM_LOAD32_WORD( "875b12.k19", 0x000002, 0x80000, CRC(ea6bdc17) SHA1(a7c22370f8adc5b479283f1ff831f493df78282f) )
ROM_LOAD32_WORD( "875b07.j13", 0x100000, 0x40000, CRC(e9c56d66) SHA1(1f58949d5391aef002a6e1ee7034e57bf99cee61) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b08.j19", 0x100002, 0x40000, CRC(f9387966) SHA1(470ecc4a5a3edd08d5e0ab10b0c590db1968fb0a) )
/* second half empty */
// second half empty
ROM_REGION( 0x200000, "k051960", 0 ) /* sprites */
ROM_REGION( 0x200000, "k051960", 0 ) // sprites
ROM_LOAD32_WORD( "875b10.k08", 0x000000, 0x80000, CRC(0b1035b1) SHA1(db04020761386e79249762cd1540208375c38c7f) )
ROM_LOAD32_WORD( "875b09.k02", 0x000002, 0x80000, CRC(e76b3c19) SHA1(6838e07460b3eaaeb129208ad0696c8019bd63d9) )
ROM_LOAD32_WORD( "875b06.j08", 0x100000, 0x40000, CRC(081a0566) SHA1(3a4aa14178fe76a030224743c9e9cd974e08bd79) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b05.j02", 0x100002, 0x40000, CRC(19a261f2) SHA1(b0518fad833b3e613e0201d5d9cab73dc5e78e1d) )
/* second half empty */
// second half empty
ROM_REGION( 0x0100, "proms", 0 )
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) /* priority encoder (not used) */
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) // priority encoder (not used)
ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
ROM_REGION( 0x40000, "k007232", 0 ) // samples
ROM_LOAD( "875b04.e05", 0x00000, 0x40000, CRC(4e209ac8) SHA1(09d9eaae61bfd04bf318555ccd44d7371571d86d) )
ROM_END
ROM_START( aliens4 )
ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms */
ROM_REGION( 0x30000, "maincpu", 0 )
ROM_LOAD( "875_c01.c24", 0x00000, 0x20000, CRC(3c0006fb) SHA1(e8730d50c358e7321dd676c74368fe44b9bbe5b2) )
ROM_LOAD( "875_d02.e24", 0x20000, 0x10000, CRC(1dc46780) SHA1(85dbd7c0fe5bfbf22274d9b4238588a2c48c535e) )
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "875_b03.g04", 0x00000, 0x08000, CRC(1ac4d283) SHA1(2253f1f39c7edb6cef438b3d97f3af67a1f491ff) )
ROM_REGION( 0x200000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x200000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "875b11.k13", 0x000000, 0x80000, CRC(89c5c885) SHA1(02a1581579b6ef816e04bec312a7b3ae7c7e84f8) )
ROM_LOAD32_WORD( "875b12.k19", 0x000002, 0x80000, CRC(ea6bdc17) SHA1(a7c22370f8adc5b479283f1ff831f493df78282f) )
ROM_LOAD32_WORD( "875b07.j13", 0x100000, 0x40000, CRC(e9c56d66) SHA1(1f58949d5391aef002a6e1ee7034e57bf99cee61) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b08.j19", 0x100002, 0x40000, CRC(f9387966) SHA1(470ecc4a5a3edd08d5e0ab10b0c590db1968fb0a) )
/* second half empty */
// second half empty
ROM_REGION( 0x200000, "k051960", 0 ) /* sprites */
ROM_REGION( 0x200000, "k051960", 0 ) // sprites
ROM_LOAD32_WORD( "875b10.k08", 0x000000, 0x80000, CRC(0b1035b1) SHA1(db04020761386e79249762cd1540208375c38c7f) )
ROM_LOAD32_WORD( "875b09.k02", 0x000002, 0x80000, CRC(e76b3c19) SHA1(6838e07460b3eaaeb129208ad0696c8019bd63d9) )
ROM_LOAD32_WORD( "875b06.j08", 0x100000, 0x40000, CRC(081a0566) SHA1(3a4aa14178fe76a030224743c9e9cd974e08bd79) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b05.j02", 0x100002, 0x40000, CRC(19a261f2) SHA1(b0518fad833b3e613e0201d5d9cab73dc5e78e1d) )
/* second half empty */
// second half empty
ROM_REGION( 0x0100, "proms", 0 )
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) /* priority encoder (not used) */
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) // priority encoder (not used)
ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
ROM_REGION( 0x40000, "k007232", 0 ) // samples
ROM_LOAD( "875b04.e05", 0x00000, 0x40000, CRC(4e209ac8) SHA1(09d9eaae61bfd04bf318555ccd44d7371571d86d) )
ROM_END
ROM_START( aliensu )
ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms */
ROM_REGION( 0x30000, "maincpu", 0 )
ROM_LOAD( "875_n01.c24", 0x00000, 0x20000, CRC(106cf59c) SHA1(78622adc02055d31cd587c83b23a6cde30c9bc22) )
ROM_LOAD( "875_n02.e24", 0x20000, 0x10000, CRC(24dd612e) SHA1(35bceb3045cd0bd9d107312b371fb60dcf3f1272) )
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "875_b03.g04", 0x00000, 0x08000, CRC(1ac4d283) SHA1(2253f1f39c7edb6cef438b3d97f3af67a1f491ff) )
ROM_REGION( 0x200000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x200000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "875b11.k13", 0x000000, 0x80000, CRC(89c5c885) SHA1(02a1581579b6ef816e04bec312a7b3ae7c7e84f8) )
ROM_LOAD32_WORD( "875b12.k19", 0x000002, 0x80000, CRC(ea6bdc17) SHA1(a7c22370f8adc5b479283f1ff831f493df78282f) )
ROM_LOAD32_WORD( "875b07.j13", 0x100000, 0x40000, CRC(e9c56d66) SHA1(1f58949d5391aef002a6e1ee7034e57bf99cee61) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b08.j19", 0x100002, 0x40000, CRC(f9387966) SHA1(470ecc4a5a3edd08d5e0ab10b0c590db1968fb0a) )
/* second half empty */
// second half empty
ROM_REGION( 0x200000, "k051960", 0 ) /* sprites */
ROM_REGION( 0x200000, "k051960", 0 ) // sprites
ROM_LOAD32_WORD( "875b10.k08", 0x000000, 0x80000, CRC(0b1035b1) SHA1(db04020761386e79249762cd1540208375c38c7f) )
ROM_LOAD32_WORD( "875b09.k02", 0x000002, 0x80000, CRC(e76b3c19) SHA1(6838e07460b3eaaeb129208ad0696c8019bd63d9) )
ROM_LOAD32_WORD( "875b06.j08", 0x100000, 0x40000, CRC(081a0566) SHA1(3a4aa14178fe76a030224743c9e9cd974e08bd79) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b05.j02", 0x100002, 0x40000, CRC(19a261f2) SHA1(b0518fad833b3e613e0201d5d9cab73dc5e78e1d) )
/* second half empty */
// second half empty
ROM_REGION( 0x0100, "proms", 0 )
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) /* priority encoder (not used) */
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) // priority encoder (not used)
ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
ROM_REGION( 0x40000, "k007232", 0 ) // samples
ROM_LOAD( "875b04.e05", 0x00000, 0x40000, CRC(4e209ac8) SHA1(09d9eaae61bfd04bf318555ccd44d7371571d86d) )
ROM_END
ROM_START( aliensj )
ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms */
ROM_REGION( 0x30000, "maincpu", 0 )
ROM_LOAD( "875_m01.c24", 0x00000, 0x20000, CRC(1663d3dc) SHA1(706bdf3daa3bda372d94263f3405d67a7ef8dc69) )
ROM_LOAD( "875_m02.e24", 0x20000, 0x10000, CRC(54a774e5) SHA1(b6413b2199f863cae1c6fcef766989162cd4b95e) )
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "875_k03.g04", 0x00000, 0x08000, CRC(bd86264d) SHA1(345fd666daf8a29ef314b14306c1a976cb159bed) )
ROM_REGION( 0x200000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x200000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "875b11.k13", 0x000000, 0x80000, CRC(89c5c885) SHA1(02a1581579b6ef816e04bec312a7b3ae7c7e84f8) )
ROM_LOAD32_WORD( "875b12.k19", 0x000002, 0x80000, CRC(ea6bdc17) SHA1(a7c22370f8adc5b479283f1ff831f493df78282f) )
ROM_LOAD32_WORD( "875b07.j13", 0x100000, 0x40000, CRC(e9c56d66) SHA1(1f58949d5391aef002a6e1ee7034e57bf99cee61) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b08.j19", 0x100002, 0x40000, CRC(f9387966) SHA1(470ecc4a5a3edd08d5e0ab10b0c590db1968fb0a) )
/* second half empty */
// second half empty
ROM_REGION( 0x200000, "k051960", 0 ) /* sprites */
ROM_REGION( 0x200000, "k051960", 0 ) // sprites
ROM_LOAD32_WORD( "875b10.k08", 0x000000, 0x80000, CRC(0b1035b1) SHA1(db04020761386e79249762cd1540208375c38c7f) )
ROM_LOAD32_WORD( "875b09.k02", 0x000002, 0x80000, CRC(e76b3c19) SHA1(6838e07460b3eaaeb129208ad0696c8019bd63d9) )
ROM_LOAD32_WORD( "875b06.j08", 0x100000, 0x40000, CRC(081a0566) SHA1(3a4aa14178fe76a030224743c9e9cd974e08bd79) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b05.j02", 0x100002, 0x40000, CRC(19a261f2) SHA1(b0518fad833b3e613e0201d5d9cab73dc5e78e1d) )
/* second half empty */
// second half empty
ROM_REGION( 0x0100, "proms", 0 )
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) /* priority encoder (not used) */
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) // priority encoder (not used)
ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
ROM_REGION( 0x40000, "k007232", 0 ) // samples
ROM_LOAD( "875b04.e05", 0x00000, 0x40000, CRC(4e209ac8) SHA1(09d9eaae61bfd04bf318555ccd44d7371571d86d) )
ROM_END
ROM_START( aliensj2 )
ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms */
ROM_REGION( 0x30000, "maincpu", 0 )
ROM_LOAD( "875_m01.c24", 0x00000, 0x20000, CRC(1663d3dc) SHA1(706bdf3daa3bda372d94263f3405d67a7ef8dc69) )
ROM_LOAD( "875_j2_2.e24", 0x20000, 0x10000, CRC(4bb84952) SHA1(ca40a7181f11d6c34c26b65f8d4a1d1df2c7fb48) ) /* Needs correct rom label */
ROM_LOAD( "875_j2_2.e24", 0x20000, 0x10000, CRC(4bb84952) SHA1(ca40a7181f11d6c34c26b65f8d4a1d1df2c7fb48) ) // Needs correct ROM label
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "875_k03.g04", 0x00000, 0x08000, CRC(bd86264d) SHA1(345fd666daf8a29ef314b14306c1a976cb159bed) )
ROM_REGION( 0x200000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x200000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "875b11.k13", 0x000000, 0x80000, CRC(89c5c885) SHA1(02a1581579b6ef816e04bec312a7b3ae7c7e84f8) )
ROM_LOAD32_WORD( "875b12.k19", 0x000002, 0x80000, CRC(ea6bdc17) SHA1(a7c22370f8adc5b479283f1ff831f493df78282f) )
ROM_LOAD32_WORD( "875b07.j13", 0x100000, 0x40000, CRC(e9c56d66) SHA1(1f58949d5391aef002a6e1ee7034e57bf99cee61) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b08.j19", 0x100002, 0x40000, CRC(f9387966) SHA1(470ecc4a5a3edd08d5e0ab10b0c590db1968fb0a) )
/* second half empty */
// second half empty
ROM_REGION( 0x200000, "k051960", 0 ) /* sprites */
ROM_REGION( 0x200000, "k051960", 0 ) // sprites
ROM_LOAD32_WORD( "875b10.k08", 0x000000, 0x80000, CRC(0b1035b1) SHA1(db04020761386e79249762cd1540208375c38c7f) )
ROM_LOAD32_WORD( "875b09.k02", 0x000002, 0x80000, CRC(e76b3c19) SHA1(6838e07460b3eaaeb129208ad0696c8019bd63d9) )
ROM_LOAD32_WORD( "875b06.j08", 0x100000, 0x40000, CRC(081a0566) SHA1(3a4aa14178fe76a030224743c9e9cd974e08bd79) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b05.j02", 0x100002, 0x40000, CRC(19a261f2) SHA1(b0518fad833b3e613e0201d5d9cab73dc5e78e1d) )
/* second half empty */
// second half empty
ROM_REGION( 0x0100, "proms", 0 )
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) /* priority encoder (not used) */
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) // priority encoder (not used)
ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
ROM_REGION( 0x40000, "k007232", 0 ) // samples
ROM_LOAD( "875b04.e05", 0x00000, 0x40000, CRC(4e209ac8) SHA1(09d9eaae61bfd04bf318555ccd44d7371571d86d) )
ROM_END
ROM_START( aliensa )
ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms */
ROM_REGION( 0x30000, "maincpu", 0 )
ROM_LOAD( "875_m01.c24", 0x00000, 0x20000, CRC(1663d3dc) SHA1(706bdf3daa3bda372d94263f3405d67a7ef8dc69) )
ROM_LOAD( "875_r02.e24", 0x20000, 0x10000, CRC(973e4f11) SHA1(a4f65ef4c84b1dcac591dc348ebbb96d35ef5f93) )
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "875_k03.g04", 0x00000, 0x08000, CRC(bd86264d) SHA1(345fd666daf8a29ef314b14306c1a976cb159bed) )
ROM_REGION( 0x200000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x200000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "875b11.k13", 0x000000, 0x80000, CRC(89c5c885) SHA1(02a1581579b6ef816e04bec312a7b3ae7c7e84f8) )
ROM_LOAD32_WORD( "875b12.k19", 0x000002, 0x80000, CRC(ea6bdc17) SHA1(a7c22370f8adc5b479283f1ff831f493df78282f) )
ROM_LOAD32_WORD( "875b07.j13", 0x100000, 0x40000, CRC(e9c56d66) SHA1(1f58949d5391aef002a6e1ee7034e57bf99cee61) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b08.j19", 0x100002, 0x40000, CRC(f9387966) SHA1(470ecc4a5a3edd08d5e0ab10b0c590db1968fb0a) )
/* second half empty */
// second half empty
ROM_REGION( 0x200000, "k051960", 0 ) /* sprites */
ROM_REGION( 0x200000, "k051960", 0 ) // sprites
ROM_LOAD32_WORD( "875b10.k08", 0x000000, 0x80000, CRC(0b1035b1) SHA1(db04020761386e79249762cd1540208375c38c7f) )
ROM_LOAD32_WORD( "875b09.k02", 0x000002, 0x80000, CRC(e76b3c19) SHA1(6838e07460b3eaaeb129208ad0696c8019bd63d9) )
ROM_LOAD32_WORD( "875b06.j08", 0x100000, 0x40000, CRC(081a0566) SHA1(3a4aa14178fe76a030224743c9e9cd974e08bd79) )
/* second half empty */
// second half empty
ROM_LOAD32_WORD( "875b05.j02", 0x100002, 0x40000, CRC(19a261f2) SHA1(b0518fad833b3e613e0201d5d9cab73dc5e78e1d) )
/* second half empty */
// second half empty
ROM_REGION( 0x0100, "proms", 0 )
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) /* priority encoder (not used) */
ROM_LOAD( "821a08.h14", 0x0000, 0x0100, CRC(7da55800) SHA1(3826f73569c8ae0431510a355bdfa082152b74a5) ) // priority encoder (not used)
ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */
ROM_REGION( 0x40000, "k007232", 0 ) // samples
ROM_LOAD( "875b04.e05", 0x00000, 0x40000, CRC(4e209ac8) SHA1(09d9eaae61bfd04bf318555ccd44d7371571d86d) )
ROM_END
} // anonymous namespace
/***************************************************************************
Game driver(s)

View File

@ -1,63 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Manuel Abadia
/*************************************************************************
Aliens
*************************************************************************/
#ifndef MAME_INCLUDES_ALIENS_H
#define MAME_INCLUDES_ALIENS_H
#pragma once
#include "cpu/m6809/konami.h" /* for the callback and the firq irq definition */
#include "machine/bankdev.h"
#include "machine/gen_latch.h"
#include "sound/k007232.h"
#include "k051960.h"
#include "k052109.h"
class aliens_state : public driver_device
{
public:
aliens_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_bank0000(*this, "bank0000"),
m_k007232(*this, "k007232"),
m_k052109(*this, "k052109"),
m_k051960(*this, "k051960"),
m_soundlatch(*this, "soundlatch"),
m_rombank(*this, "rombank")
{ }
/* devices */
required_device<konami_cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<address_map_bank_device> m_bank0000;
required_device<k007232_device> m_k007232;
required_device<k052109_device> m_k052109;
required_device<k051960_device> m_k051960;
required_device<generic_latch_8_device> m_soundlatch;
required_memory_bank m_rombank;
void aliens_coin_counter_w(uint8_t data);
void aliens_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 aliens_snd_bankswitch_w(uint8_t data);
virtual void machine_start() override;
virtual void machine_reset() override;
uint32_t screen_update_aliens(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void volume_callback(uint8_t data);
K052109_CB_MEMBER(tile_callback);
K051960_CB_MEMBER(sprite_callback);
void banking_callback(uint8_t data);
void aliens(machine_config &config);
void aliens_map(address_map &map);
void aliens_sound_map(address_map &map);
void bank0000_map(address_map &map);
};
#endif // MAME_INCLUDES_ALIENS_H

View File

@ -1,70 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Manuel Abadia
#include "emu.h"
#include "aliens.h"
#include "screen.h"
/***************************************************************************
Callbacks for the K052109
***************************************************************************/
K052109_CB_MEMBER(aliens_state::tile_callback)
{
*code |= ((*color & 0x3f) << 8) | (bank << 14);
*color = layer * 4 + ((*color & 0xc0) >> 6);
}
/***************************************************************************
Callbacks for the K051960
***************************************************************************/
K051960_CB_MEMBER(aliens_state::sprite_callback)
{
enum { sprite_colorbase = 256 / 16 };
/* The PROM allows for mixed priorities, where sprites would have */
/* priority over text but not on one or both of the other two planes. */
switch (*color & 0x70)
{
case 0x10: *priority = 0x00; break; /* over ABF */
case 0x00: *priority = GFX_PMASK_4 ; break; /* over AB, not F */
case 0x40: *priority = GFX_PMASK_4|GFX_PMASK_2 ; break; /* over A, not BF */
case 0x20:
case 0x60: *priority = GFX_PMASK_4|GFX_PMASK_2|GFX_PMASK_1; break; /* over -, not ABF */
case 0x50: *priority = GFX_PMASK_2 ; break; /* over AF, not B */
case 0x30:
case 0x70: *priority = GFX_PMASK_2|GFX_PMASK_1; break; /* over F, not AB */
}
*code |= (*color & 0x80) << 6;
*color = sprite_colorbase + (*color & 0x0f);
*shadow = 0; /* shadows are not used by this game */
}
/***************************************************************************
Display refresh
***************************************************************************/
uint32_t aliens_state::screen_update_aliens(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_k052109->tilemap_update();
screen.priority().fill(0, cliprect);
/* The background color is always from layer 1 */
m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 0);
m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, 0, 1);
m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 0, 2);
m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 4);
m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), -1, -1);
return 0;
}

View File

@ -13,7 +13,9 @@
***************************************************************************/
#include "emu.h"
#include "battlnts.h"
#include "k007342.h"
#include "k007420.h"
#include "konamipt.h"
#include "cpu/m6809/hd6309.h"
@ -21,10 +23,109 @@
#include "machine/gen_latch.h"
#include "machine/watchdog.h"
#include "sound/ymopl.h"
#include "screen.h"
#include "speaker.h"
namespace {
class battlnts_state : public driver_device
{
public:
battlnts_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_k007342(*this, "k007342"),
m_k007420(*this, "k007420"),
m_gfxdecode(*this, "gfxdecode"),
m_rombank(*this, "rombank")
{ }
void battlnts(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
// video-related
uint16_t m_spritebank = 0;
// devices
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<k007342_device> m_k007342;
required_device<k007420_device> m_k007420;
required_device<gfxdecode_device> m_gfxdecode;
required_memory_bank m_rombank;
void sh_irqtrigger_w(uint8_t data);
void bankswitch_w(uint8_t data);
void spritebank_w(uint8_t data);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
K007342_CALLBACK_MEMBER(tile_callback);
K007420_CALLBACK_MEMBER(sprite_callback);
void main_map(address_map &map);
void sound_map(address_map &map);
};
// video
/***************************************************************************
Callback for the K007342
***************************************************************************/
K007342_CALLBACK_MEMBER(battlnts_state::tile_callback)
{
*code |= ((*color & 0x0f) << 9) | ((*color & 0x40) << 2);
*color = 0;
}
/***************************************************************************
Callback for the K007420
***************************************************************************/
K007420_CALLBACK_MEMBER(battlnts_state::sprite_callback)
{
*code |= ((*color & 0xc0) << 2) | m_spritebank;
*code = (*code << 2) | ((*color & 0x30) >> 4);
*color = 0;
}
void battlnts_state::spritebank_w(uint8_t data)
{
m_spritebank = 1024 * (data & 1);
}
/***************************************************************************
Screen Refresh
***************************************************************************/
uint32_t battlnts_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_k007342->tilemap_update();
m_k007342->tilemap_draw(screen, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE ,0);
m_k007420->sprites_draw(bitmap, cliprect, m_gfxdecode->gfx(1));
m_k007342->tilemap_draw(screen, bitmap, cliprect, 0, 1 | TILEMAP_DRAW_OPAQUE ,0);
return 0;
}
// machine
/*************************************
*
* Memory handlers
@ -37,21 +138,21 @@ WRITE_LINE_MEMBER(battlnts_state::vblank_irq)
m_maincpu->set_input_line(HD6309_IRQ_LINE, HOLD_LINE);
}
void battlnts_state::battlnts_sh_irqtrigger_w(uint8_t data)
void battlnts_state::sh_irqtrigger_w(uint8_t data)
{
m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80
}
void battlnts_state::battlnts_bankswitch_w(uint8_t data)
void battlnts_state::bankswitch_w(uint8_t data)
{
/* bits 6 & 7 = bank number */
// bits 6 & 7 = bank number
m_rombank->set_entry((data & 0xc0) >> 6);
/* bits 4 & 5 = coin counters */
// bits 4 & 5 = coin counters
machine().bookkeeping().coin_counter_w(0, data & 0x10);
machine().bookkeeping().coin_counter_w(1, data & 0x20);
/* other bits unknown */
// other bits unknown
}
@ -61,33 +162,33 @@ void battlnts_state::battlnts_bankswitch_w(uint8_t data)
*
*************************************/
void battlnts_state::battlnts_map(address_map &map)
void battlnts_state::main_map(address_map &map)
{
map(0x0000, 0x1fff).rw(m_k007342, FUNC(k007342_device::read), FUNC(k007342_device::write)); /* Color RAM + Video RAM */
map(0x2000, 0x21ff).rw(m_k007420, FUNC(k007420_device::read), FUNC(k007420_device::write)); /* Sprite RAM */
map(0x2200, 0x23ff).rw(m_k007342, FUNC(k007342_device::scroll_r), FUNC(k007342_device::scroll_w)); /* Scroll RAM */
map(0x2400, 0x24ff).ram().w("palette", FUNC(palette_device::write8)).share("palette");/* palette */
map(0x2600, 0x2607).w(m_k007342, FUNC(k007342_device::vreg_w)); /* Video Registers */
map(0x0000, 0x1fff).rw(m_k007342, FUNC(k007342_device::read), FUNC(k007342_device::write)); // Color RAM + Video RAM
map(0x2000, 0x21ff).rw(m_k007420, FUNC(k007420_device::read), FUNC(k007420_device::write)); // Sprite RAM
map(0x2200, 0x23ff).rw(m_k007342, FUNC(k007342_device::scroll_r), FUNC(k007342_device::scroll_w)); // Scroll RAM
map(0x2400, 0x24ff).ram().w("palette", FUNC(palette_device::write8)).share("palette");
map(0x2600, 0x2607).w(m_k007342, FUNC(k007342_device::vreg_w));
map(0x2e00, 0x2e00).portr("DSW1");
map(0x2e01, 0x2e01).portr("P2");
map(0x2e02, 0x2e02).portr("P1");
map(0x2e03, 0x2e03).portr("DSW3"); /* coinsw, testsw, startsw */
map(0x2e03, 0x2e03).portr("DSW3"); // coinsw, testsw, startsw
map(0x2e04, 0x2e04).portr("DSW2");
map(0x2e08, 0x2e08).w(FUNC(battlnts_state::battlnts_bankswitch_w)); /* bankswitch control */
map(0x2e0c, 0x2e0c).w(FUNC(battlnts_state::battlnts_spritebank_w)); /* sprite bank select */
map(0x2e08, 0x2e08).w(FUNC(battlnts_state::bankswitch_w));
map(0x2e0c, 0x2e0c).w(FUNC(battlnts_state::spritebank_w));
map(0x2e10, 0x2e10).w("watchdog", FUNC(watchdog_timer_device::reset_w));
map(0x2e14, 0x2e14).w("soundlatch", FUNC(generic_latch_8_device::write)); /* sound code # */
map(0x2e18, 0x2e18).w(FUNC(battlnts_state::battlnts_sh_irqtrigger_w)); /* cause interrupt on audio CPU */
map(0x4000, 0x7fff).bankr("rombank"); /* banked ROM */
map(0x8000, 0xffff).rom(); /* ROM 777e02.bin */
map(0x2e14, 0x2e14).w("soundlatch", FUNC(generic_latch_8_device::write));
map(0x2e18, 0x2e18).w(FUNC(battlnts_state::sh_irqtrigger_w)); // cause interrupt on audio CPU
map(0x4000, 0x7fff).bankr(m_rombank);
map(0x8000, 0xffff).rom(); // ROM 777e02.bin
}
void battlnts_state::battlnts_sound_map(address_map &map)
void battlnts_state::sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom(); /* ROM 777c01.rom */
map(0x8000, 0x87ff).ram(); /* RAM */
map(0xa000, 0xa001).rw("ym1", FUNC(ym3812_device::read), FUNC(ym3812_device::write)); /* YM3812 (chip 1) */
map(0xc000, 0xc001).rw("ym2", FUNC(ym3812_device::read), FUNC(ym3812_device::write)); /* YM3812 (chip 2) */
map(0x0000, 0x7fff).rom(); // ROM 777c01.rom
map(0x8000, 0x87ff).ram();
map(0xa000, 0xa001).rw("ym1", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0xc000, 0xc001).rw("ym2", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0xe000, 0xe000).r("soundlatch", FUNC(generic_latch_8_device::read));
}
@ -100,7 +201,7 @@ void battlnts_state::battlnts_sound_map(address_map &map)
static INPUT_PORTS_START( battlnts )
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, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
@ -184,30 +285,19 @@ INPUT_PORTS_END
static const gfx_layout charlayout =
{
8,8, /* 8 x 8 characters */
0x40000/32, /* 8192 characters */
4, /* 4bpp */
{ 0, 1, 2, 3 }, /* the four bitplanes are packed in one nibble */
8,8, // 8 x 8 characters
0x40000/32, // 8192 characters
4, // 4bpp
{ 0, 1, 2, 3 }, // the four bitplanes are packed in one nibble
{ 2*4, 3*4, 0*4, 1*4, 6*4, 7*4, 4*4, 5*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8 /* every character takes 32 consecutive bytes */
};
static const gfx_layout spritelayout =
{
8,8, /* 8*8 sprites */
0x40000/32, /* 8192 sprites */
4, /* 4 bpp */
{ 0, 1, 2, 3 }, /* the four bitplanes are packed in one nibble */
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4},
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8 /* every sprite takes 32 consecutive bytes */
32*8 // every character takes 32 consecutive bytes
};
static GFXDECODE_START( gfx_battlnts )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 1 ) /* colors 0-15 */
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 4*16, 1 ) /* colors 64-79 */
GFXDECODE_ENTRY( "tiles", 0, charlayout, 0, 1 ) // colors 0-15
GFXDECODE_ENTRY( "sprites", 0, gfx_8x8x4_packed_msb , 4*16, 1 ) // colors 64-79
GFXDECODE_END
@ -219,9 +309,9 @@ GFXDECODE_END
void battlnts_state::machine_start()
{
uint8_t *ROM = memregion("maincpu")->base();
uint8_t *rom = memregion("maincpu")->base();
m_rombank->configure_entries(0, 4, &ROM[0x10000], 0x4000);
m_rombank->configure_entries(0, 4, &rom[0x10000], 0x4000);
save_item(NAME(m_spritebank));
}
@ -233,22 +323,22 @@ void battlnts_state::machine_reset()
void battlnts_state::battlnts(machine_config &config)
{
/* basic machine hardware */
HD6309(config, m_maincpu, XTAL(24'000'000) / 2 /* 3000000*4? */);
m_maincpu->set_addrmap(AS_PROGRAM, &battlnts_state::battlnts_map);
// basic machine hardware
HD6309(config, m_maincpu, XTAL(24'000'000) / 2); // 3'000'000 * 4?
m_maincpu->set_addrmap(AS_PROGRAM, &battlnts_state::main_map);
Z80(config, m_audiocpu, XTAL(24'000'000) / 6 /* 3579545? */);
m_audiocpu->set_addrmap(AS_PROGRAM, &battlnts_state::battlnts_sound_map);
Z80(config, m_audiocpu, XTAL(24'000'000) / 6); // 3579545?
m_audiocpu->set_addrmap(AS_PROGRAM, &battlnts_state::sound_map);
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(battlnts_state::screen_update_battlnts));
screen.set_screen_update(FUNC(battlnts_state::screen_update));
screen.set_palette("palette");
screen.screen_vblank().set(FUNC(battlnts_state::vblank_irq));
@ -257,15 +347,15 @@ void battlnts_state::battlnts(machine_config &config)
K007342(config, m_k007342, 0);
m_k007342->set_gfxnum(0);
m_k007342->set_tile_callback(FUNC(battlnts_state::battlnts_tile_callback));
m_k007342->set_tile_callback(FUNC(battlnts_state::tile_callback));
m_k007342->set_gfxdecode_tag(m_gfxdecode);
K007420(config, m_k007420, 0);
m_k007420->set_bank_limit(0x3ff);
m_k007420->set_sprite_callback(FUNC(battlnts_state::battlnts_sprite_callback));
m_k007420->set_sprite_callback(FUNC(battlnts_state::sprite_callback));
m_k007420->set_palette_tag("palette");
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, "soundlatch");
@ -283,95 +373,96 @@ void battlnts_state::battlnts(machine_config &config)
*************************************/
ROM_START( battlnts )
ROM_REGION( 0x20000, "maincpu", 0 ) /* code + banked roms */
ROM_LOAD( "777_g02.7e", 0x08000, 0x08000, CRC(dbd8e17e) SHA1(586a22b714011c67a915c4a350ceca19ff875635) ) /* fixed ROM */
ROM_LOAD( "777_g03.8e", 0x10000, 0x10000, CRC(7bd44fef) SHA1(308ec5246f5537b34e368535672ac687f456750a) ) /* banked ROM */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "777_g02.7e", 0x08000, 0x08000, CRC(dbd8e17e) SHA1(586a22b714011c67a915c4a350ceca19ff875635) ) // fixed ROM
ROM_LOAD( "777_g03.8e", 0x10000, 0x10000, CRC(7bd44fef) SHA1(308ec5246f5537b34e368535672ac687f456750a) ) // banked ROM
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "777_c01.10a", 0x00000, 0x08000, CRC(c21206e9) SHA1(7b133e04be67dc061a186ab0481d848b69b370d7) )
ROM_REGION( 0x40000, "gfx1", 0 )
ROM_LOAD( "777c04.13a", 0x00000, 0x40000, CRC(45d92347) SHA1(8537b4ccd0a80ea3260ef82fde177f1d65a49c03) ) /* tiles */
ROM_REGION( 0x40000, "tiles", 0 )
ROM_LOAD( "777c04.13a", 0x00000, 0x40000, CRC(45d92347) SHA1(8537b4ccd0a80ea3260ef82fde177f1d65a49c03) )
ROM_REGION( 0x40000, "gfx2", 0 )
ROM_LOAD( "777c05.13e", 0x00000, 0x40000, CRC(aeee778c) SHA1(fc58ada9c97361d13439b7b0918c947d48402445) ) /* sprites */
ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "777c05.13e", 0x00000, 0x40000, CRC(aeee778c) SHA1(fc58ada9c97361d13439b7b0918c947d48402445) )
ROM_END
ROM_START( battlntsa )
ROM_REGION( 0x20000, "maincpu", 0 ) /* code + banked roms */
ROM_LOAD( "777_f02.7e", 0x08000, 0x08000, CRC(9f1dc5c1) SHA1(86ae471b276d90bbebb97747b673cd5c31ff9043) ) /* fixed ROM */
ROM_LOAD( "777_f03.8e", 0x10000, 0x10000, CRC(040d00bf) SHA1(433afd38a80d79d6a95f2ef0b195a92688ace555) ) /* banked ROM */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "777_f02.7e", 0x08000, 0x08000, CRC(9f1dc5c1) SHA1(86ae471b276d90bbebb97747b673cd5c31ff9043) ) // fixed ROM
ROM_LOAD( "777_f03.8e", 0x10000, 0x10000, CRC(040d00bf) SHA1(433afd38a80d79d6a95f2ef0b195a92688ace555) ) // banked ROM
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "777_c01.10a", 0x00000, 0x08000, CRC(c21206e9) SHA1(7b133e04be67dc061a186ab0481d848b69b370d7) )
ROM_REGION( 0x40000, "gfx1", 0 )
ROM_LOAD( "777c04.13a", 0x00000, 0x40000, CRC(45d92347) SHA1(8537b4ccd0a80ea3260ef82fde177f1d65a49c03) ) /* tiles */
ROM_REGION( 0x40000, "tiles", 0 )
ROM_LOAD( "777c04.13a", 0x00000, 0x40000, CRC(45d92347) SHA1(8537b4ccd0a80ea3260ef82fde177f1d65a49c03) )
ROM_REGION( 0x40000, "gfx2", 0 )
ROM_LOAD( "777c05.13e", 0x00000, 0x40000, CRC(aeee778c) SHA1(fc58ada9c97361d13439b7b0918c947d48402445) ) /* sprites */
ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "777c05.13e", 0x00000, 0x40000, CRC(aeee778c) SHA1(fc58ada9c97361d13439b7b0918c947d48402445) )
ROM_END
ROM_START( battlntsj )
ROM_REGION( 0x20000, "maincpu", 0 ) /* code + banked roms */
ROM_LOAD( "777_e02.7e", 0x08000, 0x08000, CRC(d631cfcb) SHA1(7787da0dd8cd218abc27204e517e04d7a1913a3b) ) /* fixed ROM */
ROM_LOAD( "777_e03.8e", 0x10000, 0x10000, CRC(5ef1f4ef) SHA1(e3e6e1fc5a65328d94c23e2e76eef3504b70e58b) ) /* banked ROM */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "777_e02.7e", 0x08000, 0x08000, CRC(d631cfcb) SHA1(7787da0dd8cd218abc27204e517e04d7a1913a3b) ) // fixed ROM
ROM_LOAD( "777_e03.8e", 0x10000, 0x10000, CRC(5ef1f4ef) SHA1(e3e6e1fc5a65328d94c23e2e76eef3504b70e58b) ) // banked ROM
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "777_c01.10a", 0x00000, 0x08000, CRC(c21206e9) SHA1(7b133e04be67dc061a186ab0481d848b69b370d7) )
ROM_REGION( 0x40000, "gfx1", 0 )
ROM_LOAD( "777c04.13a", 0x00000, 0x40000, CRC(45d92347) SHA1(8537b4ccd0a80ea3260ef82fde177f1d65a49c03) ) /* tiles */
ROM_REGION( 0x40000, "tiles", 0 )
ROM_LOAD( "777c04.13a", 0x00000, 0x40000, CRC(45d92347) SHA1(8537b4ccd0a80ea3260ef82fde177f1d65a49c03) )
ROM_REGION( 0x40000, "gfx2", 0 )
ROM_LOAD( "777c05.13e", 0x00000, 0x40000, CRC(aeee778c) SHA1(fc58ada9c97361d13439b7b0918c947d48402445) ) /* sprites */
ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "777c05.13e", 0x00000, 0x40000, CRC(aeee778c) SHA1(fc58ada9c97361d13439b7b0918c947d48402445) )
ROM_END
ROM_START( rackemup )
ROM_REGION( 0x20000, "maincpu", 0 ) /* code + banked roms */
ROM_LOAD( "765_l02.7e", 0x08000, 0x08000, CRC(3dfc48bd) SHA1(9ba98e9f27dd0a6efec145bea2a5ae7df8567437) ) /* fixed ROM */
ROM_LOAD( "765_j03.8e", 0x10000, 0x10000, CRC(a13fd751) SHA1(27ec66835c85b7ac0221a813d38e9cca0d9be3b8) ) /* banked ROM */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "765_l02.7e", 0x08000, 0x08000, CRC(3dfc48bd) SHA1(9ba98e9f27dd0a6efec145bea2a5ae7df8567437) ) // fixed ROM
ROM_LOAD( "765_j03.8e", 0x10000, 0x10000, CRC(a13fd751) SHA1(27ec66835c85b7ac0221a813d38e9cca0d9be3b8) ) // banked ROM
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "765_j01.10a", 0x00000, 0x08000, CRC(77ae753e) SHA1(9e463a825d31bb79644b083d24b25670d96441c5) )
ROM_REGION( 0x40000, "gfx1", 0 )
ROM_LOAD( "765_l04.13a", 0x00000, 0x40000, CRC(d8fb9c64) SHA1(37dac643aa492ef1ecc29c5030bc7fe5226027a2) ) /* tiles */
ROM_REGION( 0x40000, "tiles", 0 )
ROM_LOAD( "765_l04.13a", 0x00000, 0x40000, CRC(d8fb9c64) SHA1(37dac643aa492ef1ecc29c5030bc7fe5226027a2) )
ROM_REGION( 0x40000, "gfx2", 0 )
ROM_LOAD( "765_l05.13e", 0x00000, 0x40000, CRC(1bb6855f) SHA1(251081564dfede8fa9a422081d58465fe5ca4ed1) ) /* sprites */
ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "765_l05.13e", 0x00000, 0x40000, CRC(1bb6855f) SHA1(251081564dfede8fa9a422081d58465fe5ca4ed1) )
ROM_END
ROM_START( thehustl )
ROM_REGION( 0x20000, "maincpu", 0 ) /* code + banked roms */
ROM_LOAD( "765_m02.7e", 0x08000, 0x08000, CRC(934807b9) SHA1(84e13a5c1587ee28330f369f9a1180219edbda9d) ) /* fixed ROM */
ROM_LOAD( "765_j03.8e", 0x10000, 0x10000, CRC(a13fd751) SHA1(27ec66835c85b7ac0221a813d38e9cca0d9be3b8) ) /* banked ROM */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "765_m02.7e", 0x08000, 0x08000, CRC(934807b9) SHA1(84e13a5c1587ee28330f369f9a1180219edbda9d) ) // fixed ROM
ROM_LOAD( "765_j03.8e", 0x10000, 0x10000, CRC(a13fd751) SHA1(27ec66835c85b7ac0221a813d38e9cca0d9be3b8) ) // banked ROM
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "765_j01.10a", 0x00000, 0x08000, CRC(77ae753e) SHA1(9e463a825d31bb79644b083d24b25670d96441c5) )
ROM_REGION( 0x40000, "gfx1", 0 )
ROM_LOAD( "765_e04.13a", 0x00000, 0x40000, CRC(08c2b72e) SHA1(02d9c690da839d6fee75fffdf66a4d3da35a0263) ) /* tiles */
ROM_REGION( 0x40000, "tiles", 0 )
ROM_LOAD( "765_e04.13a", 0x00000, 0x40000, CRC(08c2b72e) SHA1(02d9c690da839d6fee75fffdf66a4d3da35a0263) )
ROM_REGION( 0x40000, "gfx2", 0 )
ROM_LOAD( "765_e05.13e", 0x00000, 0x40000, CRC(ef044655) SHA1(c8272283eab8fc2899979da398819cb72c92a299) ) /* sprites */
ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "765_e05.13e", 0x00000, 0x40000, CRC(ef044655) SHA1(c8272283eab8fc2899979da398819cb72c92a299) )
ROM_END
ROM_START( thehustlj )
ROM_REGION( 0x20000, "maincpu", 0 ) /* code + banked roms */
ROM_LOAD( "765_j02.7e", 0x08000, 0x08000, CRC(2ac14c75) SHA1(b88f6279ab88719f4207e28486a0022554668382) ) /* fixed ROM */
ROM_LOAD( "765_j03.8e", 0x10000, 0x10000, CRC(a13fd751) SHA1(27ec66835c85b7ac0221a813d38e9cca0d9be3b8) ) /* banked ROM */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "765_j02.7e", 0x08000, 0x08000, CRC(2ac14c75) SHA1(b88f6279ab88719f4207e28486a0022554668382) ) // fixed ROM
ROM_LOAD( "765_j03.8e", 0x10000, 0x10000, CRC(a13fd751) SHA1(27ec66835c85b7ac0221a813d38e9cca0d9be3b8) ) // banked ROM
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "765_j01.10a", 0x00000, 0x08000, CRC(77ae753e) SHA1(9e463a825d31bb79644b083d24b25670d96441c5) )
ROM_REGION( 0x40000, "gfx1", 0 )
ROM_LOAD( "765_e04.13a", 0x00000, 0x40000, CRC(08c2b72e) SHA1(02d9c690da839d6fee75fffdf66a4d3da35a0263) ) /* tiles */
ROM_REGION( 0x40000, "tiles", 0 )
ROM_LOAD( "765_e04.13a", 0x00000, 0x40000, CRC(08c2b72e) SHA1(02d9c690da839d6fee75fffdf66a4d3da35a0263) )
ROM_REGION( 0x40000, "gfx2", 0 )
ROM_LOAD( "765_e05.13e", 0x00000, 0x40000, CRC(ef044655) SHA1(c8272283eab8fc2899979da398819cb72c92a299) ) /* sprites */
ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "765_e05.13e", 0x00000, 0x40000, CRC(ef044655) SHA1(c8272283eab8fc2899979da398819cb72c92a299) )
ROM_END
} // anonymous namespace
/*************************************

View File

@ -1,54 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Manuel Abadia
/*************************************************************************
Konami Battlantis Hardware
*************************************************************************/
#ifndef MAME_INCLUDES_BATTLNTS_H
#define MAME_INCLUDES_BATTLNTS_H
#pragma once
#include "k007342.h"
#include "k007420.h"
class battlnts_state : public driver_device
{
public:
battlnts_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_k007342(*this, "k007342"),
m_k007420(*this, "k007420"),
m_gfxdecode(*this, "gfxdecode"),
m_rombank(*this, "rombank")
{ }
/* video-related */
int m_spritebank = 0;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<k007342_device> m_k007342;
required_device<k007420_device> m_k007420;
required_device<gfxdecode_device> m_gfxdecode;
required_memory_bank m_rombank;
void battlnts_sh_irqtrigger_w(uint8_t data);
void battlnts_bankswitch_w(uint8_t data);
void battlnts_spritebank_w(uint8_t data);
virtual void machine_start() override;
virtual void machine_reset() override;
uint32_t screen_update_battlnts(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
K007342_CALLBACK_MEMBER(battlnts_tile_callback);
K007420_CALLBACK_MEMBER(battlnts_sprite_callback);
void battlnts(machine_config &config);
void battlnts_map(address_map &map);
void battlnts_sound_map(address_map &map);
};
#endif // MAME_INCLUDES_BATTLNTS_H

View File

@ -1,50 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Manuel Abadia
#include "emu.h"
#include "battlnts.h"
/***************************************************************************
Callback for the K007342
***************************************************************************/
K007342_CALLBACK_MEMBER(battlnts_state::battlnts_tile_callback)
{
*code |= ((*color & 0x0f) << 9) | ((*color & 0x40) << 2);
*color = 0;
}
/***************************************************************************
Callback for the K007420
***************************************************************************/
K007420_CALLBACK_MEMBER(battlnts_state::battlnts_sprite_callback)
{
*code |= ((*color & 0xc0) << 2) | m_spritebank;
*code = (*code << 2) | ((*color & 0x30) >> 4);
*color = 0;
}
void battlnts_state::battlnts_spritebank_w(uint8_t data)
{
m_spritebank = 1024 * (data & 1);
}
/***************************************************************************
Screen Refresh
***************************************************************************/
uint32_t battlnts_state::screen_update_battlnts(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_k007342->tilemap_update();
m_k007342->tilemap_draw(screen, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE ,0);
m_k007420->sprites_draw(bitmap, cliprect, m_gfxdecode->gfx(1));
m_k007342->tilemap_draw(screen, bitmap, cliprect, 0, 1 | TILEMAP_DRAW_OPAQUE ,0);
return 0;
}

View File

@ -1,5 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
// copyright-holders: Nicola Salmoria
/***************************************************************************
Finalizer (GX523) (c) 1985 Konami
@ -13,23 +14,314 @@ TODO:
***************************************************************************/
#include "emu.h"
#include "finalizr.h"
#include "konami1.h"
#include "konamipt.h"
#include "cpu/m6809/m6809.h"
#include "cpu/mcs48/mcs48.h"
#include "machine/gen_latch.h"
#include "konami1.h"
#include "machine/timer.h"
#include "machine/watchdog.h"
#include "sound/dac.h"
#include "sound/sn76496.h"
#include "video/resnet.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
namespace {
class finalizr_state : public driver_device
{
public:
finalizr_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_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_scroll(*this, "scroll"),
m_colorram(*this, "colorram%u", 1U),
m_videoram(*this, "videoram%u", 1U),
m_spriteram(*this, "spriteram%u", 1U)
{ }
void finalizr(machine_config &config);
void finalizrb(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
private:
// devices
required_device<cpu_device> m_maincpu;
required_device<mcs48_cpu_device> m_audiocpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
// memory pointers
required_shared_ptr<uint8_t> m_scroll;
required_shared_ptr_array<uint8_t, 2> m_colorram;
required_shared_ptr_array<uint8_t, 2> m_videoram;
required_shared_ptr_array<uint8_t, 2> m_spriteram;
// video-related
tilemap_t *m_fg_tilemap = nullptr;
tilemap_t *m_bg_tilemap = nullptr;
uint8_t m_spriterambank = 0U;
uint8_t m_charbank = 0U;
// misc
uint8_t m_nmi_enable = 0U;
uint8_t m_irq_enable = 0U;
void coin_w(uint8_t data);
void flipscreen_w(uint8_t data);
void sound_irq_w(uint8_t data);
void sound_irqen_w(uint8_t data);
DECLARE_READ_LINE_MEMBER(bootleg_t1_r);
void videoctrl_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
void palette(palette_device &palette) const;
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(scanline);
void main_map(address_map &map);
void sound_io_map(address_map &map);
};
// video
/***************************************************************************
The palette PROMs are connected to the RGB output this way:
bit 7 -- 220 ohm resistor -- \
-- 470 ohm resistor -- | -- 470 ohm pulldown resistor -- GREEN
-- 1 kohm resistor -- |
-- 2.2 kohm resistor -- /
-- 220 ohm resistor -- \
-- 470 ohm resistor -- | -- 470 ohm pulldown resistor -- RED
-- 1 kohm resistor -- |
bit 0 -- 2.2 kohm resistor -- /
bit 3 -- 220 ohm resistor -- \
-- 470 ohm resistor -- | -- 470 ohm pulldown resistor -- BLUE
-- 1 kohm resistor -- |
bit 0 -- 2.2 kohm resistor -- /
***************************************************************************/
void finalizr_state::palette(palette_device &palette) const
{
const uint8_t *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[0], rweights, 470, 0,
4, &resistances[0], gweights, 470, 0,
4, &resistances[0], bweights, 470, 0);
// create a lookup table for the palette
for (int i = 0; i < 0x20; i++)
{
int bit0, bit1, bit2, bit3;
// red component
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
bit3 = BIT(color_prom[i], 3);
int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
// green component
bit0 = BIT(color_prom[i], 4);
bit1 = BIT(color_prom[i], 5);
bit2 = BIT(color_prom[i], 6);
bit3 = BIT(color_prom[i], 7);
int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
// blue component
bit0 = BIT(color_prom[i + 0x20], 0);
bit1 = BIT(color_prom[i + 0x20], 1);
bit2 = BIT(color_prom[i + 0x20], 2);
bit3 = BIT(color_prom[i + 0x20], 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 += 0x40;
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
palette.set_pen_indirect(i, ctabentry);
}
for (int i = 0x100; i < 0x200; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry);
}
}
TILE_GET_INFO_MEMBER(finalizr_state::get_bg_tile_info)
{
int const attr = m_colorram[0][tile_index];
int const code = m_videoram[0][tile_index] + ((attr & 0xc0) << 2) + (m_charbank << 10);
int const color = attr & 0x0f;
int const flags = TILE_FLIPYX((attr & 0x30) >> 4);
tileinfo.set(0, code, color, flags);
}
TILE_GET_INFO_MEMBER(finalizr_state::get_fg_tile_info)
{
int const attr = m_colorram[1][tile_index];
int const code = m_videoram[1][tile_index] + ((attr & 0xc0) << 2);
int const color = attr & 0x0f;
int const flags = TILE_FLIPYX((attr & 0x30) >> 4);
tileinfo.set(0, code, color, flags);
}
void finalizr_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(finalizr_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(finalizr_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
}
/**************************************************************************/
void finalizr_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
gfx_element *gfx1 = m_gfxdecode->gfx(1);
gfx_element *gfx2 = m_gfxdecode->gfx(2);
uint8_t const *sr = m_spriterambank ? m_spriteram[1] : m_spriteram[0];
for (int offs = 0; offs <= m_spriteram[0].bytes() - 5; offs += 5)
{
int sx = 32 + 1 + sr[offs + 3] - ((sr[offs + 4] & 0x01) << 8);
int sy = sr[offs + 2];
int flipx = sr[offs + 4] & 0x20;
int flipy = sr[offs + 4] & 0x40;
int code = sr[offs] + ((sr[offs + 1] & 0x0f) << 8);
int const color = ((sr[offs + 1] & 0xf0) >> 4);
// (sr[offs + 4] & 0x02) is used, meaning unknown
int const size = sr[offs + 4] & 0x1c;
if (size >= 0x10)
{
// 32x32
if (flip_screen())
{
sx = 256 - sx;
sy = 224 - sy;
flipx = !flipx;
flipy = !flipy;
}
gfx1->transpen(bitmap, cliprect, code + 0, color, flipx, flipy, flipx ? sx + 16 : sx, flipy ? sy + 16 : sy, 0);
gfx1->transpen(bitmap, cliprect, code + 1, color, flipx, flipy, flipx ? sx : sx + 16, flipy ? sy + 16 : sy, 0);
gfx1->transpen(bitmap, cliprect, code + 2, color, flipx, flipy, flipx ? sx + 16: sx , flipy ? sy : sy + 16, 0);
gfx1->transpen(bitmap, cliprect, code + 3, color, flipx, flipy, flipx ? sx : sx + 16, flipy ? sy : sy + 16, 0);
}
else
{
if (flip_screen())
{
sx = ((size & 0x08) ? 280: 272) - sx;
sy = ((size & 0x04) ? 248: 240) - sy;
flipx = !flipx;
flipy = !flipy;
}
if (size == 0x00)
{
// 16x16
gfx1->transpen(bitmap, cliprect, code, color, flipx, flipy, sx, sy, 0);
}
else
{
code = ((code & 0x3ff) << 2) | ((code & 0xc00) >> 10);
if (size == 0x04)
{
// 16x8
gfx2->transpen(bitmap, cliprect, code &~1, color, flipx, flipy, flipx ? sx + 8 : sx, sy, 0);
gfx2->transpen(bitmap, cliprect, code | 1, color, flipx, flipy, flipx ? sx : sx + 8, sy, 0);
}
else if (size == 0x08)
{
// 8x16
gfx2->transpen(bitmap, cliprect, code &~2, color, flipx, flipy, sx, flipy ? sy + 8 : sy, 0);
gfx2->transpen(bitmap, cliprect, code | 2, color, flipx, flipy, sx, flipy ? sy : sy + 8, 0);
}
else if (size == 0x0c)
{
// 8x8
gfx2->transpen(bitmap, cliprect, code, color, flipx, flipy, sx, sy, 0);
}
}
}
}
}
uint32_t finalizr_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->mark_all_dirty();
m_fg_tilemap->mark_all_dirty();
m_bg_tilemap->set_scrollx(0, *m_scroll - 32);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
// draw top status region
const rectangle &visarea = screen.visible_area();
rectangle clip = cliprect;
if (flip_screen())
{
clip.min_x = visarea.max_x - 31;
clip.max_x = visarea.max_x;
}
else
{
clip.min_x = visarea.min_x;
clip.max_x = visarea.min_x + 31;
}
m_fg_tilemap->draw(screen, bitmap, clip, 0, 0);
return 0;
}
// machine
TIMER_DEVICE_CALLBACK_MEMBER(finalizr_state::scanline)
{
int scanline = param;
int const scanline = param;
if (scanline == 240 && m_irq_enable) // vblank irq
m_maincpu->set_input_line(M6809_IRQ_LINE, HOLD_LINE);
@ -192,23 +484,10 @@ INPUT_PORTS_END
static const gfx_layout spritelayout =
{
16,16,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4,
32*8+0*4, 32*8+1*4, 32*8+2*4, 32*8+3*4, 32*8+4*4, 32*8+5*4, 32*8+6*4, 32*8+7*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
16*32, 17*32, 18*32, 19*32, 20*32, 21*32, 22*32, 23*32 },
32*32
};
static GFXDECODE_START( gfx_finalizr )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_msb, 0, 16 )
GFXDECODE_ENTRY( "gfx1", 0, spritelayout, 16*16, 16 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_msb, 16*16, 16 ) // to handle 8x8 sprites
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_msb, 0, 16 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_row_2x2_group_packed_msb, 16*16, 16 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_msb, 16*16, 16 ) // to handle 8x8 sprites
GFXDECODE_END
@ -357,6 +636,8 @@ ROM_START( finalizrb )
ROM_LOAD( "523h12.10f", 0x0140, 0x0100, CRC(53166a2a) SHA1(6cdde206036df7176679711f7888d72acee27c8f) ) // sprites
ROM_END
} // anonymous namespace
// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS
GAME( 1985, finalizr, 0, finalizr, finalizr, finalizr_state, empty_init, ROT90, "Konami", "Finalizer - Super Transformation (set 1)", MACHINE_SUPPORTS_SAVE )

View File

@ -1,82 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
/***************************************************************************
Konami Finalizer
***************************************************************************/
#ifndef MAME_INCLUDES_FINALIZR_H
#define MAME_INCLUDES_FINALIZR_H
#pragma once
#include "cpu/mcs48/mcs48.h"
#include "machine/timer.h"
#include "emupal.h"
#include "tilemap.h"
class finalizr_state : public driver_device
{
public:
finalizr_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_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_scroll(*this, "scroll"),
m_colorram(*this, "colorram%u", 1U),
m_videoram(*this, "videoram%u", 1U),
m_spriteram(*this, "spriteram%u", 1U)
{ }
void finalizr(machine_config &config);
void finalizrb(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
private:
// devices
required_device<cpu_device> m_maincpu;
required_device<mcs48_cpu_device> m_audiocpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
// memory pointers
required_shared_ptr<uint8_t> m_scroll;
required_shared_ptr_array<uint8_t, 2> m_colorram;
required_shared_ptr_array<uint8_t, 2> m_videoram;
required_shared_ptr_array<uint8_t, 2> m_spriteram;
// video-related
tilemap_t *m_fg_tilemap = nullptr;
tilemap_t *m_bg_tilemap = nullptr;
uint8_t m_spriterambank = 0U;
uint8_t m_charbank = 0U;
// misc
uint8_t m_nmi_enable = 0U;
uint8_t m_irq_enable = 0U;
void coin_w(uint8_t data);
void flipscreen_w(uint8_t data);
void sound_irq_w(uint8_t data);
void sound_irqen_w(uint8_t data);
DECLARE_READ_LINE_MEMBER(bootleg_t1_r);
void videoctrl_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
void palette(palette_device &palette) const;
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(scanline);
void main_map(address_map &map);
void sound_io_map(address_map &map);
};
#endif // MAME_INCLUDES_FINALIZR_H

View File

@ -1,231 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
/***************************************************************************
Konami Finalizer
Functions to emulate the video hardware of the machine.
***************************************************************************/
#include "emu.h"
#include "finalizr.h"
#include "video/resnet.h"
#include "screen.h"
/***************************************************************************
The palette PROMs are connected to the RGB output this way:
bit 7 -- 220 ohm resistor -- \
-- 470 ohm resistor -- | -- 470 ohm pulldown resistor -- GREEN
-- 1 kohm resistor -- |
-- 2.2 kohm resistor -- /
-- 220 ohm resistor -- \
-- 470 ohm resistor -- | -- 470 ohm pulldown resistor -- RED
-- 1 kohm resistor -- |
bit 0 -- 2.2 kohm resistor -- /
bit 3 -- 220 ohm resistor -- \
-- 470 ohm resistor -- | -- 470 ohm pulldown resistor -- BLUE
-- 1 kohm resistor -- |
bit 0 -- 2.2 kohm resistor -- /
***************************************************************************/
void finalizr_state::palette(palette_device &palette) const
{
const uint8_t *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[0], rweights, 470, 0,
4, &resistances[0], gweights, 470, 0,
4, &resistances[0], bweights, 470, 0);
// create a lookup table for the palette
for (int i = 0; i < 0x20; i++)
{
int bit0, bit1, bit2, bit3;
// red component
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
bit3 = BIT(color_prom[i], 3);
int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
// green component
bit0 = BIT(color_prom[i], 4);
bit1 = BIT(color_prom[i], 5);
bit2 = BIT(color_prom[i], 6);
bit3 = BIT(color_prom[i], 7);
int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
// blue component
bit0 = BIT(color_prom[i + 0x20], 0);
bit1 = BIT(color_prom[i + 0x20], 1);
bit2 = BIT(color_prom[i + 0x20], 2);
bit3 = BIT(color_prom[i + 0x20], 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 += 0x40;
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
palette.set_pen_indirect(i, ctabentry);
}
for (int i = 0x100; i < 0x200; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry);
}
}
TILE_GET_INFO_MEMBER(finalizr_state::get_bg_tile_info)
{
int attr = m_colorram[0][tile_index];
int code = m_videoram[0][tile_index] + ((attr & 0xc0) << 2) + (m_charbank << 10);
int color = attr & 0x0f;
int flags = TILE_FLIPYX((attr & 0x30) >> 4);
tileinfo.set(0, code, color, flags);
}
TILE_GET_INFO_MEMBER(finalizr_state::get_fg_tile_info)
{
int attr = m_colorram[1][tile_index];
int code = m_videoram[1][tile_index] + ((attr & 0xc0) << 2);
int color = attr & 0x0f;
int flags = TILE_FLIPYX((attr & 0x30) >> 4);
tileinfo.set(0, code, color, flags);
}
void finalizr_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(finalizr_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(finalizr_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
}
/**************************************************************************/
void finalizr_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
gfx_element *gfx1 = m_gfxdecode->gfx(1);
gfx_element *gfx2 = m_gfxdecode->gfx(2);
uint8_t *sr = m_spriterambank ? m_spriteram[1] : m_spriteram[0];
for (int offs = 0; offs <= m_spriteram[0].bytes() - 5; offs += 5)
{
int sx = 32 + 1 + sr[offs + 3] - ((sr[offs + 4] & 0x01) << 8);
int sy = sr[offs + 2];
int flipx = sr[offs + 4] & 0x20;
int flipy = sr[offs + 4] & 0x40;
int code = sr[offs] + ((sr[offs + 1] & 0x0f) << 8);
int color = ((sr[offs + 1] & 0xf0) >> 4);
// (sr[offs + 4] & 0x02) is used, meaning unknown
int size = sr[offs + 4] & 0x1c;
if (size >= 0x10)
{
// 32x32
if (flip_screen())
{
sx = 256 - sx;
sy = 224 - sy;
flipx = !flipx;
flipy = !flipy;
}
gfx1->transpen(bitmap, cliprect, code + 0, color, flipx, flipy, flipx ? sx + 16 : sx, flipy ? sy + 16 : sy, 0);
gfx1->transpen(bitmap, cliprect, code + 1, color, flipx, flipy, flipx ? sx : sx + 16, flipy ? sy + 16 : sy, 0);
gfx1->transpen(bitmap, cliprect, code + 2, color, flipx, flipy, flipx ? sx + 16: sx , flipy ? sy : sy + 16, 0);
gfx1->transpen(bitmap, cliprect, code + 3, color, flipx, flipy, flipx ? sx : sx + 16, flipy ? sy : sy + 16, 0);
}
else
{
if (flip_screen())
{
sx = ((size & 0x08) ? 280: 272) - sx;
sy = ((size & 0x04) ? 248: 240) - sy;
flipx = !flipx;
flipy = !flipy;
}
if (size == 0x00)
{
// 16x16
gfx1->transpen(bitmap, cliprect, code, color, flipx, flipy, sx, sy, 0);
}
else
{
code = ((code & 0x3ff) << 2) | ((code & 0xc00) >> 10);
if (size == 0x04)
{
// 16x8
gfx2->transpen(bitmap, cliprect, code &~1, color, flipx, flipy, flipx ? sx + 8 : sx, sy, 0);
gfx2->transpen(bitmap, cliprect, code | 1, color, flipx, flipy, flipx ? sx : sx + 8, sy, 0);
}
else if (size == 0x08)
{
// 8x16
gfx2->transpen(bitmap, cliprect, code &~2, color, flipx, flipy, sx, flipy ? sy + 8 : sy, 0);
gfx2->transpen(bitmap, cliprect, code | 2, color, flipx, flipy, sx, flipy ? sy : sy + 8, 0);
}
else if (size == 0x0c)
{
// 8x8
gfx2->transpen(bitmap, cliprect, code, color, flipx, flipy, sx, sy, 0);
}
}
}
}
}
uint32_t finalizr_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->mark_all_dirty();
m_fg_tilemap->mark_all_dirty();
m_bg_tilemap->set_scrollx(0, *m_scroll - 32);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
// draw top status region
const rectangle &visarea = screen.visible_area();
rectangle clip = cliprect;
if (flip_screen())
{
clip.min_x = visarea.max_x - 31;
clip.max_x = visarea.max_x;
}
else
{
clip.min_x = visarea.min_x;
clip.max_x = visarea.min_x + 31;
}
m_fg_tilemap->draw(screen, bitmap, clip, 0, 0);
return 0;
}

View File

@ -1,5 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
// copyright-holders: Nicola Salmoria
/***************************************************************************
Green Beret
@ -9,10 +10,10 @@
correct ROM naming information by Belgium Dump Team (17/06/2003)
Games supported:
* Green Beret
* Rush'n Attack (US)
* Green Beret (GX577)
* Rush'n Attack (US) (GX577)
* Green Beret (bootleg)
* Mr. Goemon (Japan)
* Mr. Goemon (Japan) (GX621)
gberetb is a bootleg hacked to run on different hardware.
@ -186,17 +187,346 @@ TBP24S10.A12 - 256x4-bit bipolar PROM (possibly also a color PROM)
***************************************************************************/
#include "emu.h"
#include "gberet.h"
#include "konamipt.h"
#include "cpu/z80/z80.h"
#include "machine/timer.h"
#include "machine/watchdog.h"
#include "sound/sn76496.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
namespace {
class gberet_base_state : public driver_device
{
public:
gberet_base_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_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_sn(*this, "snsnd")
{ }
protected:
virtual void video_start() override;
// memory pointers
required_shared_ptr<uint8_t> m_colorram;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_spriteram;
// devices
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<sn76489a_device> m_sn;
// video-related
tilemap_t * m_bg_tilemap = nullptr;
// misc
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; // TODO: move down in gberet_state once the bootleg PROMs decoding is done
};
class gberet_state : public gberet_base_state
{
public:
gberet_state(const machine_config &mconfig, device_type type, const char *tag) :
gberet_base_state(mconfig, type, tag),
m_spriteram2(*this, "spriteram2"),
m_scrollram(*this, "scrollram"),
m_soundlatch(*this, "soundlatch")
{ }
void gberet(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
void prg_map(address_map &map);
private:
// memory pointers
required_shared_ptr<uint8_t> m_spriteram2;
required_shared_ptr<uint8_t> m_scrollram;
required_shared_ptr<uint8_t> m_soundlatch;
// video-related
uint8_t m_spritebank = 0U;
// misc
uint8_t m_interrupt_mask = 0U;
uint8_t m_interrupt_ticks = 0U;
void coin_counter_w(uint8_t data);
void flipscreen_w(uint8_t data);
void sound_w(uint8_t data);
void scroll_w(offs_t offset, uint8_t data);
void sprite_bank_w(uint8_t data);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(interrupt_tick);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
};
class mrgoemon_state : public gberet_state
{
public:
mrgoemon_state(const machine_config &mconfig, device_type type, const char *tag) :
gberet_state(mconfig, type, tag),
m_mainbank(*this, "mainbank")
{ }
void mrgoemon(machine_config &config);
protected:
virtual void machine_start() override;
private:
// memory pointers
required_memory_bank m_mainbank;
void coin_counter_w(uint8_t data);
void prg_map(address_map &map);
};
class gberetb_state : public gberet_base_state
{
public:
gberetb_state(const machine_config &mconfig, device_type type, const char *tag) :
gberet_base_state(mconfig, type, tag)
{ }
void gberetb(machine_config &config);
private:
void flipscreen_w(uint8_t data);
uint8_t irq_ack_r();
void nmi_ack_w(uint8_t data);
void scroll_w(offs_t offset, uint8_t data);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void prg_map(address_map &map);
};
// video
/***************************************************************************
Convert the color PROMs into a more useable format.
Green Beret has a 32 bytes palette PROM and two 256 bytes color lookup table
PROMs (one for sprites, one for characters).
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 gberet_base_state::palette(palette_device &palette) const
{
uint8_t const *color_prom = memregion("proms")->base();
// create a lookup table for the palette
for (int i = 0; i < 0x20; i++)
{
// red component
int bit0 = BIT(color_prom[i], 0);
int bit1 = BIT(color_prom[i], 1);
int 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;
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
palette.set_pen_indirect(i, ctabentry);
}
for (int i = 0x100; i < 0x200; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry);
}
}
void gberet_base_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void gberet_base_state::colorram_w(offs_t offset, uint8_t data)
{
m_colorram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void gberet_state::scroll_w(offs_t offset, uint8_t data)
{
m_scrollram[offset] = data;
int const scroll = m_scrollram[offset & 0x1f] | (m_scrollram[offset | 0x20] << 8);
m_bg_tilemap->set_scrollx(offset & 0x1f, scroll);
}
void gberet_state::sprite_bank_w(uint8_t data)
{
m_spritebank = data;
}
TILE_GET_INFO_MEMBER(gberet_base_state::get_bg_tile_info)
{
int const attr = m_colorram[tile_index];
int const code = m_videoram[tile_index] + ((attr & 0x40) << 2);
int const color = attr & 0x0f;
int const flags = TILE_FLIPYX((attr & 0x30) >> 4);
tileinfo.group = color;
tileinfo.category = (attr & 0x80) >> 7;
tileinfo.set(0, code, color, flags);
}
void gberet_base_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gberet_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_bg_tilemap->configure_groups(*m_gfxdecode->gfx(0), 0x10);
m_bg_tilemap->set_scroll_rows(32);
}
void gberet_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *sr;
if (m_spritebank & 0x08)
sr = m_spriteram2;
else
sr = m_spriteram;
for (int offs = 0; offs < 0xc0; offs += 4)
{
if (sr[offs + 3])
{
int const attr = sr[offs + 1];
int const code = sr[offs + 0] + ((attr & 0x40) << 2);
int const color = attr & 0x0f;
int sx = sr[offs + 2] - 2 * (attr & 0x80);
int sy = sr[offs + 3];
int flipx = attr & 0x10;
int flipy = attr & 0x20;
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->transmask(bitmap, cliprect, code, color, flipx, flipy, sx, sy,
m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 0));
}
}
}
uint32_t gberet_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0);
draw_sprites(bitmap, cliprect);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
// Green Beret (bootleg)
void gberetb_state::scroll_w(offs_t offset, uint8_t data)
{
int scroll = data;
if (offset)
scroll |= 0x100;
for (offset = 6; offset < 29; offset++)
m_bg_tilemap->set_scrollx(offset, scroll + 64 - 8);
}
void gberetb_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4)
{
if (m_spriteram[offs + 1])
{
int const attr = m_spriteram[offs + 3];
int const code = m_spriteram[offs] + ((attr & 0x40) << 2);
int const color = attr & 0x0f;
int sx = m_spriteram[offs + 2] - 2 * (attr & 0x80);
int sy = 240 - m_spriteram[offs + 1];
int flipx = attr & 0x10;
int flipy = attr & 0x20;
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->transmask(bitmap, cliprect, code, color, flipx, flipy, sx, sy,
m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 0));
}
}
}
uint32_t gberetb_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0);
draw_sprites(bitmap, cliprect);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
// machine
/*************************************
*
* Interrupt generators
@ -205,7 +535,7 @@ TBP24S10.A12 - 256x4-bit bipolar PROM (possibly also a color PROM)
TIMER_DEVICE_CALLBACK_MEMBER(gberet_state::interrupt_tick)
{
uint8_t ticks_mask = ~m_interrupt_ticks & (m_interrupt_ticks + 1); // 0->1
uint8_t const ticks_mask = ~m_interrupt_ticks & (m_interrupt_ticks + 1); // 0->1
m_interrupt_ticks++;
// NMI on d0
@ -248,7 +578,7 @@ void mrgoemon_state::coin_counter_w(uint8_t data)
void gberet_state::flipscreen_w(uint8_t data)
{
// bits 0/1/2 = interrupt enable
uint8_t ack_mask = ~data & m_interrupt_mask; // 1->0
uint8_t const ack_mask = ~data & m_interrupt_mask; // 1->0
if (ack_mask & 1)
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
@ -428,30 +758,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 four bitplanes are packed in one nibble
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8 // every char takes 8 consecutive bytes
};
static const gfx_layout spritelayout =
{
16,16, // 16*16 sprites
512, // 512 sprites
4, // 4 bits per pixel
{ 0, 1, 2, 3 }, // the four bitplanes are packed in one nibble
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4,
32*8+0*4, 32*8+1*4, 32*8+2*4, 32*8+3*4, 32*8+4*4, 32*8+5*4, 32*8+6*4, 32*8+7*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
64*8+0*32, 64*8+1*32, 64*8+2*32, 64*8+3*32, 64*8+4*32, 64*8+5*32, 64*8+6*32, 64*8+7*32 },
128*8 // every sprite takes 128 consecutive bytes
};
static const gfx_layout gberetb_charlayout =
{
8,8, // 8*8 characters
@ -477,13 +783,13 @@ static const gfx_layout gberetb_spritelayout =
};
static GFXDECODE_START( gfx_gberet )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 16 )
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 16*16, 16 )
GFXDECODE_ENTRY( "tiles", 0, gfx_8x8x4_packed_msb, 0, 16 )
GFXDECODE_ENTRY( "sprites", 0, gfx_8x8x4_row_2x2_group_packed_msb, 16*16, 16 )
GFXDECODE_END
static GFXDECODE_START( gfx_gberetb )
GFXDECODE_ENTRY( "gfx1", 0, gberetb_charlayout, 0, 16 )
GFXDECODE_ENTRY( "gfx2", 0, gberetb_spritelayout, 16*16, 16 )
GFXDECODE_ENTRY( "tiles", 0, gberetb_charlayout, 0, 16 )
GFXDECODE_ENTRY( "sprites", 0, gberetb_spritelayout, 16*16, 16 )
GFXDECODE_END
@ -504,8 +810,8 @@ void mrgoemon_state::machine_start()
{
gberet_base_state::machine_start();
uint8_t *ROM = memregion("maincpu")->base();
m_mainbank->configure_entries(0, 8, &ROM[0xc000], 0x800);
uint8_t *rom = memregion("maincpu")->base();
m_mainbank->configure_entries(0, 8, &rom[0xc000], 0x800);
}
void gberet_state::machine_reset()
@ -588,10 +894,10 @@ ROM_START( gberet )
ROM_LOAD( "577l02.8c", 0x4000, 0x4000, CRC(240836a5) SHA1(b76f3789f152198bf8a9a366378d664e683c6c9d) )
ROM_LOAD( "577l01.7c", 0x8000, 0x4000, CRC(41fa3e1f) SHA1(90d1463e16b0f52c01078be044ce3672d4acebff) )
ROM_REGION( 0x04000, "gfx1", 0 )
ROM_REGION( 0x04000, "tiles", 0 )
ROM_LOAD( "577l07.3f", 0x00000, 0x4000, CRC(4da7bd1b) SHA1(54adba9ae086852902d78ab36039498aae50d7a9) )
ROM_REGION( 0x10000, "gfx2", 0 )
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "577l06.5e", 0x00000, 0x4000, CRC(0f1cb0ca) SHA1(094004e70c05df8cd486d0854c258fa766e2925d) )
ROM_LOAD( "577l05.4e", 0x04000, 0x4000, CRC(523a8b66) SHA1(5f2bcf2b702fe05f8a022b6284cb2d0a5b5f222f) )
ROM_LOAD( "577l08.4f", 0x08000, 0x4000, CRC(883933a4) SHA1(b565842edf09feeb2c4ac44ad58331757586b6aa) )
@ -609,10 +915,10 @@ ROM_START( rushatck )
ROM_LOAD( "577h02.8c", 0x4000, 0x4000, CRC(b5802806) SHA1(0e4698ecfb9eda916703165ea5d55516fdef5fe4) )
ROM_LOAD( "577h01.7c", 0x8000, 0x4000, CRC(da7c8f3d) SHA1(eb61eedee169f67db93407ad0fe8a195089b7e3a) )
ROM_REGION( 0x04000, "gfx1", 0 )
ROM_REGION( 0x04000, "tiles", 0 )
ROM_LOAD( "577h07.3f", 0x00000, 0x4000, CRC(03f9815f) SHA1(209c76fd36d1b5672992c55e24d3cf77d4c5a0aa) )
ROM_REGION( 0x10000, "gfx2", 0 )
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "577l06.5e", 0x00000, 0x4000, CRC(0f1cb0ca) SHA1(094004e70c05df8cd486d0854c258fa766e2925d) )
ROM_LOAD( "577h05.4e", 0x04000, 0x4000, CRC(9d028e8f) SHA1(4faa47152a6c1da0024bb03fbcf7baf0540e891e) )
ROM_LOAD( "577l08.4f", 0x08000, 0x4000, CRC(883933a4) SHA1(b565842edf09feeb2c4ac44ad58331757586b6aa) )
@ -629,10 +935,10 @@ ROM_START( gberetb )
ROM_LOAD( "2-ic82.10g", 0x0000, 0x8000, CRC(6d6fb494) SHA1(0d01c86ed7a8962ee3e1056a8d41584ad1406f0f) )
ROM_LOAD( "3-ic81.10f", 0x8000, 0x4000, CRC(f1520a0a) SHA1(227b2d2e1fc0e81ae02e663a3089e7399612e3cf) )
ROM_REGION( 0x04000, "gfx1", 0 )
ROM_REGION( 0x04000, "tiles", 0 )
ROM_LOAD( "1-ic92.12c", 0x00000, 0x4000, CRC(b0189c87) SHA1(29202978b07bf059b88bf206d8fafc80e0cdb6dc) )
ROM_REGION( 0x10000, "gfx2", 0 )
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "7-1c8.2b", 0x00000, 0x4000, CRC(86334522) SHA1(f2907d136dbfdb92cbd550524b4453755f6244b6) )
ROM_LOAD( "6-ic9.2c", 0x04000, 0x4000, CRC(bda50d3e) SHA1(c6f5a15270a69464e977926d056b31dcec8b41c3) )
ROM_LOAD( "5-ic10.2d", 0x08000, 0x4000, CRC(6a7b3881) SHA1(795bfb1fbc11ceac687b15e98574feb650e2f674) )
@ -654,10 +960,10 @@ ROM_START( mrgoemon )
ROM_LOAD( "621d01.10c", 0x00000, 0x8000, CRC(b2219c56) SHA1(274160be5dabbbfa61af71d92bddffbb56eadab6) )
ROM_LOAD( "621d02.12c", 0x08000, 0x8000, CRC(c3337a97) SHA1(6fd5f365b2624a37f252c202cd97877705b4a6c2) ) // 2nd half banked
ROM_REGION( 0x04000, "gfx1", 0 )
ROM_REGION( 0x04000, "tiles", 0 )
ROM_LOAD( "621a05.6d", 0x00000, 0x4000, CRC(f0a6dfc5) SHA1(395024ebfff550b0da393096483196fb1152a077) )
ROM_REGION( 0x10000, "gfx2", 0 )
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "621d03.4d", 0x00000, 0x8000, CRC(66f2b973) SHA1(7e906f258a5f4928f9615c6ea176efbca659b3a7) )
ROM_LOAD( "621d04.5d", 0x08000, 0x8000, CRC(47df6301) SHA1(e675c070e46993d3453c2ddadc49ec8b84cec854) )
@ -667,6 +973,8 @@ ROM_START( mrgoemon )
ROM_LOAD( "621a07.6f", 0x0120, 0x0100, CRC(3980acdc) SHA1(f4e0bd74bccd77b84096c38bc70cf488a42d9562) ) // sprites
ROM_END
} // anonymous namespace
/*************************************
*

View File

@ -1,136 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
/***************************************************************************
Green Beret
***************************************************************************/
#ifndef MAME_INCLUDES_GBERET_H
#define MAME_INCLUDES_GBERET_H
#pragma once
#include "machine/timer.h"
#include "sound/sn76496.h"
#include "emupal.h"
#include "tilemap.h"
class gberet_base_state : public driver_device
{
public:
gberet_base_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_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_sn(*this, "snsnd")
{ }
protected:
virtual void video_start() override;
// memory pointers
required_shared_ptr<uint8_t> m_colorram;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_spriteram;
// devices
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<sn76489a_device> m_sn;
// video-related
tilemap_t * m_bg_tilemap = nullptr;
// misc
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; // TODO: move down in gberet_state once the bootleg PROMs decoding is done
};
class gberet_state : public gberet_base_state
{
public:
gberet_state(const machine_config &mconfig, device_type type, const char *tag) :
gberet_base_state(mconfig, type, tag),
m_spriteram2(*this, "spriteram2"),
m_scrollram(*this, "scrollram"),
m_soundlatch(*this, "soundlatch")
{ }
void gberet(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
void prg_map(address_map &map);
private:
// memory pointers
required_shared_ptr<uint8_t> m_spriteram2;
required_shared_ptr<uint8_t> m_scrollram;
required_shared_ptr<uint8_t> m_soundlatch;
// video-related
uint8_t m_spritebank = 0U;
// misc
uint8_t m_interrupt_mask = 0U;
uint8_t m_interrupt_ticks = 0U;
void coin_counter_w(uint8_t data);
void flipscreen_w(uint8_t data);
void sound_w(uint8_t data);
void scroll_w(offs_t offset, uint8_t data);
void sprite_bank_w(uint8_t data);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(interrupt_tick);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
};
class mrgoemon_state : public gberet_state
{
public:
mrgoemon_state(const machine_config &mconfig, device_type type, const char *tag) :
gberet_state(mconfig, type, tag),
m_mainbank(*this, "mainbank")
{ }
void mrgoemon(machine_config &config);
protected:
virtual void machine_start() override;
private:
// memory pointers
required_memory_bank m_mainbank;
void coin_counter_w(uint8_t data);
void prg_map(address_map &map);
};
class gberetb_state : public gberet_base_state
{
public:
gberetb_state(const machine_config &mconfig, device_type type, const char *tag) :
gberet_base_state(mconfig, type, tag)
{ }
void gberetb(machine_config &config);
private:
void flipscreen_w(uint8_t data);
uint8_t irq_ack_r();
void nmi_ack_w(uint8_t data);
void scroll_w(offs_t offset, uint8_t data);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void prg_map(address_map &map);
};
#endif // MAME_INCLUDES_GBERET_H

View File

@ -1,205 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
#include "emu.h"
#include "gberet.h"
/***************************************************************************
Convert the color PROMs into a more useable format.
Green Beret has a 32 bytes palette PROM and two 256 bytes color lookup table
PROMs (one for sprites, one for characters).
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 gberet_base_state::palette(palette_device &palette) const
{
uint8_t const *color_prom = memregion("proms")->base();
// create a lookup table for the palette
for (int i = 0; i < 0x20; i++)
{
// red component
int bit0 = BIT(color_prom[i], 0);
int bit1 = BIT(color_prom[i], 1);
int 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;
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
palette.set_pen_indirect(i, ctabentry);
}
for (int i = 0x100; i < 0x200; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry);
}
}
void gberet_base_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void gberet_base_state::colorram_w(offs_t offset, uint8_t data)
{
m_colorram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void gberet_state::scroll_w(offs_t offset, uint8_t data)
{
m_scrollram[offset] = data;
int scroll = m_scrollram[offset & 0x1f] | (m_scrollram[offset | 0x20] << 8);
m_bg_tilemap->set_scrollx(offset & 0x1f, scroll);
}
void gberet_state::sprite_bank_w(uint8_t data)
{
m_spritebank = data;
}
TILE_GET_INFO_MEMBER(gberet_base_state::get_bg_tile_info)
{
int attr = m_colorram[tile_index];
int code = m_videoram[tile_index] + ((attr & 0x40) << 2);
int color = attr & 0x0f;
int flags = TILE_FLIPYX((attr & 0x30) >> 4);
tileinfo.group = color;
tileinfo.category = (attr & 0x80) >> 7;
tileinfo.set(0, code, color, flags);
}
void gberet_base_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gberet_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_bg_tilemap->configure_groups(*m_gfxdecode->gfx(0), 0x10);
m_bg_tilemap->set_scroll_rows(32);
}
void gberet_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
uint8_t *sr;
if (m_spritebank & 0x08)
sr = m_spriteram2;
else
sr = m_spriteram;
for (int offs = 0; offs < 0xc0; offs += 4)
{
if (sr[offs + 3])
{
int attr = sr[offs + 1];
int code = sr[offs + 0] + ((attr & 0x40) << 2);
int color = attr & 0x0f;
int sx = sr[offs + 2] - 2 * (attr & 0x80);
int sy = sr[offs + 3];
int flipx = attr & 0x10;
int flipy = attr & 0x20;
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->transmask(bitmap,cliprect, code, color, flipx, flipy, sx, sy,
m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 0));
}
}
}
uint32_t gberet_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0);
draw_sprites(bitmap, cliprect);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
// Green Beret (bootleg)
void gberetb_state::scroll_w(offs_t offset, uint8_t data)
{
int scroll = data;
if (offset)
scroll |= 0x100;
for (offset = 6; offset < 29; offset++)
m_bg_tilemap->set_scrollx(offset, scroll + 64 - 8);
}
void gberetb_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
for (int offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4)
{
if (m_spriteram[offs + 1])
{
int attr = m_spriteram[offs + 3];
int code = m_spriteram[offs] + ((attr & 0x40) << 2);
int color = attr & 0x0f;
int sx = m_spriteram[offs + 2] - 2 * (attr & 0x80);
int sy = 240 - m_spriteram[offs + 1];
int flipx = attr & 0x10;
int flipy = attr & 0x20;
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->transmask(bitmap,cliprect, code, color, flipx, flipy, sx, sy,
m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 0));
}
}
}
uint32_t gberetb_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0);
draw_sprites(bitmap, cliprect);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}

View File

@ -1,5 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria, Couriersud
// copyright-holders: Nicola Salmoria, Couriersud
/***************************************************************************
Gyruss memory map (preliminary)
@ -58,37 +59,270 @@ and 1 SFX channel controlled by an 8039:
***************************************************************************/
#include "emu.h"
#include "gyruss.h"
#include "konami1.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 "konami1.h"
#include "sound/ay8910.h"
#include "sound/discrete.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)
// configurable logging
#define LOG_FILTER (1U << 1)
// Video timing
// PCB measured: H = 15.50khz V = 60.56hz, +/- 0.01hz
// --> VTOTAL should be OK, HTOTAL not 100% certain
#define PIXEL_CLOCK MASTER_CLOCK/3
//#define VERBOSE (LOG_GENERAL | LOG_FILTER)
#define HTOTAL 396
#define HBEND 0
#define HBSTART 256
#include "logmacro.h"
#define VTOTAL 256
#define VBEND 0+2*8
#define VBSTART 224+2*8
#define LOGFILTER(...) LOGMASKED(LOG_FILTER, __VA_ARGS__)
namespace {
class gyruss_state : public driver_device
{
public:
gyruss_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_subcpu(*this, "sub"),
m_audiocpu(*this, "audiocpu"),
m_audiocpu_2(*this, "audio2"),
m_discrete(*this, "discrete"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette"),
m_colorram(*this, "colorram"),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram")
{ }
void gyruss(machine_config &config);
void init_gyruss();
protected:
virtual void machine_start() override;
virtual void video_start() override;
private:
// devices
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_subcpu;
required_device<cpu_device> m_audiocpu;
required_device<i8039_device> m_audiocpu_2;
required_device<discrete_sound_device> m_discrete;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
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;
tilemap_t *m_tilemap = nullptr;
uint8_t m_master_nmi_mask = 0U;
uint8_t m_slave_irq_mask = 0U;
bool m_flipscreen = false;
void irq_clear_w(uint8_t data);
void sh_irqtrigger_w(uint8_t data);
void i8039_irq_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(master_nmi_mask_w);
void slave_irq_mask_w(uint8_t data);
template <uint8_t Which> DECLARE_WRITE_LINE_MEMBER(coin_counter_w);
void spriteram_w(offs_t offset, uint8_t data);
uint8_t scanline_r();
DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
uint8_t porta_r();
void dac_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_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);
template <uint8_t Which> void filter_w(uint8_t data);
void audio_cpu1_io_map(address_map &map);
void audio_cpu1_map(address_map &map);
void audio_cpu2_io_map(address_map &map);
void audio_cpu2_map(address_map &map);
void main_cpu1_map(address_map &map);
void main_cpu2_map(address_map &map);
};
// video
/***************************************************************************
Convert the color PROMs into a more useable format.
Gyruss 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 gyruss_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 weights_rg[3], weights_b[2];
compute_resistor_weights(0, 255, -1.0,
3, resistances_rg, weights_rg, 470, 0,
2, resistances_b, weights_b, 470, 0,
0, nullptr, nullptr, 0, 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(weights_rg, 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(weights_rg, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
int const b = combine_weights(weights_b, 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 += 32;
// sprites map to the lower 16 palette entries
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry);
}
// characters map to the upper 16 palette entries
for (int i = 0x100; i < 0x140; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry | 0x10);
}
}
void gyruss_state::spriteram_w(offs_t offset, uint8_t data)
{
// m_screen->update_now();
m_screen->update_partial(m_screen->vpos());
m_spriteram[offset] = data;
}
TILE_GET_INFO_MEMBER(gyruss_state::get_tile_info)
{
int const code = ((m_colorram[tile_index] & 0x20) << 3) | m_videoram[tile_index];
int const color = m_colorram[tile_index] & 0x0f;
int const flags = TILE_FLIPYX(m_colorram[tile_index] >> 6);
tileinfo.group = (m_colorram[tile_index] & 0x10) ? 0 : 1;
tileinfo.set(2, code, color, flags);
}
void gyruss_state::video_start()
{
m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gyruss_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_tilemap->set_transmask(0, 0x00, 0); // opaque
m_tilemap->set_transmask(1, 0x0f, 0); // transparent
save_item(NAME(m_flipscreen));
}
uint8_t gyruss_state::scanline_r()
{
// reads 1V - 128V
return m_screen->vpos();
}
WRITE_LINE_MEMBER(gyruss_state::flipscreen_w)
{
m_flipscreen = state;
}
void gyruss_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int offs = 0xbc; offs >= 0; offs -= 4)
{
int const x = m_spriteram[offs];
int const y = 241 - m_spriteram[offs + 3];
int const gfx_bank = m_spriteram[offs + 1] & 0x01;
int const code = ((m_spriteram[offs + 2] & 0x20) << 2) | (m_spriteram[offs + 1] >> 1);
int const color = 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(gfx_bank)->transpen(bitmap, cliprect, code, color, flip_x, flip_y, x, y, 0);
}
}
uint32_t gyruss_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
if (cliprect.min_y == screen.visible_area().min_y)
{
machine().tilemap().mark_all_dirty();
machine().tilemap().set_flip_all(m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0);
}
m_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
draw_sprites(bitmap, cliprect);
m_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
// machine
/* The timer clock which feeds the upper 4 bits of */
/* AY-3-8910 port A is based on the same clock */
/* feeding the sound CPU Z80. It is a divide by */
@ -106,57 +340,47 @@ and 1 SFX channel controlled by an 8039:
/* Bit 3 comes from the QA output of the LS90 producing a sequence of */
/* 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 */
static const int gyruss_timer[10] =
static const int timer[10] =
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x09, 0x0a, 0x0b, 0x0a, 0x0d
};
uint8_t gyruss_state::gyruss_portA_r()
uint8_t gyruss_state::porta_r()
{
return gyruss_timer[(m_audiocpu->total_cycles() / 1024) % 10];
return timer[(m_audiocpu->total_cycles() / 1024) % 10];
}
void gyruss_state::gyruss_dac_w(uint8_t data)
void gyruss_state::dac_w(uint8_t data)
{
m_discrete->write(NODE(16), data);
}
void gyruss_state::gyruss_irq_clear_w(uint8_t data)
void gyruss_state::irq_clear_w(uint8_t data)
{
m_audiocpu_2->set_input_line(0, CLEAR_LINE);
}
void gyruss_state::filter_w(int chip, int data )
template <uint8_t Which>
void gyruss_state::filter_w(uint8_t data)
{
//printf("chip %d - %02x\n", chip, data);
LOGFILTER("chip %d - %02x\n", Which, data);
for (int i = 0; i < 3; i++)
{
/* low bit: 47000pF = 0.047uF */
/* high bit: 220000pF = 0.22uF */
m_discrete->write(NODE(3 * chip + i + 21), data & 3);
// low bit: 47000pF = 0.047uF
// high bit: 220000pF = 0.22uF
m_discrete->write(NODE(3 * Which + i + 21), data & 3);
data >>= 2;
}
}
void gyruss_state::gyruss_filter0_w(uint8_t data)
void gyruss_state::sh_irqtrigger_w(uint8_t data)
{
filter_w(0, data);
}
void gyruss_state::gyruss_filter1_w(uint8_t data)
{
filter_w(1, data);
}
void gyruss_state::gyruss_sh_irqtrigger_w(uint8_t data)
{
/* writing to this register triggers IRQ on the sound CPU */
// writing to this register triggers IRQ on the sound CPU
m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80
}
void gyruss_state::gyruss_i8039_irq_w(uint8_t data)
void gyruss_state::i8039_irq_w(uint8_t data)
{
m_audiocpu_2->set_input_line(0, ASSERT_LINE);
}
@ -175,25 +399,21 @@ void gyruss_state::slave_irq_mask_w(uint8_t data)
m_subcpu->set_input_line(0, CLEAR_LINE);
}
WRITE_LINE_MEMBER(gyruss_state::coin_counter_1_w)
template <uint8_t Which>
WRITE_LINE_MEMBER(gyruss_state::coin_counter_w)
{
machine().bookkeeping().coin_counter_w(0, state);
}
WRITE_LINE_MEMBER(gyruss_state::coin_counter_2_w)
{
machine().bookkeeping().coin_counter_w(1, state);
machine().bookkeeping().coin_counter_w(Which, state);
}
void gyruss_state::main_cpu1_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x83ff).ram().share("colorram");
map(0x8400, 0x87ff).ram().share("videoram");
map(0x8000, 0x83ff).ram().share(m_colorram);
map(0x8400, 0x87ff).ram().share(m_videoram);
map(0x9000, 0x9fff).ram();
map(0xa000, 0xa7ff).ram().share("share1");
map(0xc000, 0xc000).portr("DSW2").nopw(); /* watchdog reset */
map(0xc080, 0xc080).portr("SYSTEM").w(FUNC(gyruss_state::gyruss_sh_irqtrigger_w));
map(0xa000, 0xa7ff).ram().share("main_cpus");
map(0xc000, 0xc000).portr("DSW2").nopw(); // watchdog reset
map(0xc080, 0xc080).portr("SYSTEM").w(FUNC(gyruss_state::sh_irqtrigger_w));
map(0xc0a0, 0xc0a0).portr("P1");
map(0xc0c0, 0xc0c0).portr("P2");
map(0xc0e0, 0xc0e0).portr("DSW1");
@ -203,12 +423,12 @@ void gyruss_state::main_cpu1_map(address_map &map)
void gyruss_state::main_cpu2_map(address_map &map)
{
map(0x0000, 0x0000).r(FUNC(gyruss_state::gyruss_scanline_r));
map(0x0000, 0x0000).r(FUNC(gyruss_state::scanline_r));
map(0x2000, 0x2000).w(FUNC(gyruss_state::slave_irq_mask_w)).nopr();
map(0x4000, 0x403f).ram();
map(0x4040, 0x40ff).ram().w(FUNC(gyruss_state::gyruss_spriteram_w)).share("spriteram");
map(0x4040, 0x40ff).ram().w(FUNC(gyruss_state::spriteram_w)).share(m_spriteram);
map(0x4100, 0x47ff).ram();
map(0x6000, 0x67ff).ram().share("share1");
map(0x6000, 0x67ff).ram().share("main_cpus");
map(0xe000, 0xffff).rom();
}
@ -237,7 +457,7 @@ void gyruss_state::audio_cpu1_io_map(address_map &map)
map(0x10, 0x10).w("ay5", FUNC(ay8910_device::address_w));
map(0x11, 0x11).r("ay5", FUNC(ay8910_device::data_r));
map(0x12, 0x12).w("ay5", FUNC(ay8910_device::data_w));
map(0x14, 0x14).w(FUNC(gyruss_state::gyruss_i8039_irq_w));
map(0x14, 0x14).w(FUNC(gyruss_state::i8039_irq_w));
map(0x18, 0x18).w("soundlatch2", FUNC(generic_latch_8_device::write));
}
@ -267,7 +487,7 @@ static INPUT_PORTS_START( gyruss )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_2WAY
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_2WAY
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* 1p shoot 2 - unused */
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // 1p shoot 2 - unused
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
@ -277,7 +497,7 @@ static INPUT_PORTS_START( gyruss )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_2WAY PORT_COCKTAIL
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_2WAY PORT_COCKTAIL
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* 2p shoot 2 - unused */
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // 2p shoot 2 - unused
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
@ -293,9 +513,9 @@ static INPUT_PORTS_START( gyruss )
PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3")
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") /* tables at 0x1653 (15 bytes) or 0x4bf3 (13 bytes) */
PORT_DIPSETTING( 0x08, "30k 90k 60k+" ) /* last bonus life at 810k : max. 14 bonus lives */
PORT_DIPSETTING( 0x00, "40k 110k 70k+" ) /* last bonus life at 810k : max. 12 bonus lives */
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") // tables at 0x1653 (15 bytes) or 0x4bf3 (13 bytes)
PORT_DIPSETTING( 0x08, "30k 90k 60k+" ) // last bonus life at 810k : max. 14 bonus lives
PORT_DIPSETTING( 0x00, "40k 110k 70k+" ) // last bonus life at 810k : max. 12 bonus lives
PORT_DIPNAME( 0x70, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6,7")
PORT_DIPSETTING( 0x70, "1 (Easiest)" )
PORT_DIPSETTING( 0x60, "2" )
@ -320,10 +540,10 @@ static INPUT_PORTS_START( gyrussce )
PORT_INCLUDE( gyruss )
PORT_MODIFY("DSW2")
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") /* tables at 0x1653 (15 bytes) or 0x4bf3 (13 bytes) */
PORT_DIPSETTING( 0x08, "50k 120k 70k+" ) /* last bonus life at 960k : max. 14 bonus lives */
PORT_DIPSETTING( 0x00, "60k 140k 80k+" ) /* last bonus life at 940k : max. 12 bonus lives */
PORT_DIPNAME( 0x70, 0x20, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6,7") /* "Difficult" default setting according to Centuri manual */
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") // tables at 0x1653 (15 bytes) or 0x4bf3 (13 bytes)
PORT_DIPSETTING( 0x08, "50k 120k 70k+" ) // last bonus life at 960k : max. 14 bonus lives
PORT_DIPSETTING( 0x00, "60k 140k 80k+" ) // last bonus life at 940k : max. 12 bonus lives
PORT_DIPNAME( 0x70, 0x20, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6,7") // "Difficult" default setting according to Centuri manual
PORT_DIPSETTING( 0x70, "1 (Easiest)" )
PORT_DIPSETTING( 0x60, "2" )
PORT_DIPSETTING( 0x50, "3" )
@ -337,67 +557,67 @@ INPUT_PORTS_END
static const gfx_layout charlayout =
{
8,8, /* 8*8 characters */
512, /* 512 characters */
2, /* 2 bits per pixel */
8,8, // 8*8 characters
512, // 512 characters
2, // 2 bits per pixel
{ 4, 0 },
{ 0, 1, 2, 3, 8*8+0,8*8+1,8*8+2,8*8+3 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
16*8 /* every char takes 16 consecutive bytes */
16*8 // every char takes 16 consecutive bytes
};
static const gfx_layout spritelayout =
{
8,16, /* 8*16 sprites */
256, /* 256 sprites */
4, /* 4 bits per pixel */
8,16, // 8*16 sprites
256, // 256 sprites
4, // 4 bits per pixel
{ 0x4000*8+4, 0x4000*8+0, 4, 0 },
{ 0, 1, 2, 3, 8*8, 8*8+1, 8*8+2, 8*8+3 },
{ 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 },
64*8 /* every sprite takes 64 consecutive bytes */
64*8 // every sprite takes 64 consecutive bytes
};
static GFXDECODE_START( gfx_gyruss )
GFXDECODE_ENTRY( "gfx1", 0x0000, spritelayout, 0, 16 ) /* upper half */
GFXDECODE_ENTRY( "gfx1", 0x0010, spritelayout, 0, 16 ) /* lower half */
GFXDECODE_ENTRY( "gfx2", 0x0000, charlayout, 16*16, 16 )
GFXDECODE_ENTRY( "sprites", 0x0000, spritelayout, 0, 16 ) // upper half
GFXDECODE_ENTRY( "sprites", 0x0010, spritelayout, 0, 16 ) // lower half
GFXDECODE_ENTRY( "tiles", 0x0000, charlayout, 16*16, 16 )
GFXDECODE_END
static const discrete_mixer_desc konami_right_mixer_desc =
{DISC_MIXER_IS_RESISTOR,
{RES_K(2.2), RES_K(2.2), RES_K(2.2), RES_K(3.3)/3, RES_K(3.3)/3 },
{0,0,0,0,0,0}, /* no variable resistors */
{0,0,0,0,0,0}, /* no node capacitors */
{0,0,0,0,0,0}, // no variable resistors
{0,0,0,0,0,0}, // no node capacitors
0, 200,
CAP_U(0.1),
CAP_U(1), /* DC - Removal, not in schematics */
CAP_U(1), // DC - Removal, not in schematics
0, 1};
static const discrete_mixer_desc konami_left_mixer_desc =
{DISC_MIXER_IS_RESISTOR,
{RES_K(2.2), RES_K(2.2), RES_K(2.2), RES_K(3.3)/3, RES_K(4.7) },
{0,0,0,0,0,0}, /* no variable resistors */
{0,0,0,0,0,0}, /* no node capacitors */
{0,0,0,0,0,0}, // no variable resistors
{0,0,0,0,0,0}, // no node capacitors
0, 200,
CAP_U(0.1),
CAP_U(1), /* DC - Removal, not in schematics */
CAP_U(1), // DC - Removal, not in schematics
0, 1};
static DISCRETE_SOUND_START( gyruss_sound_discrete )
static DISCRETE_SOUND_START( sound_discrete )
/* Chip 1 right */
// Chip 1 right
DISCRETE_INPUTX_STREAM(NODE_01, 0, 1.0, 0)
DISCRETE_INPUTX_STREAM(NODE_02, 1, 1.0, 0)
DISCRETE_INPUTX_STREAM(NODE_03, 2, 1.0, 0)
/* Chip 2 left */
// Chip 2 left
DISCRETE_INPUTX_STREAM(NODE_04, 3, 1.0, 0)
DISCRETE_INPUTX_STREAM(NODE_05, 4, 1.0, 0)
DISCRETE_INPUTX_STREAM(NODE_06, 5, 1.0, 0)
/* Chip 3 right */
// Chip 3 right
/* Outputs are tied together after 3.3k resistor on each channel.
* A/R + B/R + C/R = (A + B + C) / 3 * (1/(R/3))
*/
@ -405,51 +625,51 @@ static DISCRETE_SOUND_START( gyruss_sound_discrete )
DISCRETE_INPUTX_STREAM(NODE_08, 7, 0.33, 0)
DISCRETE_INPUTX_STREAM(NODE_09, 8, 0.33, 0)
/* Chip 4 right */
// Chip 4 right
DISCRETE_INPUTX_STREAM(NODE_10, 9, 0.33, 0)
DISCRETE_INPUTX_STREAM(NODE_11,10, 0.33, 0)
DISCRETE_INPUTX_STREAM(NODE_12,11, 0.33, 0)
/* Chip 5 left */
// Chip 5 left
DISCRETE_INPUTX_STREAM(NODE_13,12, 0.33, 0)
DISCRETE_INPUTX_STREAM(NODE_14,13, 0.33, 0)
DISCRETE_INPUTX_STREAM(NODE_15,14, 0.33, 0)
/* DAC left */
// DAC left
/* Output voltage depends on load. Datasheet gives 2.4 as minimum.
* This is in line with TTL, so 4V with no load seems adequate */
DISCRETE_INPUTX_DATA(NODE_16, 256.0 * 4.0 / 5.0, 0.0, 0.0)
/* Chip 1 Filter enable */
// Chip 1 Filter enable
DISCRETE_INPUT_DATA(NODE_21)
DISCRETE_INPUT_DATA(NODE_22)
DISCRETE_INPUT_DATA(NODE_23)
/* Chip 2 Filter enable */
// Chip 2 Filter enable
DISCRETE_INPUT_DATA(NODE_24)
DISCRETE_INPUT_DATA(NODE_25)
DISCRETE_INPUT_DATA(NODE_26)
/* Chip 1 Filter */
// Chip 1 Filter
DISCRETE_RCFILTER_SW(NODE_31, 1, NODE_01, NODE_21, AY8910_INTERNAL_RESISTANCE+1000, CAP_U(0.047), CAP_U(0.22), 0, 0)
DISCRETE_RCFILTER_SW(NODE_32, 1, NODE_02, NODE_22, AY8910_INTERNAL_RESISTANCE+1000, CAP_U(0.047), CAP_U(0.22), 0, 0)
DISCRETE_RCFILTER_SW(NODE_33, 1, NODE_03, NODE_23, AY8910_INTERNAL_RESISTANCE+1000, CAP_U(0.047), CAP_U(0.22), 0, 0)
/* Chip 2 Filter */
// Chip 2 Filter
DISCRETE_RCFILTER_SW(NODE_34, 1, NODE_04, NODE_24, AY8910_INTERNAL_RESISTANCE+1000, CAP_U(0.047), CAP_U(0.22), 0, 0)
DISCRETE_RCFILTER_SW(NODE_35, 1, NODE_05, NODE_25, AY8910_INTERNAL_RESISTANCE+1000, CAP_U(0.047), CAP_U(0.22), 0, 0)
DISCRETE_RCFILTER_SW(NODE_36, 1, NODE_06, NODE_26, AY8910_INTERNAL_RESISTANCE+1000, CAP_U(0.047), CAP_U(0.22), 0, 0)
/* Chip 3 */
// Chip 3
DISCRETE_ADDER3(NODE_40, 1, NODE_07, NODE_08, NODE_09)
/* Chip 4 */
// Chip 4
DISCRETE_ADDER3(NODE_41, 1, NODE_10, NODE_11, NODE_12)
/* Chip 5 */
// Chip 5
DISCRETE_ADDER3(NODE_42, 1, NODE_13, NODE_14, NODE_15)
/* right channel */
// right channel
DISCRETE_MIXER5(NODE_50, 1, NODE_31, NODE_32, NODE_33, NODE_40, NODE_41, &konami_right_mixer_desc)
/* left channel */
// left channel
DISCRETE_MIXER5(NODE_51, 1, NODE_34, NODE_35, NODE_36, NODE_42, NODE_16, &konami_left_mixer_desc)
DISCRETE_OUTPUT(NODE_50, 11.0)
@ -475,87 +695,103 @@ WRITE_LINE_MEMBER(gyruss_state::vblank_irq)
void gyruss_state::gyruss(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, MASTER_CLOCK/6); /* 3.072 MHz */
static constexpr XTAL MASTER_CLOCK = XTAL(18'432'000);
static constexpr XTAL SOUND_CLOCK = XTAL(14'318'181);
// Video timing
// PCB measured: H = 15.50khz V = 60.56hz, +/- 0.01hz
// --> VTOTAL should be OK, HTOTAL not 100% certain
static constexpr XTAL PIXEL_CLOCK = MASTER_CLOCK / 3;
static constexpr int HTOTAL = 396;
static constexpr int HBEND = 0;
static constexpr int HBSTART = 256;
static constexpr int VTOTAL = 256;
static constexpr int VBEND = 0+2*8;
static constexpr int VBSTART = 224+2*8;
// basic machine hardware
Z80(config, m_maincpu, MASTER_CLOCK / 6); // 3.072 MHz
m_maincpu->set_addrmap(AS_PROGRAM, &gyruss_state::main_cpu1_map);
KONAMI1(config, m_subcpu, MASTER_CLOCK/12); /* 1.536 MHz */
KONAMI1(config, m_subcpu, MASTER_CLOCK / 12); // 1.536 MHz
m_subcpu->set_addrmap(AS_PROGRAM, &gyruss_state::main_cpu2_map);
Z80(config, m_audiocpu, SOUND_CLOCK/4); /* 3.579545 MHz */
Z80(config, m_audiocpu, SOUND_CLOCK / 4); // 3.579545 MHz
m_audiocpu->set_addrmap(AS_PROGRAM, &gyruss_state::audio_cpu1_map);
m_audiocpu->set_addrmap(AS_IO, &gyruss_state::audio_cpu1_io_map);
I8039(config, m_audiocpu_2, XTAL(8'000'000));
m_audiocpu_2->set_addrmap(AS_PROGRAM, &gyruss_state::audio_cpu2_map);
m_audiocpu_2->set_addrmap(AS_IO, &gyruss_state::audio_cpu2_io_map);
m_audiocpu_2->p1_out_cb().set(FUNC(gyruss_state::gyruss_dac_w));
m_audiocpu_2->p2_out_cb().set(FUNC(gyruss_state::gyruss_irq_clear_w));
m_audiocpu_2->p1_out_cb().set(FUNC(gyruss_state::dac_w));
m_audiocpu_2->p2_out_cb().set(FUNC(gyruss_state::irq_clear_w));
config.set_maximum_quantum(attotime::from_hz(6000));
ls259_device &mainlatch(LS259(config, "mainlatch")); // 3C
mainlatch.q_out_cb<0>().set(FUNC(gyruss_state::master_nmi_mask_w));
mainlatch.q_out_cb<2>().set(FUNC(gyruss_state::coin_counter_1_w));
mainlatch.q_out_cb<3>().set(FUNC(gyruss_state::coin_counter_2_w));
mainlatch.q_out_cb<2>().set(FUNC(gyruss_state::coin_counter_w<0>));
mainlatch.q_out_cb<3>().set(FUNC(gyruss_state::coin_counter_w<1>));
mainlatch.q_out_cb<5>().set(FUNC(gyruss_state::flipscreen_w));
/* video hardware */
// video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
m_screen->set_screen_update(FUNC(gyruss_state::screen_update_gyruss));
m_screen->set_screen_update(FUNC(gyruss_state::screen_update));
m_screen->set_palette(m_palette);
m_screen->screen_vblank().set(FUNC(gyruss_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gyruss);
PALETTE(config, m_palette, FUNC(gyruss_state::gyruss_palette), 16*4+16*16, 32);
PALETTE(config, m_palette, FUNC(gyruss_state::palette), 16*4+16*16, 32);
/* sound hardware */
// sound hardware
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
GENERIC_LATCH_8(config, "soundlatch");
GENERIC_LATCH_8(config, "soundlatch2");
ay8910_device &ay1(AY8910(config, "ay1", SOUND_CLOCK/8));
ay8910_device &ay1(AY8910(config, "ay1", SOUND_CLOCK / 8));
ay1.set_flags(AY8910_DISCRETE_OUTPUT);
ay1.set_resistors_load(RES_K(3.3), RES_K(3.3), RES_K(3.3));
ay1.port_b_write_callback().set(FUNC(gyruss_state::gyruss_filter0_w));
ay1.port_b_write_callback().set(FUNC(gyruss_state::filter_w<0>));
ay1.add_route(0, "discrete", 1.0, 0);
ay1.add_route(1, "discrete", 1.0, 1);
ay1.add_route(2, "discrete", 1.0, 2);
ay8910_device &ay2(AY8910(config, "ay2", SOUND_CLOCK/8));
ay8910_device &ay2(AY8910(config, "ay2", SOUND_CLOCK / 8));
ay2.set_flags(AY8910_DISCRETE_OUTPUT);
ay2.set_resistors_load(RES_K(3.3), RES_K(3.3), RES_K(3.3));
ay2.port_b_write_callback().set(FUNC(gyruss_state::gyruss_filter1_w));
ay2.port_b_write_callback().set(FUNC(gyruss_state::filter_w<1>));
ay2.add_route(0, "discrete", 1.0, 3);
ay2.add_route(1, "discrete", 1.0, 4);
ay2.add_route(2, "discrete", 1.0, 5);
ay8910_device &ay3(AY8910(config, "ay3", SOUND_CLOCK/8));
ay8910_device &ay3(AY8910(config, "ay3", SOUND_CLOCK / 8));
ay3.set_flags(AY8910_DISCRETE_OUTPUT);
ay3.set_resistors_load(RES_K(3.3), RES_K(3.3), RES_K(3.3));
ay3.port_a_read_callback().set(FUNC(gyruss_state::gyruss_portA_r));
ay3.port_a_read_callback().set(FUNC(gyruss_state::porta_r));
ay3.add_route(0, "discrete", 1.0, 6);
ay3.add_route(1, "discrete", 1.0, 7);
ay3.add_route(2, "discrete", 1.0, 8);
ay8910_device &ay4(AY8910(config, "ay4", SOUND_CLOCK/8));
ay8910_device &ay4(AY8910(config, "ay4", SOUND_CLOCK / 8));
ay4.set_flags(AY8910_DISCRETE_OUTPUT);
ay4.set_resistors_load(RES_K(3.3), RES_K(3.3), RES_K(3.3));
ay4.add_route(0, "discrete", 1.0, 9);
ay4.add_route(1, "discrete", 1.0, 10);
ay4.add_route(2, "discrete", 1.0, 11);
ay8910_device &ay5(AY8910(config, "ay5", SOUND_CLOCK/8));
ay8910_device &ay5(AY8910(config, "ay5", SOUND_CLOCK / 8));
ay5.set_flags(AY8910_DISCRETE_OUTPUT);
ay5.set_resistors_load(RES_K(3.3), RES_K(3.3), RES_K(3.3));
ay5.add_route(0, "discrete", 1.0, 12);
ay5.add_route(1, "discrete", 1.0, 13);
ay5.add_route(2, "discrete", 1.0, 14);
DISCRETE(config, m_discrete, gyruss_sound_discrete);
DISCRETE(config, m_discrete, sound_discrete);
m_discrete->add_route(0, "rspeaker", 1.0);
m_discrete->add_route(1, "lspeaker", 1.0);
}
@ -587,22 +823,22 @@ ROM_START( gyruss )
ROM_LOAD( "gyrussk.2a", 0x2000, 0x2000, CRC(ba498115) SHA1(9cd1f42898cc590f39ba7cb3c975b0b3d3062eba) )
// 4000-5fff: Empty socket, not populated
ROM_REGION( 0x1000, "audio2", 0 ) /* 8039 */
ROM_REGION( 0x1000, "audio2", 0 ) // 8039
ROM_LOAD( "gyrussk.3a", 0x0000, 0x1000, CRC(3f9b5dea) SHA1(6e807da02c2885b18e8cc2199f12f6be9040bf75) )
ROM_REGION( 0x8000, "gfx1", 0 )
ROM_REGION( 0x8000, "sprites", 0 )
ROM_LOAD( "gyrussk.6", 0x0000, 0x2000, CRC(c949db10) SHA1(fcb8bcbd2bdd751fecb322a33c8a92fb6f07a7ab) )
ROM_LOAD( "gyrussk.5", 0x2000, 0x2000, CRC(4f22411a) SHA1(763bcd039f8c1838a0d7da7d4dadc14a26e25596) )
ROM_LOAD( "gyrussk.8", 0x4000, 0x2000, CRC(47cd1fbc) SHA1(8203c4ff0b1cd7b4dbc708e300bfeac1e7366e09) )
ROM_LOAD( "gyrussk.7", 0x6000, 0x2000, CRC(8e8d388c) SHA1(8f2928d71c02aba977d67575d6e34d69bda2b9d4) )
ROM_REGION( 0x2000, "gfx2", 0 )
ROM_REGION( 0x2000, "tiles", 0 )
ROM_LOAD( "gyrussk.4", 0x0000, 0x2000, CRC(27d8329b) SHA1(564ff945465a23d93a93137ad277298770dfa06a) )
ROM_REGION( 0x0220, "proms", 0 )
ROM_LOAD( "gyrussk.pr3", 0x0000, 0x0020, CRC(98782db3) SHA1(b891e43b25187faca8002919ccb44d744daa3594) ) /* palette */
ROM_LOAD( "gyrussk.pr1", 0x0020, 0x0100, CRC(7ed057de) SHA1(c04069ae1e2c62f9b3048844cd8cf5e1b03b7d3c) ) /* sprite lookup table */
ROM_LOAD( "gyrussk.pr2", 0x0120, 0x0100, CRC(de823a81) SHA1(1af94b2a6a319a89b238a5076a2867f1cfd279b0) ) /* character lookup table */
ROM_LOAD( "gyrussk.pr3", 0x0000, 0x0020, CRC(98782db3) SHA1(b891e43b25187faca8002919ccb44d744daa3594) ) // palette
ROM_LOAD( "gyrussk.pr1", 0x0020, 0x0100, CRC(7ed057de) SHA1(c04069ae1e2c62f9b3048844cd8cf5e1b03b7d3c) ) // sprite lookup table
ROM_LOAD( "gyrussk.pr2", 0x0120, 0x0100, CRC(de823a81) SHA1(1af94b2a6a319a89b238a5076a2867f1cfd279b0) ) // character lookup table
ROM_END
ROM_START( gyrussce )
@ -625,25 +861,25 @@ ROM_START( gyrussce )
ROM_LOAD( "gy-12.8a", 0x2000, 0x2000, CRC(ba498115) SHA1(9cd1f42898cc590f39ba7cb3c975b0b3d3062eba) )
// 4000-5fff: Empty socket, not populated
ROM_REGION( 0x1000, "audio2", 0 ) /* 8039 */
ROM_REGION( 0x1000, "audio2", 0 ) // 8039
ROM_LOAD( "gy-13.11h", 0x0000, 0x1000, CRC(3f9b5dea) SHA1(6e807da02c2885b18e8cc2199f12f6be9040bf75) )
ROM_REGION( 0x8000, "gfx1", 0 )
ROM_REGION( 0x8000, "sprites", 0 )
ROM_LOAD( "gy-10.9d", 0x0000, 0x2000, CRC(c949db10) SHA1(fcb8bcbd2bdd751fecb322a33c8a92fb6f07a7ab) )
ROM_LOAD( "gy-9.8d", 0x2000, 0x2000, CRC(4f22411a) SHA1(763bcd039f8c1838a0d7da7d4dadc14a26e25596) )
ROM_LOAD( "gy-8.7d", 0x4000, 0x2000, CRC(47cd1fbc) SHA1(8203c4ff0b1cd7b4dbc708e300bfeac1e7366e09) )
ROM_LOAD( "gy-7.6d", 0x6000, 0x2000, CRC(8e8d388c) SHA1(8f2928d71c02aba977d67575d6e34d69bda2b9d4) )
ROM_REGION( 0x2000, "gfx2", 0 )
ROM_REGION( 0x2000, "tiles", 0 )
ROM_LOAD( "gy-6.1g", 0x0000, 0x2000, CRC(27d8329b) SHA1(564ff945465a23d93a93137ad277298770dfa06a) )
ROM_REGION( 0x0220, "proms", 0 )
ROM_LOAD( "gyrussk.pr3", 0x0000, 0x0020, CRC(98782db3) SHA1(b891e43b25187faca8002919ccb44d744daa3594) ) /* palette */
ROM_LOAD( "gyrussk.pr1", 0x0020, 0x0100, CRC(7ed057de) SHA1(c04069ae1e2c62f9b3048844cd8cf5e1b03b7d3c) ) /* sprite lookup table */
ROM_LOAD( "gyrussk.pr2", 0x0120, 0x0100, CRC(de823a81) SHA1(1af94b2a6a319a89b238a5076a2867f1cfd279b0) ) /* character lookup table */
ROM_LOAD( "gyrussk.pr3", 0x0000, 0x0020, CRC(98782db3) SHA1(b891e43b25187faca8002919ccb44d744daa3594) ) // palette
ROM_LOAD( "gyrussk.pr1", 0x0020, 0x0100, CRC(7ed057de) SHA1(c04069ae1e2c62f9b3048844cd8cf5e1b03b7d3c) ) // sprite lookup table
ROM_LOAD( "gyrussk.pr2", 0x0120, 0x0100, CRC(de823a81) SHA1(1af94b2a6a319a89b238a5076a2867f1cfd279b0) ) // character lookup table
ROM_END
ROM_START( gyrussb ) /* PCB has stickers stating "TAITO (NEW ZEALAND) LTD" */
ROM_START( gyrussb ) // PCB has stickers stating "TAITO (NEW ZEALAND) LTD"
ROM_REGION( 0x8000, "maincpu", 0 )
ROM_LOAD( "1.bin", 0x0000, 0x2000, CRC(6bc21c10) SHA1(9d44f766398b9994f90edb2ffb272b4f22564854) ) // minor code patch / redirection
ROM_LOAD( "2.bin", 0x2000, 0x2000, CRC(a4ec03e4) SHA1(08c33ad7fcc2ad5e5787a1050284e3f8164f4618) )
@ -658,22 +894,22 @@ ROM_START( gyrussb ) /* PCB has stickers stating "TAITO (NEW ZEALAND) LTD" */
ROM_LOAD( "12.bin", 0x2000, 0x2000, CRC(ba498115) SHA1(9cd1f42898cc590f39ba7cb3c975b0b3d3062eba) )
// 4000-5fff: Empty socket, not populated
ROM_REGION( 0x1000, "audio2", 0 ) /* 8039 */
ROM_REGION( 0x1000, "audio2", 0 ) // 8039
ROM_LOAD( "13.bin", 0x0000, 0x1000, CRC(3f9b5dea) SHA1(6e807da02c2885b18e8cc2199f12f6be9040bf75) )
ROM_REGION( 0x8000, "gfx1", 0 )
ROM_REGION( 0x8000, "sprites", 0 )
ROM_LOAD( "6.bin", 0x0000, 0x2000, CRC(c949db10) SHA1(fcb8bcbd2bdd751fecb322a33c8a92fb6f07a7ab) )
ROM_LOAD( "5.bin", 0x2000, 0x2000, CRC(4f22411a) SHA1(763bcd039f8c1838a0d7da7d4dadc14a26e25596) )
ROM_LOAD( "8.bin", 0x4000, 0x2000, CRC(47cd1fbc) SHA1(8203c4ff0b1cd7b4dbc708e300bfeac1e7366e09) )
ROM_LOAD( "7.bin", 0x6000, 0x2000, CRC(8e8d388c) SHA1(8f2928d71c02aba977d67575d6e34d69bda2b9d4) )
ROM_REGION( 0x2000, "gfx2", 0 )
ROM_REGION( 0x2000, "tiles", 0 )
ROM_LOAD( "4.bin", 0x0000, 0x2000, CRC(27d8329b) SHA1(564ff945465a23d93a93137ad277298770dfa06a) )
ROM_REGION( 0x0220, "proms", 0 )
ROM_LOAD( "gyrussk.pr3", 0x0000, 0x0020, CRC(98782db3) SHA1(b891e43b25187faca8002919ccb44d744daa3594) ) /* palette */
ROM_LOAD( "gyrussk.pr1", 0x0020, 0x0100, CRC(7ed057de) SHA1(c04069ae1e2c62f9b3048844cd8cf5e1b03b7d3c) ) /* sprite lookup table */
ROM_LOAD( "gyrussk.pr2", 0x0120, 0x0100, CRC(de823a81) SHA1(1af94b2a6a319a89b238a5076a2867f1cfd279b0) ) /* character lookup table */
ROM_LOAD( "gyrussk.pr3", 0x0000, 0x0020, CRC(98782db3) SHA1(b891e43b25187faca8002919ccb44d744daa3594) ) // palette
ROM_LOAD( "gyrussk.pr1", 0x0020, 0x0100, CRC(7ed057de) SHA1(c04069ae1e2c62f9b3048844cd8cf5e1b03b7d3c) ) // sprite lookup table
ROM_LOAD( "gyrussk.pr2", 0x0120, 0x0100, CRC(de823a81) SHA1(1af94b2a6a319a89b238a5076a2867f1cfd279b0) ) // character lookup table
ROM_END
ROM_START( venus )
@ -691,26 +927,28 @@ ROM_START( venus )
ROM_LOAD( "gyrussk.2a", 0x2000, 0x2000, CRC(ba498115) SHA1(9cd1f42898cc590f39ba7cb3c975b0b3d3062eba) )
// 4000-5fff: Empty socket, not populated
ROM_REGION( 0x1000, "audio2", 0 ) /* 8039 */
ROM_REGION( 0x1000, "audio2", 0 ) // 8039
ROM_LOAD( "gyrussk.3a", 0x0000, 0x1000, CRC(3f9b5dea) SHA1(6e807da02c2885b18e8cc2199f12f6be9040bf75) )
ROM_REGION( 0x8000, "gfx1", 0 )
ROM_REGION( 0x8000, "sprites", 0 )
ROM_LOAD( "gyrussk.6", 0x0000, 0x2000, CRC(c949db10) SHA1(fcb8bcbd2bdd751fecb322a33c8a92fb6f07a7ab) )
ROM_LOAD( "gyrussk.5", 0x2000, 0x2000, CRC(4f22411a) SHA1(763bcd039f8c1838a0d7da7d4dadc14a26e25596) )
ROM_LOAD( "gyrussk.8", 0x4000, 0x2000, CRC(47cd1fbc) SHA1(8203c4ff0b1cd7b4dbc708e300bfeac1e7366e09) )
ROM_LOAD( "gyrussk.7", 0x6000, 0x2000, CRC(8e8d388c) SHA1(8f2928d71c02aba977d67575d6e34d69bda2b9d4) )
ROM_REGION( 0x2000, "gfx2", 0 )
ROM_REGION( 0x2000, "tiles", 0 )
ROM_LOAD( "gyrussk.4", 0x0000, 0x2000, CRC(27d8329b) SHA1(564ff945465a23d93a93137ad277298770dfa06a) )
ROM_REGION( 0x0220, "proms", 0 )
ROM_LOAD( "gyrussk.pr3", 0x0000, 0x0020, CRC(98782db3) SHA1(b891e43b25187faca8002919ccb44d744daa3594) ) /* palette */
ROM_LOAD( "gyrussk.pr1", 0x0020, 0x0100, CRC(7ed057de) SHA1(c04069ae1e2c62f9b3048844cd8cf5e1b03b7d3c) ) /* sprite lookup table */
ROM_LOAD( "gyrussk.pr2", 0x0120, 0x0100, CRC(de823a81) SHA1(1af94b2a6a319a89b238a5076a2867f1cfd279b0) ) /* character lookup table */
ROM_LOAD( "gyrussk.pr3", 0x0000, 0x0020, CRC(98782db3) SHA1(b891e43b25187faca8002919ccb44d744daa3594) ) // palette
ROM_LOAD( "gyrussk.pr1", 0x0020, 0x0100, CRC(7ed057de) SHA1(c04069ae1e2c62f9b3048844cd8cf5e1b03b7d3c) ) // sprite lookup table
ROM_LOAD( "gyrussk.pr2", 0x0120, 0x0100, CRC(de823a81) SHA1(1af94b2a6a319a89b238a5076a2867f1cfd279b0) ) // character lookup table
ROM_END
} // anonymous namespace
GAME( 1983, gyruss, 0, gyruss, gyruss, gyruss_state, empty_init, ROT90, "Konami", "Gyruss", MACHINE_SUPPORTS_SAVE )
GAME( 1983, gyrussce, gyruss, gyruss, gyrussce, gyruss_state, empty_init, ROT90, "Konami (Centuri license)", "Gyruss (Centuri)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, gyrussb, gyruss, gyruss, gyruss, gyruss_state, empty_init, ROT90, "bootleg?", "Gyruss (bootleg?)", MACHINE_SUPPORTS_SAVE ) /* Supposed Taito NZ license, but (c) Konami */
GAME( 1983, venus, gyruss, gyruss, gyruss, gyruss_state, empty_init, ROT90, "bootleg", "Venus (bootleg of Gyruss)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, gyruss, 0, gyruss, gyruss, gyruss_state, empty_init, ROT90, "Konami", "Gyruss", MACHINE_SUPPORTS_SAVE )
GAME( 1983, gyrussce, gyruss, gyruss, gyrussce, gyruss_state, empty_init, ROT90, "Konami (Centuri license)", "Gyruss (Centuri)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, gyrussb, gyruss, gyruss, gyruss, gyruss_state, empty_init, ROT90, "bootleg?", "Gyruss (bootleg?)", MACHINE_SUPPORTS_SAVE ) // Supposed Taito NZ license, but (c) Konami
GAME( 1983, venus, gyruss, gyruss, gyruss, gyruss_state, empty_init, ROT90, "bootleg", "Venus (bootleg of Gyruss)", MACHINE_SUPPORTS_SAVE )

View File

@ -1,90 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria, Couriersud
/*************************************************************************
Gyruss
*************************************************************************/
#ifndef MAME_INCLUDES_GYRUSS_H
#define MAME_INCLUDES_GYRUSS_H
#pragma once
#include "cpu/mcs48/mcs48.h"
#include "sound/discrete.h"
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
class gyruss_state : public driver_device
{
public:
gyruss_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_subcpu(*this, "sub"),
m_audiocpu(*this, "audiocpu"),
m_audiocpu_2(*this, "audio2"),
m_discrete(*this, "discrete"),
m_colorram(*this, "colorram"),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette")
{ }
void gyruss(machine_config &config);
void init_gyruss();
private:
/* devices/memory pointers */
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_subcpu;
required_device<cpu_device> m_audiocpu;
required_device<i8039_device> m_audiocpu_2;
required_device<discrete_sound_device> m_discrete;
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<screen_device> m_screen;
required_device<palette_device> m_palette;
tilemap_t *m_tilemap = nullptr;
uint8_t m_master_nmi_mask = 0U;
uint8_t m_slave_irq_mask = 0U;
bool m_flipscreen = false;
void gyruss_irq_clear_w(uint8_t data);
void gyruss_sh_irqtrigger_w(uint8_t data);
void gyruss_i8039_irq_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(master_nmi_mask_w);
void slave_irq_mask_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(coin_counter_1_w);
DECLARE_WRITE_LINE_MEMBER(coin_counter_2_w);
void gyruss_spriteram_w(offs_t offset, uint8_t data);
uint8_t gyruss_scanline_r();
DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
uint8_t gyruss_portA_r();
void gyruss_dac_w(uint8_t data);
void gyruss_filter0_w(uint8_t data);
void gyruss_filter1_w(uint8_t data);
TILE_GET_INFO_MEMBER(gyruss_get_tile_info);
virtual void machine_start() override;
virtual void video_start() override;
void gyruss_palette(palette_device &palette) const;
uint32_t screen_update_gyruss(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 filter_w(int chip, int data );
void audio_cpu1_io_map(address_map &map);
void audio_cpu1_map(address_map &map);
void audio_cpu2_io_map(address_map &map);
void audio_cpu2_map(address_map &map);
void main_cpu1_map(address_map &map);
void main_cpu2_map(address_map &map);
};
#endif // MAME_INCLUDES_GYRUSS_H

View File

@ -1,169 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
/***************************************************************************
video.c
Functions to emulate the video hardware of the machine.
***************************************************************************/
#include "emu.h"
#include "video/resnet.h"
#include "gyruss.h"
/***************************************************************************
Convert the color PROMs into a more useable format.
Gyruss 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 gyruss_state::gyruss_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 weights_rg[3], weights_b[2];
compute_resistor_weights(0, 255, -1.0,
3, resistances_rg, weights_rg, 470, 0,
2, resistances_b, weights_b, 470, 0,
0, nullptr, nullptr, 0, 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(weights_rg, 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(weights_rg, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
int const b = combine_weights(weights_b, 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 += 32;
// sprites map to the lower 16 palette entries
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry);
}
// characters map to the upper 16 palette entries
for (int i = 0x100; i < 0x140; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry | 0x10);
}
}
void gyruss_state::gyruss_spriteram_w(offs_t offset, uint8_t data)
{
// m_screen->update_now();
m_screen->update_partial(m_screen->vpos());
m_spriteram[offset] = data;
}
TILE_GET_INFO_MEMBER(gyruss_state::gyruss_get_tile_info)
{
int code = ((m_colorram[tile_index] & 0x20) << 3) | m_videoram[tile_index];
int color = m_colorram[tile_index] & 0x0f;
int flags = TILE_FLIPYX(m_colorram[tile_index] >> 6);
tileinfo.group = (m_colorram[tile_index] & 0x10) ? 0 : 1;
tileinfo.set(2, code, color, flags);
}
void gyruss_state::video_start()
{
m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gyruss_state::gyruss_get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_tilemap->set_transmask(0, 0x00, 0); // opaque
m_tilemap->set_transmask(1, 0x0f, 0); // transparent
save_item(NAME(m_flipscreen));
}
uint8_t gyruss_state::gyruss_scanline_r()
{
/* reads 1V - 128V */
return m_screen->vpos();
}
WRITE_LINE_MEMBER(gyruss_state::flipscreen_w)
{
m_flipscreen = state;
}
void gyruss_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
int offs;
for (offs = 0xbc; offs >= 0; offs -= 4)
{
int x = m_spriteram[offs];
int y = 241 - m_spriteram[offs + 3];
int gfx_bank = m_spriteram[offs + 1] & 0x01;
int code = ((m_spriteram[offs + 2] & 0x20) << 2) | ( m_spriteram[offs + 1] >> 1);
int color = m_spriteram[offs + 2] & 0x0f;
int flip_x = ~m_spriteram[offs + 2] & 0x40;
int flip_y = m_spriteram[offs + 2] & 0x80;
m_gfxdecode->gfx(gfx_bank)->transpen(bitmap,cliprect, code, color, flip_x, flip_y, x, y, 0);
}
}
uint32_t gyruss_state::screen_update_gyruss(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
if (cliprect.min_y == screen.visible_area().min_y)
{
machine().tilemap().mark_all_dirty();
machine().tilemap().set_flip_all(m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0);
}
m_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
draw_sprites(bitmap, cliprect);
m_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}

View File

@ -1,22 +1,489 @@
// license:BSD-3-Clause
// copyright-holders:Mirko Buffoni, Couriersud
// copyright-holders: Mirko Buffoni, Couriersud
/***************************************************************************
IronHorse
GX560
driver by Mirko Buffoni
***************************************************************************/
#include "emu.h"
#include "ironhors.h"
#include "konamipt.h"
#include "cpu/m6809/m6809.h"
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "machine/timer.h"
#include "sound/discrete.h"
#include "sound/ymopn.h"
#include "speaker.h"
#include "video/resnet.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
// configurable logging
#define LOG_PALETTEBANK (1U << 1)
//#define VERBOSE (LOG_GENERAL | LOG_PALETTEBANK)
#include "logmacro.h"
#define LOGPALETTEBANK(...) LOGMASKED(LOG_PALETTEBANK, __VA_ARGS__)
namespace {
class ironhors_base_state : public driver_device
{
public:
ironhors_base_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_soundcpu(*this, "soundcpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_screen(*this, "screen"),
m_soundlatch(*this, "soundlatch"),
m_disc_ih(*this, "disc_ih"),
m_interrupt_enable(*this, "int_enable"),
m_scroll(*this, "scroll"),
m_colorram(*this, "colorram"),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram%u", 1U)
{ }
void base(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
void sh_irqtrigger_w(uint8_t data);
void videoram_w(offs_t offset, uint8_t data);
void colorram_w(offs_t offset, uint8_t data);
void charbank_w(uint8_t data);
void palettebank_w(uint8_t data);
void flipscreen_w(uint8_t data);
void filter_w(uint8_t data);
void palette(palette_device &palette) const;
// devices
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_soundcpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
required_device<generic_latch_8_device> m_soundlatch;
required_device<discrete_device> m_disc_ih;
// memory pointers
required_shared_ptr<uint8_t> m_interrupt_enable;
required_shared_ptr<uint8_t> m_scroll;
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;
uint8_t m_palettebank = 0U;
uint8_t m_charbank = 0U;
uint8_t m_spriterambank = 0U;
};
class ironhors_state : public ironhors_base_state
{
public:
ironhors_state(const machine_config &mconfig, device_type type, const char *tag) :
ironhors_base_state(mconfig, type, tag)
{ }
void ironhors(machine_config &config);
protected:
virtual void video_start() override;
private:
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_tick);
void master_map(address_map &map);
void slave_map(address_map &map);
void slave_io_map(address_map &map);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
};
class farwest_state : public ironhors_base_state
{
public:
farwest_state(const machine_config &mconfig, device_type type, const char *tag) :
ironhors_base_state(mconfig, type, tag)
{ }
void farwest(machine_config &config);
protected:
virtual void video_start() override;
private:
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_tick);
void master_map(address_map &map);
void slave_map(address_map &map);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
};
// video
/***************************************************************************
Convert the color PROMs into a more useable format.
***************************************************************************/
void ironhors_base_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 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);
palette.set_pen_indirect(((i & 0x100) << 3) | (j << 8) | (i & 0xff), ctabentry);
}
}
}
void ironhors_base_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void ironhors_base_state::colorram_w(offs_t offset, uint8_t data)
{
m_colorram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void ironhors_base_state::charbank_w(uint8_t data)
{
if (m_charbank != (data & 0x03))
{
m_charbank = data & 0x03;
machine().tilemap().mark_all_dirty();
}
m_spriterambank = data & 0x08;
// other bits unknown
}
void ironhors_base_state::palettebank_w(uint8_t data)
{
if (m_palettebank != (data & 0x07))
{
m_palettebank = data & 0x07;
machine().tilemap().mark_all_dirty();
}
machine().bookkeeping().coin_counter_w(0, data & 0x10);
machine().bookkeeping().coin_counter_w(1, data & 0x20);
// bit 6 unknown - set after game over
if (data & 0x88)
LOGPALETTEBANK("palettebank_w %02x", data);
}
void ironhors_base_state::flipscreen_w(uint8_t data)
{
if (flip_screen() != (~data & 0x08))
{
flip_screen_set(~data & 0x08);
machine().tilemap().mark_all_dirty();
}
// other bits are used too, but unknown
}
TILE_GET_INFO_MEMBER(ironhors_state::get_bg_tile_info)
{
int const code = m_videoram[tile_index] + ((m_colorram[tile_index] & 0x40) << 2) +
((m_colorram[tile_index] & 0x20) << 4) + (m_charbank << 10);
int const color = (m_colorram[tile_index] & 0x0f) + 16 * m_palettebank;
int const flags = ((m_colorram[tile_index] & 0x10) ? TILE_FLIPX : 0) |
((m_colorram[tile_index] & 0x20) ? TILE_FLIPY : 0);
tileinfo.set(0, code, color, flags);
}
void ironhors_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ironhors_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap->set_scroll_rows(32);
}
void ironhors_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *sr;
if (m_spriterambank != 0)
sr = m_spriteram[0];
else
sr = m_spriteram[1];
for (int offs = 0; offs < m_spriteram[0].bytes(); offs += 5)
{
int sx = sr[offs + 3];
int sy = sr[offs + 2];
int flipx = sr[offs + 4] & 0x20;
int flipy = sr[offs + 4] & 0x40;
int const code = (sr[offs] << 2) + ((sr[offs + 1] & 0x03) << 10) + ((sr[offs + 1] & 0x0c) >> 2);
int const color = ((sr[offs + 1] & 0xf0) >> 4) + 16 * m_palettebank;
// int mod = flip_screen() ? -8 : 8;
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
switch (sr[offs + 4] & 0x0c)
{
case 0x00: // 16x16
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect,
code / 4,
color,
flipx, flipy,
sx, sy, 0);
break;
case 0x04: // 16x8
{
if (flip_screen()) sy += 8; // this fixes the train wheels' position
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect,
code & ~1,
color,
flipx, flipy,
flipx ? sx + 8 : sx, sy, 0);
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect,
code | 1,
color,
flipx, flipy,
flipx ? sx : sx + 8, sy, 0);
}
break;
case 0x08: // 8x16
{
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect,
code & ~2,
color,
flipx, flipy,
sx, flipy ? sy + 8 : sy, 0);
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect,
code | 2,
color,
flipx, flipy,
sx, flipy ? sy : sy + 8, 0);
}
break;
case 0x0c: // 8x8
{
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect,
code,
color,
flipx, flipy,
sx, sy, 0);
}
break;
}
}
}
uint32_t ironhors_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int row = 0; row < 32; row++)
m_bg_tilemap->set_scrollx(row, m_scroll[row]);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}
TILE_GET_INFO_MEMBER(farwest_state::get_bg_tile_info)
{
int const code = m_videoram[tile_index] + ((m_colorram[tile_index] & 0x40) << 2) +
((m_colorram[tile_index] & 0x20) << 4) + (m_charbank << 10);
int const color = (m_colorram[tile_index] & 0x0f) + 16 * m_palettebank;
int const flags = 0;//((m_colorram[tile_index] & 0x10) ? TILE_FLIPX : 0) | ((m_colorram[tile_index] & 0x20) ? TILE_FLIPY : 0);
tileinfo.set(0, code, color, flags);
}
void farwest_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(farwest_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap->set_scroll_rows(32);
}
void farwest_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *sr = m_spriteram[1];
uint8_t *sr2 = m_spriteram[0];
for (int offs = 0; offs < m_spriteram[0].bytes(); offs += 4)
{
int sx = sr[offs + 2];
int sy = sr[offs + 1];
int flipx = sr[offs + 3] & 0x20;
int flipy = sr[offs + 3] & 0x40;
int const code = (sr[offs] << 2) + ((sr2[offs] & 0x03) << 10) + ((sr2[offs] & 0x0c) >> 2);
int const color = ((sr2[offs] & 0xf0) >> 4) + 16 * m_palettebank;
// int mod = flip_screen() ? -8 : 8;
// if (flip_screen())
{
// sx = 240 - sx;
sy = 240 - sy;
// flipx = !flipx;
// flipy = !flipy;
}
switch (sr[offs + 3] & 0x0c)
{
case 0x00: // 16x16
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect,
code / 4,
color,
flipx, flipy,
sx, sy, 0);
break;
case 0x04: // 16x8
{
if (flip_screen()) sy += 8; // this fixes the train wheels' position
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect,
code & ~1,
color,
flipx, flipy,
flipx ? sx + 8 : sx, sy, 0);
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect,
code | 1,
color,
flipx, flipy,
flipx ? sx : sx + 8, sy, 0);
}
break;
case 0x08: // 8x16
{
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect,
code & ~2,
color,
flipx, flipy,
sx, flipy ? sy + 8 : sy, 0);
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect,
code | 2,
color,
flipx, flipy,
sx, flipy ? sy : sy + 8, 0);
}
break;
case 0x0c: // 8x8
{
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect,
code,
color,
flipx, flipy,
sx, sy, 0);
}
break;
}
}
}
uint32_t farwest_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int row = 0; row < 32; row++)
m_bg_tilemap->set_scrollx(row, m_scroll[row]);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}
// machine
/*************************************
*
@ -26,7 +493,7 @@
TIMER_DEVICE_CALLBACK_MEMBER(ironhors_state::scanline_tick)
{
int scanline = param;
int const scanline = param;
if (scanline == 240 && (m_screen->frame_number() & 1) == 0)
{
@ -232,9 +699,9 @@ static const gfx_layout ironhors_spritelayout =
};
static GFXDECODE_START( gfx_ironhors )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_msb, 0, 16*8 )
GFXDECODE_ENTRY( "gfx1", 0, ironhors_spritelayout, 16*8*16, 16*8 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_msb, 16*8*16, 16*8 ) // to handle 8x8 sprites
GFXDECODE_ENTRY( "gfx", 0, gfx_8x8x4_packed_msb, 0, 16*8 )
GFXDECODE_ENTRY( "gfx", 0, ironhors_spritelayout, 16*8*16, 16*8 )
GFXDECODE_ENTRY( "gfx", 0, gfx_8x8x4_packed_msb, 16*8*16, 16*8 ) // to handle 8x8 sprites
GFXDECODE_END
@ -274,9 +741,9 @@ static const gfx_layout farwest_spritelayout2 =
};
static GFXDECODE_START( gfx_farwest )
GFXDECODE_ENTRY( "gfx1", 0, farwest_charlayout, 0, 16*8 )
GFXDECODE_ENTRY( "gfx2", 0, farwest_spritelayout, 16*8*16, 16*8 )
GFXDECODE_ENTRY( "gfx2", 0, farwest_spritelayout2,16*8*16, 16*8 ) // to handle 8x8 sprites
GFXDECODE_ENTRY( "tiles", 0, farwest_charlayout, 0, 16*8 )
GFXDECODE_ENTRY( "sprites", 0, farwest_spritelayout, 16*8*16, 16*8 )
GFXDECODE_ENTRY( "sprites", 0, farwest_spritelayout2,16*8*16, 16*8 ) // to handle 8x8 sprites
GFXDECODE_END
@ -369,7 +836,7 @@ These clocks make the emulation run too fast.
void ironhors_base_state::base(machine_config &config)
{
// basic machine hardware
MC6809E(config, m_maincpu, 18432000/6); // 3.072 MHz??? mod by Shingo Suzuki 1999/10/15
MC6809E(config, m_maincpu, 18'432'000 / 6); // 3.072 MHz??? mod by Shingo Suzuki 1999/10/15
// video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@ -377,7 +844,7 @@ void ironhors_base_state::base(machine_config &config)
// m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
// m_screen->set_size(32*8, 32*8);
// m_screen->set_visarea(1*8, 31*8-1, 2*8, 30*8-1);
m_screen->set_raw(18432000/4,296,8,256-8,255,16,240); // pixel clock is a guesswork
m_screen->set_raw(18'432'000 / 4, 296, 8, 256 - 8, 255, 16, 240); // pixel clock is a guesswork
m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(ironhors_state::palette), 16*8*16+16*8*16, 256);
@ -387,7 +854,7 @@ void ironhors_base_state::base(machine_config &config)
GENERIC_LATCH_8(config, m_soundlatch);
ym2203_device &ym2203(YM2203(config, "ym2203", 18432000/6));
ym2203_device &ym2203(YM2203(config, "ym2203", 18'432'000 / 6));
ym2203.port_a_write_callback().set(FUNC(ironhors_state::filter_w));
ym2203.add_route(0, "disc_ih", 1.0, 0);
ym2203.add_route(1, "disc_ih", 1.0, 1);
@ -404,7 +871,7 @@ void ironhors_state::ironhors(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &ironhors_state::master_map);
TIMER(config, "scantimer").configure_scanline(FUNC(ironhors_state::scanline_tick), "screen", 0, 1);
Z80(config, m_soundcpu, 18432000/6); // 3.072 MHz
Z80(config, m_soundcpu, 18'432'000 / 6); // 3.072 MHz
m_soundcpu->set_addrmap(AS_PROGRAM, &ironhors_state::slave_map);
m_soundcpu->set_addrmap(AS_IO, &ironhors_state::slave_io_map);
@ -415,7 +882,7 @@ void ironhors_state::ironhors(machine_config &config)
TIMER_DEVICE_CALLBACK_MEMBER(farwest_state::scanline_tick)
{
int scanline = param;
int const scanline = param;
if ((scanline % 2) == 1)
{
@ -436,7 +903,7 @@ void farwest_state::farwest(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &farwest_state::master_map);
TIMER(config, "scantimer").configure_scanline(FUNC(farwest_state::scanline_tick), "screen", 0, 1);
Z80(config, m_soundcpu, 18432000/6); // 3.072 MHz
Z80(config, m_soundcpu, 18'432'000 / 6); // 3.072 MHz
m_soundcpu->set_addrmap(AS_PROGRAM, &farwest_state::slave_map);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_farwest);
@ -462,7 +929,7 @@ ROM_START( ironhors )
ROM_REGION( 0x10000, "soundcpu", 0 )
ROM_LOAD( "560_h01.10c", 0x0000, 0x4000, CRC(2b17930f) SHA1(be7b21f050f6b74c75a33c9284455bbed5b03c63) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "gfx", 0 )
ROM_LOAD16_BYTE( "560_h06.08f", 0x00000, 0x8000, CRC(f21d8c93) SHA1(4245fff5360e10441e11d0d207d510e5c317bb0e) )
ROM_LOAD16_BYTE( "560_h05.07f", 0x00001, 0x8000, CRC(60107859) SHA1(ab59b6be155d36811a37dc873abbd97cd0a4120d) )
ROM_LOAD16_BYTE( "560_h07.09f", 0x10000, 0x8000, CRC(c761ec73) SHA1(78266c9ff3ea74a59fd3ce84afb4f8a1164c8bba) )
@ -484,7 +951,7 @@ ROM_START( ironhorsh )
ROM_REGION( 0x10000, "soundcpu", 0 )
ROM_LOAD( "10c_h01.bin", 0x0000, 0x4000, CRC(2b17930f) SHA1(be7b21f050f6b74c75a33c9284455bbed5b03c63) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "gfx", 0 )
ROM_LOAD16_BYTE( "08f_h06.bin", 0x00000, 0x8000, CRC(f21d8c93) SHA1(4245fff5360e10441e11d0d207d510e5c317bb0e) )
ROM_LOAD16_BYTE( "07f_h05.bin", 0x00001, 0x8000, CRC(60107859) SHA1(ab59b6be155d36811a37dc873abbd97cd0a4120d) )
ROM_LOAD16_BYTE( "09f_h07.bin", 0x10000, 0x8000, CRC(c761ec73) SHA1(78266c9ff3ea74a59fd3ce84afb4f8a1164c8bba) )
@ -506,7 +973,7 @@ ROM_START( dairesya )
ROM_REGION( 0x10000, "soundcpu", 0 )
ROM_LOAD( "560-j01.10c", 0x0000, 0x4000, CRC(a203b223) SHA1(fd19ae55bda467a09151539be6dce3791c28f18a) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_REGION( 0x20000, "gfx", 0 )
ROM_LOAD16_BYTE( "560-j06.8f", 0x00000, 0x8000, CRC(a6e8248d) SHA1(7df653bb3a2257c249c3cf2c3f4f324d687a6b39) )
ROM_LOAD16_BYTE( "560-j05.7f", 0x00001, 0x8000, CRC(f75893d4) SHA1(dc71b912d9bf5104dc633f687c52043df37852f0) )
ROM_LOAD16_BYTE( "560-k07.9f", 0x10000, 0x8000, CRC(c8a1b840) SHA1(753b6fcbb4b28bbb63a392cdef90568734eac9bd) )
@ -521,7 +988,7 @@ ROM_START( dairesya )
ROM_END
ROM_START( farwest )
ROM_REGION( 0x12000, "maincpu", 0 ) // 64k for code + 8k for extra ROM
ROM_REGION( 0x12000, "maincpu", 0 )
ROM_LOAD( "ironhors.008", 0x04000, 0x4000, CRC(b1c8246c) SHA1(4ceb098bb0b4efcbe50bb4b23bd27a60dabf2b3e) )
ROM_LOAD( "ironhors.009", 0x08000, 0x8000, CRC(ea34ecfc) SHA1(8c7f12e76d2b9eb592ebf1bfd3e16a6b130da8e5) )
ROM_LOAD( "ironhors.007", 0x00000, 0x2000, CRC(471182b7) SHA1(48ff58cbbf971b257e8099ec331397cf73dc8325) ) // don't know what this is for
@ -529,11 +996,11 @@ ROM_START( farwest )
ROM_REGION( 0x10000, "soundcpu", 0 )
ROM_LOAD( "ironhors.010", 0x0000, 0x4000, CRC(a28231a6) SHA1(617e8fdf8129081c6a1bbbf140837a375a51da72) )
ROM_REGION( 0x10000, "gfx1", 0 )
ROM_REGION( 0x10000, "tiles", 0 )
ROM_LOAD( "ironhors.005", 0x00000, 0x8000, CRC(f77e5b83) SHA1(6c72732dc96c1652713b2aba6f0a2410f9457818) )
ROM_LOAD( "ironhors.006", 0x08000, 0x8000, CRC(7bbc0b51) SHA1(9b4890f2d20a8ddf5ba3f4325df070509252e06e) )
ROM_REGION( 0x10000, "gfx2", 0 )
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "ironhors.001", 0x00000, 0x4000, CRC(a8fc21d3) SHA1(1e898aaccad1919bbacf8d7957f5a0761df20767) )
ROM_LOAD( "ironhors.002", 0x04000, 0x4000, CRC(9c1e5593) SHA1(7d41d2224f0653e09d8728ccdec2df60f549e36e) )
ROM_LOAD( "ironhors.003", 0x08000, 0x4000, CRC(3a0bf799) SHA1(b34d5c7edda06b8a579d6d390511781a43ffce83) )
@ -547,6 +1014,8 @@ ROM_START( farwest )
ROM_LOAD( "ironcol.005", 0x0400, 0x0100, CRC(15077b9c) SHA1(c7fe24e3d481150452ff774f3908510db9e28367) ) // sprite lookup table
ROM_END
} // anonymous namespace
/*************************************
*
@ -554,7 +1023,7 @@ ROM_END
*
*************************************/
// versions are taken from the letters on the program ROMs' labels
GAME( 1986, ironhors, 0, ironhors, ironhors, ironhors_state, empty_init, ROT0, "Konami", "Iron Horse (version K)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, ironhorsh, ironhors, ironhors, ironhors, ironhors_state, empty_init, ROT0, "Konami", "Iron Horse (version H)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, ironhors, 0, ironhors, ironhors, ironhors_state, empty_init, ROT0, "Konami", "Iron Horse (version K)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, ironhorsh, ironhors, ironhors, ironhors, ironhors_state, empty_init, ROT0, "Konami", "Iron Horse (version H)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, dairesya, ironhors, ironhors, dairesya, ironhors_state, empty_init, ROT0, "Konami (Kawakusu license)", "Dai Ressya Goutou (Japan, version K)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, farwest, ironhors, farwest, ironhors, farwest_state, empty_init, ROT0, "bootleg?", "Far West", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1986, farwest, ironhors, farwest, ironhors, farwest_state, empty_init, ROT0, "bootleg?", "Far West", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )

View File

@ -1,129 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Mirko Buffoni, Couriersud
/*************************************************************************
IronHorse
*************************************************************************/
#ifndef MAME_INCLUDES_IRONHORS_H
#define MAME_INCLUDES_IRONHORS_H
#pragma once
#include "machine/gen_latch.h"
#include "machine/timer.h"
#include "sound/discrete.h"
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
class ironhors_base_state : public driver_device
{
public:
ironhors_base_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_soundcpu(*this, "soundcpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_screen(*this, "screen"),
m_soundlatch(*this, "soundlatch"),
m_disc_ih(*this, "disc_ih"),
m_interrupt_enable(*this, "int_enable"),
m_scroll(*this, "scroll"),
m_colorram(*this, "colorram"),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram%u", 1U)
{ }
void base(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
void sh_irqtrigger_w(uint8_t data);
void videoram_w(offs_t offset, uint8_t data);
void colorram_w(offs_t offset, uint8_t data);
void charbank_w(uint8_t data);
void palettebank_w(uint8_t data);
void flipscreen_w(uint8_t data);
void filter_w(uint8_t data);
void palette(palette_device &palette) const;
// devices
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_soundcpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
required_device<generic_latch_8_device> m_soundlatch;
required_device<discrete_device> m_disc_ih;
// memory pointers
required_shared_ptr<uint8_t> m_interrupt_enable;
required_shared_ptr<uint8_t> m_scroll;
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;
uint8_t m_palettebank = 0U;
uint8_t m_charbank = 0U;
uint8_t m_spriterambank = 0U;
};
class ironhors_state : public ironhors_base_state
{
public:
ironhors_state(const machine_config &mconfig, device_type type, const char *tag) :
ironhors_base_state(mconfig, type, tag)
{ }
void ironhors(machine_config &config);
protected:
virtual void video_start() override;
private:
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_tick);
void master_map(address_map &map);
void slave_map(address_map &map);
void slave_io_map(address_map &map);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
};
class farwest_state : public ironhors_base_state
{
public:
farwest_state(const machine_config &mconfig, device_type type, const char *tag) :
ironhors_base_state(mconfig, type, tag)
{ }
void farwest(machine_config &config);
protected:
virtual void video_start() override;
private:
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_tick);
void master_map(address_map &map);
void slave_map(address_map &map);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
};
#endif // MAME_INCLUDES_IRONHORS_H

View File

@ -1,343 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Mirko Buffoni
/***************************************************************************
ironhors.cpp
Functions to emulate the video hardware of the machine.
***************************************************************************/
#include "emu.h"
#include "video/resnet.h"
#include "ironhors.h"
/***************************************************************************
Convert the color PROMs into a more useable format.
***************************************************************************/
void ironhors_base_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 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);
palette.set_pen_indirect(((i & 0x100) << 3) | (j << 8) | (i & 0xff), ctabentry);
}
}
}
void ironhors_base_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void ironhors_base_state::colorram_w(offs_t offset, uint8_t data)
{
m_colorram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void ironhors_base_state::charbank_w(uint8_t data)
{
if (m_charbank != (data & 0x03))
{
m_charbank = data & 0x03;
machine().tilemap().mark_all_dirty();
}
m_spriterambank = data & 0x08;
// other bits unknown
}
void ironhors_base_state::palettebank_w(uint8_t data)
{
if (m_palettebank != (data & 0x07))
{
m_palettebank = data & 0x07;
machine().tilemap().mark_all_dirty();
}
machine().bookkeeping().coin_counter_w(0, data & 0x10);
machine().bookkeeping().coin_counter_w(1, data & 0x20);
// bit 6 unknown - set after game over
if (data & 0x88)
popmessage("palettebank_w %02x",data);
}
void ironhors_base_state::flipscreen_w(uint8_t data)
{
if (flip_screen() != (~data & 0x08))
{
flip_screen_set(~data & 0x08);
machine().tilemap().mark_all_dirty();
}
// other bits are used too, but unknown
}
TILE_GET_INFO_MEMBER(ironhors_state::get_bg_tile_info)
{
int code = m_videoram[tile_index] + ((m_colorram[tile_index] & 0x40) << 2) +
((m_colorram[tile_index] & 0x20) << 4) + (m_charbank << 10);
int color = (m_colorram[tile_index] & 0x0f) + 16 * m_palettebank;
int flags = ((m_colorram[tile_index] & 0x10) ? TILE_FLIPX : 0) |
((m_colorram[tile_index] & 0x20) ? TILE_FLIPY : 0);
tileinfo.set(0, code, color, flags);
}
void ironhors_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ironhors_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap->set_scroll_rows(32);
}
void ironhors_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *sr;
if (m_spriterambank != 0)
sr = m_spriteram[0];
else
sr = m_spriteram[1];
for (int offs = 0; offs < m_spriteram[0].bytes(); offs += 5)
{
int sx = sr[offs + 3];
int sy = sr[offs + 2];
int flipx = sr[offs + 4] & 0x20;
int flipy = sr[offs + 4] & 0x40;
int code = (sr[offs] << 2) + ((sr[offs + 1] & 0x03) << 10) + ((sr[offs + 1] & 0x0c) >> 2);
int color = ((sr[offs + 1] & 0xf0) >> 4) + 16 * m_palettebank;
// int mod = flip_screen() ? -8 : 8;
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
switch (sr[offs + 4] & 0x0c)
{
case 0x00: // 16x16
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
code/4,
color,
flipx,flipy,
sx,sy,0);
break;
case 0x04: // 16x8
{
if (flip_screen()) sy += 8; // this fixes the train wheels' position
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
code & ~1,
color,
flipx,flipy,
flipx?sx+8:sx,sy,0);
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
code | 1,
color,
flipx,flipy,
flipx?sx:sx+8,sy,0);
}
break;
case 0x08: // 8x16
{
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
code & ~2,
color,
flipx,flipy,
sx,flipy?sy+8:sy,0);
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
code | 2,
color,
flipx,flipy,
sx,flipy?sy:sy+8,0);
}
break;
case 0x0c: // 8x8
{
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
code,
color,
flipx,flipy,
sx,sy,0);
}
break;
}
}
}
uint32_t ironhors_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int row = 0; row < 32; row++)
m_bg_tilemap->set_scrollx(row, m_scroll[row]);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}
TILE_GET_INFO_MEMBER(farwest_state::get_bg_tile_info)
{
int code = m_videoram[tile_index] + ((m_colorram[tile_index] & 0x40) << 2) +
((m_colorram[tile_index] & 0x20) << 4) + (m_charbank << 10);
int color = (m_colorram[tile_index] & 0x0f) + 16 * m_palettebank;
int flags = 0;//((m_colorram[tile_index] & 0x10) ? TILE_FLIPX : 0) | ((m_colorram[tile_index] & 0x20) ? TILE_FLIPY : 0);
tileinfo.set(0, code, color, flags);
}
void farwest_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(farwest_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap->set_scroll_rows(32);
}
void farwest_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *sr = m_spriteram[1];
uint8_t *sr2 = m_spriteram[0];
for (int offs = 0; offs < m_spriteram[0].bytes(); offs += 4)
{
int sx = sr[offs + 2];
int sy = sr[offs + 1];
int flipx = sr[offs + 3] & 0x20;
int flipy = sr[offs + 3] & 0x40;
int code = (sr[offs] << 2) + ((sr2[offs] & 0x03) << 10) + ((sr2[offs] & 0x0c) >> 2);
int color = ((sr2[offs] & 0xf0) >> 4) + 16 * m_palettebank;
// int mod = flip_screen() ? -8 : 8;
// if (flip_screen())
{
// sx = 240 - sx;
sy = 240 - sy;
// flipx = !flipx;
// flipy = !flipy;
}
switch (sr[offs + 3] & 0x0c)
{
case 0x00: // 16x16
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
code/4,
color,
flipx,flipy,
sx,sy,0);
break;
case 0x04: // 16x8
{
if (flip_screen()) sy += 8; // this fixes the train wheels' position
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
code & ~1,
color,
flipx,flipy,
flipx?sx+8:sx,sy,0);
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
code | 1,
color,
flipx,flipy,
flipx?sx:sx+8,sy,0);
}
break;
case 0x08: // 8x16
{
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
code & ~2,
color,
flipx,flipy,
sx,flipy?sy+8:sy,0);
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
code | 2,
color,
flipx,flipy,
sx,flipy?sy:sy+8,0);
}
break;
case 0x0c: // 8x8
{
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
code,
color,
flipx,flipy,
sx,sy,0);
}
break;
}
}
}
uint32_t farwest_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int row = 0; row < 32; row++)
m_bg_tilemap->set_scrollx(row, m_scroll[row]);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}

View File

@ -1,5 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Ernesto Corvi
// copyright-holders: Ernesto Corvi
/***************************************************************************
Jailbreak - (c) 1986 Konami
@ -86,18 +87,200 @@ Notes:
***************************************************************************/
#include "emu.h"
#include "jailbrek.h"
#include "konamipt.h"
#include "konami1.h"
#include "konamipt.h"
#include "cpu/m6809/m6809.h"
#include "machine/watchdog.h"
#include "sound/sn76496.h"
#include "sound/vlm5030.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
namespace {
class jailbrek_state : public driver_device
{
public:
jailbrek_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_scroll_x(*this, "scroll_x"),
m_scroll_dir(*this, "scroll_dir"),
m_maincpu(*this, "maincpu"),
m_vlm(*this, "vlm"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
{ }
void jailbrek(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_colorram;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_spriteram;
required_shared_ptr<uint8_t> m_scroll_x;
required_shared_ptr<uint8_t> m_scroll_dir;
// devices
required_device<cpu_device> m_maincpu;
required_device<vlm5030_device> m_vlm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
// video-related
tilemap_t *m_bg_tilemap = nullptr;
// misc
uint8_t m_irq_enable = 0U;
uint8_t m_nmi_enable = 0U;
void ctrl_w(uint8_t data);
void coin_w(uint8_t data);
void videoram_w(offs_t offset, uint8_t data);
void colorram_w(offs_t offset, uint8_t data);
uint8_t speech_r();
void speech_w(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);
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
INTERRUPT_GEN_MEMBER(interrupt_nmi);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void prg_map(address_map &map);
void vlm_map(address_map &map);
};
// video
void jailbrek_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 const r = pal4bit(color_prom[i + 0x00] >> 0);
int const g = pal4bit(color_prom[i + 0x00] >> 4);
int const b = pal4bit(color_prom[i + 0x20] >> 0);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
// color_prom now points to the beginning of the lookup table
color_prom += 0x40;
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
palette.set_pen_indirect(i, ctabentry);
}
for (int i = 0x100; i < 0x200; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry);
}
}
void jailbrek_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void jailbrek_state::colorram_w(offs_t offset, uint8_t data)
{
m_colorram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
TILE_GET_INFO_MEMBER(jailbrek_state::get_bg_tile_info)
{
int const attr = m_colorram[tile_index];
int const code = m_videoram[tile_index] + ((attr & 0xc0) << 2);
int const color = attr & 0x0f;
tileinfo.set(0, code, color, 0);
}
void jailbrek_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(jailbrek_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
}
void jailbrek_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int i = 0; i < m_spriteram.bytes(); i += 4)
{
int const attr = m_spriteram[i + 1]; // attributes = ?tyxcccc
int const code = m_spriteram[i] + ((attr & 0x40) << 2);
int const color = attr & 0x0f;
int flipx = attr & 0x10;
int flipy = attr & 0x20;
int sx = m_spriteram[i + 2] - ((attr & 0x80) << 1);
int sy = m_spriteram[i + 3];
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->transmask(bitmap, cliprect, code, color, flipx, flipy,
sx, sy,
m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 0));
}
}
uint32_t jailbrek_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
// added support for vertical scrolling (credits). 23/1/2002 -BR
// bit 2 appears to be horizontal/vertical scroll control
if (m_scroll_dir[0] & 0x04)
{
m_bg_tilemap->set_scroll_cols(32);
m_bg_tilemap->set_scroll_rows(1);
m_bg_tilemap->set_scrollx(0, 0);
for (int i = 0; i < 32; i++)
m_bg_tilemap->set_scrolly(i, ((m_scroll_x[i + 32] << 8) + m_scroll_x[i]));
}
else
{
m_bg_tilemap->set_scroll_rows(32);
m_bg_tilemap->set_scroll_cols(1);
m_bg_tilemap->set_scrolly(0, 0);
for (int i = 0; i < 32; i++)
m_bg_tilemap->set_scrollx(i, ((m_scroll_x[i + 32] << 8) + m_scroll_x[i]));
}
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}
// machine
void jailbrek_state::ctrl_w(uint8_t data)
{
m_nmi_enable = data & 0x01;
@ -131,33 +314,33 @@ uint8_t jailbrek_state::speech_r()
void jailbrek_state::speech_w(uint8_t data)
{
/* bit 0 could be latch direction like in yiear */
// bit 0 could be latch direction like in yiear
m_vlm->st((data >> 1) & 1);
m_vlm->rst((data >> 2) & 1);
}
void jailbrek_state::jailbrek_map(address_map &map)
void jailbrek_state::prg_map(address_map &map)
{
map(0x0000, 0x07ff).ram().w(FUNC(jailbrek_state::colorram_w)).share("colorram");
map(0x0800, 0x0fff).ram().w(FUNC(jailbrek_state::videoram_w)).share("videoram");
map(0x1000, 0x10bf).ram().share("spriteram");
map(0x10c0, 0x14ff).ram(); /* ??? */
map(0x1500, 0x1fff).ram(); /* work ram */
map(0x2000, 0x203f).ram().share("scroll_x");
map(0x2040, 0x2040).nopw(); /* ??? */
map(0x2041, 0x2041).nopw(); /* ??? */
map(0x2042, 0x2042).ram().share("scroll_dir"); /* bit 2 = scroll direction */
map(0x2043, 0x2043).nopw(); /* ??? */
map(0x2044, 0x2044).w(FUNC(jailbrek_state::ctrl_w)); /* irq, nmi enable, screen flip */
map(0x0000, 0x07ff).ram().w(FUNC(jailbrek_state::colorram_w)).share(m_colorram);
map(0x0800, 0x0fff).ram().w(FUNC(jailbrek_state::videoram_w)).share(m_videoram);
map(0x1000, 0x10bf).ram().share(m_spriteram);
map(0x10c0, 0x14ff).ram(); // ???
map(0x1500, 0x1fff).ram(); // work RAM
map(0x2000, 0x203f).ram().share(m_scroll_x);
map(0x2040, 0x2040).nopw(); // ???
map(0x2041, 0x2041).nopw(); // ???
map(0x2042, 0x2042).ram().share(m_scroll_dir); // bit 2 = scroll direction
map(0x2043, 0x2043).nopw(); // ???
map(0x2044, 0x2044).w(FUNC(jailbrek_state::ctrl_w)); // irq, nmi enable, screen flip
map(0x3000, 0x3000).w(FUNC(jailbrek_state::coin_w));
map(0x3100, 0x3100).portr("DSW2").w("snsnd", FUNC(sn76489a_device::write));
map(0x3200, 0x3200).portr("DSW3").nopw(); /* mirror of the previous? */
map(0x3200, 0x3200).portr("DSW3").nopw(); // mirror of the previous?
map(0x3300, 0x3300).portr("SYSTEM").w("watchdog", FUNC(watchdog_timer_device::reset_w));
map(0x3301, 0x3301).portr("P1");
map(0x3302, 0x3302).portr("P2");
map(0x3303, 0x3303).portr("DSW1");
map(0x4000, 0x4000).w(FUNC(jailbrek_state::speech_w)); /* speech pins */
map(0x5000, 0x5000).w(m_vlm, FUNC(vlm5030_device::data_w)); /* speech data */
map(0x4000, 0x4000).w(FUNC(jailbrek_state::speech_w)); // speech pins
map(0x5000, 0x5000).w(m_vlm, FUNC(vlm5030_device::data_w)); // speech data
map(0x6000, 0x6000).r(FUNC(jailbrek_state::speech_r));
map(0x8000, 0xffff).rom();
}
@ -171,21 +354,21 @@ void jailbrek_state::vlm_map(address_map &map)
static INPUT_PORTS_START( jailbrek )
PORT_START("SYSTEM") /* $3300 */
PORT_START("SYSTEM") // $3300
KONAMI8_SYSTEM_10
PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("P1") /* $3301 */
PORT_START("P1") // $3301
KONAMI8_B12_UNK(1) // button1 = shoot, button2 = select
PORT_START("P2") /* $3302 */
PORT_START("P2") // $3302
KONAMI8_B12_UNK(2)
PORT_START("DSW1") /* $3303 */
PORT_START("DSW1") // $3303
KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1)
/* "Invalid" = both coin slots disabled */
// "Invalid" = both coin slots disabled
PORT_START("DSW2") /* $3100 */
PORT_START("DSW2") // $3100
PORT_DIPNAME( 0x03, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION( "SW2:1,2" )
PORT_DIPSETTING( 0x03, "1" )
PORT_DIPSETTING( 0x02, "2" )
@ -207,7 +390,7 @@ static INPUT_PORTS_START( jailbrek )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("DSW3") /* $3200 */
PORT_START("DSW3") // $3200
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION( "SW3:1" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@ -219,33 +402,9 @@ static INPUT_PORTS_START( jailbrek )
INPUT_PORTS_END
static const gfx_layout charlayout =
{
8,8, /* 8*8 characters */
1024, /* 1024 characters */
4, /* 4 bits per pixel */
{ 0, 1, 2, 3 }, /* the four bitplanes are packed in one nibble */
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8 /* every char takes 32 consecutive bytes */
};
static const gfx_layout spritelayout =
{
16,16, /* 16*16 sprites */
512, /* 512 sprites */
4, /* 4 bits per pixel */
{ 0, 1, 2, 3 }, /* the bitplanes are packed in one nibble */
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4,
32*8+0*4, 32*8+1*4, 32*8+2*4, 32*8+3*4, 32*8+4*4, 32*8+5*4, 32*8+6*4, 32*8+7*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
16*32, 17*32, 18*32, 19*32, 20*32, 21*32, 22*32, 23*32 },
128*8 /* every sprite takes 128 consecutive bytes */
};
static GFXDECODE_START( gfx_jailbrek )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 16 ) /* characters */
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 16*16, 16 ) /* sprites */
GFXDECODE_ENTRY( "tiles", 0, gfx_8x8x4_packed_msb, 0, 16 )
GFXDECODE_ENTRY( "sprites", 0, gfx_8x8x4_row_2x2_group_packed_msb, 16*16, 16 )
GFXDECODE_END
@ -263,27 +422,30 @@ void jailbrek_state::machine_reset()
void jailbrek_state::jailbrek(machine_config &config)
{
/* basic machine hardware */
KONAMI1(config, m_maincpu, MASTER_CLOCK/12); // the bootleg uses a standard M6809 with separate decryption logic
m_maincpu->set_addrmap(AS_PROGRAM, &jailbrek_state::jailbrek_map);
m_maincpu->set_periodic_int(FUNC(jailbrek_state::interrupt_nmi), attotime::from_hz(500)); /* ? */
static constexpr XTAL MASTER_CLOCK = XTAL(18'432'000);
static constexpr XTAL VOICE_CLOCK = XTAL(3'579'545);
// basic machine hardware
KONAMI1(config, m_maincpu, MASTER_CLOCK / 12); // the bootleg uses a standard M6809 with separate decryption logic
m_maincpu->set_addrmap(AS_PROGRAM, &jailbrek_state::prg_map);
m_maincpu->set_periodic_int(FUNC(jailbrek_state::interrupt_nmi), attotime::from_hz(500)); // ?
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
// video hardware
GFXDECODE(config, m_gfxdecode, m_palette, gfx_jailbrek);
PALETTE(config, m_palette, FUNC(jailbrek_state::jailbrek_palette), 512, 32);
PALETTE(config, m_palette, FUNC(jailbrek_state::palette), 512, 32);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_raw(MASTER_CLOCK/3, 396, 8, 248, 256, 16, 240);
screen.set_raw(MASTER_CLOCK / 3, 396, 8, 248, 256, 16, 240);
screen.set_screen_update(FUNC(jailbrek_state::screen_update));
screen.set_palette(m_palette);
screen.screen_vblank().set(FUNC(jailbrek_state::vblank_irq));
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
SN76489A(config, "snsnd", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 1.0);
SN76489A(config, "snsnd", MASTER_CLOCK / 12).add_route(ALL_OUTPUTS, "mono", 1.0);
VLM5030(config, m_vlm, VOICE_CLOCK);
m_vlm->add_route(ALL_OUTPUTS, "mono", 1.0);
@ -298,8 +460,8 @@ void jailbrek_state::jailbrek(machine_config &config)
***************************************************************************/
/*
Check if the rom used for the speech is not a 2764, but a 27128. If a
27128 is used then the data is stored in the upper half of the eprom.
Check if the ROM used for the speech is not a 2764, but a 27128. If a
27128 is used then the data is stored in the upper half of the EPROM.
(The schematics and board refer to a 2764, but all the boards I have seen
use a 27128. According to the schematics pin 26 is tied high so if a 2764
is used then the pin is ignored, but if a 27128 is used then pin 26
@ -311,23 +473,23 @@ ROM_START( jailbrek )
ROM_LOAD( "507p03.11d", 0x8000, 0x4000, CRC(a0b88dfd) SHA1(f999e382b9d3b812fca41f4d0da3ea692fef6b19) )
ROM_LOAD( "507p02.9d", 0xc000, 0x4000, CRC(444b7d8e) SHA1(c708b67c2d249448dae9a3d10c24d13ba6849597) )
ROM_REGION( 0x08000, "gfx1", 0 )
ROM_LOAD( "507l08.4f", 0x0000, 0x4000, CRC(e3b7a226) SHA1(c19a02a2def65648bf198fccec98ebbd2fc7c0fb) ) /* characters */
ROM_REGION( 0x08000, "tiles", 0 )
ROM_LOAD( "507l08.4f", 0x0000, 0x4000, CRC(e3b7a226) SHA1(c19a02a2def65648bf198fccec98ebbd2fc7c0fb) )
ROM_LOAD( "507j09.5f", 0x4000, 0x4000, CRC(504f0912) SHA1(b51a45dd5506bccdf0061dd6edd7f49ac86ed0f8) )
ROM_REGION( 0x10000, "gfx2", 0 )
ROM_LOAD( "507j04.3e", 0x0000, 0x4000, CRC(0d269524) SHA1(a10ddb405e884bfec521a3c7a29d22f63e535b59) ) /* sprites */
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "507j04.3e", 0x0000, 0x4000, CRC(0d269524) SHA1(a10ddb405e884bfec521a3c7a29d22f63e535b59) )
ROM_LOAD( "507j05.4e", 0x4000, 0x4000, CRC(27d4f6f4) SHA1(c42c064dbd7c5cf0b1d99651367e0bee1728a5b0) )
ROM_LOAD( "507j06.5e", 0x8000, 0x4000, CRC(717485cb) SHA1(22609489186dcb3d7cd49b7ddfdc6f04d0739354) )
ROM_LOAD( "507j07.3f", 0xc000, 0x4000, CRC(e933086f) SHA1(c0fd1e8d23c0f7e14c0b75f629448034420cf8ef) )
ROM_REGION( 0x0240, "proms", 0 )
ROM_LOAD( "507j10.1f", 0x0000, 0x0020, CRC(f1909605) SHA1(91eaa865375b3bc052897732b64b1ff7df3f78f6) ) /* red & green */
ROM_LOAD( "507j11.2f", 0x0020, 0x0020, CRC(f70bb122) SHA1(bf77990260e8346faa3d3481718cbe46a4a27150) ) /* blue */
ROM_LOAD( "507j13.7f", 0x0040, 0x0100, CRC(d4fe5c97) SHA1(972e9dab6c53722545dd3a43e3ada7921e88708b) ) /* char lookup */
ROM_LOAD( "507j12.6f", 0x0140, 0x0100, CRC(0266c7db) SHA1(a8f21e86e6d974c9bfd92a147689d0e7316d66e2) ) /* sprites lookup */
ROM_LOAD( "507j10.1f", 0x0000, 0x0020, CRC(f1909605) SHA1(91eaa865375b3bc052897732b64b1ff7df3f78f6) ) // red & green
ROM_LOAD( "507j11.2f", 0x0020, 0x0020, CRC(f70bb122) SHA1(bf77990260e8346faa3d3481718cbe46a4a27150) ) // blue
ROM_LOAD( "507j13.7f", 0x0040, 0x0100, CRC(d4fe5c97) SHA1(972e9dab6c53722545dd3a43e3ada7921e88708b) ) // char lookup
ROM_LOAD( "507j12.6f", 0x0140, 0x0100, CRC(0266c7db) SHA1(a8f21e86e6d974c9bfd92a147689d0e7316d66e2) ) // sprites lookup
ROM_REGION( 0x4000, "vlm", 0 ) /* speech rom */
ROM_REGION( 0x4000, "vlm", 0 ) // speech
ROM_LOAD( "507l01.8c", 0x0000, 0x4000, CRC(0c8a3605) SHA1(d886b66d3861c3a90a1825ccf5bf0011831ca366) ) // same data in both halves
ROM_END
@ -336,23 +498,23 @@ ROM_START( manhatan )
ROM_LOAD( "507n03.11d", 0x8000, 0x4000, CRC(e5039f7e) SHA1(0f12484ed40444d978e0405c27bdd027ae2e2a0b) )
ROM_LOAD( "507n02.9d", 0xc000, 0x4000, CRC(143cc62c) SHA1(9520dbb1b6f1fa439e03d4caa9bed96ef8f805f2) )
ROM_REGION( 0x08000, "gfx1", 0 )
ROM_LOAD( "507j08.4f", 0x0000, 0x4000, CRC(175e1b49) SHA1(4cfe982cdf7729bd05c6da803480571876320bf6) ) /* characters */
ROM_REGION( 0x08000, "tiles", 0 )
ROM_LOAD( "507j08.4f", 0x0000, 0x4000, CRC(175e1b49) SHA1(4cfe982cdf7729bd05c6da803480571876320bf6) )
ROM_LOAD( "507j09.5f", 0x4000, 0x4000, CRC(504f0912) SHA1(b51a45dd5506bccdf0061dd6edd7f49ac86ed0f8) )
ROM_REGION( 0x10000, "gfx2", 0 )
ROM_LOAD( "507j04.3e", 0x0000, 0x4000, CRC(0d269524) SHA1(a10ddb405e884bfec521a3c7a29d22f63e535b59) ) /* sprites */
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "507j04.3e", 0x0000, 0x4000, CRC(0d269524) SHA1(a10ddb405e884bfec521a3c7a29d22f63e535b59) )
ROM_LOAD( "507j05.4e", 0x4000, 0x4000, CRC(27d4f6f4) SHA1(c42c064dbd7c5cf0b1d99651367e0bee1728a5b0) )
ROM_LOAD( "507j06.5e", 0x8000, 0x4000, CRC(717485cb) SHA1(22609489186dcb3d7cd49b7ddfdc6f04d0739354) )
ROM_LOAD( "507j07.3f", 0xc000, 0x4000, CRC(e933086f) SHA1(c0fd1e8d23c0f7e14c0b75f629448034420cf8ef) )
ROM_REGION( 0x0240, "proms", 0 )
ROM_LOAD( "507j10.1f", 0x0000, 0x0020, CRC(f1909605) SHA1(91eaa865375b3bc052897732b64b1ff7df3f78f6) ) /* red & green */
ROM_LOAD( "507j11.2f", 0x0020, 0x0020, CRC(f70bb122) SHA1(bf77990260e8346faa3d3481718cbe46a4a27150) ) /* blue */
ROM_LOAD( "507j13.7f", 0x0040, 0x0100, CRC(d4fe5c97) SHA1(972e9dab6c53722545dd3a43e3ada7921e88708b) ) /* char lookup */
ROM_LOAD( "507j12.6f", 0x0140, 0x0100, CRC(0266c7db) SHA1(a8f21e86e6d974c9bfd92a147689d0e7316d66e2) ) /* sprites lookup */
ROM_LOAD( "507j10.1f", 0x0000, 0x0020, CRC(f1909605) SHA1(91eaa865375b3bc052897732b64b1ff7df3f78f6) ) // red & green
ROM_LOAD( "507j11.2f", 0x0020, 0x0020, CRC(f70bb122) SHA1(bf77990260e8346faa3d3481718cbe46a4a27150) ) // blue
ROM_LOAD( "507j13.7f", 0x0040, 0x0100, CRC(d4fe5c97) SHA1(972e9dab6c53722545dd3a43e3ada7921e88708b) ) // char lookup
ROM_LOAD( "507j12.6f", 0x0140, 0x0100, CRC(0266c7db) SHA1(a8f21e86e6d974c9bfd92a147689d0e7316d66e2) ) // sprites lookup
ROM_REGION( 0x4000, "vlm", 0 ) /* speech rom */
ROM_REGION( 0x4000, "vlm", 0 ) // speech
ROM_LOAD( "507p01.8c", 0x2000, 0x2000, CRC(973fa351) SHA1(ac360d05ed4d03334e00c80e70d5ae939d93af5f) ) // top half is blank
ROM_CONTINUE( 0x0000, 0x2000 )
ROM_END
@ -425,20 +587,20 @@ ROM_START( jailbrekb )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "1.k6", 0x8000, 0x8000, CRC(df0e8fc7) SHA1(62e59dbb3941ed8af365e96906315318d9aee060) )
ROM_REGION( 0x08000, "gfx1", 0 ) /* characters */
ROM_REGION( 0x08000, "tiles", 0 )
ROM_LOAD( "3.h6", 0x0000, 0x8000, CRC(bf67a8ff) SHA1(9aca8de7e2c2cc0ff9fe3f316a9300574df4ff06) )
ROM_REGION( 0x10000, "gfx2", 0 ) /* sprites */
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "5.f6", 0x0000, 0x8000, CRC(081d2eea) SHA1(dae66b2607d1a56e72e9cb456bdb3c0c21337d6c) )
ROM_LOAD( "4.g6", 0x8000, 0x8000, CRC(e34b93b8) SHA1(fb6ed12ab017ac1e5006165f435cf0ed95a49c17) )
ROM_REGION( 0x0240, "proms", 0 )
ROM_LOAD( "prom.j2", 0x0000, 0x0020, CRC(f1909605) SHA1(91eaa865375b3bc052897732b64b1ff7df3f78f6) ) /* red & green */
ROM_LOAD( "prom.i2", 0x0020, 0x0020, CRC(f70bb122) SHA1(bf77990260e8346faa3d3481718cbe46a4a27150) ) /* blue */
ROM_LOAD( "prom.d6", 0x0040, 0x0100, CRC(d4fe5c97) SHA1(972e9dab6c53722545dd3a43e3ada7921e88708b) ) /* char lookup */
ROM_LOAD( "prom.e6", 0x0140, 0x0100, CRC(0266c7db) SHA1(a8f21e86e6d974c9bfd92a147689d0e7316d66e2) ) /* sprites lookup */
ROM_LOAD( "prom.j2", 0x0000, 0x0020, CRC(f1909605) SHA1(91eaa865375b3bc052897732b64b1ff7df3f78f6) ) // red & green
ROM_LOAD( "prom.i2", 0x0020, 0x0020, CRC(f70bb122) SHA1(bf77990260e8346faa3d3481718cbe46a4a27150) ) // blue
ROM_LOAD( "prom.d6", 0x0040, 0x0100, CRC(d4fe5c97) SHA1(972e9dab6c53722545dd3a43e3ada7921e88708b) ) // char lookup
ROM_LOAD( "prom.e6", 0x0140, 0x0100, CRC(0266c7db) SHA1(a8f21e86e6d974c9bfd92a147689d0e7316d66e2) ) // sprites lookup
ROM_REGION( 0x2000, "vlm", 0 ) /* speech rom */
ROM_REGION( 0x2000, "vlm", 0 ) // speech
ROM_LOAD( "2.i6", 0x0000, 0x2000, CRC(d91d15e3) SHA1(475fe50aafbf8f2fb79880ef0e2c25158eda5270) )
ROM_REGION( 0x800, "plds", 0 )
@ -448,6 +610,9 @@ ROM_START( jailbrekb )
ROM_LOAD( "pal16l8.k8", 0x600, 0x104, CRC(38783f49) SHA1(101621b378bb9b5faad7d8e3acdbaa42b5045d45) )
ROM_END
} // anonymous namespace
GAME( 1986, jailbrek, 0, jailbrek, jailbrek, jailbrek_state, empty_init, ROT0, "Konami", "Jail Break", MACHINE_SUPPORTS_SAVE )
GAME( 1986, jailbrekb, jailbrek, jailbrek, jailbrek, jailbrek_state, empty_init, ROT0, "bootleg", "Jail Break (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, manhatan, jailbrek, jailbrek, jailbrek, jailbrek_state, empty_init, ROT0, "Konami", "Manhattan 24 Bunsyo (Japan)", MACHINE_SUPPORTS_SAVE )

View File

@ -1,77 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Ernesto Corvi
/***************************************************************************
Jailbreak
***************************************************************************/
#ifndef MAME_INCLUDES_JAILBREK_H
#define MAME_INCLUDES_JAILBREK_H
#pragma once
#include "sound/vlm5030.h"
#include "emupal.h"
#include "tilemap.h"
#define MASTER_CLOCK XTAL(18'432'000)
#define VOICE_CLOCK XTAL(3'579'545)
class jailbrek_state : public driver_device
{
public:
jailbrek_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_scroll_x(*this, "scroll_x"),
m_scroll_dir(*this, "scroll_dir"),
m_maincpu(*this, "maincpu"),
m_vlm(*this, "vlm"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
{ }
void jailbrek(machine_config &config);
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_scroll_x;
required_shared_ptr<uint8_t> m_scroll_dir;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<vlm5030_device> m_vlm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
/* video-related */
tilemap_t *m_bg_tilemap = nullptr;
/* misc */
uint8_t m_irq_enable = 0U;
uint8_t m_nmi_enable = 0U;
void ctrl_w(uint8_t data);
void coin_w(uint8_t data);
void videoram_w(offs_t offset, uint8_t data);
void colorram_w(offs_t offset, uint8_t data);
uint8_t speech_r();
void speech_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
void jailbrek_palette(palette_device &palette) const;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
INTERRUPT_GEN_MEMBER(interrupt_nmi);
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
void jailbrek_map(address_map &map);
void vlm_map(address_map &map);
};
#endif // MAME_INCLUDES_JAILBREK_H

View File

@ -1,119 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Ernesto Corvi
#include "emu.h"
#include "jailbrek.h"
void jailbrek_state::jailbrek_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 const r = pal4bit(color_prom[i + 0x00] >> 0);
int const g = pal4bit(color_prom[i + 0x00] >> 4);
int const b = pal4bit(color_prom[i + 0x20] >> 0);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
// color_prom now points to the beginning of the lookup table
color_prom += 0x40;
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
palette.set_pen_indirect(i, ctabentry);
}
for (int i = 0x100; i < 0x200; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry);
}
}
void jailbrek_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void jailbrek_state::colorram_w(offs_t offset, uint8_t data)
{
m_colorram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
TILE_GET_INFO_MEMBER(jailbrek_state::get_bg_tile_info)
{
int attr = m_colorram[tile_index];
int code = m_videoram[tile_index] + ((attr & 0xc0) << 2);
int color = attr & 0x0f;
tileinfo.set(0, code, color, 0);
}
void jailbrek_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(jailbrek_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
}
void jailbrek_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
uint8_t *spriteram = m_spriteram;
int i;
for (i = 0; i < m_spriteram.bytes(); i += 4)
{
int attr = spriteram[i + 1]; // attributes = ?tyxcccc
int code = spriteram[i] + ((attr & 0x40) << 2);
int color = attr & 0x0f;
int flipx = attr & 0x10;
int flipy = attr & 0x20;
int sx = spriteram[i + 2] - ((attr & 0x80) << 1);
int sy = spriteram[i + 3];
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->transmask(bitmap,cliprect, code, color, flipx, flipy,
sx, sy,
m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 0));
}
}
uint32_t jailbrek_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int i;
// added support for vertical scrolling (credits). 23/1/2002 -BR
// bit 2 appears to be horizontal/vertical scroll control
if (m_scroll_dir[0] & 0x04)
{
m_bg_tilemap->set_scroll_cols(32);
m_bg_tilemap->set_scroll_rows(1);
m_bg_tilemap->set_scrollx(0, 0);
for (i = 0; i < 32; i++)
m_bg_tilemap->set_scrolly(i, ((m_scroll_x[i + 32] << 8) + m_scroll_x[i]));
}
else
{
m_bg_tilemap->set_scroll_rows(32);
m_bg_tilemap->set_scroll_cols(1);
m_bg_tilemap->set_scrolly(0, 0);
for (i = 0; i < 32; i++)
m_bg_tilemap->set_scrollx(i, ((m_scroll_x[i + 32] << 8) + m_scroll_x[i]));
}
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}