diff --git a/src/mame/drivers/midvunit.cpp b/src/mame/drivers/midvunit.cpp index 1af6df687b8..86c0ed45cca 100644 --- a/src/mame/drivers/midvunit.cpp +++ b/src/mame/drivers/midvunit.cpp @@ -34,6 +34,7 @@ Known to exist but not dumped: #include "machine/ataintf.h" #include "machine/nvram.h" #include "includes/midvunit.h" +#include "crusnusa.lh" #define CPU_CLOCK 50000000 @@ -54,6 +55,7 @@ void midvunit_state::machine_start() save_item(NAME(m_last_port0)); save_item(NAME(m_shifter_state)); save_item(NAME(m_timer_rate)); + save_item(NAME(lamps)); } @@ -1723,21 +1725,38 @@ READ32_MEMBER(midvunit_state::generic_speedup_r) return m_generic_speedup[offset]; } +READ32_MEMBER(midvunit_state::lamps_r) +{ + return lamps; +} -void midvunit_state::init_crusnusa_common(offs_t speedup) +WRITE32_MEMBER(midvunit_state::lamps_w) +{ + COMBINE_DATA(&lamps); + + int bit; + for (bit = 0; bit < 8; bit++) { + output().set_lamp_value(bit, (lamps >> bit) & 0x1); + } +} + + +void midvunit_state::init_crusnusa_common(offs_t speedup, offs_t lamp) { m_adc_shift = 24; + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(lamp, lamp, read32_delegate(FUNC(midvunit_state::lamps_r),this), write32_delegate(FUNC(midvunit_state::lamps_w),this)); + /* speedups */ m_maincpu->space(AS_PROGRAM).install_read_handler(speedup, speedup + 1, read32_delegate(FUNC(midvunit_state::generic_speedup_r),this)); m_generic_speedup = m_ram_base + speedup; } -DRIVER_INIT_MEMBER(midvunit_state,crusnusa) { init_crusnusa_common(0xc93e); } -DRIVER_INIT_MEMBER(midvunit_state,crusnu40) { init_crusnusa_common(0xc957); } -DRIVER_INIT_MEMBER(midvunit_state,crusnu21) { init_crusnusa_common(0xc051); } +DRIVER_INIT_MEMBER(midvunit_state,crusnusa) { init_crusnusa_common(0xc93e, 0xc8cd); } +DRIVER_INIT_MEMBER(midvunit_state,crusnu40) { init_crusnusa_common(0xc957, 0xc8e5); } +DRIVER_INIT_MEMBER(midvunit_state,crusnu21) { init_crusnusa_common(0xc051, 0xbf2c); } -void midvunit_state::init_crusnwld_common(offs_t speedup) +void midvunit_state::init_crusnwld_common(offs_t speedup, offs_t lamp) { m_adc_shift = 16; @@ -1752,19 +1771,26 @@ void midvunit_state::init_crusnwld_common(offs_t speedup) m_maincpu->space(AS_PROGRAM).install_read_handler(0x9d0000, 0x9d1fff, read32_delegate(FUNC(midvunit_state::bit_data_r),this)); m_maincpu->space(AS_PROGRAM).install_write_handler(0x9d0000, 0x9d0000, write32_delegate(FUNC(midvunit_state::bit_reset_w),this)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(lamp, lamp, read32_delegate(FUNC(midvunit_state::lamps_r),this), write32_delegate(FUNC(midvunit_state::lamps_w),this)); + /* speedups */ if (speedup) { m_maincpu->space(AS_PROGRAM).install_read_handler(speedup, speedup + 1, read32_delegate(FUNC(midvunit_state::generic_speedup_r),this)); m_generic_speedup = m_ram_base + speedup; } } -DRIVER_INIT_MEMBER(midvunit_state,crusnwld) { init_crusnwld_common(0xd4c0); } +DRIVER_INIT_MEMBER(midvunit_state,crusnwld) { init_crusnwld_common(0xd4c0, 0xcc43); } +DRIVER_INIT_MEMBER(midvunit_state,crusnw23) { init_crusnwld_common(0xd4c0, 0xcc47); } +DRIVER_INIT_MEMBER(midvunit_state,crusnw20) { init_crusnwld_common(0xd4c0, 0xcc23); } +DRIVER_INIT_MEMBER(midvunit_state,crusnw19) { init_crusnwld_common(0xd4c0, 0xcc20); } +DRIVER_INIT_MEMBER(midvunit_state,crusnw17) { init_crusnwld_common(0xd4c0, 0xcc04); } +DRIVER_INIT_MEMBER(midvunit_state,crusnw13) { init_crusnwld_common(0xd4c0, 0xccc1); } #if 0 DRIVER_INIT_MEMBER(midvunit_state,crusnw20) { init_crusnwld_common(0xd49c); } DRIVER_INIT_MEMBER(midvunit_state,crusnw13) { init_crusnwld_common(0); } #endif -DRIVER_INIT_MEMBER(midvunit_state,offroadc) +void midvunit_state::init_offroadc_common(offs_t speedup, offs_t lamp) { m_adc_shift = 16; @@ -1774,10 +1800,14 @@ DRIVER_INIT_MEMBER(midvunit_state,offroadc) m_maincpu->space(AS_PROGRAM).install_read_handler(0x991030, 0x991030, read32_delegate(FUNC(midvunit_state::offroadc_serial_status_r),this)); m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x996000, 0x996000, read32_delegate(FUNC(midvunit_state::offroadc_serial_data_r),this), write32_delegate(FUNC(midvunit_state::offroadc_serial_data_w),this)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(lamp, lamp, read32_delegate(FUNC(midvunit_state::lamps_r),this), write32_delegate(FUNC(midvunit_state::lamps_w),this)); + /* speedups */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x195aa, 0x195aa, read32_delegate(FUNC(midvunit_state::generic_speedup_r),this)); - m_generic_speedup = m_ram_base + 0x195aa; + m_maincpu->space(AS_PROGRAM).install_read_handler(speedup, speedup, read32_delegate(FUNC(midvunit_state::generic_speedup_r),this)); + m_generic_speedup = m_ram_base + speedup; } +DRIVER_INIT_MEMBER(midvunit_state,offroadc) { init_offroadc_common(0x195aa, 0x19e16); } +DRIVER_INIT_MEMBER(midvunit_state,offroadc1) { init_offroadc_common(0x195aa, 0x19e17); } DRIVER_INIT_MEMBER(midvunit_state,wargods) @@ -1811,23 +1841,23 @@ DRIVER_INIT_MEMBER(midvunit_state,wargods) * *************************************/ -GAME( 1994, crusnusa, 0, midvunit, crusnusa, midvunit_state, crusnusa, ROT0, "Midway", "Cruis'n USA (rev L4.1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, crusnusa40, crusnusa, midvunit, crusnusa, midvunit_state, crusnu40, ROT0, "Midway", "Cruis'n USA (rev L4.0)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, crusnusa21, crusnusa, midvunit, crusnusa, midvunit_state, crusnu21, ROT0, "Midway", "Cruis'n USA (rev L2.1)", MACHINE_SUPPORTS_SAVE ) +GAMEL( 1994, crusnusa, 0, midvunit, crusnusa, midvunit_state, crusnusa, ROT0, "Midway", "Cruis'n USA (rev L4.1)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) +GAMEL( 1994, crusnusa40, crusnusa, midvunit, crusnusa, midvunit_state, crusnu40, ROT0, "Midway", "Cruis'n USA (rev L4.0)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) +GAMEL( 1994, crusnusa21, crusnusa, midvunit, crusnusa, midvunit_state, crusnu21, ROT0, "Midway", "Cruis'n USA (rev L2.1)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) -GAME( 1996, crusnwld, 0, crusnwld, crusnwld, midvunit_state, crusnwld, ROT0, "Midway", "Cruis'n World (rev L2.5)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, crusnwld24, crusnwld, crusnwld, crusnwld, midvunit_state, crusnwld, ROT0, "Midway", "Cruis'n World (rev L2.4)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, crusnwld23, crusnwld, crusnwld, crusnwld, midvunit_state, crusnwld, ROT0, "Midway", "Cruis'n World (rev L2.3)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, crusnwld20, crusnwld, crusnwld, crusnwld, midvunit_state, crusnwld, ROT0, "Midway", "Cruis'n World (rev L2.0)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, crusnwld19, crusnwld, crusnwld, crusnwld, midvunit_state, crusnwld, ROT0, "Midway", "Cruis'n World (rev L1.9)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, crusnwld17, crusnwld, crusnwld, crusnwld, midvunit_state, crusnwld, ROT0, "Midway", "Cruis'n World (rev L1.7)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, crusnwld13, crusnwld, crusnwld, crusnwld, midvunit_state, crusnwld, ROT0, "Midway", "Cruis'n World (rev L1.3)", MACHINE_SUPPORTS_SAVE ) +GAMEL( 1996, crusnwld, 0, crusnwld, crusnwld, midvunit_state, crusnwld, ROT0, "Midway", "Cruis'n World (rev L2.5)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) +GAMEL( 1996, crusnwld24, crusnwld, crusnwld, crusnwld, midvunit_state, crusnwld, ROT0, "Midway", "Cruis'n World (rev L2.4)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) +GAMEL( 1996, crusnwld23, crusnwld, crusnwld, crusnwld, midvunit_state, crusnw23, ROT0, "Midway", "Cruis'n World (rev L2.3)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) +GAMEL( 1996, crusnwld20, crusnwld, crusnwld, crusnwld, midvunit_state, crusnw20, ROT0, "Midway", "Cruis'n World (rev L2.0)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) +GAMEL( 1996, crusnwld19, crusnwld, crusnwld, crusnwld, midvunit_state, crusnw19, ROT0, "Midway", "Cruis'n World (rev L1.9)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) +GAMEL( 1996, crusnwld17, crusnwld, crusnwld, crusnwld, midvunit_state, crusnw17, ROT0, "Midway", "Cruis'n World (rev L1.7)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) +GAMEL( 1996, crusnwld13, crusnwld, crusnwld, crusnwld, midvunit_state, crusnw13, ROT0, "Midway", "Cruis'n World (rev L1.3)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) -GAME( 1997, offroadc, 0, offroadc, offroadc, midvunit_state, offroadc, ROT0, "Midway", "Off Road Challenge (v1.63)", MACHINE_SUPPORTS_SAVE ) -GAME( 1997, offroadc5, offroadc, offroadc, offroadc, midvunit_state, offroadc, ROT0, "Midway", "Off Road Challenge (v1.50)", MACHINE_SUPPORTS_SAVE ) -GAME( 1997, offroadc4, offroadc, offroadc, offroadc, midvunit_state, offroadc, ROT0, "Midway", "Off Road Challenge (v1.40)", MACHINE_SUPPORTS_SAVE ) -GAME( 1997, offroadc3, offroadc, offroadc, offroadc, midvunit_state, offroadc, ROT0, "Midway", "Off Road Challenge (v1.30)", MACHINE_SUPPORTS_SAVE ) -GAME( 1997, offroadc1, offroadc, offroadc, offroadc, midvunit_state, offroadc, ROT0, "Midway", "Off Road Challenge (v1.10)", MACHINE_SUPPORTS_SAVE ) +GAMEL( 1997, offroadc, 0, offroadc, offroadc, midvunit_state, offroadc, ROT0, "Midway", "Off Road Challenge (v1.63)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) +GAMEL( 1997, offroadc5, offroadc, offroadc, offroadc, midvunit_state, offroadc, ROT0, "Midway", "Off Road Challenge (v1.50)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) +GAMEL( 1997, offroadc4, offroadc, offroadc, offroadc, midvunit_state, offroadc, ROT0, "Midway", "Off Road Challenge (v1.40)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) +GAMEL( 1997, offroadc3, offroadc, offroadc, offroadc, midvunit_state, offroadc, ROT0, "Midway", "Off Road Challenge (v1.30)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) +GAMEL( 1997, offroadc1, offroadc, offroadc, offroadc, midvunit_state, offroadc1, ROT0, "Midway", "Off Road Challenge (v1.10)", MACHINE_SUPPORTS_SAVE, layout_crusnusa ) GAME( 1995, wargods, 0, midvplus, wargods, midvunit_state, wargods, ROT0, "Midway", "War Gods (HD 10/09/1996 - Dual Resolution)", MACHINE_SUPPORTS_SAVE ) GAME( 1995, wargodsa, wargods, midvplus, wargodsa, midvunit_state, wargods, ROT0, "Midway", "War Gods (HD 08/15/1996)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/includes/midvunit.h b/src/mame/includes/midvunit.h index 607f229b9ba..9d78fa321ce 100644 --- a/src/mame/includes/midvunit.h +++ b/src/mame/includes/midvunit.h @@ -96,6 +96,7 @@ public: UINT8 m_video_changed; emu_timer *m_scanline_timer; std::unique_ptr m_poly; + UINT32 lamps; DECLARE_WRITE32_MEMBER(midvunit_dma_queue_w); DECLARE_READ32_MEMBER(midvunit_dma_queue_entries_r); DECLARE_READ32_MEMBER(midvunit_dma_trigger_r); @@ -131,14 +132,23 @@ public: DECLARE_WRITE32_MEMBER(midvplus_misc_w); DECLARE_WRITE8_MEMBER(midvplus_xf1_w); DECLARE_READ32_MEMBER(generic_speedup_r); + DECLARE_READ32_MEMBER(lamps_r); + DECLARE_WRITE32_MEMBER(lamps_w); DECLARE_DRIVER_INIT(crusnu40); DECLARE_DRIVER_INIT(crusnu21); DECLARE_DRIVER_INIT(crusnwld); + DECLARE_DRIVER_INIT(crusnw23); + DECLARE_DRIVER_INIT(crusnw20); + DECLARE_DRIVER_INIT(crusnw19); + DECLARE_DRIVER_INIT(crusnw17); + DECLARE_DRIVER_INIT(crusnw13); DECLARE_DRIVER_INIT(wargods); DECLARE_DRIVER_INIT(offroadc); + DECLARE_DRIVER_INIT(offroadc1); DECLARE_DRIVER_INIT(crusnusa); - void init_crusnwld_common(offs_t speedup); - void init_crusnusa_common(offs_t speedup); + void init_crusnwld_common(offs_t speedup, offs_t lamp); + void init_crusnusa_common(offs_t speedup, offs_t lamp); + void init_offroadc_common(offs_t speedup, offs_t lamp); virtual void machine_start() override; virtual void machine_reset() override; virtual void video_start() override; diff --git a/src/mame/layout/crusnusa.lay b/src/mame/layout/crusnusa.lay new file mode 100644 index 00000000000..ae51a8a2c36 --- /dev/null +++ b/src/mame/layout/crusnusa.lay @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +