summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/sigmab98.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/sigmab98.cpp')
-rw-r--r--src/mame/drivers/sigmab98.cpp560
1 files changed, 491 insertions, 69 deletions
diff --git a/src/mame/drivers/sigmab98.cpp b/src/mame/drivers/sigmab98.cpp
index 302bf2f28cd..9e1a8d983fe 100644
--- a/src/mame/drivers/sigmab98.cpp
+++ b/src/mame/drivers/sigmab98.cpp
@@ -7,9 +7,9 @@
driver by Luca Elia
CPU : TAXAN KY-80 (Yamaha)
-Video : TAXAN KY-3211
-Sound : YMZ280B
-NVRAM : 93C46, Battery
+Video : TAXAN KY-3211 or KY-10510
+Sound : YMZ280B or OKI M9811
+NVRAM : 93C46 and/or battery backed RAM
Graphics are made of sprites only.
Each sprite is composed of X x Y tiles and can be zoomed / shrunk and rotated.
@@ -21,16 +21,18 @@ https://www.youtube.com/channel/UCYFiPd3FukrmNJa3pfIKf-Q/search?query=sammy
https://www.youtube.com/user/analysis08/search?query=sammy
http://www.nicozon.net/watch/sm14334996
-Dumped games:
+Dumped games: ROMs: Video:
-1997 Minna Atsumare! Dodge Hero b9802 https://youtu.be/2eXDQnKCT6A
-1997 Itazura Daisuki! Sushimaru Kun b9803 https://youtu.be/nhvbZ71KWr8
-1997 GeGeGe no Kitarou Youkai Slot b9804
-1997 Burning Sanrinsya b9805
-1997 PEPSI Man b9806 https://youtu.be/p3cbZ67m4lo
-1998 Transformers Beast Wars II b9808
-1997 Uchuu Tokkyuu Medalian b9809 https://youtu.be/u813kBOZbwI
-2000 Minna Ganbare! Dash Hero b9811
+1997 Minna Atsumare! Dodge Hero B9802 https://youtu.be/2eXDQnKCT6A
+1997 Itazura Daisuki! Sushimaru Kun B9803 https://youtu.be/nhvbZ71KWr8
+1997 GeGeGe no Kitarou Youkai Slot B9804
+1997 Burning Sanrinsya B9805
+1997 PEPSI Man B9806 https://youtu.be/p3cbZ67m4lo
+1998 Transformers Beast Wars II B9808
+1997 Uchuu Tokkyuu Medalian B9809 https://youtu.be/u813kBOZbwI
+2000 Minna Ganbare! Dash Hero B9811
+
+2001 Otakara Itadaki Luffy Kaizoku-Dan! KA108 https://youtu.be/D_4bWx3tTPw
--------------------------------------------------------------------------------------
@@ -39,7 +41,7 @@ Sammy Kids Medal Series
CPU : Kawasaki KL5C80A120FP (Z80 Compatible High Speed Microcontroller)
Video : TAXAN KY-3211
Sound : OKI M9810B
-NVRAM : 93C46, Battery
+NVRAM : 93C46 and battery backed RAM
Cartridge based system. Carts contain just some 16Mb flash eeproms.
@@ -112,7 +114,9 @@ Notes:
#include "emu.h"
#include "cpu/z80/z80.h"
+#include "machine/74165.h"
#include "machine/eepromser.h"
+#include "machine/mb3773.h"
#include "machine/nvram.h"
#include "machine/ticket.h"
#include "machine/timer.h"
@@ -127,46 +131,59 @@ Notes:
class sigmab98_state : public driver_device
{
public:
- sigmab98_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ sigmab98_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ // Required devices
m_maincpu(*this,"maincpu"),
+ m_screen(*this, "screen"),
+ m_palette(*this, "palette"),
+ m_gfxdecode(*this, "gfxdecode"),
+ // Optional devices
m_buffered_spriteram(*this, "spriteram"),
- m_spriteram(*this, "spriteram"),
- m_vregs(*this, "vregs"),
- m_vtable(*this, "vtable"),
- m_nvram(*this, "nvram"),
m_nvramdev(*this, "nvram"),
m_eeprom(*this, "eeprom"),
- m_gfxdecode(*this, "gfxdecode"),
- m_screen(*this, "screen"),
- m_palette(*this, "palette"),
m_hopper(*this, "hopper"),
m_hopper_small(*this, "hopper_small"),
- m_hopper_large(*this, "hopper_large")
+ m_hopper_large(*this, "hopper_large"),
+ // Shared pointers
+ m_nvram(*this, "nvram"),
+ m_spriteram(*this, "spriteram"),
+ m_vregs(*this, "vregs"),
+ m_vtable(*this, "vtable")
{ }
+ // Required devices
required_device<cpu_device> m_maincpu;
- optional_device<buffered_spriteram8_device> m_buffered_spriteram; // not on sammymdl?
- optional_shared_ptr<uint8_t> m_spriteram; // optional as some games allocate it themselves (due to banking)
- optional_shared_ptr<uint8_t> m_vregs; // optional as some games allocate it themselves (due to banking)
- optional_shared_ptr<uint8_t> m_vtable; // optional as some games allocate it themselves (due to banking)
- required_shared_ptr<uint8_t> m_nvram;
- optional_device<nvram_device> m_nvramdev;
- required_device<eeprom_serial_93cxx_device> m_eeprom;
- required_device<gfxdecode_device> m_gfxdecode;
- std::vector<uint8_t> m_paletteram;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
+ required_device<gfxdecode_device> m_gfxdecode;
+ // Optional devices
+ optional_device<buffered_spriteram8_device> m_buffered_spriteram; // not on sammymdl?
+ optional_device<nvram_device> m_nvramdev; // battery backed RAM (should be required, but dashhero breaks with it)
+ optional_device<eeprom_serial_93cxx_device> m_eeprom;
optional_device<ticket_dispenser_device> m_hopper;
optional_device<ticket_dispenser_device> m_hopper_small;
optional_device<ticket_dispenser_device> m_hopper_large;
+ // Shared pointers
+ required_shared_ptr<uint8_t> m_nvram;
+ optional_shared_ptr<uint8_t> m_spriteram; // optional as some games allocate it themselves (due to banking)
+ optional_shared_ptr<uint8_t> m_vregs; // optional as some games allocate it themselves (due to banking)
+ optional_shared_ptr<uint8_t> m_vtable; // optional as some games allocate it themselves (due to banking)
+
+ std::vector<uint8_t> m_paletteram;
std::unique_ptr<bitmap_ind16> m_sprite_bitmap;
+ bool new_sprite_chip; // KY-10510 has a slightly different sprite format than KY-3211
uint8_t m_reg;
uint8_t m_rombank;
uint8_t m_reg2;
uint8_t m_rambank;
+
+ uint8_t m_vblank_vector;
+ uint8_t m_timer0_vector;
+ uint8_t m_timer1_vector;
+
uint8_t m_c0;
uint8_t m_c4;
uint8_t m_c6;
@@ -174,10 +191,6 @@ public:
uint8_t m_vblank;
uint8_t m_out[3];
- uint8_t m_vblank_vector;
- uint8_t m_timer0_vector;
- uint8_t m_timer1_vector;
-
DECLARE_WRITE8_MEMBER(gegege_regs_w);
DECLARE_READ8_MEMBER(gegege_regs_r);
DECLARE_WRITE8_MEMBER(gegege_regs2_w);
@@ -277,6 +290,7 @@ public:
INTERRUPT_GEN_MEMBER(sigmab98_vblank_interrupt);
TIMER_DEVICE_CALLBACK_MEMBER(sammymdl_irq);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int pri_mask);
+
void sigmab98(machine_config &config);
void pyenaget(machine_config &config);
void dodghero(machine_config &config);
@@ -291,6 +305,41 @@ public:
};
+class lufykzku_state : public sigmab98_state
+{
+public:
+ lufykzku_state(const machine_config &mconfig, device_type type, const char *tag) :
+ sigmab98_state(mconfig, type, tag),
+ m_watchdog(*this, "watchdog_mb3773"),
+ m_dsw_shifter{ {*this, "ttl165_1"}, {*this, "ttl165_2"} },
+ m_dsw_bit(0)
+ {
+ new_sprite_chip = true;
+ }
+
+ required_device<mb3773_device> m_watchdog;
+ required_device<ttl165_device> m_dsw_shifter[2];
+
+ int m_dsw_bit;
+ DECLARE_WRITE_LINE_MEMBER(dsw_w);
+
+ DECLARE_WRITE8_MEMBER(lufykzku_regs_w);
+ DECLARE_READ8_MEMBER(lufykzku_regs_r);
+ DECLARE_WRITE8_MEMBER(lufykzku_c4_w);
+ DECLARE_WRITE8_MEMBER(lufykzku_c6_w);
+ DECLARE_READ8_MEMBER(lufykzku_c8_r);
+ DECLARE_WRITE8_MEMBER(lufykzku_c8_w);
+ DECLARE_WRITE8_MEMBER(lufykzku_watchdog_w);
+
+ DECLARE_MACHINE_RESET(lufykzku);
+ DECLARE_DRIVER_INIT(lufykzku);
+
+ TIMER_DEVICE_CALLBACK_MEMBER(lufykzku_irq);
+
+ void lufykzku(machine_config &config);
+};
+
+
/***************************************************************************
Video
@@ -304,26 +353,28 @@ void sigmab98_state::video_start()
/***************************************************************************
- Sprites
+ Sprites (Older chip: TAXAN KY-3211. Newer chip: KY-10510)
Offset: Bits: Value:
- 0 7654 ----
+ 0 7654 ---- Color (High, newer chip only?)
---- 3210 Color
1 7--- ----
- -6-- ---- 256 Color Sprite
+ -6-- ---- 256 Color Sprite (older chip)
--5- ----
- ---4 ---- Flip X
- ---- 3--- Flip Y
+ ---4 ---- Flip X (older chip)
+ ---- 3--- Flip Y (older chip) / 256 Color Sprite (newer chip)
---- -2-- Draw Sprite
---- --10 Priority (0 = Front .. 3 = Back)
2 Tile Code (High)
3 Tile Code (Low)
4 7654 3--- Number of X Tiles - 1
- ---- -210 X (High)
+ ---- -2-- Flip X (newer chip)
+ ---- --10 X (High)
5 X (Low)
6 7654 3--- Number of Y Tiles - 1
- ---- -210 Y (High)
+ ---- -2-- Flip Y (newer chip)
+ ---- --10 Y (High)
7 Y (Low)
8 Destination Delta X, Scaled by Shrink Factor << 8 (High)
9 Destination Delta X, Scaled by Shrink Factor << 8 (Low)
@@ -354,15 +405,15 @@ void sigmab98_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec
for ( ; s != end; s -= 0x10 )
{
- if ( (s[ 0x01 ] & 0x04) == 0)
+ if ( (s[ 0x01 ] & (new_sprite_chip ? 0x0c : 0x04)) == 0)
continue;
if ( ((1 << (s[ 0x01 ] & 0x03)) & pri_mask) == 0 )
continue;
- int color = s[ 0x00 ] & 0xf;
+ int color = s[ 0x00 ] & (new_sprite_chip ? 0xff : 0xf);
- int gfx = (s[ 0x01 ] & 0x40 ) ? 1 : 0;
+ int gfx = (s[ 0x01 ] & (new_sprite_chip ? 0x08 : 0x40)) ? 1 : 0;
int code = s[ 0x02 ] * 256 + s[ 0x03 ];
int nx = ((s[ 0x04 ] & 0xf8) >> 3) + 1;
@@ -382,8 +433,8 @@ void sigmab98_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec
dsty = (dsty & 0x01ff) - (dsty & 0x0200);
// Flipping
- int x0, x1, dx, flipx = s[ 0x01 ] & 0x10;
- int y0, y1, dy, flipy = s[ 0x01 ] & 0x08;
+ int x0, x1, dx, flipx = new_sprite_chip ? s[ 0x04 ] & 0x04 : s[ 0x01 ] & 0x10;
+ int y0, y1, dy, flipy = new_sprite_chip ? s[ 0x06 ] & 0x04 : s[ 0x01 ] & 0x08;
if ( flipx ) { x0 = nx - 1; x1 = -1; dx = -1; }
else { x0 = 0; x1 = nx; dx = +1; }
@@ -538,7 +589,7 @@ uint32_t sigmab98_state::screen_update_sigmab98(screen_device &screen, bitmap_in
}
#endif
- bitmap.fill(m_palette->pens()[0x100], cliprect);
+ bitmap.fill(m_palette->pens()[0x1000], cliprect);
// Draw from priority 3 (bottom, converted to a bitmask) to priority 0 (top)
draw_sprites(bitmap, cliprect, layers_ctrl & 8);
@@ -592,7 +643,7 @@ WRITE8_MEMBER(sigmab98_state::vregs_w)
int r = (x >> 10) & 0x1f;
int g = (x >> 5) & 0x1f;
int b = (x >> 0) & 0x1f;
- m_palette->set_pen_color(0x100, pal5bit(r), pal5bit(g), pal5bit(b));
+ m_palette->set_pen_color(0x1000, pal5bit(r), pal5bit(g), pal5bit(b));
break;
}
// default:
@@ -605,7 +656,8 @@ READ8_MEMBER(sigmab98_state::vregs_r)
switch (offset)
{
default:
- logerror("%s: unknown video reg read: %02x\n", machine().describe_context(), offset);
+ if (!machine().side_effect_disabled())
+ logerror("%s: unknown video reg read: %02x\n", machine().describe_context(), offset);
return m_vregs[offset];
}
}
@@ -613,8 +665,9 @@ READ8_MEMBER(sigmab98_state::vregs_r)
READ8_MEMBER(sigmab98_state::d013_r)
{
// bit 5 must go 0->1 (vblank?)
- // bit 2 must set (sprite buffered? triggered by pulsing bit 3 of port C6?)
- return (m_screen->vblank() ? 0x20 : 0) | 0x04;
+ // bit 2 must be set (sprite buffered? triggered by pulsing bit 3 of port C6?)
+// return (m_screen->vblank() ? 0x20 : 0x00) | 0x04;
+ return (m_screen->vblank() ? 0x20 : 0x01) | 0x04;
// return machine().rand();
}
READ8_MEMBER(sigmab98_state::d021_r)
@@ -744,7 +797,7 @@ static ADDRESS_MAP_START( dodghero_mem_map, AS_PROGRAM, 8, sigmab98_state )
AM_RANGE( 0xd800, 0xd821 ) AM_READWRITE(vregs_r, vregs_w) AM_SHARE("vregs")
AM_RANGE( 0xd800, 0xdfff ) AM_RAMBANK("rambank") // not used, where is it mapped?
- AM_RANGE( 0xe000, 0xefff ) AM_RAM AM_SHARE("nvram") // battery
+ AM_RANGE( 0xe000, 0xefff ) AM_RAM AM_SHARE("nvram") // battery backed RAM
AM_RANGE( 0xf000, 0xffff ) AM_RAM
ADDRESS_MAP_END
@@ -940,7 +993,7 @@ static ADDRESS_MAP_START( gegege_mem_map, AS_PROGRAM, 8, sigmab98_state )
AM_RANGE( 0xd800, 0xdfff ) AM_RAMBANK("rambank")
- AM_RANGE( 0xe000, 0xefff ) AM_RAM AM_SHARE("nvram") // battery
+ AM_RANGE( 0xe000, 0xefff ) AM_RAM AM_SHARE("nvram") // battery backed RAM
AM_RANGE( 0xf000, 0xffff ) AM_RAM
ADDRESS_MAP_END
@@ -1043,6 +1096,151 @@ ADDRESS_MAP_END
/***************************************************************************
+ Otakara Itadaki Luffy Kaizoku-Dan!
+***************************************************************************/
+
+// romrambank
+WRITE8_MEMBER(lufykzku_state::lufykzku_regs_w)
+{
+ if (offset == 0)
+ {
+ m_reg = data;
+ return;
+ }
+
+ switch ( m_reg )
+ {
+ case 0x1f: // 8000
+ m_rombank = data;
+ switch (data)
+ {
+ case 0x00: // (8000) ROM
+ membank("romrambank")->set_entry(0);
+ break;
+
+ case 0x78: // (80000) NVRAM
+ membank("romrambank")->set_entry(1);
+ break;
+
+ default:
+ logerror("%s: unknown rom bank = %02x, reg = %02x\n", machine().describe_context(), data, m_reg);
+ }
+ break;
+
+ default:
+ logerror("%s: unknown reg written: %02x = %02x\n", machine().describe_context(), m_reg, data);
+ }
+}
+
+READ8_MEMBER(lufykzku_state::lufykzku_regs_r)
+{
+ if (offset == 0)
+ return m_reg;
+
+ switch ( m_reg )
+ {
+ case 0x00:
+ case 0x78:
+ return m_rombank;
+
+ default:
+ logerror("%s: unknown reg read: %02x\n", machine().describe_context(), m_reg);
+ return 0x00;
+ }
+}
+
+WRITE_LINE_MEMBER(lufykzku_state::dsw_w)
+{
+ m_dsw_bit = state;
+}
+
+// Port c0
+WRITE8_MEMBER(lufykzku_state::lufykzku_watchdog_w)
+{
+ m_watchdog->write_line_ck(BIT(data, 7));
+}
+
+// Port c4
+WRITE8_MEMBER(lufykzku_state::lufykzku_c4_w)
+{
+ machine().bookkeeping().coin_lockout_w(1, (~data) & 0x20); // 100 yen lockout
+// machine().bookkeeping().coin_lockout_w(2, (~data) & 0x40); // (unused coin lockout)
+ machine().bookkeeping().coin_lockout_w(0, (~data) & 0x80); // medal lockout
+
+ m_c4 = data;
+ show_outputs();
+}
+
+// Port c6
+WRITE8_MEMBER(lufykzku_state::lufykzku_c6_w)
+{
+ machine().bookkeeping().coin_counter_w(1, data & 0x01); // 100 yen in
+// machine().bookkeeping().coin_counter_w(2, data & 0x02); // (unused coin in)
+ machine().bookkeeping().coin_counter_w(0, data & 0x04); // medal in
+ machine().bookkeeping().coin_counter_w(3, data & 0x08); // medal out
+ output().set_led_value(0, data & 0x10); // button led
+// output().set_led_value(1, data & 0x20); // (unused button led)
+// output().set_led_value(2, data & 0x40); // (unused button led)
+// output().set_led_value(3, data & 0x80); // (unused button led)
+
+ m_c6 = data;
+ show_outputs();
+}
+
+// Port c8
+READ8_MEMBER(lufykzku_state::lufykzku_c8_r)
+{
+ return 0xbf | (m_dsw_bit ? 0x40 : 0);
+}
+
+WRITE8_MEMBER(lufykzku_state::lufykzku_c8_w)
+{
+ // bit 0? on payout button
+ // bit 1? when ending payment
+ m_hopper->motor_w(( (data & 0x01) && !(data & 0x02)) ? 0 : 1);
+
+ m_dsw_shifter[0]->shift_load_w(BIT(data, 4));
+ m_dsw_shifter[1]->shift_load_w(BIT(data, 4));
+ m_dsw_shifter[0]->clock_w(BIT(data, 5));
+ m_dsw_shifter[1]->clock_w(BIT(data, 5));
+
+ m_c8 = data;
+ show_outputs();
+}
+
+static ADDRESS_MAP_START( lufykzku_mem_map, AS_PROGRAM, 8, lufykzku_state )
+ AM_RANGE( 0x0000, 0x7fff ) AM_ROM
+ AM_RANGE( 0x8000, 0xbfff ) AM_RAMBANK("romrambank") AM_SHARE("nvram") // ROM | NVRAM
+
+ AM_RANGE( 0xc000, 0xcfff ) AM_RAM AM_SHARE("spriteram")
+
+ AM_RANGE( 0xd000, 0xefff ) AM_RAM_DEVWRITE("palette", palette_device, write8) AM_SHARE("palette") // more palette entries
+
+ AM_RANGE( 0xf013, 0xf013 ) AM_READ(d013_r)
+ AM_RANGE( 0xf021, 0xf021 ) AM_READ(d021_r)
+ AM_RANGE( 0xf000, 0xf021 ) AM_READWRITE(vregs_r, vregs_w) AM_SHARE("vregs")
+
+ AM_RANGE( 0xf400, 0xf47f ) AM_RAM AM_SHARE("vtable")
+
+ AM_RANGE( 0xfc00, 0xffff ) AM_RAM
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( lufykzku_io_map, AS_IO, 8, lufykzku_state )
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+ AM_RANGE( 0x00, 0x00 ) AM_DEVWRITE("oki", okim9810_device, write )
+ AM_RANGE( 0x01, 0x01 ) AM_DEVWRITE("oki", okim9810_device, write_tmp_register )
+
+ AM_RANGE( 0xa2, 0xa3 ) AM_READWRITE(lufykzku_regs_r, lufykzku_regs_w )
+
+ AM_RANGE( 0xc0, 0xc0 ) AM_READ_PORT( "COIN" ) AM_WRITE(lufykzku_watchdog_w ) // bit 7 -> watchdog
+ AM_RANGE( 0xc2, 0xc2 ) AM_READ_PORT( "BUTTON" )
+ AM_RANGE( 0xc4, 0xc4 ) AM_READ_PORT( "PAYOUT" ) AM_WRITE(lufykzku_c4_w) // bit 7 = medal lock, bit 6 = coin3, bit 5 = yen
+ AM_RANGE( 0xc6, 0xc6 ) AM_WRITE(lufykzku_c6_w )
+ AM_RANGE( 0xc8, 0xc8 ) AM_READWRITE(lufykzku_c8_r, lufykzku_c8_w ) // 0xc8 bit 6 read (eeprom?)
+ADDRESS_MAP_END
+
+
+/***************************************************************************
Animal Catch
***************************************************************************/
@@ -1949,7 +2147,7 @@ READ8_MEMBER(sigmab98_state::itazuram_rombank_r)
switch ( m_reg )
{
- // FIXME different registers
+ // FIXME: different registers
case 0x0d:
case 0x4d:
case 0x8d:
@@ -2336,6 +2534,12 @@ static GFXDECODE_START( sigmab98 )
GFXDECODE_ENTRY( "sprites", 0, sigmab98_16x16x8_layout, 0, 0x100/256 )
GFXDECODE_END
+// Larger palette
+static GFXDECODE_START( lufykzku )
+ GFXDECODE_ENTRY( "sprites", 0, sigmab98_16x16x4_layout, 0, 0x1000/16 )
+ GFXDECODE_ENTRY( "sprites", 0, sigmab98_16x16x8_layout, 0, 0x1000/16 )
+GFXDECODE_END
+
/***************************************************************************
@@ -2415,6 +2619,89 @@ static INPUT_PORTS_START( sigma_js )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
INPUT_PORTS_END
+
+/***************************************************************************
+ Banpresto Medal Games
+***************************************************************************/
+
+static INPUT_PORTS_START( lufykzku )
+ PORT_START("COIN")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(2) // medal in
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(2) // 100 yen in
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // (unused coin in)
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("BUTTON")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // sw1 (button)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("hopper", ticket_dispenser_device, line_r)
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("PAYOUT")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE ) // test sw
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE1 ) // service sw (service coin, press to go down in service mode)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_GAMBLE_PAYOUT ) // payout sw
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_DOOR ) // "maintenance panel abnormality" when not high on boot (in that case, when it goes high the game resets)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ // Dips read serially via port 0xc8 bit 6
+ PORT_START("DSW1") // stored at fc14
+ PORT_DIPUNKNOWN_DIPLOC(0x01, IP_ACTIVE_LOW, "DSW1:1" )
+ PORT_DIPUNKNOWN_DIPLOC(0x02, IP_ACTIVE_LOW, "DSW1:2" )
+ PORT_DIPUNKNOWN_DIPLOC(0x04, IP_ACTIVE_LOW, "DSW1:3" )
+ PORT_DIPUNKNOWN_DIPLOC(0x08, IP_ACTIVE_LOW, "DSW1:4" )
+ PORT_DIPUNKNOWN_DIPLOC(0x10, IP_ACTIVE_LOW, "DSW1:5" )
+ PORT_DIPUNKNOWN_DIPLOC(0x20, IP_ACTIVE_LOW, "DSW1:6" )
+ PORT_DIPNAME( 0xc0, 0x40, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW1:7,8") // Advertize Voice
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0xc0, "On (1/3 Of The Loops)" )
+ PORT_DIPSETTING( 0x80, "On (1/2 Of The Loops)" )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+
+ PORT_START("DSW2") // stored at fc15
+ PORT_DIPNAME( 0x07, 0x03, "Payout" ) PORT_DIPLOCATION("DSW2:1,2,3")
+ PORT_DIPSETTING( 0x07, "55%" )
+ PORT_DIPSETTING( 0x06, "60%" )
+ PORT_DIPSETTING( 0x05, "65%" )
+ PORT_DIPSETTING( 0x04, "70%" )
+ PORT_DIPSETTING( 0x03, "75%" )
+ PORT_DIPSETTING( 0x02, "80%" )
+ PORT_DIPSETTING( 0x01, "85%" )
+ PORT_DIPSETTING( 0x00, "90%" )
+ PORT_DIPNAME( 0x08, 0x08, "Win Wave" ) PORT_DIPLOCATION("DSW2:4")
+ PORT_DIPSETTING( 0x08, "Small" )
+ PORT_DIPSETTING( 0x00, "Big" )
+ PORT_DIPNAME( 0xf0, 0xa0, "¥100 Medals" ) PORT_DIPLOCATION("DSW2:5,6,7,8")
+ PORT_DIPSETTING( 0xf0, "5" )
+ PORT_DIPSETTING( 0xe0, "6" )
+ PORT_DIPSETTING( 0xd0, "7" )
+ PORT_DIPSETTING( 0xc0, "8" )
+ PORT_DIPSETTING( 0xb0, "9" )
+ PORT_DIPSETTING( 0xa0, "10" )
+ PORT_DIPSETTING( 0x90, "11" )
+ PORT_DIPSETTING( 0x80, "12" )
+ PORT_DIPSETTING( 0x70, "13" )
+ PORT_DIPSETTING( 0x60, "14" )
+ PORT_DIPSETTING( 0x50, "15" )
+ PORT_DIPSETTING( 0x40, "16" )
+ PORT_DIPSETTING( 0x30, "17" )
+ PORT_DIPSETTING( 0x20, "18" )
+ PORT_DIPSETTING( 0x10, "19" )
+ PORT_DIPSETTING( 0x00, "20" )
+INPUT_PORTS_END
+
+
/***************************************************************************
Sammy Medal Games
***************************************************************************/
@@ -2532,7 +2819,7 @@ MACHINE_CONFIG_START(sigmab98_state::sigmab98)
MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", sigmab98)
- MCFG_PALETTE_ADD("palette", 0x100 + 1)
+ MCFG_PALETTE_ADD("palette", 0x1000 + 1)
MCFG_PALETTE_FORMAT(xRRRRRGGGGGBBBBB)
MCFG_PALETTE_ENDIANNESS(ENDIANNESS_BIG)
@@ -2568,6 +2855,75 @@ MACHINE_CONFIG_END
/***************************************************************************
+ Banpresto Medal Games
+***************************************************************************/
+
+MACHINE_RESET_MEMBER(lufykzku_state,lufykzku)
+{
+ m_rombank = 0;
+ membank("romrambank")->set_entry(0);
+}
+
+TIMER_DEVICE_CALLBACK_MEMBER(lufykzku_state::lufykzku_irq)
+{
+ int scanline = param;
+
+ if (scanline == 240)
+ m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_vblank_vector);
+ else if (scanline == 128)
+ m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_timer0_vector);
+ else if ((scanline % 8) == 0)
+ m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_timer1_vector); // this needs to be called often or the state of the door is not read at boot (at least 5 times before bb9 is called)
+}
+
+MACHINE_CONFIG_START(lufykzku_state::lufykzku)
+ MCFG_CPU_ADD("maincpu", Z80, XTAL_20MHz / 2) // !! TAXAN KY-80, clock @X1? !!
+ MCFG_CPU_PROGRAM_MAP(lufykzku_mem_map)
+ MCFG_CPU_IO_MAP(lufykzku_io_map)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", lufykzku_state, lufykzku_irq, "screen", 0, 1)
+
+ MCFG_MACHINE_RESET_OVERRIDE(lufykzku_state, lufykzku)
+
+ MCFG_NVRAM_ADD_0FILL("nvram") // battery backed RAM
+ // No EEPROM
+
+ MCFG_DEVICE_ADD("watchdog_mb3773", MB3773, 0)
+ MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW )
+
+ // 2 x 8-bit parallel/serial converters
+ MCFG_TTL165_ADD("ttl165_1")
+ MCFG_TTL165_DATA_CB(IOPORT("DSW2"))
+ MCFG_TTL165_QH_CB(DEVWRITELINE("ttl165_2", ttl165_device, serial_w))
+
+ MCFG_TTL165_ADD("ttl165_2")
+ MCFG_TTL165_DATA_CB(IOPORT("DSW1"))
+ MCFG_TTL165_QH_CB(WRITELINE(lufykzku_state, dsw_w))
+
+ // video hardware
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60) // ?
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // game reads vblank state
+ MCFG_SCREEN_SIZE(0x140, 0x100)
+ MCFG_SCREEN_VISIBLE_AREA(0,0x140-1, 0,0xf0-1)
+ MCFG_SCREEN_UPDATE_DRIVER(sigmab98_state, screen_update_sigmab98)
+ MCFG_SCREEN_PALETTE("palette")
+
+ MCFG_GFXDECODE_ADD("gfxdecode", "palette", lufykzku)
+ MCFG_PALETTE_ADD("palette", 0x1000 + 1)
+ MCFG_PALETTE_FORMAT(xRRRRRGGGGGBBBBB)
+ MCFG_PALETTE_ENDIANNESS(ENDIANNESS_BIG)
+
+// MCFG_BUFFERED_SPRITERAM8_ADD("spriteram") // same as sammymdl?
+
+ // sound hardware
+ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_OKIM9810_ADD("oki", XTAL_4_096MHz)
+ MCFG_SOUND_ROUTE(0, "lspeaker", 0.80)
+ MCFG_SOUND_ROUTE(1, "rspeaker", 0.80)
+MACHINE_CONFIG_END
+
+
+/***************************************************************************
Sammy Medal Games
***************************************************************************/
@@ -2580,14 +2936,14 @@ TIMER_DEVICE_CALLBACK_MEMBER(sigmab98_state::sammymdl_irq)
{
int scanline = param;
- if(scanline == 240)
- m_maincpu->set_input_line_and_vector(0,HOLD_LINE, m_vblank_vector);
+ if (scanline == 240)
+ m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_vblank_vector);
- if(scanline == 128)
- m_maincpu->set_input_line_and_vector(0,HOLD_LINE, m_timer0_vector);
+ if (scanline == 128)
+ m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_timer0_vector);
- if(scanline == 32)
- m_maincpu->set_input_line_and_vector(0,HOLD_LINE, m_timer1_vector);
+ if (scanline == 32)
+ m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_timer1_vector);
}
MACHINE_CONFIG_START(sigmab98_state::sammymdl)
@@ -2598,7 +2954,7 @@ MACHINE_CONFIG_START(sigmab98_state::sammymdl)
MCFG_MACHINE_RESET_OVERRIDE(sigmab98_state, sammymdl )
- MCFG_NVRAM_ADD_0FILL("nvram") // battery
+ MCFG_NVRAM_ADD_0FILL("nvram") // battery backed RAM
MCFG_EEPROM_SERIAL_93C46_8BIT_ADD("eeprom")
MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW )
@@ -2616,11 +2972,11 @@ MACHINE_CONFIG_START(sigmab98_state::sammymdl)
MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", sigmab98)
- MCFG_PALETTE_ADD("palette", 0x100 + 1)
+ MCFG_PALETTE_ADD("palette", 0x1000 + 1)
MCFG_PALETTE_FORMAT(xRRRRRGGGGGBBBBB)
MCFG_PALETTE_ENDIANNESS(ENDIANNESS_BIG)
-// MCFG_BUFFERED_SPRITERAM8_ADD("spriteram")
+// MCFG_BUFFERED_SPRITERAM8_ADD("spriteram") // not on sammymdl?
// sound hardware
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
@@ -2801,7 +3157,6 @@ DRIVER_INIT_MEMBER(sigmab98_state,gegege)
// RAM banks
uint8_t *bankedram = auto_alloc_array(machine(), uint8_t, 0x800 * 2);
-
membank("rambank")->configure_entries(0, 2, bankedram, 0x800);
membank("rambank")->set_entry(0);
}
@@ -2888,7 +3243,6 @@ DRIVER_INIT_MEMBER(sigmab98_state,pepsiman)
// RAM banks
uint8_t *bankedram = auto_alloc_array(machine(), uint8_t, 0x800 * 2);
-
membank("rambank")->configure_entries(0, 2, bankedram, 0x800);
membank("rambank")->set_entry(0);
}
@@ -2979,7 +3333,6 @@ DRIVER_INIT_MEMBER(sigmab98_state,ucytokyu)
// RAM banks
uint8_t *bankedram = auto_alloc_array(machine(), uint8_t, 0x800 * 2);
-
membank("rambank")->configure_entries(0, 2, bankedram, 0x800);
membank("rambank")->set_entry(0);
}
@@ -3027,6 +3380,71 @@ DRIVER_INIT_MEMBER(sigmab98_state,dashhero)
/***************************************************************************
+ お宝いただき ルフィ海賊団! (Otakara Itadaki Luffy Kaizoku-Dan!)
+ "From TV animation One Piece"
+ (C) Eiichiro Oda / Shueisha - Fuji TV - Toho Animation
+ (C) Banpresto 2001 Made In Japan
+
+ PCB: BPSC-2001M-A
+
+ Chips:
+ TAXAN KY-80 YAMAHA : CPU
+ TAXAN KY-10510 : Graphics, slightly different sprite format than KY-3211
+ OKI M9811 : Sound, 4-channel version of OKI M9810
+ MB3773 (@IC22?) : Power Supply Monitor with Watch Dog Timer and Reset (SOIC8)
+
+ Misc:
+ 2 x DSW8 (@DSW1-2, KSD08S)
+ 2 x 74HC165A (8-bit parallel-in/serial out shift register)
+ Cell battery (@BT1)
+ Potentiometer (@VR1)
+ Connectors: CN1 (52? pins), CN2 (10 pins), CN3 (6 pins), CN4 (5 pins)
+ XTALs: 25.000 MHz (@OSC1?), 20.00 MHz (@X1), 15.00 MHz (@X2), 4.096 MHz (@X3)
+ Jumpers: ホッパー JP1 / JP2 = 12V / 24V (hopper voltage)
+ ウォッチドック JP3 = (watchdog enable?)
+ PRG ロム JP4 / JP5 = 4M? / 1 or 2M (rom size)
+
+ Eproms:
+ IC1 ST 27C1001
+ IC2 ST 27C4001
+ IC3 ST 27C800
+
+***************************************************************************/
+
+ROM_START( lufykzku )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "ka-102_p1__ver1.02.ic1", 0x000000, 0x020000, CRC(5d4f3405) SHA1(e2d982465ba847e9883dbb1c9a95c24eeae4611d) ) // hand-written label, 1xxxxxxxxxxxxxxxx = 0xFF
+
+ ROM_REGION( 0x100000, "sprites", 0 )
+ ROM_LOAD( "ka-102_g1__ver1.00.ic3", 0x000000, 0x100000, CRC(abaca89d) SHA1(ad42eb8536373fb4fcff8f04ffe9b67dc62e0423) )
+
+ ROM_REGION( 0x1000000, "oki", ROMREGION_ERASEFF )
+ ROM_LOAD( "ka-102_s1__ver1.00.ic2", 0x000000, 0x080000, CRC(65f800d5) SHA1(03afe2f7a0731e7c3bc7c86e1a0dcaea0796e87f) )
+ROM_END
+
+DRIVER_INIT_MEMBER(lufykzku_state,lufykzku)
+{
+ m_nvram.allocate(0x4000);
+ memset(m_nvram, 0, 0x4000);
+ m_nvramdev->set_base(m_nvram, 0x4000);
+
+ // ROM/RAM banks
+ uint8_t *rom = memregion("maincpu")->base();
+
+ membank("romrambank")->configure_entry(0, rom + 0x8000);
+ membank("romrambank")->configure_entry(1, m_nvram);
+ membank("romrambank")->set_entry(0);
+
+ m_vblank_vector = 0xfa; // nop
+ m_timer0_vector = 0xfc; // write coin counters/lockout, drive hopper
+ m_timer1_vector = 0xfe; // read inputs and hopper sensor, handle coin in
+
+ m_gfxdecode->gfx(1)->set_granularity(16);
+}
+
+
+/***************************************************************************
+
Sammy Medal Games
PCB:
@@ -3058,6 +3476,7 @@ DRIVER_INIT_MEMBER(sigmab98_state,dashhero)
Xilinx XC9536 VM1212F01 (@U5) - In-System Programmable CPLD
MX29F0??C (@U3) - Empty 32 Pin ROM Socket
+ M5295A (@U8) - Watchdog Timer (Near CUT-DEBUG MODE Jumper)
M93C46MN6T (@U11?) - Serial EEPROM
Cell Battery (@BAT)
25 Pin Edge Connector
@@ -3360,6 +3779,7 @@ DRIVER_INIT_MEMBER(sigmab98_state,haekaka)
***************************************************************************/
+// Sigma Medal Games
GAME( 1997, dodghero, 0, dodghero, sigma_1b, sigmab98_state, dodghero, ROT0, "Sigma", "Minna Atsumare! Dodge Hero", 0 )
GAME( 1997, sushimar, 0, dodghero, sigma_3b, sigmab98_state, dodghero, ROT0, "Sigma", "Itazura Daisuki! Sushimaru Kun", 0 )
GAME( 1997, gegege, 0, gegege, sigma_1b, sigmab98_state, gegege, ROT0, "Sigma / Banpresto", "GeGeGe no Kitarou Youkai Slot", 0 )
@@ -3368,6 +3788,8 @@ GAME( 1997, pepsiman, 0, gegege, sigma_3b, sigmab98_state, pepsiman, RO
GAME( 1998, tbeastw2, 0, gegege, sigma_3b, sigmab98_state, tbeastw2, ROT0, "Sigma / Transformer Production Company / Takara", "Transformers Beast Wars II", 0 ) // 1997 in the rom
GAME( 1997, ucytokyu, 0, gegege, sigma_js, sigmab98_state, ucytokyu, ROT0, "Sigma", "Uchuu Tokkyuu Medalian", 0 ) // Banpresto + others in the ROM
GAME( 2000, dashhero, 0, dashhero, sigma_1b, sigmab98_state, dashhero, ROT0, "Sigma", "Minna Ganbare! Dash Hero", MACHINE_NOT_WORKING ) // 1999 in the rom
+// Banpresto Medal Games
+GAME( 2001, lufykzku, 0, lufykzku, lufykzku, lufykzku_state, lufykzku, ROT0, "Banpresto / Eiichiro Oda / Shueisha - Fuji TV - Toho Animation", "Otakara Itadaki Luffy Kaizoku-Dan! (Japan, v1.02)", 0 )
// Sammy Medal Games:
GAME( 2000, sammymdl, 0, sammymdl, sammymdl, sigmab98_state, animalc, ROT0, "Sammy", "Sammy Medal Game System Bios", MACHINE_IS_BIOS_ROOT )
GAME( 2000, animalc, sammymdl, animalc, sammymdl, sigmab98_state, animalc, ROT0, "Sammy", "Animal Catch", 0 )