Improved video timings in The Crystal Maze: Team Challenge games, this fixes most bad palette bugs in it [J. Wallace]

This commit is contained in:
Angelo Salese 2011-07-01 17:44:37 +00:00
parent 1161d36450
commit 692628c4f0
2 changed files with 56 additions and 66 deletions

View File

@ -400,7 +400,7 @@ public:
int m_gfx_index;
UINT16 * m_vid_vidram;
UINT16 * m_vid_mainram;
// UINT8 m_scn2674_IR[16];
// UINT8 m_scn2674_IR[16];
UINT8 m_scn2674_IR_pointer;
UINT8 m_scn2674_screen1_l;
UINT8 m_scn2674_screen1_h;

View File

@ -1,5 +1,5 @@
/***********************************************************************************************************
Barcrest MPU4 Extension driver by J.Wallace, and Anonymous.
Barcrest MPU4 Extension driver by J.Wallace, Phil Bennett and Anonymous.
--- Board Setup ---
For the Barcrest MPU4 Video system, the GAME CARD (cartridge) contains the MPU4 video bios in the usual ROM
@ -165,13 +165,13 @@ timer driven, the video is capable of various raster effects etc.)
TODO:
- Correctly implement characteriser protection for each game.
- Mating Game animation and screen still slower than it should be, AVDC timing/IRQs?
- Get the BwB games running
* They have a slightly different 68k memory map. The 6850 is at e00000 and the 6840 is at e01000
They appear to hang on the handshake with the MPU4 board
- Find out what causes the games to hang/reset in service mode
Probably down to AVDC interrupt timing, there seem to be a number of race conditions re: masks
that need sorting out with proper blank handling, etc.
that need sorting out with proper blank handling, etc. I'm using a scanline timer to drive an
approximation of the SCN2674 scanline logic, but this is perhaps better served as a proper device.
- Deal 'Em lockouts vary on certain cabinets (normally connected to AUX2, but not there?)
- Deal 'Em has bad tiles (apostrophe, logo, bottom corner), black should actually be transparent
to give black on green.
@ -230,7 +230,6 @@ static void update_mpu68_interrupts(running_machine &machine)
cputag_set_input_line(machine, "video", 1, state->m_m6840_irq_state ? ASSERT_LINE : CLEAR_LINE);
cputag_set_input_line(machine, "video", 2, state->m_m6850_irq_state ? CLEAR_LINE : ASSERT_LINE);
cputag_set_input_line(machine, "video", 3, state->m_scn2674_irq_state ? ASSERT_LINE : CLEAR_LINE);
//logerror("%x,%x,%x\n",state->m_m6840_irq_state,state->m_m6850_irq_state,state->m_scn2674_irq_state);
}
/* Communications with 6809 board */
@ -479,12 +478,11 @@ static SCREEN_UPDATE(mpu4_vid)
attr = tiledat >>12;
if (attr)
drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[gfxregion],tiledat,0,0,0,(x*8)+(4*8),(y*8)+4);
drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[gfxregion],tiledat,0,0,0,(x*8),(y*8));
}
if (dbl_size&2)
{
//state->m_linecounter -=8;//Since every row is 8 scanlines, a double row must halve this, so we take 8 lines off the counter
y++;/* skip a row? */
}
@ -565,7 +563,7 @@ static void scn2674_write_init_regs(mpu4_state *state, UINT8 data)
break;
case 3:
state->m_IR3_scn2674_vert_front_porch = (((data&0xe0)>>5) * 4)+4 ;//returning actual value
state->m_IR3_scn2674_vert_front_porch = (((data&0xe0)>>5) * 4)+4 ;
state->m_IR3_scn2674_vert_back_porch = ((data&0x1f) * 2) + 4;
LOGSTUFF(("IR3 - Vertical Front Porch %02i Lines\n",state->m_IR3_scn2674_vert_front_porch));
@ -671,7 +669,7 @@ static void scn2674_write_init_regs(mpu4_state *state, UINT8 data)
}
state->m_scn2674_horz_front_porch = 2*(state->m_IR1_scn2674_equalizing_constant) + 3*(state->m_IR2_scn2674_horz_sync_width)-(state->m_IR5_scn2674_character_per_row) - state->m_IR2_scn2674_horz_back_porch;
LOGSTUFF(("IRXX - Horizontal Front Porch %02x CCLKs\n",state->m_scn2674_horz_front_porch));
LOGSTUFF(("Horizontal Front Porch %02x CCLKs\n",state->m_scn2674_horz_front_porch));
state->m_scn2674_IR_pointer++;
if (state->m_scn2674_IR_pointer>14)state->m_scn2674_IR_pointer=14;
@ -745,8 +743,6 @@ static void scn2674_write_command(running_machine &machine, UINT8 data)
/* Display on */
operand = data & 0x04;
//state->m_scn2674_display_enabled = 1;
if (operand)
{
state->m_scn2674_display_enabled_field = 1;
@ -781,8 +777,8 @@ static void scn2674_write_command(running_machine &machine, UINT8 data)
operand = data & 0x1f;
LOGSTUFF(("reset interrupt / status bit %02x\n",operand));
state->m_scn2674_irq_register &= ~(data & 0x1f);//((data & 0x1f)^0x1f);
state->m_scn2674_status_register &= ~(data & 0x1f);//((data & 0x1f)^0x1f);
state->m_scn2674_irq_register &= ~(data & 0x1f);
state->m_scn2674_status_register &= ~(data & 0x1f);
LOGSTUFF(("IRQ Status after reset\n"));
LOGSTUFF(("Split 2 IRQ: %d Active\n",(state->m_scn2674_irq_register>>0)&1));
@ -821,7 +817,7 @@ static void scn2674_write_command(running_machine &machine, UINT8 data)
{
/* Enable Interrupt mask*/
operand = data & 0x1f;
state->m_scn2674_irq_mask |= (data & 0x1f); /* enables .. doesn't disable? */
state->m_scn2674_irq_mask |= (data & 0x1f);
LOGSTUFF(("IRQ Mask after enable %x\n",operand));
LOGSTUFF(("Split 2 IRQ: %d Unmasked\n",(state->m_scn2674_irq_mask>>0)&1));
@ -998,7 +994,7 @@ static VIDEO_START( mpu4_vid )
{
mpu4_state *state = machine.driver_data<mpu4_state>();
/* if anything uses tile sizes other than 8x8 we can't really do it this way.. we'll have to draw tiles by hand.
maybe we will anyway, but for now we don't need to */
All Barcrest stuff uses 8x8, son unless the BwB is different, we don't need to */
state->m_vid_vidram = auto_alloc_array(machine, UINT16, 0x20000/2);
@ -1115,7 +1111,7 @@ WRITE16_HANDLER( bt471_w )
struct bt471_t &bt471 = state->m_bt471;
UINT8 val = data & 0xff;
{
popmessage("Bt477: Unhandled write access (offset:%x, data:%x)", offset, val);
popmessage("Bt471: Unhandled write access (offset:%x, data:%x)", offset, val);
}
switch (offset)
@ -1151,14 +1147,14 @@ WRITE16_HANDLER( bt471_w )
// default:
{
popmessage("Bt477: Unhandled write access (offset:%x, data:%x)", offset, val);
popmessage("Bt471: Unhandled write access (offset:%x, data:%x)", offset, val);
}
}
}
READ16_HANDLER( bt471_r )
{
popmessage("Bt477: Unhandled read access (offset:%x)", offset);
popmessage("Bt471: Unhandled read access (offset:%x)", offset);
return 0;
}
@ -1259,7 +1255,7 @@ static WRITE8_HANDLER( ic3ss_vid_w )
//This would seem to be right, needs checking against a PCB
device_t *ic3ssv = space->machine().device("ptm_ic3ss_vid");
mpu4_state *state = space->machine().driver_data<mpu4_state>();
downcast<ptm6840_device *>(ic3ssv)->write(offset,data);//can speed things up if this is disabled
downcast<ptm6840_device *>(ic3ssv)->write(offset,data);
device_t *msm6376 = space->machine().device("msm6376");
if (offset == 3)
@ -1316,9 +1312,9 @@ static INPUT_PORTS_START( crmaze )
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("Test Switch")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("Test Button") PORT_CODE(KEYCODE_W)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("Refill Key") PORT_CODE(KEYCODE_R) PORT_TOGGLE
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Door Switch?") PORT_TOGGLE
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_INTERLOCK) PORT_NAME("Cashbox Door") PORT_CODE(KEYCODE_Q) PORT_TOGGLE
PORT_START("BLACK2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Right Yellow")
@ -1327,7 +1323,7 @@ static INPUT_PORTS_START( crmaze )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Left Red")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_NAME("Left Yellow")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Getout Yellow")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_BUTTON5) PORT_NAME("Getout Red")/* Labelled Escape on cabinet */
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_BUTTON5) PORT_NAME("Escape/Getout Red")/* Labelled Escape on cabinet */
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("DIL1")
@ -1386,7 +1382,7 @@ static INPUT_PORTS_START( crmaze )
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_SPECIAL)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_SPECIAL)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_SPECIAL)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_SPECIAL)//resets game if pressed - sometimes hoppers run here, but crmaze has tubes
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_SPECIAL)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_SPECIAL)//XA
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_SPECIAL)//YA
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_SPECIAL)//XB
@ -1435,13 +1431,13 @@ static INPUT_PORTS_START( mating )
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("Test Button") PORT_CODE(KEYCODE_W) PORT_TOGGLE
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("Test Button") PORT_CODE(KEYCODE_W)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("Refill Key") PORT_CODE(KEYCODE_R) PORT_TOGGLE
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_INTERLOCK) PORT_NAME("Cashbox Door") PORT_CODE(KEYCODE_Q) PORT_TOGGLE
PORT_START("BLACK2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Right Yellow")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Right Red") // selects the answer
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Right Red")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Left Yellow")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_NAME("Left Red")
@ -2050,13 +2046,13 @@ static MACHINE_RESET( mpu4_vid )
static ADDRESS_MAP_START( mpu4_68k_map, AS_PROGRAM, 16 )
AM_RANGE(0x000000, 0x7fffff) AM_ROM
AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_BASE_MEMBER(mpu4_state, m_vid_mainram)// AM_MIRROR(0x10000)
AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_BASE_MEMBER(mpu4_state, m_vid_mainram)
// AM_RANGE(0x810000, 0x81ffff) AM_RAM /* ? */
AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8("saa", saa1099_data_w, 0x00ff)
AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8("saa", saa1099_control_w, 0x00ff)
AM_RANGE(0xa00000, 0xa00003) AM_READWRITE(ef9369_r, ef9369_w)
/* AM_RANGE(0xa00004, 0xa0000f) AM_READWRITE(mpu4_vid_unmap_r, mpu4_vid_unmap_w) */
AM_RANGE(0xb00000, 0xb0000f) AM_READWRITE(mpu4_vid_scn2674_r, mpu4_vid_scn2674_w)//where is BLANK?
AM_RANGE(0xb00000, 0xb0000f) AM_READWRITE(mpu4_vid_scn2674_r, mpu4_vid_scn2674_w)
AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w)
AM_RANGE(0xff8000, 0xff8001) AM_DEVREADWRITE8_MODERN("acia6850_1", acia6850_device, status_read, control_write, 0xff)
AM_RANGE(0xff8002, 0xff8003) AM_DEVREADWRITE8_MODERN("acia6850_1", acia6850_device, data_read, data_write, 0xff)
@ -2174,7 +2170,7 @@ static ADDRESS_MAP_START( bwbvid5_68k_map, AS_PROGRAM, 16 )
ADDRESS_MAP_END
/* Deal 'Em */
/* Deal 'Em was designed as an enhanced gamecard, to fit into an existing MPU4 cabinet
/* Deal 'Em was designed as an enhanced gamecard, to fit into various existing MPU4 cabinets
It's an unoffical addon, and does all its work through the existing 6809 CPU.
Although given unofficial status, Barcrest's patent on the MPU4 Video hardware (GB1596363) describes
the Deal 'Em board design, rather than the one they ultimately used, suggesting some sort of licensing deal. */
@ -2329,23 +2325,7 @@ static void scn2674_line(running_machine &machine)
{
mpu4_state *state = machine.driver_data<mpu4_state>();
if (state->m_linecounter==0)//front porch
{
// these will be used to track which row / line we're on eventually
// and used by the renderer to render the correct data
state->m_scn2674_status_register |= 0x10;
if (state->m_scn2674_irq_mask&0x10)
{
LOG2674(("vblank irq\n"));
state->m_scn2674_irq_state = 1;
state->m_scn2674_irq_register |= 0x10;
update_mpu68_interrupts(machine);
}
}
if (state->m_linecounter==4)/* Ready - this triggers for the first scanline of the screen */
if (state->m_linecounter==0)/* Ready - this triggers for the first scanline of the screen */
{
state->m_scn2674_status_register |= 0x02;
if (state->m_scn2674_irq_mask&0x02)
@ -2358,7 +2338,7 @@ static void scn2674_line(running_machine &machine)
}
// should be triggered at the start of each ROW (line zero for that row)
if ((state->m_linecounter+4)%8 == 0)
if ((state->m_linecounter)%8 == 0)
{
state->m_scn2674_status_register |= 0x08;
if (state->m_scn2674_irq_mask&0x08)
@ -2368,16 +2348,11 @@ static void scn2674_line(running_machine &machine)
state->m_scn2674_irq_register |= 0x08;
update_mpu68_interrupts(machine);
}
state->m_rowcounter++;
state->m_rowcounter = ((state->m_rowcounter+1)% 38);//Not currently used
}
if (state->m_linecounter%7 == 0)
{
state->m_rowcounter++;
}
// this is ROWS not scanlines!!
if (state->m_linecounter+4 == state->m_IR12_scn2674_split_register_1*8)
if (state->m_linecounter == state->m_IR12_scn2674_split_register_1*8)
/* Split Screen 1 */
{
if (state->m_scn2674_spl1)
@ -2391,12 +2366,12 @@ static void scn2674_line(running_machine &machine)
LOG2674(("SCN2674 Split Screen 1\n"));
state->m_scn2674_irq_state = 1;
update_mpu68_interrupts(machine);
machine.primary_screen->update_partial(machine.primary_screen->vpos());
machine.primary_screen->update_partial(state->m_linecounter);
}
}
// this is in ROWS not scanlines!!!
if (state->m_linecounter+4 == state->m_IR13_scn2674_split_register_2*8)
if (state->m_linecounter == state->m_IR13_scn2674_split_register_2*8)
/* Split Screen 2 */
{
if (state->m_scn2674_spl2)
@ -2410,9 +2385,24 @@ static void scn2674_line(running_machine &machine)
state->m_scn2674_irq_state = 1;
state->m_scn2674_irq_register |= 0x01;
update_mpu68_interrupts(machine);
machine.primary_screen->update_partial(machine.primary_screen->vpos());
machine.primary_screen->update_partial(state->m_linecounter);
}
}
if (state->m_linecounter==296)//front porch
{
state->m_scn2674_status_register |= 0x10;
if (state->m_scn2674_irq_mask&0x10)
{
LOG2674(("vblank irq\n"));
state->m_scn2674_irq_state = 1;
state->m_scn2674_irq_register |= 0x10;
update_mpu68_interrupts(machine);
}
}
}
@ -2423,12 +2413,12 @@ static TIMER_DEVICE_CALLBACK( scanline_timer_callback )
if ((state->m_scn2674_display_enabled_scanline)&&(!state->m_scn2674_display_enabled))
{
state->m_scn2674_display_enabled = 1;
//state->m_linecounter = 0;
}
if (state->m_scn2674_display_enabled)
{
state->m_linecounter = ((state->m_linecounter+1)%313);
//This represents the scanline counter in the SCN2674. Note that we ignore the horizontal blanking
}
scn2674_line(timer.machine());
@ -2458,10 +2448,9 @@ static MACHINE_CONFIG_START( mpu4_vid, mpu4_state )
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
MCFG_SCREEN_SIZE((63*8)+(17*8), (37*8)+17) // note this directly affects the scanline counters used below, and thus the timing of everything
MCFG_SCREEN_VISIBLE_AREA(4*8, (63*8)+(4*8)-1, 4, (37*8)+4-1)
MCFG_SCREEN_VISIBLE_AREA(0, (63*8)+(0)-1, 0, (37*8)+0-1)
MCFG_SCREEN_REFRESH_RATE(50)
// MCFG_SCREEN_RAW_PARAMS(4000000*2, 80*8, 4, (63*8)+4, (37*8)+10+4+3, 4, (37*8)+4)//42*8, 0*8, 37*8) 3
MCFG_SCREEN_UPDATE(mpu4_vid)
MCFG_CPU_ADD("video", M68000, VIDEO_MASTER_CLOCK )
@ -2529,8 +2518,8 @@ static MACHINE_CONFIG_START( bwbvid, mpu4_state )
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
MCFG_SCREEN_SIZE(64*8, 40*8) // note this directly affects the scanline counters used below, and thus the timing of everything
MCFG_SCREEN_VISIBLE_AREA(0*8, 63*8-1, 0*8, 37*8-1)
MCFG_SCREEN_SIZE((63*8)+(17*8), (37*8)+17) // note this directly affects the scanline counters used below, and thus the timing of everything
MCFG_SCREEN_VISIBLE_AREA(0, (63*8)+(0)-1, 0, (37*8)+0-1)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_UPDATE(mpu4_vid)
@ -3588,9 +3577,9 @@ ROM_END
/*Deal 'Em was a conversion kit designed to make early MPU4 machines into video games by replacing the top glass
and reel assembly with this kit and a supplied monitor.
The real Deal 'Em ran on Summit Coin hardware, and was made by someone else.
A further different release was made in 2000, running on the Barcrest MPU4 Video, rather than this one. */
and reel assembly with this kit and a supplied monitor. This explains why the cabinet switch alters lamp data and buttons.
The original Deal 'Em ran on Summit Coin hardware, and was made by someone else.
Two further different releases were made, running on the Barcrest MPU4 Video, rather than this one. These are Deal 'Em Again and Deal 'Em 2000*/
GAME( 1987, dealem, 0, dealem, dealem, 0, ROT0, "Zenitone", "Deal 'Em (MPU4 Conversion Kit, v7.0)", GAME_IMPERFECT_GRAPHICS )
@ -3606,8 +3595,8 @@ GAME( 1993, crmazed, crmaze, crmaze, crmaze, crmaze, ROT0, "Barcrest"
GAME( 1993, crmazea, crmaze, crmaze, crmaze, crmazea, ROT0, "Barcrest", "The Crystal Maze (v0.1, AMLD)", GAME_NOT_WORKING )//SWP 0.9
GAME( 1993, crmaze2, bctvidbs, crmaze, crmaze, crmaze2, ROT0, "Barcrest", "The New Crystal Maze Featuring Ocean Zone (v2.2)", GAME_NOT_WORKING )//SWP 1.0
GAME( 1993, crmaze2d, crmaze2, crmaze, crmaze, crmaze2, ROT0, "Barcrest", "The New Crystal Maze Featuring Ocean Zone (v2.2, Datapak)", GAME_NOT_WORKING )//SWP 1.0D
GAME( 1993, crmaze2a, crmaze2, crmaze, crmaze, crmaze2a, ROT0, "Barcrest", "The New Crystal Maze Featuring Ocean Zone (v0.1, AMLD)", GAME_NOT_WORKING )//SWP 1.0 /* unprotected? bootleg? */
GAME( 1993, crmaze2d, crmaze2, crmaze, crmaze, crmaze2, ROT0, "Barcrest", "The New Crystal Maze Featuring Ocean Zone (v2.2, Datapak)", GAME_NOT_WORKING )//SWP 1.0D
GAME( 1993, crmaze2a, crmaze2, crmaze, crmaze, crmaze2a, ROT0, "Barcrest", "The New Crystal Maze Featuring Ocean Zone (v0.1, AMLD)", GAME_NOT_WORKING )//SWP 1.0 /* unprotected? proto? */
GAME( 1994, crmaze3, bctvidbs, crmaze, crmaze, crmaze3, ROT0, "Barcrest", "The Crystal Maze Team Challenge (v0.9)", GAME_NOT_WORKING )//SWP 0.7
GAME( 1994, crmaze3d, crmaze3, crmaze, crmaze, crmaze3, ROT0, "Barcrest", "The Crystal Maze Team Challenge (v0.9, Datapak)", GAME_NOT_WORKING )//SWP 0.7D
@ -3621,6 +3610,7 @@ GAME( 1989, adders, bctvidbs, mpu4_vid, adders, adders, ROT0, "Barcrest"
GAME( 1989, timemchn, bctvidbs, mpu4_vid, skiltrek, timemchn, ROT0, "Barcrest", "Time Machine (v2.0)", GAME_NOT_WORKING )
//Year is a guess, based on the use of the 'Coin Man' logo
GAME( 1996?, mating, bctvidbs, mating, mating, mating, ROT0, "Barcrest", "The Mating Game (v0.4)", GAME_NOT_WORKING )//SWP 0.2 /* Using crmaze controls for now, cabinet has trackball */
GAME( 1996?, matingd, mating, mating, mating, mating, ROT0, "Barcrest", "The Mating Game (v0.4, Datapak)", GAME_NOT_WORKING )//SWP 0.2D