- funworld/supercrd.cpp: some more XOR tables tweaks for supercrd and the gampo sets

- nichibutsu/terracre.cpp, taito/topspeed.cpp: consolidated drivers in single files
This commit is contained in:
Ivan Vangelista 2023-07-10 22:47:19 +02:00
parent 793afee14b
commit 1a5f456b73
8 changed files with 839 additions and 865 deletions

View File

@ -1005,7 +1005,7 @@ void supercrd_state::init_supercrd() // TODO: check unknown opcodes
{ 0x52, 0x50, 0x13, 0x01, 0x52, 0x02, 0x03, 0x52 }, // 0x5x and 0x7x
{ 0x43, unkn, 0x50, 0x41, 0x12, 0x51, 0x11, unkn }, // 0x8x and 0xax
{ 0x43, 0x01, 0x01, 0x42, unkn, unkn, 0x40, unkn }, // 0x9x and 0xbx
{ unkn, unkn, unkn, 0x52, unkn, 0x00, 0x53, 0x01 }, // 0xcx and 0xex
{ unkn, unkn, unkn, 0x52, 0x00, 0x00, 0x53, 0x01 }, // 0xcx and 0xex
{ 0x51, 0x10, 0x12, 0x41, 0x50, 0x00, 0x50, 0x50 } // 0xdx and 0xfx
},
{ // quadrant 1 should be ok, missing decrypted 0x17, 0x44 0x80, 0x81, 0x82, 0x83, 0x85, 0xc7, 0xd0
@ -1018,7 +1018,7 @@ void supercrd_state::init_supercrd() // TODO: check unknown opcodes
{ 0x01, 0x02, unkn, 0x50, 0x51, 0x00, 0x51, 0x10 }, // 0xcx and 0xex
{ 0x42, unkn, unkn, unkn, 0x00, 0x41, unkn, 0x01 } // 0xdx and 0xfx
},
{ // quadrants 1,2 should be ok, missing decrypted 0x84, 0x94, 0x96, 0xc7, 0xd7
{ // quadrants 1,2,3 should be ok, missing decrypted 0x84, 0x94, 0x96, 0xc7, 0xd7
{ 0x42, 0x00, 0x43, 0x53, 0x03, 0x53, 0x00, 0x11 }, // 0x0x and 0x2x
{ 0x13, 0x02, 0x12, 0x11, 0x41, 0x02, 0x50, 0x53 }, // 0x1x and 0x3x
{ 0x00, 0x12, 0x52, 0x12, 0x03, 0x00, 0x43, 0x43 }, // 0x4x and 0x6x
@ -1112,9 +1112,9 @@ void supercrd_state::init_gampo() // TODO: check unknown opcodes
uint8_t xor_table[0x04][0x08][0x08] =
{
{ // quadrant 1 should be ok, missing decrypted 0x14, 0x17, 0x82, 0x84, 0xc7, 0xd0
{ 0x51, 0x12, 0x41, 0x02, 0x02, 0x13, unkn, 0x43 }, // 0x0x and 0x2x
{ 0x43, 0x12, 0x53, 0x43, 0x53, 0x00, unkn, 0x51 }, // 0x1x and 0x3x
{ // quadrants 1, 2 should be ok, missing decrypted 0x82, 0x84, 0xc7, 0xd0
{ 0x51, 0x12, 0x41, 0x02, 0x02, 0x13, 0x11, 0x43 }, // 0x0x and 0x2x
{ 0x43, 0x12, 0x53, 0x43, 0x53, 0x00, 0x02, 0x51 }, // 0x1x and 0x3x
{ 0x51, 0x01, 0x52, 0x43, 0x43, 0x00, 0x42, 0x12 }, // 0x4x and 0x6x
{ 0x42, 0x53, 0x10, 0x01, 0x00, 0x03, 0x01, 0x52 }, // 0x5x and 0x7x
{ 0x42, 0x00, 0x50, unkn, 0x13, unkn, 0x01, 0x41 }, // 0x8x and 0xax
@ -1122,33 +1122,33 @@ void supercrd_state::init_gampo() // TODO: check unknown opcodes
{ 0x50, 0x41, 0x13, 0x40, unkn, 0x00, unkn, 0x52 }, // 0xcx and 0xex
{ 0x11, 0x42, 0x01, unkn, unkn, 0x41, 0x12, 0x01 } // 0xdx and 0xfx
},
{ // quadrants 1, 2 should be ok, missing decrypted 0x80, 0x82, 0x83, 0x85, 0x94, 0xc7, 0xd0
{ // quadrants 1, 2 should be ok, missing decrypted 0x80, 0x82, 0x83, 0x94, 0xc7, 0xd0
{ 0x10, 0x51, 0x50, 0x02, 0x11, 0x02, 0x41, 0x01 }, // 0x0x and 0x2x
{ 0x50, 0x13, 0x51, 0x01, 0x43, 0x02, 0x02, 0x42 }, // 0x1x and 0x3x
{ 0x02, 0x41, 0x11, 0x02, 0x40, 0x00, 0x12, 0x51 }, // 0x4x and 0x6x
{ 0x53, 0x40, 0x41, 0x02, 0x02, 0x13, 0x12, 0x52 }, // 0x5x and 0x7x
{ 0x12, 0x12, 0x40, 0x50, 0x53, 0x12, 0x40, 0x51 }, // 0x8x and 0xax
{ unkn, 0x01, unkn, 0x02, 0x01, unkn, unkn, 0x10 }, // 0x9x and 0xbx
{ unkn, 0x01, unkn, 0x02, 0x01, 0x10, unkn, 0x10 }, // 0x9x and 0xbx
{ unkn, 0x02, 0x02, 0x02, 0x42, 0x00, 0x50, 0x03 }, // 0xcx and 0xex
{ 0x01, 0x03, 0x53, unkn, 0x00, 0x51, unkn, 0x02 } // 0xdx and 0xfx
},
{ // quadrant 1 should be ok, missing decrypted 0x17, 0x44, 0x80, 0x83, 0x96, 0xc7, 0xd0, 0xd7
{ // quadrant 1 should be ok, missing decrypted 0x17, 0x44, 0x80, 0x96, 0xc7, 0xd0, 0xd7
{ 0x52, 0x02, 0x00, 0x13, 0x43, 0x01, 0x03, unkn }, // 0x0x and 0x2x
{ 0x02, 0x00, 0x12, 0x51, 0x01, 0x40, 0x42, 0x03 }, // 0x1x and 0x3x
{ 0x03, 0x10, 0x43, 0x13, 0x43, 0x00, 0x00, 0x41 }, // 0x4x and 0x6x
{ 0x03, 0x10, 0x41, 0x13, 0x02, 0x43, 0x01, unkn }, // 0x5x and 0x7x
{ 0x52, 0x50, unkn, 0x41, unkn, unkn, 0x02, 0x52 }, // 0x8x and 0xax
{ 0x00, 0x00, unkn, unkn, 0x01, unkn, 0x01, 0x10 }, // 0x9x and 0xbx
{ 0x00, 0x00, unkn, 0x10, 0x01, unkn, 0x01, 0x10 }, // 0x9x and 0xbx
{ 0x41, 0x12, unkn, 0x50, 0x10, 0x00, 0x02, 0x53 }, // 0xcx and 0xex
{ 0x10, 0x10, 0x40, 0x10, 0x12, unkn, 0x50, 0x01 } // 0xdx and 0xfx
},
{ // quadrants 1, 2 should be ok, missing decrypted 0x94, 0xc7
{ // quadrants 1, 2, 3 should be ok, missing decrypted 0x94, 0xc7
{ 0x02, 0x43, 0x52, 0x51, 0x42, 0x41, 0x50, 0x13 }, // 0x0x and 0x2x
{ 0x43, 0x11, 0x00, 0x03, 0x10, 0x10, 0x43, 0x40 }, // 0x1x and 0x3x
{ 0x51, 0x42, 0x13, 0x42, 0x43, 0x00, 0x51, 0x13 }, // 0x4x and 0x6x
{ 0x13, 0x11, 0x41, 0x12, 0x41, 0x53, 0x11, 0x41 }, // 0x5x and 0x7x
{ unkn, 0x42, 0x51, 0x43, 0x03, 0x03, 0x51, 0x43 }, // 0x8x and 0xax
{ 0x52, 0x02, unkn, 0x03, 0x11, 0x03, unkn, 0x00 }, // 0x9x and 0xbx
{ 0x12, 0x42, 0x51, 0x43, 0x03, 0x03, 0x51, 0x43 }, // 0x8x and 0xax
{ 0x52, 0x02, 0x12, 0x03, 0x11, 0x03, unkn, 0x00 }, // 0x9x and 0xbx
{ 0x41, 0x43, 0x10, 0x02, 0x51, 0x00, 0x13, 0x13 }, // 0xcx and 0xex
{ 0x00, 0x52, 0x03, 0x42, 0x02, 0x13, 0x52, unkn } // 0xdx and 0xfx
}

View File

@ -1,5 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Carlos A. Lozano
// copyright-holders: Carlos A. Lozano
/******************************************************************
Terra Cresta (preliminary)
Nichibutsu 1985
@ -81,21 +82,304 @@ AT-2
*/
#include "emu.h"
#include "terracre.h"
#include "nb1412m2.h"
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "machine/rescap.h"
#include "sound/dac.h"
#include "sound/flt_biquad.h"
#include "sound/mixer.h"
#include "sound/ymopn.h"
#include "sound/ymopl.h"
#include "video/bufsprite.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
void terracre_state::amazon_sound_w(uint16_t data)
namespace {
class terracre_state : public driver_device
{
public:
terracre_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_spriteram(*this, "spriteram")
, m_soundlatch(*this, "soundlatch")
, m_dacfilter1(*this, "dacfilter1")
, m_dacfilter2(*this, "dacfilter2")
, m_ymfilter(*this, "ymfilter")
, m_ssgmixer(*this, "ssgmixer")
, m_ssgfilter_abfilt(*this, "ssg_abfilt")
, m_ssgfilter_abgain(*this, "ssg_abgain")
, m_ssgfilter_cgain(*this, "ssg_cgain")
, m_bg_videoram(*this, "bg_videoram")
, m_fg_videoram(*this, "fg_videoram")
, m_coltable(*this, "palbank_prom")
{ }
void amazon_base(machine_config &config);
void horekidb2(machine_config &config);
void tc_base(machine_config &config);
void ym2203(machine_config &config);
void ym3526(machine_config &config);
protected:
virtual void video_start() override;
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
void amazon_base_map(address_map &map);
private:
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<buffered_spriteram16_device> m_spriteram;
required_device<generic_latch_8_device> m_soundlatch;
required_device<filter_biquad_device> m_dacfilter1;
required_device<filter_biquad_device> m_dacfilter2;
required_device<filter_biquad_device> m_ymfilter;
optional_device<mixer_device> m_ssgmixer;
optional_device<filter_biquad_device> m_ssgfilter_abfilt;
optional_device<filter_biquad_device> m_ssgfilter_abgain;
optional_device<filter_biquad_device> m_ssgfilter_cgain;
required_shared_ptr<uint16_t> m_bg_videoram;
required_shared_ptr<uint16_t> m_fg_videoram;
required_region_ptr<uint8_t> m_coltable;
uint16_t m_xscroll = 0;
uint16_t m_yscroll = 0;
tilemap_t *m_background = nullptr;
tilemap_t *m_foreground = nullptr;
void sound_w(uint16_t data);
uint8_t soundlatch_clear_r();
void background_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void foreground_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void flipscreen_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void scrolly_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void scrollx_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
void palette(palette_device &palette) const;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void horekidb2_map(address_map &map);
void sound_2203_io_map(address_map &map);
void sound_3526_io_map(address_map &map);
void sound_map(address_map &map);
void terracre_map(address_map &map);
};
class amazon_state : public terracre_state
{
public:
amazon_state(const machine_config &mconfig, device_type type, const char *tag) :
terracre_state(mconfig, type, tag),
m_prot(*this, "prot_chip")
{ }
void amazon_1412m2(machine_config &config);
private:
required_device<nb1412m2_device> m_prot;
void amazon_1412m2_map(address_map &map);
};
// video
TILE_GET_INFO_MEMBER(terracre_state::get_bg_tile_info)
{
/* xxxx.----.----.----
* ----.xx--.----.----
* ----.--xx.xxxx.xxxx */
const unsigned data = m_bg_videoram[tile_index];
const unsigned color = data >> 11;
tileinfo.set(1, data & 0x3ff, color, 0);
}
TILE_GET_INFO_MEMBER(terracre_state::get_fg_tile_info)
{
const unsigned data = m_fg_videoram[tile_index];
tileinfo.set(0, data & 0xff, 0, 0);
}
void terracre_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
gfx_element *pGfx = m_gfxdecode->gfx(2);
const uint16_t *pSource = m_spriteram->buffer();
const int flip = flip_screen();
int transparent_pen;
if (pGfx->elements() > 0x200)
transparent_pen = 0xf; // HORE HORE Kid
else
transparent_pen = 0x0;
for (int i = 0; i < 0x200; i += 8)
{
int tile = pSource[1] & 0xff;
const int attrs = pSource[2];
int flipx = attrs & 0x04;
int flipy = attrs & 0x08;
int color = (attrs & 0xf0) >> 4;
int sx = (pSource[3] & 0xff) - 0x80 + 256 * (attrs & 1);
int sy = 240 - (pSource[0] & 0xff);
if (transparent_pen)
{
if (attrs & 0x02) tile |= 0x200;
if (attrs & 0x10) tile |= 0x100;
int bank = (tile & 0xfc) >> 1;
if (tile & 0x200) bank |= 0x80;
if (tile & 0x100) bank |= 0x01;
color &= 0xe;
color += 16 * (m_coltable[bank] & 0xf);
}
else
{
if (attrs & 0x02) tile|= 0x100;
color += 16 * (m_coltable[(tile >> 1) & 0xff] & 0x0f);
}
if (flip)
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
pGfx->transpen(bitmap, cliprect, tile, color, flipx, flipy, sx, sy, transparent_pen);
pSource += 4;
}
}
void terracre_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 < 0x100; i++)
{
int const r = pal4bit(color_prom[i + 0x000]);
int const g = pal4bit(color_prom[i + 0x100]);
int const b = pal4bit(color_prom[i + 0x200]);
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 0-0x0f
for (int i = 0; i < 0x10; i++)
palette.set_pen_indirect(i, i);
// background tiles use colors 0xc0-0xff in four banks
// the bottom two bits of the color code select the palette bank for pens 0-7;
// the top two bits for pens 8-0x0f.
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = 0xc0 | (i & 0x0f) | ((i >> ((i & 0x08) ? 2 : 0)) & 0x30);
palette.set_pen_indirect(0x10 + i, ctabentry);
}
// sprites use colors 128-191 in four banks
// The lookup table tells which colors to pick from the selected bank
// the bank is selected by another PROM and depends on the top 8 bits of the sprite code.
// The PROM selects the bank *separately* for pens 0-7 and 8-15 (like for tiles).
for (int i = 0; i < 0x1000; i++)
{
uint8_t const ctabentry = 0x80 | ((i << ((i & 0x80) ? 2 : 4)) & 0x30) | (color_prom[i >> 4] & 0x0f);
int i_swapped = ((i & 0x0f) << 8) | ((i & 0xff0) >> 4);
palette.set_pen_indirect(0x110 + i_swapped, ctabentry);
}
}
void terracre_state::background_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_bg_videoram[offset]);
m_background->mark_tile_dirty(offset);
}
void terracre_state::foreground_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_fg_videoram[offset]);
m_foreground->mark_tile_dirty(offset);
}
void terracre_state::flipscreen_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
if (ACCESSING_BITS_0_7)
{
machine().bookkeeping().coin_counter_w(0, data & 0x01);
machine().bookkeeping().coin_counter_w(1, (data & 0x02) >> 1);
flip_screen_set(data & 0x04);
}
}
void terracre_state::scrolly_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_yscroll);
m_background->set_scrolly(0, m_yscroll);
}
void terracre_state::scrollx_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_xscroll);
m_background->set_scrollx(0, m_xscroll);
}
void terracre_state::video_start()
{
m_background = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(terracre_state::get_bg_tile_info)), TILEMAP_SCAN_COLS, 16,16, 64,32);
m_foreground = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(terracre_state::get_fg_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 64,32);
m_foreground->set_transparent_pen(0xf);
// register for saving
save_item(NAME(m_xscroll));
save_item(NAME(m_yscroll));
}
uint32_t terracre_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
if (m_xscroll & 0x2000)
bitmap.fill(m_palette->black_pen(), cliprect);
else
m_background->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
if ((m_xscroll & 0x1000) == 0)
m_foreground->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
// machine
void terracre_state::sound_w(uint16_t data)
{
m_soundlatch->write(((data & 0x7f) << 1) | 1);
}
@ -111,19 +395,19 @@ void terracre_state::terracre_map(address_map &map)
map(0x000000, 0x01ffff).rom();
map(0x020000, 0x0201ff).ram().share("spriteram");
map(0x020200, 0x021fff).ram();
map(0x022000, 0x022fff).w(FUNC(terracre_state::amazon_background_w)).share("bg_videoram");
map(0x022000, 0x022fff).w(FUNC(terracre_state::background_w)).share(m_bg_videoram);
map(0x023000, 0x023fff).ram();
map(0x024000, 0x024001).portr("P1");
map(0x024002, 0x024003).portr("P2");
map(0x024004, 0x024005).portr("SYSTEM");
map(0x024006, 0x024007).portr("DSW");
map(0x026000, 0x026001).w(FUNC(terracre_state::amazon_flipscreen_w)); /* flip screen & coin counters */
map(0x026002, 0x026003).w(FUNC(terracre_state::amazon_scrollx_w));
map(0x026004, 0x026005).nopr().w(FUNC(terracre_state::amazon_scrolly_w));
map(0x026000, 0x026001).w(FUNC(terracre_state::flipscreen_w)); // flip screen & coin counters
map(0x026002, 0x026003).w(FUNC(terracre_state::scrollx_w));
map(0x026004, 0x026005).nopr().w(FUNC(terracre_state::scrolly_w));
map(0x02600a, 0x02600b).noprw(); // video related
map(0x02600c, 0x02600d).w(FUNC(terracre_state::amazon_sound_w));
map(0x02600c, 0x02600d).w(FUNC(terracre_state::sound_w));
map(0x02600e, 0x02600f).noprw(); // video related
map(0x028000, 0x0287ff).ram().w(FUNC(terracre_state::amazon_foreground_w)).share("fg_videoram");
map(0x028000, 0x0287ff).ram().w(FUNC(terracre_state::foreground_w)).share(m_fg_videoram);
}
void terracre_state::amazon_base_map(address_map &map)
@ -131,18 +415,18 @@ void terracre_state::amazon_base_map(address_map &map)
map(0x000000, 0x01ffff).rom();
map(0x040000, 0x0401ff).ram().share("spriteram");
map(0x040200, 0x040fff).ram();
map(0x042000, 0x042fff).w(FUNC(terracre_state::amazon_background_w)).share("bg_videoram");
map(0x042000, 0x042fff).w(FUNC(terracre_state::background_w)).share(m_bg_videoram);
map(0x044000, 0x044001).portr("IN0");
map(0x044002, 0x044003).portr("IN1");
map(0x044004, 0x044005).portr("IN2");
map(0x044006, 0x044007).portr("IN3");
map(0x046000, 0x046001).w(FUNC(terracre_state::amazon_flipscreen_w)); /* flip screen & coin counters */
map(0x046002, 0x046003).w(FUNC(terracre_state::amazon_scrollx_w));
map(0x046004, 0x046005).nopr().w(FUNC(terracre_state::amazon_scrolly_w));
map(0x046000, 0x046001).w(FUNC(terracre_state::flipscreen_w)); // flip screen & coin counters
map(0x046002, 0x046003).w(FUNC(terracre_state::scrollx_w));
map(0x046004, 0x046005).nopr().w(FUNC(terracre_state::scrolly_w));
map(0x04600a, 0x04600b).noprw(); // video related
map(0x04600c, 0x04600d).w(FUNC(terracre_state::amazon_sound_w));
map(0x04600c, 0x04600d).w(FUNC(terracre_state::sound_w));
map(0x04600e, 0x04600f).noprw(); // video related
map(0x050000, 0x050fff).ram().w(FUNC(terracre_state::amazon_foreground_w)).share("fg_videoram");
map(0x050000, 0x050fff).ram().w(FUNC(terracre_state::foreground_w)).share(m_fg_videoram);
map(0x070000, 0x070003).noprw(); // protection (nop for bootlegs)
}
@ -444,35 +728,35 @@ static const gfx_layout sprite_layout =
};
static GFXDECODE_START( gfx_terracre )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0, 1 )
GFXDECODE_ENTRY( "gfx2", 0, gfx_16x16x4_packed_lsb, 1*16, 16 )
GFXDECODE_ENTRY( "gfx3", 0, sprite_layout, 1*16+16*16, 256 )
GFXDECODE_ENTRY( "fgtiles", 0, gfx_8x8x4_packed_lsb, 0, 1 )
GFXDECODE_ENTRY( "bgtiles", 0, gfx_16x16x4_packed_lsb, 1*16, 16 )
GFXDECODE_ENTRY( "sprites", 0, sprite_layout, 1*16+16*16, 256 )
GFXDECODE_END
void terracre_state::tc_base(machine_config &config)
{
M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8MHz verified on PCB
M68000(config, m_maincpu, XTAL(16'000'000) / 2); // 8MHz verified on PCB
m_maincpu->set_addrmap(AS_PROGRAM, &terracre_state::terracre_map);
m_maincpu->set_vblank_int("screen", FUNC(terracre_state::irq1_line_hold));
Z80(config, m_audiocpu, XTAL(16'000'000)/4); // 4MHz verified on PCB
Z80(config, m_audiocpu, XTAL(16'000'000) / 4); // 4MHz verified on PCB
m_audiocpu->set_addrmap(AS_PROGRAM, &terracre_state::sound_map);
// z80 io map set in 2203 or 3526 configs below
m_audiocpu->set_periodic_int(FUNC(terracre_state::irq0_line_hold), attotime::from_hz(XTAL(16'000'000)/4/512)); // ?
m_audiocpu->set_periodic_int(FUNC(terracre_state::irq0_line_hold), attotime::from_hz(XTAL(16'000'000) / 4 / 512)); // ?
BUFFERED_SPRITERAM16(config, m_spriteram);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
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(terracre_state::screen_update_amazon));
screen.set_screen_update(FUNC(terracre_state::screen_update));
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_terracre);
PALETTE(config, m_palette, FUNC(terracre_state::terracre_palette), 1*16+16*16+16*256, 256);
PALETTE(config, m_palette, FUNC(terracre_state::palette), 1*16+16*16+16*256, 256);
SPEAKER(config, "speaker").front_center();
@ -512,7 +796,7 @@ void terracre_state::ym3526(machine_config &config)
FILTER_BIQUAD(config, m_dacfilter2).opamp_sk_lowpass_setup(RES_K(22), RES_K(22), RES_M(999.99), RES_R(0.001), CAP_N(10), CAP_N(4.7)); // R16, R15, nothing(infinite resistance), wire(short), C18, C21
m_dacfilter2->add_route(ALL_OUTPUTS, "speaker", 1.0);
YM3526(config, "ymsnd", XTAL(16'000'000)/4).add_route(ALL_OUTPUTS, m_ymfilter, 0.2558); // 4MHz verified on PCB
YM3526(config, "ymsnd", XTAL(16'000'000) / 4).add_route(ALL_OUTPUTS, m_ymfilter, 0.2558); // 4MHz verified on PCB
DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, m_dacfilter1, 0.2326); // SIP R2R DAC @ RA-1 with 74HC374P latch
DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, m_dacfilter2, 0.5116); // SIP R2R DAC @ RA-2 with 74HC374P latch
@ -581,7 +865,7 @@ void terracre_state::ym2203(machine_config &config)
MIXER(config, m_ssgmixer);
m_ssgmixer->add_route(0, m_ssgfilter_abfilt, 0.06582);
ym2203_device &ym1(YM2203(config, "ym1", XTAL(16'000'000)/4)); // 4MHz verified on PCB
ym2203_device &ym1(YM2203(config, "ym1", XTAL(16'000'000) / 4)); // 4MHz verified on PCB
ym1.add_route(0, m_ssgmixer, 1.0);
ym1.add_route(1, m_ssgmixer, 1.0);
ym1.add_route(2, m_ssgfilter_cgain, 0.010866);
@ -602,7 +886,7 @@ void amazon_state::amazon_1412m2(machine_config &config)
amazon_base(config);
m_maincpu->set_addrmap(AS_PROGRAM, &amazon_state::amazon_1412m2_map);
NB1412M2(config, m_prot, XTAL(16'000'000)/4); // divided by 4 maybe
NB1412M2(config, m_prot, XTAL(16'000'000) / 4); // divided by 4 maybe
}
void terracre_state::horekidb2(machine_config &config)
@ -623,25 +907,25 @@ void terracre_state::horekidb2(machine_config &config)
bottom board: BK-2 (1502), 22MHz XTAL, Z80, YM3526 */
ROM_START( terracre )
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code (main CPU) on BK-1 PCB
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code on BK-1 PCB
ROM_LOAD16_BYTE( "1.4b", 0x00001, 0x8000, CRC(60932770) SHA1(887be7a44cb7bf30d11274d34896217cc87ae158) )
ROM_LOAD16_BYTE( "3.4d", 0x00000, 0x8000, CRC(cb36240e) SHA1(24696503d9720ced869bb96ec64f336679726668) )
ROM_LOAD16_BYTE( "2.6b", 0x10001, 0x8000, CRC(539352f2) SHA1(b960f75d12ebdcd6781a073a66b8e503a8f55186) )
ROM_LOAD16_BYTE( "4.6d", 0x10000, 0x8000, CRC(19387586) SHA1(76473493d173efde83ded52ad721d2c532f590e2) )
ROM_REGION( 0x10000, "audiocpu", 0 )// Z80 code (sound) on BK-2 PCB, with intro fill-in in the main theme
ROM_REGION( 0x10000, "audiocpu", 0 )// Z80 code on BK-2 PCB, with intro fill-in in the main theme
ROM_LOAD( "11.15b", 0x0000, 0x4000, CRC(604c3b11) SHA1(c01d1ddae40fa8b65dfc72f959942cb9664a548b) )
ROM_LOAD( "12.17b", 0x4000, 0x4000, CRC(affc898d) SHA1(a78f06fa125de16fcdb8f4dc1629eb775aad913a) )
ROM_LOAD( "13.18b", 0x8000, 0x4000, CRC(302dc0ab) SHA1(4db8f12e70f9adf1eb993c6a8af68b5edbf79773) )
ROM_REGION( 0x02000, "gfx1", 0 ) // tiles on BK-2 PCB
ROM_REGION( 0x02000, "fgtiles", 0 ) // on BK-2 PCB
ROM_LOAD( "14.16g", 0x00000, 0x2000, CRC(591a3804) SHA1(e1b46f5652e7f9677d75f01c6132975ace4facdd) )
ROM_REGION( 0x10000, "gfx2", 0 ) // background on BK-1 PCB
ROM_REGION( 0x10000, "bgtiles", 0 ) // on BK-1 PCB
ROM_LOAD( "5.15f", 0x00000, 0x8000, CRC(984a597f) SHA1(1f33892f160691c44872b37f0f6cb1493c9f7fb1) )
ROM_LOAD( "6.17f", 0x08000, 0x8000, CRC(30e297ff) SHA1(9843826ae63039d6693c8a0b30af721d70f40056) )
ROM_REGION( 0x10000, "gfx3", 0 ) // sprites on BK-2 PCB
ROM_REGION( 0x10000, "sprites", 0 ) // on BK-2 PCB
ROM_LOAD( "7.6e", 0x00000, 0x4000, CRC(bcf7740b) SHA1(8701862c35eb8fb1ec239253136a3858ebea4d0c) )
ROM_LOAD( "8.7e", 0x04000, 0x4000, CRC(a70b565c) SHA1(153e5f5a9927c294660dd0d636a9f651d4984d6d) )
ROM_LOAD( "9.6g", 0x08000, 0x4000, CRC(4a9ec3e6) SHA1(0a35b82fb49ecf7edafd02744a48490e744c0a00) )
@ -653,7 +937,7 @@ ROM_START( terracre )
ROM_LOAD( "1.12f", 0x0200, 0x0100, CRC(7ea63946) SHA1(d7b89694a80736c7605b5c83d25d8b706f4504ab) ) // blue component on BK-1 PCB
ROM_LOAD( "4.2g", 0x0300, 0x0100, CRC(08609bad) SHA1(e5daee3c3fea6620e3c2b91becd93bc4d3cdf011) ) // (82s129 with white dot) sprite lookup table on BK-2 PCB
ROM_REGION( 0x0100, "user1", 0 ) // 82S129
ROM_REGION( 0x0100, "palbank_prom", 0 ) // 82S129
ROM_LOAD( "5.4e", 0x0000, 0x0100, CRC(2c43991f) SHA1(312112832bee511b0545524295aa9bc2e756db0f) ) // (82s129 with pink dot) sprite palette bank on BK-2 PCB
ROM_REGION( 0x030c, "plds", 0 )
@ -662,8 +946,8 @@ ROM_START( terracre )
ROM_LOAD( "12f", 0x208, 0x104, NO_DUMP ) // PAL16R4 on BK-2 PCB
ROM_END
ROM_START( terracreo ) // older pcb TC-1A & TC-2A and oldest ROM-set
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code (main CPU) on TC-1A PCB
ROM_START( terracreo ) // older PCB TC-1A & TC-2A and oldest ROM-set
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code on TC-1A PCB
ROM_LOAD16_BYTE( "1.4b", 0x00001, 0x4000, CRC(76f17479) SHA1(e6be7f78fe7dc9d66feb3ada6ad08d461c66640d) )
ROM_LOAD16_BYTE( "5.4d", 0x00000, 0x4000, CRC(8119f06e) SHA1(314e2d8e75f66862cf6567ac05f417a3a66f1254) )
ROM_LOAD16_BYTE( "2.6b", 0x08001, 0x4000, CRC(ba4b5822) SHA1(0de3ce04e14aa5757936babdec9cd1341d4a06d6) )
@ -673,19 +957,19 @@ ROM_START( terracreo ) // older pcb TC-1A & TC-2A and oldest ROM-set
ROM_LOAD16_BYTE( "4.9b", 0x18001, 0x4000, CRC(69227b56) SHA1(58c8aa4baa1f5ddfc151f5ed6284a06e87866dd7) )
ROM_LOAD16_BYTE( "8.9d", 0x18000, 0x4000, CRC(5a672942) SHA1(3890f87edb9047f3e4c6f4d4b47b7f9873962148) )
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code (sound) on TC-2A PCB, with intro fill-in in the main theme
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code on TC-2A PCB, with intro fill-in in the main theme
ROM_LOAD( "11.15b", 0x0000, 0x4000, CRC(604c3b11) SHA1(c01d1ddae40fa8b65dfc72f959942cb9664a548b) )
ROM_LOAD( "12.17b", 0x4000, 0x4000, CRC(affc898d) SHA1(a78f06fa125de16fcdb8f4dc1629eb775aad913a) )
ROM_LOAD( "13.18b", 0x8000, 0x4000, CRC(302dc0ab) SHA1(4db8f12e70f9adf1eb993c6a8af68b5edbf79773) )
ROM_REGION( 0x02000, "gfx1", 0 ) // tiles on TC-2A PCB
ROM_REGION( 0x02000, "fgtiles", 0 ) // on TC-2A PCB
ROM_LOAD( "18.16g", 0x00000, 0x2000, CRC(591a3804) SHA1(e1b46f5652e7f9677d75f01c6132975ace4facdd) )
ROM_REGION( 0x10000, "gfx2", 0 ) // background on TC-1A PCB
ROM_REGION( 0x10000, "bgtiles", 0 ) // on TC-1A PCB
ROM_LOAD( "9.15f", 0x00000, 0x8000, CRC(984a597f) SHA1(1f33892f160691c44872b37f0f6cb1493c9f7fb1) )
ROM_LOAD( "10.17f", 0x08000, 0x8000, CRC(30e297ff) SHA1(9843826ae63039d6693c8a0b30af721d70f40056) )
ROM_REGION( 0x10000, "gfx3", 0 ) // sprites on TC-2A PCB
ROM_REGION( 0x10000, "sprites", 0 ) // on TC-2A PCB
ROM_LOAD( "14.6e", 0x00000, 0x4000, CRC(bcf7740b) SHA1(8701862c35eb8fb1ec239253136a3858ebea4d0c) )
ROM_LOAD( "15.7e", 0x04000, 0x4000, CRC(a70b565c) SHA1(153e5f5a9927c294660dd0d636a9f651d4984d6d) )
ROM_LOAD( "16.6g", 0x08000, 0x4000, CRC(4a9ec3e6) SHA1(0a35b82fb49ecf7edafd02744a48490e744c0a00) )
@ -697,7 +981,7 @@ ROM_START( terracreo ) // older pcb TC-1A & TC-2A and oldest ROM-set
ROM_LOAD( "1.12f", 0x0200, 0x0100, CRC(7ea63946) SHA1(d7b89694a80736c7605b5c83d25d8b706f4504ab) ) // blue component on BK-1 PCB
ROM_LOAD( "4.2g", 0x0300, 0x0100, CRC(08609bad) SHA1(e5daee3c3fea6620e3c2b91becd93bc4d3cdf011) ) // sprite lookup table on BK-2 PCB
ROM_REGION( 0x0100, "user1", 0 )
ROM_REGION( 0x0100, "palbank_prom", 0 )
ROM_LOAD( "5.4e", 0x0000, 0x0100, CRC(2c43991f) SHA1(312112832bee511b0545524295aa9bc2e756db0f) ) // sprite palette bank on TC-2A PCB
ROM_REGION( 0x030c, "plds", 0 )
@ -708,8 +992,8 @@ ROM_END
// probably newest TC-1A/2A board ROM-set for YM3526 version
// for unknown reasons, intro fill-in in the main theme had been removed
ROM_START( terracrea ) // older pcb TC-1A & TC-2A, the only difference is one sound rom
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code (main CPU) on TC-1A PCB
ROM_START( terracrea ) // older PCB TC-1A & TC-2A, the only difference is one sound ROM
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code on TC-1A PCB
ROM_LOAD16_BYTE( "1.4b", 0x00001, 0x4000, CRC(76f17479) SHA1(e6be7f78fe7dc9d66feb3ada6ad08d461c66640d) )
ROM_LOAD16_BYTE( "5.4d", 0x00000, 0x4000, CRC(8119f06e) SHA1(314e2d8e75f66862cf6567ac05f417a3a66f1254) )
ROM_LOAD16_BYTE( "2.6b", 0x08001, 0x4000, CRC(ba4b5822) SHA1(0de3ce04e14aa5757936babdec9cd1341d4a06d6) )
@ -719,19 +1003,19 @@ ROM_START( terracrea ) // older pcb TC-1A & TC-2A, the only difference is one so
ROM_LOAD16_BYTE( "4.9b", 0x18001, 0x4000, CRC(69227b56) SHA1(58c8aa4baa1f5ddfc151f5ed6284a06e87866dd7) )
ROM_LOAD16_BYTE( "8.9d", 0x18000, 0x4000, CRC(5a672942) SHA1(3890f87edb9047f3e4c6f4d4b47b7f9873962148) )
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code (sound) on TC-2A PCB, without intro fill-in in the main theme
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code on TC-2A PCB, without intro fill-in in the main theme
ROM_LOAD( "11.15b", 0x0000, 0x4000, CRC(604c3b11) SHA1(c01d1ddae40fa8b65dfc72f959942cb9664a548b) )
ROM_LOAD( "12.17b", 0x4000, 0x4000, CRC(9e9b3808) SHA1(7b6f8d2b75f063aa81711a7c2bf1563cc38eee8b) )
ROM_LOAD( "13.18b", 0x8000, 0x4000, CRC(302dc0ab) SHA1(4db8f12e70f9adf1eb993c6a8af68b5edbf79773) )
ROM_REGION( 0x02000, "gfx1", 0 ) // tiles on TC-2A PCB
ROM_REGION( 0x02000, "fgtiles", 0 ) // on TC-2A PCB
ROM_LOAD( "18.16g", 0x00000, 0x2000, CRC(591a3804) SHA1(e1b46f5652e7f9677d75f01c6132975ace4facdd) )
ROM_REGION( 0x10000, "gfx2", 0 ) // background on TC-1A PCB
ROM_REGION( 0x10000, "bgtiles", 0 ) // on TC-1A PCB
ROM_LOAD( "9.15f", 0x00000, 0x8000, CRC(984a597f) SHA1(1f33892f160691c44872b37f0f6cb1493c9f7fb1) )
ROM_LOAD( "10.17f", 0x08000, 0x8000, CRC(30e297ff) SHA1(9843826ae63039d6693c8a0b30af721d70f40056) )
ROM_REGION( 0x10000, "gfx3", 0 ) // sprites on TC-2A PCB
ROM_REGION( 0x10000, "sprites", 0 ) // on TC-2A PCB
ROM_LOAD( "14.6e", 0x00000, 0x4000, CRC(bcf7740b) SHA1(8701862c35eb8fb1ec239253136a3858ebea4d0c) )
ROM_LOAD( "15.7e", 0x04000, 0x4000, CRC(a70b565c) SHA1(153e5f5a9927c294660dd0d636a9f651d4984d6d) )
ROM_LOAD( "16.6g", 0x08000, 0x4000, CRC(4a9ec3e6) SHA1(0a35b82fb49ecf7edafd02744a48490e744c0a00) )
@ -743,7 +1027,7 @@ ROM_START( terracrea ) // older pcb TC-1A & TC-2A, the only difference is one so
ROM_LOAD( "1.12f", 0x0200, 0x0100, CRC(7ea63946) SHA1(d7b89694a80736c7605b5c83d25d8b706f4504ab) ) // blue component on BK-1 PCB
ROM_LOAD( "4.2g", 0x0300, 0x0100, CRC(08609bad) SHA1(e5daee3c3fea6620e3c2b91becd93bc4d3cdf011) ) // sprite lookup table on BK-2 PCB
ROM_REGION( 0x0100, "user1", 0 )
ROM_REGION( 0x0100, "palbank_prom", 0 )
ROM_LOAD( "5.4e", 0x0000, 0x0100, CRC(2c43991f) SHA1(312112832bee511b0545524295aa9bc2e756db0f) ) // sprite palette bank on TC-2A PCB
ROM_REGION( 0x030c, "plds", 0 )
@ -753,7 +1037,7 @@ ROM_START( terracrea ) // older pcb TC-1A & TC-2A, the only difference is one so
ROM_END
ROM_START( terracren ) // 'n' for OPN(YM2203), newer than YM3526 sets because it uses a daughterboard to convert the existing YM3526 socket to a YM2203
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code (main CPU) on TC-1A PCB
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code on TC-1A PCB
ROM_LOAD16_BYTE( "1.4b", 0x00001, 0x4000, CRC(76f17479) SHA1(e6be7f78fe7dc9d66feb3ada6ad08d461c66640d) )
ROM_LOAD16_BYTE( "5.4d", 0x00000, 0x4000, CRC(8119f06e) SHA1(314e2d8e75f66862cf6567ac05f417a3a66f1254) )
ROM_LOAD16_BYTE( "2.6b", 0x08001, 0x4000, CRC(ba4b5822) SHA1(0de3ce04e14aa5757936babdec9cd1341d4a06d6) )
@ -763,18 +1047,18 @@ ROM_START( terracren ) // 'n' for OPN(YM2203), newer than YM3526 sets because it
ROM_LOAD16_BYTE( "4.9b", 0x18001, 0x4000, CRC(69227b56) SHA1(58c8aa4baa1f5ddfc151f5ed6284a06e87866dd7) )
ROM_LOAD16_BYTE( "8.9d", 0x18000, 0x4000, CRC(5a672942) SHA1(3890f87edb9047f3e4c6f4d4b47b7f9873962148) )
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code (sound)
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code
ROM_LOAD( "11.15b", 0x0000, 0x4000, CRC(790ddfa9) SHA1(90aa25fbfc9b5f52145ab3cf126610cf21024c20) )
ROM_LOAD( "12.17b", 0x4000, 0x4000, CRC(d4531113) SHA1(efc37c33a0791cae4d4ab50bc884cd6c8a6f95f5) )
ROM_REGION( 0x02000, "gfx1", 0 ) // tiles on TC-2A PCB
ROM_REGION( 0x02000, "fgtiles", 0 ) // on TC-2A PCB
ROM_LOAD( "18.16g", 0x00000, 0x2000, CRC(591a3804) SHA1(e1b46f5652e7f9677d75f01c6132975ace4facdd) )
ROM_REGION( 0x10000, "gfx2", 0 ) // background on TC-1A PCB
ROM_REGION( 0x10000, "bgtiles", 0 ) // on TC-1A PCB
ROM_LOAD( "9.15f", 0x00000, 0x8000, CRC(984a597f) SHA1(1f33892f160691c44872b37f0f6cb1493c9f7fb1) )
ROM_LOAD( "10.17f", 0x08000, 0x8000, CRC(30e297ff) SHA1(9843826ae63039d6693c8a0b30af721d70f40056) )
ROM_REGION( 0x10000, "gfx3", 0 ) // sprites on TC-2A PCB
ROM_REGION( 0x10000, "sprites", 0 ) // on TC-2A PCB
ROM_LOAD( "14.6e", 0x00000, 0x4000, CRC(bcf7740b) SHA1(8701862c35eb8fb1ec239253136a3858ebea4d0c) )
ROM_LOAD( "15.7e", 0x04000, 0x4000, CRC(a70b565c) SHA1(153e5f5a9927c294660dd0d636a9f651d4984d6d) )
ROM_LOAD( "16.6g", 0x08000, 0x4000, CRC(4a9ec3e6) SHA1(0a35b82fb49ecf7edafd02744a48490e744c0a00) )
@ -786,7 +1070,7 @@ ROM_START( terracren ) // 'n' for OPN(YM2203), newer than YM3526 sets because it
ROM_LOAD( "1.12f", 0x0200, 0x0100, CRC(7ea63946) SHA1(d7b89694a80736c7605b5c83d25d8b706f4504ab) ) // blue component on BK-1 PCB
ROM_LOAD( "4.2g", 0x0300, 0x0100, CRC(08609bad) SHA1(e5daee3c3fea6620e3c2b91becd93bc4d3cdf011) ) // sprite lookup table on BK-2 PCB
ROM_REGION( 0x0100, "user1", 0 )
ROM_REGION( 0x0100, "palbank_prom", 0 )
ROM_LOAD( "5.4e", 0x0000, 0x0100, CRC(2c43991f) SHA1(312112832bee511b0545524295aa9bc2e756db0f) ) // sprite palette bank on TC-2A PCB
ROM_REGION( 0x030c, "plds", 0 )
@ -796,199 +1080,199 @@ ROM_START( terracren ) // 'n' for OPN(YM2203), newer than YM3526 sets because it
ROM_END
ROM_START( amazon )
ROM_REGION( 0x20000, "maincpu", 0 ) /* 68000 code (main CPU) */
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "11.4d", 0x00000, 0x8000, CRC(6c7f85c5) SHA1(7f78cf16a93ea1f7b8616122127327a7d337e565) )
ROM_LOAD16_BYTE( "9.4b", 0x00001, 0x8000, CRC(e1b7a989) SHA1(ae49cbc6fc4bc151990caed1f57cc7e10aba7901) )
ROM_LOAD16_BYTE( "12.6d", 0x10000, 0x8000, CRC(4de8a3ee) SHA1(a650d5b6ebff257f08db01e76e5c11c1ecc8cd36) )
ROM_LOAD16_BYTE( "10.6b", 0x10001, 0x8000, CRC(d86bad81) SHA1(8f2e56422f9e604232c60f676dcd964392ec9d28) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code (sound) */
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code
ROM_LOAD( "1.15b", 0x00000, 0x4000, CRC(55a8b5e7) SHA1(d3f5609c1b97a54c505d12dd22f7454c88c90fb9) )
ROM_LOAD( "2.17b", 0x04000, 0x4000, CRC(427a7cca) SHA1(b30e3dd4f685c4095478972d38bb9616369a51bf) )
ROM_LOAD( "3.18b", 0x08000, 0x4000, CRC(b8cceaf7) SHA1(5682df3193ad1dfef366353921bfa7af08aec055) )
ROM_REGION( 0x2000, "gfx1", 0 ) /* alphanumerics */
ROM_REGION( 0x2000, "fgtiles", 0 )
ROM_LOAD( "8.16g", 0x0000, 0x2000, CRC(0cec8644) SHA1(a8f2a67b2243771e20ba51a539a83f0017dff6bc) )
ROM_REGION( 0x20000, "gfx2", 0 ) /* tiles */
ROM_REGION( 0x20000, "bgtiles", 0 )
ROM_LOAD( "13.15f", 0x00000, 0x8000, CRC(415ff4d9) SHA1(b5d17bfbf78e620c29f8933f06bd88cc89825b4b) )
ROM_LOAD( "14.17f", 0x08000, 0x8000, CRC(492b5c48) SHA1(822d9098427650d55cdd6e4a7e540147198d72fc) )
ROM_LOAD( "15.18f", 0x10000, 0x8000, CRC(b1ac0b9d) SHA1(1b413823669db24a5cfb93f66f54bd08c410a0d4) )
ROM_REGION( 0x10000, "gfx3", 0 ) /* sprites */
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "4.6e", 0x0000, 0x4000, CRC(f77ced7a) SHA1(55bf0a0799d85877a71d1529073b0ed847c80e54) )
ROM_LOAD( "5.7e", 0x4000, 0x4000, CRC(16ef1465) SHA1(7547f24fec79f774e1be441c3734bdcc03b5d313) )
ROM_LOAD( "6.6g", 0x8000, 0x4000, CRC(936ec941) SHA1(b4891e207d66f8b77c237fc23ffa48f87ab6993a) )
ROM_LOAD( "7.7g", 0xc000, 0x4000, CRC(66dd718e) SHA1(80990c6199f63b215e1dead3b09cf6160dd75333) )
ROM_REGION( 0x400, "proms", 0 )
ROM_LOAD( "clr.10f", 0x000, 0x100, CRC(6440b341) SHA1(ccf89ac889f1653100f5b0a042dcd826c4ac628b) ) /* red */
ROM_LOAD( "clr.11f", 0x100, 0x100, CRC(271e947f) SHA1(3d1f44fe92cc5fdff001ef80e07aa46a1ca68fe5) ) /* green */
ROM_LOAD( "clr.12f", 0x200, 0x100, CRC(7d38621b) SHA1(7904c3c2c32006d4f4608b6ee84d44ecd601de73) ) /* blue */
ROM_LOAD( "2g", 0x300, 0x100, CRC(44ca16b9) SHA1(1893f24d1c7f4d8e24b5484b19f9284f2ec9be08) ) /* clut */
ROM_LOAD( "clr.10f", 0x000, 0x100, CRC(6440b341) SHA1(ccf89ac889f1653100f5b0a042dcd826c4ac628b) ) // red
ROM_LOAD( "clr.11f", 0x100, 0x100, CRC(271e947f) SHA1(3d1f44fe92cc5fdff001ef80e07aa46a1ca68fe5) ) // green
ROM_LOAD( "clr.12f", 0x200, 0x100, CRC(7d38621b) SHA1(7904c3c2c32006d4f4608b6ee84d44ecd601de73) ) // blue
ROM_LOAD( "2g", 0x300, 0x100, CRC(44ca16b9) SHA1(1893f24d1c7f4d8e24b5484b19f9284f2ec9be08) ) // clut
ROM_REGION( 0x0100, "user1", 0 )
ROM_LOAD( "4e", 0x000, 0x100, CRC(035f2c7b) SHA1(36e32a50146631e763711b586936b2815600f52d) ) /* ctable */
ROM_REGION( 0x0100, "palbank_prom", 0 )
ROM_LOAD( "4e", 0x000, 0x100, CRC(035f2c7b) SHA1(36e32a50146631e763711b586936b2815600f52d) ) // ctable
ROM_REGION( 0x2000, "prot_chip", 0 ) /* unknown, mostly text */
ROM_REGION( 0x2000, "prot_chip", 0 ) // unknown, mostly text
ROM_LOAD( "16.18g", 0x0000, 0x2000, CRC(1d8d592b) SHA1(be8d6df8b5926069ae2cbc1dc26e1fa92d63f297) )
ROM_END
ROM_START( amazont ) /* Found a on Tecfri TC-1A and TC-2A boardset */
ROM_REGION( 0x20000, "maincpu", 0 ) /* 68000 code (main CPU) */
ROM_START( amazont ) // Found a on Tecfri TC-1A and TC-2A boardset
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "5.4d", 0x00000, 0x8000, CRC(ae39432f) SHA1(438f957e8e8e3ac12a24b4852bac5530cfbf858a) )
ROM_LOAD16_BYTE( "7.4b", 0x00001, 0x8000, CRC(a74cdcea) SHA1(6c9f891942a66d179405fd6067688522c3796235) )
ROM_LOAD16_BYTE( "4.6d", 0x10000, 0x8000, CRC(0c6b0772) SHA1(0b103622dcb74bba0320a8d6393d51a0cc653a0e) )
ROM_LOAD16_BYTE( "6.6b", 0x10001, 0x8000, CRC(edbaad3f) SHA1(b2ab817d4403ed6f58bae9b464116ccf9e005176) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code (sound) */
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code
ROM_LOAD( "1.15b", 0x00000, 0x4000, CRC(55a8b5e7) SHA1(d3f5609c1b97a54c505d12dd22f7454c88c90fb9) )
ROM_LOAD( "2.17b", 0x04000, 0x4000, CRC(427a7cca) SHA1(b30e3dd4f685c4095478972d38bb9616369a51bf) )
ROM_LOAD( "3.18b", 0x08000, 0x4000, CRC(b8cceaf7) SHA1(5682df3193ad1dfef366353921bfa7af08aec055) )
ROM_REGION( 0x2000, "gfx1", 0 ) /* alphanumerics */
ROM_REGION( 0x2000, "fgtiles", 0 )
ROM_LOAD( "8.16g", 0x0000, 0x2000, CRC(0cec8644) SHA1(a8f2a67b2243771e20ba51a539a83f0017dff6bc) )
ROM_REGION( 0x20000, "gfx2", 0 ) /* tiles */
ROM_REGION( 0x20000, "bgtiles", 0 )
ROM_LOAD( "13.15f", 0x00000, 0x8000, CRC(415ff4d9) SHA1(b5d17bfbf78e620c29f8933f06bd88cc89825b4b) )
ROM_LOAD( "14.17f", 0x08000, 0x8000, CRC(492b5c48) SHA1(822d9098427650d55cdd6e4a7e540147198d72fc) )
ROM_LOAD( "15.18f", 0x10000, 0x8000, CRC(b1ac0b9d) SHA1(1b413823669db24a5cfb93f66f54bd08c410a0d4) )
ROM_REGION( 0x10000, "gfx3", 0 ) /* sprites */
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "4.6e", 0x0000, 0x4000, CRC(f77ced7a) SHA1(55bf0a0799d85877a71d1529073b0ed847c80e54) )
ROM_LOAD( "5.7e", 0x4000, 0x4000, CRC(16ef1465) SHA1(7547f24fec79f774e1be441c3734bdcc03b5d313) )
ROM_LOAD( "6.6g", 0x8000, 0x4000, CRC(936ec941) SHA1(b4891e207d66f8b77c237fc23ffa48f87ab6993a) )
ROM_LOAD( "7.7g", 0xc000, 0x4000, CRC(66dd718e) SHA1(80990c6199f63b215e1dead3b09cf6160dd75333) )
ROM_REGION( 0x400, "proms", 0 )
ROM_LOAD( "clr.10f", 0x000, 0x100, CRC(6440b341) SHA1(ccf89ac889f1653100f5b0a042dcd826c4ac628b) ) /* red */
ROM_LOAD( "clr.11f", 0x100, 0x100, CRC(271e947f) SHA1(3d1f44fe92cc5fdff001ef80e07aa46a1ca68fe5) ) /* green */
ROM_LOAD( "clr.12f", 0x200, 0x100, CRC(7d38621b) SHA1(7904c3c2c32006d4f4608b6ee84d44ecd601de73) ) /* blue */
ROM_LOAD( "2g", 0x300, 0x100, CRC(44ca16b9) SHA1(1893f24d1c7f4d8e24b5484b19f9284f2ec9be08) ) /* clut */
ROM_LOAD( "clr.10f", 0x000, 0x100, CRC(6440b341) SHA1(ccf89ac889f1653100f5b0a042dcd826c4ac628b) ) // red
ROM_LOAD( "clr.11f", 0x100, 0x100, CRC(271e947f) SHA1(3d1f44fe92cc5fdff001ef80e07aa46a1ca68fe5) ) // green
ROM_LOAD( "clr.12f", 0x200, 0x100, CRC(7d38621b) SHA1(7904c3c2c32006d4f4608b6ee84d44ecd601de73) ) // blue
ROM_LOAD( "2g", 0x300, 0x100, CRC(44ca16b9) SHA1(1893f24d1c7f4d8e24b5484b19f9284f2ec9be08) ) // clut
ROM_REGION( 0x0100, "user1", 0 )
ROM_LOAD( "4e", 0x000, 0x100, CRC(035f2c7b) SHA1(36e32a50146631e763711b586936b2815600f52d) ) /* ctable */
ROM_REGION( 0x0100, "palbank_prom", 0 )
ROM_LOAD( "4e", 0x000, 0x100, CRC(035f2c7b) SHA1(36e32a50146631e763711b586936b2815600f52d) ) // ctable
ROM_REGION( 0x2000, "prot_chip", 0 ) /* unknown, mostly text */
ROM_REGION( 0x2000, "prot_chip", 0 ) // unknown, mostly text
ROM_LOAD( "16.18g", 0x0000, 0x2000, CRC(1d8d592b) SHA1(be8d6df8b5926069ae2cbc1dc26e1fa92d63f297) )
ROM_END
ROM_START( amatelas )
ROM_REGION( 0x20000, "maincpu", 0 ) /* 68000 code (main CPU) */
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "a11.4d", 0x00000, 0x8000, CRC(3d226d0b) SHA1(b3f36973117dcca7ec6f891503ada1055694059d) )
ROM_LOAD16_BYTE( "a9.4b", 0x00001, 0x8000, CRC(e2a0d21d) SHA1(abb65ea5a10719d27f711216b7e387f2e01bdd5d) )
ROM_LOAD16_BYTE( "a12.6d", 0x10000, 0x8000, CRC(e6607c51) SHA1(7679f84ccdf75226bb46a5357a460aa2d5e5cd32) )
ROM_LOAD16_BYTE( "a10.6b", 0x10001, 0x8000, CRC(dbc1f1b4) SHA1(0fca999356e38d69ba5822c4ec489ea08f1d771f) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code (sound) */
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code
ROM_LOAD( "1.15b", 0x00000, 0x4000, CRC(55a8b5e7) SHA1(d3f5609c1b97a54c505d12dd22f7454c88c90fb9) )
ROM_LOAD( "2.17b", 0x04000, 0x4000, CRC(427a7cca) SHA1(b30e3dd4f685c4095478972d38bb9616369a51bf) )
ROM_LOAD( "3.18b", 0x08000, 0x4000, CRC(b8cceaf7) SHA1(5682df3193ad1dfef366353921bfa7af08aec055) )
ROM_REGION( 0x2000, "gfx1", 0 ) /* alphanumerics */
ROM_REGION( 0x2000, "fgtiles", 0 )
ROM_LOAD( "a8.16g", 0x0000, 0x2000, CRC(aeba2102) SHA1(fb4d047a78cd47f628fedfda8349dc46cf6a6f32) )
ROM_REGION( 0x20000, "gfx2", 0 ) /* tiles */
ROM_REGION( 0x20000, "bgtiles", 0 )
ROM_LOAD( "13.15f", 0x00000, 0x8000, CRC(415ff4d9) SHA1(b5d17bfbf78e620c29f8933f06bd88cc89825b4b) )
ROM_LOAD( "14.17f", 0x08000, 0x8000, CRC(492b5c48) SHA1(822d9098427650d55cdd6e4a7e540147198d72fc) )
ROM_LOAD( "15.18f", 0x10000, 0x8000, CRC(b1ac0b9d) SHA1(1b413823669db24a5cfb93f66f54bd08c410a0d4) )
ROM_REGION( 0x10000, "gfx3", 0 ) /* sprites */
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "4.6e", 0x0000, 0x4000, CRC(f77ced7a) SHA1(55bf0a0799d85877a71d1529073b0ed847c80e54) )
ROM_LOAD( "a5.7e", 0x4000, 0x4000, CRC(5fbf9a16) SHA1(d33a020626db8267fd1c1eacbff15c569d7fb72d) )
ROM_LOAD( "6.6g", 0x8000, 0x4000, CRC(936ec941) SHA1(b4891e207d66f8b77c237fc23ffa48f87ab6993a) )
ROM_LOAD( "7.7g", 0xc000, 0x4000, CRC(66dd718e) SHA1(80990c6199f63b215e1dead3b09cf6160dd75333) )
ROM_REGION( 0x400, "proms", 0 )
ROM_LOAD( "clr.10f", 0x000, 0x100, CRC(6440b341) SHA1(ccf89ac889f1653100f5b0a042dcd826c4ac628b) ) /* red */
ROM_LOAD( "clr.11f", 0x100, 0x100, CRC(271e947f) SHA1(3d1f44fe92cc5fdff001ef80e07aa46a1ca68fe5) ) /* green */
ROM_LOAD( "clr.12f", 0x200, 0x100, CRC(7d38621b) SHA1(7904c3c2c32006d4f4608b6ee84d44ecd601de73) ) /* blue */
ROM_LOAD( "2g", 0x300, 0x100, CRC(44ca16b9) SHA1(1893f24d1c7f4d8e24b5484b19f9284f2ec9be08) ) /* clut */
ROM_LOAD( "clr.10f", 0x000, 0x100, CRC(6440b341) SHA1(ccf89ac889f1653100f5b0a042dcd826c4ac628b) ) // red
ROM_LOAD( "clr.11f", 0x100, 0x100, CRC(271e947f) SHA1(3d1f44fe92cc5fdff001ef80e07aa46a1ca68fe5) ) // green
ROM_LOAD( "clr.12f", 0x200, 0x100, CRC(7d38621b) SHA1(7904c3c2c32006d4f4608b6ee84d44ecd601de73) ) // blue
ROM_LOAD( "2g", 0x300, 0x100, CRC(44ca16b9) SHA1(1893f24d1c7f4d8e24b5484b19f9284f2ec9be08) ) // clut
ROM_REGION( 0x0100, "user1", 0 )
ROM_LOAD( "4e", 0x000, 0x100, CRC(035f2c7b) SHA1(36e32a50146631e763711b586936b2815600f52d) ) /* ctable */
ROM_REGION( 0x0100, "palbank_prom", 0 )
ROM_LOAD( "4e", 0x000, 0x100, CRC(035f2c7b) SHA1(36e32a50146631e763711b586936b2815600f52d) ) // ctable
ROM_REGION( 0x2000, "prot_chip", 0 ) /* unknown, mostly text */
ROM_REGION( 0x2000, "prot_chip", 0 ) // unknown, mostly text
ROM_LOAD( "16.18g", 0x0000, 0x2000, CRC(1d8d592b) SHA1(be8d6df8b5926069ae2cbc1dc26e1fa92d63f297) )
ROM_END
ROM_START( horekid )
ROM_REGION( 0x20000, "maincpu", 0 ) /* 68000 code (main CPU) */
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "horekid.03", 0x00000, 0x8000, CRC(90ec840f) SHA1(7d04936c50c9ae02ea7dc24f8336997592def867) )
ROM_LOAD16_BYTE( "horekid.01", 0x00001, 0x8000, CRC(a282faf8) SHA1(4c1ff36cf324dff9ddfc1035db6c52838c7be975) )
ROM_LOAD16_BYTE( "horekid.04", 0x10000, 0x8000, CRC(375c0c50) SHA1(ee040dbdfe6673cf48f143518458609b21b4e15d) )
ROM_LOAD16_BYTE( "horekid.02", 0x10001, 0x8000, CRC(ee7d52bb) SHA1(b9083f672a6bc37ec2bbb9af081e6f27b712b663) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code (sound) */
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code
ROM_LOAD( "horekid.09", 0x0000, 0x4000,CRC(49cd3b81) SHA1(284d75f6f6121d0581bb62f13ee02c85c3d972d2) )
ROM_LOAD( "horekid.10", 0x4000, 0x4000,CRC(c1eaa938) SHA1(839f03e701f072a6441ee4980eb1961859c40d97) )
ROM_LOAD( "horekid.11", 0x8000, 0x4000,CRC(0a2bc702) SHA1(0cef9e9022a27d30d2f83a16a55d8ede0ab686f4) )
ROM_REGION( 0x2000, "gfx1", 0 ) /* alphanumerics */
ROM_REGION( 0x2000, "fgtiles", 0 )
ROM_LOAD( "horekid.16", 0x0000, 0x2000, CRC(104b77cc) SHA1(f875c7fe4f2b540bc44fa144a449a01268011431) )
ROM_REGION( 0x20000, "gfx2", 0 ) /* tiles */
ROM_REGION( 0x20000, "bgtiles", 0 )
ROM_LOAD( "horekid.05", 0x00000, 0x8000, CRC(da25ae10) SHA1(83d8b78cff85854b497b40525ec3c93a84ba6248) )
ROM_LOAD( "horekid.06", 0x08000, 0x8000, CRC(616e4321) SHA1(5bf0e0a7290b6bcb5dfbb1070eeb683830e6916b) )
ROM_LOAD( "horekid.07", 0x10000, 0x8000, CRC(8c7d2be2) SHA1(efd70997126fc7c2622546fabe69cb222dca87f9) )
ROM_LOAD( "horekid.08", 0x18000, 0x8000, CRC(a0066b02) SHA1(d6437932028e937dab5728f40d6d09b6afe9a903) )
ROM_REGION( 0x20000, "gfx3", 0 ) /* sprites */
ROM_REGION( 0x20000, "sprites", 0 )
ROM_LOAD( "horekid.12", 0x00000, 0x8000, CRC(a3caa07a) SHA1(4baa7d1867dbaa8bace43416040114129f5405d6) )
ROM_LOAD( "horekid.13", 0x08000, 0x8000, CRC(0e48ff8e) SHA1(5a3025991378ed3f9bdc2d420b1432332278178b) )
ROM_LOAD( "horekid.14", 0x10000, 0x8000, CRC(e300747a) SHA1(5875a46c215b12f1e9a889819215bca40e4459a6) )
ROM_LOAD( "horekid.15", 0x18000, 0x8000, CRC(51105741) SHA1(01c3bb2c03ce1ca959d62d64be3a019e74f677ba) )
ROM_REGION( 0x400, "proms", 0 )
ROM_LOAD( "kid_prom.10f", 0x000, 0x100, CRC(ca13ce23) SHA1(46f0ed22f601721fa35bab12ce8816f30b102f59) ) /* red */
ROM_LOAD( "kid_prom.11f", 0x100, 0x100, CRC(fb44285a) SHA1(f9605e82f63188daeff044fd48d81c1dfc4d4f2a) ) /* green */
ROM_LOAD( "kid_prom.12f", 0x200, 0x100, CRC(40d41237) SHA1(b33082540d739a3bfe096f68f3359fbf1360b5be) ) /* blue */
ROM_LOAD( "kid_prom.2g", 0x300, 0x100, CRC(4b9be0ed) SHA1(81aa7bb24fe6ea13f5dffdb67ea699adf0b3129a) ) /* clut */
ROM_LOAD( "kid_prom.10f", 0x000, 0x100, CRC(ca13ce23) SHA1(46f0ed22f601721fa35bab12ce8816f30b102f59) ) // red
ROM_LOAD( "kid_prom.11f", 0x100, 0x100, CRC(fb44285a) SHA1(f9605e82f63188daeff044fd48d81c1dfc4d4f2a) ) // green
ROM_LOAD( "kid_prom.12f", 0x200, 0x100, CRC(40d41237) SHA1(b33082540d739a3bfe096f68f3359fbf1360b5be) ) // blue
ROM_LOAD( "kid_prom.2g", 0x300, 0x100, CRC(4b9be0ed) SHA1(81aa7bb24fe6ea13f5dffdb67ea699adf0b3129a) ) // clut
ROM_REGION( 0x0100, "user1", 0 )
ROM_LOAD( "kid_prom.4e", 0x000, 0x100, CRC(e4fb54ee) SHA1(aba89d347b24dc6680e6f25b4a6c0d6657bb6a83) ) /* ctable */
ROM_REGION( 0x0100, "palbank_prom", 0 )
ROM_LOAD( "kid_prom.4e", 0x000, 0x100, CRC(e4fb54ee) SHA1(aba89d347b24dc6680e6f25b4a6c0d6657bb6a83) ) // ctable
ROM_REGION( 0x2000, "prot_chip", 0 ) /* unknown, mostly text */
ROM_REGION( 0x2000, "prot_chip", 0 ) // unknown, mostly text
ROM_LOAD( "horekid.17", 0x0000, 0x2000, CRC(1d8d592b) SHA1(be8d6df8b5926069ae2cbc1dc26e1fa92d63f297) )
ROM_END
ROM_START( horekidb )
ROM_REGION( 0x20000, "maincpu", 0 ) /* 68000 code (main CPU) */
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "knhhd5", 0x00000, 0x8000, CRC(786619c7) SHA1(6b4a659839a7c19370a81f9f9b26e4fe0d210d7b) )
ROM_LOAD16_BYTE( "knhhd7", 0x00001, 0x8000, CRC(3bbb475b) SHA1(575cdc4f902f15335579c0f860fa75e33a0ea539) )
ROM_LOAD16_BYTE( "horekid.04", 0x10000, 0x8000, CRC(375c0c50) SHA1(ee040dbdfe6673cf48f143518458609b21b4e15d) )
ROM_LOAD16_BYTE( "horekid.02", 0x10001, 0x8000, CRC(ee7d52bb) SHA1(b9083f672a6bc37ec2bbb9af081e6f27b712b663) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code (sound) */
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code
ROM_LOAD( "horekid.09", 0x0000, 0x4000,CRC(49cd3b81) SHA1(284d75f6f6121d0581bb62f13ee02c85c3d972d2) )
ROM_LOAD( "horekid.10", 0x4000, 0x4000,CRC(c1eaa938) SHA1(839f03e701f072a6441ee4980eb1961859c40d97) )
ROM_LOAD( "horekid.11", 0x8000, 0x4000,CRC(0a2bc702) SHA1(0cef9e9022a27d30d2f83a16a55d8ede0ab686f4) )
ROM_REGION( 0x2000, "gfx1", 0 ) /* alphanumerics */
ROM_REGION( 0x2000, "fgtiles", 0 )
ROM_LOAD( "horekid.16", 0x0000, 0x2000, CRC(104b77cc) SHA1(f875c7fe4f2b540bc44fa144a449a01268011431) )
ROM_REGION( 0x20000, "gfx2", 0 ) /* tiles */
ROM_REGION( 0x20000, "bgtiles", 0 )
ROM_LOAD( "horekid.05", 0x00000, 0x8000, CRC(da25ae10) SHA1(83d8b78cff85854b497b40525ec3c93a84ba6248) )
ROM_LOAD( "horekid.06", 0x08000, 0x8000, CRC(616e4321) SHA1(5bf0e0a7290b6bcb5dfbb1070eeb683830e6916b) )
ROM_LOAD( "horekid.07", 0x10000, 0x8000, CRC(8c7d2be2) SHA1(efd70997126fc7c2622546fabe69cb222dca87f9) )
ROM_LOAD( "horekid.08", 0x18000, 0x8000, CRC(a0066b02) SHA1(d6437932028e937dab5728f40d6d09b6afe9a903) )
ROM_REGION( 0x20000, "gfx3", 0 ) /* sprites */
ROM_REGION( 0x20000, "sprites", 0 )
ROM_LOAD( "horekid.12", 0x00000, 0x8000, CRC(a3caa07a) SHA1(4baa7d1867dbaa8bace43416040114129f5405d6) )
ROM_LOAD( "horekid.13", 0x08000, 0x8000, CRC(0e48ff8e) SHA1(5a3025991378ed3f9bdc2d420b1432332278178b) )
ROM_LOAD( "horekid.14", 0x10000, 0x8000, CRC(e300747a) SHA1(5875a46c215b12f1e9a889819215bca40e4459a6) )
ROM_LOAD( "horekid.15", 0x18000, 0x8000, CRC(51105741) SHA1(01c3bb2c03ce1ca959d62d64be3a019e74f677ba) )
ROM_REGION( 0x400, "proms", 0 )
ROM_LOAD( "kid_prom.10f", 0x000, 0x100, CRC(ca13ce23) SHA1(46f0ed22f601721fa35bab12ce8816f30b102f59) ) /* red */
ROM_LOAD( "kid_prom.11f", 0x100, 0x100, CRC(fb44285a) SHA1(f9605e82f63188daeff044fd48d81c1dfc4d4f2a) ) /* green */
ROM_LOAD( "kid_prom.12f", 0x200, 0x100, CRC(40d41237) SHA1(b33082540d739a3bfe096f68f3359fbf1360b5be) ) /* blue */
ROM_LOAD( "kid_prom.2g", 0x300, 0x100, CRC(4b9be0ed) SHA1(81aa7bb24fe6ea13f5dffdb67ea699adf0b3129a) ) /* clut */
ROM_LOAD( "kid_prom.10f", 0x000, 0x100, CRC(ca13ce23) SHA1(46f0ed22f601721fa35bab12ce8816f30b102f59) ) // red
ROM_LOAD( "kid_prom.11f", 0x100, 0x100, CRC(fb44285a) SHA1(f9605e82f63188daeff044fd48d81c1dfc4d4f2a) ) // green
ROM_LOAD( "kid_prom.12f", 0x200, 0x100, CRC(40d41237) SHA1(b33082540d739a3bfe096f68f3359fbf1360b5be) ) // blue
ROM_LOAD( "kid_prom.2g", 0x300, 0x100, CRC(4b9be0ed) SHA1(81aa7bb24fe6ea13f5dffdb67ea699adf0b3129a) ) // clut
ROM_REGION( 0x0100, "user1", 0 )
ROM_LOAD( "kid_prom.4e", 0x000, 0x100, CRC(e4fb54ee) SHA1(aba89d347b24dc6680e6f25b4a6c0d6657bb6a83) ) /* ctable */
ROM_REGION( 0x0100, "palbank_prom", 0 )
ROM_LOAD( "kid_prom.4e", 0x000, 0x100, CRC(e4fb54ee) SHA1(aba89d347b24dc6680e6f25b4a6c0d6657bb6a83) ) // ctable
ROM_REGION( 0x2000, "prot_chip", 0 ) /* unknown, mostly text */
ROM_REGION( 0x2000, "prot_chip", 0 ) // unknown, mostly text
ROM_LOAD( "horekid.17", 0x0000, 0x2000, CRC(1d8d592b) SHA1(be8d6df8b5926069ae2cbc1dc26e1fa92d63f297) )
ROM_END
@ -1007,17 +1291,17 @@ ROM_START( horekidb2 )
ROM_LOAD( "13b.bin", 0x8000, 0x4000, CRC(78631a6c) SHA1(24b43d8d86c53990d6d781830f49ce28d69eef02) ) // 0xxxxxxxxxxxxxx = 0xFF
ROM_CONTINUE( 0x8000, 0x4000 )
ROM_REGION( 0x2000, "gfx1", 0 ) // alphanumerics, believed , identical to the original
ROM_REGION( 0x2000, "fgtiles", 0 ) // believed identical to the original
ROM_LOAD( "18.bin", 0x0000, 0x2000, BAD_DUMP CRC(23a1d180) SHA1(daf212e7b82f8ec65265f0ee6b05ba4c78cfa379) )
ROM_LOAD( "horekid.16", 0x0000, 0x2000, CRC(104b77cc) SHA1(f875c7fe4f2b540bc44fa144a449a01268011431) ) // Given the rest of the GFX ROMs match horekid we'll assume this does too, for now
ROM_REGION( 0x20000, "gfx2", 0 ) // tiles, identical to the original
ROM_REGION( 0x20000, "bgtiles", 0 ) // identical to the original
ROM_LOAD( "9.bin", 0x00000, 0x8000, CRC(da25ae10) SHA1(83d8b78cff85854b497b40525ec3c93a84ba6248) )
ROM_LOAD( "10.bin", 0x08000, 0x8000, CRC(616e4321) SHA1(5bf0e0a7290b6bcb5dfbb1070eeb683830e6916b) )
ROM_LOAD( "11.bin", 0x10000, 0x8000, CRC(8c7d2be2) SHA1(efd70997126fc7c2622546fabe69cb222dca87f9) )
ROM_LOAD( "12.bin", 0x18000, 0x8000, CRC(a0066b02) SHA1(d6437932028e937dab5728f40d6d09b6afe9a903) )
ROM_REGION( 0x20000, "gfx3", 0 ) // sprites, identical to the original
ROM_REGION( 0x20000, "sprites", 0 ) // identical to the original
ROM_LOAD( "14b.bin", 0x00000, 0x8000, CRC(a3caa07a) SHA1(4baa7d1867dbaa8bace43416040114129f5405d6) )
ROM_LOAD( "15b.bin", 0x08000, 0x8000, CRC(0e48ff8e) SHA1(5a3025991378ed3f9bdc2d420b1432332278178b) )
ROM_LOAD( "16b.bin", 0x10000, 0x8000, CRC(e300747a) SHA1(5875a46c215b12f1e9a889819215bca40e4459a6) )
@ -1029,7 +1313,7 @@ ROM_START( horekidb2 )
ROM_LOAD( "kid_prom.12f", 0x200, 0x100, CRC(40d41237) SHA1(b33082540d739a3bfe096f68f3359fbf1360b5be) ) // blue
ROM_LOAD( "kid_prom.2g", 0x300, 0x100, CRC(4b9be0ed) SHA1(81aa7bb24fe6ea13f5dffdb67ea699adf0b3129a) ) // clut
ROM_REGION( 0x0100, "user1", 0 ) // not dumped for this set
ROM_REGION( 0x0100, "palbank_prom", 0 ) // not dumped for this set
ROM_LOAD( "kid_prom.4e", 0x000, 0x100, CRC(e4fb54ee) SHA1(aba89d347b24dc6680e6f25b4a6c0d6657bb6a83) ) // ctable
ROM_END
@ -1041,57 +1325,58 @@ ROM_END
it is a common PCB, and we need to clarify that this is not the real thing.
*/
ROM_START( boobhack )
ROM_REGION( 0x20000, "maincpu", 0 ) /* 68000 code (main CPU) */
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "1-c.bin", 0x00000, 0x8000, CRC(786619c7) SHA1(6b4a659839a7c19370a81f9f9b26e4fe0d210d7b) )
ROM_LOAD16_BYTE( "1-b.bin", 0x00001, 0x8000, CRC(3bbb475b) SHA1(575cdc4f902f15335579c0f860fa75e33a0ea539) )
ROM_LOAD16_BYTE( "1-d.bin", 0x10000, 0x8000, CRC(375c0c50) SHA1(ee040dbdfe6673cf48f143518458609b21b4e15d) )
ROM_LOAD16_BYTE( "1-a.bin", 0x10001, 0x8000, CRC(ee7d52bb) SHA1(b9083f672a6bc37ec2bbb9af081e6f27b712b663) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code (sound) */
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code
ROM_LOAD( "1-i.bin", 0x0000, 0x4000,CRC(49cd3b81) SHA1(284d75f6f6121d0581bb62f13ee02c85c3d972d2) )
ROM_LOAD( "1-j.bin", 0x4000, 0x4000,CRC(c1eaa938) SHA1(839f03e701f072a6441ee4980eb1961859c40d97) )
ROM_LOAD( "1-k.bin", 0x8000, 0x4000,CRC(0a2bc702) SHA1(0cef9e9022a27d30d2f83a16a55d8ede0ab686f4) )
ROM_REGION( 0x2000, "gfx1", 0 ) /* alphanumerics */
ROM_REGION( 0x2000, "fgtiles", 0 )
ROM_LOAD( "1-p.bin", 0x0000, 0x2000, CRC(104b77cc) SHA1(f875c7fe4f2b540bc44fa144a449a01268011431) )
ROM_REGION( 0x20000, "gfx2", 0 ) /* tiles */
ROM_REGION( 0x20000, "bgtiles", 0 )
ROM_LOAD( "1-e.bin", 0x00000, 0x8000, CRC(da25ae10) SHA1(83d8b78cff85854b497b40525ec3c93a84ba6248) )
ROM_LOAD( "1-f.bin", 0x08000, 0x8000, CRC(616e4321) SHA1(5bf0e0a7290b6bcb5dfbb1070eeb683830e6916b) )
ROM_LOAD( "1-g.bin", 0x10000, 0x8000, CRC(8c7d2be2) SHA1(efd70997126fc7c2622546fabe69cb222dca87f9) )
ROM_LOAD( "1-h.bin", 0x18000, 0x8000, CRC(a0066b02) SHA1(d6437932028e937dab5728f40d6d09b6afe9a903) )
ROM_REGION( 0x20000, "gfx3", 0 ) /* sprites */
ROM_REGION( 0x20000, "sprites", 0 )
ROM_LOAD( "1-l.bin", 0x00000, 0x8000, CRC(a3caa07a) SHA1(4baa7d1867dbaa8bace43416040114129f5405d6) )
ROM_LOAD( "1-m.bin", 0x08000, 0x8000, CRC(15b6cbdf) SHA1(b7f2a527946bcbd51aeae98b8971f4fbabcb3d14) ) // Booby Kids gfx hack changes these 2 roms ONLY
ROM_LOAD( "1-n.bin", 0x10000, 0x8000, CRC(e300747a) SHA1(5875a46c215b12f1e9a889819215bca40e4459a6) )
ROM_LOAD( "1-o.bin", 0x18000, 0x8000, CRC(cddc6a6c) SHA1(28d12342e0ada941f68845fa65793a3f5fa21246) ) // Booby Kids gfx hack changes these 2 roms ONLY
ROM_REGION( 0x400, "proms", 0 )
ROM_LOAD( "kid_prom.10f", 0x000, 0x100, CRC(ca13ce23) SHA1(46f0ed22f601721fa35bab12ce8816f30b102f59) ) /* red */
ROM_LOAD( "kid_prom.11f", 0x100, 0x100, CRC(fb44285a) SHA1(f9605e82f63188daeff044fd48d81c1dfc4d4f2a) ) /* green */
ROM_LOAD( "kid_prom.12f", 0x200, 0x100, CRC(40d41237) SHA1(b33082540d739a3bfe096f68f3359fbf1360b5be) ) /* blue */
ROM_LOAD( "kid_prom.2g", 0x300, 0x100, CRC(4b9be0ed) SHA1(81aa7bb24fe6ea13f5dffdb67ea699adf0b3129a) ) /* clut */
ROM_LOAD( "kid_prom.10f", 0x000, 0x100, CRC(ca13ce23) SHA1(46f0ed22f601721fa35bab12ce8816f30b102f59) ) // red
ROM_LOAD( "kid_prom.11f", 0x100, 0x100, CRC(fb44285a) SHA1(f9605e82f63188daeff044fd48d81c1dfc4d4f2a) ) // green
ROM_LOAD( "kid_prom.12f", 0x200, 0x100, CRC(40d41237) SHA1(b33082540d739a3bfe096f68f3359fbf1360b5be) ) // blue
ROM_LOAD( "kid_prom.2g", 0x300, 0x100, CRC(4b9be0ed) SHA1(81aa7bb24fe6ea13f5dffdb67ea699adf0b3129a) ) // clut
ROM_REGION( 0x0100, "user1", 0 )
ROM_LOAD( "kid_prom.4e", 0x000, 0x100, BAD_DUMP CRC(e4fb54ee) SHA1(aba89d347b24dc6680e6f25b4a6c0d6657bb6a83) ) /* ctable */
ROM_REGION( 0x0100, "palbank_prom", 0 )
ROM_LOAD( "kid_prom.4e", 0x000, 0x100, BAD_DUMP CRC(e4fb54ee) SHA1(aba89d347b24dc6680e6f25b4a6c0d6657bb6a83) ) // ctable
ROM_END
} // anonymous namespace
// YEAR, NAME, PARENT, MACHINE, INPUT, STATE, INIT, MONITOR, COMPANY, FULLNAME, FLAGS
GAME( 1985, terracre, 0, ym3526, terracre, terracre_state, empty_init, ROT270, "Nichibutsu", "Terra Cresta (YM3526 set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1985, terracreo, terracre, ym3526, terracre, terracre_state, empty_init, ROT270, "Nichibutsu", "Terra Cresta (YM3526 set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1985, terracrea, terracre, ym3526, terracre, terracre_state, empty_init, ROT270, "Nichibutsu", "Terra Cresta (YM3526 set 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1985, terracren, terracre, ym2203, terracre, terracre_state, empty_init, ROT270, "Nichibutsu", "Terra Cresta (YM2203)", MACHINE_SUPPORTS_SAVE )
// YEAR, NAME, PARENT, MACHINE, INPUT, STATE, INIT, MONITOR, COMPANY, FULLNAME, FLAGS
GAME( 1985, terracre, 0, ym3526, terracre, terracre_state, empty_init, ROT270, "Nichibutsu", "Terra Cresta (YM3526 set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1985, terracreo, terracre, ym3526, terracre, terracre_state, empty_init, ROT270, "Nichibutsu", "Terra Cresta (YM3526 set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1985, terracrea, terracre, ym3526, terracre, terracre_state, empty_init, ROT270, "Nichibutsu", "Terra Cresta (YM3526 set 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1985, terracren, terracre, ym2203, terracre, terracre_state, empty_init, ROT270, "Nichibutsu", "Terra Cresta (YM2203)", MACHINE_SUPPORTS_SAVE )
// later HW: supports 1412M2 device, see also mightguy.cpp
GAME( 1986, amazon, 0, amazon_1412m2, amazon, amazon_state, empty_init, ROT270, "Nichibutsu", "Soldier Girl Amazon", MACHINE_SUPPORTS_SAVE ) //AT-1(1602) and AT-2(1602) pcbs
GAME( 1986, amazon, 0, amazon_1412m2, amazon, amazon_state, empty_init, ROT270, "Nichibutsu", "Soldier Girl Amazon", MACHINE_SUPPORTS_SAVE ) //AT-1(1602) and AT-2(1602) pcbs
GAME( 1986, amazont, amazon, amazon_1412m2, amazon, amazon_state, empty_init, ROT270, "Nichibutsu (Tecfri license)", "Soldier Girl Amazon (Tecfri license)", MACHINE_SUPPORTS_SAVE ) //AT-1(1602) and AT-2(1602) pcbs
GAME( 1986, amatelas, amazon, amazon_1412m2, amazon, amazon_state, empty_init, ROT270, "Nichibutsu", "Sei Senshi Amatelass", MACHINE_SUPPORTS_SAVE ) //AT-1(1602) and AT-2(1602) pcbs
GAME( 1987, horekid, 0, amazon_1412m2, horekid, amazon_state, empty_init, ROT270, "Nichibutsu", "Kid no Hore Hore Daisakusen", MACHINE_SUPPORTS_SAVE ) //BK-I(1502) and BK-II(1502) pcbs
GAME( 1986, amatelas, amazon, amazon_1412m2, amazon, amazon_state, empty_init, ROT270, "Nichibutsu", "Sei Senshi Amatelass", MACHINE_SUPPORTS_SAVE ) //AT-1(1602) and AT-2(1602) pcbs
GAME( 1987, horekid, 0, amazon_1412m2, horekid, amazon_state, empty_init, ROT270, "Nichibutsu", "Kid no Hore Hore Daisakusen", MACHINE_SUPPORTS_SAVE ) //BK-I(1502) and BK-II(1502) pcbs
// bootlegs
GAME( 1987, horekidb, horekid, amazon_base, horekid, terracre_state, empty_init, ROT270, "bootleg", "Kid no Hore Hore Daisakusen (bootleg set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, horekidb2, horekid, horekidb2, horekidb2, terracre_state, empty_init, ROT270, "bootleg", "Kid no Hore Hore Daisakusen (bootleg set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, boobhack, horekid, amazon_base, horekid, terracre_state, empty_init, ROT270, "bootleg", "Booby Kids (Italian manufactured graphic hack / bootleg of Kid no Hore Hore Daisakusen (bootleg))", MACHINE_SUPPORTS_SAVE )
GAME( 1987, horekidb, horekid, amazon_base, horekid, terracre_state, empty_init, ROT270, "bootleg", "Kid no Hore Hore Daisakusen (bootleg set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, horekidb2, horekid, horekidb2, horekidb2, terracre_state, empty_init, ROT270, "bootleg", "Kid no Hore Hore Daisakusen (bootleg set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, boobhack, horekid, amazon_base, horekid, terracre_state, empty_init, ROT270, "bootleg", "Booby Kids (Italian manufactured graphic hack / bootleg of Kid no Hore Hore Daisakusen (bootleg))", MACHINE_SUPPORTS_SAVE )

View File

@ -1,105 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Carlos A. Lozano
#ifndef MAME_NICHIBUTSU_TERRACRE_H
#define MAME_NICHIBUTSU_TERRACRE_H
#pragma once
#include "nb1412m2.h"
#include "machine/gen_latch.h"
#include "sound/flt_biquad.h"
#include "sound/mixer.h"
#include "video/bufsprite.h"
#include "emupal.h"
#include "tilemap.h"
class terracre_state : public driver_device
{
public:
terracre_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_spriteram(*this, "spriteram")
, m_soundlatch(*this, "soundlatch")
, m_dacfilter1(*this, "dacfilter1")
, m_dacfilter2(*this, "dacfilter2")
, m_ymfilter(*this, "ymfilter")
, m_ssgmixer(*this, "ssgmixer")
, m_ssgfilter_abfilt(*this, "ssg_abfilt")
, m_ssgfilter_abgain(*this, "ssg_abgain")
, m_ssgfilter_cgain(*this, "ssg_cgain")
, m_bg_videoram(*this, "bg_videoram")
, m_fg_videoram(*this, "fg_videoram")
{ }
void amazon_base(machine_config &config);
void horekidb2(machine_config &config);
void tc_base(machine_config &config);
void ym2203(machine_config &config);
void ym3526(machine_config &config);
protected:
void amazon_base_map(address_map &map);
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
private:
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<buffered_spriteram16_device> m_spriteram;
required_device<generic_latch_8_device> m_soundlatch;
required_device<filter_biquad_device> m_dacfilter1;
required_device<filter_biquad_device> m_dacfilter2;
required_device<filter_biquad_device> m_ymfilter;
optional_device<mixer_device> m_ssgmixer;
optional_device<filter_biquad_device> m_ssgfilter_abfilt;
optional_device<filter_biquad_device> m_ssgfilter_abgain;
optional_device<filter_biquad_device> m_ssgfilter_cgain;
required_shared_ptr<uint16_t> m_bg_videoram;
required_shared_ptr<uint16_t> m_fg_videoram;
uint16_t m_xscroll = 0;
uint16_t m_yscroll = 0;
tilemap_t *m_background = nullptr;
tilemap_t *m_foreground = nullptr;
void amazon_sound_w(uint16_t data);
uint8_t soundlatch_clear_r();
void amazon_background_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void amazon_foreground_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void amazon_flipscreen_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void amazon_scrolly_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void amazon_scrollx_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
virtual void video_start() override;
void terracre_palette(palette_device &palette) const;
uint32_t screen_update_amazon(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect );
void horekidb2_map(address_map &map);
void sound_2203_io_map(address_map &map);
void sound_3526_io_map(address_map &map);
void sound_map(address_map &map);
void terracre_map(address_map &map);
};
class amazon_state : public terracre_state
{
public:
amazon_state(const machine_config &mconfig, device_type type, const char *tag) :
terracre_state(mconfig, type, tag),
m_prot(*this, "prot_chip")
{ }
void amazon_1412m2(machine_config &config);
void amazon_1412m2_map(address_map &map);
private:
required_device<nb1412m2_device> m_prot;
};
#endif // MAME_NICHIBUTSU_TERRACRE_H

View File

@ -1,194 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Carlos A. Lozano
/***************************************************************************
video.c
Functions to emulate the video hardware of the machine.
***************************************************************************/
#include "emu.h"
#include "terracre.h"
TILE_GET_INFO_MEMBER(terracre_state::get_bg_tile_info)
{
/* xxxx.----.----.----
* ----.xx--.----.----
* ----.--xx.xxxx.xxxx */
unsigned data = m_bg_videoram[tile_index];
unsigned color = data>>11;
tileinfo.set(1,data&0x3ff,color,0 );
}
TILE_GET_INFO_MEMBER(terracre_state::get_fg_tile_info)
{
unsigned data = m_fg_videoram[tile_index];
tileinfo.set(0,data&0xff,0,0 );
}
void terracre_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect )
{
const uint8_t *spritepalettebank = memregion("user1")->base();
gfx_element *pGfx = m_gfxdecode->gfx(2);
const uint16_t *pSource = m_spriteram->buffer();
int flip = flip_screen();
int transparent_pen;
if( pGfx->elements() > 0x200 )
{ /* HORE HORE Kid */
transparent_pen = 0xf;
}
else
{
transparent_pen = 0x0;
}
for( int i=0; i<0x200; i+=8 )
{
int tile = pSource[1]&0xff;
int attrs = pSource[2];
int flipx = attrs&0x04;
int flipy = attrs&0x08;
int color = (attrs&0xf0)>>4;
int sx = (pSource[3] & 0xff) - 0x80 + 256 * (attrs & 1);
int sy = 240 - (pSource[0] & 0xff);
if( transparent_pen )
{
int bank;
if( attrs&0x02 ) tile |= 0x200;
if( attrs&0x10 ) tile |= 0x100;
bank = (tile&0xfc)>>1;
if( tile&0x200 ) bank |= 0x80;
if( tile&0x100 ) bank |= 0x01;
color &= 0xe;
color += 16*(spritepalettebank[bank]&0xf);
}
else
{
if( attrs&0x02 ) tile|= 0x100;
color += 16 * (spritepalettebank[(tile>>1)&0xff] & 0x0f);
}
if (flip)
{
sx=240-sx;
sy=240-sy;
flipx = !flipx;
flipy = !flipy;
}
pGfx->transpen(
bitmap,cliprect,tile, color,flipx,flipy,sx,sy,transparent_pen );
pSource += 4;
}
}
void terracre_state::terracre_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 < 0x100; i++)
{
int const r = pal4bit(color_prom[i + 0x000]);
int const g = pal4bit(color_prom[i + 0x100]);
int const b = pal4bit(color_prom[i + 0x200]);
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 0-0x0f
for (int i = 0; i < 0x10; i++)
palette.set_pen_indirect(i, i);
// background tiles use colors 0xc0-0xff in four banks
// the bottom two bits of the color code select the palette bank for pens 0-7;
// the top two bits for pens 8-0x0f.
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = 0xc0 | (i & 0x0f) | ((i >> ((i & 0x08) ? 2 : 0)) & 0x30);
palette.set_pen_indirect(0x10 + i, ctabentry);
}
// sprites use colors 128-191 in four banks
// The lookup table tells which colors to pick from the selected bank
// the bank is selected by another PROM and depends on the top 8 bits of the sprite code.
// The PROM selects the bank *separately* for pens 0-7 and 8-15 (like for tiles).
for (int i = 0; i < 0x1000; i++)
{
uint8_t const ctabentry = 0x80 | ((i << ((i & 0x80) ? 2 : 4)) & 0x30) | (color_prom[i >> 4] & 0x0f);
int i_swapped = ((i & 0x0f) << 8) | ((i & 0xff0) >> 4);
palette.set_pen_indirect(0x110 + i_swapped, ctabentry);
}
}
void terracre_state::amazon_background_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_bg_videoram[offset]);
m_background->mark_tile_dirty(offset);
}
void terracre_state::amazon_foreground_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_fg_videoram[offset]);
m_foreground->mark_tile_dirty(offset);
}
void terracre_state::amazon_flipscreen_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
if( ACCESSING_BITS_0_7 )
{
machine().bookkeeping().coin_counter_w(0, data&0x01 );
machine().bookkeeping().coin_counter_w(1, (data&0x02)>>1 );
flip_screen_set(data&0x04);
}
}
void terracre_state::amazon_scrolly_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_yscroll);
m_background->set_scrolly(0,m_yscroll);
}
void terracre_state::amazon_scrollx_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_xscroll);
m_background->set_scrollx(0,m_xscroll);
}
void terracre_state::video_start()
{
m_background = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(terracre_state::get_bg_tile_info)), TILEMAP_SCAN_COLS, 16,16, 64,32);
m_foreground = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(terracre_state::get_fg_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 64,32);
m_foreground->set_transparent_pen(0xf);
/* register for saving */
save_item(NAME(m_xscroll));
save_item(NAME(m_yscroll));
}
uint32_t terracre_state::screen_update_amazon(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
if( m_xscroll&0x2000 )
bitmap.fill(m_palette->black_pen(), cliprect );
else
m_background->draw(screen, bitmap, cliprect, 0, 0 );
draw_sprites(bitmap,cliprect );
if ((m_xscroll & 0x1000) == 0)
m_foreground->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}

View File

@ -251,6 +251,7 @@ void pkspirit_state::pkspirit(machine_config &config)
ym2203_device &opn(YM2203(config, "opn", 36_MHz_XTAL / 9)); // divider not verified
opn.irq_handler().set_inputline("audiocpu", 0);
//ymsnd.port_a_write_callback() TODO: writes continuously here.
opn.add_route(ALL_OUTPUTS, "mono", 0.30);
OKIM6295(config, "oki", 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5); // all verified

View File

@ -1,6 +1,7 @@
// license:BSD-3-Clause
// copyright-holders:David Graves
// thanks-to:Richard Bush
// copyright-holders: David Graves
// thanks-to: Richard Bush
/****************************************************************************
Top Speed / Full Throttle (c) Taito 1987
@ -154,17 +155,19 @@ From JP manual
***************************************************************************/
#include "emu.h"
#include "topspeed.h"
#include "pc080sn.h"
#include "taitoio.h"
#include "taitoipt.h"
#include "taitosnd.h"
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "taitoio.h"
#include "machine/z80ctc.h"
#include "sound/flt_vol.h"
#include "sound/msm5205.h"
#include "sound/ymopm.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@ -172,6 +175,387 @@ From JP manual
#include "topspeed.lh"
namespace {
class topspeed_state : public driver_device
{
public:
topspeed_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_spritemap(*this, "spritemap")
, m_raster_ctrl(*this, "raster_ctrl")
, m_spriteram(*this, "spriteram")
, m_sharedram(*this, "sharedram")
, m_sndbank(*this, "sndbank")
, m_maincpu(*this, "maincpu")
, m_audiocpu(*this, "audiocpu")
, m_subcpu(*this, "subcpu")
, m_msm(*this, "msm%u", 1U)
, m_pc080sn(*this, "pc080sn_%u", 1U)
, m_tc0040ioc(*this, "tc0040ioc")
, m_filter1l(*this, "filter1l")
, m_filter1r(*this, "filter1r")
, m_filter2(*this, "filter2")
, m_filter3(*this, "filter3")
, m_gfxdecode(*this, "gfxdecode")
, m_gas(*this, "GAS")
, m_brake(*this, "BRAKE")
, m_steer(*this, "STEER")
, m_msm_rom(*this, "adpcm_%u", 0U)
{ }
void topspeed(machine_config &config);
DECLARE_CUSTOM_INPUT_MEMBER(gas_pedal_r);
DECLARE_CUSTOM_INPUT_MEMBER(brake_pedal_r);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
required_shared_ptr<u16> m_spritemap;
required_shared_ptr<u16> m_raster_ctrl;
required_shared_ptr<u16> m_spriteram;
required_shared_ptr<u16> m_sharedram;
required_memory_bank m_sndbank;
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_subcpu;
required_device_array<msm5205_device, 2> m_msm;
required_device_array<pc080sn_device, 2> m_pc080sn;
required_device<tc0040ioc_device> m_tc0040ioc;
required_device<filter_volume_device> m_filter1l;
required_device<filter_volume_device> m_filter1r;
required_device<filter_volume_device> m_filter2;
required_device<filter_volume_device> m_filter3;
required_device<gfxdecode_device> m_gfxdecode;
required_ioport m_gas;
required_ioport m_brake;
required_ioport m_steer;
// Misc
u16 m_cpua_ctrl = 0;
s32 m_ioc220_port = 0;
// ADPCM
required_region_ptr_array<u8, 2> m_msm_rom;
u16 m_msm_pos[2]{};
u8 m_msm_reset[2]{};
u8 m_msm_nibble[2]{};
u8 m_msm2_vck = 0;
u8 m_msm2_vck2 = 0;
#ifdef MAME_DEBUG
u8 m_dislayer[5] = { 0, 0, 0, 0, 0 };
#endif
void msm5205_update(int chip);
void cpua_ctrl_w(u16 data);
u8 input_bypass_r();
u16 motor_r(offs_t offset);
void motor_w(offs_t offset, u16 data);
void coins_w(u8 data);
void msm5205_command_w(offs_t offset, u8 data);
void msm5205_1_vck(int state);
void z80ctc_to0(int state);
void volume_w(offs_t offset, u8 data);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void cpua_map(address_map &map);
void cpub_map(address_map &map);
void z80_io(address_map &map);
void z80_prg(address_map &map);
};
// video
/****************************************************************************
NOTES
Raster line color control
-------------------------
Used to make the road move. Each word controls one pixel row.
0x800000 - 0x1ff raster color control for one road tilemap
0x800200 - 0x3ff raster color control for the other
Road tile colors are (all?) in the range 0x100-103. Top road section
(tilemap at 0xa08000) uses 0x100 and 0x101. Bottom section
(tilemap at 0xb00000) uses 0x102 and 0x103. This would allow colors
on left and right side of road to be different. In practice it seems
Taito didn't take advantage of this.
Each tilemap is usually all one color value. Every now and then (10s
or so) the value alternates. This seems to be determined by whether
the current section of road has white lines in the middle. (0x101/3
gives white lines.)
The raster line color control area has groups of four values which
cascade down through it so the road colors cascade down the screen.
There are three known groups (start is arbitrary; the cycles repeat ad
infinitum or until a different cycle starts; values given are from bottom
to top of screen):
(i) White lines in center of road
12 %10010
1f %11111
00 %00000
0d %01101
(ii) No lines in center of road
08 %01000
0c %01100
1a %11010
1e %11110
(iii) Under bridge or in tunnel [note almost identical to (i)]
ffe0 %00000
ffed %01101
fff2 %10010
ffef %01111
(iv) Unknown 4th group for tunnels in later parts of the game that have
no white lines, analogous to (ii) ?
Correlating with screenshots suggests that these bits refer to:
x.... road body ?
.x... lines in road center and inner edge
..x.. lines at road outer edge
...x. outside road ?
....x ???
Actual gfx tiles used for the road only use colors 1-5. Palette offsets:
(0 = transparency)
1 = lines in road center
2 = road edge (inner)
3 = road edge (outer)
4 = road body
5 = outside road
Each palette block contains three possible sets of 5 colors. Entries 1-5
(standard), 6-10 (alternate), 11-15 (tunnels).
In tunnels only 11-15 are used. Outside tunnels there is a choice between
the standard colors and the alternate colors. The road body could in theory
take a standard color while 'outside the road' took on an alternate. But
in practice the game is using a very limited choice of raster control words,
so we don't know.
Need to test whether sections of the road with unknown raster control words
(tunnels late in the game without central white lines) are correct against
a real machine.
Also are the 'prelines' shortly before white road lines appear correct?
CHECK screen inits at $1692
These suggest that rowscroll areas are all 0x1000 long and there are TWO
for each tilemap layer.
256 rows => 256 words => 0x200 bytes. So probably the inits are far too long.
Maybe the second area for each layer contains colscroll ?
****************************************************************************/
/****************************************************************************
SPRITES
Layout 8 bytes per sprite
-------------------------
+0x00 xxxxxxx. ........ Zoom Y
.......x xxxxxxxx Y
+0x02 x....... ........ Flip Y
........ .xxxxxxx Zoom X
+0x04 x....... ........ Priority
.x...... ........ Flip X
..x..... ........ Unknown
.......x xxxxxxxx X
+0x06 xxxxxxxx ........ Color
........ xxxxxxxx Tile number
********************************************************************************/
void topspeed_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
static const u32 primasks[2] = { 0xff00, 0xfffc }; // Sprites are over bottom layer or under top layer
// Most of spriteram is not used by the 68000: rest is scratch space for the h/w perhaps ?
for (int offs = 0; offs < m_spriteram.bytes() / 2; offs += 4)
{
const u16 data = m_spriteram[offs + 2];
const int tilenum = m_spriteram[offs + 3] & 0xff;
const u32 color = (m_spriteram[offs + 3] & 0xff00) >> 8;
const int flipx = (data & 0x4000) >> 14;
const int flipy = (m_spriteram[offs + 1] & 0x8000) >> 15;
int x = data & 0x1ff;
int y = m_spriteram[offs] & 0x1ff;
int zoomx = (m_spriteram[offs + 1] & 0x7f);
int zoomy = (m_spriteram[offs] & 0xfe00) >> 9;
const int priority = (data & 0x8000) >> 15;
// unknown = (data & 0x2000) >> 13;
// End of sprite list
if (y == 0x180)
break;
const int map_offset = tilenum << 7;
zoomx += 1;
zoomy += 1;
y += 3 + (128-zoomy);
// treat coords as signed
if (x > 0x140) x -= 0x200;
if (y > 0x140) y -= 0x200;
int bad_chunks = 0;
for (int sprite_chunk = 0; sprite_chunk < 128; sprite_chunk++)
{
const int k = sprite_chunk % 8; // 8 sprite chunks per row
const int j = sprite_chunk / 8; // 16 rows
// pick tiles back to front for x and y flips
const int px = (flipx) ? (7 - k) : (k);
const int py = (flipy) ? (15 - j) : (j);
const u16 code = m_spritemap[map_offset + (py << 3) + px];
if (code & 0x8000)
{
bad_chunks += 1;
continue;
}
const int curx = x + ((k * zoomx) / 8);
const int cury = y + ((j * zoomy) / 16);
const int zx = x + (((k + 1) * zoomx) / 8) - curx;
const int zy = y + (((j + 1) * zoomy) / 16) - cury;
m_gfxdecode->gfx(0)->prio_zoom_transpen(bitmap, cliprect,
code,
color,
flipx, flipy,
curx, cury,
zx << 12, zy << 13,
screen.priority(), primasks[priority], 0);
}
if (bad_chunks)
logerror("Sprite number %04x had %02x invalid chunks\n", tilenum, bad_chunks);
}
}
/***************************************************************************/
u32 topspeed_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 layer[4];
#ifdef MAME_DEBUG
if (machine().input().code_pressed_once (KEYCODE_V))
{
m_dislayer[0] ^= 1;
popmessage("bg: %01x", m_dislayer[0]);
}
if (machine().input().code_pressed_once (KEYCODE_B))
{
m_dislayer[1] ^= 1;
popmessage("fg: %01x", m_dislayer[1]);
}
if (machine().input().code_pressed_once (KEYCODE_N))
{
m_dislayer[2] ^= 1;
popmessage("bg2: %01x", m_dislayer[2]);
}
if (machine().input().code_pressed_once (KEYCODE_M))
{
m_dislayer[3] ^= 1;
popmessage("fg2: %01x", m_dislayer[3]);
}
if (machine().input().code_pressed_once (KEYCODE_C))
{
m_dislayer[4] ^= 1;
popmessage("sprites: %01x", m_dislayer[4]);
}
#endif
m_pc080sn[0]->tilemap_update();
m_pc080sn[1]->tilemap_update();
// Tilemap layer priority seems hardwired (the order is odd, too)
layer[0] = 1;
layer[1] = 0;
layer[2] = 1;
layer[3] = 0;
screen.priority().fill(0, cliprect);
bitmap.fill(0, cliprect);
#ifdef MAME_DEBUG
if (m_dislayer[3] == 0)
#endif
m_pc080sn[1]->tilemap_draw(screen, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1);
#ifdef MAME_DEBUG
if (m_dislayer[2] == 0)
#endif
m_pc080sn[1]->tilemap_draw_special(screen, bitmap, cliprect, layer[1], 0, 2, m_raster_ctrl);
#ifdef MAME_DEBUG
if (m_dislayer[1] == 0)
#endif
m_pc080sn[0]->tilemap_draw_special(screen, bitmap, cliprect, layer[2], 0, 4, m_raster_ctrl + 0x100);
#ifdef MAME_DEBUG
if (m_dislayer[0] == 0)
#endif
m_pc080sn[0]->tilemap_draw(screen, bitmap, cliprect, layer[3], 0, 8);
#ifdef MAME_DEBUG
if (m_dislayer[4] == 0)
#endif
draw_sprites(screen, bitmap, cliprect);
return 0;
}
// machine
/**********************************************************
CPU CONTROL
@ -209,13 +593,13 @@ u8 topspeed_state::input_bypass_r()
CUSTOM_INPUT_MEMBER(topspeed_state::gas_pedal_r)
{
static constexpr u8 retval[8] = { 0,1,3,2,6,7,5,4 };
static constexpr u8 retval[8] = { 0, 1, 3, 2, 6, 7, 5, 4 };
return retval[m_gas->read() & 7];
}
CUSTOM_INPUT_MEMBER(topspeed_state::brake_pedal_r)
{
static constexpr u8 retval[8] = { 0,1,3,2,6,7,5,4 };
static constexpr u8 retval[8] = { 0, 1, 3, 2, 6, 7, 5, 4 };
return retval[m_brake->read() & 7];
}
@ -290,7 +674,7 @@ void topspeed_state::msm5205_1_vck(int state)
void topspeed_state::msm5205_command_w(offs_t offset, u8 data)
{
int chip = (offset >> 12) & 1;
const int chip = (offset >> 12) & 1;
switch (offset >> 8 & 0x2e)
{
@ -350,7 +734,7 @@ void topspeed_state::z80ctc_to0(int state)
else
{
// Update on falling edge of /VCK
u16 oldpos = m_msm_pos[1];
const u16 oldpos = m_msm_pos[1];
msm5205_update(1);
@ -381,13 +765,13 @@ void topspeed_state::z80ctc_to0(int state)
void topspeed_state::cpua_map(address_map &map)
{
map(0x000000, 0x0fffff).rom();
map(0x400000, 0x40ffff).ram().share("sharedram");
map(0x400000, 0x40ffff).ram().share(m_sharedram);
map(0x500000, 0x503fff).ram().w("palette", FUNC(palette_device::write16)).share("palette");
map(0x600002, 0x600003).w(FUNC(topspeed_state::cpua_ctrl_w));
map(0x7e0000, 0x7e0001).nopr();
map(0x7e0001, 0x7e0001).w("ciu", FUNC(pc060ha_device::master_port_w));
map(0x7e0003, 0x7e0003).rw("ciu", FUNC(pc060ha_device::master_comm_r), FUNC(pc060ha_device::master_comm_w));
map(0x800000, 0x8003ff).ram().share("raster_ctrl");
map(0x800000, 0x8003ff).ram().share(m_raster_ctrl);
map(0x800400, 0x80ffff).ram();
map(0x880000, 0x880007).nopw(); // Lamps/outputs?
map(0xa00000, 0xa0ffff).rw(m_pc080sn[0], FUNC(pc080sn_device::word_r), FUNC(pc080sn_device::word_w));
@ -398,14 +782,14 @@ void topspeed_state::cpua_map(address_map &map)
map(0xb20000, 0xb20003).w(m_pc080sn[1], FUNC(pc080sn_device::yscroll_word_w));
map(0xb40000, 0xb40003).w(m_pc080sn[1], FUNC(pc080sn_device::xscroll_word_w));
map(0xb50000, 0xb50003).w(m_pc080sn[1], FUNC(pc080sn_device::ctrl_word_w));
map(0xd00000, 0xd00fff).ram().share("spriteram");
map(0xe00000, 0xe0ffff).ram().share("spritemap");
map(0xd00000, 0xd00fff).ram().share(m_spriteram);
map(0xe00000, 0xe0ffff).ram().share(m_spritemap);
}
void topspeed_state::cpub_map(address_map &map)
{
map(0x000000, 0x01ffff).rom();
map(0x400000, 0x40ffff).ram().share("sharedram");
map(0x400000, 0x40ffff).ram().share(m_sharedram);
map(0x880001, 0x880001).r(FUNC(topspeed_state::input_bypass_r)).w(m_tc0040ioc, FUNC(tc0040ioc_device::portreg_w)).umask16(0x00ff);
map(0x880003, 0x880003).rw(m_tc0040ioc, FUNC(tc0040ioc_device::port_r), FUNC(tc0040ioc_device::port_w));
map(0x900000, 0x9003ff).rw(FUNC(topspeed_state::motor_r), FUNC(topspeed_state::motor_w));
@ -417,7 +801,7 @@ void topspeed_state::cpub_map(address_map &map)
void topspeed_state::z80_prg(address_map &map)
{
map(0x0000, 0x3fff).rom();
map(0x4000, 0x7fff).bankr("sndbank");
map(0x4000, 0x7fff).bankr(m_sndbank);
map(0x8000, 0x8fff).ram();
map(0x9000, 0x9001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
map(0xa000, 0xa000).w("ciu", FUNC(pc060ha_device::slave_port_w));
@ -443,7 +827,7 @@ static INPUT_PORTS_START( topspeed )
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWA:1,2")
PORT_DIPSETTING( 0x03, "Deluxe" ) // analog pedals, racing wheel, motor (tilt disabled)
PORT_DIPSETTING( 0x02, "Standard" ) // digital pedals, continuous wheel
// PORT_DIPSETTING( 0x01, "Standard" )
PORT_DIPSETTING( 0x01, "Standard" )
PORT_DIPSETTING( 0x00, "Mini" ) // analog pedals, racing wheel
TAITO_DSWA_BITS_2_TO_3_LOC(SWA)
TAITO_COINAGE_WORLD_LOC(SWA)
@ -783,6 +1167,8 @@ ROM_START( fullthrl )
ROM_LOAD( "b14-29.109", 0x00000, 0x10000, CRC(7ad983e7) SHA1(a3515caf93d6dab86de06ee52d6a13a456507dbe) )
ROM_END
} // anonymous namespace
GAMEL( 1987, topspeed, 0, topspeed, topspeed, topspeed_state, empty_init, ROT0, "Taito Corporation Japan", "Top Speed (World)", MACHINE_SUPPORTS_SAVE, layout_topspeed )
GAMEL( 1987, topspeedu, topspeed, topspeed, fullthrl, topspeed_state, empty_init, ROT0, "Taito America Corporation (Romstar license)", "Top Speed (US)", MACHINE_SUPPORTS_SAVE, layout_topspeed )

View File

@ -1,115 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:David Graves
/*************************************************************************
Top Speed / Full Throttle
*************************************************************************/
#ifndef MAME_TAITO_TOPSPEED_H
#define MAME_TAITO_TOPSPEED_H
#pragma once
#include "sound/msm5205.h"
#include "sound/flt_vol.h"
#include "taitoio.h"
#include "pc080sn.h"
class topspeed_state : public driver_device
{
public:
topspeed_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_spritemap(*this, "spritemap")
, m_raster_ctrl(*this, "raster_ctrl")
, m_spriteram(*this, "spriteram")
, m_sharedram(*this, "sharedram")
, m_sndbank(*this, "sndbank")
, m_maincpu(*this, "maincpu")
, m_audiocpu(*this, "audiocpu")
, m_subcpu(*this, "subcpu")
, m_msm(*this, "msm%u", 1U)
, m_pc080sn(*this, "pc080sn_%u", 1U)
, m_tc0040ioc(*this, "tc0040ioc")
, m_filter1l(*this, "filter1l")
, m_filter1r(*this, "filter1r")
, m_filter2(*this, "filter2")
, m_filter3(*this, "filter3")
, m_gfxdecode(*this, "gfxdecode")
, m_gas(*this, "GAS")
, m_brake(*this, "BRAKE")
, m_steer(*this, "STEER")
, m_msm_rom(*this, "adpcm_%u", 0U)
{ }
void topspeed(machine_config &config);
DECLARE_CUSTOM_INPUT_MEMBER(gas_pedal_r);
DECLARE_CUSTOM_INPUT_MEMBER(brake_pedal_r);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
required_shared_ptr<u16> m_spritemap;
required_shared_ptr<u16> m_raster_ctrl;
required_shared_ptr<u16> m_spriteram;
required_shared_ptr<u16> m_sharedram;
required_memory_bank m_sndbank;
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_subcpu;
required_device_array<msm5205_device, 2> m_msm;
required_device_array<pc080sn_device, 2> m_pc080sn;
required_device<tc0040ioc_device> m_tc0040ioc;
required_device<filter_volume_device> m_filter1l;
required_device<filter_volume_device> m_filter1r;
required_device<filter_volume_device> m_filter2;
required_device<filter_volume_device> m_filter3;
required_device<gfxdecode_device> m_gfxdecode;
required_ioport m_gas;
required_ioport m_brake;
required_ioport m_steer;
// Misc
u16 m_cpua_ctrl = 0;
s32 m_ioc220_port = 0;
// ADPCM
required_region_ptr_array<u8, 2> m_msm_rom;
u16 m_msm_pos[2]{};
u8 m_msm_reset[2]{};
u8 m_msm_nibble[2]{};
u8 m_msm2_vck = 0;
u8 m_msm2_vck2 = 0;
#ifdef MAME_DEBUG
u8 m_dislayer[5] = { 0, 0, 0, 0, 0 };
#endif
void msm5205_update(int chip);
void cpua_ctrl_w(u16 data);
u8 input_bypass_r();
u16 motor_r(offs_t offset);
void motor_w(offs_t offset, u16 data);
void coins_w(u8 data);
void msm5205_command_w(offs_t offset, u8 data);
void msm5205_1_vck(int state);
void z80ctc_to0(int state);
void volume_w(offs_t offset, u8 data);
// video/topspeed.cpp
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void cpua_map(address_map &map);
void cpub_map(address_map &map);
void z80_io(address_map &map);
void z80_prg(address_map &map);
};
#endif // MAME_TAITO_TOPSPEED_H

View File

@ -1,284 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:David Graves
#include "emu.h"
#include "topspeed.h"
#include "screen.h"
/****************************************************************************
NOTES
Raster line color control
-------------------------
Used to make the road move. Each word controls one pixel row.
0x800000 - 0x1ff raster color control for one road tilemap
0x800200 - 0x3ff raster color control for the other
Road tile colors are (all?) in the range 0x100-103. Top road section
(tilemap at 0xa08000) uses 0x100 and 0x101. Bottom section
(tilemap at 0xb00000) uses 0x102 and 0x103. This would allow colors
on left and right side of road to be different. In practice it seems
Taito didn't take advantage of this.
Each tilemap is usually all one color value. Every now and then (10s
or so) the value alternates. This seems to be determined by whether
the current section of road has white lines in the middle. (0x101/3
gives white lines.)
The raster line color control area has groups of four values which
cascade down through it so the road colors cascade down the screen.
There are three known groups (start is arbitrary; the cycles repeat ad
infinitum or until a different cycle starts; values given are from bottom
to top of screen):
(i) White lines in center of road
12 %10010
1f %11111
00 %00000
0d %01101
(ii) No lines in center of road
08 %01000
0c %01100
1a %11010
1e %11110
(iii) Under bridge or in tunnel [note almost identical to (i)]
ffe0 %00000
ffed %01101
fff2 %10010
ffef %01111
(iv) Unknown 4th group for tunnels in later parts of the game that have
no white lines, analogous to (ii) ?
Correlating with screenshots suggests that these bits refer to:
x.... road body ?
.x... lines in road center and inner edge
..x.. lines at road outer edge
...x. outside road ?
....x ???
Actual gfx tiles used for the road only use colors 1-5. Palette offsets:
(0 = transparency)
1 = lines in road center
2 = road edge (inner)
3 = road edge (outer)
4 = road body
5 = outside road
Each palette block contains three possible sets of 5 colors. Entries 1-5
(standard), 6-10 (alternate), 11-15 (tunnels).
In tunnels only 11-15 are used. Outside tunnels there is a choice between
the standard colors and the alternate colors. The road body could in theory
take a standard color while 'outside the road' took on an alternate. But
in practice the game is using a very limited choice of raster control words,
so we don't know.
Need to test whether sections of the road with unknown raster control words
(tunnels late in the game without central white lines) are correct against
a real machine.
Also are the 'prelines' shortly before white road lines appear correct?
CHECK screen inits at $1692
These suggest that rowscroll areas are all 0x1000 long and there are TWO
for each tilemap layer.
256 rows => 256 words => 0x200 bytes. So probably the inits are far too long.
Maybe the second area for each layer contains colscroll ?
****************************************************************************/
/****************************************************************************
SPRITES
Layout 8 bytes per sprite
-------------------------
+0x00 xxxxxxx. ........ Zoom Y
.......x xxxxxxxx Y
+0x02 x....... ........ Flip Y
........ .xxxxxxx Zoom X
+0x04 x....... ........ Priority
.x...... ........ Flip X
..x..... ........ Unknown
.......x xxxxxxxx X
+0x06 xxxxxxxx ........ Color
........ xxxxxxxx Tile number
********************************************************************************/
void topspeed_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
static const u32 primasks[2] = { 0xff00, 0xfffc }; /* Sprites are over bottom layer or under top layer */
/* Most of spriteram is not used by the 68000: rest is scratch space for the h/w perhaps ? */
for (int offs = 0; offs < m_spriteram.bytes() / 2; offs += 4)
{
const u16 data = m_spriteram[offs + 2];
const int tilenum = m_spriteram[offs + 3] & 0xff;
const u32 color = (m_spriteram[offs + 3] & 0xff00) >> 8;
const int flipx = (data & 0x4000) >> 14;
const int flipy = (m_spriteram[offs + 1] & 0x8000) >> 15;
int x = data & 0x1ff;
int y = m_spriteram[offs] & 0x1ff;
int zoomx = (m_spriteram[offs + 1]& 0x7f);
int zoomy = (m_spriteram[offs] & 0xfe00) >> 9;
const int priority = (data & 0x8000) >> 15;
// unknown = (data & 0x2000) >> 13;
/* End of sprite list */
if (y == 0x180)
break;
const int map_offset = tilenum << 7;
zoomx += 1;
zoomy += 1;
y += 3 + (128-zoomy);
/* treat coords as signed */
if (x > 0x140) x -= 0x200;
if (y > 0x140) y -= 0x200;
int bad_chunks = 0;
for (int sprite_chunk = 0; sprite_chunk < 128; sprite_chunk++)
{
const int k = sprite_chunk % 8; /* 8 sprite chunks per row */
const int j = sprite_chunk / 8; /* 16 rows */
/* pick tiles back to front for x and y flips */
const int px = (flipx) ? (7 - k) : (k);
const int py = (flipy) ? (15 - j) : (j);
const u16 code = m_spritemap[map_offset + (py << 3) + px];
if (code & 0x8000)
{
bad_chunks += 1;
continue;
}
const int curx = x + ((k * zoomx) / 8);
const int cury = y + ((j * zoomy) / 16);
const int zx = x + (((k + 1) * zoomx) / 8) - curx;
const int zy = y + (((j + 1) * zoomy) / 16) - cury;
m_gfxdecode->gfx(0)->prio_zoom_transpen(bitmap,cliprect,
code,
color,
flipx,flipy,
curx,cury,
zx << 12,zy << 13,
screen.priority(),primasks[priority],0);
}
if (bad_chunks)
logerror("Sprite number %04x had %02x invalid chunks\n",tilenum,bad_chunks);
}
}
/***************************************************************************/
u32 topspeed_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 layer[4];
#ifdef MAME_DEBUG
if (machine().input().code_pressed_once (KEYCODE_V))
{
m_dislayer[0] ^= 1;
popmessage("bg: %01x", m_dislayer[0]);
}
if (machine().input().code_pressed_once (KEYCODE_B))
{
m_dislayer[1] ^= 1;
popmessage("fg: %01x", m_dislayer[1]);
}
if (machine().input().code_pressed_once (KEYCODE_N))
{
m_dislayer[2] ^= 1;
popmessage("bg2: %01x", m_dislayer[2]);
}
if (machine().input().code_pressed_once (KEYCODE_M))
{
m_dislayer[3] ^= 1;
popmessage("fg2: %01x", m_dislayer[3]);
}
if (machine().input().code_pressed_once (KEYCODE_C))
{
m_dislayer[4] ^= 1;
popmessage("sprites: %01x", m_dislayer[4]);
}
#endif
m_pc080sn[0]->tilemap_update();
m_pc080sn[1]->tilemap_update();
/* Tilemap layer priority seems hardwired (the order is odd, too) */
layer[0] = 1;
layer[1] = 0;
layer[2] = 1;
layer[3] = 0;
screen.priority().fill(0, cliprect);
bitmap.fill(0, cliprect);
#ifdef MAME_DEBUG
if (m_dislayer[3] == 0)
#endif
m_pc080sn[1]->tilemap_draw(screen, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1);
#ifdef MAME_DEBUG
if (m_dislayer[2] == 0)
#endif
m_pc080sn[1]->tilemap_draw_special(screen, bitmap, cliprect, layer[1], 0, 2, m_raster_ctrl);
#ifdef MAME_DEBUG
if (m_dislayer[1] == 0)
#endif
m_pc080sn[0]->tilemap_draw_special(screen, bitmap, cliprect, layer[2], 0, 4, m_raster_ctrl + 0x100);
#ifdef MAME_DEBUG
if (m_dislayer[0] == 0)
#endif
m_pc080sn[0]->tilemap_draw(screen, bitmap, cliprect, layer[3], 0, 8);
#ifdef MAME_DEBUG
if (m_dislayer[4] == 0)
#endif
draw_sprites(screen,bitmap,cliprect);
return 0;
}