diff options
Diffstat (limited to 'src/mame/drivers/tmaster.c')
-rw-r--r-- | src/mame/drivers/tmaster.c | 573 |
1 files changed, 573 insertions, 0 deletions
diff --git a/src/mame/drivers/tmaster.c b/src/mame/drivers/tmaster.c new file mode 100644 index 00000000000..1dd40619b14 --- /dev/null +++ b/src/mame/drivers/tmaster.c @@ -0,0 +1,573 @@ +/*************************************************************************** + + -= Touch Master Games =- + + driver by Luca Elia (l.elia@tin.it) + + +CPU: 68000 +Video: Blitter, double framebuffer +Sound: OKI6295 +Input: Pressure sensitive touch screen +Other: Dallas NVRAM + optional RTC + + +To Do: + +- Proper touchscreen controller emulation. Currently it's flakey and + tends to stop registering user input (try coining up in that case) +- Protection in tm4k +- Coin optics +- RTC emulation (there's code to check the upper bytes of NVRAM to see if + the real time clock is present, and to only use it in that case) + + +***************************************************************************/ + +#include "driver.h" +#include "sound/okim6295.h" + +/*************************************************************************** + + Sound + +***************************************************************************/ + +int okibank; +static WRITE16_HANDLER( tmaster_oki_bank_w ) +{ + if (ACCESSING_MSB) + { + // data & 0x0800? + okibank = ((data >> 8) & 3); + OKIM6295_set_bank_base(0, okibank * 0x40000); + } + + if (ACCESSING_LSB) + { + // data & 0x0002? + } +} + +/*************************************************************************** + + Touch Screen Controller - PRELIMINARY + +***************************************************************************/ + +int touchscreen; + +void show_touchscreen(void) +{ +#ifdef MAME_DEBUG + popmessage("% d] %03x %03x - %d",touchscreen,readinputportbytag("TSCREEN_X")&0x1ff,readinputportbytag("TSCREEN_Y"),okibank); +#endif +} + +static WRITE16_HANDLER( tmaster_tscreen_reset_w ) +{ + if (ACCESSING_LSB && data == 0x05) + { + touchscreen = 0; + show_touchscreen(); + } +} + +static READ16_HANDLER( tmaster_tscreen_next_r ) +{ + if (touchscreen != -1) + touchscreen++; + if (touchscreen == 6) + touchscreen = -1; + show_touchscreen(); + + return 0; +} + +static READ16_HANDLER( tmaster_tscreen_x_hi_r ) +{ + switch (touchscreen) + { + case -1: return 0xf1; + } + return 0x01; +} + +static READ16_HANDLER( tmaster_tscreen_x_lo_r ) +{ + UINT16 val = 0; + + int press1 = readinputportbytag("TSCREEN_X") & 0x4000; + int press2 = readinputportbytag("TSCREEN_X") & 0x8000; + if (press1) press2 = 1; + + switch (touchscreen) + { + case 1: val = press1 ? 0 : 1<<6; break; // press + case 2: val = readinputportbytag("TSCREEN_X") & 0x003; break; + case 3: val = (readinputportbytag("TSCREEN_X") >> 2) & 0x7f; break; + case 4: val = 0; break; + case 5: val = ((readinputportbytag("TSCREEN_Y")^0xff) >> 1) & 0x7f; break; + + default: + return 0; + } + return val | (press2 ? 0x80 : 0); // away : hover +} + +static READ16_HANDLER( tmaster_tscreen_y_hi_r ) { return 0x01; } +static READ16_HANDLER( tmaster_tscreen_y_lo_r ) { return 0x00; } + + + +/*************************************************************************** + + Video & Blitter + +***************************************************************************/ + +static mame_bitmap *tmaster_bitmap[2]; +UINT16 *tmaster_regs; +UINT16 tmaster_color; +UINT16 tmaster_addr; + +static VIDEO_START( tmaster ) +{ + int i; + for (i = 0; i < 2; i++) + tmaster_bitmap[i] = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format); +} + +static VIDEO_UPDATE( tmaster ) +{ + // double buffering + copybitmap(bitmap,tmaster_bitmap[(tmaster_regs[0x02/2]>>8)&1],0,0,0,0,&machine->screen[0].visarea,TRANSPARENCY_NONE,0); + + show_touchscreen(); + return 0; +} + +static WRITE16_HANDLER( tmaster_color_w ) +{ + COMBINE_DATA( &tmaster_color ); + if (tmaster_color & ~7) + logerror("%06x: color %04x\n", activecpu_get_pc(), tmaster_color); +} + +static WRITE16_HANDLER( tmaster_addr_w ) +{ + COMBINE_DATA( &tmaster_addr ); +} + +static void tmaster_draw(void) +{ + int x,y,x0,x1,y0,y1,dx,dy,flipx,flipy,sx,sy,sw,sh, addr, mode, dest; + + UINT8 *gfxdata = memory_region( REGION_GFX1 ); + size_t size = memory_region_length( REGION_GFX1 ); + + UINT16 data; + + mame_bitmap *bitmap; + + dest = (tmaster_regs[0x02/2] >> 8) & 1; + sw = tmaster_regs[0x04/2]; + sx = tmaster_regs[0x06/2]; + sh = tmaster_regs[0x08/2] + 1; + sy = tmaster_regs[0x0a/2]; + addr = ( tmaster_regs[0x0c/2] & 0xff) | + ((tmaster_regs[0x0e/2] & 0x1ff) << 8) | (tmaster_addr << 17); + mode = tmaster_regs[0x10/2]; + + dest ^= (mode >> 6) & 1; + bitmap = tmaster_bitmap[dest]; + + addr <<= 1; + +#if 0 + logerror("%06x: blit w %03x, h %02x, x %03x, y %02x, addr %06x, mode %02x\n", activecpu_get_pc(), + sw,sh,sx,sy, addr, mode + ); +#endif + + flipx = mode & 1; + flipy = mode & 2; + + if (flipx) { x0 = sw-1; x1 = -1; dx = -1; sx -= sw-1; } + else { x0 = 0; x1 = sw; dx = +1; } + + if (flipy) { y0 = sh-1; y1 = -1; dy = -1; sy -= sh-1; } + else { y0 = 0; y1 = sh; dy = +1; } + + switch (mode & 0x20) + { + case 0x00: // blit with transparency + if (addr > (size - sw*sh)) + { + logerror("%06x: blit error, addr %06x out of bounds\n", activecpu_get_pc(),addr); + return; + } + + for (y = y0; y != y1; y += dy) + { + for (x = x0; x != x1; x += dx) + { + data = gfxdata[addr++]; + + if ((data != 0xff) && (sx + x >= 0) && (sx + x < 400) && (sy + y >= 0) && (sy + y < 256)) + *BITMAP_ADDR16(bitmap, sy + y, sx + x) = data + ((tmaster_color & 7) << 8); + } + } + break; + + case 0x20: // solid fill + data = tmaster_addr & 0xff; + for (y = y0; y != y1; y += dy) + { + for (x = x0; x != x1; x += dx) + { + if ((sx + x >= 0) && (sx + x < 400) && (sy + y >= 0) && (sy + y < 256)) + *BITMAP_ADDR16(bitmap, sy + y, sx + x) = data + ((tmaster_color & 7) << 8); + } + } + break; + + } +} + +WRITE16_HANDLER( tmaster_blitter_w ) +{ + COMBINE_DATA( tmaster_regs + offset ); + switch (offset*2) + { + case 0x0e: + tmaster_draw(); + cpunum_set_input_line(0, 2, HOLD_LINE); + break; + } +} + +static READ16_HANDLER( tmaster_blitter_r ) +{ + return 0x0000; // bit 7 = 1 -> blitter busy +} + +/*************************************************************************** + + Memory Maps + +***************************************************************************/ + +static READ16_HANDLER( tmaster_coins_r ) +{ + return readinputportbytag("COIN")|(mame_rand(Machine)&0x0800); +} + +static ADDRESS_MAP_START( tmaster_map, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE( 0x000000, 0x1fffff ) AM_ROM + AM_RANGE( 0x200000, 0x27ffff ) AM_RAM + AM_RANGE( 0x280000, 0x28ffff ) AM_RAM AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size) + + AM_RANGE( 0x300010, 0x300011 ) AM_READ( tmaster_coins_r ) + + AM_RANGE( 0x300022, 0x300023 ) AM_READ ( tmaster_tscreen_x_hi_r ) + AM_RANGE( 0x300024, 0x300025 ) AM_WRITE( tmaster_tscreen_reset_w ) + AM_RANGE( 0x300026, 0x300027 ) AM_READ ( tmaster_tscreen_x_lo_r ) + AM_RANGE( 0x300028, 0x300029 ) AM_READ ( tmaster_tscreen_next_r ) + AM_RANGE( 0x300032, 0x300033 ) AM_READ ( tmaster_tscreen_y_hi_r ) + AM_RANGE( 0x300036, 0x300037 ) AM_READ ( tmaster_tscreen_y_lo_r ) + + AM_RANGE( 0x300040, 0x300041 ) AM_WRITE( tmaster_oki_bank_w ) + + AM_RANGE( 0x300070, 0x300071 ) AM_WRITE( tmaster_addr_w ) + + AM_RANGE( 0x500000, 0x500011 ) AM_WRITE( tmaster_blitter_w ) AM_BASE( &tmaster_regs ) + AM_RANGE( 0x500010, 0x500011 ) AM_READ ( tmaster_blitter_r ) + + AM_RANGE( 0x580000, 0x580001 ) AM_WRITE(MWA16_NOP) // often + + AM_RANGE( 0x600000, 0x600fff ) AM_READWRITE( MRA16_RAM, paletteram16_xBBBBBGGGGGRRRRR_word_w ) AM_BASE(&paletteram16) // looks like palettes, maybe + + AM_RANGE( 0x800000, 0x800001 ) AM_READWRITE( OKIM6295_status_0_lsb_r, OKIM6295_data_0_lsb_w ) + + AM_RANGE( 0x800010, 0x800011 ) AM_WRITE( tmaster_color_w ) +ADDRESS_MAP_END + + +/*************************************************************************** + + Input Ports + +***************************************************************************/ + +INPUT_PORTS_START( tmaster ) + PORT_START_TAG("TSCREEN_X") + PORT_BIT( 0x01ff, 0x100, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1, 0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(3) PORT_PLAYER(1) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_IMPULSE(5) // press + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) // hover + + PORT_START_TAG("TSCREEN_Y") + PORT_BIT( 0x0ff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1, 0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(3) PORT_PLAYER(1) + + PORT_START_TAG("COIN") // IN3 + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) // m. coin 1 (coin optics?) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(4) // m. coin 2 (coin optics?) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(6) // dbv input (coin optics?) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_COIN1 ) // (service coin?) + PORT_SERVICE_NO_TOGGLE( 0x0020, IP_ACTIVE_LOW ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SERVICE1 ) // calibrate + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_SPECIAL ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_COIN1 ) // e. coin 1 + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_COIN2 ) // e. coin 2 + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_COIN3 ) // e. coin 3 + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_COIN4 ) // e. coin 4 +INPUT_PORTS_END + + +/*************************************************************************** + + Machine Drivers + +***************************************************************************/ + +static MACHINE_RESET( tmaster ) +{ + touchscreen = -1; +} + +static INTERRUPT_GEN( tm3k_interrupt ) +{ + switch (cpu_getiloops()) + { + case 0: cpunum_set_input_line(0, 2, HOLD_LINE); break; + case 1: cpunum_set_input_line(0, 3, HOLD_LINE); break; + + case 2: + case 3: + case 4: + case 5: + case 6: cpunum_set_input_line_and_vector(0, 4, HOLD_LINE, 0x100/4); break; // touch screen controller + + default: cpunum_set_input_line(0, 1, HOLD_LINE); break; + } +} + +static MACHINE_DRIVER_START( tm3k ) + MDRV_CPU_ADD_TAG("main", M68000, 12000000) + MDRV_CPU_PROGRAM_MAP(tmaster_map,0) + MDRV_CPU_VBLANK_INT(tm3k_interrupt,2+5+20) // ?? + + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION) + + MDRV_MACHINE_RESET(tmaster) + MDRV_NVRAM_HANDLER(generic_0fill) + + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(400, 256) + MDRV_SCREEN_VISIBLE_AREA(0, 400-1, 0, 256-1) + MDRV_PALETTE_LENGTH(0x800) + + MDRV_VIDEO_START(tmaster) + MDRV_VIDEO_UPDATE(tmaster) + + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD_TAG("OKI",OKIM6295, 2000000) + MDRV_SOUND_CONFIG(okim6295_interface_region_1_pin7high) // clock frequency & pin 7 not verified + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) +MACHINE_DRIVER_END + + +static INTERRUPT_GEN( tm_interrupt ) +{ + switch (cpu_getiloops()) + { + case 0: cpunum_set_input_line(0, 2, HOLD_LINE); break; + case 1: cpunum_set_input_line(0, 3, HOLD_LINE); break; + case 2: cpunum_set_input_line_and_vector(0, 4, HOLD_LINE, 0x100/4); break; // touch screen controller + default: cpunum_set_input_line(0, 1, HOLD_LINE); break; + } +} + +static MACHINE_DRIVER_START( tm ) + MDRV_IMPORT_FROM(tm3k) + MDRV_CPU_MODIFY("main") + MDRV_CPU_VBLANK_INT(tm_interrupt,3+20) // ?? + + MDRV_SOUND_REPLACE("OKI",OKIM6295, 1122000) + MDRV_SOUND_CONFIG(okim6295_interface_region_1_pin7high) // clock frequency & pin 7 not verified + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) +MACHINE_DRIVER_END + + +/*************************************************************************** + + ROMs Loading + +***************************************************************************/ + +/*************************************************************************** + +Touch Master +1996, Midway + +68000 @ 12MHz or 6MHz +u51 - u52 program code +u36 -> u39 gfx +u8 sound +OKI6295 +NVSRAM DS1225a +Philips SCN68681 +Xlinx XC3042a + +Dumped by ANY + +***************************************************************************/ + +ROM_START( tm ) + ROM_REGION( 0x200000, REGION_CPU1, 0 ) // 68000 Code + ROM_LOAD16_BYTE( "tmaster.u51", 0x000000, 0x080000, CRC(edaa5874) SHA1(48b99bc7f5a6453def265967ca7d8eefdf9dc97b) ) + ROM_LOAD16_BYTE( "tmaster.u52", 0x000001, 0x080000, CRC(e9fd30fc) SHA1(d91ea05d5f574603883336729fb9df705688945d) ) + + ROM_REGION( 0x400000, REGION_GFX1, ROMREGION_ERASE ) // Blitter gfx + ROM_LOAD16_BYTE( "tmaster.u38", 0x100000, 0x080000, CRC(68885ef6) SHA1(010602b59c33c3e490491a296ddaf8952e315b83) ) + ROM_LOAD16_BYTE( "tmaster.u36", 0x100001, 0x080000, CRC(204096ec) SHA1(9239923b7eedb6003c63ef2e8ff224edee657bbc) ) + // unused gap + ROM_LOAD16_BYTE( "tmaster.u39", 0x300000, 0x080000, CRC(cbb716cb) SHA1(4e8d8f6cbfb25a8161ff8fe7505d6b209650dd2b) ) + ROM_LOAD16_BYTE( "tmaster.u37", 0x300001, 0x080000, CRC(e0b6a9f7) SHA1(7e057ca87833c682e5be03668469259bbdefbf20) ) + + ROM_REGION( 0x100000, REGION_SOUND1, 0 ) // Samples + ROM_LOAD( "tmaster.u8", 0x40000, 0x040000, CRC(f39ad4cf) SHA1(9bcb9a5dd3636d6541eeb3e737c7253ab0ed4e8d) ) + ROM_CONTINUE( 0xc0000, 0x040000 ) +ROM_END + +/*************************************************************************** + +Touchmaster 3000 +by Midway +touchscreen game +Dumped BY: N?Z! + +All chips are SGS 27C801 +--------------------------- + +Name_Board Location Version Use Checksum +----------------------------------------------------------------------------------- +TM3K_u8.bin 5.0 Audio Program & sounds 64d5 +TM3K_u51.bin 5.01 Game Program & Cpu instructions 0c6c +TM3K_u52.bin 5.01 Game Program & Cpu instructions b2d8 +TM3K_u36.bin 5.0 Video Images & Graphics 54f1 +TM3K_u37.bin 5.0 Video Images & Graphics 4856 +TM3K_u38.bin 5.0 Video Images & Graphics 5493 +TM3K_u39.bin 5.0 Video Images & Graphics 6029 +TM3K_u40.bin 5.0 Video Images & Graphics ccb4 +TM3K_u41.bin 5.0 Video Images & Graphics 54a7 +u62 (NOT INCLUDED) N/A Battery Memory Module N/A +J12 (NOT INCLUDED) N/A Security Key(not required for this Version) +----------------------------------------------------------------------------------- + +SCN68681c1n40 +xc3042A www.xilinx.com + +***************************************************************************/ + +ROM_START( tm3k ) + ROM_REGION( 0x200000, REGION_CPU1, 0 ) // 68000 Code + ROM_LOAD16_BYTE( "tm3k_u52.bin", 0x000001, 0x100000, CRC(8c6a0db7) SHA1(6b0eae60ea471cd8c4001749ac2677d8d4532567) ) + ROM_LOAD16_BYTE( "tm3k_u51.bin", 0x000000, 0x100000, CRC(c9522279) SHA1(e613b791f831271722f05b7e96c35519fa9fc174) ) + + ROM_REGION( 0x600000, REGION_GFX1, 0 ) // Blitter gfx + ROM_LOAD16_BYTE( "tm3k_u38.bin", 0x000000, 0x100000, CRC(a6683899) SHA1(d05024390917cdb1871d030996da8e1eb6460918) ) + ROM_LOAD16_BYTE( "tm3k_u36.bin", 0x000001, 0x100000, CRC(7bde520d) SHA1(77750b689e2f0d47804042456e54bbd9c28deeac) ) + ROM_LOAD16_BYTE( "tm3k_u39.bin", 0x200000, 0x100000, CRC(206b56a6) SHA1(09e5e05bffd0a09abd24d668e2c59b56f2c79134) ) + ROM_LOAD16_BYTE( "tm3k_u37.bin", 0x200001, 0x100000, CRC(18f50eb3) SHA1(a7c9d3b24b5fd110380ec87d9200d55cad473efc) ) + ROM_LOAD16_BYTE( "tm3k_u41.bin", 0x400000, 0x100000, BAD_DUMP CRC(74a36bca) SHA1(7ad594daa156dea40a25b390f26c2fd0550e66ff) ) + ROM_LOAD16_BYTE( "tm3k_u40.bin", 0x400001, 0x100000, CRC(353df7ca) SHA1(d6c5d5449af6b6a3acee219778583904c5b554b4) ) + + ROM_REGION( 0x100000, REGION_SOUND1, 0 ) // Samples + ROM_LOAD( "tm3k_u8.bin", 0x00000, 0x100000, CRC(d0ae33c1) SHA1(a079def9a086a091fcc4493a44fec756d2470415) ) +ROM_END + +/*************************************************************************** + +Touchmaster 4000 +by Midway +touchscreen game +Dumped BY: N?Z! + +All chips are SGS 27C801 +--------------------------- + +Name_Board Location Version Use Checksum +----------------------------------------------------------------------------------- +TM4K_u8.bin 6.0 Audio Program & sounds DE0B +TM4K_u51.bin 6.02 Game Program & Cpu instructions FEA0 +TM4K_u52.bin 6.02 Game Program & Cpu instructions 9A71 +TM4K_u36.bin 6.0 Video Images & Graphics 54f1 +TM4K_u37.bin 6.0 Video Images & Graphics 609E +TM4K_u38.bin 6.0 Video Images & Graphics 5493 +TM4K_u39.bin 6.0 Video Images & Graphics CB90 +TM4K_u40.bin 6.0 Video Images & Graphics 208A +TM4K_u41.bin 6.0 Video Images & Graphics 385D +u62 (NOT INCLUDED) N/A Battery Memory Module N/A +J12 (NOT INCLUDED) N/A Security Key(required for this Version) +----------------------------------------------------------------------------------- + +SCN68681c1n40 +xc3042A www.xilinx.com + +***************************************************************************/ + +ROM_START( tm4k ) + ROM_REGION( 0x200000, REGION_CPU1, 0 ) // 68000 Code + ROM_LOAD16_BYTE( "tm4k_u51.bin", 0x000000, 0x100000, CRC(3d8d7848) SHA1(31638f23cdd5e6cfbb2270e953f84fe1bd437950) ) + ROM_LOAD16_BYTE( "tm4k_u52.bin", 0x000001, 0x100000, CRC(6d412871) SHA1(ae27c7723b292daf6682c53bafac22e4a3cd1ece) ) + + ROM_REGION( 0x600000, REGION_GFX1, 0 ) // Blitter gfx + ROM_LOAD16_BYTE( "tm4k_u38.bin", 0x000000, 0x100000, CRC(a6683899) SHA1(d05024390917cdb1871d030996da8e1eb6460918) ) + ROM_LOAD16_BYTE( "tm4k_u36.bin", 0x000001, 0x100000, CRC(7bde520d) SHA1(77750b689e2f0d47804042456e54bbd9c28deeac) ) + ROM_LOAD16_BYTE( "tm4k_u39.bin", 0x200000, 0x100000, CRC(bac88cfb) SHA1(26ed169296b890c5f5b50c418c15299355a6592f) ) + ROM_LOAD16_BYTE( "tm4k_u37.bin", 0x200001, 0x100000, CRC(bf49fafa) SHA1(b400667bf654dc9cd01a85c8b99670459400fd60) ) + ROM_LOAD16_BYTE( "tm4k_u41.bin", 0x400000, 0x100000, CRC(e97edb1e) SHA1(75510676cf1692ad03efd4ccd57d25af1cc8ef2a) ) + ROM_LOAD16_BYTE( "tm4k_u40.bin", 0x400001, 0x100000, CRC(f6771a09) SHA1(74f71d5e910006c83a38170f24aa811c38a3e020) ) + + ROM_REGION( 0x100000, REGION_SOUND1, 0 ) // Samples + ROM_LOAD( "tm4k_u8.bin", 0x00000, 0x100000, CRC(48c3782b) SHA1(bfe105ddbde8bbbd84665dfdd565d6d41926834a) ) +ROM_END + +static DRIVER_INIT( tm3k ) +{ + // try this if you need to calibrate +#if 0 + UINT16 *ROM = (UINT16 *)memory_region( REGION_CPU1 ); + // tscreen test + ROM[0x75e3c/2] = 0x4ef9; + ROM[0x75e3e/2] = 0x0007; + ROM[0x75e40/2] = 0x5e4a; + + // tscreen test + ROM[0x765ca/2] = 0x7001; +#endif +} + +static DRIVER_INIT( tm4k ) +{ + UINT16 *ROM = (UINT16 *)memory_region( REGION_CPU1 ); + + // protection + ROM[0x83476/2] = 0x4e75; + + ROM[0x8342C/2] = 0x601a; + ROM[0x8346C/2] = 0x6002; +} + +GAME( 1996, tm, 0, tm, tmaster, 0, ROT0, "Midway", "Touchmaster", GAME_NOT_WORKING ) +GAME( 1997, tm3k, 0, tm3k, tmaster, tm3k, ROT0, "Midway", "Touchmaster 3000 (v5.01)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS) +GAME( 1998, tm4k, 0, tm3k, tmaster, tm4k, ROT0, "Midway", "Touchmaster 4000 (v6.02)", GAME_NOT_WORKING ) |