From 49db8b5e2c81b8a0360b98061de762c1e0ed02a7 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Wed, 20 Sep 2023 20:14:38 +0200 Subject: [PATCH] - merit/merit.cpp: corrected some inputs for couple and clones - misc/gms.cpp: added tilemap priority for cots and ballch, corrected 3rd layer colors for sc2in1 and magslot --- hash/svision.xml | 2 +- src/mame/merit/merit.cpp | 91 ++++++++++++++++++++++++---------------- src/mame/misc/gms.cpp | 85 ++++++++++++++++++++++++++++++------- 3 files changed, 125 insertions(+), 53 deletions(-) diff --git a/hash/svision.xml b/hash/svision.xml index db602f4f091..90fb6cf0f77 100644 --- a/hash/svision.xml +++ b/hash/svision.xml @@ -720,7 +720,7 @@ license:CC0-1.0 unknown - + diff --git a/src/mame/merit/merit.cpp b/src/mame/merit/merit.cpp index 5810811e047..6c8e1f4ba2f 100644 --- a/src/mame/merit/merit.cpp +++ b/src/mame/merit/merit.cpp @@ -424,6 +424,7 @@ void merit_state::misc_w(uint8_t data) m_lscnblk = (data >> 3) & 1; // other bits unknown + // TODO: bit 0 gets set by couple and clones in the levels where the tiles' GFX are wrong. Another video bank bit? } void merit_banked_state::bank_w(uint8_t data) @@ -804,7 +805,7 @@ static INPUT_PORTS_START( iowapp ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) -// PORT_MODIFY("IN1") /* Pins #57 through #51 of J3 in descending order */ +// PORT_MODIFY("IN1") // Pins #57 through #51 of J3 in descending order // PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // If HIGH triggers a "TOKEN LOW" error - Hopper related PORT_MODIFY("DSW") @@ -840,7 +841,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( pitboss ) // PCB pinout maps 12 lamp outputs - Where are they mapped? - PORT_START("IN0") /* Pins #65 through #58 of J3 in descending order */ + PORT_START("IN0") // Pins #65 through #58 of J3 in descending order PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(KEYCODE_Z) PORT_NAME("P1/P2 Button 1") PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(KEYCODE_X) PORT_NAME("P1/P2 Button 2") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(KEYCODE_C) PORT_NAME("P1/P2 Button 3") @@ -848,7 +849,7 @@ static INPUT_PORTS_START( pitboss ) // PCB pinout maps 12 lamp outputs - Where a PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_CODE(KEYCODE_B) PORT_NAME("P1/P2 Button 5") PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("P1/P2 Play") PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_CODE(KEYCODE_Q) PORT_NAME("P1/P2 Cancel") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // pulling this LOW causes "unathorized conversion" msg. + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // pulling this LOW causes "unauthorized conversion" msg. PORT_START("IN1") // Pins #57 through #51 of J3 in descending order PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) @@ -932,7 +933,7 @@ static INPUT_PORTS_START( mroundup ) // TODO: Find were Player 2 "Play" is mappe PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL PORT_CODE(KEYCODE_D) PORT_NAME("P2 Button 3") PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_COCKTAIL PORT_CODE(KEYCODE_F) PORT_NAME("P2 Button 4") PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_COCKTAIL PORT_CODE(KEYCODE_G) PORT_NAME("P2 Button 5") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // pulling this LOW causes "unathorized conversion" msg. + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // pulling this LOW causes "unauthorized conversion" msg. PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(merit_state, rndbit_r) @@ -1052,7 +1053,7 @@ static INPUT_PORTS_START( mpchoicea ) // pitbossc games but dips like The Round PORT_MODIFY("IN1") // Pins #57 through #51 of J3 in descending order PORT_DIPNAME( 0xc0, 0xc0, "Percentage Out" ) PORT_DIPLOCATION("Special:1,2") // Pins #52 & #51?? Listed as "Switch Common Ground" PORT_DIPSETTING( 0x80, "80%" ) - PORT_DIPSETTING( 0x00, "85%" ) /* Duplicate */ + PORT_DIPSETTING( 0x00, "85%" ) // Duplicate PORT_DIPSETTING( 0xc0, "85%" ) PORT_DIPSETTING( 0x40, "90%" ) @@ -1358,15 +1359,15 @@ static INPUT_PORTS_START( dtrvwh5 ) INPUT_PORTS_END static INPUT_PORTS_START( couple ) - PORT_START("IN0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) + PORT_START("IN0") // both players use the same controls. Start a 1 player game with button 1 or a 2 player game with button 2. + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START("DSW") PORT_DIPNAME( 0x01, 0x00, "Number of Attempts" ) PORT_DIPLOCATION("SW1:1") @@ -1395,10 +1396,8 @@ static INPUT_PORTS_START( couple ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("IN1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) PORT_SERVICE_NO_TOGGLE( 0x08, IP_ACTIVE_LOW ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) @@ -1454,6 +1453,24 @@ static INPUT_PORTS_START( couplep ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END +static INPUT_PORTS_START( matchemg ) + PORT_INCLUDE( couple ) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:3") // it always gives 6 credits, but it only shows the possibility when off, maybe it locks out the second coin instead? + PORT_DIPSETTING( 0x04, DEF_STR( 1C_6C ) ) // 6 games for 5 DM + PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) ) // 5 games for 5 DM + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:4") + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:6") + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + void merit_state::pitboss(machine_config &config) { @@ -1736,7 +1753,7 @@ ROM_END ROM_START( mpchoicea ) // Like the M4C1 set above, but only 3 games here ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "m3c1_u5b.u5", 0x0000, 0x2000, CRC(685eb48a) SHA1(31f41527f7a29379bf783f48ea50c3b74523d304) ) /* Internal designation: M3CG */ + ROM_LOAD( "m3c1_u5b.u5", 0x0000, 0x2000, CRC(685eb48a) SHA1(31f41527f7a29379bf783f48ea50c3b74523d304) ) // Internal designation: M3CG ROM_LOAD( "m3c1_u6b.u6", 0x2000, 0x2000, CRC(4cf91cca) SHA1(aaf685e66e153fa2c47b90c17af9f70751008e9a) ) // Games included in this set are: ROM_LOAD( "m3c1_u7.u7", 0x4000, 0x2000, CRC(5a2aca08) SHA1(0fb4600f61ff1aef2d79ce7a63ee3fd9e79f7f3f) ) // Draw Poker, Blackjack & Acey Deucey @@ -2343,7 +2360,7 @@ ROM_START( dtrvwz5 ) ROM_LOAD( "tw5-06_sx5-2.10", 0x98000, 0x8000, CRC(790184fc) SHA1(9c8b56852b31d3312f26a5901487f6b31d9e9b4f) ) ROM_REGION( 0x0800, "crt209", ROMREGION_ERASE00 ) - ROM_LOAD( "crt-209.cpu", 0x0000, 0x0800, NO_DUMP ) // 2816 EEPROM in Z80 epoxy CPU module + ROM_LOAD( "crt-209_6221-70.cpu", 0x0000, 0x0800, NO_DUMP ) // 2816 EEPROM in Z80 epoxy CPU module ROM_FILL( 0x000, 0x800, 0xc9 ) // ret @@ -2553,7 +2570,7 @@ ROM_START( phrcrazev ) ROM_LOAD( "phrz1-07_sex-1a", 0x90000, 0x8000, CRC(ed7604b8) SHA1(b1e841b50b8ef6ae95fafac1c34b6d0337a05d18) ) ROM_END -ROM_START( couple ) +ROM_START( couple ) // bootleg of Match'em Up (6221-51 U5-0) ROM_REGION( 0x20000, "maincpu", 0 ) ROM_LOAD( "1.1d", 0x00000, 0x8000, CRC(bc70337a) SHA1(ffc484bc3965f0780d3fa5d8801af27a7164a417) ) ROM_LOAD( "2.1e", 0x10000, 0x8000, CRC(17372a93) SHA1(e0f0980003473555c2543d98d1494f82afa49f1a) ) @@ -2572,8 +2589,9 @@ ROM_END /*f205v's dump, same except for the first z80 ROM, first noticeable differences are that it doesn't jump to the backup RAM area and it gives an extra play if you reach a certain -amount of points (there is a dip switch to select the trigger: 150.000 or 200.000*/ -ROM_START( couplep ) +amount of points (there is a dip switch to select the trigger: 150.000 or 200.000) +PCB is marked: "230188" and "LC" on component side ("LC" is the Italian for "Lato Componenti" which translates to "Components Side")*/ +ROM_START( couplep ) // bootleg of Match'em Up (6221-51 U5-0) ROM_REGION( 0x20000, "maincpu", 0 ) ROM_LOAD( "p_1.1d", 0x00000, 0x8000, CRC(4601ace6) SHA1(a824ceebf8b9ce77ef2c8e92636e4261f2ae0420) ) ROM_LOAD( "2.1e", 0x10000, 0x8000, CRC(17372a93) SHA1(e0f0980003473555c2543d98d1494f82afa49f1a) ) @@ -2591,8 +2609,9 @@ ROM_START( couplep ) ROM_END /*f205v's dump, this one looks like an intermediate release between set1 and set2; -it has same dips as set1, but remaining machine code is the same as set2*/ -ROM_START( couplei ) +it has same dips as set1, but remaining machine code is the same as set2 +PCB is marked: "230188" and "LC" on component side ("LC" is the Italian for "Lato Componenti" which translates to "Components Side")*/ +ROM_START( couplei ) // bootleg of Match'em Up (6221-51 U5-0) ROM_REGION( 0x20000, "maincpu", 0 ) ROM_LOAD( "i_1.1d", 0x00000, 0x8000, CRC(760fa29e) SHA1(a37a1562028d9615adff3d2ef88e0156354c720a) ) ROM_LOAD( "2.1e", 0x10000, 0x8000, CRC(17372a93) SHA1(e0f0980003473555c2543d98d1494f82afa49f1a) ) @@ -2640,7 +2659,6 @@ void merit_state::init_crt209() memcpy(&buffer[0], rom, 0x800); - // these give the same results as the above subroutine in init_dtrvwz5 at the address the game jumps to (0xb040), so should be right? But then again it doesn't solve the missing GFX issue. for (int i = 0; i < 0x800; i++) { rom[i] = buffer[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 1, 0, 2, 3, 4, 5, 6, 7)]; @@ -2653,15 +2671,15 @@ void merit_state::init_crt209() // Gambling type games -GAME( 1983, pitboss, 0, pitboss, pitbossa, merit_state, empty_init, ROT0, "Merit", "The Pit Boss (2214-07, U5-0A)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) /* "7" hand written over a 5 */ +GAME( 1983, pitboss, 0, pitboss, pitbossa, merit_state, empty_init, ROT0, "Merit", "The Pit Boss (2214-07, U5-0A)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) // "7" hand written over a 5 GAME( 1983, pitboss04, pitboss, casino5, pitboss, merit_banked_state, empty_init, ROT0, "Merit", "The Pit Boss (2214-04)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1983, pitboss03, pitboss, pitboss, pitbossa, merit_state, empty_init, ROT0, "Merit", "The Pit Boss (2214-03, U5-0C)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) /* Also M4A4 */ -GAME( 1983, pitboss03a, pitboss, pitboss, pitbossa1, merit_state, empty_init, ROT0, "Merit", "The Pit Boss (2214-03, U5-1C)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) /* Also M4A4 */ -GAME( 1983, pitboss03b, pitboss, pitboss, pitbossa, merit_state, empty_init, ROT0, "Merit", "The Pit Boss (M4A4)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) /* No labels, so use internal designation */ +GAME( 1983, pitboss03, pitboss, pitboss, pitbossa, merit_state, empty_init, ROT0, "Merit", "The Pit Boss (2214-03, U5-0C)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) // Also M4A4 +GAME( 1983, pitboss03a, pitboss, pitboss, pitbossa1, merit_state, empty_init, ROT0, "Merit", "The Pit Boss (2214-03, U5-1C)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) // Also M4A4 +GAME( 1983, pitboss03b, pitboss, pitboss, pitbossa, merit_state, empty_init, ROT0, "Merit", "The Pit Boss (M4A4)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) // No labels, so use internal designation GAME( 1983, pitbossm4, pitboss, pitboss, pitbossb, merit_state, empty_init, ROT0, "Merit", "The Pit Boss (M4A1)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) GAME( 1983, pitbossps, pitboss, pitboss, pitbossa, merit_state, empty_init, ROT0, "Merit", "The Pit Boss (PSB1)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) GAME( 1983, housecard, pitboss, pitboss, pitbossa, merit_state, empty_init, ROT0, "Merit", "House of Cards (HSC1)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1983, mdchoice, pitboss, pitboss, mdchoice, merit_state, empty_init, ROT0, "Merit", "Dealer's Choice (E4A1)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) /* Copyright year based on other Pit Boss sets */ +GAME( 1983, mdchoice, pitboss, pitboss, mdchoice, merit_state, empty_init, ROT0, "Merit", "Dealer's Choice (E4A1)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) // Copyright year based on other Pit Boss sets GAME( 1983, mpchoice, pitboss, pitboss, mpchoice, merit_state, empty_init, ROT0, "Merit", "Player's Choice (M4C1)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) GAME( 1982, mpchoicea, pitboss, pitboss, mpchoicea, merit_state, empty_init, ROT0, "Merit", "Player's Choice (M3C1)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) @@ -2681,12 +2699,13 @@ GAME( 1990, mosdraw, 0, mosdraw, mosdraw, merit_state, empty_ GAME( 1986, bigappg, 0, bigappg, bigappg, merit_state, empty_init, ROT0, "Big Apple Games / Merit", "The Big Apple (2131-13, U5-0)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, misdraw, 0, misdraw, bigappg, merit_state, empty_init, ROT0, "Big Apple Games / Merit", "Michigan Super Draw (2131-16, U5-2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, iowapp, 0, riviera, iowapp, merit_state, empty_init, ROT0, "Merit", "Iowa Premium Player (2131-21, U5-1)", MACHINE_SUPPORTS_SAVE ) /* Copyright year based on rom label */ +GAME( 1990, iowapp, 0, riviera, iowapp, merit_state, empty_init, ROT0, "Merit", "Iowa Premium Player (2131-21, U5-1)", MACHINE_SUPPORTS_SAVE ) // Copyright year based on ROM label GAME( 1986, dodgectya, dodgecty, misdraw, dodge, merit_state, init_crt209, ROT0, "Merit", "Dodge City (2131-82, U5-0D)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) // no text shown, while cards are GAME( 1986, dodgectyb, dodgecty, misdraw, dodge, merit_state, init_crt209, ROT0, "Merit", "Dodge City (2131-82, U5-50)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) // no text shown, while cards are GAME( 1986, dodgectyc, dodgecty, misdraw, dodge, merit_state, init_crt209, ROT0, "Merit", "Dodge City (2131-82, U5-0 GT)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) // no text shown, while cards are +// Superstar is part of the title GAME( 1989, unkmerit, 0, misdraw, bigappg, merit_state, empty_init, ROT0, "Merit", "unknown Merit game (4435-81, U5-1)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) // no text shown, while cards are // Trivia and Word games @@ -2717,7 +2736,7 @@ GAME( 1986, phrcrazev, phrcraze, phrcraze, phrcrazs, merit_quiz_state, init_k GAME( 1987, dtrvwz5, 0, dtrvwz5, dtrvwh5, merit_quiz_state, init_key<6>, ROT0, "Merit", "Deluxe Trivia ? Whiz (6221-70, U5-0A Edition 5)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, couple, 0, couple, couple, merit_state, init_crt209, ROT0, "Merit", "The Couples (set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1988, couplep, couple, couple, couplep, merit_state, init_crt209, ROT0, "Merit", "The Couples (set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1988, couplei, couple, couple, couple, merit_state, init_crt209, ROT0, "Merit", "The Couples (set 3)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1986, matchemg, couple, couple, couple, merit_state, init_crt209, ROT0, "Merit", "Match'em Up (German)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION ) +GAME( 1988, couple, 0, couple, couple, merit_state, init_crt209, ROT0, "bootleg", "The Couples (set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // in some levels the tiles' GFX are jumbled +GAME( 1988, couplep, couple, couple, couplep, merit_state, init_crt209, ROT0, "bootleg", "The Couples (set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // " +GAME( 1988, couplei, couple, couple, couple, merit_state, init_crt209, ROT0, "bootleg", "The Couples (set 3)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // " +GAME( 1986, matchemg, couple, couple, matchemg, merit_state, init_crt209, ROT0, "Merit", "Match'em Up (German)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // " diff --git a/src/mame/misc/gms.cpp b/src/mame/misc/gms.cpp index 8c34c460ce3..0774298313e 100644 --- a/src/mame/misc/gms.cpp +++ b/src/mame/misc/gms.cpp @@ -55,13 +55,14 @@ Keep pressed 9 and press reset to enter service mode. TODO: - correct decode for 1st layer in sc2in1 and magslot -- tilemap priorities for cots and ballch +- fix 1st tilemap transparency enable - correct EEPROM hookup for all games - oki banking - hookup MCU and YM2151 sound for the mahjong games - hookup PIC16F84 for rbspm once a CPU core is available - emulate protection devices correctly instead of patching - hookup lamps and do layouts +- keyboard inputs for mahjong games */ #include "emu.h" @@ -78,6 +79,16 @@ TODO: #include "tilemap.h" +// configurable logging +#define LOG_TILEATTR (1U << 1) + +#define VERBOSE (LOG_GENERAL | LOG_TILEATTR) + +#include "logmacro.h" + +#define LOGTILEATTR(...) LOGMASKED(LOG_TILEATTR, __VA_ARGS__) + + namespace { class gms_2layers_state : public driver_device @@ -100,6 +111,7 @@ public: void rbspm(machine_config &config); void super555(machine_config &config); + void train(machine_config &config); void init_ballch(); void init_cots(); @@ -145,6 +157,7 @@ private: void mcu_io_mux_w(uint8_t data); void eeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + DECLARE_VIDEO_START(train) { video_start(); m_tilemap[0]->set_transparent_pen(0); } // TODO: this shouldn't be needed TILE_GET_INFO_MEMBER(get_tile0_info); TILE_GET_INFO_MEMBER(get_tile1_info); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -193,6 +206,22 @@ uint16_t gms_2layers_state::input_matrix_r() void gms_2layers_state::tilebank_w(uint16_t data) { m_tilebank = data; + + // fedcba98 76543210 + // xxxx // unknown (never seen set, possibly a 4th tilemap not used by the dumped games?) + // x // 3rd tilemap enable (probably) + // xx // bank 3rd tilemap + // x // unknown (never seen set) + // x // unknown (never seen set) + // x // unknown (set during most screens in the mahjong games and in sc2in1') + // x // priority between 1st and 2nd tilemaps + // x // bank 1st tilemap + // x // 1st tilemap enable (probably) + // xx // bank 2nd tilemap + // x // 2nd tilemap enable (probably) + + if (m_tilebank & 0xf1c0) + LOGTILEATTR("%04x\n", m_tilebank); } template @@ -1176,7 +1205,7 @@ GFXDECODE_END static GFXDECODE_START( gfx_magslot ) GFXDECODE_ENTRY( "gfx1", 0, magslot16_layout, 0x000, 16 ) GFXDECODE_ENTRY( "gfx2", 0, gfx_8x8x4_packed_lsb, 0x100, 16 ) - GFXDECODE_ENTRY( "gfx3", 0, gfx_8x8x4_packed_lsb, 0x100, 16 ) // wrong colors + GFXDECODE_ENTRY( "gfx3", 0, gfx_8x8x4_packed_lsb, 0x400, 16 ) GFXDECODE_END void gms_2layers_state::video_start() @@ -1184,6 +1213,7 @@ void gms_2layers_state::video_start() m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gms_2layers_state::get_tile0_info)), TILEMAP_SCAN_ROWS, 8, 32, 64, 8); m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gms_2layers_state::get_tile1_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + //m_tilemap[0]->set_transparent_pen(0); m_tilemap[1]->set_transparent_pen(0); save_item(NAME(m_tilebank)); @@ -1218,20 +1248,34 @@ TILE_GET_INFO_MEMBER(gms_3layers_state::get_tile2_info) tileinfo.set(2, (tile & 0x0fff) + ((m_tilebank >> 9) & 3) * 0x1000, tile >> 12, 0); } -// TODO: ballch's and cots' title screens highlight a priority bug: the title and copyright are drawn behind the background + uint32_t gms_2layers_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - m_tilemap[0]->draw(screen, bitmap, cliprect); - m_tilemap[1]->draw(screen, bitmap, cliprect); + if (BIT(m_tilebank, 3) && BIT(m_tilebank, 5)) + m_tilemap[0]->draw(screen, bitmap, cliprect); + + if (BIT(m_tilebank, 0)) + m_tilemap[1]->draw(screen, bitmap, cliprect); + + if (BIT(m_tilebank, 3) && !BIT(m_tilebank, 5)) + m_tilemap[0]->draw(screen, bitmap, cliprect); return 0; } uint32_t gms_3layers_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - m_tilemap[0]->draw(screen, bitmap, cliprect); - m_tilemap[1]->draw(screen, bitmap, cliprect); - m_tilemap[2]->draw(screen, bitmap, cliprect); + if (BIT(m_tilebank, 3) && BIT(m_tilebank, 5)) + m_tilemap[0]->draw(screen, bitmap, cliprect); + + if (BIT(m_tilebank, 0)) + m_tilemap[1]->draw(screen, bitmap, cliprect); + + if (BIT(m_tilebank, 3) && !BIT(m_tilebank, 5)) + m_tilemap[0]->draw(screen, bitmap, cliprect); + + if (BIT(m_tilebank, 11)) + m_tilemap[2]->draw(screen, bitmap, cliprect); return 0; } @@ -1291,6 +1335,13 @@ void gms_2layers_state::super555(machine_config &config) config.device_remove("ymsnd"); } +void gms_2layers_state::train(machine_config &config) +{ + super555(config); + + MCFG_VIDEO_START_OVERRIDE(gms_2layers_state, train) +} + void gms_3layers_state::magslot(machine_config &config) { super555(config); @@ -1333,7 +1384,7 @@ http://youtu.be/pPk-6N1wXoE http://youtu.be/VGbrR7GfDck */ -ROM_START( rbspm ) +ROM_START( rbspm ) // PCB NO.6899-B ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 Code ROM_LOAD( "mj-dfmj-p1.bin", 0x00000, 0x80000, CRC(8f81f154) SHA1(50a9a373dec96b0265907f053d068d636bdabd61) ) @@ -1361,7 +1412,7 @@ ROM_START( rbspm ) ROM_END -ROM_START( super555 ) +ROM_START( super555 ) // GMS branded chips: A66, A68, M06 ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD( "super555-v1.5e-0d9b.u64", 0x00000, 0x80000, CRC(9a9c16cc) SHA1(95609dbd45feb591190a2b62dee8846cdcec3462) ) @@ -1379,7 +1430,9 @@ ROM_START( super555 ) ROM_END -ROM_START( sc2in1 ) // Basically same PCB as magslot, but with only 1 dip bank. Most labels have been covered with other labels with 'TETRIS' hand-written +// Basically same PCB as magslot, but with only 1 dip bank. Most labels have been covered with other labels with 'TETRIS' hand-written +// GMS-branded chips: A66, A89, A201, A202. Not populated: M88 +ROM_START( sc2in1 ) ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD( "u64", 0x00000, 0x80000, CRC(c0ad5df0) SHA1(a51f30e76493ea9fb5313c0064dac9a2a4f70cc3) ) @@ -1401,6 +1454,7 @@ ROM_END // the PCB is slightly different from the others, both layout-wise and component-wise, but it's mostly compatible. It seems to use one more GFX layer and not to have the 89C51. +// GMS-branded chips: A66, A89, A201, A202. Not populated: M88 ROM_START( magslot ) // All labels have SLOT canceled with a black pen. No sum matches the one on label. ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD( "magic 1.0c _ _ _ _.u64", 0x00000, 0x80000, CRC(84544dd7) SHA1(cf10ad3373c2f35f5fa7986be0865f760a454c28) ) // no sum on label, 1xxxxxxxxxxxxxxxxxx = 0x00 @@ -1432,7 +1486,7 @@ Major components: CPU: MC68HC00F16 Sound: OKI 6295 OSC: 22.00MHz -EEPOM: ISSI 93C46 +EEPROM: ISSI 93C46 DSW: 3 x 8-position switches BAT: 3.6v Varta battery @@ -1471,7 +1525,7 @@ Major components: CPU: MC68HC00F16 Sound: OKI 6295 OSC: 22.00MHz -EEPOM: ISSI 93C46 +EEPROM: ISSI 93C46 DSW: 3 x 8-position switches BAT: 3.6v Varta battery @@ -1543,7 +1597,6 @@ void gms_3layers_state::init_sc2in1() rom[0x4681a / 2] = 0x4e71; rom[0x46842 / 2] = 0x4e71; rom[0x46844 / 2] = 0x4e71; - //45f46 = 4e71 4e71 45f60 = 6000 45f70 = 4e71 4e71 45f9e = 6000 46818 = 4e71 4e71 46842 = 4e71 4e71 } void gms_2layers_state::init_super555() @@ -1589,5 +1642,5 @@ GAME( 2001, sc2in1, 0, magslot, sc2in1, gms_3layers_state, init_sc2in1, R GAME( 2003, magslot, 0, magslot, magslot, gms_3layers_state, empty_init, ROT0, "GMS", "Magic Slot (normal 1.0C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // needs implementing of 3rd GFX layer, correct GFX decode for 1st layer, inputs // train games -GAME( 2002, ballch, 0, super555, ballch, gms_2layers_state, init_ballch, ROT0, "TVE", "Ball Challenge (20020607 1.0 OVERSEA)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now -GAME( 2005, cots, 0, super555, cots, gms_2layers_state, init_cots, ROT0, "ECM", "Creatures of the Sea (20050328 USA 6.3)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now +GAME( 2002, ballch, 0, train, ballch, gms_2layers_state, init_ballch, ROT0, "TVE", "Ball Challenge (20020607 1.0 OVERSEA)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now +GAME( 2005, cots, 0, train, cots, gms_2layers_state, init_cots, ROT0, "ECM", "Creatures of the Sea (20050328 USA 6.3)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now