summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author mooglyguy <therealmogminer@gmail.com>2019-12-19 21:23:30 +0100
committer mooglyguy <therealmogminer@gmail.com>2019-12-19 21:24:07 +0100
commit6204b4373be59267482e2173670a0da5a36731f2 (patch)
tree95cbc9296485263db80e5e1765cad209a9486359
parent01f2a4634489b514e4986fc8d4bd85426f2cb215 (diff)
-cdi: Split Quizard and associated functions into its own driver class, eliminated MACHINE_RESET_OVERRIDE use in the driver, nw
-rw-r--r--src/mame/drivers/cdi.cpp210
-rw-r--r--src/mame/includes/cdi.h138
2 files changed, 175 insertions, 173 deletions
diff --git a/src/mame/drivers/cdi.cpp b/src/mame/drivers/cdi.cpp
index 003447aacf7..9882baa4eeb 100644
--- a/src/mame/drivers/cdi.cpp
+++ b/src/mame/drivers/cdi.cpp
@@ -74,8 +74,11 @@ void cdi_state::cdimono1_mem(address_map &map)
map(0x00400000, 0x0047ffff).rom().region("maincpu", 0);
map(0x004fffe0, 0x004fffff).rw(m_mcd212, FUNC(mcd212_device::regs_r), FUNC(mcd212_device::regs_w));
map(0x00500000, 0x0057ffff).ram();
- map(0x00580000, 0x00ffffff).noprw();
- map(0x00e00000, 0x00efffff).ram(); // DVC
+ map(0x00580000, 0x00cfffff).noprw();
+ map(0x00d00000, 0x00dfffff).ram(); // DVC RAM block 1
+ map(0x00e00000, 0x00e7ffff).rw(FUNC(cdi_state::dvc_r), FUNC(cdi_state::dvc_w));
+ map(0x00e80000, 0x00efffff).ram(); // DVC RAM block 2
+ map(0x00f00000, 0x00ffffff).noprw();
}
void cdi_state::cdimono2_mem(address_map &map)
@@ -94,7 +97,7 @@ void cdi_state::cdimono2_mem(address_map &map)
map(0x004fffe0, 0x004fffff).rw(m_mcd212, FUNC(mcd212_device::regs_r), FUNC(mcd212_device::regs_w));
//map(0x00500000, 0x0057ffff).ram();
map(0x00500000, 0x00ffffff).noprw();
- //map(0x00e00000, 0x00efffff).ram(); // DVC
+ //map(0x00e00000, 0x00efffff).ram();
}
void cdi_state::cdi910_mem(address_map &map)
@@ -122,7 +125,7 @@ void cdi_state::cdi910_mem(address_map &map)
* Input ports *
*************************/
-INPUT_CHANGED_MEMBER(cdi_state::mcu_input)
+INPUT_CHANGED_MEMBER(quizard_state::mcu_input)
{
bool send = false;
@@ -161,10 +164,10 @@ INPUT_CHANGED_MEMBER(cdi_state::mcu_input)
break;
}
- if(send)
+ if (send)
{
uint8_t data = uint8_t(param & 0x000000ff);
- quizard_rx(data);
+ mcu_tx(data);
}
}
@@ -233,19 +236,19 @@ static INPUT_PORTS_START( quizard )
PORT_INCLUDE( cdi )
PORT_START("INPUT1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_COIN1) PORT_NAME("Coin 1") PORT_CHANGED_MEMBER(DEVICE_SELF, cdi_state,mcu_input, 0x39)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_START1) PORT_NAME("Start 1") PORT_CHANGED_MEMBER(DEVICE_SELF, cdi_state,mcu_input, 0x37)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Player 1 A") PORT_CHANGED_MEMBER(DEVICE_SELF, cdi_state,mcu_input, 0x31)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_NAME("Player 1 B") PORT_CHANGED_MEMBER(DEVICE_SELF, cdi_state,mcu_input, 0x32)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON5) PORT_NAME("Player 1 C") PORT_CHANGED_MEMBER(DEVICE_SELF, cdi_state,mcu_input, 0x33)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_COIN1) PORT_NAME("Coin 1") PORT_CHANGED_MEMBER(DEVICE_SELF, quizard_state, mcu_input, 0x39)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_START1) PORT_NAME("Start 1") PORT_CHANGED_MEMBER(DEVICE_SELF, quizard_state, mcu_input, 0x37)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Player 1 A") PORT_CHANGED_MEMBER(DEVICE_SELF, quizard_state, mcu_input, 0x31)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_NAME("Player 1 B") PORT_CHANGED_MEMBER(DEVICE_SELF, quizard_state, mcu_input, 0x32)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON5) PORT_NAME("Player 1 C") PORT_CHANGED_MEMBER(DEVICE_SELF, quizard_state, mcu_input, 0x33)
PORT_BIT(0xe0, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("INPUT2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_SERVICE1) PORT_NAME("Service") PORT_CHANGED_MEMBER(DEVICE_SELF, cdi_state,mcu_input, 0x30)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_START2) PORT_NAME("Start 2") PORT_CHANGED_MEMBER(DEVICE_SELF, cdi_state,mcu_input, 0x38)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_NAME("Player 2 A") PORT_CHANGED_MEMBER(DEVICE_SELF, cdi_state,mcu_input, 0x34)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON7) PORT_NAME("Player 2 B") PORT_CHANGED_MEMBER(DEVICE_SELF, cdi_state,mcu_input, 0x35)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON8) PORT_NAME("Player 2 C") PORT_CHANGED_MEMBER(DEVICE_SELF, cdi_state,mcu_input, 0x36)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_SERVICE1) PORT_NAME("Service") PORT_CHANGED_MEMBER(DEVICE_SELF, quizard_state, mcu_input, 0x30)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_START2) PORT_NAME("Start 2") PORT_CHANGED_MEMBER(DEVICE_SELF, quizard_state, mcu_input, 0x38)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_NAME("Player 2 A") PORT_CHANGED_MEMBER(DEVICE_SELF, quizard_state, mcu_input, 0x34)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON7) PORT_NAME("Player 2 B") PORT_CHANGED_MEMBER(DEVICE_SELF, quizard_state, mcu_input, 0x35)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON8) PORT_NAME("Player 2 C") PORT_CHANGED_MEMBER(DEVICE_SELF, quizard_state, mcu_input, 0x36)
PORT_BIT(0xe0, IP_ACTIVE_HIGH, IPT_UNUSED)
INPUT_PORTS_END
@@ -254,62 +257,27 @@ INPUT_PORTS_END
* Machine Initialization *
***************************/
-MACHINE_RESET_MEMBER( cdi_state, cdimono1 )
+void cdi_state::machine_reset()
{
uint16_t *src = (uint16_t*)memregion("maincpu")->base();
uint16_t *dst = m_planea;
memcpy(dst, src, 0x8);
-
- // Quizard Protection HLE data
- memset(m_seeds, 0, 10 * sizeof(uint16_t));
- memset(m_state, 0, 8 * sizeof(uint8_t));
- m_mcu_value = 0;
- m_mcu_ack = 0;
-}
-
-MACHINE_RESET_MEMBER( cdi_state, cdimono2 )
-{
- uint16_t *src = (uint16_t*)memregion("maincpu")->base();
- uint16_t *dst = m_planea;
- memcpy(dst, src, 0x8);
-
- m_maincpu->reset();
-}
-
-MACHINE_RESET_MEMBER( cdi_state, quizard1 )
-{
- MACHINE_RESET_CALL_MEMBER( cdimono1 );
-
- set_quizard_mcu_value(0x021f);
- set_quizard_mcu_ack(0x5a);
-}
-
-MACHINE_RESET_MEMBER( cdi_state, quizard2 )
-{
- MACHINE_RESET_CALL_MEMBER( cdimono1 );
-
- // 0x2b1: Italian
- // 0x001: French
- // 0x188: German
-
- set_quizard_mcu_value(0x188);
- set_quizard_mcu_ack(0x59);
}
-MACHINE_RESET_MEMBER( cdi_state, quizard3 )
+void quizard_state::machine_start()
{
- MACHINE_RESET_CALL_MEMBER( cdimono1 );
-
- set_quizard_mcu_value(0x00ae);
- set_quizard_mcu_ack(0x58);
+ save_item(NAME(m_seeds));
+ save_item(NAME(m_state));
+ save_item(NAME(m_mcu_value));
+ save_item(NAME(m_mcu_ack));
}
-MACHINE_RESET_MEMBER( cdi_state, quizard4 )
+void quizard_state::machine_reset()
{
- MACHINE_RESET_CALL_MEMBER( cdimono1 );
+ cdi_state::machine_reset();
- set_quizard_mcu_value(0x011f);
- set_quizard_mcu_ack(0x57);
+ memset(m_seeds, 0, 10 * sizeof(uint16_t));
+ memset(m_state, 0, 8 * sizeof(uint8_t));
}
@@ -317,23 +285,23 @@ MACHINE_RESET_MEMBER( cdi_state, quizard4 )
* Quizard Protection HLE *
***************************/
-void cdi_state::set_quizard_mcu_ack(uint8_t ack)
+void quizard_state::set_mcu_ack(uint8_t ack)
{
m_mcu_ack = ack;
}
-void cdi_state::set_quizard_mcu_value(uint16_t value)
+void quizard_state::set_mcu_value(uint16_t value)
{
m_mcu_value = value;
}
-void cdi_state::quizard_rx(uint8_t data)
+void quizard_state::mcu_tx(uint8_t data)
{
m_maincpu->uart_rx(0x5a);
m_maincpu->uart_rx(data);
}
-void cdi_state::quizard_set_seeds(uint8_t *rx)
+void quizard_state::mcu_set_seeds(uint8_t *rx)
{
m_seeds[0] = (rx[1] << 8) | rx[0];
m_seeds[1] = (rx[3] << 8) | rx[2];
@@ -347,7 +315,7 @@ void cdi_state::quizard_set_seeds(uint8_t *rx)
m_seeds[9] = (rx[19] << 8) | rx[18];
}
-void cdi_state::quizard_calculate_state()
+void quizard_state::mcu_calculate_state()
{
//const uint16_t desired_bitfield = mcu_value;
const uint16_t field0 = 0x00ff;
@@ -385,7 +353,7 @@ void cdi_state::quizard_calculate_state()
m_state[5] = lo1 - m_state[4];
}
-void cdi_state::quizard_handle_byte_tx(uint8_t data)
+void quizard_state::mcu_rx(uint8_t data)
{
static int state = 0;
static uint8_t rx[0x100];
@@ -427,8 +395,8 @@ void cdi_state::quizard_handle_byte_tx(uint8_t data)
if (rx_ptr == 20)
{
//printf("Calculating seeds\n");
- quizard_set_seeds(rx);
- quizard_calculate_state();
+ mcu_set_seeds(rx);
+ mcu_calculate_state();
state = 2;
}
break;
@@ -480,6 +448,27 @@ void cdi_state::quizard_handle_byte_tx(uint8_t data)
}
}
+READ8_MEMBER(quizard_state::mcu_p1_r)
+{
+ LOG("%s: MCU Port 1 Read\n", machine().describe_context());
+ return 0;
+}
+
+
+/*************************
+* DVC cartridge *
+*************************/
+
+READ16_MEMBER( cdi_state::dvc_r )
+{
+ logerror("%s: dvc_r: %08x = 0000 & %04x\n", machine().describe_context(), 0xe80000 + (offset << 1), mem_mask);
+ return 0;
+}
+
+WRITE16_MEMBER( cdi_state::dvc_w )
+{
+ logerror("%s: dvc_w: %08x = %04x & %04x\n", machine().describe_context(), 0xe80000 + (offset << 1), data, mem_mask);
+}
/*************************
* LCD screen *
@@ -637,8 +626,6 @@ void cdi_state::cdimono2(machine_config &config)
config.set_default_layout(layout_cdi);
- MCFG_MACHINE_RESET_OVERRIDE( cdi_state, cdimono2 )
-
M68HC05C8(config, m_servo, 4_MHz_XTAL);
M68HC05C8(config, m_slave, 4_MHz_XTAL);
@@ -690,8 +677,6 @@ void cdi_state::cdi910(machine_config &config)
config.set_default_layout(layout_cdi);
- MCFG_MACHINE_RESET_OVERRIDE( cdi_state, cdimono2 )
-
M68HC05C8(config, m_servo, 4_MHz_XTAL);
M68HC05C8(config, m_slave, 4_MHz_XTAL);
@@ -719,56 +704,19 @@ void cdi_state::cdi910(machine_config &config)
void cdi_state::cdimono1(machine_config &config)
{
cdimono1_base(config);
- MCFG_MACHINE_RESET_OVERRIDE(cdi_state, cdimono1)
CDROM(config, "cdrom").set_interface("cdi_cdrom");
SOFTWARE_LIST(config, "cd_list").set_original("cdi").set_filter("!DVC");
}
-void cdi_state::quizard(machine_config &config)
+void quizard_state::quizard(machine_config &config)
{
cdimono1_base(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &cdi_state::cdimono1_mem);
- m_maincpu->uart_tx_callback().set(FUNC(cdi_state::quizard_handle_byte_tx));
-}
-
-
-READ8_MEMBER( cdi_state::quizard_mcu_p1_r )
-{
- LOG("%s: MCU Port 1 Read\n", machine().describe_context());
- return 0;
-}
-
-void cdi_state::quizard1(machine_config &config)
-{
- quizard(config);
- MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard1)
-
- i8751_device &mcu(I8751(config, "mcu", 8000000));
- mcu.port_in_cb<1>().set(FUNC(cdi_state::quizard_mcu_p1_r));
-// mcu.set_vblank_int("screen", FUNC(cdi_state::irq0_line_pulse));
-}
-
-void cdi_state::quizard2(machine_config &config)
-{
- quizard(config);
- MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard2)
-}
-
-void cdi_state::quizard3(machine_config &config)
-{
- quizard(config);
- MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard3)
-}
-
-void cdi_state::quizard4(machine_config &config)
-{
- quizard(config);
- MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard4)
+ m_maincpu->set_addrmap(AS_PROGRAM, &quizard_state::cdimono1_mem);
+ m_maincpu->uart_tx_callback().set(FUNC(quizard_state::mcu_rx));
i8751_device &mcu(I8751(config, "mcu", 8000000));
- mcu.port_in_cb<1>().set(FUNC(cdi_state::quizard_mcu_p1_r));
-// mcu.set_vblank_int("screen", FUNC(cdi_state::irq0_line_pulse));
+ mcu.port_in_cb<1>().set(FUNC(quizard_state::mcu_p1_r));
}
/*************************
@@ -1068,30 +1016,30 @@ ROM_END
* Game driver(s) *
*************************/
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
// BIOS / System
-CONS( 1991, cdimono1, 0, 0, cdimono1, cdi, cdi_state, empty_init, "Philips", "CD-i (Mono-I) (PAL)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-CONS( 1991, cdimono2, 0, 0, cdimono2, cdimono2, cdi_state, empty_init, "Philips", "CD-i (Mono-II) (NTSC)", MACHINE_NOT_WORKING )
-CONS( 1991, cdi910, 0, 0, cdi910, cdimono2, cdi_state, empty_init, "Philips", "CD-i 910-17P Mini-MMC (PAL)", MACHINE_NOT_WORKING )
-CONS( 1991, cdi490a, 0, 0, cdimono1, cdi, cdi_state, empty_init, "Philips", "CD-i 490", MACHINE_NOT_WORKING )
+CONS( 1991, cdimono1, 0, 0, cdimono1, cdi, cdi_state, empty_init, "Philips", "CD-i (Mono-I) (PAL)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+CONS( 1991, cdimono2, 0, 0, cdimono2, cdimono2, cdi_state, empty_init, "Philips", "CD-i (Mono-II) (NTSC)", MACHINE_NOT_WORKING )
+CONS( 1991, cdi910, 0, 0, cdi910, cdimono2, cdi_state, empty_init, "Philips", "CD-i 910-17P Mini-MMC (PAL)", MACHINE_NOT_WORKING )
+CONS( 1991, cdi490a, 0, 0, cdimono1, cdi, cdi_state, empty_init, "Philips", "CD-i 490", MACHINE_NOT_WORKING )
// The Quizard games are RETAIL CD-i units, with additional JAMMA adapters & dongles for protection, hence being 'clones' of the system.
/* YEAR NAME PARENT MACHINE INPUT DEVICE INIT MONITOR COMPANY FULLNAME */
-GAME( 1995, cdibios, 0, cdimono1_base, quizard, cdi_state, empty_init, ROT0, "Philips", "CD-i (Mono-I) (PAL) BIOS", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IS_BIOS_ROOT )
+GAME( 1995, cdibios, 0, cdimono1_base, quizard, cdi_state, empty_init, ROT0, "Philips", "CD-i (Mono-I) (PAL) BIOS", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IS_BIOS_ROOT )
-GAME( 1995, quizard, cdibios, quizard1, quizard, cdi_state, empty_init, ROT0, "TAB Austria", "Quizard (v1.8)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
-GAME( 1995, quizard_17, quizard, quizard1, quizard, cdi_state, empty_init, ROT0, "TAB Austria", "Quizard (v1.7)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
-GAME( 1995, quizard_12, quizard, quizard1, quizard, cdi_state, empty_init, ROT0, "TAB Austria", "Quizard (v1.2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
-GAME( 1995, quizard_10, quizard, quizard1, quizard, cdi_state, empty_init, ROT0, "TAB Austria", "Quizard (v1.0)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
+GAME( 1995, quizard, cdibios, quizard, quizard, quizard1_state, empty_init, ROT0, "TAB Austria", "Quizard (v1.8)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
+GAME( 1995, quizard_17, quizard, quizard, quizard, quizard1_state, empty_init, ROT0, "TAB Austria", "Quizard (v1.7)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
+GAME( 1995, quizard_12, quizard, quizard, quizard, quizard1_state, empty_init, ROT0, "TAB Austria", "Quizard (v1.2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
+GAME( 1995, quizard_10, quizard, quizard, quizard, quizard1_state, empty_init, ROT0, "TAB Austria", "Quizard (v1.0)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
-GAME( 1995, quizard2, cdibios, quizard2, quizard, cdi_state, empty_init, ROT0, "TAB Austria", "Quizard 2 (v2.3)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
-GAME( 1995, quizard2_22, quizard2, quizard2, quizard, cdi_state, empty_init, ROT0, "TAB Austria", "Quizard 2 (v2.2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
+GAME( 1995, quizard2, cdibios, quizard, quizard, quizard2_state, empty_init, ROT0, "TAB Austria", "Quizard 2 (v2.3)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
+GAME( 1995, quizard2_22, quizard2, quizard, quizard, quizard2_state, empty_init, ROT0, "TAB Austria", "Quizard 2 (v2.2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
// Quizard 3 and 4 will hang after inserting a coin (incomplete protection sims?)
-GAME( 1995, quizard3, cdibios, quizard3, quizard, cdi_state, empty_init, ROT0, "TAB Austria", "Quizard 3 (v3.4)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
-GAME( 1996, quizard3_32, quizard3, quizard3, quizard, cdi_state, empty_init, ROT0, "TAB Austria", "Quizard 3 (v3.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
+GAME( 1995, quizard3, cdibios, quizard, quizard, quizard3_state, empty_init, ROT0, "TAB Austria", "Quizard 3 (v3.4)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
+GAME( 1996, quizard3_32, quizard3, quizard, quizard, quizard3_state, empty_init, ROT0, "TAB Austria", "Quizard 3 (v3.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
-GAME( 1998, quizard4, cdibios, quizard4, quizard, cdi_state, empty_init, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
-GAME( 1998, quizard4_41, quizard4, quizard4, quizard, cdi_state, empty_init, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
-GAME( 1997, quizard4_40, quizard4, quizard4, quizard, cdi_state, empty_init, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.0)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
+GAME( 1998, quizard4, cdibios, quizard, quizard, quizard4_state, empty_init, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
+GAME( 1998, quizard4_41, quizard4, quizard, quizard, quizard4_state, empty_init, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
+GAME( 1997, quizard4_40, quizard4, quizard, quizard, quizard4_state, empty_init, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.0)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION )
diff --git a/src/mame/includes/cdi.h b/src/mame/includes/cdi.h
index 9c53defb399..a6f0d03713e 100644
--- a/src/mame/includes/cdi.h
+++ b/src/mame/includes/cdi.h
@@ -22,8 +22,6 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_planea(*this, "mcd212:planea")
- , m_input1(*this, "INPUT1")
- , m_input2(*this, "INPUT2")
, m_slave_hle(*this, "slave_hle")
, m_servo(*this, "servo")
, m_slave(*this, "slave")
@@ -34,6 +32,21 @@ public:
, m_dmadac(*this, "dac%u", 1U)
{ }
+ void cdimono1_base(machine_config &config);
+ void cdimono1(machine_config &config);
+ void cdimono2(machine_config &config);
+ void cdi910(machine_config &config);
+
+protected:
+ virtual void machine_reset() override;
+
+ void cdimono1_mem(address_map &map);
+
+ required_device<scc68070_device> m_maincpu;
+
+private:
+ virtual void video_start() override;
+
enum servo_portc_bit_t
{
INV_JUC_OUT = (1 << 2),
@@ -41,10 +54,17 @@ public:
INV_CADDYSWITCH_IN = (1 << 7)
};
- required_device<scc68070_device> m_maincpu;
+ void draw_lcd(int y);
+ uint32_t screen_update_cdimono1_lcd(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ void cdi910_mem(address_map &map);
+ void cdimono2_mem(address_map &map);
+ void cdi070_cpuspace(address_map &map);
+
+ DECLARE_READ16_MEMBER(dvc_r);
+ DECLARE_WRITE16_MEMBER(dvc_w);
+
required_shared_ptr<uint16_t> m_planea;
- optional_ioport m_input1;
- optional_ioport m_input2;
optional_device<cdislave_device> m_slave_hle;
optional_device<m68hc05c8_device> m_servo;
optional_device<m68hc05c8_device> m_slave;
@@ -55,52 +75,39 @@ public:
required_device_array<dmadac_sound_device, 2> m_dmadac;
- INTERRUPT_GEN_MEMBER( mcu_frame );
-
- uint8_t m_timer_set;
- emu_timer *m_test_timer;
-
bitmap_rgb32 m_lcdbitmap;
+};
- DECLARE_INPUT_CHANGED_MEMBER(mcu_input);
+class quizard_state : public cdi_state
+{
+public:
+ quizard_state(const machine_config &mconfig, device_type type, const char *tag)
+ : cdi_state(mconfig, type, tag)
+ , m_input1(*this, "INPUT1")
+ , m_input2(*this, "INPUT2")
+ { }
- virtual void machine_start() override { }
- virtual void video_start() override;
+ void quizard(machine_config &config);
- DECLARE_MACHINE_RESET(cdimono1);
- DECLARE_MACHINE_RESET(cdimono2);
- DECLARE_MACHINE_RESET(quizard1);
- DECLARE_MACHINE_RESET(quizard2);
- DECLARE_MACHINE_RESET(quizard3);
- DECLARE_MACHINE_RESET(quizard4);
+ DECLARE_INPUT_CHANGED_MEMBER(mcu_input);
- DECLARE_READ8_MEMBER(quizard_mcu_p1_r);
+protected:
+ void set_mcu_value(uint16_t value);
+ void set_mcu_ack(uint8_t ack);
- void draw_lcd(int y);
- uint32_t screen_update_cdimono1_lcd(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
- void cdimono1(machine_config &config);
- void cdimono2(machine_config &config);
- void quizard4(machine_config &config);
- void cdimono1_base(machine_config &config);
- void cdi910(machine_config &config);
- void quizard2(machine_config &config);
- void quizard3(machine_config &config);
- void quizard1(machine_config &config);
- void quizard(machine_config &config);
+ DECLARE_READ8_MEMBER(mcu_p1_r);
- void cdi910_mem(address_map &map);
- void cdimono1_mem(address_map &map);
- void cdimono2_mem(address_map &map);
- void cdi070_cpuspace(address_map &map);
+ void mcu_tx(uint8_t data);
+ void mcu_calculate_state();
+ void mcu_set_seeds(uint8_t *rx);
+ void mcu_rx(uint8_t data);
- // Quizard Protection HLE
- void set_quizard_mcu_value(uint16_t value);
- void set_quizard_mcu_ack(uint8_t ack);
- void quizard_rx(uint8_t data);
- void quizard_calculate_state();
- void quizard_set_seeds(uint8_t *rx);
- void quizard_handle_byte_tx(uint8_t data);
+ required_ioport m_input1;
+ required_ioport m_input2;
uint16_t m_seeds[10];
uint8_t m_state[8];
@@ -109,4 +116,51 @@ public:
uint8_t m_mcu_ack;
};
+class quizard1_state : public quizard_state
+{
+public:
+ quizard1_state(const machine_config &mconfig, device_type type, const char *tag)
+ : quizard_state(mconfig, type, tag)
+ {
+ set_mcu_value(0x021f);
+ set_mcu_ack(0x5a);
+ }
+};
+
+class quizard2_state : public quizard_state
+{
+public:
+ quizard2_state(const machine_config &mconfig, device_type type, const char *tag)
+ : quizard_state(mconfig, type, tag)
+ {
+ // 0x2b1: Italian
+ // 0x001: French
+ // 0x188: German
+ set_mcu_value(0x0188);
+ set_mcu_ack(0x59);
+ }
+};
+
+class quizard3_state : public quizard_state
+{
+public:
+ quizard3_state(const machine_config &mconfig, device_type type, const char *tag)
+ : quizard_state(mconfig, type, tag)
+ {
+ set_mcu_value(0x00ae);
+ set_mcu_ack(0x58);
+ }
+};
+
+class quizard4_state : public quizard_state
+{
+public:
+ quizard4_state(const machine_config &mconfig, device_type type, const char *tag)
+ : quizard_state(mconfig, type, tag)
+ {
+ set_mcu_value(0x011f);
+ set_mcu_ack(0x57);
+ }
+};
+
#endif // MAME_INCLUDES_CDI_H