diff --git a/.gitattributes b/.gitattributes index 56d8d2d0e3c..e36495fd9cb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2304,6 +2304,7 @@ src/mame/drivers/2mindril.c svneol=native#text/plain src/mame/drivers/30test.c svneol=native#text/plain src/mame/drivers/39in1.c svneol=native#text/plain src/mame/drivers/3do.c svneol=native#text/plain +src/mame/drivers/3x3puzzl.c svneol=native#text/plain src/mame/drivers/40love.c svneol=native#text/plain src/mame/drivers/4enraya.c svneol=native#text/plain src/mame/drivers/4roses.c svneol=native#text/plain diff --git a/src/mame/drivers/3x3puzzl.c b/src/mame/drivers/3x3puzzl.c new file mode 100644 index 00000000000..e6863733377 --- /dev/null +++ b/src/mame/drivers/3x3puzzl.c @@ -0,0 +1,342 @@ +/*************************************************************************** + +3x3 Puzzle +Ace + +Driver by Mariusz Wojcieszek and David Haywood + +Typical and simple Korean hardware..... + +68000 @ 10MHz +OKI M6295 @ 1MHz (4/4) +Lattice pLSI1032 for graphics generation +6264 SRAM x 2 +6116 SRAM x 8 +62256 SRAM x2 (main program RAM) +DIP SW 8-position X2 (SW1 SW2) +OSC 27MHz, 22.1184MHz, 10MHz +XTAL 4MHz + +Additional ROMs with 'a' in label are probably to convert +the game back to normal version as current set on the PCB +has adult graphics (sets provided are 'Normal' and 'Enterprise') + +***************************************************************************/ + + +#include "emu.h" +#include "cpu/m68000/m68000.h" +#include "sound/okim6295.h" + +#define MAIN_CLOCK XTAL_10MHz + +class _3x3puzzle_state : public driver_device +{ +public: + _3x3puzzle_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_oki(*this, "oki"), + m_videoram1(*this, "videoram1"), + m_videoram2(*this, "videoram2"), + m_videoram3(*this, "videoram3") + { } + + /* memory pointers */ + required_shared_ptr m_videoram1; + required_shared_ptr m_videoram2; + required_shared_ptr m_videoram3; + + // devices + required_device m_maincpu; + required_device m_oki; + + // screen updates + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + /* video-related */ + tilemap_t *m_tilemap1; + tilemap_t *m_tilemap2; + tilemap_t *m_tilemap3; + + DECLARE_WRITE16_MEMBER(videoram1_w); + TILE_GET_INFO_MEMBER(get_tile1_info); + DECLARE_WRITE16_MEMBER(videoram2_w); + TILE_GET_INFO_MEMBER(get_tile2_info); + DECLARE_WRITE16_MEMBER(videoram3_w); + TILE_GET_INFO_MEMBER(get_tile3_info); + + DECLARE_READ16_HANDLER(_600000_r); + DECLARE_READ16_HANDLER(_880000_r); + DECLARE_WRITE16_HANDLER(gfx_ctrl_w); + +protected: + // driver_device overrides + virtual void machine_start(); + virtual void machine_reset(); + + virtual void video_start(); + virtual void palette_init(); +}; + +WRITE16_MEMBER(_3x3puzzle_state::videoram1_w) +{ + COMBINE_DATA(&m_videoram1[offset]); + m_tilemap1->mark_tile_dirty(offset); +} + +TILE_GET_INFO_MEMBER(_3x3puzzle_state::get_tile1_info) +{ + UINT16 code = m_videoram1[tile_index]; + SET_TILE_INFO_MEMBER( + 0, + code, + 0, + 0); +} + +WRITE16_MEMBER(_3x3puzzle_state::videoram2_w) +{ + COMBINE_DATA(&m_videoram2[offset]); + m_tilemap2->mark_tile_dirty(offset); +} + +TILE_GET_INFO_MEMBER(_3x3puzzle_state::get_tile2_info) +{ + UINT16 code = m_videoram2[tile_index]; + SET_TILE_INFO_MEMBER( + 1, + code, + 1, + 0); +} + +WRITE16_MEMBER(_3x3puzzle_state::videoram3_w) +{ + COMBINE_DATA(&m_videoram3[offset]); + m_tilemap3->mark_tile_dirty(offset); +} + +TILE_GET_INFO_MEMBER(_3x3puzzle_state::get_tile3_info) +{ + UINT16 code = m_videoram3[tile_index]; + SET_TILE_INFO_MEMBER( + 2, + code, + 2, + 0); +} + +WRITE16_MEMBER(_3x3puzzle_state::gfx_ctrl_w) +{ + // bit 5 (0x20) cleared when palette is written + // bit 4 (0x10) screen width - 1: 512 pixels, 0: 320 pixels + // bit 3 (0x08) is set when 0x400000/0x480000 is written + + if ( BIT(data,4) ) + { + machine().primary_screen->set_visible_area(0*8, 64*8-1, 0*8, 32*8-1); + } + else + { + machine().primary_screen->set_visible_area(0*8, 40*8-1, 0*8, 32*8-1); + } +} + +void _3x3puzzle_state::video_start() +{ + m_tilemap1 = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(_3x3puzzle_state::get_tile1_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); + m_tilemap2 = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(_3x3puzzle_state::get_tile2_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); + m_tilemap3 = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(_3x3puzzle_state::get_tile3_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); + m_tilemap2->set_transparent_pen(0); + m_tilemap3->set_transparent_pen(0); +} + +UINT32 _3x3puzzle_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) +{ + m_tilemap1->draw(bitmap, cliprect, 0, 1); + m_tilemap2->draw(bitmap, cliprect, 0, 2); + m_tilemap3->draw(bitmap, cliprect, 0, 3); + return 0; +} + +READ16_MEMBER(_3x3puzzle_state::_600000_r) +{ + return 0xffff; // DSW? +} + +READ16_MEMBER(_3x3puzzle_state::_880000_r) +{ + return 0xffff; // ??? +} + +static ADDRESS_MAP_START( _3x3puzzle_map, AS_PROGRAM, 16, _3x3puzzle_state ) + AM_RANGE(0x000000, 0x03ffff) AM_ROM + AM_RANGE(0x100000, 0x10ffff) AM_RAM + AM_RANGE(0x200000, 0x2007ff) AM_WRITE(videoram1_w) AM_SHARE("videoram1") + AM_RANGE(0x201000, 0x201fff) AM_WRITE(videoram2_w) AM_SHARE("videoram2") + AM_RANGE(0x202000, 0x202fff) AM_WRITE(videoram3_w) AM_SHARE("videoram3") + AM_RANGE(0x280000, 0x280001) AM_READ_PORT("VBLANK") + AM_RANGE(0x300000, 0x3005ff) AM_RAM_WRITE(paletteram_xBBBBBGGGGGRRRRR_word_w) AM_SHARE("paletteram") + AM_RANGE(0x400000, 0x400001) AM_WRITENOP // scroll? + AM_RANGE(0x480000, 0x480001) AM_WRITENOP + AM_RANGE(0x500000, 0x500001) AM_READ_PORT("P1") + AM_RANGE(0x580000, 0x580001) AM_READ_PORT("P2") + AM_RANGE(0x600000, 0x600001) AM_READ(_600000_r) + AM_RANGE(0x700000, 0x700001) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff) + AM_RANGE(0x800000, 0x800001) AM_WRITE(gfx_ctrl_w) + AM_RANGE(0x880000, 0x880001) AM_READ(_880000_r) +ADDRESS_MAP_END + +static INPUT_PORTS_START( _3x3puzzle ) + PORT_START("P1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("P2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0xfc, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("VBLANK") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") + +INPUT_PORTS_END + +static const gfx_layout tiles16x16x8_layout = +{ + 16,16, + RGN_FRAC(1,1), + 8, + { 0,1, 2,3, 4,5,6,7 }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 }, + { 0*128, 1*128, 2*128, 3*128, 4*128, 5*128, 6*128, 7*128, 8*128, 9*128,10*128,11*128,12*128,13*128,14*128,15*128 }, + 128*16 +}; + +static const gfx_layout tiles8x8_layout = +{ + 8,8, + RGN_FRAC(1,1), + 8 , + { 0,1,2,3,4,5,6,7 }, + { 3*8,2*8,1*8,0*8,7*8,6*8,5*8,4*8 }, + { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64 }, + 8*64 +}; + + +static GFXDECODE_START( _3x3puzzle ) + GFXDECODE_ENTRY( "gfx1", 0, tiles16x16x8_layout, 0, 3 ) + GFXDECODE_ENTRY( "gfx2", 0, tiles8x8_layout, 0, 3 ) + GFXDECODE_ENTRY( "gfx3", 0, tiles8x8_layout, 0, 3 ) +GFXDECODE_END + + +void _3x3puzzle_state::machine_start() +{ +} + +void _3x3puzzle_state::machine_reset() +{ +} + + +void _3x3puzzle_state::palette_init() +{ + +} + +static MACHINE_CONFIG_START( _3x3puzzle, _3x3puzzle_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu",M68000,MAIN_CLOCK) + MCFG_CPU_PROGRAM_MAP(_3x3puzzle_map) + MCFG_CPU_VBLANK_INT_DRIVER("screen", _3x3puzzle_state, irq4_line_hold) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) + MCFG_SCREEN_UPDATE_DRIVER(_3x3puzzle_state, screen_update) + MCFG_SCREEN_SIZE(64*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 32*8-1) + + MCFG_GFXDECODE(_3x3puzzle) + + MCFG_PALETTE_LENGTH(0x600/2) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_OKIM6295_ADD("oki", XTAL_4MHz/4, OKIM6295_PIN7_HIGH) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) +MACHINE_CONFIG_END + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( 3x3puzzl ) + ROM_REGION( 0x400000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "1.bin", 0x000000, 0x20000, CRC(e9c39ee7) SHA1(8557eeaff33ac8e11fd545482bd9e48f9a58eba3) ) + ROM_LOAD16_BYTE( "2.bin", 0x000001, 0x20000, CRC(524963be) SHA1(05428ccc823c35b6c4d182a1dff1c9aa6b71e616) ) + + ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASE00 ) + ROM_LOAD32_BYTE("3.bin", 0x000000, 0x080000, CRC(53c2aa6a) SHA1(d2ebb10eb8311ff5226793e7b373e152b21c602c) ) + ROM_LOAD32_BYTE("4.bin", 0x000001, 0x080000, CRC(fb0b76fd) SHA1(23c9a5979452c21381107641d5cd49b34ad00471) ) + ROM_LOAD32_BYTE("5.bin", 0x000002, 0x080000, CRC(b6c1e108) SHA1(44c97e0582b9ee85465040d56eda9efd06c25533) ) + ROM_LOAD32_BYTE("6.bin", 0x000003, 0x080000, CRC(47cb0e8e) SHA1(13d39b1eb4fcfeafc8d821871750f37377449b80) ) + + ROM_REGION( 0x080000, "gfx2", ROMREGION_ERASE00 ) + ROM_LOAD32_BYTE("7.bin", 0x000000, 0x020000, CRC(45b1f58b) SHA1(7faee993b87ef14eef1c5ba3fcc7d0747494dbf5) ) + ROM_LOAD32_BYTE("8.bin", 0x000001, 0x020000, CRC(c0d404a7) SHA1(7991e711f6933bc3809f3c562e21a775a9a2dcf3) ) + ROM_LOAD32_BYTE("9.bin", 0x000002, 0x020000, CRC(6b303aa9) SHA1(1750da9148978f59904c2bf9e99f967e5bdd5a92) ) + ROM_LOAD32_BYTE("10.bin", 0x000003, 0x020000, CRC(6d0107bc) SHA1(a6f30a482586136304af510eee0a93df450673bd) ) + + ROM_REGION( 0x080000, "gfx3", ROMREGION_ERASE00 ) + ROM_LOAD32_BYTE("11.bin", 0x000000, 0x020000, CRC(e124c0b5) SHA1(9b819691b7ca7f0561f4fce05083c8507e138bfe) ) + ROM_LOAD32_BYTE("12.bin", 0x000001, 0x020000, CRC(ae4a8707) SHA1(f54337e4b666dc2f38df0ea96e9c8f4d7c4ebe52) ) + ROM_LOAD32_BYTE("13.bin", 0x000002, 0x020000, CRC(f06925d1) SHA1(a45b72da57c7d967dec2fcad12e6a7864f5442e8) ) + ROM_LOAD32_BYTE("14.bin", 0x000003, 0x020000, CRC(07252636) SHA1(00730c203e20af9e18a792e26de7aeac5d090ebf) ) + + ROM_REGION(0x80000, "oki", 0 ) + ROM_LOAD("15.bin", 0x000000, 0x080000, CRC(d3aff355) SHA1(117f7bbd6cab370f65e308d78291732dfc079365) ) +ROM_END + +ROM_START( 3x3puzzla ) + ROM_REGION( 0x400000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "1a.bin", 0x000000, 0x20000, CRC(425c5896) SHA1(78d709b729f160b1e20a61a795361113dbb4fb52) ) + ROM_LOAD16_BYTE( "2a.bin", 0x000001, 0x20000, CRC(4db710b7) SHA1(df7a3496aac9cfdaee4fd504d88772b07a8fdb2b) ) + + ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASE00 ) + ROM_LOAD32_BYTE("3a.bin", 0x000000, 0x080000, CRC(33bff952) SHA1(11d06462041e7cf8aa2ae422ed74ba23f6934478) ) + ROM_LOAD32_BYTE("4a.bin", 0x000001, 0x080000, CRC(222996d8) SHA1(fb8fd45a43e78dd9700ffb46fa886f62e7c32e61) ) + ROM_LOAD32_BYTE("5a.bin", 0x000002, 0x080000, CRC(5b209844) SHA1(8a34958ecd9c26272708237028e279dd347c729f) ) + ROM_LOAD32_BYTE("6a.bin", 0x000003, 0x080000, CRC(f1136bba) SHA1(486c41bd08c4039bfe46500540fc4ae0f1497232) ) + + ROM_REGION( 0x080000, "gfx2", ROMREGION_ERASE00 ) + ROM_LOAD32_BYTE("7.bin", 0x000000, 0x020000, CRC(45b1f58b) SHA1(7faee993b87ef14eef1c5ba3fcc7d0747494dbf5) ) + ROM_LOAD32_BYTE("8.bin", 0x000001, 0x020000, CRC(c0d404a7) SHA1(7991e711f6933bc3809f3c562e21a775a9a2dcf3) ) + ROM_LOAD32_BYTE("9.bin", 0x000002, 0x020000, CRC(6b303aa9) SHA1(1750da9148978f59904c2bf9e99f967e5bdd5a92) ) + ROM_LOAD32_BYTE("10.bin", 0x000003, 0x020000, CRC(6d0107bc) SHA1(a6f30a482586136304af510eee0a93df450673bd) ) + + ROM_REGION( 0x080000, "gfx3", ROMREGION_ERASE00 ) + ROM_LOAD32_BYTE("11.bin", 0x000000, 0x020000, CRC(e124c0b5) SHA1(9b819691b7ca7f0561f4fce05083c8507e138bfe) ) + ROM_LOAD32_BYTE("12.bin", 0x000001, 0x020000, CRC(ae4a8707) SHA1(f54337e4b666dc2f38df0ea96e9c8f4d7c4ebe52) ) + ROM_LOAD32_BYTE("13.bin", 0x000002, 0x020000, CRC(f06925d1) SHA1(a45b72da57c7d967dec2fcad12e6a7864f5442e8) ) + ROM_LOAD32_BYTE("14.bin", 0x000003, 0x020000, CRC(07252636) SHA1(00730c203e20af9e18a792e26de7aeac5d090ebf) ) + + ROM_REGION(0x80000, "oki", 0 ) + ROM_LOAD("15.bin", 0x000000, 0x080000, CRC(d3aff355) SHA1(117f7bbd6cab370f65e308d78291732dfc079365) ) +ROM_END + + +GAME( 199?, 3x3puzzl, 0, _3x3puzzle, _3x3puzzle, driver_device, 0, ROT0, "Ace", "3X3 Puzzle (Enterprise)", 0 ) +GAME( 199?, 3x3puzzla, 3x3puzzl, _3x3puzzle, _3x3puzzle, driver_device, 0, ROT0, "Ace", "3X3 Puzzle (Normal)", 0 ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 077e4e7dffa..fa8de616b0f 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -10258,6 +10258,8 @@ bingor4 // (c) 2002 Unknown bingor5 // (c) 2002 Unknown galgame // (c) 1971 Computer Recreations, Inc ichiban // (c) 199? Excel +3x3puzzl // (c) 199? Ace +3x3puzzla // (c) 199? Ace // InterFlip / Recreativos Franco videopkr // (c) 1984 InterFlip diff --git a/src/mame/mame.mak b/src/mame/mame.mak index e24031a755e..0a565da0367 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -1708,6 +1708,7 @@ $(MAMEOBJ)/misc.a: \ $(DRIVERS)/1945kiii.o \ $(DRIVERS)/39in1.o \ $(DRIVERS)/3do.o $(MACHINE)/3do.o \ + $(DRIVERS)/3x3puzzl.o \ $(DRIVERS)/4enraya.o $(VIDEO)/4enraya.o \ $(DRIVERS)/5clown.o \ $(DRIVERS)/acefruit.o \