supertnk.cpp, suprslam.cpp: used finders for memory banks, other small cleanups

This commit is contained in:
Ivan Vangelista 2022-07-05 21:25:45 +02:00
parent 7ead61188f
commit 2019137ff8
4 changed files with 244 additions and 257 deletions

View File

@ -101,18 +101,17 @@ former value is correct according to the parts list in the service manual.
#include "emu.h"
#include "cpu/tms9900/tms9980a.h"
#include "machine/74259.h"
#include "machine/watchdog.h"
#include "sound/ay8910.h"
#include "screen.h"
#include "speaker.h"
/* the color PROM is 32 bytes, but it is a repeating
every 8 bytes */
#define NUM_PENS (8)
namespace {
class supertnk_state : public driver_device
{
@ -121,6 +120,8 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_watchdog(*this, "watchdog")
, m_videoram(*this, "videoram%u", 0U, 0x2000U, ENDIANNESS_BIG)
, m_prgbank(*this, "prgbank")
{ }
void supertnk(machine_config &config);
@ -143,10 +144,12 @@ private:
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank_interrupt);
void supertnk_io_map(address_map &map);
void supertnk_map(address_map &map);
void io_map(address_map &map);
void prg_map(address_map &map);
// the color PROM is 32 bytes, but it is repeating every 8 bytes
static constexpr uint8_t NUM_PENS = 8;
std::unique_ptr<uint8_t[]> m_videoram[3];
uint8_t m_rom_bank = 0;
uint8_t m_bitplane_select = 0;
pen_t m_pens[NUM_PENS];
@ -154,12 +157,14 @@ private:
required_device<cpu_device> m_maincpu;
required_device<watchdog_timer_device> m_watchdog;
memory_share_array_creator<uint8_t, 3> m_videoram;
required_memory_bank m_prgbank;
};
void supertnk_state::machine_start()
{
membank("bank1")->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x1000);
m_prgbank->configure_entries(0, 4, memregion("maincpu")->base() + 0x800, 0x1000);
save_item(NAME(m_rom_bank));
save_item(NAME(m_bitplane_select));
@ -176,14 +181,14 @@ void supertnk_state::machine_start()
WRITE_LINE_MEMBER(supertnk_state::bankswitch_0_w)
{
m_rom_bank = (m_rom_bank & 0x02) | (state ? 0x01 : 0x00);
membank("bank1")->set_entry(m_rom_bank);
m_prgbank->set_entry(m_rom_bank);
}
WRITE_LINE_MEMBER(supertnk_state::bankswitch_1_w)
{
m_rom_bank = (m_rom_bank & 0x01) | (state ? 0x02 : 0x00);
membank("bank1")->set_entry(m_rom_bank);
m_prgbank->set_entry(m_rom_bank);
}
@ -223,21 +228,14 @@ WRITE_LINE_MEMBER(supertnk_state::watchdog_reset_w)
void supertnk_state::video_start()
{
offs_t i;
const uint8_t *prom = memregion("proms")->base();
for (i = 0; i < NUM_PENS; i++)
for (offs_t i = 0; i < NUM_PENS; i++)
{
uint8_t data = prom[i];
m_pens[i] = rgb_t(pal1bit(data >> 2), pal1bit(data >> 5), pal1bit(data >> 6));
}
for (int i = 0; i < 3; i++)
{
m_videoram[i] = std::make_unique<uint8_t[]>(0x2000);
save_pointer(NAME(m_videoram[i]), 0x2000, i);
}
}
@ -314,10 +312,10 @@ uint32_t supertnk_state::screen_update(screen_device &screen, bitmap_rgb32 &bitm
*
*************************************/
void supertnk_state::supertnk_map(address_map &map)
void supertnk_state::prg_map(address_map &map)
{
map(0x0000, 0x07ff).rom();
map(0x0800, 0x17ff).bankr("bank1");
map(0x0800, 0x17ff).bankr(m_prgbank);
map(0x1800, 0x1bff).ram();
map(0x1efc, 0x1efc).portr("JOYS");
map(0x1efd, 0x1efd).portr("INPUTS");
@ -335,7 +333,7 @@ void supertnk_state::supertnk_map(address_map &map)
*
*************************************/
void supertnk_state::supertnk_io_map(address_map &map)
void supertnk_state::io_map(address_map &map)
{
map(0x0000, 0x0001).nopw();
map(0x0800, 0x080f).w("outlatch", FUNC(ls259_device::write_d0));
@ -434,8 +432,8 @@ void supertnk_state::supertnk(machine_config &config)
{
// CPU TMS9980A; no line connections
TMS9980A(config, m_maincpu, 20.79_MHz_XTAL / 2); // divider not verified (possibly should be /3)
m_maincpu->set_addrmap(AS_PROGRAM, &supertnk_state::supertnk_map);
m_maincpu->set_addrmap(AS_IO, &supertnk_state::supertnk_io_map);
m_maincpu->set_addrmap(AS_PROGRAM, &supertnk_state::prg_map);
m_maincpu->set_addrmap(AS_IO, &supertnk_state::io_map);
ls259_device &outlatch(LS259(config, "outlatch")); // on CPU board near 2114 SRAM
outlatch.q_out_cb<0>().set(FUNC(supertnk_state::bitplane_select_0_w));
@ -447,13 +445,13 @@ void supertnk_state::supertnk(machine_config &config)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_raw(20.79_MHz_XTAL / 4, 330, 0, 32*8, 315, 0, 32*8); // parameters guessed
screen.set_screen_update(FUNC(supertnk_state::screen_update));
screen.screen_vblank().set(FUNC(supertnk_state::vblank_interrupt));
/* audio hardware */
// audio hardware
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", 2000000).add_route(ALL_OUTPUTS, "mono", 0.50);
@ -468,21 +466,21 @@ void supertnk_state::supertnk(machine_config &config)
*************************************/
ROM_START( supertnk )
ROM_REGION( 0x14000, "maincpu", 0 ) /* 64k for TMS9980 code + 16k of ROM */
ROM_LOAD( "supertan.2d", 0x00000, 0x0800, CRC(1656a2c1) SHA1(1d49945aed105003a051cfbf646af7a4be1b7e86) )
ROM_LOAD( "supertnk.3d", 0x10800, 0x0800, CRC(8b023a9a) SHA1(1afdc8d75f2ca04153bac20c0e3e123e2a7acdb7) )
ROM_CONTINUE( 0x10000, 0x0800)
ROM_LOAD( "supertnk.4d", 0x11800, 0x0800, CRC(b8249e5c) SHA1(ef4bb714b0c1b97890a067f05fc50ab3426ce37f) )
ROM_CONTINUE( 0x11000, 0x0800)
ROM_LOAD( "supertnk.8d", 0x12800, 0x0800, CRC(d8175a4f) SHA1(cba7b426773ac86c81a9eac81087a2db268cd0f9) )
ROM_CONTINUE( 0x12000, 0x0800)
ROM_LOAD( "supertnk.9d", 0x13800, 0x0800, CRC(a34a494a) SHA1(9b7f0560e9d569ee25eae56f31886d50a3153dcc) )
ROM_CONTINUE( 0x13000, 0x0800)
ROM_REGION( 0x4800, "maincpu", 0 ) // 64k for TMS9980 code + 16k of ROM
ROM_LOAD( "supertan.2d", 0x0000, 0x0800, CRC(1656a2c1) SHA1(1d49945aed105003a051cfbf646af7a4be1b7e86) )
ROM_LOAD( "supertnk.3d", 0x1000, 0x0800, CRC(8b023a9a) SHA1(1afdc8d75f2ca04153bac20c0e3e123e2a7acdb7) )
ROM_CONTINUE( 0x0800, 0x0800)
ROM_LOAD( "supertnk.4d", 0x2000, 0x0800, CRC(b8249e5c) SHA1(ef4bb714b0c1b97890a067f05fc50ab3426ce37f) )
ROM_CONTINUE( 0x1800, 0x0800)
ROM_LOAD( "supertnk.8d", 0x3000, 0x0800, CRC(d8175a4f) SHA1(cba7b426773ac86c81a9eac81087a2db268cd0f9) )
ROM_CONTINUE( 0x2800, 0x0800)
ROM_LOAD( "supertnk.9d", 0x4000, 0x0800, CRC(a34a494a) SHA1(9b7f0560e9d569ee25eae56f31886d50a3153dcc) )
ROM_CONTINUE( 0x3800, 0x0800)
ROM_REGION( 0x0060, "proms", 0 )
ROM_LOAD( "supertnk.clr", 0x0000, 0x0020, CRC(9ae1faee) SHA1(19de4bb8bc389d98c8f8e35c755fad96e1a6a0cd) ) /* color PROM */
ROM_LOAD( "supertnk.s", 0x0020, 0x0020, CRC(91722fcf) SHA1(f77386014b459cc151d2990ac823b91c04e8d319) ) /* unknown - sync? */
ROM_LOAD( "supertnk.t", 0x0040, 0x0020, CRC(154390bd) SHA1(4dc0fd7bd8999d2670c8d93aaada835d2a84d4db) ) /* unknown - sync? */
ROM_LOAD( "supertnk.clr", 0x0000, 0x0020, CRC(9ae1faee) SHA1(19de4bb8bc389d98c8f8e35c755fad96e1a6a0cd) ) // color PROM
ROM_LOAD( "supertnk.s", 0x0020, 0x0020, CRC(91722fcf) SHA1(f77386014b459cc151d2990ac823b91c04e8d319) ) // unknown - sync?
ROM_LOAD( "supertnk.t", 0x0040, 0x0020, CRC(154390bd) SHA1(4dc0fd7bd8999d2670c8d93aaada835d2a84d4db) ) // unknown - sync?
ROM_END
@ -495,15 +493,17 @@ ROM_END
void supertnk_state::init_supertnk()
{
/* decode the TMS9980 ROMs */
// decode the TMS9980 ROMs
uint8_t *rom = memregion("maincpu")->base();
size_t len = memregion("maincpu")->bytes();
for (offs_t offs = 0; offs < len; offs++)
{
rom[offs] = bitswap<8>(rom[offs],0,1,2,3,4,5,6,7);
rom[offs] = bitswap<8>(rom[offs], 0, 1, 2, 3, 4, 5, 6, 7);
}
}
} // anonymous namespace
GAME( 1981, supertnk, 0, supertnk, supertnk, supertnk_state, init_supertnk, ROT90, "Video Games GmbH", "Super Tank", MACHINE_SUPPORTS_SAVE )

View File

@ -83,40 +83,210 @@ EB26IC73.BIN 27C240 / Main Program
******************************************************************************/
#include "emu.h"
#include "suprslam.h"
#include "vs9209.h"
#include "vsystem_spr.h"
#include "cpu/z80/z80.h"
#include "cpu/m68000/m68000.h"
#include "vs9209.h"
#include "machine/gen_latch.h"
#include "sound/ymopn.h"
#include "video/k053936.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
namespace {
class suprslam_state : public driver_device
{
public:
suprslam_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_k053936(*this, "k053936"),
m_spr(*this, "vsystem_spr"),
m_palette(*this, "palette"),
m_gfxdecode(*this, "gfxdecode"),
m_soundlatch(*this, "soundlatch"),
m_screen_videoram(*this, "screen_videoram"),
m_bg_videoram(*this, "bg_videoram"),
m_sp_videoram(*this, "sp_videoram"),
m_spriteram(*this, "spriteram"),
m_screen_vregs(*this, "screen_vregs"),
m_soundbank(*this, "soundbank")
{ }
void suprslam(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<cpu_device> m_audiocpu;
required_device<k053936_device> m_k053936;
required_device<vsystem_spr_device> m_spr;
required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode;
required_device<generic_latch_8_device> m_soundlatch;
// memory pointers
required_shared_ptr<uint16_t> m_screen_videoram;
required_shared_ptr<uint16_t> m_bg_videoram;
required_shared_ptr<uint16_t> m_sp_videoram;
required_shared_ptr<uint16_t> m_spriteram;
required_shared_ptr<uint16_t> m_screen_vregs;
required_memory_bank m_soundbank;
// video-related
tilemap_t *m_screen_tilemap = nullptr;
tilemap_t *m_bg_tilemap = nullptr;
uint16_t m_screen_bank = 0;
uint16_t m_bg_bank = 0;
uint8_t m_spr_ctrl = 0;
uint32_t tile_callback(uint32_t code);
void sh_bankswitch_w(uint8_t data);
void screen_videoram_w(offs_t offset, uint16_t data);
void bg_videoram_w(offs_t offset, uint16_t data);
void bank_w(uint16_t data);
void spr_ctrl_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_tile_info);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void sound_io_map(address_map &map);
void sound_map(address_map &map);
void main_map(address_map &map);
};
// video
// FG 'SCREEN' LAYER
void suprslam_state::screen_videoram_w(offs_t offset, uint16_t data)
{
m_screen_videoram[offset] = data;
m_screen_tilemap->mark_tile_dirty(offset);
}
TILE_GET_INFO_MEMBER(suprslam_state::get_tile_info)
{
int tileno = m_screen_videoram[tile_index] & 0x0fff;
int colour = m_screen_videoram[tile_index] & 0xf000;
tileno += m_screen_bank;
colour = colour >> 12;
tileinfo.set(0, tileno, colour, 0);
}
// BG LAYER
void suprslam_state::bg_videoram_w(offs_t offset, uint16_t data)
{
m_bg_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
TILE_GET_INFO_MEMBER(suprslam_state::get_bg_tile_info)
{
int tileno = m_bg_videoram[tile_index] & 0x0fff;
int colour = m_bg_videoram[tile_index] & 0xf000;
tileno += m_bg_bank;
colour = colour >> 12;
tileinfo.set(2, tileno, colour, 0);
}
uint32_t suprslam_state::tile_callback(uint32_t code)
{
return m_sp_videoram[code];
}
void suprslam_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(suprslam_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 64);
m_screen_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(suprslam_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_spr_ctrl = 0;
m_screen_tilemap->set_transparent_pen(15);
}
void suprslam_state::spr_ctrl_w(uint8_t data)
{
m_spr_ctrl = data;
}
uint32_t suprslam_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_screen_tilemap->set_scrollx(0, m_screen_vregs[0x04 / 2] );
bitmap.fill(m_palette->black_pen(), cliprect);
m_k053936->zoom_draw(screen, bitmap, cliprect, m_bg_tilemap, 0, 0, 1);
if (!(m_spr_ctrl & 8))
m_spr->draw_sprites(m_spriteram, m_spriteram.bytes(), screen, bitmap, cliprect);
m_screen_tilemap->draw(screen, bitmap, cliprect, 0, 0);
if (m_spr_ctrl & 8)
m_spr->draw_sprites(m_spriteram, m_spriteram.bytes(), screen, bitmap, cliprect);
return 0;
}
void suprslam_state::bank_w(uint16_t data)
{
uint16_t old_screen_bank = m_screen_bank;
uint16_t old_bg_bank = m_bg_bank;
m_screen_bank = data & 0xf000;
m_bg_bank = (data & 0x0f00) << 4;
if (m_screen_bank != old_screen_bank)
m_screen_tilemap->mark_all_dirty();
if (m_bg_bank != old_bg_bank)
m_bg_tilemap->mark_all_dirty();
}
// machine
/*** SOUND *******************************************************************/
void suprslam_state::suprslam_sh_bankswitch_w(uint8_t data)
void suprslam_state::sh_bankswitch_w(uint8_t data)
{
membank("bank1")->set_entry(data & 0x03);
m_soundbank->set_entry(data & 0x03);
}
/*** MEMORY MAPS *************************************************************/
void suprslam_state::suprslam_map(address_map &map)
void suprslam_state::main_map(address_map &map)
{
map(0x000000, 0x0fffff).rom();
map(0xfb0000, 0xfb1fff).ram().share("spriteram");
map(0xfc0000, 0xfcffff).ram().share("sp_videoram");
map(0xfb0000, 0xfb1fff).ram().share(m_spriteram);
map(0xfc0000, 0xfcffff).ram().share(m_sp_videoram);
map(0xfd0000, 0xfdffff).ram();
map(0xfe0000, 0xfe0fff).ram().w(FUNC(suprslam_state::suprslam_screen_videoram_w)).share("screen_videoram");
map(0xff0000, 0xff1fff).ram().w(FUNC(suprslam_state::suprslam_bg_videoram_w)).share("bg_videoram");
map(0xff2000, 0xff203f).ram().share("screen_vregs");
map(0xfe0000, 0xfe0fff).ram().w(FUNC(suprslam_state::screen_videoram_w)).share(m_screen_videoram);
map(0xff0000, 0xff1fff).ram().w(FUNC(suprslam_state::bg_videoram_w)).share(m_bg_videoram);
map(0xff2000, 0xff203f).ram().share(m_screen_vregs);
map(0xff3000, 0xff3001).nopw(); // sprite buffer trigger?
map(0xff8000, 0xff8fff).rw(m_k053936, FUNC(k053936_device::linectrl_r), FUNC(k053936_device::linectrl_w));
map(0xff9001, 0xff9001).w(m_soundlatch, FUNC(generic_latch_8_device::write));
map(0xffa000, 0xffafff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0xffd000, 0xffd01f).w(m_k053936, FUNC(k053936_device::ctrl_w));
map(0xffe000, 0xffe001).w(FUNC(suprslam_state::suprslam_bank_w));
map(0xffe000, 0xffe001).w(FUNC(suprslam_state::bank_w));
map(0xfff000, 0xfff01f).rw("io", FUNC(vs9209_device::read), FUNC(vs9209_device::write)).umask16(0x00ff);
}
@ -124,13 +294,13 @@ void suprslam_state::sound_map(address_map &map)
{
map(0x0000, 0x77ff).rom();
map(0x7800, 0x7fff).ram();
map(0x8000, 0xffff).bankr("bank1");
map(0x8000, 0xffff).bankr(m_soundbank);
}
void suprslam_state::sound_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).w(FUNC(suprslam_state::suprslam_sh_bankswitch_w));
map(0x00, 0x00).w(FUNC(suprslam_state::sh_bankswitch_w));
map(0x04, 0x04).rw(m_soundlatch, FUNC(generic_latch_8_device::read), FUNC(generic_latch_8_device::acknowledge_w));
map(0x08, 0x0b).rw("ymsnd", FUNC(ym2610_device::read), FUNC(ym2610_device::write));
}
@ -234,9 +404,9 @@ static const gfx_layout suprslam_16x16x4_layout =
};
static GFXDECODE_START( gfx_suprslam )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0x000, 16 )
GFXDECODE_ENTRY( "gfx2", 0, suprslam_16x16x4_layout, 0x200, 16 )
GFXDECODE_ENTRY( "gfx3", 0, suprslam_16x16x4_layout, 0x100, 16 )
GFXDECODE_ENTRY( "fgtiles", 0, gfx_8x8x4_packed_lsb, 0x000, 16 )
GFXDECODE_ENTRY( "sprites", 0, suprslam_16x16x4_layout, 0x200, 16 )
GFXDECODE_ENTRY( "bgtiles", 0, suprslam_16x16x4_layout, 0x100, 16 )
GFXDECODE_END
@ -248,7 +418,7 @@ void suprslam_state::machine_start()
save_item(NAME(m_bg_bank));
save_item(NAME(m_spr_ctrl));
membank("bank1")->configure_entries(0, 4, memregion("audiocpu")->base() + 0x10000, 0x8000);
m_soundbank->configure_entries(0, 4, memregion("audiocpu")->base(), 0x8000);
}
void suprslam_state::machine_reset()
@ -259,11 +429,11 @@ void suprslam_state::machine_reset()
void suprslam_state::suprslam(machine_config &config)
{
M68000(config, m_maincpu, 16000000);
m_maincpu->set_addrmap(AS_PROGRAM, &suprslam_state::suprslam_map);
M68000(config, m_maincpu, 32_MHz_XTAL / 2); // divider not verified
m_maincpu->set_addrmap(AS_PROGRAM, &suprslam_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(suprslam_state::irq1_line_hold));
Z80(config, m_audiocpu, 8000000/2); /* 4 MHz ??? */
Z80(config, m_audiocpu, 32_MHz_XTAL / 8); // 4 MHz ??? not verified
m_audiocpu->set_addrmap(AS_PROGRAM, &suprslam_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &suprslam_state::sound_io_map);
@ -280,16 +450,16 @@ void suprslam_state::suprslam(machine_config &config)
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2300)); /* hand-tuned */
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2300)); // hand-tuned
screen.set_size(64*8, 64*8);
screen.set_visarea(0*8, 40*8-1, 0*8, 28*8-1);
screen.set_screen_update(FUNC(suprslam_state::screen_update_suprslam));
screen.set_screen_update(FUNC(suprslam_state::screen_update));
screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xGBR_555, 0x800);
VSYSTEM_SPR(config, m_spr, 0);
m_spr->set_tile_indirect_cb(FUNC(suprslam_state::suprslam_tile_callback));
m_spr->set_tile_indirect_cb(FUNC(suprslam_state::tile_callback));
m_spr->set_gfx_region(1);
m_spr->set_gfxdecode_tag(m_gfxdecode);
@ -304,7 +474,7 @@ void suprslam_state::suprslam(machine_config &config)
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
m_soundlatch->set_separate_acknowledge(true);
ym2610_device &ymsnd(YM2610(config, "ymsnd", 8000000));
ym2610_device &ymsnd(YM2610(config, "ymsnd", 32_MHz_XTAL / 4)); // not verified
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
ymsnd.add_route(0, "lspeaker", 0.25);
ymsnd.add_route(0, "rspeaker", 0.25);
@ -315,34 +485,36 @@ void suprslam_state::suprslam(machine_config &config)
/*** ROM LOADING *************************************************************/
ROM_START( suprslam )
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */
ROM_REGION( 0x100000, "maincpu", 0 ) // 68000 Code
ROM_LOAD16_WORD_SWAP( "eb26ic47.bin", 0x000000, 0x080000, CRC(8d051fd8) SHA1(1820209306116e5b09cc10a8b3661d232c688b24) )
ROM_LOAD16_WORD_SWAP( "eb26ic73.bin", 0x080000, 0x080000, CRC(ca4ad383) SHA1(143ee475761fa54d5b3a9f4e3fb3acc8408972fd) )
ROM_REGION( 0x030000, "audiocpu", 0 ) /* Z80 Code */
ROM_REGION( 0x030000, "audiocpu", 0 ) // Z80 Code
ROM_LOAD( "eb26ic38.bin", 0x000000, 0x020000, CRC(153f2c50) SHA1(b70f248cfb18239fcd26e36fb36159f219debf2c) )
ROM_RELOAD( 0x010000, 0x020000 )
ROM_REGION( 0x200000, "ymsnd:adpcma", 0 ) /* Samples */
ROM_REGION( 0x200000, "ymsnd:adpcma", 0 ) // Samples
ROM_LOAD( "eb26ic66.bin", 0x000000, 0x200000, CRC(8cb33682) SHA1(0e6189ef0673227d35b9a154e333cc6cf9b65df6) )
ROM_REGION( 0x100000, "ymsnd:adpcmb", 0 ) /* Samples */
ROM_REGION( 0x100000, "ymsnd:adpcmb", 0 ) // Samples
ROM_LOAD( "eb26ic59.bin", 0x000000, 0x100000, CRC(4ae4095b) SHA1(62b0600b18febb6cecb6370b03a2d6b7756840a2) )
ROM_REGION( 0x200000, "gfx1", 0 ) /* 8x8x4 'Screen' Layer GFX */
ROM_REGION( 0x200000, "fgtiles", 0 ) // 8x8x4 'Screen' Layer GFX
ROM_LOAD( "eb26ic43.bin", 0x000000, 0x200000, CRC(9dfb0959) SHA1(ba479192a422a55efcf8aa7ff995c914525b4a56) )
ROM_REGION( 0x800000, "gfx2", 0 ) /* 16x16x4 Sprites GFX */
ROM_REGION( 0x800000, "sprites", 0 ) // 16x16x4 Sprites GFX
ROM_LOAD( "eb26ic09.bin", 0x000000, 0x200000, CRC(5a415365) SHA1(a59a4ab231980b0540e9a8356a02530217779dbd) )
ROM_LOAD( "eb26ic10.bin", 0x200000, 0x200000, CRC(a04f3140) SHA1(621ff823d93fecdde801912064ac951727b71677) )
ROM_LOAD( "eb26_100.bin", 0x400000, 0x200000, CRC(c2ee5eb6) SHA1(4b61e77a0d0f38b542d5e32fa25799a4c85bf651) )
ROM_LOAD( "eb26_101.bin", 0x600000, 0x200000, CRC(7df654b7) SHA1(3a5ed6ee7cc31566e908b835a065e9bce60389fb) )
ROM_REGION( 0x400000, "gfx3", 0 ) /* 16x16x4 BG GFX */
ROM_REGION( 0x400000, "bgtiles", 0 ) // 16x16x4 BG GFX
ROM_LOAD( "eb26ic12.bin", 0x000000, 0x200000, CRC(14561bd7) SHA1(5f69f68a305aba9acb21b844c8aa5b1de60f89ff) )
ROM_LOAD( "eb26ic36.bin", 0x200000, 0x200000, CRC(92019d89) SHA1(dbf6f8384341707996e4b9e07a3d4f536cf4905b) )
ROM_END
} // anonymous namespace
/*** GAME DRIVERS ************************************************************/
GAME( 1995, suprslam, 0, suprslam, suprslam, suprslam_state, empty_init, ROT0, "Banpresto / Toei Animation / Video System Co.", "From TV Animation Slam Dunk - Super Slams", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // Video System credited in ending screen

View File

@ -1,86 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/*************************************************************************
Super Slams
*************************************************************************/
#ifndef MAME_VSYSTEM_SUPRSLAM_H
#define MAME_VSYSTEM_SUPRSLAM_H
#pragma once
#include "vsystem_spr.h"
#include "machine/gen_latch.h"
#include "video/k053936.h"
#include "tilemap.h"
class suprslam_state : public driver_device
{
public:
suprslam_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_screen_videoram(*this, "screen_videoram"),
m_bg_videoram(*this, "bg_videoram"),
m_sp_videoram(*this, "sp_videoram"),
m_spriteram(*this, "spriteram"),
m_screen_vregs(*this, "screen_vregs"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_k053936(*this, "k053936"),
m_spr(*this, "vsystem_spr"),
m_palette(*this, "palette"),
m_gfxdecode(*this, "gfxdecode"),
m_soundlatch(*this, "soundlatch")
{ }
void suprslam(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<uint16_t> m_screen_videoram;
required_shared_ptr<uint16_t> m_bg_videoram;
required_shared_ptr<uint16_t> m_sp_videoram;
required_shared_ptr<uint16_t> m_spriteram;
required_shared_ptr<uint16_t> m_screen_vregs;
/* video-related */
tilemap_t *m_screen_tilemap = nullptr;
tilemap_t *m_bg_tilemap = nullptr;
uint16_t m_screen_bank = 0;
uint16_t m_bg_bank = 0;
uint32_t suprslam_tile_callback( uint32_t code );
uint8_t m_spr_ctrl = 0;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<k053936_device> m_k053936;
required_device<vsystem_spr_device> m_spr;
required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode;
required_device<generic_latch_8_device> m_soundlatch;
void suprslam_sh_bankswitch_w(uint8_t data);
void suprslam_screen_videoram_w(offs_t offset, uint16_t data);
void suprslam_bg_videoram_w(offs_t offset, uint16_t data);
void suprslam_bank_w(uint16_t data);
void spr_ctrl_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_suprslam_tile_info);
TILE_GET_INFO_MEMBER(get_suprslam_bg_tile_info);
uint32_t screen_update_suprslam(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void sound_io_map(address_map &map);
void sound_map(address_map &map);
void suprslam_map(address_map &map);
};
#endif // MAME_VSYSTEM_SUPRSLAM_H

View File

@ -1,99 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/* Super Slams - video, see notes in driver file */
#include "emu.h"
#include "vsystem_spr.h"
#include "suprslam.h"
/* FG 'SCREEN' LAYER */
void suprslam_state::suprslam_screen_videoram_w(offs_t offset, uint16_t data)
{
m_screen_videoram[offset] = data;
m_screen_tilemap->mark_tile_dirty(offset);
}
TILE_GET_INFO_MEMBER(suprslam_state::get_suprslam_tile_info)
{
int tileno = m_screen_videoram[tile_index] & 0x0fff;
int colour = m_screen_videoram[tile_index] & 0xf000;
tileno += m_screen_bank;
colour = colour >> 12;
tileinfo.set(0, tileno, colour, 0);
}
/* BG LAYER */
void suprslam_state::suprslam_bg_videoram_w(offs_t offset, uint16_t data)
{
m_bg_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
TILE_GET_INFO_MEMBER(suprslam_state::get_suprslam_bg_tile_info)
{
int tileno = m_bg_videoram[tile_index] & 0x0fff;
int colour = m_bg_videoram[tile_index] & 0xf000;
tileno += m_bg_bank;
colour = colour >> 12;
tileinfo.set(2, tileno, colour, 0);
}
uint32_t suprslam_state::suprslam_tile_callback( uint32_t code )
{
return m_sp_videoram[code];
}
void suprslam_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(suprslam_state::get_suprslam_bg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 64);
m_screen_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(suprslam_state::get_suprslam_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_spr_ctrl = 0;
m_screen_tilemap->set_transparent_pen(15);
}
void suprslam_state::spr_ctrl_w(uint8_t data)
{
m_spr_ctrl = data;
}
uint32_t suprslam_state::screen_update_suprslam(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_screen_tilemap->set_scrollx(0, m_screen_vregs[0x04/2] );
bitmap.fill(m_palette->black_pen(), cliprect);
m_k053936->zoom_draw(screen, bitmap, cliprect, m_bg_tilemap, 0, 0, 1);
if(!(m_spr_ctrl & 8))
m_spr->draw_sprites(m_spriteram, m_spriteram.bytes(), screen, bitmap, cliprect);
m_screen_tilemap->draw(screen, bitmap, cliprect, 0, 0);
if(m_spr_ctrl & 8)
m_spr->draw_sprites(m_spriteram, m_spriteram.bytes(), screen, bitmap, cliprect);
return 0;
}
void suprslam_state::suprslam_bank_w(uint16_t data)
{
uint16_t old_screen_bank, old_bg_bank;
old_screen_bank = m_screen_bank;
old_bg_bank = m_bg_bank;
m_screen_bank = data & 0xf000;
m_bg_bank = (data & 0x0f00) << 4;
if (m_screen_bank != old_screen_bank)
m_screen_tilemap->mark_all_dirty();
if (m_bg_bank != old_bg_bank)
m_bg_tilemap->mark_all_dirty();
}