trunk/src/mame/drivers/blackt96.c
r18311 | r18312 | |
57 | 57 | each made of 1x32 tile strips, however the game only ever appears to use 3 |
58 | 58 | banks of tile strips (96 sprites) |
59 | 59 | |
60 | | Priority isn't understood (other attributes, sort by y pos?) |
| 60 | In practice it seems like the hardware can probably only draw these 3 banks |
| 61 | as separate layers with seemingly hardcoded priority levels, despite the odd |
| 62 | design. |
61 | 63 | |
62 | 64 | Furthermore there are two sets of graphics, background tiles and 'sprite' |
63 | 65 | tiles which are of different bitdepths, but are addressed in the same way. |
64 | 66 | |
65 | 67 | Tilemap hookup is just to make viewing easier, it's not used for rendering |
66 | 68 | |
67 | | |
68 | 69 | There is also an additional 8x8 text layer.. |
69 | 70 | |
| 71 | |
| 72 | Bugs: |
| 73 | |
| 74 | Sometimes if you attack an enemy when you're at the top of the screen they'll |
| 75 | end up landing in an even higher position, and appear over the backgrounds! |
| 76 | I think this is just a game bug.. |
| 77 | |
| 78 | The timer doesn't work (PIC?, RAM Mirror?) |
| 79 | |
| 80 | There are some unmapped writes past the end of text ram too |
| 81 | |
| 82 | |
70 | 83 | */ |
71 | 84 | |
72 | 85 | #include "emu.h" |
r18311 | r18312 | |
110 | 123 | DECLARE_READ8_MEMBER(blackt96_soundio_port02_r); |
111 | 124 | DECLARE_WRITE8_MEMBER(blackt96_soundio_port02_w); |
112 | 125 | |
| 126 | DECLARE_READ16_MEMBER( random_r ) |
| 127 | { |
| 128 | return machine().rand(); |
| 129 | } |
| 130 | |
113 | 131 | DECLARE_WRITE16_MEMBER(bg_videoram0_w); |
114 | 132 | DECLARE_WRITE16_MEMBER(bg_videoram1_w); |
115 | 133 | DECLARE_WRITE16_MEMBER(bg_videoram2_w); |
r18311 | r18312 | |
121 | 139 | |
122 | 140 | UINT16* m_spriteram[8]; |
123 | 141 | tilemap_t *m_bg_tilemap[8]; |
| 142 | UINT8 m_txt_bank; |
124 | 143 | |
125 | 144 | TILE_GET_INFO_MEMBER(get_bg0_tile_info); |
126 | 145 | TILE_GET_INFO_MEMBER(get_bg1_tile_info); |
r18311 | r18312 | |
175 | 194 | |
176 | 195 | m_spriteram[0] = m_spriteram0; |
177 | 196 | m_spriteram[1] = m_spriteram1; |
178 | | m_spriteram[2] = m_spriteram2; |
| 197 | m_spriteram[2] = m_spriteram2; |
179 | 198 | m_spriteram[3] = m_spriteram3; |
180 | 199 | m_spriteram[4] = m_spriteram4; |
181 | 200 | m_spriteram[5] = m_spriteram5; |
182 | | m_spriteram[6] = m_spriteram6; |
| 201 | m_spriteram[6] = m_spriteram6; |
183 | 202 | m_spriteram[7] = m_spriteram7; |
184 | 203 | } |
185 | 204 | |
186 | | static void draw_strip(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int page, int column, int bg) |
| 205 | static void draw_strip(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int page, int column) |
187 | 206 | { |
188 | 207 | blackt96_state *state = machine.driver_data<blackt96_state>(); |
189 | 208 | /* the very first 'page' in the spriteram contains the x/y positions for each tile strip */ |
r18311 | r18312 | |
203 | 222 | yy = 0x1ff-yy; |
204 | 223 | if (yy&0x100) yy-=0x200; |
205 | 224 | |
206 | | yy -= 32; |
| 225 | yy -= 15; |
207 | 226 | |
208 | 227 | UINT16* base2 = state->m_spriteram[page]+column * (0x80/2); |
209 | 228 | |
r18311 | r18312 | |
218 | 237 | |
219 | 238 | if (tile&0x2000) |
220 | 239 | { |
221 | | if (bg) drawgfx_transpen(bitmap,cliprect,gfxbg,tile&0x1fff,colour>>4,flipx,0,xx,yy+y*16,0); |
| 240 | drawgfx_transpen(bitmap,cliprect,gfxbg,tile&0x1fff,colour>>4,flipx,0,xx,yy+y*16,0); |
222 | 241 | } |
223 | 242 | else |
224 | 243 | { |
225 | | if (!bg) drawgfx_transpen(bitmap,cliprect,gfxspr,tile&0x1fff,colour,flipx,0,xx,yy+y*16,0); |
| 244 | drawgfx_transpen(bitmap,cliprect,gfxspr,tile&0x1fff,colour,flipx,0,xx,yy+y*16,0); |
226 | 245 | } |
227 | 246 | } |
228 | 247 | } |
229 | 248 | |
| 249 | static void draw_page(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int page) |
| 250 | { |
| 251 | for (int strip=0;strip<32;strip++) |
| 252 | { |
| 253 | draw_strip(machine, bitmap, cliprect, page, strip); |
| 254 | } |
| 255 | } |
230 | 256 | |
231 | 257 | UINT32 blackt96_state::screen_update_blackt96(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
232 | 258 | { |
233 | | int count; |
234 | | int x,y; |
235 | | gfx_element *gfx = machine().gfx[2]; |
236 | | |
237 | 259 | bitmap.fill(get_black_pen(machine()), cliprect); |
238 | 260 | |
239 | | int strip; |
240 | | int page; |
| 261 | draw_page(machine(), bitmap, cliprect, 2); // bg |
| 262 | draw_page(machine(), bitmap, cliprect, 3); // lower pri sprites |
| 263 | draw_page(machine(), bitmap, cliprect, 1); // higher pri sprites |
241 | 264 | |
242 | | for (strip=0;strip<32;strip++) |
243 | | { |
244 | | for (page = 7;page>0;page--) |
245 | | { |
246 | | draw_strip(machine(), bitmap, cliprect, page, strip, 1); |
247 | | } |
248 | | } |
249 | 265 | |
250 | | for (strip=0;strip<32;strip++) |
251 | | { |
252 | | for (page = 7;page>0;page--) |
253 | | { |
254 | | draw_strip(machine(), bitmap, cliprect, page, strip, 0); |
255 | | } |
256 | | } |
257 | | |
258 | | |
259 | 266 | /* Text Layer */ |
260 | | count = 0; |
| 267 | int count = 0; |
| 268 | int x,y; |
| 269 | gfx_element *gfx = machine().gfx[2]; |
261 | 270 | |
262 | 271 | for (x=0;x<64;x++) |
263 | 272 | { |
264 | 273 | for (y=0;y<32;y++) |
265 | 274 | { |
266 | | UINT16 tile = (m_tilemapram[count*2]&0x7ff)+0x800; // +0xc00 for korean text |
| 275 | UINT16 tile = (m_tilemapram[count*2]&0xff); |
| 276 | tile += m_txt_bank * 0x100; |
267 | 277 | drawgfx_transpen(bitmap,cliprect,gfx,tile,0,0,0,x*8,-16+y*8,0); |
268 | 278 | count++; |
269 | 279 | } |
r18311 | r18312 | |
273 | 283 | } |
274 | 284 | |
275 | 285 | |
276 | | WRITE16_MEMBER(blackt96_state::blackt96_c0000_w) |
| 286 | WRITE16_MEMBER(blackt96_state::blackt96_80000_w) |
277 | 287 | { |
278 | | printf("blackt96_c0000_w %04x %04x\n",data,mem_mask); |
| 288 | // TO sound MCU? |
| 289 | //printf("blackt96_80000_w %04x %04x\n",data,mem_mask); |
279 | 290 | } |
280 | 291 | |
281 | | WRITE16_MEMBER(blackt96_state::blackt96_80000_w) |
| 292 | |
| 293 | WRITE16_MEMBER(blackt96_state::blackt96_c0000_w) |
282 | 294 | { |
283 | | // TO sound MCU? |
284 | | printf("blackt96_80000_w %04x %04x\n",data,mem_mask); |
| 295 | // unknown, also sound mcu? |
| 296 | // -bbb --21 |
| 297 | // 1 - coin counter 1 |
| 298 | // 2 - coin counter 2 |
| 299 | // b = text tile bank? |
| 300 | |
| 301 | m_txt_bank = (data & 0xf0)>>4; |
| 302 | |
| 303 | printf("blackt96_c0000_w %04x %04x\n",data & 0xfc,mem_mask); |
285 | 304 | } |
286 | 305 | |
287 | 306 | |
r18311 | r18312 | |
289 | 308 | AM_RANGE(0x000000, 0x07ffff) AM_ROM |
290 | 309 | AM_RANGE(0x080000, 0x080001) AM_READ_PORT("P1_P2") AM_WRITE(blackt96_80000_w) |
291 | 310 | AM_RANGE(0x0c0000, 0x0c0001) AM_READ_PORT("IN1") AM_WRITE(blackt96_c0000_w) // COIN INPUT |
292 | | AM_RANGE(0x0e0000, 0x0e0001) AM_READ_PORT("IN2") |
293 | | AM_RANGE(0x0e8000, 0x0e8001) AM_READ_PORT("IN3") |
| 311 | AM_RANGE(0x0e0000, 0x0e0001) AM_READ( random_r ) // AM_READ_PORT("IN2") // unk, from sound? |
| 312 | AM_RANGE(0x0e8000, 0x0e8001) AM_READ( random_r ) // AM_READ_PORT("IN3") // unk, from sound? |
294 | 313 | AM_RANGE(0x0f0000, 0x0f0001) AM_READ_PORT("DSW1") |
295 | 314 | AM_RANGE(0x0f0008, 0x0f0009) AM_READ_PORT("DSW2") |
296 | 315 | |
297 | 316 | AM_RANGE(0x100000, 0x100fff) AM_RAM AM_SHARE("tilemapram") // text tilemap |
298 | | AM_RANGE(0x200000, 0x200fff) AM_RAM_WRITE(bg_videoram0_w) AM_SHARE("spriteram0") |
299 | | AM_RANGE(0x201000, 0x201fff) AM_RAM_WRITE(bg_videoram1_w) AM_SHARE("spriteram1") |
300 | | AM_RANGE(0x202000, 0x202fff) AM_RAM_WRITE(bg_videoram2_w) AM_SHARE("spriteram2") |
301 | | AM_RANGE(0x203000, 0x203fff) AM_RAM_WRITE(bg_videoram3_w) AM_SHARE("spriteram3") |
| 317 | AM_RANGE(0x200000, 0x200fff) AM_RAM_WRITE(bg_videoram0_w) AM_SHARE("spriteram0") // this is the 'list' |
| 318 | AM_RANGE(0x201000, 0x201fff) AM_RAM_WRITE(bg_videoram1_w) AM_SHARE("spriteram1") // sprites layer 0 |
| 319 | AM_RANGE(0x202000, 0x202fff) AM_RAM_WRITE(bg_videoram2_w) AM_SHARE("spriteram2") // bg layer? |
| 320 | AM_RANGE(0x203000, 0x203fff) AM_RAM_WRITE(bg_videoram3_w) AM_SHARE("spriteram3") // sprites layer 1 |
| 321 | // the following potentially exist (the ram is cleared, there is room for entries in the 'spriteram0' region |
| 322 | // but they never get used..) |
302 | 323 | AM_RANGE(0x204000, 0x204fff) AM_RAM_WRITE(bg_videoram4_w) AM_SHARE("spriteram4") |
303 | 324 | AM_RANGE(0x205000, 0x205fff) AM_RAM_WRITE(bg_videoram5_w) AM_SHARE("spriteram5") |
304 | 325 | AM_RANGE(0x206000, 0x206fff) AM_RAM_WRITE(bg_videoram6_w) AM_SHARE("spriteram6") |
r18311 | r18312 | |
318 | 339 | PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) |
319 | 340 | PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) |
320 | 341 | PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) |
321 | | PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) |
322 | | PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) |
323 | | PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) |
| 342 | PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) // kick |
| 343 | PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) // jump |
| 344 | PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) // punch / pick up |
324 | 345 | PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 ) |
325 | 346 | PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) |
326 | 347 | PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) |
327 | 348 | PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) |
328 | 349 | PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) |
329 | | PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) |
330 | | PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) |
331 | | PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) |
| 350 | PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) // kick |
| 351 | PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) // jump |
| 352 | PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) // punch / pick up |
332 | 353 | PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 ) |
333 | 354 | |
334 | 355 | PORT_START("IN1") |
335 | 356 | PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) // Test mode lists this as Service 1, but it appears to be Coin 1 (uses Coin 1 coinage etc.) |
336 | | PORT_DIPNAME( 0x0002, 0x0002, "xx") |
337 | | PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) |
338 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
339 | | PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) |
340 | | PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) |
341 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
342 | | PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) |
343 | | PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) |
344 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
345 | | PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) // Test mode lists this as Coin 1, but it doesn't work |
346 | | PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) |
347 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
| 357 | PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE1 ) // acts as a serive mode mirror |
| 358 | PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNKNOWN ) |
| 359 | PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN ) |
| 360 | PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Test mode lists this as Coin 1, but it doesn't work |
348 | 361 | PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_COIN2 ) |
349 | | PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) |
350 | | PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) |
351 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
352 | | PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) |
353 | | PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) |
354 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
355 | | PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) ) |
356 | | PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) |
357 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
358 | | PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) |
359 | | PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) |
360 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
361 | | PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) |
362 | | PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) |
363 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
364 | | PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) |
365 | | PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) |
366 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
367 | | PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) |
368 | | PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) |
369 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
370 | | PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) |
371 | | PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) |
372 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
373 | | PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) |
374 | | PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) |
375 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
376 | | PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) |
377 | | PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) |
378 | | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
379 | | |
| 362 | PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN ) |
| 363 | PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN ) |
| 364 | PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN ) |
| 365 | |
| 366 | #if 0 |
380 | 367 | PORT_START("IN2") |
381 | 368 | PORT_DIPNAME( 0x0001, 0x0001, "2" ) |
382 | 369 | PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) |
r18311 | r18312 | |
476 | 463 | PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) |
477 | 464 | PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) |
478 | 465 | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
| 466 | #endif |
479 | 467 | |
480 | 468 | /* Dipswitch Port A */ |
481 | 469 | PORT_START("DSW1") |
r18311 | r18312 | |
505 | 493 | /* Dipswitch Port B */ |
506 | 494 | PORT_START("DSW2") |
507 | 495 | PORT_SERVICE( 0x0100, IP_ACTIVE_HIGH ) PORT_DIPLOCATION("SW2:!8") |
508 | | PORT_DIPNAME( 0x0200, 0x0200, "Continue" ) PORT_DIPLOCATION("SW2:!7") |
| 496 | PORT_DIPNAME( 0x0200, 0x0000, "Continue" ) PORT_DIPLOCATION("SW2:!7") |
509 | 497 | PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) |
510 | 498 | PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) |
511 | 499 | PORT_DIPNAME( 0x0c00, 0x0400, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!5,!6") |
r18311 | r18312 | |
620 | 608 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) |
621 | 609 | MCFG_SCREEN_SIZE(256, 256) |
622 | 610 | // MCFG_SCREEN_VISIBLE_AREA(0*8, 16*32-1, 0*8, 16*32-1) |
623 | | MCFG_SCREEN_VISIBLE_AREA(0*8, 256-1, 0*8, 208-1) |
| 611 | MCFG_SCREEN_VISIBLE_AREA(0*8, 256-1, 0*8, 224-1) |
624 | 612 | MCFG_SCREEN_UPDATE_DRIVER(blackt96_state, screen_update_blackt96) |
625 | 613 | |
626 | 614 | MCFG_PALETTE_LENGTH(0x800) |
r18311 | r18312 | |
664 | 652 | ROM_LOAD32_BYTE( "13", 0x00002, 0x40000, CRC(0acceb9d) SHA1(e8a85c7eab45d84613ac37a9b7ffbc45b44eb2e5) ) |
665 | 653 | ROM_LOAD32_BYTE( "14", 0x00003, 0x40000, CRC(b5e3de25) SHA1(33ac5602ab6bcadc8b0d1aa805a3bdce0b67c215) ) |
666 | 654 | |
667 | | ROM_REGION( 0x20000, "gfx3", 0 ) // txt tiles |
668 | | ROM_LOAD16_BYTE( "9", 0x00000, 0x10000, CRC(81a4cf4c) SHA1(94b2bbcbc8327d9babbc3b222bd88954c7e7b80e) ) |
669 | | ROM_LOAD16_BYTE( "10", 0x00001, 0x10000, CRC(b78232a2) SHA1(36a4f01011faf64e46b73f0082ab04843ac8b0e2) ) |
| 655 | ROM_REGION( 0x10000, "gfx3", 0 ) // txt tiles |
| 656 | ROM_LOAD16_BYTE( "9", 0x00000, 0x08000, CRC(81a4cf4c) SHA1(94b2bbcbc8327d9babbc3b222bd88954c7e7b80e) ) |
| 657 | ROM_CONTINUE( 0x00000, 0x08000 ) // first half is empty |
| 658 | ROM_LOAD16_BYTE( "10", 0x00001, 0x08000, CRC(b78232a2) SHA1(36a4f01011faf64e46b73f0082ab04843ac8b0e2) ) |
| 659 | ROM_CONTINUE( 0x00001, 0x08000 ) // first half is empty |
670 | 660 | ROM_END |
671 | 661 | |
672 | 662 | GAME( 1996, blackt96, 0, blackt96, blackt96, driver_device, 0, ROT0, "D.G.R.M.", "Black Touch '96", GAME_NOT_WORKING | GAME_NO_SOUND ) |