mirror of
https://github.com/holub/mame
synced 2025-07-02 00:29:37 +03:00
New working clones
------------------ Penguin-Kun Wars (Japan, set 2) [Dwayne Kirkwood]
This commit is contained in:
parent
35f2c79feb
commit
b535e7de2a
@ -10,12 +10,16 @@ Hardware notes:
|
|||||||
- molex socket for 4KB cartridges
|
- molex socket for 4KB cartridges
|
||||||
- 1KB external RAM (2*MM2114N)
|
- 1KB external RAM (2*MM2114N)
|
||||||
- 40 small rectangular red LEDs, a motor with a fast spinning mirror gives the
|
- 40 small rectangular red LEDs, a motor with a fast spinning mirror gives the
|
||||||
illusion of a 150*40 screen (similar to Nintendo Virtual Boy)
|
illusion of a 150*40 screen
|
||||||
- 4-way joystick, 8 buttons (other than having buttons 2/4 swapped, left and
|
- 4-way joystick, 8 buttons (other than having buttons 2/4 swapped, left and
|
||||||
right button panels are electronically the same)
|
right button panels are electronically the same)
|
||||||
- expansion port (unused)
|
- expansion port (unused)
|
||||||
|
|
||||||
The mirror is faked in MAME. On the real thing, the picture is not as stable.
|
The mirror rotates at around 7.5Hz, the motor speed is not controlled by software.
|
||||||
|
There's a mirror on both sides so the display refreshes at around 15Hz. A similar
|
||||||
|
technology was later used in the Nintendo Virtual Boy.
|
||||||
|
|
||||||
|
The display is faked in MAME. On the real thing, the picture is not as stable.
|
||||||
|
|
||||||
A game cartridge is basically an EPROM chip wearing a jacket, there is no
|
A game cartridge is basically an EPROM chip wearing a jacket, there is no
|
||||||
dedicated cartridge slot as is common on other consoles. Only 4 games were
|
dedicated cartridge slot as is common on other consoles. Only 4 games were
|
||||||
@ -23,7 +27,7 @@ released in total.
|
|||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
- EA banking is ugly, it can be turd-polished but the real issue is in mcs48
|
- EA banking is ugly, it can be turd-polished but the real issue is in mcs48
|
||||||
- display refresh is actually 15Hz, but doing that will make MAME very sluggish
|
- display refresh is actually ~15Hz, but doing that will make MAME very sluggish
|
||||||
- Do the spinning mirror simulation differently? Right now it relies on the BIOS
|
- Do the spinning mirror simulation differently? Right now it relies on the BIOS
|
||||||
specifying a width of 150, and the official games work fine. But it should be
|
specifying a width of 150, and the official games work fine. But it should be
|
||||||
possible to update the leds at a different rate. In fact, the homebrew demo
|
possible to update the leds at a different rate. In fact, the homebrew demo
|
||||||
@ -82,7 +86,7 @@ private:
|
|||||||
|
|
||||||
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
DECLARE_WRITE_LINE_MEMBER(vblank);
|
DECLARE_WRITE_LINE_MEMBER(vblank);
|
||||||
void vh_update(int x);
|
void vh_update();
|
||||||
|
|
||||||
u8 ext_ram_r(offs_t offset);
|
u8 ext_ram_r(offs_t offset);
|
||||||
void ext_ram_w(offs_t offset, u8 data);
|
void ext_ram_w(offs_t offset, u8 data);
|
||||||
@ -98,15 +102,15 @@ private:
|
|||||||
|
|
||||||
memory_region *m_cart_rom = nullptr;
|
memory_region *m_cart_rom = nullptr;
|
||||||
std::vector<u8> m_ext_ram;
|
std::vector<u8> m_ext_ram;
|
||||||
int m_rambank = 0;
|
u16 m_rambank = 0;
|
||||||
|
|
||||||
int m_video_enable = 0;
|
u8 m_video_enable = 0;
|
||||||
int m_video_bank = 0;
|
u8 m_video_bank = 0;
|
||||||
int m_video_hpos = 0;
|
u8 m_video_hpos = 0;
|
||||||
u8 m_led_latch[5] = { };
|
u8 m_led_latch[5] = { };
|
||||||
std::unique_ptr<u8 []> m_display;
|
std::unique_ptr<u8 []> m_display;
|
||||||
|
|
||||||
int m_sound_cmd = 0;
|
u8 m_sound_cmd = 0;
|
||||||
|
|
||||||
void io_map(address_map &map);
|
void io_map(address_map &map);
|
||||||
void program_map(address_map &map);
|
void program_map(address_map &map);
|
||||||
@ -137,9 +141,9 @@ u32 advision_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void advision_state::vh_update(int x)
|
void advision_state::vh_update()
|
||||||
{
|
{
|
||||||
u8 *dst = &m_display[x];
|
u8 *dst = &m_display[m_video_hpos];
|
||||||
|
|
||||||
for (int y = 4; y >= 0; y--)
|
for (int y = 4; y >= 0; y--)
|
||||||
{
|
{
|
||||||
@ -149,22 +153,15 @@ void advision_state::vh_update(int x)
|
|||||||
m_led_latch[y] = 0xff;
|
m_led_latch[y] = 0xff;
|
||||||
dst += 8 * 256;
|
dst += 8 * 256;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (++m_video_hpos == 0)
|
||||||
|
logerror("HPOS OVERFLOW\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void advision_state::av_control_w(u8 data)
|
void advision_state::av_control_w(u8 data)
|
||||||
{
|
{
|
||||||
if ((m_video_enable == 0x00) && (data & 0x10))
|
if ((m_video_enable == 0x00) && (data & 0x10))
|
||||||
{
|
vh_update();
|
||||||
vh_update(m_video_hpos);
|
|
||||||
|
|
||||||
m_video_hpos++;
|
|
||||||
|
|
||||||
if (m_video_hpos > 255)
|
|
||||||
{
|
|
||||||
m_video_hpos = 0;
|
|
||||||
logerror("HPOS OVERFLOW\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_video_enable = data & 0x10;
|
m_video_enable = data & 0x10;
|
||||||
m_video_bank = (data & 0xe0) >> 5;
|
m_video_bank = (data & 0xe0) >> 5;
|
||||||
|
@ -33922,6 +33922,7 @@ nova2001h // hack?
|
|||||||
nova2001u // UPL-83005 (c) [1983] + Universal license
|
nova2001u // UPL-83005 (c) [1983] + Universal license
|
||||||
pkunwar // UPL-????? (c) 1985 (Arcade Game TV List - P.98, Left, 22 from top)
|
pkunwar // UPL-????? (c) 1985 (Arcade Game TV List - P.98, Left, 22 from top)
|
||||||
pkunwarj // UPL-????? (c) 1985 (Arcade Game TV List - P.98, Left, 22 from top)
|
pkunwarj // UPL-????? (c) 1985 (Arcade Game TV List - P.98, Left, 22 from top)
|
||||||
|
pkunwarja //
|
||||||
raiders5 // UPL-85004 (c) 1985
|
raiders5 // UPL-85004 (c) 1985
|
||||||
raiders5t // UPL-85004 (c) 1985 Taito license
|
raiders5t // UPL-85004 (c) 1985 Taito license
|
||||||
raiders5ta //
|
raiders5ta //
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// license:BSD-3-Clause
|
// license:BSD-3-Clause
|
||||||
// copyright-holders:Howie Cohen, Frank Palazzolo, Alex Pasadyn, David Haywood, Phil Stroffolino, Uki,Stephane Humbert
|
// copyright-holders:Howie Cohen, Frank Palazzolo, Alex Pasadyn, David Haywood, Phil Stroffolino, Uki, Stephane Humbert
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
|
||||||
UPL "orthogonal palette" hardware
|
UPL "orthogonal palette" hardware
|
||||||
@ -25,7 +25,7 @@ Game Board
|
|||||||
------------------------ ---------
|
------------------------ ---------
|
||||||
Nova 2001 UPL-83005
|
Nova 2001 UPL-83005
|
||||||
Ninjakun Majou no Bouken UPL-84003
|
Ninjakun Majou no Bouken UPL-84003
|
||||||
Penguin Kun Wars UPL-?????
|
Penguin Kun Wars UPL-85003
|
||||||
Raiders5 UPL-85004
|
Raiders5 UPL-85004
|
||||||
|
|
||||||
Hardware Overview:
|
Hardware Overview:
|
||||||
@ -139,7 +139,6 @@ e000 - e7ff R/W Work RAM
|
|||||||
*
|
*
|
||||||
*************************************/
|
*************************************/
|
||||||
|
|
||||||
|
|
||||||
CUSTOM_INPUT_MEMBER(nova2001_state::ninjakun_io_A002_ctrl_r)
|
CUSTOM_INPUT_MEMBER(nova2001_state::ninjakun_io_A002_ctrl_r)
|
||||||
{
|
{
|
||||||
return m_ninjakun_io_a002_ctrl;
|
return m_ninjakun_io_a002_ctrl;
|
||||||
@ -580,6 +579,7 @@ static INPUT_PORTS_START( raiders5ta )
|
|||||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||||
INPUT_PORTS_END
|
INPUT_PORTS_END
|
||||||
|
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
*
|
*
|
||||||
* Graphics layouts
|
* Graphics layouts
|
||||||
@ -812,8 +812,8 @@ ROM_START( nova2001h )
|
|||||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||||
// roms 1 and 2 had green stickers, but looks like an unofficial mod, bytes have been added in empty space to fix game checksum after mods were made to code.
|
// roms 1 and 2 had green stickers, but looks like an unofficial mod, bytes have been added in empty space to fix game checksum after mods were made to code.
|
||||||
// one of the mods fixes the game resetting if the coin input is held down for too short / long of a period, the purpose of the other is unknown.
|
// one of the mods fixes the game resetting if the coin input is held down for too short / long of a period, the purpose of the other is unknown.
|
||||||
ROM_LOAD( "1,green.6c", 0x0000, 0x2000, CRC(1a8731b3) SHA1(a865d1cb070686dfa19e0da887c599455692a860) )
|
ROM_LOAD( "1_green.6c", 0x0000, 0x2000, CRC(1a8731b3) SHA1(a865d1cb070686dfa19e0da887c599455692a860) )
|
||||||
ROM_LOAD( "2,green.6d", 0x2000, 0x2000, CRC(bc4e442b) SHA1(6e1dca5dde442db95403377bf49aaad2a337813e) ) // not actually modified?
|
ROM_LOAD( "2_green.6d", 0x2000, 0x2000, CRC(bc4e442b) SHA1(6e1dca5dde442db95403377bf49aaad2a337813e) ) // not actually modified?
|
||||||
ROM_LOAD( "3.6f", 0x4000, 0x2000, CRC(b2849038) SHA1(b56c7c03ef7c677cc6df0280a485f9cda3435b23) )
|
ROM_LOAD( "3.6f", 0x4000, 0x2000, CRC(b2849038) SHA1(b56c7c03ef7c677cc6df0280a485f9cda3435b23) )
|
||||||
ROM_LOAD( "4.6g", 0x6000, 0x1000, CRC(6b5bb12d) SHA1(74aee3d08a7ee1f98eaec4a4b3062aa9d17948ec) )
|
ROM_LOAD( "4.6g", 0x6000, 0x1000, CRC(6b5bb12d) SHA1(74aee3d08a7ee1f98eaec4a4b3062aa9d17948ec) )
|
||||||
ROM_RELOAD( 0x7000, 0x1000 ) // half size ROM, mirrored
|
ROM_RELOAD( 0x7000, 0x1000 ) // half size ROM, mirrored
|
||||||
@ -901,6 +901,22 @@ ROM_START( pkunwarj )
|
|||||||
ROM_LOAD( "pkwar.col", 0x0000, 0x0020, CRC(af0fc5e2) SHA1(480908bf893211b580ae19cfb40dc35ad1bbc343) )
|
ROM_LOAD( "pkwar.col", 0x0000, 0x0020, CRC(af0fc5e2) SHA1(480908bf893211b580ae19cfb40dc35ad1bbc343) )
|
||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
|
ROM_START( pkunwarja )
|
||||||
|
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||||
|
ROM_LOAD( "peng_wars_1_red.7a", 0x0000, 0x4000, CRC(9dfdf1b2) SHA1(10ade29129de846f0f6110957d179d192220e71c) )
|
||||||
|
ROM_LOAD( "peng_wars_2_red.7b", 0x4000, 0x4000, CRC(bc286b8c) SHA1(a034f11952bc0b278eb46c508fc41d34948fb29c) )
|
||||||
|
ROM_LOAD( "3_red.5b", 0xe000, 0x2000, CRC(56faebea) SHA1(dd0406c723a08f5d1120655857a115ab8c2d2a11) )
|
||||||
|
|
||||||
|
ROM_REGION( 0x10000, "gfx1", 0 ) // (need lineswapping)
|
||||||
|
ROM_LOAD( "1_yellow.7h", 0x0000, 0x4000, CRC(428d3b92) SHA1(7fe11e8d785fe829d34e512f233bb9ccc70cd431) )
|
||||||
|
ROM_LOAD( "2_yellow.7k", 0x4000, 0x4000, CRC(ce1da7bc) SHA1(a2357b61703a689ce63aec7dd44702b119894f8e) )
|
||||||
|
ROM_LOAD( "3_yellow.7l", 0x8000, 0x4000, CRC(a2a43443) SHA1(4e10569886d364eb2539928ea81dc1565b60b590) )
|
||||||
|
ROM_LOAD( "4_yellow.7m", 0xc000, 0x4000, CRC(061dfca8) SHA1(0a2dd8fc790d607195ca18dfc55575c2b9ddc58a) )
|
||||||
|
|
||||||
|
ROM_REGION( 0x0020, "proms", 0 )
|
||||||
|
ROM_LOAD( "tbp18s030n.1f", 0x0000, 0x0020, CRC(af0fc5e2) SHA1(480908bf893211b580ae19cfb40dc35ad1bbc343) )
|
||||||
|
ROM_END
|
||||||
|
|
||||||
ROM_START( raiders5 )
|
ROM_START( raiders5 )
|
||||||
ROM_REGION( 0x8000, "maincpu", 0 )
|
ROM_REGION( 0x8000, "maincpu", 0 )
|
||||||
ROM_LOAD( "raiders5.1", 0x0000, 0x4000, CRC(47cea11f) SHA1(0499e6627ad9c16775fdc59f2ff56dfdfc23490a) )
|
ROM_LOAD( "raiders5.1", 0x0000, 0x4000, CRC(47cea11f) SHA1(0499e6627ad9c16775fdc59f2ff56dfdfc23490a) )
|
||||||
@ -977,19 +993,13 @@ This code is overly generic because it is used for several games in ninjakd2.cpp
|
|||||||
void nova2001_state::lineswap_gfx_roms(const char *region, const int bit)
|
void nova2001_state::lineswap_gfx_roms(const char *region, const int bit)
|
||||||
{
|
{
|
||||||
const int length = memregion(region)->bytes();
|
const int length = memregion(region)->bytes();
|
||||||
|
|
||||||
u8* const src = memregion(region)->base();
|
u8* const src = memregion(region)->base();
|
||||||
|
|
||||||
std::vector<u8> temp(length);
|
std::vector<u8> temp(length);
|
||||||
|
|
||||||
const int mask = (1 << (bit + 1)) - 1;
|
const int mask = (1 << (bit + 1)) - 1;
|
||||||
|
|
||||||
int sa;
|
for (int sa = 0; sa < length; sa++)
|
||||||
|
|
||||||
for (sa = 0; sa < length; sa++)
|
|
||||||
{
|
{
|
||||||
const int da = (sa & ~mask) | ((sa << 1) & mask) | ((sa >> bit) & 1);
|
const int da = (sa & ~mask) | ((sa << 1) & mask) | ((sa >> bit) & 1);
|
||||||
|
|
||||||
temp[da] = src[sa];
|
temp[da] = src[sa];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1025,13 +1035,17 @@ void nova2001_state::init_raiders5()
|
|||||||
|
|
||||||
// many of these don't explicitly state Japan, eg. Nova 2001 could easily be used anywhere.
|
// many of these don't explicitly state Japan, eg. Nova 2001 could easily be used anywhere.
|
||||||
|
|
||||||
// YEAR, NAME, PARENT, MACHINE, INPUT, STATE, INIT, MONITOR,COMPANY,FULLNAME,FLAGS
|
// YEAR, NAME, PARENT, MACHINE, INPUT, CLASS, INIT, SCREEN, COMPANY, FULLNAME, FLAGS
|
||||||
GAME( 1983, nova2001, 0, nova2001, nova2001, nova2001_state, empty_init, ROT0, "UPL", "Nova 2001 (Japan)", MACHINE_SUPPORTS_SAVE )
|
GAME( 1983, nova2001, 0, nova2001, nova2001, nova2001_state, empty_init, ROT0, "UPL", "Nova 2001 (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||||
GAME( 1983, nova2001h, nova2001, nova2001, nova2001, nova2001_state, empty_init, ROT0, "UPL", "Nova 2001 (Japan, hack?)", MACHINE_SUPPORTS_SAVE )
|
GAME( 1983, nova2001h, nova2001, nova2001, nova2001, nova2001_state, empty_init, ROT0, "UPL", "Nova 2001 (Japan, hack?)", MACHINE_SUPPORTS_SAVE )
|
||||||
GAME( 1983, nova2001u, nova2001, nova2001, nova2001, nova2001_state, empty_init, ROT0, "UPL (Universal license)", "Nova 2001 (US)", MACHINE_SUPPORTS_SAVE )
|
GAME( 1983, nova2001u, nova2001, nova2001, nova2001, nova2001_state, empty_init, ROT0, "UPL (Universal license)", "Nova 2001 (US)", MACHINE_SUPPORTS_SAVE )
|
||||||
|
|
||||||
GAME( 1984, ninjakun, 0, ninjakun, ninjakun, nova2001_state, empty_init, ROT0, "UPL (Taito license)", "Ninjakun Majou no Bouken", MACHINE_SUPPORTS_SAVE )
|
GAME( 1984, ninjakun, 0, ninjakun, ninjakun, nova2001_state, empty_init, ROT0, "UPL (Taito license)", "Ninjakun Majou no Bouken", MACHINE_SUPPORTS_SAVE )
|
||||||
|
|
||||||
GAME( 1985, pkunwar, 0, pkunwar, pkunwar, nova2001_state, init_pkunwar, ROT0, "UPL", "Penguin-Kun Wars (US)", MACHINE_SUPPORTS_SAVE )
|
GAME( 1985, pkunwar, 0, pkunwar, pkunwar, nova2001_state, init_pkunwar, ROT0, "UPL", "Penguin-Kun Wars (US)", MACHINE_SUPPORTS_SAVE )
|
||||||
GAME( 1985, pkunwarj, pkunwar, pkunwar, pkunwar, nova2001_state, init_pkunwar, ROT0, "UPL", "Penguin-Kun Wars (Japan)", MACHINE_SUPPORTS_SAVE )
|
GAME( 1985, pkunwarj, pkunwar, pkunwar, pkunwar, nova2001_state, init_pkunwar, ROT0, "UPL", "Penguin-Kun Wars (Japan, set 1)", MACHINE_SUPPORTS_SAVE )
|
||||||
|
GAME( 1985, pkunwarja, pkunwar, pkunwar, pkunwar, nova2001_state, init_pkunwar, ROT0, "UPL", "Penguin-Kun Wars (Japan, set 2)", MACHINE_SUPPORTS_SAVE )
|
||||||
|
|
||||||
GAME( 1985, raiders5, 0, raiders5, raiders5, nova2001_state, init_raiders5, ROT0, "UPL", "Raiders5", MACHINE_SUPPORTS_SAVE )
|
GAME( 1985, raiders5, 0, raiders5, raiders5, nova2001_state, init_raiders5, ROT0, "UPL", "Raiders5", MACHINE_SUPPORTS_SAVE )
|
||||||
GAME( 1985, raiders5t, raiders5, raiders5, raiders5, nova2001_state, init_raiders5, ROT0, "UPL (Taito license)", "Raiders5 (Japan, set 1)", MACHINE_SUPPORTS_SAVE )
|
GAME( 1985, raiders5t, raiders5, raiders5, raiders5, nova2001_state, init_raiders5, ROT0, "UPL (Taito license)", "Raiders5 (Japan, set 1)", MACHINE_SUPPORTS_SAVE )
|
||||||
GAME( 1985, raiders5ta,raiders5, raiders5, raiders5ta,nova2001_state, init_raiders5, ROT0, "UPL (Taito license)", "Raiders5 (Japan, set 2, bootleg?)", MACHINE_SUPPORTS_SAVE )
|
GAME( 1985, raiders5ta,raiders5, raiders5, raiders5ta, nova2001_state, init_raiders5, ROT0, "UPL (Taito license)", "Raiders5 (Japan, set 2, bootleg?)", MACHINE_SUPPORTS_SAVE )
|
||||||
|
Loading…
Reference in New Issue
Block a user