trunk/src/mame/drivers/3x3puzzl.c
| r0 | r18384 | |
| 1 | /*************************************************************************** |
| 2 | |
| 3 | 3x3 Puzzle |
| 4 | Ace |
| 5 | |
| 6 | Driver by Mariusz Wojcieszek and David Haywood |
| 7 | |
| 8 | Typical and simple Korean hardware..... |
| 9 | |
| 10 | 68000 @ 10MHz |
| 11 | OKI M6295 @ 1MHz (4/4) |
| 12 | Lattice pLSI1032 for graphics generation |
| 13 | 6264 SRAM x 2 |
| 14 | 6116 SRAM x 8 |
| 15 | 62256 SRAM x2 (main program RAM) |
| 16 | DIP SW 8-position X2 (SW1 SW2) |
| 17 | OSC 27MHz, 22.1184MHz, 10MHz |
| 18 | XTAL 4MHz |
| 19 | |
| 20 | Additional ROMs with 'a' in label are probably to convert |
| 21 | the game back to normal version as current set on the PCB |
| 22 | has adult graphics (sets provided are 'Normal' and 'Enterprise') |
| 23 | |
| 24 | ***************************************************************************/ |
| 25 | |
| 26 | |
| 27 | #include "emu.h" |
| 28 | #include "cpu/m68000/m68000.h" |
| 29 | #include "sound/okim6295.h" |
| 30 | |
| 31 | #define MAIN_CLOCK XTAL_10MHz |
| 32 | |
| 33 | class _3x3puzzle_state : public driver_device |
| 34 | { |
| 35 | public: |
| 36 | _3x3puzzle_state(const machine_config &mconfig, device_type type, const char *tag) |
| 37 | : driver_device(mconfig, type, tag), |
| 38 | m_maincpu(*this, "maincpu"), |
| 39 | m_oki(*this, "oki"), |
| 40 | m_videoram1(*this, "videoram1"), |
| 41 | m_videoram2(*this, "videoram2"), |
| 42 | m_videoram3(*this, "videoram3") |
| 43 | { } |
| 44 | |
| 45 | /* memory pointers */ |
| 46 | required_shared_ptr<UINT16> m_videoram1; |
| 47 | required_shared_ptr<UINT16> m_videoram2; |
| 48 | required_shared_ptr<UINT16> m_videoram3; |
| 49 | |
| 50 | // devices |
| 51 | required_device<cpu_device> m_maincpu; |
| 52 | required_device<okim6295_device> m_oki; |
| 53 | |
| 54 | // screen updates |
| 55 | UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 56 | |
| 57 | /* video-related */ |
| 58 | tilemap_t *m_tilemap1; |
| 59 | tilemap_t *m_tilemap2; |
| 60 | tilemap_t *m_tilemap3; |
| 61 | |
| 62 | DECLARE_WRITE16_MEMBER(videoram1_w); |
| 63 | TILE_GET_INFO_MEMBER(get_tile1_info); |
| 64 | DECLARE_WRITE16_MEMBER(videoram2_w); |
| 65 | TILE_GET_INFO_MEMBER(get_tile2_info); |
| 66 | DECLARE_WRITE16_MEMBER(videoram3_w); |
| 67 | TILE_GET_INFO_MEMBER(get_tile3_info); |
| 68 | |
| 69 | DECLARE_READ16_HANDLER(_600000_r); |
| 70 | DECLARE_READ16_HANDLER(_880000_r); |
| 71 | DECLARE_WRITE16_HANDLER(gfx_ctrl_w); |
| 72 | |
| 73 | protected: |
| 74 | // driver_device overrides |
| 75 | virtual void machine_start(); |
| 76 | virtual void machine_reset(); |
| 77 | |
| 78 | virtual void video_start(); |
| 79 | virtual void palette_init(); |
| 80 | }; |
| 81 | |
| 82 | WRITE16_MEMBER(_3x3puzzle_state::videoram1_w) |
| 83 | { |
| 84 | COMBINE_DATA(&m_videoram1[offset]); |
| 85 | m_tilemap1->mark_tile_dirty(offset); |
| 86 | } |
| 87 | |
| 88 | TILE_GET_INFO_MEMBER(_3x3puzzle_state::get_tile1_info) |
| 89 | { |
| 90 | UINT16 code = m_videoram1[tile_index]; |
| 91 | SET_TILE_INFO_MEMBER( |
| 92 | 0, |
| 93 | code, |
| 94 | 0, |
| 95 | 0); |
| 96 | } |
| 97 | |
| 98 | WRITE16_MEMBER(_3x3puzzle_state::videoram2_w) |
| 99 | { |
| 100 | COMBINE_DATA(&m_videoram2[offset]); |
| 101 | m_tilemap2->mark_tile_dirty(offset); |
| 102 | } |
| 103 | |
| 104 | TILE_GET_INFO_MEMBER(_3x3puzzle_state::get_tile2_info) |
| 105 | { |
| 106 | UINT16 code = m_videoram2[tile_index]; |
| 107 | SET_TILE_INFO_MEMBER( |
| 108 | 1, |
| 109 | code, |
| 110 | 1, |
| 111 | 0); |
| 112 | } |
| 113 | |
| 114 | WRITE16_MEMBER(_3x3puzzle_state::videoram3_w) |
| 115 | { |
| 116 | COMBINE_DATA(&m_videoram3[offset]); |
| 117 | m_tilemap3->mark_tile_dirty(offset); |
| 118 | } |
| 119 | |
| 120 | TILE_GET_INFO_MEMBER(_3x3puzzle_state::get_tile3_info) |
| 121 | { |
| 122 | UINT16 code = m_videoram3[tile_index]; |
| 123 | SET_TILE_INFO_MEMBER( |
| 124 | 2, |
| 125 | code, |
| 126 | 2, |
| 127 | 0); |
| 128 | } |
| 129 | |
| 130 | WRITE16_MEMBER(_3x3puzzle_state::gfx_ctrl_w) |
| 131 | { |
| 132 | // bit 5 (0x20) cleared when palette is written |
| 133 | // bit 4 (0x10) screen width - 1: 512 pixels, 0: 320 pixels |
| 134 | // bit 3 (0x08) is set when 0x400000/0x480000 is written |
| 135 | |
| 136 | if ( BIT(data,4) ) |
| 137 | { |
| 138 | machine().primary_screen->set_visible_area(0*8, 64*8-1, 0*8, 32*8-1); |
| 139 | } |
| 140 | else |
| 141 | { |
| 142 | machine().primary_screen->set_visible_area(0*8, 40*8-1, 0*8, 32*8-1); |
| 143 | } |
| 144 | } |
| 145 | |
| 146 | void _3x3puzzle_state::video_start() |
| 147 | { |
| 148 | m_tilemap1 = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(_3x3puzzle_state::get_tile1_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); |
| 149 | m_tilemap2 = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(_3x3puzzle_state::get_tile2_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); |
| 150 | m_tilemap3 = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(_3x3puzzle_state::get_tile3_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); |
| 151 | m_tilemap2->set_transparent_pen(0); |
| 152 | m_tilemap3->set_transparent_pen(0); |
| 153 | } |
| 154 | |
| 155 | UINT32 _3x3puzzle_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) |
| 156 | { |
| 157 | m_tilemap1->draw(bitmap, cliprect, 0, 1); |
| 158 | m_tilemap2->draw(bitmap, cliprect, 0, 2); |
| 159 | m_tilemap3->draw(bitmap, cliprect, 0, 3); |
| 160 | return 0; |
| 161 | } |
| 162 | |
| 163 | READ16_MEMBER(_3x3puzzle_state::_600000_r) |
| 164 | { |
| 165 | return 0xffff; // DSW? |
| 166 | } |
| 167 | |
| 168 | READ16_MEMBER(_3x3puzzle_state::_880000_r) |
| 169 | { |
| 170 | return 0xffff; // ??? |
| 171 | } |
| 172 | |
| 173 | static ADDRESS_MAP_START( _3x3puzzle_map, AS_PROGRAM, 16, _3x3puzzle_state ) |
| 174 | AM_RANGE(0x000000, 0x03ffff) AM_ROM |
| 175 | AM_RANGE(0x100000, 0x10ffff) AM_RAM |
| 176 | AM_RANGE(0x200000, 0x2007ff) AM_WRITE(videoram1_w) AM_SHARE("videoram1") |
| 177 | AM_RANGE(0x201000, 0x201fff) AM_WRITE(videoram2_w) AM_SHARE("videoram2") |
| 178 | AM_RANGE(0x202000, 0x202fff) AM_WRITE(videoram3_w) AM_SHARE("videoram3") |
| 179 | AM_RANGE(0x280000, 0x280001) AM_READ_PORT("VBLANK") |
| 180 | AM_RANGE(0x300000, 0x3005ff) AM_RAM_WRITE(paletteram_xBBBBBGGGGGRRRRR_word_w) AM_SHARE("paletteram") |
| 181 | AM_RANGE(0x400000, 0x400001) AM_WRITENOP // scroll? |
| 182 | AM_RANGE(0x480000, 0x480001) AM_WRITENOP |
| 183 | AM_RANGE(0x500000, 0x500001) AM_READ_PORT("P1") |
| 184 | AM_RANGE(0x580000, 0x580001) AM_READ_PORT("P2") |
| 185 | AM_RANGE(0x600000, 0x600001) AM_READ(_600000_r) |
| 186 | AM_RANGE(0x700000, 0x700001) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff) |
| 187 | AM_RANGE(0x800000, 0x800001) AM_WRITE(gfx_ctrl_w) |
| 188 | AM_RANGE(0x880000, 0x880001) AM_READ(_880000_r) |
| 189 | ADDRESS_MAP_END |
| 190 | |
| 191 | static INPUT_PORTS_START( _3x3puzzle ) |
| 192 | PORT_START("P1") |
| 193 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) |
| 194 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) |
| 195 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) |
| 196 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) |
| 197 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) |
| 198 | PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 199 | |
| 200 | PORT_START("P2") |
| 201 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) |
| 202 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) |
| 203 | PORT_BIT( 0xfc, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 204 | |
| 205 | PORT_START("VBLANK") |
| 206 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") |
| 207 | |
| 208 | INPUT_PORTS_END |
| 209 | |
| 210 | static const gfx_layout tiles16x16x8_layout = |
| 211 | { |
| 212 | 16,16, |
| 213 | RGN_FRAC(1,1), |
| 214 | 8, |
| 215 | { 0,1, 2,3, 4,5,6,7 }, |
| 216 | { 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 }, |
| 217 | { 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 }, |
| 218 | 128*16 |
| 219 | }; |
| 220 | |
| 221 | static const gfx_layout tiles8x8_layout = |
| 222 | { |
| 223 | 8,8, |
| 224 | RGN_FRAC(1,1), |
| 225 | 8 , |
| 226 | { 0,1,2,3,4,5,6,7 }, |
| 227 | { 3*8,2*8,1*8,0*8,7*8,6*8,5*8,4*8 }, |
| 228 | { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64 }, |
| 229 | 8*64 |
| 230 | }; |
| 231 | |
| 232 | |
| 233 | static GFXDECODE_START( _3x3puzzle ) |
| 234 | GFXDECODE_ENTRY( "gfx1", 0, tiles16x16x8_layout, 0, 3 ) |
| 235 | GFXDECODE_ENTRY( "gfx2", 0, tiles8x8_layout, 0, 3 ) |
| 236 | GFXDECODE_ENTRY( "gfx3", 0, tiles8x8_layout, 0, 3 ) |
| 237 | GFXDECODE_END |
| 238 | |
| 239 | |
| 240 | void _3x3puzzle_state::machine_start() |
| 241 | { |
| 242 | } |
| 243 | |
| 244 | void _3x3puzzle_state::machine_reset() |
| 245 | { |
| 246 | } |
| 247 | |
| 248 | |
| 249 | void _3x3puzzle_state::palette_init() |
| 250 | { |
| 251 | |
| 252 | } |
| 253 | |
| 254 | static MACHINE_CONFIG_START( _3x3puzzle, _3x3puzzle_state ) |
| 255 | |
| 256 | /* basic machine hardware */ |
| 257 | MCFG_CPU_ADD("maincpu",M68000,MAIN_CLOCK) |
| 258 | MCFG_CPU_PROGRAM_MAP(_3x3puzzle_map) |
| 259 | MCFG_CPU_VBLANK_INT_DRIVER("screen", _3x3puzzle_state, irq4_line_hold) |
| 260 | |
| 261 | /* video hardware */ |
| 262 | MCFG_SCREEN_ADD("screen", RASTER) |
| 263 | MCFG_SCREEN_REFRESH_RATE(60) |
| 264 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) |
| 265 | MCFG_SCREEN_UPDATE_DRIVER(_3x3puzzle_state, screen_update) |
| 266 | MCFG_SCREEN_SIZE(64*8, 32*8) |
| 267 | MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 32*8-1) |
| 268 | |
| 269 | MCFG_GFXDECODE(_3x3puzzle) |
| 270 | |
| 271 | MCFG_PALETTE_LENGTH(0x600/2) |
| 272 | |
| 273 | /* sound hardware */ |
| 274 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 275 | MCFG_OKIM6295_ADD("oki", XTAL_4MHz/4, OKIM6295_PIN7_HIGH) |
| 276 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) |
| 277 | MACHINE_CONFIG_END |
| 278 | |
| 279 | |
| 280 | /*************************************************************************** |
| 281 | |
| 282 | Game driver(s) |
| 283 | |
| 284 | ***************************************************************************/ |
| 285 | |
| 286 | ROM_START( 3x3puzzl ) |
| 287 | ROM_REGION( 0x400000, "maincpu", 0 ) /* 68000 code */ |
| 288 | ROM_LOAD16_BYTE( "1.bin", 0x000000, 0x20000, CRC(e9c39ee7) SHA1(8557eeaff33ac8e11fd545482bd9e48f9a58eba3) ) |
| 289 | ROM_LOAD16_BYTE( "2.bin", 0x000001, 0x20000, CRC(524963be) SHA1(05428ccc823c35b6c4d182a1dff1c9aa6b71e616) ) |
| 290 | |
| 291 | ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASE00 ) |
| 292 | ROM_LOAD32_BYTE("3.bin", 0x000000, 0x080000, CRC(53c2aa6a) SHA1(d2ebb10eb8311ff5226793e7b373e152b21c602c) ) |
| 293 | ROM_LOAD32_BYTE("4.bin", 0x000001, 0x080000, CRC(fb0b76fd) SHA1(23c9a5979452c21381107641d5cd49b34ad00471) ) |
| 294 | ROM_LOAD32_BYTE("5.bin", 0x000002, 0x080000, CRC(b6c1e108) SHA1(44c97e0582b9ee85465040d56eda9efd06c25533) ) |
| 295 | ROM_LOAD32_BYTE("6.bin", 0x000003, 0x080000, CRC(47cb0e8e) SHA1(13d39b1eb4fcfeafc8d821871750f37377449b80) ) |
| 296 | |
| 297 | ROM_REGION( 0x080000, "gfx2", ROMREGION_ERASE00 ) |
| 298 | ROM_LOAD32_BYTE("7.bin", 0x000000, 0x020000, CRC(45b1f58b) SHA1(7faee993b87ef14eef1c5ba3fcc7d0747494dbf5) ) |
| 299 | ROM_LOAD32_BYTE("8.bin", 0x000001, 0x020000, CRC(c0d404a7) SHA1(7991e711f6933bc3809f3c562e21a775a9a2dcf3) ) |
| 300 | ROM_LOAD32_BYTE("9.bin", 0x000002, 0x020000, CRC(6b303aa9) SHA1(1750da9148978f59904c2bf9e99f967e5bdd5a92) ) |
| 301 | ROM_LOAD32_BYTE("10.bin", 0x000003, 0x020000, CRC(6d0107bc) SHA1(a6f30a482586136304af510eee0a93df450673bd) ) |
| 302 | |
| 303 | ROM_REGION( 0x080000, "gfx3", ROMREGION_ERASE00 ) |
| 304 | ROM_LOAD32_BYTE("11.bin", 0x000000, 0x020000, CRC(e124c0b5) SHA1(9b819691b7ca7f0561f4fce05083c8507e138bfe) ) |
| 305 | ROM_LOAD32_BYTE("12.bin", 0x000001, 0x020000, CRC(ae4a8707) SHA1(f54337e4b666dc2f38df0ea96e9c8f4d7c4ebe52) ) |
| 306 | ROM_LOAD32_BYTE("13.bin", 0x000002, 0x020000, CRC(f06925d1) SHA1(a45b72da57c7d967dec2fcad12e6a7864f5442e8) ) |
| 307 | ROM_LOAD32_BYTE("14.bin", 0x000003, 0x020000, CRC(07252636) SHA1(00730c203e20af9e18a792e26de7aeac5d090ebf) ) |
| 308 | |
| 309 | ROM_REGION(0x80000, "oki", 0 ) |
| 310 | ROM_LOAD("15.bin", 0x000000, 0x080000, CRC(d3aff355) SHA1(117f7bbd6cab370f65e308d78291732dfc079365) ) |
| 311 | ROM_END |
| 312 | |
| 313 | ROM_START( 3x3puzzla ) |
| 314 | ROM_REGION( 0x400000, "maincpu", 0 ) /* 68000 code */ |
| 315 | ROM_LOAD16_BYTE( "1a.bin", 0x000000, 0x20000, CRC(425c5896) SHA1(78d709b729f160b1e20a61a795361113dbb4fb52) ) |
| 316 | ROM_LOAD16_BYTE( "2a.bin", 0x000001, 0x20000, CRC(4db710b7) SHA1(df7a3496aac9cfdaee4fd504d88772b07a8fdb2b) ) |
| 317 | |
| 318 | ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASE00 ) |
| 319 | ROM_LOAD32_BYTE("3a.bin", 0x000000, 0x080000, CRC(33bff952) SHA1(11d06462041e7cf8aa2ae422ed74ba23f6934478) ) |
| 320 | ROM_LOAD32_BYTE("4a.bin", 0x000001, 0x080000, CRC(222996d8) SHA1(fb8fd45a43e78dd9700ffb46fa886f62e7c32e61) ) |
| 321 | ROM_LOAD32_BYTE("5a.bin", 0x000002, 0x080000, CRC(5b209844) SHA1(8a34958ecd9c26272708237028e279dd347c729f) ) |
| 322 | ROM_LOAD32_BYTE("6a.bin", 0x000003, 0x080000, CRC(f1136bba) SHA1(486c41bd08c4039bfe46500540fc4ae0f1497232) ) |
| 323 | |
| 324 | ROM_REGION( 0x080000, "gfx2", ROMREGION_ERASE00 ) |
| 325 | ROM_LOAD32_BYTE("7.bin", 0x000000, 0x020000, CRC(45b1f58b) SHA1(7faee993b87ef14eef1c5ba3fcc7d0747494dbf5) ) |
| 326 | ROM_LOAD32_BYTE("8.bin", 0x000001, 0x020000, CRC(c0d404a7) SHA1(7991e711f6933bc3809f3c562e21a775a9a2dcf3) ) |
| 327 | ROM_LOAD32_BYTE("9.bin", 0x000002, 0x020000, CRC(6b303aa9) SHA1(1750da9148978f59904c2bf9e99f967e5bdd5a92) ) |
| 328 | ROM_LOAD32_BYTE("10.bin", 0x000003, 0x020000, CRC(6d0107bc) SHA1(a6f30a482586136304af510eee0a93df450673bd) ) |
| 329 | |
| 330 | ROM_REGION( 0x080000, "gfx3", ROMREGION_ERASE00 ) |
| 331 | ROM_LOAD32_BYTE("11.bin", 0x000000, 0x020000, CRC(e124c0b5) SHA1(9b819691b7ca7f0561f4fce05083c8507e138bfe) ) |
| 332 | ROM_LOAD32_BYTE("12.bin", 0x000001, 0x020000, CRC(ae4a8707) SHA1(f54337e4b666dc2f38df0ea96e9c8f4d7c4ebe52) ) |
| 333 | ROM_LOAD32_BYTE("13.bin", 0x000002, 0x020000, CRC(f06925d1) SHA1(a45b72da57c7d967dec2fcad12e6a7864f5442e8) ) |
| 334 | ROM_LOAD32_BYTE("14.bin", 0x000003, 0x020000, CRC(07252636) SHA1(00730c203e20af9e18a792e26de7aeac5d090ebf) ) |
| 335 | |
| 336 | ROM_REGION(0x80000, "oki", 0 ) |
| 337 | ROM_LOAD("15.bin", 0x000000, 0x080000, CRC(d3aff355) SHA1(117f7bbd6cab370f65e308d78291732dfc079365) ) |
| 338 | ROM_END |
| 339 | |
| 340 | |
| 341 | GAME( 199?, 3x3puzzl, 0, _3x3puzzle, _3x3puzzle, driver_device, 0, ROT0, "Ace", "3X3 Puzzle (Enterprise)", 0 ) |
| 342 | GAME( 199?, 3x3puzzla, 3x3puzzl, _3x3puzzle, _3x3puzzle, driver_device, 0, ROT0, "Ace", "3X3 Puzzle (Normal)", 0 ) |