From c88f3468271bff428a9d95abd04d9d641fa9b8c6 Mon Sep 17 00:00:00 2001 From: Ryan Holtz Date: Mon, 11 Oct 2010 04:57:21 +0000 Subject: [PATCH] Added incomplete protection patches to Quizard 3.2 and Quizard Rainbow 4.1; both now run through attract mode and coin up, but crash when going in-game. [Harmony] --- src/mame/drivers/cdi.c | 25 ++++++++++++++++++++++--- src/mame/includes/cdi.h | 2 +- src/mame/machine/cdi070.c | 26 ++++++++++++++++++++++++-- src/mame/machine/cdi070.h | 8 ++++++-- 4 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/mame/drivers/cdi.c b/src/mame/drivers/cdi.c index efd65ef25ed..1d688d1c97a 100644 --- a/src/mame/drivers/cdi.c +++ b/src/mame/drivers/cdi.c @@ -199,16 +199,33 @@ static MACHINE_START( cdi ) scc68070_register_globals(machine, &state->scc68070_regs); } +static DRIVER_INIT( quizrr41 ) +{ + scc68070_set_hack_base(0x267EA8); + scc68070_set_hack_value(0x004d); + scc68070_set_hack_ack(0x57); +} + static DRIVER_INIT( quizrd12 ) { scc68070_set_hack_base(0x26F39C); scc68070_set_hack_value(0x021f); + scc68070_set_hack_ack(0x5a); } static DRIVER_INIT( quizrd17 ) { scc68070_set_hack_base(0x264C42); scc68070_set_hack_value(0x021f); + scc68070_set_hack_ack(0x5a); +} + +static DRIVER_INIT( quizrd32 ) +{ + scc68070_set_hack_base(0x266E28); + scc68070_set_hack_value(0x00ae); + scc68070_set_hack_ack(0x58); + scc68070_set_secondary_hack(0xc000-0x7b76); } static MACHINE_RESET( cdi ) @@ -386,11 +403,13 @@ ROM_END GAME( 1991, cdi, 0, cdi, cdi, 0, ROT0, "Philips", "CD-i (Mono-I) BIOS", GAME_IS_BIOS_ROOT ) // Non-working -GAME( 1996, quizard, cdi, cdi, cdi, 0, ROT0, "TAB Austria", "Quizard 3.2", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) GAME( 1995, quizrd22, cdi, cdi, cdi, 0, ROT0, "TAB Austria", "Quizard 2.2", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) -GAME( 1995, quizrd12, cdi, cdi, cdi, quizrd12, ROT0, "TAB Austria", "Quizard 1.2", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) GAME( 1998, quizrr42, cdi, cdi, cdi, 0, ROT0, "TAB Austria", "Quizard Rainbow 4.2", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) -GAME( 1998, quizrr41, cdi, cdi, cdi, 0, ROT0, "TAB Austria", "Quizard Rainbow 4.1", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) +GAME( 1998, quizrr41, cdi, cdi, cdi, quizrr41, ROT0, "TAB Austria", "Quizard Rainbow 4.1", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) + +// Partially working +GAME( 1996, quizard, cdi, cdi, cdi, quizrd32, ROT0, "TAB Austria", "Quizard 3.2", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) // Working +GAME( 1995, quizrd12, cdi, cdi, cdi, quizrd12, ROT0, "TAB Austria", "Quizard 1.2", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) GAME( 1995, quizrd17, cdi, cdi, cdi, quizrd17, ROT0, "TAB Austria", "Quizard 1.7", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) diff --git a/src/mame/includes/cdi.h b/src/mame/includes/cdi.h index cbcd15b6ca4..46d01e2d710 100644 --- a/src/mame/includes/cdi.h +++ b/src/mame/includes/cdi.h @@ -35,7 +35,7 @@ public: #define VERBOSE_LEVEL (5) -#define ENABLE_VERBOSE_LOG (0) +#define ENABLE_VERBOSE_LOG (1) #define ENABLE_UART_PRINTING (0) diff --git a/src/mame/machine/cdi070.c b/src/mame/machine/cdi070.c index c2b1e036387..81d23103bb6 100644 --- a/src/mame/machine/cdi070.c +++ b/src/mame/machine/cdi070.c @@ -62,6 +62,18 @@ static void scc68070_set_timer_callback(scc68070_regs_t *scc68070, int channel) static bool hack_active = false; static UINT16 hack_value = 0; static UINT32 hack_base = 0; +static UINT8 hack_ack = 0; +static UINT32 hack2_addr = 0; + +void scc68070_set_secondary_hack(UINT32 address) +{ + hack2_addr = address; +} + +void scc68070_set_hack_ack(UINT8 ack) +{ + hack_ack = ack; +} void scc68070_set_hack_value(UINT16 value) { @@ -116,6 +128,11 @@ static void quizard_patch(running_machine *machine) space->write_word(hack_base + 0x24, 0x203C); space->write_word(hack_base + 0x26, 0x0000); space->write_word(hack_base + 0x28, hack_value); + + if(hack2_addr) + { + //space->write_byte(hack2_addr, 1); + } } } @@ -669,7 +686,9 @@ WRITE16_HANDLER( scc68070_periphs_w ) scc68070_uart_tx(space->machine, scc68070, data & 0x00ff); scc68070->uart.transmit_holding_register = data & 0x00ff; - if((data & 0x00ff) == 0x5a) + printf("%02x ", scc68070->uart.transmit_holding_register); + + if((data & 0x00ff) == hack_ack) { count++; if(count == 2) @@ -678,7 +697,6 @@ WRITE16_HANDLER( scc68070_periphs_w ) for(int index = 0; index < 9; index++) { - verboselog(space->machine, 2, "scc68070_periphs_w: Sending to receiver: 0x5a\n"); scc68070_uart_rx(space->machine, scc68070, check_array[index]); if(index > 0) { @@ -691,6 +709,10 @@ WRITE16_HANDLER( scc68070_periphs_w ) quizard_patch(space->machine); } } + else + { + count = 0; + } } else { diff --git a/src/mame/machine/cdi070.h b/src/mame/machine/cdi070.h index 3da8a91bd97..85e001ae96f 100644 --- a/src/mame/machine/cdi070.h +++ b/src/mame/machine/cdi070.h @@ -238,11 +238,15 @@ extern READ16_HANDLER( scc68070_periphs_r ); extern WRITE16_HANDLER( scc68070_periphs_w ); //extern READ16_HANDLER( uart_loopback_enable ); -extern void scc68070_set_hack_value(UINT16 value); -extern void scc68070_set_hack_base(UINT32 base); extern void scc68070_init(running_machine *machine, scc68070_regs_t *scc68070); extern void scc68070_uart_rx(running_machine *machine, scc68070_regs_t *scc68070, UINT8 data); extern void scc68070_uart_tx(running_machine *machine, scc68070_regs_t *scc68070, UINT8 data); extern void scc68070_register_globals(running_machine *machine, scc68070_regs_t *scc68070); +// Hacks for Quizard +extern void scc68070_set_hack_value(UINT16 value); +extern void scc68070_set_hack_base(UINT32 base); +extern void scc68070_set_hack_ack(UINT8 ack); +extern void scc68070_set_secondary_hack(UINT32 address); + #endif // _MACHINE_CDI070_H_