New systems marked not working

------------------------------
Flower World 3 (V118CN) [little0, XingXing]

New clones marked not working
-----------------------------
Super Star 97 / Ming Xing 97 Jianan Ban [little0]
Tumble Pop (Electronic Devices bootleg) [Hammy]

- neogeo/neogeo.cpp: updated documentation [JacKc]

- various drivers: identified manufacturers for some bootlegs [Hammy]

- devices/cpu/alto2/a2disp.cpp: removed use of memset on non-trivial object
This commit is contained in:
Ivan Vangelista 2025-03-13 18:14:09 +01:00
parent f1efcbd75f
commit 14d11c479e
15 changed files with 427 additions and 72 deletions

View File

@ -499,7 +499,7 @@ void alto2_cpu_device::f2_late_evenfield()
*/
void alto2_cpu_device::init_disp()
{
memset(&m_dsp, 0, sizeof(m_dsp));
m_dsp.clear();
save_item(NAME(m_dsp.state));
save_item(NAME(m_dsp.hlc));
save_item(NAME(m_dsp.setmode));

View File

@ -193,6 +193,17 @@
#ifndef MAME_CPU_ALTO2_A2DISP_H
#define MAME_CPU_ALTO2_A2DISP_H
struct {
void clear()
{
state = hlc = setmode = inverse = scanline = 0;
halfclock = vblank = false;
std::fill(std::begin(fifo), std::end(fifo), 0);
wa = ra = a63 = a66 = 0;
dht_blocks = dwt_blocks = curt_blocks = curt_wakeup = false;
xpreg = csr = 0;
}
uint32_t state; //!< current state of the display_state_machine()
uint32_t hlc; //!< horizontal line counter
uint32_t setmode; //!< value written by last SETMODE<-

View File

@ -2137,6 +2137,19 @@ ROM_START( sstar97a )
ROM_LOAD16_BYTE( "105.u22", 0x40001, 0x20000, CRC(ca17a632) SHA1(d491310ccdbe9b59a1e607f9254646f20700d79d) )
ROM_END
// PCB has a Z84C0008PEC, 2x 82C55AC-2, AT89C2051 MCU, ATF1508AS EEPLD, 24C04AN, JFC 95101 (AY-8910 clone), Altera EPM7032LC44-15
ROM_START( sstar97jb )
ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD( "star97jianan.u6", 0x00000, 0x20000, CRC(23904300) SHA1(8d4c9478250aaa1f7abdc2fd84a1e83be61723a0) ) // encrypted, address line based
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD( "star97jianan.u8", 0x00000, 0x80000, CRC(644f6ca8) SHA1(7d0b8c2c488f4169018e5bf861dc73eaeef9d9df) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_LOAD( "star97jianan.u9", 0x00000, 0x80000, CRC(31289532) SHA1(27243de8e79c552ba71aa8ea0ee7197228b55528) )
ROM_END
/*
97 (Húdié Mèng 97)
Game is encrypted and needs better decoded graphics.
@ -2587,6 +2600,7 @@ GAME( 199?, miaction, 0, skylncr, skylncr, skylncr_state, init_miacti
GAME( 199?, tigerslt, 0, skylncr, skylncr, skylncr_state, init_miaction, ROT0, "bootleg", "Tiger (slot)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 199?, sstar97, 0, sstar97, sstar97, skylncr_state, empty_init, ROT0, "Bordun International", "Super Star 97 / Ming Xing 97 (version V153B)", MACHINE_SUPPORTS_SAVE )
GAME( 199?, sstar97a, sstar97, sstar97, sstar97, skylncr_state, init_sstar97a, ROT0, "Bordun International", "Super Star 97 / Ming Xing 97 (version V168A)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 199?, sstar97jb, sstar97, sstar97, sstar97, skylncr_state, empty_init, ROT0, "Bordun International", "Super Star 97 / Ming Xing 97 Jianan Ban", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // needs decryption
GAME( 1995, bdream97, 0, bdream97, skylncr, skylncr_state, empty_init, ROT0, "bootleg (KKK)", "Hudie Meng 97", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 2000?,olymp, 0, olymp, skylncr, skylncr_state, init_olymp, ROT0, "Z Games", "Olympus (Z Games, version 10)", MACHINE_WRONG_COLORS | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // Still has Bordun International 1992 strings
GAME( 2000, sonikfig, 0, skylncr, sonikfig, skylncr_state, init_sonikfig, ROT0, "Z Games", "Sonik Fighter (version 02, encrypted)", MACHINE_WRONG_COLORS | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )

View File

@ -15024,7 +15024,7 @@ GAME( 1991, 3wondersr1, 3wonders, cps1_10MHz, 3wonders, cps_state, init_cps1,
GAME( 1991, 3wondersu, 3wonders, cps1_10MHz, 3wonders, cps_state, init_cps1, ROT0, "Capcom", "Three Wonders (USA 910520)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, wonder3, 3wonders, cps1_10MHz, 3wonders, cps_state, init_cps1, ROT0, "Capcom", "Wonder 3 (Japan 910520)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, 3wondersb, 3wonders, cps1_10MHz, 3wonders, cps_state, init_cps1, ROT0, "bootleg", "Three Wonders (bootleg)", MACHINE_SUPPORTS_SAVE ) // 910520 - based on World version
GAME( 1991, 3wondersbi, 3wonders, cps1_10MHz, 3wonders, cps_state, init_cps1, ROT0, "bootleg (Impeuropex)", "Three Wonders (Italian bootleg)", MACHINE_NOT_WORKING |MACHINE_SUPPORTS_SAVE ) // 910520 - based on World version
GAME( 1991, 3wondersbi, 3wonders, cps1_10MHz, 3wonders, cps_state, init_cps1, ROT0, "bootleg (Electronic Devices)", "Three Wonders (Italian bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // 910520 - based on World version
GAME( 1991, 3wondersh, 3wonders, cps1_10MHz, 3wonders, cps_state, init_cps1, ROT0, "bootleg", "Three Wonders (hack)", MACHINE_SUPPORTS_SAVE ) // 910520 - based on World version
GAME( 1991, kod, 0, cps1_10MHz, kod, cps_state, init_cps1, ROT0, "Capcom", "The King of Dragons (World 910805)", MACHINE_SUPPORTS_SAVE ) // "ETC"
GAME( 1991, kodr1, kod, cps1_10MHz, kodr1, cps_state, init_cps1, ROT0, "Capcom", "The King of Dragons (World 910711)", MACHINE_SUPPORTS_SAVE ) // "ETC"

View File

@ -1,5 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
// copyright-holders: David Haywood
/* Diver Boy
(c)1992 Device Electronics
@ -46,13 +47,16 @@
* 5th coin : adds 1 credit
* 6th coin : adds 1 credit ...
TODO: tumblebed uses more GFX features, which need implementing
*/
#include "emu.h"
#include "cpu/z80/z80.h"
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "sound/okim6295.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@ -71,68 +75,57 @@ public:
m_oki(*this, "oki"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette"),
m_soundlatch(*this, "soundlatch")
m_palette(*this, "palette")
{ }
void diverboy(machine_config &config);
void diverboy(machine_config &config) ATTR_COLD;
void tumblebed(machine_config &config) ATTR_COLD;
private:
/* memory pointers */
required_shared_ptr<uint16_t> m_spriteram;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<okim6295_device> m_oki;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
void soundcmd_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void okibank_w(uint8_t data);
virtual void machine_start() override ATTR_COLD;
virtual void video_start() override ATTR_COLD;
uint32_t screen_update_diverboy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void diverboy_map(address_map &map) ATTR_COLD;
void tumblebed_map(address_map &map) ATTR_COLD;
void snd_map(address_map &map) ATTR_COLD;
};
void diverboy_state::video_start()
{
}
void diverboy_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
void diverboy_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint16_t *source = m_spriteram;
uint16_t *finish = source + (m_spriteram.bytes() / 2);
uint16_t const *finish = source + (m_spriteram.bytes() / 2);
while (source < finish)
{
int16_t xpos, ypos, number, colr, bank, flash;
ypos = source[4];
xpos = source[0];
colr = (source[1] & 0x00f0) >> 4;
number = source[3];
flash = source[1] & 0x1000;
int16_t ypos = source[4];
int16_t const xpos = source[0];
int16_t colr = (source[1] & 0x00f0) >> 4;
int16_t const number = source[3];
int16_t const flash = source[1] & 0x1000;
colr |= ((source[1] & 0x000c) << 2);
ypos = 0x100 - ypos;
bank = (source[1] & 0x0002) >> 1;
int16_t const bank = (source[1] & 0x0002) >> 1;
if (!flash || (m_screen->frame_number() & 1))
{
m_gfxdecode->gfx(bank)->transpen(bitmap,cliprect,
m_gfxdecode->gfx(bank)->transpen(bitmap, cliprect,
number,
colr,
0,0,
xpos,ypos,
0, 0,
xpos, ypos,
(source[1] & 0x0008) ? -1 : 0);
}
@ -140,7 +133,7 @@ void diverboy_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &clipr
}
}
uint32_t diverboy_state::screen_update_diverboy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
uint32_t diverboy_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
// bitmap.fill(m_palette->black_pen(), cliprect);
draw_sprites(bitmap, cliprect);
@ -148,19 +141,10 @@ uint32_t diverboy_state::screen_update_diverboy(screen_device &screen, bitmap_in
}
void diverboy_state::soundcmd_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
if (ACCESSING_BITS_0_7)
{
m_soundlatch->write(data & 0xff);
m_audiocpu->set_input_line(0, HOLD_LINE);
}
}
void diverboy_state::okibank_w(uint8_t data)
{
/* bit 2 might be reset */
// popmessage("%02x",data);
// bit 2 might be reset
// popmessage("%02x", data);
m_oki->set_rom_bank(data & 3);
}
@ -171,7 +155,7 @@ void diverboy_state::diverboy_map(address_map &map)
map(0x000000, 0x03ffff).rom();
map(0x040000, 0x04ffff).ram();
map(0x080000, 0x083fff).ram().share("spriteram");
map(0x100000, 0x100001).w(FUNC(diverboy_state::soundcmd_w));
map(0x100001, 0x100001).w("soundlatch", FUNC(generic_latch_8_device::write));
map(0x140000, 0x1407ff).w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x180000, 0x180001).portr("P1_P2");
map(0x180002, 0x180003).portr("DSW");
@ -184,13 +168,32 @@ void diverboy_state::diverboy_map(address_map &map)
// map(0x340002, 0x340003).nopw();
}
void diverboy_state::tumblebed_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x080000, 0x083fff).ram().share("spriteram");
map(0x100001, 0x100001).w("soundlatch", FUNC(generic_latch_8_device::write));
map(0x120000, 0x123fff).ram();
map(0x140000, 0x1407ff).w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x1a0000, 0x1a07ff).ram();
map(0x180000, 0x180001).portr("P1_P2");
map(0x180002, 0x180003).portr("DSW");
map(0x180008, 0x180009).portr("COINS");
// map(0x18000a, 0x18000b).nopr();
// map(0x18000c, 0x18000d).nopw();
map(0x320000, 0x3207ff).nopw(); /* ?? */
map(0x322000, 0x3227ff).nopw(); /* ?? */
// map(0x340000, 0x340001).nopw();
// map(0x340002, 0x340003).nopw();
}
void diverboy_state::snd_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x87ff).ram();
map(0x9000, 0x9000).w(FUNC(diverboy_state::okibank_w));
map(0x9800, 0x9800).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0xa000, 0xa000).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0xa000, 0xa000).r("soundlatch", FUNC(generic_latch_8_device::read));
}
@ -258,13 +261,9 @@ static GFXDECODE_START( gfx_diverboy )
GFXDECODE_END
void diverboy_state::machine_start()
{
}
void diverboy_state::diverboy(machine_config &config)
{
M68000(config, m_maincpu, 12000000); /* guess */
M68000(config, m_maincpu, 12000000); // guess
m_maincpu->set_addrmap(AS_PROGRAM, &diverboy_state::diverboy_map);
m_maincpu->set_vblank_int("screen", FUNC(diverboy_state::irq6_line_hold));
@ -279,7 +278,7 @@ void diverboy_state::diverboy(machine_config &config)
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(64*8, 32*8);
m_screen->set_visarea(0*8+4, 40*8+1, 2*8, 32*8-1);
m_screen->set_screen_update(FUNC(diverboy_state::screen_update_diverboy));
m_screen->set_screen_update(FUNC(diverboy_state::screen_update));
m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 0x400);
@ -287,14 +286,21 @@ void diverboy_state::diverboy(machine_config &config)
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, 0);
OKIM6295(config, m_oki, 1320000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.50); // clock frequency & pin 7 not verified
}
void diverboy_state::tumblebed(machine_config &config)
{
diverboy(config);
m_maincpu->set_addrmap(AS_PROGRAM, &diverboy_state::tumblebed_map);
}
/*
both program roms contain the following string (at the same location)
both program ROMs contain the following string (at the same location)
This Game is programmed by the freelance group GAMART.
ADRESS: C\SAnt Ramon,11 08130-STA PERPETUA DE MOGODA - BARCELONA (SPAIN)
@ -304,36 +310,69 @@ Fax (93) 574 18 34
*/
ROM_START( diverboy )
ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 Code */
ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 Code
ROM_LOAD16_BYTE( "db_01.bin", 0x00000, 0x20000, CRC(6aa11366) SHA1(714c8a4a64c18632825a734a76a2d1b031106d76) )
ROM_LOAD16_BYTE( "db_02.bin", 0x00001, 0x20000, CRC(45f8a673) SHA1(4eea1374cafacb4a2e0b623fcb802deb5fca1b3a) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* z80 */
ROM_LOAD( "db_05.bin", 0x00000, 0x8000, CRC(ffeb49ec) SHA1(911b13897ff4ace3940bfff4ab88584a93796c24) ) /* this part is empty */
ROM_CONTINUE( 0x0000, 0x8000 ) /* this part contains the code */
ROM_REGION( 0x10000, "audiocpu", 0 ) // z80
ROM_LOAD( "db_05.bin", 0x00000, 0x8000, CRC(ffeb49ec) SHA1(911b13897ff4ace3940bfff4ab88584a93796c24) ) // this part is empty
ROM_CONTINUE( 0x0000, 0x8000 ) // this part contains the code
ROM_REGION( 0x100000, "gfx1", 0 ) /* GFX */
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_LOAD16_BYTE( "db_08.bin", 0x000000, 0x80000, CRC(7bb96220) SHA1(671b3f218106e594b13ae5f2e680cf2e2cfc5501) )
ROM_LOAD16_BYTE( "db_09.bin", 0x000001, 0x80000, CRC(12b15476) SHA1(400a5b846f70567de137e0b95586dd9cfc27becb) )
ROM_REGION( 0x180000, "gfx2", 0 ) /* GFX */
ROM_REGION( 0x180000, "gfx2", 0 )
ROM_LOAD16_BYTE( "db_07.bin", 0x000000, 0x20000, CRC(18485741) SHA1(a8edceaf34a98f2aa2bfada9d6e06fb82639a4e0) )
ROM_LOAD16_BYTE( "db_10.bin", 0x000001, 0x20000, CRC(c381d1cc) SHA1(88b97d8893c500951cfe8e7e7f0b547b36bbe2c0) )
ROM_LOAD16_BYTE( "db_06.bin", 0x040000, 0x20000, CRC(21b4e352) SHA1(a553de67e5dc751ea81ec4739724e0e46e8c5fab) )
ROM_LOAD16_BYTE( "db_11.bin", 0x040001, 0x20000, CRC(41d29c81) SHA1(448fd5c1b16159d03436b8bd71ffe871c8daf7fa) )
ROM_REGION( 0x100000, "oki", 0 ) /* Sound */
ROM_REGION( 0x100000, "oki", 0 )
ROM_LOAD( "db_03.bin", 0x00000, 0x20000, CRC(50457505) SHA1(faf1c055ec56d2ed7f5e6993cc04d3317bf1c3cc) )
ROM_CONTINUE( 0x40000, 0x20000 )
ROM_CONTINUE( 0x80000, 0x20000 )
ROM_CONTINUE( 0xc0000, 0x20000 )
ROM_LOAD( "db_04.bin", 0x20000, 0x20000, CRC(01b81da0) SHA1(914802f3206dc59a720af9d57eb2285bc8ba822b) ) /* same as tumble pop?, is this used? */
ROM_LOAD( "db_04.bin", 0x20000, 0x20000, CRC(01b81da0) SHA1(914802f3206dc59a720af9d57eb2285bc8ba822b) ) // same as Tumble Pop?, is this used?
ROM_RELOAD( 0x60000, 0x20000 )
ROM_RELOAD( 0xa0000, 0x20000 )
ROM_RELOAD( 0xe0000, 0x20000 )
ROM_END
ROM_START( tumblebed )
ROM_REGION( 0x80000, "maincpu", 0 )
ROM_LOAD16_BYTE ("3.ep1", 0x00000, 0x20000, CRC(8b6950ec) SHA1(b55a84df208822084304109bf85a17ccee210e25) )
ROM_LOAD16_BYTE( "4.ep0", 0x00001, 0x20000, CRC(8199c74d) SHA1(7436a4bebc85ff5e47eae93353ab8fcb98c2fd30) )
ROM_LOAD16_BYTE ("2.ep3", 0x40000, 0x20000, CRC(cb27d9ca) SHA1(d105e6397efa4d5d31faad7d7e574f21d3bc14b5) )
ROM_LOAD16_BYTE( "5.ep2", 0x40001, 0x20000, CRC(3a9ad326) SHA1(7d2078e8e98fa4ae6d251ff100792b36c0506e86) )
ROM_REGION( 0x8000, "audiocpu", 0 )
ROM_LOAD( "1.u4", 0x0000, 0x8000, CRC(ffeb49ec) SHA1(911b13897ff4ace3940bfff4ab88584a93796c24) ) // 011xxxxxxxxxxxxx = 0xFF
ROM_CONTINUE( 0x0000, 0x8000 )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_LOAD16_BYTE( "10.u33", 0x00000, 0x80000, CRC(631b8d08) SHA1(4cb9b314209d863361d04683a881c92614640344) )
ROM_LOAD16_BYTE( "11.u34", 0x00001, 0x80000, CRC(b686cf86) SHA1(9fe83abc5bd687056d814bce36d93564fb99256f) )
ROM_REGION( 0x180000, "gfx2", 0 )
ROM_LOAD16_BYTE( "9.u35", 0x00000, 0x20000, CRC(d3227e05) SHA1(2d11b5feae84545c3d3e48c55f7d9f4feac7a481) )
ROM_LOAD16_BYTE( "12.u36", 0x00001, 0x20000, CRC(0c468815) SHA1(9cc086e252851c6e461a85549019fb3113912ce0) )
ROM_LOAD16_BYTE( "8.u37", 0x40000, 0x20000, CRC(9a7f7866) SHA1(0f275d6f5696b064fbee1ce93bf7623d9d3d3738) )
ROM_LOAD16_BYTE( "13.u38", 0x40001, 0x20000, CRC(effa3b5d) SHA1(e33b221f77f05ac7808d4b056f7a46efa4957837) )
ROM_REGION( 0x100000, "oki", 0 )
ROM_LOAD( "7.u11", 0x00000, 0x20000, CRC(50457505) SHA1(faf1c055ec56d2ed7f5e6993cc04d3317bf1c3cc) )
ROM_CONTINUE( 0x40000, 0x20000 )
ROM_CONTINUE( 0x80000, 0x20000 )
ROM_CONTINUE( 0xc0000, 0x20000 )
ROM_LOAD( "6.u22", 0x20000, 0x20000, CRC(01b81da0) SHA1(914802f3206dc59a720af9d57eb2285bc8ba822b) )
ROM_RELOAD( 0x60000, 0x20000 )
ROM_RELOAD( 0xa0000, 0x20000 )
ROM_RELOAD( 0xe0000, 0x20000 )
ROM_END
} // anonymous namespace
GAME( 1992, diverboy, 0, diverboy, diverboy, diverboy_state, empty_init, ORIENTATION_FLIP_X, "Gamart (Electronic Devices Italy license)", "Diver Boy", MACHINE_SUPPORTS_SAVE )
GAME( 1992, diverboy, 0, diverboy, diverboy, diverboy_state, empty_init, ORIENTATION_FLIP_X, "Gamart (Electronic Devices Italy license)", "Diver Boy", MACHINE_SUPPORTS_SAVE )
GAME( 1991, tumblebed, tumblep, tumblebed, diverboy, diverboy_state, empty_init, ORIENTATION_FLIP_X, "bootleg (Electronic Devices)", "Tumble Pop (Electronic Devices bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )

View File

@ -0,0 +1,256 @@
// license:BSD-3-Clause
// copyright-holders:
/*
IGS ARM7 (IGS027A) based mahjong / gambling platform(s),
with IGS 033 custom video chip.
Main components for the IGS PCB-0405-02-FZ are:
- IGS 027A (ARM7-based MCU)
- 24 MHz XTAL
- IGS 033 graphics chip
- 82C55 2K15 PPI
- K668 ADPCM chip (M6295 clone)
- 3 banks of 8 DIP switches
*/
#include "emu.h"
#include "igs027a.h"
#include "pgmcrypt.h"
#include "machine/i8255.h"
#include "machine/nvram.h"
#include "machine/ticket.h"
#include "machine/timer.h"
#include "sound/okim6295.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "endianness.h"
#include <algorithm>
namespace {
class igs_m027_033vid_state : public driver_device
{
public:
igs_m027_033vid_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_external_rom(*this, "user1"),
m_nvram(*this, "nvram"),
m_maincpu(*this, "maincpu"),
m_screen(*this, "screen"),
m_palette(*this, "palette")
//m_video(*this, "igs033")
{ }
void m027_033vid(machine_config &config) ATTR_COLD;
void init_flowerw3() ATTR_COLD;
protected:
virtual void machine_start() override ATTR_COLD;
virtual void machine_reset() override ATTR_COLD;
virtual void video_start() override ATTR_COLD;
private:
required_region_ptr<u32> m_external_rom;
required_shared_ptr<u32> m_nvram;
required_device<igs027a_cpu_device> m_maincpu;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
//required_device<igs033_video_device> m_video;
u32 m_xor_table[0x100];
u32 external_rom_r(offs_t offset);
void xor_table_w(offs_t offset, u8 data);
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void screen_vblank(int state);
void m027_map(address_map &map) ATTR_COLD;
};
void igs_m027_033vid_state::machine_start()
{
std::fill(std::begin(m_xor_table), std::end(m_xor_table), 0);
save_item(NAME(m_xor_table));
}
void igs_m027_033vid_state::machine_reset()
{
}
void igs_m027_033vid_state::video_start()
{
}
u32 igs_m027_033vid_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
return 0;
}
void igs_m027_033vid_state::screen_vblank(int state)
{
}
/***************************************************************************
Memory Maps
***************************************************************************/
void igs_m027_033vid_state::m027_map(address_map &map) // TODO: everything to be verified
{
map(0x0800'0000, 0x0807'ffff).r(FUNC(igs_m027_033vid_state::external_rom_r)); // Game ROM
map(0x1800'0000, 0x1800'7fff).ram().share(m_nvram);
map(0x2800'0000, 0x2800'0fff).ram();
map(0x3800'0000, 0x3800'7fff).noprw(); // TODO: IGS033
map(0x38a0'0000, 0x38a0'11ff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette");
map(0x5000'0000, 0x5000'03ff).umask32(0x0000'00ff).w(FUNC(igs_m027_033vid_state::xor_table_w)); // uploads XOR table to external ROM here
}
/***************************************************************************
Input Ports
***************************************************************************/
INPUT_PORTS_START( flowerw3 )
PORT_START("IN0")
PORT_BIT(0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_START("DSW1")
PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW1:1")
PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW1:2")
PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW1:3")
PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW1:4")
PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW1:5")
PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW1:6")
PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW1:7")
PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW1:8")
PORT_START("DSW2")
PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW2:1")
PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW2:2")
PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW2:3")
PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW2:4")
PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW2:5")
PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW2:6")
PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW2:7")
PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW2:8")
PORT_START("DSW3")
PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW3:1")
PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW3:2")
PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW3:3")
PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW3:4")
PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW3:5")
PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW3:6")
PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW3:7")
PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW3:8")
INPUT_PORTS_END
/***************************************************************************
Machine Drivers
***************************************************************************/
u32 igs_m027_033vid_state::external_rom_r(offs_t offset)
{
return m_external_rom[offset] ^ m_xor_table[offset & 0x00ff];
}
void igs_m027_033vid_state::xor_table_w(offs_t offset, u8 data)
{
m_xor_table[offset] = (u32(data) << 24) | (u32(data) << 8);
}
void igs_m027_033vid_state::m027_033vid(machine_config &config)
{
IGS027A(config, m_maincpu, 24_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &igs_m027_033vid_state::m027_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(1000));
m_screen->set_size(512, 256);
m_screen->set_visarea(0, 448-1, 0, 224-1);
m_screen->set_screen_update(FUNC(igs_m027_033vid_state::screen_update));
m_screen->set_palette(m_palette);
m_screen->screen_vblank().set(FUNC(igs_m027_033vid_state::screen_vblank));
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1200/2);
// IGS033_VIDEO(config, m_video, 0);
// sound hardware
SPEAKER(config, "mono").front_center();
OKIM6295(config, "oki", 24_MHz_XTAL / 24, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5); // divider and pin 7 not verified
}
/***************************************************************************
ROMs Loading
***************************************************************************/
// IGS PCB-0405-02-FZ
// SP and IGS027A ROMs have original labels with '花花世界3'
ROM_START( flowerw3 )
ROM_REGION( 0x4000, "maincpu", 0 )
// Internal rom of IGS027A ARM based MCU
ROM_LOAD( "f8_027a.bin", 0x0000, 0x4000, CRC(4662f015) SHA1(c10889964b675f5c11ea1571332f3eec418c9a28) )
ROM_REGION32_LE( 0x80000, "user1", ROMREGION_ERASEFF ) // external ARM data / prg
ROM_LOAD( "v118.u12", 0x00000, 0x80000, CRC(c2729fbe) SHA1(2153675a1161bd6aea6367c55fcf801c7fb0dd3a) )
ROM_REGION( 0x80000, "igs033", 0 )
ROM_LOAD( "7e.u20", 0x000000, 0x080000, CRC(a7b65af6) SHA1(bef13d38eb793b2860c2922f0cfb4b011fd9991b) )
ROM_REGION( 0x80000, "oki", 0 )
ROM_LOAD( "sp.3", 0x00000, 0x80000, CRC(06b70fe9) SHA1(5df34f870d32893b5c3095fb9653954209712cdb) )
ROM_END
void igs_m027_033vid_state::init_flowerw3()
{
flowerw3_decrypt(machine());
}
} // anonymous namespace
/***************************************************************************
Game Drivers
***************************************************************************/
GAME( 200?, flowerw3, 0, m027_033vid, flowerw3, igs_m027_033vid_state, init_flowerw3, ROT0, "IGS", "Flower World 3 (V118CN)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // title to be adjusted once it works

View File

@ -1969,3 +1969,26 @@ void mxsqy_decrypt(running_machine &machine)
src[i] ^= x;
}
}
void flowerw3_decrypt(running_machine &machine)
{
memory_region *const region = machine.root_device().memregion("user1");
auto const src = util::little_endian_cast<u16>(reinterpret_cast<u32 *>(region->base()));
auto const rom_size = region->bytes();
for (int i = 0; i < rom_size / 2; i++)
{
uint16_t x = 0;
IGS27_CRYPT1_ALT
IGS27_CRYPT2_ALT
IGS27_CRYPT3
IGS27_CRYPT4
IGS27_CRYPT5_ALT
IGS27_CRYPT6
IGS27_CRYPT7
IGS27_CRYPT8
src[i] ^= x;
}
}

View File

@ -64,5 +64,6 @@ void extradrw_decrypt(running_machine &machine) ATTR_COLD;
void cjddzlf_decrypt(running_machine &machine) ATTR_COLD;
void cjtljp_decrypt(running_machine& machine) ATTR_COLD;
void mxsqy_decrypt(running_machine& machine) ATTR_COLD;
void flowerw3_decrypt(running_machine& machine) ATTR_COLD;
#endif // MAME_IGS_PGMCRYPT_H

View File

@ -15195,6 +15195,7 @@ speedway
speedwaya
sstar97
sstar97a
sstar97jb
superb2k
tigerslt
@ -17792,6 +17793,7 @@ cgenienz
@source:edevices/diverboy.cpp
diverboy
tumblebed
@source:edevices/fantland.cpp
borntofi
@ -20589,6 +20591,9 @@ zhongguo
@source:igs/igs_m027_023vid.cpp
mxsqy
@source:igs/igs_m027_033vid.cpp
flowerw3
@source:igs/igs_m027_link.cpp
cjslh
cjsll

View File

@ -4728,6 +4728,7 @@ ROM_START( aof ) /* MVS AND AES VERSION */
ROM_REGION( 0x400000, "cslot1:ymsnd:adpcma", 0 )
ROM_LOAD( "044-v2.v2", 0x000000, 0x200000, CRC(3ec632ea) SHA1(e3f413f580b57f70d2dae16dbdacb797884d3fce) ) /* TC5316200 */
ROM_LOAD( "044-v4.v4", 0x200000, 0x200000, CRC(4b0f8e23) SHA1(105da0cc5ba19869c7147fba8b177500758c232b) ) /* TC5316200 */
/* Also found MVS set with different label: 044-v2.v1 and 044-v4.v2 */
ROM_REGION( 0x800000, "cslot1:sprites", 0 )
ROM_LOAD16_BYTE( "044-c1.c1", 0x000000, 0x100000, CRC(ddab98a7) SHA1(f20eb81ec431268798c142c482146c1545af1c24) ) /* Plane 0,1 */ /* TC5316200 */
@ -4858,6 +4859,7 @@ ROM_END
ID-0047
. NGM-047
NEO-MVS PROG-G2 (SNK-9201) / NEO-MVS CHA42G-1
NEO-MVS PROG-G2 (SNK-9201) / NEO-MVS CHA42G-2
. NGH-047
NEO-AEG PROG-G2 (PRO-CT0) / NEO-AEG CHA42G-2B
NEO-AEG PROG-G2 (PRO-CT0) / NEO-AEG CHA42G-2
@ -4866,7 +4868,7 @@ ROM_END
ROM_START( fatfury2 ) /* MVS AND AES VERSION */
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "047-p1.p1", 0x000000, 0x100000, CRC(ecfdbb69) SHA1(59e2f137c6eaf043df4ddae865a9159a10265c60) ) /* TC538200 */
/* The original P1 is 8mbit; also found sets with P1 / P2 4mbit on eprom. */
/* The original P1 is 8mbit; also found sets with EP1 / EP2 4mbit on eprom. */
NEO_SFIX_128K( "047-s1.s1", CRC(d7dbbf39) SHA1(29253e596f475ebd41a6e3bb53952e3a0ccd2eed) ) /* TC531000 */
@ -5286,6 +5288,7 @@ ROM_START( fatfursp ) /* MVS AND AES VERSION */
ROM_REGION( 0x180000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "058-p1.p1", 0x000000, 0x100000, CRC(2f585ba2) SHA1(429b4bf43fb9b1082c15d645ca328f9d175b976b) ) /* mask rom TC538200 */
ROM_LOAD16_WORD_SWAP( "058-p2.sp2", 0x100000, 0x080000, CRC(d7c71a6b) SHA1(b3428063031a2e5857da40a5d2ffa87fb550c1bb) ) /* mask rom TC534200 */
/* also found MVS set with EP1 / EP2 / SP2 on eprom; correct chip label unknown */
NEO_SFIX_128K( "058-s1.s1", CRC(2df03197) SHA1(24083cfc97e720ac9e131c9fe37df57e27c49294) ) /* mask rom TC531000 */
@ -5416,6 +5419,7 @@ ROM_END
ID-0061
. NGM-061
NEO-MVS PROGGSC / NEO-MVS CHA256
NEO-MVS PROGGSC / NEO-MVS CHA256B
NEO-MVS PROGTOP / NEO-MVS CHA256
NEO-MVS PROG 4096 B / NEO-MVS CHA256
. NGH-061
@ -6073,6 +6077,7 @@ ROM_END
NEO-MVS PROGBK1 / NEO-MVS CHA256
NEO-MVS PROGTOP / NEO-MVS CHA256B
NEO-MVS PROG 4096 B / NEO-MVS CHA 42G-3
NEO-MVS PROGGSC / NEO-MVS CHA 42G-3B
. NGH-082
NEO-AEG PROGTOP2 / NEO-AEG CHA256 B
****************************************/
@ -7851,6 +7856,7 @@ ROM_END
ID-0233
. NGM-2330
NEO-MVS PROGBK1 / NEO-MVS CHA256
NEO-MVS PROGBK1 / NEO-MVS CHA256B
. NGH-2330
NEO-AEG PROGBK1Y / NEO-AEG CHA256RY
****************************************/

View File

@ -10604,7 +10604,7 @@ GAME( 1993, powerinspu, powerins, powerins, powerinj, nmk16_state,
GAME( 1993, powerinspj, powerins, powerins, powerinj, nmk16_state, empty_init, ROT0, "Atlus", "Gouketsuji Ichizoku (Japan, prototype)", MACHINE_SUPPORTS_SAVE ) // boots as 93.10.20 just like the other sets, but code is different
GAME( 1993, powerinsa, powerins, powerinsa, powerins, nmk16_state, init_powerinsa, ROT0, "bootleg", "Power Instinct (USA, bootleg set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1993, powerinsb, powerins, powerinsb, powerins, nmk16_state, empty_init, ROT0, "bootleg", "Power Instinct (USA, bootleg set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1993, powerinsc, powerins, powerinsc, powerins, nmk16_state, empty_init, ROT0, "bootleg", "Power Instinct (USA, bootleg set 3)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // different sprites' format not implemented
GAME( 1993, powerinsc, powerins, powerinsc, powerins, nmk16_state, empty_init, ROT0, "bootleg (Electronic Devices)", "Power Instinct (USA, bootleg set 3)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // different sprites' format not implemented
// Non NMK boards

View File

@ -620,4 +620,4 @@ ROM_END
} // anonymous namespace
GAME( 1992, goal92, cupsoc, goal92, goal92, goal92_state, empty_init, ROT0, "bootleg", "Goal! '92", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1992, goal92, cupsoc, goal92, goal92, goal92_state, empty_init, ROT0, "bootleg (Electronic Devices)", "Goal! '92", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )

View File

@ -120,7 +120,7 @@ GFXDECODE_END
void vgame_state::vgame(machine_config &config)
{
ARM7(config, m_maincpu, 44_MHz_XTAL); // CPU core and divider unknown; ROMs seem to contain at least some ARM or Thumb code
ARM7(config, m_maincpu, 44_MHz_XTAL); // CPU core unknown; ROMs seem to contain at least some ARM or Thumb code
m_maincpu->set_addrmap(AS_PROGRAM, &vgame_state::program_map);
// m_maincpu->set_vblank_int("screen", FUNC(vgame_state::irq0_line_hold));
@ -139,7 +139,7 @@ void vgame_state::vgame(machine_config &config)
SPEAKER(config, "mono").front_center();
OKIM6295(config, "oki", 44_MHz_XTAL / 44, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // pin 7 and clock not verified
OKIM6295(config, "oki", 44_MHz_XTAL / 44, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
}
// VGAME-0030-02-AI PCB
@ -181,7 +181,7 @@ same text font but with a simpler modern design using mostly surface-mounted par
similar format to IGS PCBs. It is possible VGAME is an IGS company or it was run by ex-IGS employees who set
up their own company doing the same thing using knowledge gained from working at IGS.
The CPU is a QFP128 which is an unusual footprint for a CPU and appears to be similar (bot not identical) to
The CPU is a QFP128 which is an unusual footprint for a CPU and appears to be similar (but not identical) to
the special IGS027A used by lhzb3sjb. The same pin that was found to be the serial port when trojaning
lhzb3sjb goes to a connector on the edge of the board and appears to be the debug/programming port. When the
program ROM is removed the message that shows on screen from the internal ROM is very similar to the messages
@ -224,7 +224,7 @@ Notes:
"VGAME-007" - Chao Ji Dou Niu
007 also seen on Mahjong School 2 and Chaoji Laizi Dou Dizhu so these might use the same internal ROM.
VGAME-003 - QFP240 Custom Graphics Chip. Possibly similar to IGS023 or IGS031. Chip has additional
logic and other functions such providing the 1MHz clock for the M6295.
logic and other functions such as providing the 1MHz clock for the M6295.
The same type of chip exists on Mahjong School 2 and Chaoji Laizi Dou Dizhu marked "VGAME-008"
6295 - OKI M6295 4-Channel ADPCM Voice Synthesis LSI. Clock Input 1.000MHz [44/44]. Pin 7 HIGH
1MHz clock comes from VGAME-003.

View File

@ -5685,4 +5685,4 @@ GAME( 1993, qcrayon2, 0, qcrayon2, qcrayon2, taitof2_state, empty_i
GAME( 1991, driftout, 0, driftout, driftout, dondokod_state, empty_init, ROT270, "Visco", "Drift Out (Europe)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, driftoutct, driftout, driftoutct,driftoutct, cameltry_state, empty_init, ROT270, "Visco", "Drift Out (Europe, Cameltry conversion)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, driftoutj, driftout, driftout, driftout, dondokod_state, empty_init, ROT270, "Visco", "Drift Out (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, driveout, driftout, driveout, driftout, driveout_state, empty_init, ROT270, "bootleg", "Drive Out (bootleg of Drift Out)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, driveout, driftout, driveout, driftout, driveout_state, empty_init, ROT270, "bootleg (Electronic Devices)", "Drive Out (bootleg of Drift Out)", MACHINE_SUPPORTS_SAVE )

View File

@ -771,4 +771,4 @@ GAME( 1992, fixeightat, fixeight, fixeight, fixeight, fixeight_state, empty
GAME( 1992, fixeightut, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan (Taito license)", "FixEight (USA, Taito license)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, fixeightjt, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan (Taito license)", "FixEight - Jigoku no Eiyuu Densetsu (Japan, Taito license)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, fixeightbl, fixeight, fixeightbl, fixeightbl, fixeight_bootleg_state, init_fixeightbl, ROT270, "bootleg", "FixEight (Korea, bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, fixeightbl, fixeight, fixeightbl, fixeightbl, fixeight_bootleg_state, init_fixeightbl, ROT270, "bootleg (Shine)", "FixEight (Korea, bootleg)", MACHINE_SUPPORTS_SAVE )