New clones marked not working

-----------------------------
Jin Hu Lu 2 (v120GI) [dyq. little0, Guru]
This commit is contained in:
Ivan Vangelista 2025-03-08 07:42:31 +01:00
parent fb6b48711a
commit a026c8df12
4 changed files with 314 additions and 105 deletions

View File

@ -476,6 +476,7 @@ const double XTAL::known_xtals[] = {
48'556'800, // 48.5568_MHz_XTAL Wyse WY-85
48'654'000, // 48.654_MHz_XTAL Qume QVT-201
48'660'000, // 48.66_MHz_XTAL Zaxxon
48'940'000, // 48.94_MHz_XTAL Queen Bee New
49'152'000, // 49.152_MHz_XTAL Used on some Namco PCBs, Baraduke h/w, System 21, Super System 22
49'423'500, // 49.4235_MHz_XTAL Wyse WY-185
50'000'000, // 50_MHz_XTAL Williams/Midway T/W/V-unit system

View File

@ -30,6 +30,9 @@
- 3super8 randomly crashes
- 3super8 doesn't have the 8x32 tilemap, change the video emulation accordingly
- jinhulu2 stops at "system is connecting". Some type of link feature?
- jinhulu2 has wrong colors and machine translated DIP definitions which
could use improving. Inputs in the "SERVICE" port seem to register two different
buttons
***************************************************************************/
@ -39,6 +42,7 @@
#include "cpu/z80/z80.h"
#include "machine/i8255.h"
#include "machine/nvram.h"
#include "sound/ay8910.h"
#include "sound/okim6295.h"
#include "sound/ymopl.h"
@ -48,6 +52,16 @@
#include "tilemap.h"
// configurable logging
#define LOG_IGS003 (1U << 1)
// #define VERBOSE (LOG_GENERAL | LOG_IGS003)
#include "logmacro.h"
#define LOGIGS003(...) LOGMASKED(LOG_IGS003, __VA_ARGS__)
namespace {
class spoker_state : public driver_device
@ -66,14 +80,14 @@ public:
m_leds(*this, "led%u", 0U)
{ }
void spoker(machine_config &config);
void _3super8(machine_config &config);
void spoker(machine_config &config) ATTR_COLD;
void _3super8(machine_config &config) ATTR_COLD;
void init_spk100();
void init_spk114it();
void init_spk116it();
void init_spk120in();
void init_3super8();
void init_spk100() ATTR_COLD;
void init_spk114it() ATTR_COLD;
void init_spk116it() ATTR_COLD;
void init_spk120in() ATTR_COLD;
void init_3super8() ATTR_COLD;
int hopper_r();
@ -94,7 +108,7 @@ protected:
required_shared_ptr<uint8_t> m_fg_color_ram;
tilemap_t *m_fg_tilemap = nullptr;
required_ioport_array<5> m_dsw;
optional_ioport_array<5> m_dsw;
output_finder<7> m_leds;
// common
@ -132,9 +146,9 @@ class spokeru_state : public spoker_state
public:
using spoker_state::spoker_state;
void spokeru(machine_config &config);
void spokeru(machine_config &config) ATTR_COLD;
void init_spokeru();
void init_spokeru() ATTR_COLD;
protected:
virtual void video_start() override ATTR_COLD;
@ -155,12 +169,23 @@ public:
spokeru_state(mconfig, type, tag)
{ }
void jinhulu2(machine_config &config);
void jinhulu2(machine_config &config)ATTR_COLD;
void init_jinhulu2();
void init_jinhulu2() ATTR_COLD;
void init_jinhulu2120gi() ATTR_COLD;
protected:
virtual void machine_start() override ATTR_COLD;
virtual void video_start() override ATTR_COLD;
private:
uint8_t m_protection_res = 0;
void nmi_w(uint8_t data);
uint8_t igs003c_r();
void igs003c_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
void portmap(address_map &map) ATTR_COLD;
};
@ -215,6 +240,12 @@ TILE_GET_INFO_MEMBER(spoker_state::get_fg_tile_info)
tileinfo.set(0, code, (4 * (code >> 14) + 3), 0);
}
TILE_GET_INFO_MEMBER(jinhulu2_state::get_fg_tile_info) // TODO: wrong color bits
{
int const code = m_fg_tile_ram[tile_index] | (m_fg_color_ram[tile_index] << 8);
tileinfo.set(0, code, 2 * (code >> 13), 0);
}
void spoker_state::fg_tile_w(offs_t offset, uint8_t data)
{
m_fg_tile_ram[offset] = data;
@ -257,6 +288,11 @@ void spokeru_state::video_start()
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(spokeru_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
}
void jinhulu2_state::video_start()
{
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(jinhulu2_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
}
void jb_state::video_start()
{
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(jb_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
@ -473,6 +509,33 @@ uint8_t spoker_state::magic_r()
return 0;
}
uint8_t jinhulu2_state::igs003c_r()
{
LOGIGS003("PC %06X: Protection read %02x\n", m_maincpu->pc(), m_protection_res);
return m_protection_res;
}
void jinhulu2_state::igs003c_w(uint8_t data)
{
switch (data)
{
// case 0x01: break; // TODO: possibly selects inputs read by the SYSTEM port?
case 0x02: m_protection_res = ioport("IN0")->read(); break;
case 0x20: m_protection_res = 0x49; break;
case 0x21: m_protection_res = 0x47; break;
case 0x22: m_protection_res = 0x53; break;
case 0x24: m_protection_res = 0x41; break;
case 0x25: m_protection_res = 0x41; break;
case 0x26: m_protection_res = 0x7f; break;
case 0x27: m_protection_res = 0x41; break;
case 0x28: m_protection_res = 0x41; break;
case 0x2a: m_protection_res = 0x3e; break;
case 0x2b: m_protection_res = 0x41; break;
default: LOGIGS003("PC %06X: Protection write %02x\n", m_maincpu->pc(), data); m_protection_res = data;
}
}
/***************************************************************************
Memory Maps
@ -534,14 +597,14 @@ void jinhulu2_state::portmap(address_map &map)
map(0x0000, 0x003f).ram(); // Z180 internal regs
map(0x2000, 0x20ff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0x3000, 0x30ff).ram().w(m_palette, FUNC(palette_device::write8_ext)).share("palette_ext");
// TODO: the following reads may be hooked to the wrong inputs
map(0x4000, 0x4000).portr("DSW1");
map(0x4000, 0x4000).portr("DSW3");
map(0x4001, 0x4001).portr("DSW2");
map(0x4002, 0x4002).portr("DSW3");
map(0x4002, 0x4002).portr("DSW1");
map(0x5001, 0x5001).portr("SERVICE");
map(0x5002, 0x5003).w("ymsnd", FUNC(ym2149_device::data_address_w));
map(0x5010, 0x5010).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
//map(0x5030, 0x5030).w(FUNC()); // TODO: almost surely same protections as seen in igspoker.cpp and igs011.cpp. Probably the IGS003
//map(0x5031, 0x5031).r(FUNC()); // TODO: "
map(0x5030, 0x5030).w(FUNC(jinhulu2_state::igs003c_w));
map(0x5031, 0x5031).r(FUNC(jinhulu2_state::igs003c_r));
map(0x5031, 0x5031).w(FUNC(jinhulu2_state::nmi_w));
map(0x7000, 0x77ff).ram().w(FUNC(jinhulu2_state::fg_tile_w)).share(m_fg_tile_ram);
map(0x7800, 0x7fff).ram().w(FUNC(jinhulu2_state::fg_color_w)).share(m_fg_color_ram);
@ -1240,6 +1303,101 @@ static INPUT_PORTS_START( jb )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
static INPUT_PORTS_START( jinhulu2 ) // these are verified for v120GI
PORT_START("DSW1")
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( 0x06, 0x06, "Auto Hold" ) PORT_DIPLOCATION("SW1:2,3")
PORT_DIPSETTING( 0x06, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPSETTING( 0x02, "Only When Winning" )
PORT_DIPSETTING( 0x00, "Only When Winning (duplicate)" )
PORT_DIPNAME( 0x08, 0x08, "Credit Limit" ) PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x08, "4000" )
PORT_DIPSETTING( 0x00, "Unlimited" )
PORT_DIPNAME( 0x70, 0x70, "Minimum Bet For Bonus" ) PORT_DIPLOCATION("SW1:5,6,7")
PORT_DIPSETTING( 0x70, "1" )
PORT_DIPSETTING( 0x60, "10" )
PORT_DIPSETTING( 0x50, "20" )
PORT_DIPSETTING( 0x40, "50" )
PORT_DIPSETTING( 0x30, "80" )
PORT_DIPSETTING( 0x20, "100" )
PORT_DIPSETTING( 0x10, "120" )
PORT_DIPSETTING( 0x00, "150" )
PORT_DIPNAME( 0x80, 0x80, "Card Opening And Scoring Speed" ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x80, "Slow" )
PORT_DIPSETTING( 0x00, "Fast" )
PORT_START("DSW2")
PORT_DIPNAME( 0x03, 0x03, "Minimum Bet" ) PORT_DIPLOCATION("SW2:1,2")
PORT_DIPSETTING( 0x03, "1" )
PORT_DIPSETTING( 0x02, "5" )
PORT_DIPSETTING( 0x01, "10" )
PORT_DIPSETTING( 0x00, "20" )
PORT_DIPNAME( 0x1c, 0x1c, "Start Points" ) PORT_DIPLOCATION("SW2:3,4,5")
PORT_DIPSETTING( 0x1c, "10" )
PORT_DIPSETTING( 0x18, "20" )
PORT_DIPSETTING( 0x14, "40" )
PORT_DIPSETTING( 0x10, "50" )
PORT_DIPSETTING( 0x0c, "100" )
PORT_DIPSETTING( 0x08, "200" )
PORT_DIPSETTING( 0x04, "250" )
PORT_DIPSETTING( 0x00, "500" )
PORT_DIPNAME( 0x20, 0x20, "Light Points" ) PORT_DIPLOCATION("SW2:6")
PORT_DIPSETTING( 0x20, "10" )
PORT_DIPSETTING( 0x00, "100" )
PORT_DIPNAME( 0x40, 0x40, "Double-Up Limit" ) PORT_DIPLOCATION("SW2:7")
PORT_DIPSETTING( 0x40, "5000" )
PORT_DIPSETTING( 0x00, "7500" )
PORT_DIPNAME( 0x80, 0x80, "Four Plum Multiplier" ) PORT_DIPLOCATION("SW2:8")
PORT_DIPSETTING( 0x80, "40" )
PORT_DIPSETTING( 0x00, "60" )
PORT_START("DSW3")
PORT_DIPNAME( 0x03, 0x03, "Double-Up Limit Base Number" ) PORT_DIPLOCATION("SW3:1,2")
PORT_DIPSETTING( 0x03, "100" )
PORT_DIPSETTING( 0x02, "200" )
PORT_DIPSETTING( 0x01, "300" )
PORT_DIPSETTING( 0x00, "400" )
PORT_DIPNAME( 0x0c, 0x0c, "Double-Up Accumulated Jackpot" ) PORT_DIPLOCATION("SW3:3,4")
PORT_DIPSETTING( 0x0c, "300" )
PORT_DIPSETTING( 0x08, "500" )
PORT_DIPSETTING( 0x04, "800" )
PORT_DIPSETTING( 0x00, "1000" )
PORT_DIPNAME( 0x30, 0x30, "Payout Rate" ) PORT_DIPLOCATION("SW3:5,6")
PORT_DIPSETTING( 0x30, "20000" )
PORT_DIPSETTING( 0x20, "30000" )
PORT_DIPSETTING( 0x10, "40000" )
PORT_DIPSETTING( 0x00, "50000" )
PORT_DIPNAME( 0x40, 0x40, "Double-Up Card Opening Speed" ) PORT_DIPLOCATION("SW3:7")
PORT_DIPSETTING( 0x40, "Slow" )
PORT_DIPSETTING( 0x00, "Fast" )
PORT_DIPNAME( 0x80, 0x80, "Continuous Card Opening" ) PORT_DIPLOCATION("SW3:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD4 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_POKER_HOLD3 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD5 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("SERVICE")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) // lights both Bet and Keyout in test mode
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) // lights both Book-Keeping and Small in test mode
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) // lights both Start and Big
PORT_SERVICE_NO_TOGGLE( 0x10, IP_ACTIVE_LOW ) // lights both Test and Take Score in test mode
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) // lights both Hold 1 and Double Up in test mode
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_POKER_HOLD2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
/***************************************************************************
Graphics Layout & Graphics Decode
@ -1298,13 +1456,13 @@ static GFXDECODE_START( gfx_3super8 )
GFXDECODE_ENTRY( "gfx2", 0x00000, layout_8x32x6, 0, 16 )
GFXDECODE_END
// TODO: probably correct but to be verified once it passes the connection check
// TODO: bitplane order probably wrong
static const gfx_layout layout_8x8x4 =
{
8, 8,
RGN_FRAC(1, 1),
4,
{ STEP4(24, -8) },
{ 0, 8, 16, 24 },
{ STEP8(0, 1) },
{ STEP8(0, 8*4) },
8*8*4
@ -1334,6 +1492,13 @@ void spoker_state::machine_start()
save_item(NAME(m_igs_magic));
}
void jinhulu2_state::machine_start()
{
spoker_state::machine_start();
save_item(NAME(m_protection_res));
}
void spoker_state::machine_reset()
{
m_nmi_ack = 0;
@ -1404,8 +1569,11 @@ void jinhulu2_state::jinhulu2(machine_config &config)
spokeru(config);
m_maincpu->set_addrmap(AS_IO, &jinhulu2_state::portmap);
m_maincpu->set_clock(12_MHz_XTAL);
m_gfxdecode->set_info(gfx_jinhulu2);
YM2149(config.replace(), "ymsnd", 12_MHz_XTAL / 12).add_route(ALL_OUTPUTS, "mono", 0.5);
}
@ -1795,45 +1963,51 @@ ROM_END
/*********************************************************************************
Jin Hu Lu 2, IGS (year unknown, board dead/rotten, battery leaked EXTENSIVELY and killed it)
This is a Poker game.
Board is a mix of through-hole and surface mounted parts (lots of logic is SMD).
Some chips have year 1999 so this is 1999 or later.
Jin Hu Lu 2, IGS, 1995
Hu Lu Wang II, IGS, 1995
These are Poker / Card games.
Board is a mix of through-hole and surface mounted parts (lots of SMD logic).
Hardware Info By Guru
---------------------
PCB Layout
----------
IGS PCB No- 0202 - :
|--------------------------------------------|
|SW4 BATTERY 12MHz Z180 |
| |
|1 |
|8 T518B PRG.U40|
|W PAL |
|A PAL 6264 |
|Y 2149C PAL |
| PAL SKT |
| IGS-003C |
| |
|1 |
|0 IGS002 |
|W |
|A IGS001A |
|Y VOL 6264 6264 |
| UPC1242 M6295 27C4002.U39|
|7805 SP_U12.U12 SW1 SW2 SW3 |
|--------------------------------------------|
IGS PCB NO-0202-
IGS PCB NO-0202-2
|------------------------------------------|
| BATT 12MHz P1 |
|-| SW4 Z180 |
|18 |
|OR T518B PRG.U40|
|22 TLP521(x20) PAL |
|WAY PAL 6264*|
| 2149C PAL |
|-| PAL PAL |
| IGS-003C |
|-| ULN2004 |
|1 |------| |
|0 |IGS002| |
|W |-------| |------| |
|A |IGS001A| |
|Y VOL 6264 |-------| 6264 |
|-|UPC1242 M6295 GFX.U39|
| 7805 SP.U12 SW1 SW2 SW3 |
|------------------------------------------|
Notes:
2149C - Might be an 8255 PPI. Definitely not a YM2149 ;-)
Z180 - Zilog Z8018008PSC Z180 MPU. Chip rated at 8MHz so clock input likely to be 6MHz [12/2]
IGS003C - In a socket but marked on PCB as 'ASIC3' (which is unusual) so could be a custom chip and not a ROM?
IGS001/2 - Custom IGS Chip (QFP80)
6264 - 8kBx8-bit SRAM
SKT - Empty socket, missing PAL maybe?
M6295 - Oki Sound Chip. Clock input possibly 1.000MHz [12/12]
T518B - Reset Chip
2149C - 2149C - Marked '2149C 9913'. This is a clone YM2149. Clock Input 1.000MHz [12/12]
Z180 - Zilog Z8018008PSC or HD64B180ROP Z180 MPU. Chip rated at 8MHz but crystal input on pin 2 is 12MHz
Clock Out on pin 64 is 6.000MHz
IGS003C - In a socket but marked on PCB as 'ASIC3' (which is unusual). It's an IGS custom chip.
IGS001/002 - Custom IGS Chip (QFP80)
6264 - 8kB x8-bit SRAM. *=This RAM is battery-backed.
M6295 - OKI M6295 4-Channel ADPCM Voice Synthesis LSI. Clock Input 1.000MHz [12/12]. Pin 7 HIGH.
T518B - Mitsumi T518B Reset Chip
ULN2004 - ULN2004 7-Channel Darlington Transistor Array
SW1/2/3 - 8-Position DIP Switch
SP_U12.U12 - OKI Samples. Board printed '27C020' but actual chip is Intel FLASH P28F001
SW4 - Toggle Switch for NVRAM Clear and Reset
P1 - 4-Pin Link Connector
BATT - 3.6V Ni-Cad Battery
PRG.U40 - 27C512 EPROM (main program)
GFX.U39 - 27C4002 or 27C4096 EPROM (Graphics/Tiles)
SP.U12 - OKI Samples. Board printed '27C020' but actual chip is Intel FLASH P28F001
*********************************************************************************/
@ -1849,6 +2023,18 @@ ROM_START( jinhulu2 )
ROM_LOAD( "sp_u12.u12", 0x00000, 0x20000, CRC(1aeb078c) SHA1(9b8a256f51e66733c4ec30b451ca0711ed02318e) )
ROM_END
ROM_START( jinhulu2120gi )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "prg.u40", 0x00000, 0x10000, CRC(379a2965) SHA1(fbff8a6a3b378cac116d8c630082fc866f85ac6b) )
ROM_REGION( 0x40000, "tiles", 0 )
ROM_LOAD( "gfx.u39", 0x00000, 0x40000, CRC(d5bc6a5d) SHA1(26b83229e4a2b2502f1e9af31c71872d7d12bf93) ) // 1xxxxxxxxxxxxxxxxxx = 0xFF
ROM_IGNORE( 0x40000 )
ROM_REGION( 0x40000, "oki", 0 )
ROM_LOAD( "sp.u12", 0x00000, 0x20000, CRC(1aeb078c) SHA1(9b8a256f51e66733c4ec30b451ca0711ed02318e) ) // same as jinhulu2
ROM_END
/***************************************************************************
Driver Init
***************************************************************************/
@ -1892,6 +2078,17 @@ void jinhulu2_state::init_jinhulu2()
}
void jinhulu2_state::init_jinhulu2120gi()
{
init_jinhulu2();
uint8_t *rom = memregion("maincpu")->base();
// extra layer
for (int a = 0; a < 0xf000; a++)
if ((a & 0x0280) == 0x0200) rom[a] ^= 0x40;
}
void spoker_state::init_spk116it()
{
uint8_t *rom = memregion("maincpu")->base();
@ -1987,22 +2184,23 @@ void spoker_state::init_3super8()
Game Drivers
***************************************************************************/
// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS
GAME( 1996, spk306us, 0, spokeru, spoker, spokeru_state, init_spokeru, ROT0, "IGS", "Super Poker (v306US)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk205us, spk306us, spokeru, spoker, spokeru_state, init_spokeru, ROT0, "IGS", "Super Poker (v205US)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk203us, spk306us, spokeru, spk203us, spokeru_state, init_spokeru, ROT0, "IGS", "Super Poker (v203US)", MACHINE_SUPPORTS_SAVE ) // LS1. 8 203US in test mode
GAME( 1996, spk201ua, spk306us, spokeru, spk201ua, spokeru_state, init_spokeru, ROT0, "IGS", "Super Poker (v201UA)", MACHINE_SUPPORTS_SAVE ) // still shows 200UA in test mode
GAME( 1996, spk200ua, spk306us, spokeru, spk200ua, spokeru_state, init_spokeru, ROT0, "IGS", "Super Poker (v200UA)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk200, spk306us, spoker, spk100, spoker_state, init_spk100, ROT0, "IGS", "Super Poker (v200)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk130, spk306us, spoker, spk130, spoker_state, init_spk100, ROT0, "IGS", "Super Poker (v130)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk120in, spk306us, spoker, spoker, spoker_state, init_spk120in, ROT0, "IGS", "Super Poker (v120IN)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk116it, spk306us, spoker, spoker, spoker_state, init_spk116it, ROT0, "IGS", "Super Poker (v116IT)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk116itmx, spk306us, spoker, spoker, spoker_state, init_spk114it, ROT0, "IGS", "Super Poker (v116IT-MX)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk115it, spk306us, spoker, spoker, spoker_state, init_spk116it, ROT0, "IGS", "Super Poker (v115IT)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk114it, spk306us, spoker, spk114it, spoker_state, init_spk114it, ROT0, "IGS", "Super Poker (v114IT)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk102ua, spk306us, spokeru, spk102ua, spokeru_state, init_spokeru, ROT0, "IGS", "Super Poker (v102UA)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk102u, spk306us, spoker, spk102ua, spoker_state, init_spk100, ROT0, "IGS", "Super Poker (v102U)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk100, spk306us, spoker, spk100, spoker_state, init_spk100, ROT0, "IGS", "Super Poker (v100)", MACHINE_SUPPORTS_SAVE )
GAME( 1993?, 3super8, 0, _3super8, 3super8, spoker_state, init_3super8, ROT0, "<unknown>", "3 Super 8 (Italy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // ROMs are badly dumped
GAME( 1997, jbell, 0, jb, jb, jb_state, init_spokeru, ROT0, "IGS", "Jingle Bell (v200US)", MACHINE_SUPPORTS_SAVE )
GAME( 1995, jinhulu2, 0, jinhulu2, spoker, jinhulu2_state, init_jinhulu2, ROT0, "IGS", "Jin Hu Lu 2 (v412GS)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // tries to link to something?
// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS
GAME( 1996, spk306us, 0, spokeru, spoker, spokeru_state, init_spokeru, ROT0, "IGS", "Super Poker (v306US)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk205us, spk306us, spokeru, spoker, spokeru_state, init_spokeru, ROT0, "IGS", "Super Poker (v205US)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk203us, spk306us, spokeru, spk203us, spokeru_state, init_spokeru, ROT0, "IGS", "Super Poker (v203US)", MACHINE_SUPPORTS_SAVE ) // LS1. 8 203US in test mode
GAME( 1996, spk201ua, spk306us, spokeru, spk201ua, spokeru_state, init_spokeru, ROT0, "IGS", "Super Poker (v201UA)", MACHINE_SUPPORTS_SAVE ) // still shows 200UA in test mode
GAME( 1996, spk200ua, spk306us, spokeru, spk200ua, spokeru_state, init_spokeru, ROT0, "IGS", "Super Poker (v200UA)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk200, spk306us, spoker, spk100, spoker_state, init_spk100, ROT0, "IGS", "Super Poker (v200)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk130, spk306us, spoker, spk130, spoker_state, init_spk100, ROT0, "IGS", "Super Poker (v130)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk120in, spk306us, spoker, spoker, spoker_state, init_spk120in, ROT0, "IGS", "Super Poker (v120IN)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk116it, spk306us, spoker, spoker, spoker_state, init_spk116it, ROT0, "IGS", "Super Poker (v116IT)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk116itmx, spk306us, spoker, spoker, spoker_state, init_spk114it, ROT0, "IGS", "Super Poker (v116IT-MX)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk115it, spk306us, spoker, spoker, spoker_state, init_spk116it, ROT0, "IGS", "Super Poker (v115IT)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk114it, spk306us, spoker, spk114it, spoker_state, init_spk114it, ROT0, "IGS", "Super Poker (v114IT)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk102ua, spk306us, spokeru, spk102ua, spokeru_state, init_spokeru, ROT0, "IGS", "Super Poker (v102UA)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk102u, spk306us, spoker, spk102ua, spoker_state, init_spk100, ROT0, "IGS", "Super Poker (v102U)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, spk100, spk306us, spoker, spk100, spoker_state, init_spk100, ROT0, "IGS", "Super Poker (v100)", MACHINE_SUPPORTS_SAVE )
GAME( 1993?, 3super8, 0, _3super8, 3super8, spoker_state, init_3super8, ROT0, "<unknown>", "3 Super 8 (Italy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // ROMs are badly dumped
GAME( 1997, jbell, 0, jb, jb, jb_state, init_spokeru, ROT0, "IGS", "Jingle Bell (v200US)", MACHINE_SUPPORTS_SAVE )
GAME( 1995, jinhulu2, 0, jinhulu2, jinhulu2, jinhulu2_state, init_jinhulu2, ROT0, "IGS", "Jin Hu Lu 2 (v412GS)", MACHINE_NOT_WORKING | MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // tries to link to something?
GAME( 1995, jinhulu2120gi, jinhulu2, jinhulu2, jinhulu2, jinhulu2_state, init_jinhulu2120gi, ROT0, "IGS", "Jin Hu Lu 2 (v120GI)", MACHINE_NOT_WORKING | MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // inputs

View File

@ -20832,6 +20832,7 @@ kov3hd101
3super8
jbell
jinhulu2
jinhulu2120gi
spk100
spk102u
spk102ua

View File

@ -66,6 +66,7 @@ by the otherwise seemingly unnecessary internal ROMs.
************************************************************************************************************/
#include "emu.h"
#include "subsino_crypt.h"
#include "subsino_io.h"
@ -78,6 +79,7 @@ by the otherwise seemingly unnecessary internal ROMs.
#include "sound/okim6295.h"
#include "sound/ymopl.h"
#include "video/ramdac.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@ -132,23 +134,25 @@ public:
, m_leds(*this, "led%u", 0U)
{ }
void bishjan(machine_config &config);
void xiaoao(machine_config &config);
void saklove(machine_config &config);
void mtrain(machine_config &config);
void tbonusal(machine_config &config);
void humlan(machine_config &config);
void new2001(machine_config &config);
void expcard(machine_config &config);
void xplan(machine_config &config);
void xtrain(machine_config &config);
void ptrain(machine_config &config);
void bishjan(machine_config &config) ATTR_COLD;
void xiaoao(machine_config &config) ATTR_COLD;
void saklove(machine_config &config) ATTR_COLD;
void mtrain(machine_config &config) ATTR_COLD;
void tbonusal(machine_config &config) ATTR_COLD;
void humlan(machine_config &config) ATTR_COLD;
void queenbn(machine_config &config) ATTR_COLD;
void new2001(machine_config &config) ATTR_COLD;
void expcard(machine_config &config) ATTR_COLD;
void xplan(machine_config &config) ATTR_COLD;
void xtrain(machine_config &config) ATTR_COLD;
void ptrain(machine_config &config) ATTR_COLD;
void init_wtrnymph();
void init_mtrain();
void init_tbonusal();
void init_wtrnymph() ATTR_COLD;
void init_mtrain() ATTR_COLD;
void init_tbonusal() ATTR_COLD;
protected:
virtual void machine_start() override ATTR_COLD { m_leds.resolve(); }
virtual void video_start() override ATTR_COLD;
private:
@ -225,7 +229,7 @@ private:
TILE_GET_INFO_MEMBER(ss9601_get_tile_info_0);
TILE_GET_INFO_MEMBER(ss9601_get_tile_info_1);
uint32_t screen_update_subsino2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void bishjan_map(address_map &map) ATTR_COLD;
void mtrain_io(address_map &map) ATTR_COLD;
@ -239,8 +243,6 @@ private:
void xplan_io(address_map &map) ATTR_COLD;
void xplan_map(address_map &map) ATTR_COLD;
virtual void machine_start() override { m_leds.resolve(); }
layer_t m_layers[2];
uint8_t m_ss9601_byte_lo;
uint8_t m_ss9601_byte_lo2;
@ -745,7 +747,7 @@ void subsino2_state::video_start()
save_item(NAME(m_bishjan_input));
}
uint32_t subsino2_state::screen_update_subsino2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
uint32_t subsino2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int layers_ctrl = ~m_ss9601_disable;
int y;
@ -2807,7 +2809,7 @@ void subsino2_state::bishjan(machine_config &config)
m_screen->set_size(512, 256);
m_screen->set_visarea(0, 512-1, 0, 256-16-1);
m_screen->set_refresh_hz(60);
m_screen->set_screen_update(FUNC(subsino2_state::screen_update_subsino2));
m_screen->set_screen_update(FUNC(subsino2_state::screen_update));
m_screen->set_palette(m_palette);
m_screen->screen_vblank().set_inputline(m_maincpu, 0); // edge-triggered interrupt
@ -2868,6 +2870,13 @@ void subsino2_state::humlan(machine_config &config)
// SS9804
}
void subsino2_state::queenbn(machine_config &config)
{
humlan(config);
m_maincpu->set_clock(48.94_MHz_XTAL / 3);
}
/***************************************************************************
Magic Train
***************************************************************************/
@ -2902,7 +2911,7 @@ void subsino2_state::mtrain(machine_config &config)
m_screen->set_visarea(0, 512-1, 0, 256-32-1);
m_screen->set_refresh_hz(58.7270);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */); // game reads vblank state
m_screen->set_screen_update(FUNC(subsino2_state::screen_update_subsino2));
m_screen->set_screen_update(FUNC(subsino2_state::screen_update));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ss9601);
@ -2962,7 +2971,7 @@ void subsino2_state::saklove(machine_config &config)
m_screen->set_visarea(0, 512-1, 0, 256-16-1);
m_screen->set_refresh_hz(58.7270);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */); // game reads vblank state
m_screen->set_screen_update(FUNC(subsino2_state::screen_update_subsino2));
m_screen->set_screen_update(FUNC(subsino2_state::screen_update));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ss9601);
@ -3013,7 +3022,7 @@ void subsino2_state::xplan(machine_config &config)
m_screen->set_visarea(0, 512-1, 0, 256-16-1);
m_screen->set_refresh_hz(58.7270);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */); // game reads vblank state
m_screen->set_screen_update(FUNC(subsino2_state::screen_update_subsino2));
m_screen->set_screen_update(FUNC(subsino2_state::screen_update));
m_screen->set_palette(m_palette);
m_screen->screen_vblank().set("maincpu", FUNC(am188em_device::int0_w));
@ -3126,7 +3135,7 @@ Notes:
Xiao Ao Jiang Hu uses 44.1MHz Crystal
Queen Bee New uses 48.94MHz Crystal
DS1230.Q3 - Dallas DS1230A 1-Wire EEPROM (TO92). Hidden among other parts disguised as a transistor.
Each game has different EEPROM data used for protection.
Each game has different EEPROM data used for protection.
All these have the surface scratched and the part location is marked Q3.
PROG.U21 - 27C020 or 27C040 EPROM (main program)
SND.U10 - 27C080 or 27C040 EPROM. Game boots to I/O test screen if this ROM is not present so this is a program ROM for
@ -4056,18 +4065,18 @@ GAME( 2000, new2001, 0, new2001, new2001, subsino2_state, empty_ini
GAME( 2006, xplan, 0, xplan, xplan, subsino2_state, empty_init, ROT0, "Subsino", "X-Plan (Ver. 101)", MACHINE_NOT_WORKING )
GAME( 2001, queenbee, 0, humlan, queenbee, subsino2_state, empty_init, ROT0, "Subsino (American Alpha license)", "Queen Bee (Ver. 114)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues
GAME( 2001, queenbeeb, queenbee, humlan, queenbee, subsino2_state, empty_init, ROT0, "Subsino", "Queen Bee (Brazil, Ver. 202)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues, only program ROM available
GAME( 2001, queenbeei, queenbee, humlan, queenbee, subsino2_state, empty_init, ROT0, "Subsino", "Queen Bee (Israel, Ver. 100)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues, only program ROM available
GAME( 2001, queenbeesa, queenbee, humlan, queenbee, subsino2_state, empty_init, ROT0, "Subsino", "Queen Bee (SA-101-HARD)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues, only program ROM available
GAME( 2001, queenbee, 0, humlan, queenbee, subsino2_state, empty_init, ROT0, "Subsino (American Alpha license)", "Queen Bee (Ver. 114)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_TIMING ) // severe timing issues
GAME( 2001, queenbeeb, queenbee, humlan, queenbee, subsino2_state, empty_init, ROT0, "Subsino", "Queen Bee (Brazil, Ver. 202)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_TIMING ) // severe timing issues, only program ROM available
GAME( 2001, queenbeei, queenbee, humlan, queenbee, subsino2_state, empty_init, ROT0, "Subsino", "Queen Bee (Israel, Ver. 100)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_TIMING ) // severe timing issues, only program ROM available
GAME( 2001, queenbeesa, queenbee, humlan, queenbee, subsino2_state, empty_init, ROT0, "Subsino", "Queen Bee (SA-101-HARD)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_TIMING ) // severe timing issues, only program ROM available
GAME( 2001, humlan, queenbee, humlan, humlan, subsino2_state, empty_init, ROT0, "Subsino (Truemax license)", "Humlan's Lyckohjul (Sweden, Ver. 402)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues
GAME( 2001, humlan, queenbee, humlan, humlan, subsino2_state, empty_init, ROT0, "Subsino (Truemax license)", "Humlan's Lyckohjul (Sweden, Ver. 402)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_TIMING ) // severe timing issues
GAME( 2002, queenbn, 0, humlan, humlan, subsino2_state, empty_init, ROT0, "Subsino", "Nu Wang Feng New / Queen Bee New (China, Ver. 1.10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues
GAME( 2002, queenbn, 0, queenbn, humlan, subsino2_state, empty_init, ROT0, "Subsino", "Nv Wang Feng New / Queen Bee New (China, Ver. 1.10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_TIMING ) // severe timing issues
GAME( 2002, xreel, queenbee, humlan, humlan, subsino2_state, empty_init, ROT0, "Subsino (ECM license)", "X-Reel", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues
GAME( 2002, xreel, queenbee, humlan, humlan, subsino2_state, empty_init, ROT0, "Subsino (ECM license)", "X-Reel", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_TIMING ) // severe timing issues
GAME( 2002, squeenb, 0, humlan, humlan, subsino2_state, empty_init, ROT0, "Subsino", "Super Queen Bee (Ver. 101)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues
GAME( 2002, squeenb, 0, humlan, humlan, subsino2_state, empty_init, ROT0, "Subsino", "Super Queen Bee (Ver. 101)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_TIMING ) // severe timing issues
GAME( 2003, qbeebing, 0, humlan, qbeebing, subsino2_state, empty_init, ROT0, "Subsino", "Queen Bee Bingo", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )