- igs/goldstar.cpp: corrected palette for cmfb55 [Ioannis Bampoulas]

- comad/funybubl.cpp, comad/galspnbl.cpp, comad/zerozone.cpp: consolidated drivers in single files
This commit is contained in:
Ivan Vangelista 2022-11-05 08:14:36 +01:00
parent 00309d4a6c
commit 4ebe2e80e3
15 changed files with 580 additions and 634 deletions

View File

@ -48,7 +48,7 @@ Stephh's notes (based on the games M68000 code and some tests) :
- When in "test mode", press START1 to cycle through next sound, and press START2
to directly test the inputs and the Dip Switches.
- Bit 1 of Dip Switch is only read in combinaison of bit 0 during P.O.S.T. to
- Bit 1 of Dip Switch is only read in combination of bit 0 during P.O.S.T. to
enter the "test mode", but it doesn't add any credit ! That's why I've patched
the inputs, so you can enter the "test mode" by pressing COIN1 during P.O.S.T.

View File

@ -1,27 +1,24 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
// copyright-holders: David Haywood
/*
Funny Bubble ...
It's a Puzzloop (Lup Lup Puzzle) rip-off .. but with two Z80 CPUs
The program roms say omega 1997
Omega made Super Lup Lup Puzzle/Lup Lup Puzzle/Puzzle Bang Bang see vamphalf.c
The program ROMs say omega 1997
Omega made Super Lup Lup Puzzle/Lup Lup Puzzle/Puzzle Bang Bang - see misc/vamphalf.cpp
These games copy the game play of Puzzloop but add adult picture backgrounds.
The gfx roms say 1999
The gfx ROMs say 1999
Title screen has no date
( a z80 as the main cpu in 1999 ??! )
( a z80 as the main CPU in 1999 ??! )
Did In Chang Electronic Co do the "original" version of Funny Bubble?
In Chang Electronic Co did the "original" version of Funny Bubble?
Comad either hacked or licensed it. As "In Chang Electronic" are
spelled out in the default high score table ;-)
todo :
convert to tilemaps
spelled out in the default high score table of the Comad version, too ;-)
+-----------------------------------------+
| 8MHz M6295 SU12 UG1 UG3 |
@ -49,18 +46,181 @@ Note: SW2, SW3 & SW4 not populated
*/
#include "emu.h"
#include "funybubl.h"
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "sound/okim6295.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
namespace {
class funybubl_state : public driver_device
{
public:
funybubl_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_tilemapram(*this, "tilemapram"),
m_spriteram(*this, "spriteram"),
m_mainbank(*this, "mainbank"),
m_okibank(*this, "okibank"),
m_vrambank(*this, "vrambank"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_oki(*this, "oki"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_soundlatch(*this, "soundlatch")
{ }
void funybubl(machine_config &config);
protected:
virtual void machine_start() override;
virtual void video_start() override;
private:
// memory pointers
required_shared_ptr<uint8_t> m_tilemapram;
required_shared_ptr<uint8_t> m_spriteram;
required_memory_bank m_mainbank;
required_memory_bank m_okibank;
memory_view m_vrambank;
// video-related
tilemap_t *m_tilemap = nullptr;
// devices
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<okim6295_device> m_oki;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
// memory
void vidram_bank_w(uint8_t data);
void cpurombank_w(uint8_t data);
void oki_bank_w(uint8_t data);
static rgb_t r6b6g6(uint32_t raw);
void tilemap_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0);
TILE_GET_INFO_MEMBER(get_tile_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void main_program_map(address_map &map);
void main_io_map(address_map &map);
void oki_map(address_map &map);
void sound_map(address_map &map);
void vrambank_map(address_map &map);
};
// video
rgb_t funybubl_state::r6b6g6(uint32_t raw)
{
return rgb_t(pal6bit(raw >> 12), pal6bit(raw >> 0), pal6bit(raw >> 6));
}
void funybubl_state::tilemap_w(offs_t offset, uint8_t data, uint8_t mem_mask)
{
COMBINE_DATA(&m_tilemapram[offset]);
m_tilemap->mark_tile_dirty(offset >> 1);
}
TILE_GET_INFO_MEMBER(funybubl_state::get_tile_info)
{
uint16_t const code = m_tilemapram[tile_index << 1] | (m_tilemapram[(tile_index << 1) | 1] << 8);
tileinfo.set(0, code & 0x7fff, BIT(code, 15), 0);
}
void funybubl_state::video_start()
{
m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(funybubl_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_tilemap->set_transparent_pen(0);
}
void funybubl_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *source = &m_spriteram[0x1000 - 0x20];
uint8_t const *finish = m_spriteram;
while (source >= finish)
{
/* the sprites are in the sprite list twice
the first format (in comments) appears to be a buffer, if you use
this list you get garbage sprites in 2 player mode
the second format (used) seems correct
*/
/*
int ypos = 0xff - source[1 + 0x10];
int xpos = source[2 + 0x10];
int tile = source[0 + 0x10] | ( (source[3 + 0x10] & 0x0f) <<8);
if (source[3 + 0x10] & 0x80) tile += 0x1000;
if (source[3 + 0x10] & 0x20) xpos += 0x100;
// bits 0x40 (not used?) and 0x10 (just set during transition period of x co-ord 0xff and 0x00) ...
xpos -= 8;
ypos -= 14;
*/
int const ypos = source[2];
int xpos = source[3];
int tile = source[0] | ( (source[1] & 0x0f) << 8);
if (source[1] & 0x80) tile += 0x1000;
if (source[1] & 0x20)
{
if (xpos < 0xe0)
xpos += 0x100;
}
// bits 0x40 and 0x10 not used?...
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect, tile, 0, 0, 0, xpos, ypos, 255);
source -= 0x20;
}
}
uint32_t funybubl_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(m_palette->black_pen(), cliprect);
m_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
#if 0
if (machine().input().code_pressed_once(KEYCODE_W))
{
FILE *fp;
fp = fopen("funnybubsprites", "w+b");
if (fp)
{
fwrite(&m_spriteram[0], 0x1000, 1, fp);
fclose(fp);
}
}
#endif
return 0;
}
// machine
void funybubl_state::vidram_bank_w(uint8_t data)
{
m_vrambank->set_bank(data & 1);
m_vrambank.select(data & 1);
}
void funybubl_state::cpurombank_w(uint8_t data)
@ -74,34 +234,30 @@ void funybubl_state::oki_bank_w(uint8_t data)
}
void funybubl_state::funybubl_map(address_map &map)
void funybubl_state::main_program_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0xbfff).bankr("mainbank"); // banked port 1?
map(0xc400, 0xcfff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette"); // palette
map(0xd000, 0xdfff).m(m_vrambank, FUNC(address_map_bank_device::amap8)); // banked port 0?
map(0x8000, 0xbfff).bankr(m_mainbank); // banked port 1?
map(0xc400, 0xcfff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0xd000, 0xdfff).view(m_vrambank); // banked port 0?
m_vrambank[0](0xd000, 0xdfff).ram().w(FUNC(funybubl_state::tilemap_w)).share(m_tilemapram);
m_vrambank[1](0xd000, 0xdfff).ram().share(m_spriteram);
map(0xe000, 0xffff).ram();
}
void funybubl_state::io_map(address_map &map)
void funybubl_state::main_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).portr("SYSTEM").w(FUNC(funybubl_state::vidram_bank_w)); // vidram bank
map(0x01, 0x01).portr("P1").w(FUNC(funybubl_state::cpurombank_w)); // rom bank?
map(0x00, 0x00).portr("SYSTEM").w(FUNC(funybubl_state::vidram_bank_w));
map(0x01, 0x01).portr("P1").w(FUNC(funybubl_state::cpurombank_w)); // ?
map(0x02, 0x02).portr("P2");
map(0x03, 0x03).portr("DSW").w(m_soundlatch, FUNC(generic_latch_8_device::write));
map(0x06, 0x06).nopr(); /* Nothing is done with the data read */
map(0x06, 0x06).nopw(); /* Written directly after IO port 0 */
map(0x07, 0x07).nopw(); /* Reset something on startup - Sound CPU ?? */
map(0x06, 0x06).nopr(); // Nothing is done with the data read
map(0x06, 0x06).nopw(); // Written directly after IO port 0
map(0x07, 0x07).nopw(); // Reset something on startup - Sound CPU ??
}
void funybubl_state::vrambank_map(address_map &map)
{
map(0x0000, 0x0fff).ram().w(FUNC(funybubl_state::tilemap_w)).share("tilemapram");
map(0x1000, 0x1fff).ram().share("spriteram");
}
/* Sound CPU */
// Sound CPU
void funybubl_state::sound_map(address_map &map)
{
@ -115,7 +271,7 @@ void funybubl_state::sound_map(address_map &map)
void funybubl_state::oki_map(address_map &map)
{
map(0x00000, 0x1ffff).rom();
map(0x20000, 0x3ffff).bankr("okibank");
map(0x20000, 0x3ffff).bankr(m_okibank);
}
@ -125,10 +281,10 @@ static INPUT_PORTS_START( funybubl )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Maybe unused
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Maybe unused
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Maybe unused
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Maybe unused
PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
@ -136,9 +292,9 @@ static INPUT_PORTS_START( funybubl )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Maybe unused
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Maybe unused
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Maybe unused
PORT_START("P2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
@ -146,9 +302,9 @@ static INPUT_PORTS_START( funybubl )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Maybe unused
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Maybe unused
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Maybe unused
PORT_START("DSW")
PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3")
@ -202,8 +358,8 @@ static const gfx_layout layout_16x16x8 =
static GFXDECODE_START( gfx_funybubl )
GFXDECODE_ENTRY( "gfx1", 0, layout_8x8x8, 0x100, 2 )
GFXDECODE_ENTRY( "gfx2", 0, layout_16x16x8, 0x000, 1 )
GFXDECODE_ENTRY( "tiles", 0, layout_8x8x8, 0x100, 2 )
GFXDECODE_ENTRY( "sprites", 0, layout_16x16x8, 0x000, 1 )
GFXDECODE_END
@ -212,25 +368,21 @@ void funybubl_state::machine_start()
{
m_mainbank->configure_entries(0, 0x10, memregion("maincpu")->base(), 0x4000);
m_okibank->configure_entries(0, 2, memregion("oki")->base() + 0x20000, 0x20000);
m_vrambank->set_bank(0);
}
void funybubl_state::funybubl(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 12000000/2); /* 6 MHz?? */
m_maincpu->set_addrmap(AS_PROGRAM, &funybubl_state::funybubl_map);
m_maincpu->set_addrmap(AS_IO, &funybubl_state::io_map);
// basic machine hardware
Z80(config, m_maincpu, 12_MHz_XTAL / 2); // 6 MHz?? divider not verified
m_maincpu->set_addrmap(AS_PROGRAM, &funybubl_state::main_program_map);
m_maincpu->set_addrmap(AS_IO, &funybubl_state::main_io_map);
m_maincpu->set_vblank_int("screen", FUNC(funybubl_state::irq0_line_hold));
Z80(config, m_audiocpu, 8000000/2); /* 4 MHz?? */
Z80(config, m_audiocpu, 8_MHz_XTAL / 2); // 4 MHz?? divider not verified
m_audiocpu->set_addrmap(AS_PROGRAM, &funybubl_state::sound_map);
ADDRESS_MAP_BANK(config, m_vrambank).set_map(&funybubl_state::vrambank_map).set_options(ENDIANNESS_LITTLE, 8, 13, 0x1000);
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
@ -241,15 +393,15 @@ void funybubl_state::funybubl(machine_config &config)
screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_funybubl);
PALETTE(config, m_palette).set_format(4, &funybubl_state::funybubl_R6B6G6, 0xc00/4);
PALETTE(config, m_palette).set_format(4, &funybubl_state::r6b6g6, 0xc00 / 4);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
OKIM6295(config, m_oki, 8000000/8, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
OKIM6295(config, m_oki, 8_MHz_XTAL / 8, okim6295_device::PIN7_HIGH); // divider & pin 7 not verified
m_oki->set_addrmap(0, &funybubl_state::oki_map);
m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
}
@ -257,10 +409,10 @@ void funybubl_state::funybubl(machine_config &config)
ROM_START( funybubl )
ROM_REGION( 0x40000, "maincpu", 0 ) /* main z80, lots of banked data */
ROM_REGION( 0x40000, "maincpu", 0 ) // main z80, lots of banked data
ROM_LOAD( "a.ub16", 0x00000, 0x40000, CRC(4e799cdd) SHA1(c6474fd2f621c27224e847ecb88a1ae17a0dbaf9) )
ROM_REGION( 0x200000, "gfx1", ROMREGION_INVERT ) // bg gfx 8x8x8
ROM_REGION( 0x200000, "tiles", ROMREGION_INVERT ) // 8x8x8
ROM_LOAD( "f.ug13", 0x000000, 0x40000, CRC(64d7163d) SHA1(2619ac96e05779ea23c7f0f71665d284c79ba72f) )
ROM_LOAD( "g.uh13", 0x040000, 0x40000, CRC(6891e2b8) SHA1(ca711019e5c330759d2a90024dbc0e6731b6227f) )
ROM_LOAD( "h.ug15", 0x080000, 0x40000, CRC(ca7f7528) SHA1(6becfe8fabd19443a13b948838f41e10e5c9dc87) )
@ -270,25 +422,25 @@ ROM_START( funybubl )
ROM_LOAD( "n.ug17", 0x180000, 0x40000, CRC(52398b68) SHA1(522baa8123998e9161fa1ccaf760ac006c5be2dd) )
ROM_LOAD( "o.uh17", 0x1c0000, 0x40000, CRC(446e31b2) SHA1(7f37a7090c83f2c9b07f1993707540fb32bbed35) )
ROM_REGION( 0x200000, "gfx2", ROMREGION_INVERT )
ROM_LOAD( "d.ug1", 0x000000, 0x80000, CRC(b7ebbc00) SHA1(92520fda2f8f242b8cd49aeaac21b279f48276bf) ) /* Same as below, different labels */
ROM_REGION( 0x200000, "sprites", ROMREGION_INVERT )
ROM_LOAD( "d.ug1", 0x000000, 0x80000, CRC(b7ebbc00) SHA1(92520fda2f8f242b8cd49aeaac21b279f48276bf) ) // Same as below, different labels
ROM_LOAD( "e.ug2", 0x080000, 0x80000, CRC(28afc396) SHA1(555d51948ffb237311112dcfd0516a43f603ff03) )
ROM_LOAD( "j.ug3", 0x100000, 0x80000, CRC(9e8687cd) SHA1(42fcba2532ae5028fcfc1df50750d99ad2586820) )
ROM_LOAD( "k.ug4", 0x180000, 0x80000, CRC(63f0e810) SHA1(5c7ed32ee8dc1d9aabc8d136ec370471096356c2) )
ROM_REGION( 0x08000, "audiocpu", 0 ) /* sound z80 (not much code here ..) */
ROM_LOAD( "p.su6", 0x00000, 0x08000, CRC(33169d4d) SHA1(0ebc932d15b6df022c7e1f44df884e64b25ba745) ) /* Same as below, different label */
ROM_REGION( 0x08000, "audiocpu", 0 ) // sound z80 (not much code here ..)
ROM_LOAD( "p.su6", 0x00000, 0x08000, CRC(33169d4d) SHA1(0ebc932d15b6df022c7e1f44df884e64b25ba745) ) // Same as below, different label
ROM_REGION( 0x80000, "oki", 0 )
ROM_LOAD( "b.su12", 0x00000, 0x20000, CRC(a2d780f4) SHA1(bebba3db21ab9ddde8c6f19db3b67c869df582eb) ) /* Same as below, different label */
ROM_LOAD( "c.su13", 0x20000, 0x40000, CRC(1f7e9269) SHA1(5c16b49a4e94aec7606d088c2d45a77842ab565b) ) /* Same as below, different label */
ROM_LOAD( "b.su12", 0x00000, 0x20000, CRC(a2d780f4) SHA1(bebba3db21ab9ddde8c6f19db3b67c869df582eb) ) // Same as below, different label
ROM_LOAD( "c.su13", 0x20000, 0x40000, CRC(1f7e9269) SHA1(5c16b49a4e94aec7606d088c2d45a77842ab565b) ) // Same as below, different label
ROM_END
ROM_START( funybublc )
ROM_REGION( 0x40000, "maincpu", 0 ) /* main z80, lots of banked data */
ROM_REGION( 0x40000, "maincpu", 0 ) // main z80, lots of banked data
ROM_LOAD( "2.ub16", 0x00000, 0x40000, CRC(d684c13f) SHA1(6a58b44dd775f374d6fd476a8fd175c28a83a495) )
ROM_REGION( 0x200000, "gfx1", ROMREGION_INVERT ) // bg gfx 8x8x8
ROM_REGION( 0x200000, "tiles", ROMREGION_INVERT ) // 8x8x8
ROM_LOAD( "7.ug12", 0x000000, 0x40000, CRC(87603d7b) SHA1(21aec4cd011691f8608c3ddab83697bd89634fc8) )
ROM_LOAD( "8.uh13", 0x040000, 0x40000, CRC(ab6031bd) SHA1(557793817f98c07c82caab4293aed7dffa4dbf7b) )
ROM_LOAD( "9.ug15", 0x080000, 0x40000, CRC(0e8352ff) SHA1(29679a7ece2585e1a66296439b68bd56c937e313) )
@ -298,13 +450,13 @@ ROM_START( funybublc )
ROM_LOAD( "15.ug17", 0x180000, 0x40000, CRC(9a5e66a6) SHA1(cbe727e4f1e9a7072520d2e30eb0047cc67bff1b) )
ROM_LOAD( "16.uh17", 0x1c0000, 0x40000, CRC(218060b3) SHA1(35124afce7f0f998b5c4761bbc888235de4e56ef) )
ROM_REGION( 0x200000, "gfx2", ROMREGION_INVERT )
ROM_REGION( 0x200000, "sprites", ROMREGION_INVERT )
ROM_LOAD( "5.ug1", 0x000000, 0x80000, CRC(b7ebbc00) SHA1(92520fda2f8f242b8cd49aeaac21b279f48276bf) )
ROM_LOAD( "6.ug2", 0x080000, 0x80000, CRC(28afc396) SHA1(555d51948ffb237311112dcfd0516a43f603ff03) )
ROM_LOAD( "11.ug3", 0x100000, 0x80000, CRC(9e8687cd) SHA1(42fcba2532ae5028fcfc1df50750d99ad2586820) )
ROM_LOAD( "12.ug4", 0x180000, 0x80000, CRC(63f0e810) SHA1(5c7ed32ee8dc1d9aabc8d136ec370471096356c2) )
ROM_REGION( 0x08000, "audiocpu", 0 ) /* sound z80 (not much code here ..) */
ROM_REGION( 0x08000, "audiocpu", 0 ) // sound z80 (not much code here ..)
ROM_LOAD( "1.su6", 0x00000, 0x08000, CRC(33169d4d) SHA1(0ebc932d15b6df022c7e1f44df884e64b25ba745) )
ROM_REGION( 0x80000, "oki", 0 )
@ -312,6 +464,8 @@ ROM_START( funybublc )
ROM_LOAD( "4.su13", 0x20000, 0x40000, CRC(1f7e9269) SHA1(5c16b49a4e94aec7606d088c2d45a77842ab565b) )
ROM_END
} // anonymous namespace
GAME( 1999, funybubl, 0, funybubl, funybubl, funybubl_state, empty_init, ROT0, "In Chang Electronic Co", "Funny Bubble", MACHINE_SUPPORTS_SAVE )
GAME( 1999, funybublc,funybubl, funybubl, funybubl, funybubl_state, empty_init, ROT0, "Comad", "Funny Bubble (Comad version)", MACHINE_SUPPORTS_SAVE )
GAME( 1999, funybubl, 0, funybubl, funybubl, funybubl_state, empty_init, ROT0, "In Chang Electronic Co", "Funny Bubble", MACHINE_SUPPORTS_SAVE )
GAME( 1999, funybublc,funybubl, funybubl, funybubl, funybubl_state, empty_init, ROT0, "Comad", "Funny Bubble (Comad version)", MACHINE_SUPPORTS_SAVE )

View File

@ -1,76 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
#ifndef MAME_INCLUDES_FUNYBUBL_H
#define MAME_INCLUDES_FUNYBUBL_H
#pragma once
#include "machine/bankdev.h"
#include "machine/gen_latch.h"
#include "sound/okim6295.h"
#include "emupal.h"
#include "tilemap.h"
class funybubl_state : public driver_device
{
public:
funybubl_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_tilemapram(*this, "tilemapram"),
m_spriteram(*this, "spriteram"),
m_mainbank(*this, "mainbank"),
m_okibank(*this, "okibank"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_oki(*this, "oki"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_soundlatch(*this, "soundlatch"),
m_vrambank(*this, "vrambank")
{ }
void funybubl(machine_config &config);
protected:
virtual void machine_start() override;
virtual void video_start() override;
private:
/* memory pointers */
required_shared_ptr<uint8_t> m_tilemapram;
required_shared_ptr<uint8_t> m_spriteram;
required_memory_bank m_mainbank;
required_memory_bank m_okibank;
/* video-related */
tilemap_t *m_tilemap = nullptr;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<okim6295_device> m_oki;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
required_device<address_map_bank_device> m_vrambank;
/* memory */
void vidram_bank_w(uint8_t data);
void cpurombank_w(uint8_t data);
void oki_bank_w(uint8_t data);
static rgb_t funybubl_R6B6G6(uint32_t raw);
void tilemap_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0);
TILE_GET_INFO_MEMBER(get_tile_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
void funybubl_map(address_map &map);
void io_map(address_map &map);
void oki_map(address_map &map);
void sound_map(address_map &map);
void vrambank_map(address_map &map);
};
#endif // MAME_INCLUDES_FUNYBUBL_H

View File

@ -1,102 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/* Funny Bubble Video hardware
todo - convert to tilemap
*/
#include "emu.h"
#include "funybubl.h"
rgb_t funybubl_state::funybubl_R6B6G6(uint32_t raw)
{
return rgb_t(pal6bit(raw >> 12), pal6bit(raw >> 0), pal6bit(raw >> 6));
}
void funybubl_state::tilemap_w(offs_t offset, uint8_t data, uint8_t mem_mask)
{
COMBINE_DATA(&m_tilemapram[offset]);
m_tilemap->mark_tile_dirty(offset>>1);
}
TILE_GET_INFO_MEMBER(funybubl_state::get_tile_info)
{
uint16_t const code = m_tilemapram[tile_index << 1] | (m_tilemapram[(tile_index << 1) | 1] << 8);
tileinfo.set(0, code & 0x7fff, BIT(code, 15), 0);
}
void funybubl_state::video_start()
{
m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(funybubl_state::get_tile_info)),TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_tilemap->set_transparent_pen(0);
}
void funybubl_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
uint8_t *source = &m_spriteram[0x1000 - 0x20];
uint8_t *finish = m_spriteram;
while (source >= finish)
{
int xpos, ypos, tile;
/* the sprites are in the sprite list twice
the first format (in comments) appears to be a buffer, if you use
this list you get garbage sprites in 2 player mode
the second format (used) seems correct
*/
/*
ypos = 0xff - source[1 + 0x10];
xpos = source[2 + 0x10];
tile = source[0 + 0x10] | ( (source[3 + 0x10] & 0x0f) <<8);
if (source[3 + 0x10] & 0x80) tile += 0x1000;
if (source[3 + 0x10] & 0x20) xpos += 0x100;
// bits 0x40 (not used?) and 0x10 (just set during transition period of x co-ord 0xff and 0x00) ...
xpos -= 8;
ypos -= 14;
*/
ypos = source[2];
xpos = source[3];
tile = source[0] | ( (source[1] & 0x0f) << 8);
if (source[1] & 0x80) tile += 0x1000;
if (source[1] & 0x20)
{
if (xpos < 0xe0)
xpos += 0x100;
}
// bits 0x40 and 0x10 not used?...
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, tile, 0, 0, 0, xpos, ypos, 255);
source -= 0x20;
}
}
uint32_t funybubl_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(m_palette->black_pen(), cliprect);
m_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
#if 0
if ( machine().input().code_pressed_once(KEYCODE_W) )
{
FILE *fp;
fp = fopen("funnybubsprites", "w+b");
if (fp)
{
fwrite(&m_spriteram[0], 0x1000, 1, fp);
fclose(fp);
}
}
#endif
return 0;
}

View File

@ -1,5 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
// copyright-holders: Nicola Salmoria
/***************************************************************************
Hot Pinball
@ -11,10 +12,10 @@ Notes:
- to start a 2 or more players game, press the start button multiple times
- the sprite graphics contain a "(c) Tecmo", and the sprite system is
indeed similar to other Tecmo games like Ninja Gaiden.
- Clearly based on Tecmo's Super Pinball Action (see spbactn.c)
- Clearly based on Tecmo's Super Pinball Action (see tecmo/spbactn.cpp)
- There seems to be a bug in Hot Pinball's Demo Sounds. If you start the
game normally you get no demo sounds. However if you select the "Slide
Show" and run all the way through the game will start with demo sounds.
game normally you get no demo sounds. However, if you select the "Slide
Show" and run all the way through, the game will start with demo sounds.
Gals Pinball's Demo Sounds works as expected according to DSW setting.
TODO:
@ -51,48 +52,203 @@ Known undumped games/sets:
***************************************************************************/
#include "emu.h"
#include "galspnbl.h"
#include "tecmo_spr.h"
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "sound/okim6295.h"
#include "sound/ymopl.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
void galspnbl_state::soundcommand_w(offs_t offset, uint16_t data, uint16_t mem_mask)
namespace {
class galspnbl_state : public driver_device
{
if (ACCESSING_BITS_0_7)
public:
galspnbl_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_spriteram(*this, "spriteram"),
m_colorram(*this, "colorram"),
m_videoram(*this, "videoram"),
m_bgvideoram(*this, "bgvideoram"),
m_scroll(*this, "scroll"),
m_audiocpu(*this, "audiocpu"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_sprgen(*this, "spritegen"),
m_screen(*this, "screen"),
m_soundlatch(*this, "soundlatch")
{ }
void galspnbl(machine_config &config);
protected:
virtual void video_start() override;
private:
// memory pointers
required_shared_ptr<uint16_t> m_spriteram;
required_shared_ptr<uint16_t> m_colorram;
required_shared_ptr<uint16_t> m_videoram;
required_shared_ptr<uint16_t> m_bgvideoram;
required_shared_ptr<uint16_t> m_scroll;
// devices
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<tecmo_spr_device> m_sprgen;
required_device<screen_device> m_screen;
required_device<generic_latch_8_device> m_soundlatch;
void soundcommand_w(offs_t offset, uint8_t data);
void palette(palette_device &palette) const;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_background(bitmap_ind16 &bitmap, const rectangle &cliprect);
bitmap_ind16 m_sprite_bitmap;
void mix_sprite_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri);
void audio_map(address_map &map);
void main_map(address_map &map);
};
// video
void galspnbl_state::palette(palette_device &palette) const
{
// initialize 555 RGB lookup
for (int i = 0; i < 32768; i++)
palette.set_pen_color(i + 1024, pal5bit(i >> 5), pal5bit(i >> 10), pal5bit(i >> 0));
}
void galspnbl_state::draw_background(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
// int const screenscroll = 4 - (m_scroll[0] & 0xff);
for (offs_t offs = 0; offs < 0x20000; offs++)
{
m_soundlatch->write(data & 0xff);
m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
int const y = offs >> 9;
int const x = offs & 0x1ff;
bitmap.pix(y, x) = 1024 + (m_bgvideoram[offs] >> 1);
}
}
void galspnbl_state::video_start()
{
// allocate bitmaps
m_screen->register_screen_bitmap(m_sprite_bitmap);
}
void galspnbl_state::mix_sprite_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri)
{
for (int y = cliprect.top(); y <= cliprect.bottom(); y++)
{
uint16_t *const dd = &bitmap.pix(y);
uint16_t const *const sd2 = &m_sprite_bitmap.pix(y);
for (int x = cliprect.left(); x <= cliprect.right(); x++)
{
uint16_t sprpixel = (sd2[x]);
//uint16_t const sprpri = (sprpixel >> 8) & 3;
uint16_t const sprpri = (sprpixel >> 9) & 1; // only upper priority bit matters on the bootleg hw?
sprpixel &= 0xff;
if (sprpixel & 0xf)
{
if (sprpri == pri)
dd[x] = sprpixel;
}
// uint16_t sprbln = (sprpixel >> 10) & 1; // we handle 'blending' from the original as a simple on/off flicker in the bootleg sprite function, I don't think the bootleg hw can blend
}
}
}
uint32_t galspnbl_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_sprite_bitmap.fill(0, cliprect);
m_sprgen->gaiden_draw_sprites(screen, m_gfxdecode->gfx(1), cliprect, m_spriteram, 0, 0, flip_screen(), m_sprite_bitmap);
draw_background(bitmap, cliprect);
mix_sprite_layer(screen, bitmap, cliprect, 0);
for (int offs = 0; offs < 0x1000 / 2; offs++)
{
int const code = m_videoram[offs];
int const attr = m_colorram[offs];
int const color = (attr & 0x00f0) >> 4;
int const sx = offs % 64;
int const sy = offs / 64;
// What is this? A priority/half transparency marker? */ // leftover blend flags from original spbactn game
if (!(attr & 0x0008))
{
m_gfxdecode->gfx(0)->transpen(bitmap, cliprect,
code,
color,
0, 0,
// 16 * sx + screenscroll, 8 * sy,
16 * sx, 8 * sy, 0);
}
}
mix_sprite_layer(screen, bitmap, cliprect, 1);
return 0;
}
// machine
void galspnbl_state::soundcommand_w(offs_t offset, uint8_t data)
{
m_soundlatch->write(data);
m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
void galspnbl_state::main_map(address_map &map)
{
map(0x000000, 0x3fffff).rom();
map(0x700000, 0x703fff).ram(); /* galspnbl work RAM */
map(0x708000, 0x70ffff).ram(); /* galspnbl work RAM, bitmaps are decompressed here */
map(0x800000, 0x803fff).ram(); /* hotpinbl work RAM */
map(0x808000, 0x80ffff).ram(); /* hotpinbl work RAM, bitmaps are decompressed here */
map(0x880000, 0x880fff).ram().share("spriteram");
map(0x8ff400, 0x8fffff).nopw(); /* ??? */
map(0x900000, 0x900fff).ram().share("colorram");
map(0x901000, 0x903fff).nopw(); /* ??? */
map(0x904000, 0x904fff).ram().share("videoram");
map(0x905000, 0x907fff).nopw(); /* ??? */
map(0x980000, 0x9bffff).ram().share("bgvideoram");
map(0xa00000, 0xa00fff).nopw(); /* more palette ? */
map(0x700000, 0x703fff).ram(); // galspnbl work RAM
map(0x708000, 0x70ffff).ram(); // galspnbl work RAM, bitmaps are decompressed here
map(0x800000, 0x803fff).ram(); // hotpinbl work RAM
map(0x808000, 0x80ffff).ram(); // hotpinbl work RAM, bitmaps are decompressed here
map(0x880000, 0x880fff).ram().share(m_spriteram);
map(0x8ff400, 0x8fffff).nopw(); // ???
map(0x900000, 0x900fff).ram().share(m_colorram);
map(0x901000, 0x903fff).nopw(); // ???
map(0x904000, 0x904fff).ram().share(m_videoram);
map(0x905000, 0x907fff).nopw(); // ???
map(0x980000, 0x9bffff).ram().share(m_bgvideoram);
map(0xa00000, 0xa00fff).nopw(); // more palette ?
map(0xa01000, 0xa017ff).w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0xa01800, 0xa027ff).nopw(); /* more palette ? */
map(0xa01800, 0xa027ff).nopw(); // more palette ?
map(0xa80000, 0xa80001).portr("IN0");
map(0xa80010, 0xa80011).portr("IN1").w(FUNC(galspnbl_state::soundcommand_w));
map(0xa80020, 0xa80021).portr("SYSTEM").nopw(); /* w - could be watchdog, but causes resets when picture is shown */
map(0xa80030, 0xa80031).portr("DSW1").nopw(); /* w - irq ack? */
map(0xa80010, 0xa80011).portr("IN1");
map(0xa80011, 0xa80011).w(FUNC(galspnbl_state::soundcommand_w));
map(0xa80020, 0xa80021).portr("SYSTEM").nopw(); // w - could be watchdog, but causes resets when picture is shown
map(0xa80030, 0xa80031).portr("DSW1").nopw(); // w - irq ack?
map(0xa80040, 0xa80041).portr("DSW2");
map(0xa80050, 0xa80051).writeonly().share("scroll"); /* ??? */
map(0xa80050, 0xa80051).writeonly().share(m_scroll); // ???
}
void galspnbl_state::audio_map(address_map &map)
@ -101,20 +257,20 @@ void galspnbl_state::audio_map(address_map &map)
map(0xf000, 0xf7ff).ram();
map(0xf800, 0xf800).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0xf810, 0xf811).w("ymsnd", FUNC(ym3812_device::write));
map(0xfc00, 0xfc00).noprw(); /* irq ack ?? */
map(0xfc00, 0xfc00).noprw(); // irq ack ??
map(0xfc20, 0xfc20).r(m_soundlatch, FUNC(generic_latch_8_device::read));
}
static INPUT_PORTS_START( galspnbl )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* tested at 0x0016c6 - doesn't seem tilt related */
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* tested at 0x0016d2 - doesn't seem tilt related */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) // tested at 0x0016c6 - doesn't seem tilt related
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) // tested at 0x0016d2 - doesn't seem tilt related
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Left Flippers" )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME( "Launch Ball / Shake (Left Side)" )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* uncalled (?) code at 0x007ed2 ('hotpinbl') or 0x008106 ('galspnbl') */
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // uncalled (?) code at 0x007ed2 ('hotpinbl') or 0x008106 ('galspnbl')
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("IN1")
@ -124,21 +280,21 @@ static INPUT_PORTS_START( galspnbl )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME( "Launch Ball / Shake (Right Side)" )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Right Flippers" )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* uncalled (?) code at 0x007e90 ('hotpinbl') or 0x0080c4 ('galspnbl') */
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // uncalled (?) code at 0x007e90 ('hotpinbl') or 0x0080c4 ('galspnbl')
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME( "Start" ) /* needed to avoid confusion with # of players. Press mulitple times for multiple players */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME( "Start" ) // needed to avoid confusion with # of players. Press multiple times for multiple players
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("DSW1") /* 0x700018.b */
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2") /* see code at 0x0085c6 ('hotpinbl') or 0x008994 ('galspnbl') */
PORT_START("DSW1") // 0x700018.b
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2") // see code at 0x0085c6 ('hotpinbl') or 0x008994 ('galspnbl')
PORT_DIPSETTING( 0x02, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x03, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x01, DEF_STR( Hard ) )
@ -151,7 +307,7 @@ static INPUT_PORTS_START( galspnbl )
PORT_DIPNAME( 0x10, 0x10, "Hit Difficulty" ) PORT_DIPLOCATION("SW2:5")
PORT_DIPSETTING( 0x10, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x00, DEF_STR( Hard ) )
PORT_DIPNAME( 0x20, 0x20, "Slide Show" ) PORT_DIPLOCATION("SW2:6") /* Listed as unused on manuals for both games */
PORT_DIPNAME( 0x20, 0x20, "Slide Show" ) PORT_DIPLOCATION("SW2:6") // Listed as unused on manuals for both games
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:7")
@ -159,7 +315,7 @@ static INPUT_PORTS_START( galspnbl )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW2:8" )
PORT_START("DSW2") /* 0x700019.b */
PORT_START("DSW2") // 0x700019.b
PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3")
PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x03, DEF_STR( 3C_1C ) )
@ -218,51 +374,47 @@ static const gfx_layout spritelayout =
};
static GFXDECODE_START( gfx_galspnbl )
GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 512, 16 )
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 0, 16 )
GFXDECODE_ENTRY( "tiles", 0, tilelayout, 512, 16 )
GFXDECODE_ENTRY( "sprites", 0, spritelayout, 0, 16 )
GFXDECODE_END
void galspnbl_state::machine_start()
{
}
void galspnbl_state::galspnbl(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(22'118'400)/2); /* 11.0592 MHz??? - NEEDS VERIFICATION!! */
// basic machine hardware
M68000(config, m_maincpu, XTAL(22'118'400) / 2); // 11.0592 MHz??? - NEEDS VERIFICATION!!
m_maincpu->set_addrmap(AS_PROGRAM, &galspnbl_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(galspnbl_state::irq3_line_hold)); /* also has vector for 6, but it does nothing */
m_maincpu->set_vblank_int("screen", FUNC(galspnbl_state::irq3_line_hold)); // also has vector for 6, but it does nothing
Z80(config, m_audiocpu, XTAL(4'000'000)); /* 4 MHz ??? - Use value from Tecmo's Super Pinball Action - NEEDS VERIFICATION!! */
m_audiocpu->set_addrmap(AS_PROGRAM, &galspnbl_state::audio_map); /* NMI is caused by the main CPU */
Z80(config, m_audiocpu, XTAL(4'000'000)); // 4 MHz ??? - Use value from Tecmo's Super Pinball Action - NEEDS VERIFICATION!!
m_audiocpu->set_addrmap(AS_PROGRAM, &galspnbl_state::audio_map); // NMI is caused by the main CPU
/* video hardware */
// video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(512, 256);
m_screen->set_visarea(0, 512-1, 16, 240-1);
m_screen->set_screen_update(FUNC(galspnbl_state::screen_update_galspnbl));
m_screen->set_screen_update(FUNC(galspnbl_state::screen_update));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_galspnbl);
PALETTE(config, m_palette, FUNC(galspnbl_state::galspnbl_palette)).set_format(palette_device::xBGR_444, 1024 + 32768);
PALETTE(config, m_palette, FUNC(galspnbl_state::palette)).set_format(palette_device::xBGR_444, 1024 + 32768);
TECMO_SPRITE(config, m_sprgen, 0);
m_sprgen->set_bootleg(true);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(4'000'000))); /* Use value from Super Pinball Action - NEEDS VERIFICATION!! */
ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(4'000'000))); // Use value from Super Pinball Action - NEEDS VERIFICATION!!
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
/* Use value from Super Pinball Action - clock frequency & pin 7 not verified */
okim6295_device &oki(OKIM6295(config, "oki", XTAL(4'000'000)/4, okim6295_device::PIN7_HIGH));
// Use value from Super Pinball Action - clock frequency & pin 7 not verified
okim6295_device &oki(OKIM6295(config, "oki", XTAL(4'000'000) / 4, okim6295_device::PIN7_HIGH));
oki.add_route(ALL_OUTPUTS, "mono", 0.50);
}
@ -274,7 +426,7 @@ void galspnbl_state::galspnbl(machine_config &config)
***************************************************************************/
ROM_START( galspnbl )
ROM_REGION( 0x400000, "maincpu", 0 ) /* 68000 code */
ROM_REGION( 0x400000, "maincpu", 0 ) // 68000
ROM_LOAD16_BYTE( "7.rom", 0x000000, 0x80000, CRC(ce0189bf) SHA1(06d8cc6f5b819fe2ca536ce553db6986547a15ba) )
ROM_LOAD16_BYTE( "3.rom", 0x000001, 0x80000, CRC(9b0a8744) SHA1(ac80f22b8b2f4c559c225bf203af698bf59699e7) )
ROM_LOAD16_BYTE( "8.rom", 0x100000, 0x80000, CRC(eee2f087) SHA1(37285ae7b49c9d20ad92b3971db89ba593975154) )
@ -284,23 +436,23 @@ ROM_START( galspnbl )
ROM_LOAD16_BYTE( "10.rom", 0x300000, 0x80000, CRC(3a20e1e5) SHA1(850be621547bc9c7519055211392f2684e440462) )
ROM_LOAD16_BYTE( "6.rom", 0x300001, 0x80000, CRC(94927d20) SHA1(0ea1a179956ad9a93a99cccec92f0490044ad1d3) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code */
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80
ROM_LOAD( "2.rom", 0x0000, 0x10000, CRC(fae688a7) SHA1(e1ef7abd18f6a820d1a7f0ceb9a9b1a2c7de41f0) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD( "17.rom", 0x00000, 0x40000, CRC(7d435701) SHA1(f6a2241c95f101d09b18f550689d125abd3ea9c4) )
ROM_LOAD( "18.rom", 0x40000, 0x40000, CRC(136adaac) SHA1(5f5e70a66d256cad9fcdbc5a7fff035f9a3279b9) )
ROM_REGION( 0x40000, "gfx2", 0 )
ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "15.rom", 0x00000, 0x20000, CRC(4beb840d) SHA1(351cd8da361a55794595d2cf7b0fed9233d0a5a0) )
ROM_LOAD( "16.rom", 0x20000, 0x20000, CRC(93d3c610) SHA1(0cf1f311ec2646a436c37e121634731646c06437) )
ROM_REGION( 0x40000, "oki", 0 ) /* OKIM6295 samples */
ROM_REGION( 0x40000, "oki", 0 ) // samples
ROM_LOAD( "1.rom", 0x00000, 0x40000, CRC(93c06d3d) SHA1(8620d274ca7824e7e72a1ad1da3eaa804d550653) )
ROM_END
ROM_START( hotpinbl ) // PCB silkscreened COMAD INDUSTRY CO.,LTD 950804 MADE IN KOREA
ROM_REGION( 0x400000, "maincpu", 0 ) /* 68000 code */
ROM_REGION( 0x400000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "hp_07.bin", 0x000000, 0x80000, CRC(978cc13e) SHA1(0060aaf7259fdeeacb07e9ced01bdf69c27bdfb6) )
ROM_LOAD16_BYTE( "hp_03.bin", 0x000001, 0x80000, CRC(68388726) SHA1(d8dca9050403be70097a0f833ba189bd2fa87e80) )
ROM_LOAD16_BYTE( "hp_08.bin", 0x100000, 0x80000, CRC(bd16be12) SHA1(36e64705efba8ecdc96a62f55d68e959022fb98f) )
@ -310,21 +462,23 @@ ROM_START( hotpinbl ) // PCB silkscreened COMAD INDUSTRY CO.,LTD 950804 MADE IN
ROM_LOAD16_BYTE( "hp_10.bin", 0x300000, 0x80000, CRC(a5c63e34) SHA1(de27cfe20e09e8c13ee28d6eb42bfab1ebe33149) )
ROM_LOAD16_BYTE( "hp_06.bin", 0x300001, 0x80000, CRC(513eda91) SHA1(14a43c00ad1f55bff525a14cd53913dd78e80f0c) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code */
ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80
ROM_LOAD( "hp_02.bin", 0x0000, 0x10000, CRC(82698269) SHA1(5e27e89f1bdd7c3793d40867c50981f5fac0a7fb) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD( "hp_13.bin", 0x00000, 0x40000, CRC(d53b64b9) SHA1(347b6ec908e23f848e98eed46fb34b49b728556b) )
ROM_LOAD( "hp_14.bin", 0x40000, 0x40000, CRC(2fe3fcee) SHA1(29f96aa3dded6cb0b2fe3d9507fb5638e9778ef3) )
ROM_REGION( 0x40000, "gfx2", 0 )
ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "hp_11.bin", 0x00000, 0x20000, CRC(deecd7f1) SHA1(752c944d941bfe8f21d32881f32676999ebc5a7f) )
ROM_LOAD( "hp_12.bin", 0x20000, 0x20000, CRC(5fd603c2) SHA1(864686cd1ba5beb6cebfd394b60620106c929abd) )
ROM_REGION( 0x40000, "oki", 0 ) /* OKIM6295 samples */
ROM_REGION( 0x40000, "oki", 0 ) // samples
ROM_LOAD( "hp_01.bin", 0x00000, 0x40000, CRC(93c06d3d) SHA1(8620d274ca7824e7e72a1ad1da3eaa804d550653) )
ROM_END
} // anonymous namespace
GAME( 1995, hotpinbl, 0, galspnbl, hotpinbl, galspnbl_state, empty_init, ROT90, "Comad & New Japan System", "Hot Pinball", MACHINE_SUPPORTS_SAVE )
GAME( 1996, galspnbl, 0, galspnbl, galspnbl, galspnbl_state, empty_init, ROT90, "Comad", "Gals Pinball", MACHINE_SUPPORTS_SAVE )
GAME( 1995, hotpinbl, 0, galspnbl, hotpinbl, galspnbl_state, empty_init, ROT90, "Comad & New Japan System", "Hot Pinball", MACHINE_SUPPORTS_SAVE )
GAME( 1996, galspnbl, 0, galspnbl, galspnbl, galspnbl_state, empty_init, ROT90, "Comad", "Gals Pinball", MACHINE_SUPPORTS_SAVE )

View File

@ -1,76 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
/*************************************************************************
Hot Pinball
Gals Pinball
*************************************************************************/
#ifndef MAME_INCLUDES_GALSPNBL_H
#define MAME_INCLUDES_GALSPNBL_H
#pragma once
#include "tecmo_spr.h"
#include "machine/gen_latch.h"
#include "emupal.h"
#include "screen.h"
class galspnbl_state : public driver_device
{
public:
galspnbl_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_spriteram(*this, "spriteram"),
m_colorram(*this, "colorram"),
m_videoram(*this, "videoram"),
m_bgvideoram(*this, "bgvideoram"),
m_scroll(*this, "scroll"),
m_audiocpu(*this, "audiocpu"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_sprgen(*this, "spritegen"),
m_screen(*this, "screen"),
m_soundlatch(*this, "soundlatch")
{ }
void galspnbl(machine_config &config);
protected:
virtual void video_start() override;
private:
/* memory pointers */
required_shared_ptr<uint16_t> m_spriteram;
required_shared_ptr<uint16_t> m_colorram;
required_shared_ptr<uint16_t> m_videoram;
required_shared_ptr<uint16_t> m_bgvideoram;
required_shared_ptr<uint16_t> m_scroll;
/* devices */
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<tecmo_spr_device> m_sprgen;
required_device<screen_device> m_screen;
required_device<generic_latch_8_device> m_soundlatch;
void soundcommand_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
virtual void machine_start() override;
void galspnbl_palette(palette_device &palette) const;
uint32_t screen_update_galspnbl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_background( bitmap_ind16 &bitmap, const rectangle &cliprect );
bitmap_ind16 m_sprite_bitmap;
void mix_sprite_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri);
void audio_map(address_map &map);
void main_map(address_map &map);
};
#endif // MAME_INCLUDES_GALSPNBL_H

View File

@ -1,98 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
#include "emu.h"
#include "galspnbl.h"
void galspnbl_state::galspnbl_palette(palette_device &palette) const
{
// initialize 555 RGB lookup
for (int i = 0; i < 32768; i++)
palette.set_pen_color(i + 1024, pal5bit(i >> 5), pal5bit(i >> 10), pal5bit(i >> 0));
}
void galspnbl_state::draw_background( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
// int const screenscroll = 4 - (m_scroll[0] & 0xff);
for (offs_t offs = 0; offs < 0x20000; offs++)
{
int const y = offs >> 9;
int const x = offs & 0x1ff;
bitmap.pix(y, x) = 1024 + (m_bgvideoram[offs] >> 1);
}
}
void galspnbl_state::video_start()
{
/* allocate bitmaps */
m_screen->register_screen_bitmap(m_sprite_bitmap);
}
void galspnbl_state::mix_sprite_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri)
{
for (int y = cliprect.top(); y <= cliprect.bottom(); y++)
{
uint16_t *const dd = &bitmap.pix(y);
uint16_t const *const sd2 = &m_sprite_bitmap.pix(y);
for (int x = cliprect.left(); x <= cliprect.right(); x++)
{
uint16_t sprpixel = (sd2[x]);
//uint16_t sprpri = (sprpixel >> 8) & 3;
uint16_t sprpri = (sprpixel >> 9) & 1; // only upper priority bit matters on the bootleg hw?
sprpixel &= 0xff;
if (sprpixel & 0xf)
{
if (sprpri == pri)
dd[x] = sprpixel;
}
// uint16_t sprbln = (sprpixel >> 10) & 1; // we handle 'blending' from the original as a simple on/off flicker in the bootleg sprite function, I don't think the bootleg hw can blend
}
}
}
uint32_t galspnbl_state::screen_update_galspnbl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int offs;
m_sprite_bitmap.fill(0, cliprect);
m_sprgen->gaiden_draw_sprites(screen, m_gfxdecode->gfx(1), cliprect, m_spriteram, 0, 0, flip_screen(), m_sprite_bitmap);
draw_background(bitmap, cliprect);
mix_sprite_layer(screen, bitmap, cliprect, 0);
for (offs = 0; offs < 0x1000 / 2; offs++)
{
int sx, sy, code, attr, color;
code = m_videoram[offs];
attr = m_colorram[offs];
color = (attr & 0x00f0) >> 4;
sx = offs % 64;
sy = offs / 64;
/* What is this? A priority/half transparency marker? */ // leftover blend flags from original spbactn game
if (!(attr & 0x0008))
{
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
code,
color,
0,0,
// 16*sx + screenscroll,8*sy,
16*sx,8*sy,0);
}
}
mix_sprite_layer(screen, bitmap, cliprect, 1);
return 0;
}

View File

@ -1,5 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Brad Oliver
// copyright-holders: Brad Oliver
/*********************************************************************************
Zero Zone memory map
@ -31,15 +32,112 @@
#include "emu.h"
#include "zerozone.h"
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "sound/okim6295.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
namespace {
class zerozone_state : public driver_device
{
public:
zerozone_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_soundlatch(*this, "soundlatch")
, m_gfxdecode(*this, "gfxdecode")
, m_vram(*this, "videoram")
{ }
void zerozone(machine_config &config);
protected:
// driver_device overrides
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
private:
// devices
required_device<cpu_device> m_maincpu;
required_device<z80_device> m_audiocpu;
required_device<generic_latch_8_device> m_soundlatch;
required_device<gfxdecode_device> m_gfxdecode;
// shared pointers
required_shared_ptr<uint16_t> m_vram;
// video-related
uint8_t m_tilebank = 0;
tilemap_t *m_tilemap = nullptr;
void sound_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(vblank_w);
void tilemap_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void tilebank_w(uint8_t data);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void main_map(address_map &map);
void sound_map(address_map &map);
TILE_GET_INFO_MEMBER(get_tile_info);
};
// video
void zerozone_state::tilemap_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_vram[offset]);
m_tilemap->mark_tile_dirty(offset);
}
void zerozone_state::tilebank_w(uint8_t data)
{
m_tilebank = data & 0x07;
m_tilemap->mark_all_dirty();
}
TILE_GET_INFO_MEMBER(zerozone_state::get_tile_info)
{
int tileno = m_vram[tile_index] & 0x07ff;
int const colour = m_vram[tile_index] & 0xf000;
if (m_vram[tile_index] & 0x0800)
tileno += m_tilebank * 0x800;
tileinfo.set(0, tileno, colour >> 12, 0);
}
void zerozone_state::video_start()
{
// I'm not 100% sure it should be opaque, pink title screen looks strange in Las Vegas Girls
// but if it's transparent other things look incorrect
m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(zerozone_state::get_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 64, 32);
}
uint32_t zerozone_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_tilemap->draw(screen, bitmap, cliprect);
return 0;
}
// machine
void zerozone_state::sound_w(uint8_t data)
{
m_soundlatch->write(data);
@ -141,20 +239,8 @@ static INPUT_PORTS_START( zerozone )
INPUT_PORTS_END
static const gfx_layout charlayout =
{
8,8, // 8*8 characters
RGN_FRAC(1,1), // 4096 characters
4, // 4 bits per pixel
{ 0, 1, 2, 3 },
{ 0, 4, 8+0, 8+4, 16+0, 16+4, 24+0, 24+4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8 // every sprite takes 32 consecutive bytes
};
static GFXDECODE_START( gfx_zerozone )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 256 ) // sprites & playfield
GFXDECODE_ENTRY( "gfx", 0, gfx_8x8x4_packed_msb, 0, 256 ) // sprites & playfield
GFXDECODE_END
@ -205,7 +291,7 @@ void zerozone_state::zerozone(machine_config &config)
GENERIC_LATCH_8(config, m_soundlatch);
okim6295_device &oki(OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
okim6295_device &oki(OKIM6295(config, "oki", 1'056'000, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
oki.add_route(ALL_OUTPUTS, "mono", 1.0);
}
@ -218,14 +304,14 @@ void zerozone_state::zerozone(machine_config &config)
***************************************************************************/
ROM_START( zerozone ) // PCB 'COMAD MADE IN KOREA 93 EDIT00', sticker 'COMAD-078'
ROM_REGION( 0x20000, "maincpu", 0 ) // 128k for 68000 code
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000
ROM_LOAD16_BYTE( "zz-4.rom", 0x0000, 0x10000, CRC(83718b9b) SHA1(b3fc6da5816142b9c92a7b8615eb5bcb2c78ea46) )
ROM_LOAD16_BYTE( "zz-5.rom", 0x0001, 0x10000, CRC(18557f41) SHA1(6ef908732b7775c1ea2b33f799635075db5756de) )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "zz-1.rom", 0x00000, 0x08000, CRC(223ccce5) SHA1(3aa25ca914960b929dc853d07a958ed874e42fee) )
ROM_REGION( 0x080000, "gfx1", 0 )
ROM_REGION( 0x080000, "gfx", 0 )
ROM_LOAD( "zz-6.rom", 0x00000, 0x80000, CRC(c8b906b9) SHA1(1775d69df6397d6772b20c65751d44556d76c033) )
ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples
@ -234,14 +320,14 @@ ROM_START( zerozone ) // PCB 'COMAD MADE IN KOREA 93 EDIT00', sticker 'COMAD-078
ROM_END
ROM_START( lvgirl94 ) // PCB 'COMAD MADE IN KOREA 93 EDIT00', sticker 'COMAD-078'
ROM_REGION( 0x20000, "maincpu", 0 ) // 128k for 68000 code
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000
ROM_LOAD16_BYTE( "rom4", 0x0000, 0x10000, CRC(c4fb449e) SHA1(dd1c567ba2cf951267dd622e2e9af265e742f246) )
ROM_LOAD16_BYTE( "rom5", 0x0001, 0x10000, CRC(5d446a1a) SHA1(2d7ea25e5b86e7cf4eb7f10daa1eaaaed6830a53) )
ROM_REGION( 0x080000, "gfx1", 0 )
ROM_REGION( 0x080000, "gfx", 0 )
ROM_LOAD( "rom6", 0x00000, 0x40000, CRC(eeeb94ba) SHA1(9da09312c090ef2d40f596247d9a7decf3724e54) )
// sound roms are the same as zerozone
// sound ROMs are the same as zerozone
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "rom1", 0x00000, 0x08000, CRC(223ccce5) SHA1(3aa25ca914960b929dc853d07a958ed874e42fee) )
@ -250,6 +336,8 @@ ROM_START( lvgirl94 ) // PCB 'COMAD MADE IN KOREA 93 EDIT00', sticker 'COMAD-078
ROM_LOAD( "rom3", 0x20000, 0x20000, CRC(e348ff5e) SHA1(6d2755d9b31366f4c2ddd296790234deb8f821c8) )
ROM_END
} // anonymous namespace
GAME( 1993, zerozone, 0, zerozone, zerozone, zerozone_state, empty_init, ROT0, "Comad", "Zero Zone", MACHINE_SUPPORTS_SAVE )
GAME( 1994, lvgirl94, 0, zerozone, zerozone, zerozone_state, empty_init, ROT0, "Comad", "Las Vegas Girl (Girl '94)", MACHINE_SUPPORTS_SAVE )

View File

@ -1,69 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Brad Oliver
/*************************************************************************
Zero Zone
*************************************************************************/
#ifndef MAME_INCLUDES_ZEROZONE_H
#define MAME_INCLUDES_ZEROZONE_H
#pragma once
#include "machine/gen_latch.h"
#include "cpu/z80/z80.h"
#include "tilemap.h"
class zerozone_state : public driver_device
{
public:
zerozone_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_soundlatch(*this, "soundlatch")
, m_vram(*this, "videoram")
, m_gfxdecode(*this, "gfxdecode")
{ }
void zerozone(machine_config &config);
protected:
// driver_device overrides
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
private:
// in drivers/zerozone.cpp
void sound_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(vblank_w);
// in video/zerozone.cpp
void tilemap_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void tilebank_w(uint8_t data);
// devices
required_device<cpu_device> m_maincpu;
required_device<z80_device> m_audiocpu;
required_device<generic_latch_8_device> m_soundlatch;
// shared pointers
required_shared_ptr<uint16_t> m_vram;
// currently this driver uses generic palette handling
required_device<gfxdecode_device> m_gfxdecode;
// video-related
uint8_t m_tilebank = 0;
tilemap_t *m_zz_tilemap = nullptr;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void main_map(address_map &map);
void sound_map(address_map &map);
TILE_GET_INFO_MEMBER(get_zerozone_tile_info);
};
#endif // MAME_INCLUDES_ZEROZONE_H

View File

@ -1,48 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Brad Oliver
/***************************************************************************
video/zerozone.cpp
***************************************************************************/
#include "emu.h"
#include "zerozone.h"
void zerozone_state::tilemap_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_vram[offset]);
m_zz_tilemap->mark_tile_dirty(offset);
}
void zerozone_state::tilebank_w(uint8_t data)
{
// popmessage ("Data %04x",data);
m_tilebank = data & 0x07;
m_zz_tilemap->mark_all_dirty();
}
TILE_GET_INFO_MEMBER(zerozone_state::get_zerozone_tile_info)
{
int tileno = m_vram[tile_index] & 0x07ff;
int colour = m_vram[tile_index] & 0xf000;
if (m_vram[tile_index] & 0x0800)
tileno += m_tilebank * 0x800;
tileinfo.set(0, tileno, colour >> 12, 0);
}
void zerozone_state::video_start()
{
// I'm not 100% sure it should be opaque, pink title screen looks strange in Las Vegas Girls
// but if it's transparent other things look incorrect
m_zz_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(zerozone_state::get_zerozone_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 64, 32);
}
uint32_t zerozone_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_zz_tilemap->draw(screen, bitmap, cliprect);
return 0;
}

View File

@ -11870,11 +11870,14 @@ ROM_START( cmfb55 ) // uses same GFX as pkrmast
ROM_REGION( 0x10000, "user1", 0 )
ROM_LOAD( "c.m.89-005-8.j6", 0x0000, 0x10000, CRC(e92443d3) SHA1(4b6ca4521841610054165f085ae05510e77af191) )
ROM_REGION( 0x10000, "proms", 0 )
ROM_REGION( 0x10000, "palette_rom", 0 )
ROM_LOAD( "cherry master n-5.n5", 0x00000, 0x10000, CRC(2ae7f151) SHA1(b41ec09fddf51895dfcca461d9b0ddb1cdb72506) ) // this uses a big ROM containing the data for the usual PROMs
ROM_REGION( 0x200, "proms", ROMREGION_ERASE00 )
// filled at init from the "palette_rom" region
ROM_REGION( 0x100, "proms2", 0 )
ROM_COPY( "proms", 0x1000, 0x0000, 0x0100 )
ROM_COPY( "palette_rom", 0x1000, 0x0000, 0x0100 )
ROM_END
// the program roms on these are scrambled
@ -18929,6 +18932,21 @@ void cmaster_state::init_ll3() // verified with ICE dump
}
}
void cmaster_state::init_cmfb55()
{
// palette is in a ROM with different format, adapt to what MAME expects
uint8_t *palette_rom = memregion("palette_rom")->base();
uint8_t *proms = memregion("proms")->base();
for (int i = 0x000; i < 0x100; i++)
{
proms[i] = palette_rom[i] & 0x0f;
proms[i + 0x100] = (palette_rom[i] & 0xf0) >> 4;
}
m_palette->update();
}
void goldstar_state::init_cmast91()
{
uint8_t *rom = memregion("maincpu")->base();
@ -19920,7 +19938,7 @@ GAMEL( 1991, cmasterk, cmaster, cm, cmasterb, cmaster_state, init_cmv4,
GAMEL( 199?, super7, cmaster, super7, cmaster, cmaster_state, init_super7, ROT0, "bootleg", "Super Seven", MACHINE_NOT_WORKING, layout_cmasterb ) // bad palette, no reels, decryption might be missing something, too
GAME ( 199?, wcat3a, wcat3, chryangl, cmaster, cmaster_state, init_wcat3a, ROT0, "E.A.I.", "Wild Cat 3 (CMV4 hardware)", MACHINE_NOT_WORKING ) // does not boot. Wrong decryption, wrong machine or wrong what?
GAMEL( 199?, ll3, cmaster, cm, cmasterb, cmaster_state, init_ll3, ROT0, "bootleg", "Lucky Line III", MACHINE_NOT_WORKING, layout_cmasterb ) // not looked at yet
GAMEL( 199?, cmfb55, cmaster, cmfb55, cmaster, cmaster_state, empty_init, ROT0, "bootleg", "Cherry Master (bootleg, Game FB55 Ver.2)", MACHINE_NOT_WORKING, layout_cmv4 ) // wrong palette, inputs not done
GAMEL( 199?, cmfb55, cmaster, cmfb55, cmaster, cmaster_state, init_cmfb55, ROT0, "bootleg", "Cherry Master (bootleg, Game FB55 Ver.2)", MACHINE_NOT_WORKING, layout_cmv4 ) // inputs not done
GAMEL( 1991, srmagic, cmv4, cm, cmv4, cmaster_state, empty_init, ROT0, "bootleg", "Super Real Magic (V6.3)", MACHINE_NOT_WORKING, layout_cmv4 ) // needs correct I/O
GAMEL( 1991, tonypok, 0, cm, tonypok, cmaster_state, init_tonypok, ROT0, "Corsica", "Poker Master (Tony-Poker V3.A, hack?)", 0 , layout_tonypok )

View File

@ -195,6 +195,7 @@ public:
void init_cmtetrisc();
void init_cmtetrisd();
void init_ll3();
void init_cmfb55();
uint32_t screen_update_amcoe1a(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);

View File

@ -137,7 +137,7 @@ However, this is effective ONLY if 7 other DSWB (I-O) are OFF !
I add the 32 combinations for coinage.
As I don't know what is the default value for timer speed, and I don't want to write
the 64 combinaisons, I only put some values ... Feel free to add the other ones ...
the 64 combinations, I only put some values ... Feel free to add the other ones ...
DSW A DSW B
HGFEDCBA PONMLKJI coin A coin B

View File

@ -144,7 +144,7 @@ Stephh's notes (based on the games M6502 code and some tests) :
ON OFF OFF 1C_2C
ON ON OFF 1C_6C
The 3 other combinaisons give 1C_1C
The 3 other combinations give 1C_1C
- From the manual, it says that DSW bit 6 determines the cost of a game :
* bit 6 = 0 : "25c / game"
* bit 6 = 1 : "50c / game"

View File

@ -448,7 +448,7 @@ Stephh's notes (based on the games Z80 code and some tests) :
* ......1. : No
Notice screen displays "Korea" instead of "Japan".
- Copyright relies on bits 2 and 3 of the region (code at 0x276d),
but table at 0x2781 is the same for any combinaison :
but table at 0x2781 is the same for any combination :
* ....??.. : "NICS CO. LTD. 1992" / "ALL RIGHTS RESERVED"