// license:BSD-3-Clause
// copyright-holders:Pierpaolo Prazzoli, Bryan McPhail, Stephane Humbert, Angelo Salese
/***************************************************************************
SNK/Alpha 68000 N based board games
derived from alpha68k.cpp
TODO:
- Super Stingray MCU irq controls timer speed. The MCU has been
hooked up but the clock is almost certainly wrong.
- GFX region can eventually overflow in jongbou, and in general all three
games can probably be run with the same gfx_layout structs
============================================================================
Kyros no Yakata
Alpha Denshi, 1986
PCB Layout
----------
Main Board
(no PCB number)
|----------------------------------------------------------|
| |
| 0.1T 24MHz |
| |
| 15.3T 5814 |
| PROMG.4R SW1 | | 1|
| 16.5T PROMR.5R PROMH.5P 5814 | | 8|
| PROMB.6R PROML.6P | | W|
| 17.7T 8511 | | A|
| 2016 2016 | | Y|
| 18.9T 9.9S 8.9R 2016 2016 | | |
| | | |
| 19.11T 68000 2016 2.10C 4.10A |
| 14.12R 12.12N 2016 |
| 20.13T 13.12P 11.12M 1.13C 3.13A |
|CN |
|----------------------------------------------------------|
Notes:
68000 clock - 6.000MHz [24/4]
2016 - 2kx8 SRAM
5814 - 2kx8 SRAM
CN - 18-pin flat cable connector joining to sound PCB
| - ALPHA-INPUT84 custom ceramic module (x2)
SW1 - 8-position DIP Switch
VSync - 60Hz
HSync - 15.20kHz
8511 - Alpha 8511 Microcontroller at location 7C. '8511' is silkscreened on the PCB.
Clock input 3.000MHz [24/8] (measured on pin 5).
The chip is pin-compatible with Motorola MC68705U3, Motorola MC6805U2
and Hitachi HD6805U1. The 4k MC68705U3 dump in MAME is from a bootleg PCB.
Sound Board
-----------
SOUND BOARD NO.60MC01
|---------------------|
| 40174 324 UPC1181|
| 4013 VOL VOL |
| YM3014 324 6|
| W|
| YM2203 AY-3-8910 A|
| Y|
| AY-3-8910 |
| |
| DIP28 |
| |
| 2.1F 2114 |
| 2114 |
| 1.1D 16MHz |
| |
| Z80 |
|CN |
|---------------------|
Notes:
Z80 clock - 4.000MHz [16/4]. The actual chip is a NEC D780C-1
AY-3-8910 clock - 2.000MHz [16/8]
YM2203 clock - 2.000MHz [16/8]
YM3014 - Yamaha YM3014 DAC. Clock input 1.33333MHz [16/12]
UPC1181 - Power AMP IC
324 - LM324 Quad Op Amp
2114 - 1kx4 SRAM
40xx - 4000-series logic chips
CN - 18-pin flat cable connector joining to main PCB
DIP28 - Empty socket
PCB Pinout
----------
18-WAY Connector (Main)
Parts Solder
-----------------
+5V A1 B1 +5V
+5V A2 B2 +5V
1P UP A3 B3 2P DOWN
1P DOWN A4 B4 2P RIGHT
1P RIGHT A5 B5 2P LEFT
1P LEFT A6 B6 2P BUTTON 1
1P BUTTON 1 A7 B7 -
1P BUTTON 2 A8 B8 -
- A9 B9 COIN 1
1P START A10 B10 COIN 2
2P UP A11 B11 2P BUTTON 2
GREEN A12 B12 -
BLUE A13 B13 2P START
RED A14 B14 -
SYNC A15 B15 -
GND A16 B16 GND
GND A17 B17 GND
GND A18 B18 GND
6-WAY Connector (Sound)
Parts Solder
-----------------
+12V A1 B1 +12V
- A2 B2 -
+5V A3 B3 +5V
SPK+ A4 B4 SPK+
SPK- A5 B5 GND
GND A6 B6 GND
***************************************************************************/
#include "emu.h"
#include "includes/alpha68k.h"
/*
*
* Video Section
*
*/
void alpha68k_N_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int c, int d)
{
for (int offs = 0; offs < 0x400; offs += 0x20)
{
int mx = m_spriteram[offs + c];
int my = -(mx >> 8) & 0xff;
mx &= 0xff;
// TODO: not convinced by this
if (m_is_super_stingray && mx > 0xf8)
mx -= 0x100;
if (m_flipscreen)
my = 249 - my;
for (int i = 0; i < 0x20; i++)
{
const u16 data = m_spriteram[offs + d + i];
// TODO: not convinced by this either, must be transmask instead of transpen somehow
if (data != m_tile_transchar)
{
u8 color, bank;
u16 tile;
bank = data >> 10 & 3;
tile = data & 0x3ff;
if (m_is_super_stingray == true)
color = (data >> 7 & 0x18) | (data >> 13 & 7);
else
{
color = m_color_proms[(data >> 1 & 0x1000) | (data & 0xffc) | (data >> 14 & 3)];
bank += ((data >> m_tile_bankshift) & 4);
tile += (data >> 3 & 0x400);
}
// can't be 0xff in super stingray
if (color != 0xff)
{
int fy = ((data & 0x1000) >> 12) ^ m_flipscreen;
int fx = m_flipscreen;
m_gfxdecode->gfx(bank)->transpen(bitmap,cliprect, tile, color, fx, fy, mx, my, 0);
}
}
if (m_flipscreen)
my = (my - 8) & 0xff;
else
my = (my + 8) & 0xff;
}
}
}
u32 alpha68k_N_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_palette->set_pen_indirect(0x100, *m_videoram & 0xff);
bitmap.fill(0x100, cliprect);
draw_sprites(bitmap, cliprect, 2, 0x0800);
draw_sprites(bitmap, cliprect, 3, 0x0c00);
draw_sprites(bitmap, cliprect, 1, 0x0400);
return 0;
}
/*
*
* MCU simulation
*
*/
u16 alpha68k_N_state::kyros_alpha_trigger_r(offs_t offset)
{
/* possible jump codes:
- Kyros : 0x22
- Super Stingray : 0x21,0x22,0x23,0x24,0x34,0x37,0x3a,0x3d,0x40,0x43,0x46,0x49
*/
static const u8 coinage1[8][2] = {{1,1}, {1,5}, {1,3}, {2,3}, {1,2}, {1,6}, {1,4}, {3,2}};
static const u8 coinage2[8][2] = {{1,1}, {5,1}, {3,1}, {7,1}, {2,1}, {6,1}, {4,1}, {8,1}};
const u16 source = m_shared_ram[offset];
switch (offset)
{
case 0x22: /* Coin value */
m_shared_ram[0x22] = (source & 0xff00) | (m_credits & 0x00ff);
return 0;
case 0x29: /* Query microcontroller for coin insert */
m_trigstate++;
if ((m_in[2]->read() & 0x3) == 3)
m_latch = 0;
if ((m_in[2]->read() & 0x1) == 0 && !m_latch)
{
m_shared_ram[0x29] = (source & 0xff00) | (m_coin_id & 0xff); // coinA
m_shared_ram[0x22] = (source & 0xff00) | 0x0;
m_latch = 1;
m_coinvalue = (~m_in[1]->read() >> 1) & 7;
m_deposits1++;
if (m_deposits1 == coinage1[m_coinvalue][0])
{
m_credits = coinage1[m_coinvalue][1];
m_deposits1 = 0;
}
else
m_credits = 0;
}
else if ((m_in[2]->read() & 0x2) == 0 && !m_latch)
{
m_shared_ram[0x29] = (source & 0xff00) | (m_coin_id >> 8); // coinB
m_shared_ram[0x22] = (source & 0xff00) | 0x0;
m_latch = 1;
m_coinvalue = (~m_in[1]->read() >>1 ) & 7;
m_deposits2++;
if (m_deposits2 == coinage2[m_coinvalue][0])
{
m_credits = coinage2[m_coinvalue][1];
m_deposits2 = 0;
}
else
m_credits = 0;
}
else
{
if (m_microcontroller_id == 0x00ff) /* Super Stingry */
{
if (m_trigstate >= 12 || m_game_id == ALPHA68K_JONGBOU) /* arbitrary value ! */
{
m_trigstate = 0;
m_microcontroller_data = 0x21; // timer
}
else
m_microcontroller_data = 0x00;
}
else
m_microcontroller_data = 0x00;
m_shared_ram[0x29] = (source & 0xff00) | m_microcontroller_data;
}
return 0;
case 0xff: /* Custom check, only used at bootup */
m_shared_ram[0xff] = (source & 0xff00) | m_microcontroller_id;
break;
}
logerror("%04x: Alpha read trigger at %04x\n", m_maincpu->pc(), offset);
return 0; /* Values returned don't matter */
}
u8 sstingray_state::alpha8511_command_r(offs_t offset)
{
if (!machine().side_effects_disabled())
m_alpha8511_sync_timer->adjust(attotime::zero, offset << 8 | 0x100ff);
return 0;
}
void sstingray_state::alpha8511_command_w(offs_t offset, u8 data)
{
m_alpha8511_sync_timer->adjust(attotime::zero, offset << 8 | data);
}
TIMER_CALLBACK_MEMBER(sstingray_state::alpha8511_sync)
{
m_microcontroller_data = param & 0xff;
m_alpha8511_address = (param >> 8) & 0xff;
m_alpha8511_read_mode = BIT(param, 16);
if (BIT(m_alpha8511_control, 4))
{
m_alpha8511->set_input_line(MCS48_INPUT_IRQ, ASSERT_LINE);
m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
}
}
u8 sstingray_state::alpha8511_bus_r()
{
return m_microcontroller_data;
}
void sstingray_state::alpha8511_bus_w(u8 data)
{
m_microcontroller_data = data;
}
u8 sstingray_state::alpha8511_address_r()
{
return m_alpha8511_address;
}
u8 sstingray_state::alpha8511_rw_r()
{
return m_alpha8511_read_mode ? 0xff : 0xf7;
}
void sstingray_state::alpha8511_control_w(u8 data)
{
if (!BIT(data, 4))
{
m_alpha8511->set_input_line(MCS48_INPUT_IRQ, CLEAR_LINE);
m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
}
if (BIT(data, 5))
m_maincpu->set_input_line(M68K_IRQ_2, HOLD_LINE);
if (!BIT(data, 6))
m_shared_ram[m_alpha8511_address] = (m_shared_ram[m_alpha8511_address] & 0xff00) | m_microcontroller_data;
m_flipscreen = !BIT(data, 7);
m_alpha8511_control = data;
}
u16 jongbou_state::dial_inputs_r()
{
u8 inp1 = m_in[3]->read();
u8 inp2 = m_in[4]->read();
inp1 = ((inp1 & 0x01) << 3) + ((inp1 & 0x02) << 1) + ((inp1 & 0x04) >> 1) + ((inp1 & 0x08) >> 3);
inp2 = ((inp2 & 0x01) << 3) + ((inp2 & 0x02) << 1) + ((inp2 & 0x04) >> 1) + ((inp2 & 0x08) >> 3);
return m_in[0]->read() | inp1 | inp2 << 4;
}
/*
*
* Memory Maps
*
*/
void sstingray_state::main_map(address_map &map)
{
map(0x000000, 0x01ffff).rom(); // main program
map(0x020000, 0x020fff).ram().share("shared_ram"); // work RAM
map(0x040000, 0x041fff).ram().share("spriteram"); // sprite RAM
map(0x060000, 0x060001).ram().share("videoram"); // MSB: watchdog, LSB: BGC
map(0x080000, 0x0801ff).rw(FUNC(sstingray_state::alpha8511_command_r), FUNC(sstingray_state::alpha8511_command_w)).umask16(0x00ff);
map(0x0c0000, 0x0c0001).portr("IN0");
map(0x0e0000, 0x0e0000).lr8(NAME([this] () -> u8 { return m_in[1]->read(); })).w(m_soundlatch, FUNC(generic_latch_8_device::write));
}
void alpha68k_N_state::main_map(address_map &map)
{
map(0x000000, 0x01ffff).rom(); // main program
map(0x020000, 0x020fff).ram().share("shared_ram"); // work RAM
map(0x040000, 0x041fff).ram().share("spriteram"); // sprite RAM
map(0x060000, 0x060001).ram().share("videoram"); // MSB: watchdog, LSB: BGC
map(0x080000, 0x0801ff).rw(FUNC(kyros_state::kyros_alpha_trigger_r), FUNC(kyros_state::alpha_microcontroller_w));
map(0x0c0000, 0x0c0001).portr("IN0");
map(0x0e0000, 0x0e0000).lr8(NAME([this] () -> u8 { return m_in[1]->read(); })).w(m_soundlatch, FUNC(generic_latch_8_device::write));
}
void jongbou_state::main_map(address_map &map)
{
alpha68k_N_state::main_map(map);
map(0x0c0000, 0x0c0001).r(FUNC(jongbou_state::dial_inputs_r));
}
void alpha68k_N_state::sound_map(address_map &map)
{
map(0x0000, 0xbfff).rom();
map(0xc000, 0xc7ff).ram();
map(0xe000, 0xe000).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0xe002, 0xe002).w(m_soundlatch, FUNC(generic_latch_8_device::clear_w));
map(0xe004, 0xe004).w("dac", FUNC(dac_byte_interface::data_w));
map(0xe006, 0xe00e).nopw(); // soundboard I/O's, ignored
/* reference only
map(0xe006, 0xe006).nopw(); // NMI: diminishing saw-tooth
map(0xe008, 0xe008).nopw(); // NMI: 00
map(0xe00a, 0xe00a).nopw(); // RST38: 20
map(0xe00c, 0xe00c).nopw(); // RST30: 00 on entry
map(0xe00e, 0xe00e).nopw(); // RST30: 00,02,ff on exit(0x1d88)
*/
}
void sstingray_state::sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x87ff).ram();
map(0xc100, 0xc100).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0xc102, 0xc102).w(m_soundlatch, FUNC(generic_latch_8_device::clear_w));
map(0xc104, 0xc104).w("dac", FUNC(dac_byte_interface::data_w));
map(0xc106, 0xc10e).nopw(); // soundboard I/O's, ignored
}
void alpha68k_N_state::sound_iomap(address_map &map)
{
map.global_mask(0xff);
map(0x10, 0x11).w("ym1", FUNC(ym2203_device::write));
map(0x80, 0x80).w("ym2", FUNC(ym2203_device::write_port_w));
map(0x81, 0x81).w("ym2", FUNC(ym2203_device::control_port_w));
map(0x90, 0x90).w("ym3", FUNC(ym2203_device::write_port_w));
map(0x91, 0x91).w("ym3", FUNC(ym2203_device::control_port_w));
}
void jongbou_state::sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x83ff).ram();
}
void jongbou_state::sound_iomap(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).w("aysnd", FUNC(ay8910_device::address_w));
map(0x01, 0x01).rw("aysnd", FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w));
map(0x02, 0x02).w(m_soundlatch, FUNC(generic_latch_8_device::clear_w));
map(0x06, 0x06).nopw();
}
/*
*
* GFX definitions
*
*/
static const gfx_layout sstingry_layout1 =
{
8,8, /* 8*8 chars */
1024,
3, /* 3 bits per pixel */
{ 4, 0+(0x10000*4), 4+(0x8000*8) },
{ 8*8+3, 8*8+2, 8*8+1, 8*8+0, 3, 2, 1, 0 },
{ STEP8(0,8) },
16*8 /* every char takes 16 consecutive bytes */
};
static const gfx_layout sstingry_layout2 =
{
8,8, /* 8*8 chars */
1024,
3, /* 3 bits per pixel */
{ 0, 0+(0x28000*8), 4+(0x28000*8) },
{ 8*8+3, 8*8+2, 8*8+1, 8*8+0, 3, 2, 1, 0 },
{ STEP8(0,8) },
16*8 /* every char takes 16 consecutive bytes */
};
static const gfx_layout sstingry_layout3 =
{
8,8, /* 8*8 chars */
1024,
3, /* 3 bits per pixel */
{ 0, 0+(0x10000*8), 4+(0x10000*8) },
{ 8*8+3, 8*8+2, 8*8+1, 8*8+0, 3, 2, 1, 0 },
{ STEP8(0,8) },
16*8 /* every char takes 16 consecutive bytes */
};
static const gfx_layout kyros_char_layout1 =
{
8,8, /* 8*8 chars */
0x8000/16,
3, /* 3 bits per pixel */
{ 4,0x8000*8,0x8000*8+4 },
{ 8*8+3, 8*8+2, 8*8+1, 8*8+0, 3, 2, 1, 0 },
{ STEP8(0,8) },
16*8 /* every char takes 16 consecutive bytes */
};
static const gfx_layout kyros_char_layout2 =
{
8,8, /* 8*8 chars */
0x8000/16,
3, /* 3 bits per pixel */
{ 0,0x10000*8,0x10000*8+4 },
{ 8*8+3, 8*8+2, 8*8+1, 8*8+0, 3, 2, 1, 0 },
{ STEP8(0,8) },
16*8 /* every char takes 16 consecutive bytes */
};
static const gfx_layout jongbou_layout1 =
{
8,8, /* 8*8 chars */
1024,
3, /* 3 bits per pixel */
{ 4, 0+0x20000*8, 4+0x20000*8 },
{ 8*8+3, 8*8+2, 8*8+1, 8*8+0, 3, 2, 1, 0 },
{ STEP8(0,8) },
16*8 /* every char takes 16 consecutive bytes */
};
static const gfx_layout jongbou_layout2 =
{
8,8, /* 8*8 chars */
1024,
3, /* 3 bits per pixel */
{ 0, 0+0x28000*8, 4+0x28000*8 },
{ 8*8+3, 8*8+2, 8*8+1, 8*8+0, 3, 2, 1, 0 },
{ STEP8(0,8) },
16*8 /* every char takes 16 consecutive bytes */
};
static const gfx_layout jongbou_layout3 =
{
8,8, /* 8*8 chars */
1024,
3, /* 3 bits per pixel */
{ 4+0x8000*8, 0+0x10000*8, 4+0x10000*8 },
{ 8*8+3, 8*8+2, 8*8+1, 8*8+0, 3, 2, 1, 0 },
{ STEP8(0,8) },
16*8 /* every char takes 16 consecutive bytes */
};
static const gfx_layout jongbou_layout4 =
{
8,8, /* 8*8 chars */
1024,
3, /* 3 bits per pixel */
{ 0x8000*8, 0x18000*8, 4+0x18000*8 },
{ 8*8+3, 8*8+2, 8*8+1, 8*8+0, 3, 2, 1, 0 },
{ STEP8(0,8) },
16*8 /* every char takes 16 consecutive bytes */
};
static const gfx_layout jongbou_layout5 =
{
8,8, /* 8*8 chars */
1024,
3, /* 3 bits per pixel */
{ 4+0x4000*8, 0+0x24000*8, 4+0x24000*8 },
{ 8*8+3, 8*8+2, 8*8+1, 8*8+0, 3, 2, 1, 0 },
{ STEP8(0,8) },
16*8 /* every char takes 16 consecutive bytes */
};
static GFXDECODE_START( gfx_sstingry )
GFXDECODE_ENTRY( "gfx1", 0x00000, sstingry_layout1, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0x00000, sstingry_layout2, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0x10000, sstingry_layout1, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0x10000, sstingry_layout3, 0, 32 )
GFXDECODE_END
static GFXDECODE_START( gfx_kyros )
GFXDECODE_ENTRY( "gfx1", 0x00000, kyros_char_layout1, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0x00000, kyros_char_layout2, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0x18000, kyros_char_layout1, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0x18000, kyros_char_layout2, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0x30000, kyros_char_layout1, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0x30000, kyros_char_layout2, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0x48000, kyros_char_layout1, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0x48000, kyros_char_layout2, 0, 32 )
GFXDECODE_END
static GFXDECODE_START( gfx_jongbou )
GFXDECODE_ENTRY( "gfx1", 0, jongbou_layout1, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0, jongbou_layout2, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0, jongbou_layout3, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0, jongbou_layout4, 0, 32 )
GFXDECODE_ENTRY( "gfx1", 0, jongbou_layout5, 0, 32 )
GFXDECODE_END
/*
*
* Input Defs
*
*/
#define ALPHA68K_PLAYER_INPUT_SWAP_LR_LSB( player, button3, start, active ) \
PORT_BIT( 0x0001, active, IPT_JOYSTICK_UP ) PORT_PLAYER(player) \
PORT_BIT( 0x0002, active, IPT_JOYSTICK_DOWN ) PORT_PLAYER(player) \
PORT_BIT( 0x0004, active, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(player) \
PORT_BIT( 0x0008, active, IPT_JOYSTICK_LEFT ) PORT_PLAYER(player) \
PORT_BIT( 0x0010, active, IPT_BUTTON1 ) PORT_PLAYER(player) \
PORT_BIT( 0x0020, active, IPT_BUTTON2 ) PORT_PLAYER(player) \
PORT_BIT( 0x0040, active, button3 ) PORT_PLAYER(player) \
PORT_BIT( 0x0080, active, start )
#define ALPHA68K_PLAYER_INPUT_SWAP_LR_MSB( player, button3, start, active ) \
PORT_BIT( 0x0100, active, IPT_JOYSTICK_UP ) PORT_PLAYER(player) \
PORT_BIT( 0x0200, active, IPT_JOYSTICK_DOWN ) PORT_PLAYER(player) \
PORT_BIT( 0x0400, active, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(player) \
PORT_BIT( 0x0800, active, IPT_JOYSTICK_LEFT ) PORT_PLAYER(player) \
PORT_BIT( 0x1000, active, IPT_BUTTON1 ) PORT_PLAYER(player) \
PORT_BIT( 0x2000, active, IPT_BUTTON2 ) PORT_PLAYER(player) \
PORT_BIT( 0x4000, active, button3 ) PORT_PLAYER(player) \
PORT_BIT( 0x8000, active, start )
static INPUT_PORTS_START( sstingry )
PORT_START("IN0")
ALPHA68K_PLAYER_INPUT_SWAP_LR_LSB( 1, IPT_UNKNOWN, IPT_START1, IP_ACTIVE_HIGH )
ALPHA68K_PLAYER_INPUT_SWAP_LR_MSB( 2, IPT_UNKNOWN, IPT_START2, IP_ACTIVE_HIGH )
PORT_START("IN1")
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:!1")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x0e, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:!2,!3,!4")
PORT_DIPSETTING( 0x00, "A 1C/1C B 1C/1C" )
PORT_DIPSETTING( 0x02, "A 1C/2C B 2C/1C" )
PORT_DIPSETTING( 0x04, "A 1C/3C B 3C/1C" )
PORT_DIPSETTING( 0x06, "A 1C/4C B 4C/1C" )
PORT_DIPSETTING( 0x08, "A 1C/5C B 5C/1C" )
PORT_DIPSETTING( 0x0a, "A 1C/6C B 6C/1C" )
PORT_DIPSETTING( 0x0c, "A 2C/3C B 7C/1C" )
PORT_DIPSETTING( 0x0e, "A 3C/2C B 8C/1C" )
PORT_DIPNAME( 0x30, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:!5,!6")
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x10, "4" )
PORT_DIPSETTING( 0x20, "5" )
PORT_DIPSETTING( 0x30, "6" )
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:!7")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:!8")
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) )
ALPHA68K_MCU
INPUT_PORTS_END
static INPUT_PORTS_START( kyros )
PORT_START("IN0")
ALPHA68K_PLAYER_INPUT_SWAP_LR_LSB( 1, IPT_UNKNOWN, IPT_START1, IP_ACTIVE_HIGH )
ALPHA68K_PLAYER_INPUT_SWAP_LR_MSB( 2, IPT_UNKNOWN, IPT_START2, IP_ACTIVE_HIGH )
PORT_START("IN1") /* dipswitches */
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:!1")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x0e, 0x0e, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:2,3,4")
PORT_DIPSETTING( 0x0e, "A 1C/1C B 1C/1C" )
PORT_DIPSETTING( 0x06, "A 1C/2C B 2C/1C" )
PORT_DIPSETTING( 0x0a, "A 1C/3C B 3C/1C" )
PORT_DIPSETTING( 0x02, "A 1C/4C B 4C/1C" )
PORT_DIPSETTING( 0x0c, "A 1C/5C B 5C/1C" )
PORT_DIPSETTING( 0x04, "A 1C/6C B 6C/1C" )
PORT_DIPSETTING( 0x08, "A 2C/3C B 7C/1C" )
PORT_DIPSETTING( 0x00, "A 3C/2C B 8C/1C" )
PORT_DIPNAME( 0x30, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:!5,!6")
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x10, "4" )
PORT_DIPSETTING( 0x20, "5" )
PORT_DIPSETTING( 0x30, "6" )
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:!7")
PORT_DIPSETTING( 0x00, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x40, DEF_STR( Hard ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:!8")
PORT_DIPSETTING( 0x80, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )
ALPHA68K_MCU
INPUT_PORTS_END
static INPUT_PORTS_START( jongbou )
PORT_START("IN0")
PORT_BIT( 0x0fff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_START("IN1")
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:!1")
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x01, "5" )
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:!2")
PORT_DIPSETTING( 0x00, "A 1C/1C B 1C/5C" )
PORT_DIPSETTING( 0x02, "A 1C/2C B 1C/3C" )
PORT_DIPNAME( 0x04, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:!3")
PORT_DIPSETTING( 0x00, "30000 - 60000" )
PORT_DIPSETTING( 0x04, "Every 30000" )
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:!4")
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x30, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:!5,!6")
PORT_DIPSETTING( 0x00, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x20, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x10, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x30, DEF_STR( Very_Hard ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:!7")
PORT_DIPSETTING( 0x40, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )
PORT_DIPNAME( 0x80, 0x80, "Show Girls" ) PORT_DIPLOCATION("SW1:!8")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
ALPHA68K_MCU
PORT_START("IN3")
PORT_BIT( 0x0f, 0, IPT_DIAL ) PORT_SENSITIVITY(50) PORT_KEYDELTA(20)
PORT_START("IN4")
PORT_BIT( 0x0f, 0, IPT_DIAL ) PORT_MINMAX(0, 15) PORT_SENSITIVITY(50) PORT_KEYDELTA(20) PORT_PLAYER(2)
INPUT_PORTS_END
/*
*
* Machine Config
*
*/
void alpha68k_N_state::base_config(machine_config &config)
{
MCFG_MACHINE_START_OVERRIDE(alpha68k_N_state,common)
MCFG_MACHINE_RESET_OVERRIDE(alpha68k_N_state,common)
GENERIC_LATCH_8(config, m_soundlatch);
SPEAKER(config, "speaker").front_center();
}
void alpha68k_N_state::video_config(machine_config &config, u8 tile_transchar, u8 tile_bankshift, bool is_super_stingray)
{
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
set_screen_raw_params(config);
m_screen->set_screen_update(FUNC(alpha68k_N_state::screen_update));
m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(alpha68k_N_state::palette_init), 256 + 1, 256);
m_tile_transchar = tile_transchar;
m_tile_bankshift = tile_bankshift;
m_is_super_stingray = is_super_stingray;
}
void sstingray_state::sstingry(machine_config &config)
{
base_config(config);
/* basic machine hardware */
M68000(config, m_maincpu, 6000000); /* 24MHz/4? */
m_maincpu->set_addrmap(AS_PROGRAM, &sstingray_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(sstingray_state::irq1_line_hold));
//m_maincpu->set_periodic_int(FUNC(sstingray_state::irq2_line_hold), attotime::from_hz(60)); // MCU irq
Z80(config, m_audiocpu, 3579545);
m_audiocpu->set_addrmap(AS_PROGRAM, &sstingray_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &sstingray_state::sound_iomap);
m_audiocpu->set_vblank_int("screen", FUNC(sstingray_state::irq0_line_hold));
m_audiocpu->set_periodic_int(FUNC(sstingray_state::nmi_line_pulse), attotime::from_hz(4000));
I8748(config, m_alpha8511, 9263750); /* 9.263750 MHz(?) oscillator, divided by 3*5 internally */
m_alpha8511->bus_in_cb().set(FUNC(sstingray_state::alpha8511_bus_r));
m_alpha8511->bus_out_cb().set(FUNC(sstingray_state::alpha8511_bus_w));
m_alpha8511->p1_in_cb().set(FUNC(sstingray_state::alpha8511_address_r));
m_alpha8511->p2_in_cb().set(FUNC(sstingray_state::alpha8511_rw_r));
m_alpha8511->p2_out_cb().set(FUNC(sstingray_state::alpha8511_control_w));
m_alpha8511->t0_in_cb().set_ioport("IN2").bit(0);
m_alpha8511->t1_in_cb().set_ioport("IN2").bit(1);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sstingry);
video_config(config, 0x40, 0, true);
/* sound hardware */
ym2203_device &ym1(YM2203(config, "ym1", 3000000));
ym1.add_route(ALL_OUTPUTS, "speaker", 0.35);
ym2203_device &ym2(YM2203(config, "ym2", 3000000));
ym2.add_route(ALL_OUTPUTS, "speaker", 0.35);
ym2203_device &ym3(YM2203(config, "ym3", 3000000));
ym3.add_route(ALL_OUTPUTS, "speaker", 0.5);
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.75); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
void kyros_state::kyros(machine_config &config)
{
base_config(config);
/* basic machine hardware */
M68000(config, m_maincpu, 24_MHz_XTAL / 4); /* Verified on bootleg PCB */
m_maincpu->set_addrmap(AS_PROGRAM, &kyros_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(kyros_state::irq1_line_hold));
m_maincpu->set_periodic_int(FUNC(kyros_state::irq2_line_hold), attotime::from_hz(60)); // MCU irq
Z80(config, m_audiocpu, 24_MHz_XTAL / 6); /* Verified on bootleg PCB */
m_audiocpu->set_addrmap(AS_PROGRAM, &kyros_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &kyros_state::sound_iomap);
m_audiocpu->set_vblank_int("screen", FUNC(kyros_state::irq0_line_hold));
m_audiocpu->set_periodic_int(FUNC(kyros_state::nmi_line_pulse), attotime::from_hz(4000));
/* video hardware */
video_config(config, 0x20, 13, false);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_kyros);
/* sound hardware */
ym2203_device &ym1(YM2203(config, "ym1", 24_MHz_XTAL / 12)); /* Verified on bootleg PCB */
ym1.add_route(ALL_OUTPUTS, "speaker", 0.35);
ym2203_device &ym2(YM2203(config, "ym2", 24_MHz_XTAL / 12)); /* Verified on bootleg PCB */
ym2.add_route(ALL_OUTPUTS, "speaker", 0.35);
ym2203_device &ym3(YM2203(config, "ym3", 24_MHz_XTAL / 12)); /* Verified on bootleg PCB */
ym3.add_route(ALL_OUTPUTS, "speaker", 0.9);
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.75); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
void jongbou_state::jongbou(machine_config &config)
{
base_config(config);
/* basic machine hardware */
M68000(config, m_maincpu, 8000000);
m_maincpu->set_addrmap(AS_PROGRAM, &jongbou_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(jongbou_state::irq1_line_hold));
m_maincpu->set_periodic_int(FUNC(jongbou_state::irq2_line_hold), attotime::from_hz(60*16)); // MCU irq
Z80(config, m_audiocpu, 4000000);
m_audiocpu->set_addrmap(AS_PROGRAM, &jongbou_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &jongbou_state::sound_iomap);
m_audiocpu->set_periodic_int(FUNC(jongbou_state::irq0_line_hold), attotime::from_hz(160*60));
/* video hardware */
video_config(config, 0x20, 11, false);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_jongbou);
/* sound hardware */
ay8910_device &aysnd(AY8910(config, "aysnd", 2000000));
aysnd.port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read));
aysnd.add_route(ALL_OUTPUTS, "speaker", 0.65);
}
ROM_START( sstingry )
ROM_REGION( 0x20000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_BYTE( "ss_05.rom", 0x0000, 0x4000, CRC(bfb28d53) SHA1(64a1b8627529ed13074bb949cb104077eb3eac1f) )
ROM_LOAD16_BYTE( "ss_07.rom", 0x0001, 0x4000, CRC(eb1b65c5) SHA1(cffc4df82b7950358dd28f6a492e0aefaff73048) )
ROM_LOAD16_BYTE( "ss_04.rom", 0x8000, 0x4000, CRC(2e477a79) SHA1(0af9238979c8a740ba49776cd65ffbc024339621) )
ROM_LOAD16_BYTE( "ss_06.rom", 0x8001, 0x4000, CRC(597620cb) SHA1(5549df4843e029df17ce5de2159cc82bd985804b) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound cpu */
ROM_LOAD( "ss_01.rom", 0x0000, 0x4000, CRC(fef09a92) SHA1(77b6aded1eed1bd5e6ffb25b56b62b10b7b9a304) )
ROM_LOAD( "ss_02.rom", 0x4000, 0x4000, CRC(ab4e8c01) SHA1(d96e7f97945fff48fb7b4661fdb575ac7ff77445) )
ROM_REGION( 0x0400, "alpha8511", 0 ) /* 8748 MCU code */
// Was this dumped from a bootleg? The original "ALPHA-8511" MCU appears to be some sort of Hitachi part.
ROM_LOAD( "d8748.bin", 0x0000, 0x0400, CRC(7fcbfc30) SHA1(6d087a3d44e475b6c8260a5134952097f26459b7) )
ROM_REGION( 0x60000, "gfx1", 0 )
ROM_LOAD( "ss_12.rom", 0x00000, 0x4000, CRC(74caa9e9) SHA1(9f0874b2fcdf45acb941bd56b44bf2b9b08641e9) )
ROM_LOAD( "ss_08.rom", 0x08000, 0x4000, CRC(32368925) SHA1(af26f73d33936410063de3164ec80f45bed487c7) )
ROM_LOAD( "ss_13.rom", 0x10000, 0x4000, CRC(13da6203) SHA1(afa778c26da1adfdc8b2e2a1c7b2b46944b5d008) )
ROM_LOAD( "ss_10.rom", 0x18000, 0x4000, CRC(2903234a) SHA1(552295ec60469227883eafb6756c86abc20455b5) )
ROM_LOAD( "ss_11.rom", 0x20000, 0x4000, CRC(d134302e) SHA1(4c020ff41458c738596ab7a094d4a33a6dda64bf) )
ROM_LOAD( "ss_09.rom", 0x28000, 0x4000, CRC(6f9d938a) SHA1(eb6934f8eaa7b22441ec4470280f228fe5f134a3) )
ROM_REGION( 0x300, "proms", 0 )
ROM_LOAD( "ic92", 0x0000, 0x0100, CRC(e7ce1179) SHA1(36835c46c1c3f820df39c59c16c362db07b32dc9) )
ROM_LOAD( "ic93", 0x0100, 0x0100, CRC(9af8a375) SHA1(abb8b094a2df41acea688f87004207dc35233db5) )
ROM_LOAD( "ic91", 0x0200, 0x0100, CRC(c3965079) SHA1(6b1f22afd2a849f0003ddcad344079e8043681f9) )
ROM_REGION( 0x200, "clut_proms", 0 )
ROM_LOAD( "ssprom2.bin", 0x0100, 0x0100, CRC(c2205b71) SHA1(a7db60ac7d559fe53a35264fab17f1d5e48d3f10) )
ROM_LOAD( "ssprom1.bin", 0x0000, 0x0100, CRC(1003186c) SHA1(e50b60036d6b32a4d524c92d35c4d9901ee7ec0e) )
ROM_END
ROM_START( kyros )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD16_BYTE( "2.10c", 0x00000, 0x4000, CRC(4bd030b1) SHA1(e503dae8e12995ab0a551022a848a62315908e8b) )
ROM_CONTINUE ( 0x10000, 0x4000 )
ROM_LOAD16_BYTE( "1.13c", 0x00001, 0x4000, CRC(75cfbc5e) SHA1(2a70c56fd7192279157df8294743038a7ed7e68d) )
ROM_CONTINUE ( 0x10001, 0x4000 )
ROM_LOAD16_BYTE( "4.10b", 0x08000, 0x4000, CRC(be2626c2) SHA1(c3b01ec4b65172560a993b37421df6a61b780e43) )
ROM_CONTINUE ( 0x18000, 0x4000 )
ROM_LOAD16_BYTE( "3.13b", 0x08001, 0x4000, CRC(fb25e71a) SHA1(fab8fcbd2c5a8600d6e8577de4875e409cad723b) )
ROM_CONTINUE ( 0x18001, 0x4000 )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
ROM_LOAD( "2s.1f", 0x00000, 0x4000, CRC(800ceb27) SHA1(4daa1b8adcad7a90cfd5d20704a7c431673c4995) )
ROM_LOAD( "1s.1d", 0x04000, 0x8000, CRC(87d3e719) SHA1(4b8b1b600c7c1de3a77030001e7e6f0ff118f294) )
// not hooked up yet
ROM_REGION( 0x1000, "mcu", 0 )
ROM_LOAD( "kyros_68705u3.bin", 0x0000, 0x1000, CRC(c20880b7) SHA1(b041c36cbc4f348d74e0548df5cb14727f2d353b) ) // this one is from a bootleg PCB, program code *might* be compatible.
ROM_LOAD( "kyros_mcu.bin", 0x0800, 0x0800, BAD_DUMP CRC(3a902a19) SHA1(af1be8894c899b27b1106663ffaf2ab43fa1cdaa) ) // original MCU? (HD6805U1) zero-page ROM not dumped
ROM_REGION( 0x60000, "gfx1", 0 )
ROM_LOAD( "8.9pr", 0x00000, 0x8000, CRC(c5290944) SHA1(ec97482dc59220002780ae4d02be4cd172cf65ac) )
ROM_LOAD( "11.11m", 0x08000, 0x8000, CRC(fbd44f1e) SHA1(d095544ea76674a7ad17c1b8c88614e65890281c) )
ROM_LOAD( "12.11n", 0x10000, 0x8000, CRC(10fed501) SHA1(71c0b4b94f86046745105307938f6e2c5661e2a1) )
ROM_LOAD( "9.9s", 0x18000, 0x8000, CRC(dd40ca33) SHA1(91a1d8b6b69fb0d27ed315cd2591f352360bc8e7) )
ROM_LOAD( "13.11p", 0x20000, 0x8000, CRC(e6a02030) SHA1(0de58f8cc69dc76d4b0a45fba04972634a4021a6) )
ROM_LOAD( "14.11r", 0x28000, 0x8000, CRC(722ad23a) SHA1(0e1be976c5a406e33236def5a0dce73911ebac28) )
ROM_LOAD( "15.3t", 0x30000, 0x8000, CRC(045fdda4) SHA1(ac25368e446e6dcfb3ed244e7d6d699f917c202d) )
ROM_LOAD( "17.7t", 0x38000, 0x8000, CRC(7618ec00) SHA1(7346ba41fd2b04e404225726ede2e42e62ca7901) )
ROM_LOAD( "18.9t", 0x40000, 0x8000, CRC(0ee74171) SHA1(1fda8a1066eb7dafeaeffebfe718b408b34f1767) )
ROM_LOAD( "16.5t", 0x48000, 0x8000, CRC(2cf14824) SHA1(07f6b232c4ca6c42b3f75443b0328653f5a3f71d) )
ROM_LOAD( "19.11t", 0x50000, 0x8000, CRC(4f336306) SHA1(83e0c021d2732d3199c70ac433a31863075a5a72) )
ROM_LOAD( "20.13t", 0x58000, 0x8000, CRC(a165d06b) SHA1(ef7f38a71c2f3fc836b28f0eac1c14a3877f0802) )
ROM_REGION( 0x300, "proms", 0 )
ROM_LOAD( "mb7114l.5r", 0x000, 0x100, CRC(3628bf36) SHA1(33b7b873a6e5da59f535d754f8c8257c0f4d0a31) )
ROM_LOAD( "mb7114l.4r", 0x100, 0x100, CRC(850704e4) SHA1(8a9da9efc7bc6a037d4cd27152b853a7839ccd67) )
ROM_LOAD( "mb7114l.6r", 0x200, 0x100, CRC(a54f60d7) SHA1(af039dee847913cb79f85d7abf4846322bba2e5b) )
ROM_REGION( 0x200, "clut_proms", 0 )
ROM_LOAD( "mb7114l.5p", 0x100, 0x100, CRC(1cc53765) SHA1(2b665f3e24ddb3ab591273f027ff7740f1c97e27) )
ROM_LOAD( "mb7114l.6p", 0x000, 0x100, CRC(b0d6971f) SHA1(4aa2e9a89f9ea7487433e54ef4aa95a632477c4f) )
ROM_REGION( 0x2000, "color_proms", 0 )
ROM_LOAD( "0.1t", 0x0000,0x2000, CRC(5d0acb4c) SHA1(52fcdcb2bf6d6ada04aa447b5526c39848bf587f) )
ROM_END
ROM_START( kyrosj )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD16_BYTE( "2j.10c",0x00000, 0x4000, CRC(b324c11b) SHA1(9330ee0db8555a3623118c7bc5363b4f6fa87dbc) )
ROM_CONTINUE ( 0x10000, 0x4000 )
ROM_LOAD16_BYTE( "1j.13c",0x00001, 0x4000, CRC(8496241b) SHA1(474cdce735dcc2ff2111ae2f4cd11c0d27a4b4fc) )
ROM_CONTINUE ( 0x10001, 0x4000 )
ROM_LOAD16_BYTE( "4.10a", 0x08000, 0x4000, CRC(0187f59d) SHA1(3bc1b811cb29aa33c38bc8c76e066c8b37104167) )
ROM_CONTINUE ( 0x18000, 0x4000 )
ROM_LOAD16_BYTE( "3.13a", 0x08001, 0x4000, CRC(ab97941d) SHA1(014a55540e1777de5bee23e59773dbbd7efa8f91) )
ROM_CONTINUE ( 0x18001, 0x4000 )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
ROM_LOAD( "2s.1f", 0x00000, 0x4000, CRC(800ceb27) SHA1(4daa1b8adcad7a90cfd5d20704a7c431673c4995) )
ROM_LOAD( "1s.1d", 0x04000, 0x8000, CRC(87d3e719) SHA1(4b8b1b600c7c1de3a77030001e7e6f0ff118f294) )
ROM_REGION( 0x1000, "mcu", 0 ) // these comes from original set
ROM_LOAD( "kyros_68705u3.bin", 0x0000, 0x1000, BAD_DUMP CRC(c20880b7) SHA1(b041c36cbc4f348d74e0548df5cb14727f2d353b) ) // this one is from a bootleg PCB, program code *might* be compatible.
ROM_LOAD( "kyros_mcu.bin", 0x0800, 0x0800, BAD_DUMP CRC(3a902a19) SHA1(af1be8894c899b27b1106663ffaf2ab43fa1cdaa) ) // original MCU? (HD6805U1)
ROM_REGION( 0x60000, "gfx1", 0 )
ROM_LOAD( "8.9r", 0x00000, 0x8000, CRC(d8203284) SHA1(7dede410239be6b674644fa76c91dd01837f841f) )
ROM_LOAD( "11.12m", 0x08000, 0x8000, CRC(a2f9738c) SHA1(31be81274bf70674bf0c32fcddbacf0f58d8f897) )
ROM_LOAD( "12.11n", 0x10000, 0x8000, CRC(10fed501) SHA1(71c0b4b94f86046745105307938f6e2c5661e2a1) )
ROM_LOAD( "9j.9s", 0x18000, 0x8000, CRC(3e725349) SHA1(79c431d83a0f0d5e0d69086f54f6e60a42b69e14) )
ROM_LOAD( "13.11p", 0x20000, 0x8000, CRC(e6a02030) SHA1(0de58f8cc69dc76d4b0a45fba04972634a4021a6) )
ROM_LOAD( "14.12r", 0x28000, 0x8000, CRC(39d07db9) SHA1(05c0785eea29bc6329892f1e8f0bd37327163080) )
ROM_LOAD( "15.3t", 0x30000, 0x8000, CRC(045fdda4) SHA1(ac25368e446e6dcfb3ed244e7d6d699f917c202d) )
ROM_LOAD( "17.7t", 0x38000, 0x8000, CRC(7618ec00) SHA1(7346ba41fd2b04e404225726ede2e42e62ca7901) )
ROM_LOAD( "18.9t", 0x40000, 0x8000, CRC(0ee74171) SHA1(1fda8a1066eb7dafeaeffebfe718b408b34f1767) )
ROM_LOAD( "16j.5t", 0x48000, 0x8000, CRC(e1566679) SHA1(3653c3160798bea203e1c7713043729b356a7358) )
ROM_LOAD( "19.11t", 0x50000, 0x8000, CRC(4f336306) SHA1(83e0c021d2732d3199c70ac433a31863075a5a72) )
ROM_LOAD( "20j.13t",0x58000, 0x8000, CRC(0624b4c0) SHA1(a8ebdb1f9b7fd0b78102b54523e8680aaa8bcf42) )
ROM_REGION( 0x300, "proms", 0 )
ROM_LOAD( "mb7114l.5r", 0x000, 0x100, CRC(3628bf36) SHA1(33b7b873a6e5da59f535d754f8c8257c0f4d0a31) )
ROM_LOAD( "mb7114l.4r", 0x100, 0x100, CRC(850704e4) SHA1(8a9da9efc7bc6a037d4cd27152b853a7839ccd67) )
ROM_LOAD( "mb7114l.6r", 0x200, 0x100, CRC(a54f60d7) SHA1(af039dee847913cb79f85d7abf4846322bba2e5b) )
ROM_REGION( 0x200, "clut_proms", 0 )
ROM_LOAD( "mb7114l.5p", 0x100, 0x100, CRC(1cc53765) SHA1(2b665f3e24ddb3ab591273f027ff7740f1c97e27) )
ROM_LOAD( "mb7114l.6p", 0x000, 0x100, CRC(b0d6971f) SHA1(4aa2e9a89f9ea7487433e54ef4aa95a632477c4f) )
ROM_REGION( 0x2000, "color_proms", 0 )
ROM_LOAD( "0j.1t", 0x0000,0x2000, CRC(a34ecb29) SHA1(60a0b0cfcd2d9830bc112774bac700ded40d4afb) )
ROM_END
ROM_START( jongbou )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD16_BYTE( "p2.a13", 0x00000, 0x10000, CRC(ee59e67a) SHA1(d73f15994879c645a8021dcd4f53948bcbd0748e) )
ROM_LOAD16_BYTE( "p1.a15", 0x00001, 0x10000, CRC(1ab6803e) SHA1(a217138332d61b8f5996ead0280c970481db9abe) )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "p7.i1", 0x00000, 0x8000, CRC(88d74794) SHA1(98dbbb4d88c1e96a0e251e39ef43b02bd68e0bba) )
ROM_REGION( 0x10000, "mcu", 0 )
ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP )
ROM_REGION( 0x30000, "gfx1", 0 )
ROM_LOAD( "p6.l15", 0x00000, 0x10000, CRC(1facee65) SHA1(6c98338c616e53106960063d0d31483131b492b0) )
ROM_LOAD( "p5.k15", 0x10000, 0x10000, CRC(db0ad6bb) SHA1(c2ce0e78a4be9314f4f14ea87f521a79bab3697c) )
ROM_LOAD( "p4.j15", 0x20000, 0x10000, CRC(56842cfa) SHA1(141ed992332540487cec951eab61c18be994b618) )
ROM_REGION( 0x300, "proms", 0 )
ROM_LOAD( "r.k2", 0x0000, 0x0100, CRC(0563235a) SHA1(c337a9a15c1a27012a963fc4e1345605aaa1401f) )
ROM_LOAD( "g.k1", 0x0100, 0x0100, CRC(81fc51f2) SHA1(92df86898a1cc1fa2faf620466737f4e1cf83a58) )
ROM_LOAD( "b.k3", 0x0200, 0x0100, CRC(6dfeba56) SHA1(abf569c400dc4366a0c7e483dbb672c089692c7e) )
ROM_REGION( 0x200, "clut_proms", 0 )
ROM_LOAD( "h.l9", 0x0100, 0x0100, CRC(e6e93b0b) SHA1(f64ff63699451910982a1a44c94ccd2c18fd389e) )
ROM_LOAD( "l.l10", 0x0000, 0x0100, CRC(51676dac) SHA1(685d14f448501a63cc9fa063f65842caddad8f39) )
ROM_REGION( 0x2000, "color_proms", 0 )
ROM_LOAD( "p3.i15", 0x0000, 0x2000, CRC(8c09cd2a) SHA1(317764e0f5af29e78fd764bdf28579bf6be5630f) )
ROM_END
void sstingray_state::init_sstingry()
{
m_invert_controls = 0;
m_microcontroller_id = 0x00ff;
m_coin_id = 0x22 | (0x22 << 8);
m_game_id = 0;
m_alpha8511_sync_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sstingray_state::alpha8511_sync), this));
save_item(NAME(m_alpha8511_address));
save_item(NAME(m_alpha8511_control));
save_item(NAME(m_alpha8511_read_mode));
}
void kyros_state::init_kyros()
{
m_invert_controls = 0;
m_microcontroller_id = 0x0012;
m_coin_id = 0x22 | (0x22 << 8);
m_game_id = ALPHA68K_KYROS;
}
void jongbou_state::init_jongbou()
{
m_invert_controls = 0;
m_microcontroller_id = 0x00ff;
m_coin_id = 0x23 | (0x24 << 8);
m_game_id = ALPHA68K_JONGBOU;
}
GAME( 1986, sstingry, 0, sstingry, sstingry, sstingray_state, init_sstingry, ROT90, "Alpha Denshi Co.", "Super Stingray (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
GAME( 1987, kyros, 0, kyros, kyros, kyros_state, init_kyros, ROT90, "Alpha Denshi Co. (World Games Inc. license)", "Kyros", MACHINE_SUPPORTS_SAVE )
GAME( 1986, kyrosj, kyros, kyros, kyros, kyros_state, init_kyros, ROT90, "Alpha Denshi Co.", "Kyros no Yakata (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, jongbou, 0, jongbou, jongbou, jongbou_state, init_jongbou, ROT90, "SNK", "Mahjong Block Jongbou (Japan)", MACHINE_SUPPORTS_SAVE )