From e0b1e2356e9c0c8ca96be6dea5be59c561ed4903 Mon Sep 17 00:00:00 2001 From: blueonesarefaster <139867945+blueonesarefaster@users.noreply.github.com> Date: Mon, 13 Jan 2025 16:35:20 +0000 Subject: [PATCH 01/80] barcrest\mpu3.cpp: Correct 100hz signal to pia6821 ic3 (#13215) * Correct 100hz signal to pia6821 ic3 * Correct 50hz comment * Correct toggling of 100hz and comment games which fail on boot --- src/mame/barcrest/mpu3.cpp | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/mame/barcrest/mpu3.cpp b/src/mame/barcrest/mpu3.cpp index 1e0b4b03b87db..ba122cdedb905 100644 --- a/src/mame/barcrest/mpu3.cpp +++ b/src/mame/barcrest/mpu3.cpp @@ -4,8 +4,7 @@ /* Notes 17/07/11 DH added most other MPU3 sets - most fail to boot, giving the CPU a 'WAIT' instruction then sitting there - some complain about Characterizer (protection) and then do the same + some complain about Characterizer (protection) a few boot to show light displays with no LED text some display misaligned LED text many run VERY slowly, even when the CPU is inactive (inefficient MAME timer system overhead?) @@ -227,7 +226,7 @@ class mpu3_state : public driver_device void pia_ic6_porta_w(uint8_t data); void pia_ic6_portb_w(uint8_t data); TIMER_CALLBACK_MEMBER(ic21_timeout); - TIMER_DEVICE_CALLBACK_MEMBER(gen_50hz); + TIMER_DEVICE_CALLBACK_MEMBER(gen_100hz); TIMER_DEVICE_CALLBACK_MEMBER(ic10_callback); void update_triacs(); void ic11_update(); @@ -258,7 +257,7 @@ class mpu3_state : public driver_device int m_input_strobe = 0; /* IC11 74LS138 A = CA2 IC3, B = CA2 IC4, C = CA2 IC5 */ uint8_t m_lamp_strobe = 0; uint8_t m_led_strobe = 0; - int m_signal_50hz = 0; + int m_signal_100hz = 0; int m_optic_pattern = 0; @@ -451,7 +450,7 @@ uint8_t mpu3_state::pia_ic3_porta_r() break; } } - if (m_signal_50hz) + if (m_signal_100hz) { data |= 0x02; } @@ -746,15 +745,15 @@ void mpu3_state::machine_start() m_lamp.resolve(); } -/* generate a 50 Hz signal (some components rely on this for external sync) */ -TIMER_DEVICE_CALLBACK_MEMBER(mpu3_state::gen_50hz) +/* generate a 100 Hz signal (some components rely on this for external sync) */ +TIMER_DEVICE_CALLBACK_MEMBER(mpu3_state::gen_100hz) { /* Although reported as a '50Hz' signal, the fact that both rising and falling edges of the pulse are used means the timer actually gives a 100Hz oscillating signal.*/ - m_signal_50hz = m_signal_50hz?0:1; - m_ptm2->set_c1(m_signal_50hz); - m_pia3->cb1_w(~m_signal_50hz); + m_signal_100hz ^= 1; + m_ptm2->set_c1(m_signal_100hz); + m_pia3->cb1_w(m_signal_100hz); update_triacs(); } @@ -810,7 +809,7 @@ void mpu3_state::mpu3base(machine_config &config) MSC1937(config, m_vfd); - TIMER(config, "50hz").configure_periodic(FUNC(mpu3_state::gen_50hz), attotime::from_hz(100)); + TIMER(config, "100hz").configure_periodic(FUNC(mpu3_state::gen_100hz), attotime::from_hz(200)); TIMER(config, "555_ic10").configure_periodic(FUNC(mpu3_state::ic10_callback), PERIOD_OF_555_ASTABLE(10000,1000,0.0000001)); /* 6840 PTM */ @@ -1689,10 +1688,9 @@ GAME( 198?, m3topsht, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_m // doesn't boot, does nothing? GAMEL( 198?, m3supnud, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Super Nudges Unlimited (Barcrest) (MPU3)", GAME_FLAGS, layout_m3supnud ) -// doesn't boot, does nothing? GAME( 198?, m3supser, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Super Series (Barcrest) (MPU3)",GAME_FLAGS ) -// doesn't boot, does nothing? +// boots without initialising reels GAMEL( 198?, m3circle, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 1)", GAME_FLAGS, layout_m3circle ) GAMEL( 198?, m3circlea, m3circle, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 2, bad)", GAME_FLAGS, layout_m3circle ) GAMEL( 198?, m3circleb, m3circle, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 3)", GAME_FLAGS, layout_m3circle ) @@ -1712,6 +1710,7 @@ GAMEL( 198?, m3ratrce, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0 GAME( 198?, m3supasw, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Supaswop (BWB) (MPU3)",GAME_FLAGS ) +// boots and then errors with REEL 'A' FAILURE GAMEL( 198?, m3supwin, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Super Win (BWB) (MPU3, set 1) (W.AG2) ", GAME_FLAGS, layout_m3supwin ) // offset VFD GAMEL( 198?, m3supwina, m3supwin, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Super Win (BWB) (MPU3, set 2) (S.W.2 1.0)", GAME_FLAGS, layout_m3supwin ) @@ -1731,14 +1730,13 @@ GAMEL( 198?, m3spoofa, m3spoof, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0 GAMEL( 198?, m3supspo, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Super Spoof (Pcp) (MPU3, set 1)", GAME_FLAGS, layout_m3supspo ) GAMEL( 198?, m3supspoa, m3supspo, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Super Spoof (Pcp) (MPU3, set 2)", GAME_FLAGS, layout_m3supspo ) -// boots, reel error a GAMEL( 198?, m3loony, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Loonybin (Pcp) (MPU3)", GAME_FLAGS, layout_m3loony ) -// does nothing +// boots, no vfd, then locks GAMEL( 198?, m3online, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","On Line (Pcp) (MPU3)", GAME_FLAGS, layout_m3online ) GAMEL( 198?, m3toplin, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Top Line (Pcp) (MPU3)", GAME_FLAGS, layout_m3toplin ) -// offset VFD, don't boot (act like m3supwin above) +// REEL 'A' FAILURE GAMEL( 198?, m3rockpl, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Rock Pile (Pcp) (MPU3)", GAME_FLAGS, layout_m3rockpl ) GAMEL( 198?, m3rollem, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Roll 'Em (Pcp) (MPU3)", GAME_FLAGS, layout_m3rollem ) GAME( 198?, m3wigwam, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Wig Wam (Pcp) (MPU3)",GAME_FLAGS ) @@ -1749,7 +1747,7 @@ GAME( 198?, m3wigwam, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0 // no protection, boots without testing reels? GAMEL( 198?, m3gcrown, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Mdm","Golden Crowns (Mdm) (MPU3)", GAME_FLAGS, layout_m3gcrown ) -// reel A alarm +// no VFD GAMEL( 198?, m3tfair, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Mdm","Tuppenny Fair (Mdm) (MPU3)", GAME_FLAGS, layout_m3tfair ) GAME( 198?, m3wacky, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Mdm","Wacky Racer (Mdm) (MPU3)",GAME_FLAGS ) From f39baa51dc03397212dcfebd751bce2d438391ac Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Tue, 14 Jan 2025 03:59:02 +1100 Subject: [PATCH 02/80] -util/mfpresolve.cpp: Moved member function resolution code to a common location. * util/delegate.cpp, cpu/drcbex64.cpp, cpu/drcbearm64.cpp: Use common member function resolution code. -cpu/drcbearm64.cpp, cpu/drcbex64.cpp, cpu/drcbex86.cpp: Moved some stuff to anonymous namespaces. -cpu/drcbex64.cpp, cpu/drcbex86.cpp: Defer allocating labels if they aren't always needed. --- scripts/src/lib.lua | 2 + src/devices/cpu/drcbearm64.cpp | 118 ++++----------- src/devices/cpu/drcbex64.cpp | 175 +++++++++------------- src/devices/cpu/drcbex86.cpp | 108 ++++++++------ src/lib/util/delegate.cpp | 208 +------------------------- src/lib/util/mfpresolve.cpp | 258 +++++++++++++++++++++++++++++++++ src/lib/util/mfpresolve.h | 86 +++++++++++ 7 files changed, 524 insertions(+), 431 deletions(-) create mode 100644 src/lib/util/mfpresolve.cpp create mode 100644 src/lib/util/mfpresolve.h diff --git a/scripts/src/lib.lua b/scripts/src/lib.lua index 5196e579d12e6..cc5567207ed1b 100644 --- a/scripts/src/lib.lua +++ b/scripts/src/lib.lua @@ -95,6 +95,8 @@ end MAME_DIR .. "src/lib/util/lrucache.h", MAME_DIR .. "src/lib/util/md5.cpp", MAME_DIR .. "src/lib/util/md5.h", + MAME_DIR .. "src/lib/util/mfpresolve.cpp", + MAME_DIR .. "src/lib/util/mfpresolve.h", MAME_DIR .. "src/lib/util/msdib.cpp", MAME_DIR .. "src/lib/util/msdib.h", MAME_DIR .. "src/lib/util/multibyte.h", diff --git a/src/devices/cpu/drcbearm64.cpp b/src/devices/cpu/drcbearm64.cpp index bae953e01f72b..52fdd67e82dce 100644 --- a/src/devices/cpu/drcbearm64.cpp +++ b/src/devices/cpu/drcbearm64.cpp @@ -17,6 +17,8 @@ using namespace uml; using namespace asmjit; +namespace { + const uint32_t PTYPE_M = 1 << parameter::PTYPE_MEMORY; const uint32_t PTYPE_I = 1 << parameter::PTYPE_IMMEDIATE; const uint32_t PTYPE_R = 1 << parameter::PTYPE_INT_REGISTER; @@ -56,19 +58,7 @@ const a64::Gp BASE_REG = a64::x27; // Software emulated flags (bit 0 = FLAG_C, bit 4 = FLAG_U) const a64::Gp FLAGS_REG = a64::x28; - -#define ARM_CONDITION(a, condition) (condition_map[condition - COND_Z]) -#define ARM_NOT_CONDITION(a, condition) (negateCond(condition_map[condition - COND_Z])) - -#define assert_no_condition(inst) assert((inst).condition() == uml::COND_ALWAYS) -#define assert_any_condition(inst) assert((inst).condition() == uml::COND_ALWAYS || ((inst).condition() >= uml::COND_Z && (inst).condition() < uml::COND_MAX)) -#define assert_no_flags(inst) assert((inst).flags() == 0) -#define assert_flags(inst, valid) assert(((inst).flags() & ~(valid)) == 0) - - -drcbe_arm64::opcode_generate_func drcbe_arm64::s_opcode_table[OP_MAX]; - -static const a64::Gp::Id int_register_map[REG_I_COUNT] = +const a64::Gp::Id int_register_map[REG_I_COUNT] = { a64::Gp::Id(a64::x19.id()), a64::Gp::Id(a64::x20.id()), @@ -80,7 +70,7 @@ static const a64::Gp::Id int_register_map[REG_I_COUNT] = a64::Gp::Id(a64::x26.id()), }; -static const a64::Gp::Id float_register_map[REG_F_COUNT] = +const a64::Gp::Id float_register_map[REG_F_COUNT] = { a64::Gp::Id(a64::d8.id()), a64::Gp::Id(a64::d9.id()), @@ -93,7 +83,7 @@ static const a64::Gp::Id float_register_map[REG_F_COUNT] = }; // condition mapping table -static const a64::CondCode condition_map[uml::COND_MAX - uml::COND_Z] = +const a64::CondCode condition_map[uml::COND_MAX - uml::COND_Z] = { a64::CondCode::kEQ, // COND_Z = 0x80, requires Z COND_E a64::CondCode::kNE, // COND_NZ, requires Z COND_NE @@ -113,6 +103,30 @@ static const a64::CondCode condition_map[uml::COND_MAX - uml::COND_Z] = a64::CondCode::kGE, // COND_GE, requires SV }; + +#define ARM_CONDITION(a, condition) (condition_map[condition - COND_Z]) +#define ARM_NOT_CONDITION(a, condition) (negateCond(condition_map[condition - COND_Z])) + +#define assert_no_condition(inst) assert((inst).condition() == uml::COND_ALWAYS) +#define assert_any_condition(inst) assert((inst).condition() == uml::COND_ALWAYS || ((inst).condition() >= uml::COND_Z && (inst).condition() < uml::COND_MAX)) +#define assert_no_flags(inst) assert((inst).flags() == 0) +#define assert_flags(inst, valid) assert(((inst).flags() & ~(valid)) == 0) + + +class ThrowableErrorHandler : public ErrorHandler +{ +public: + void handleError(Error err, const char *message, BaseEmitter *origin) override + { + throw emu_fatalerror("asmjit error %d: %s", err, message); + } +}; + +} // anonymous namespace + + +drcbe_arm64::opcode_generate_func drcbe_arm64::s_opcode_table[OP_MAX]; + const drcbe_arm64::opcode_table_entry drcbe_arm64::s_opcode_table_source[] = { // Compile-time opcodes @@ -208,15 +222,6 @@ const drcbe_arm64::opcode_table_entry drcbe_arm64::s_opcode_table_source[] = { uml::OP_ICOPYF, &drcbe_arm64::op_icopyf } // ICOPYF dst,src }; -class ThrowableErrorHandler : public ErrorHandler -{ -public: - void handleError(Error err, const char *message, BaseEmitter *origin) override - { - throw emu_fatalerror("asmjit error %d: %s", err, message); - } -}; - drcbe_arm64::be_parameter::be_parameter(drcbe_arm64 &drcbe, const parameter ¶m, uint32_t allowed) { int regnum; @@ -888,68 +893,9 @@ drcbe_arm64::drcbe_arm64(drcuml_state &drcuml, device_t &device, drc_cache &cach auto const resolve_accessor = [] (resolved_handler &handler, address_space &space, auto accessor) { - if (MAME_DELEGATE_USE_TYPE == MAME_DELEGATE_TYPE_ITANIUM) - { - struct { uintptr_t ptr; ptrdiff_t adj; } equiv; - assert(sizeof(accessor) == sizeof(equiv)); - *reinterpret_cast(&equiv) = accessor; - handler.obj = uintptr_t(reinterpret_cast(&space) + (equiv.adj >> 1)); - if (BIT(equiv.adj, 0)) - { - auto const vptr = *reinterpret_cast(handler.obj) + equiv.ptr; - handler.func = *reinterpret_cast(vptr); - } - else - { - handler.func = reinterpret_cast(equiv.ptr); - } - } - else if (MAME_DELEGATE_USE_TYPE == MAME_DELEGATE_TYPE_MSVC) - { - // interpret the pointer to member function ignoring the virtual inheritance variant - struct single { uintptr_t ptr; }; - struct multi { uintptr_t ptr; int adj; }; - struct { uintptr_t ptr; int adj; int vadj; int vindex; } unknown; - assert(sizeof(accessor) <= sizeof(unknown)); - *reinterpret_cast(&unknown) = accessor; - uint32_t const *func = reinterpret_cast(unknown.ptr); - handler.obj = uintptr_t(&space); - if ((sizeof(unknown) == sizeof(accessor)) && unknown.vindex) - { - handler.obj += unknown.vadj; - auto const vptr = *reinterpret_cast(handler.obj); - handler.obj += *reinterpret_cast(vptr + unknown.vindex); - } - if (sizeof(single) < sizeof(accessor)) - handler.obj += unknown.adj; - - // walk past thunks - while (true) - { - if ((0x90000010 == (func[0] & 0x9f00001f)) && (0x91000210 == (func[1] & 0xffc003ff)) && (0xd61f0200 == func[2])) - { - // page-relative jump with +/-4GB reach - adrp xip0,... ; add xip0,xip0,#... ; br xip0 - int64_t const page = - (uint64_t(func[0] & 0x60000000) >> 17) | - (uint64_t(func[0] & 0x00ffffe0) << 9) | - ((func[0] & 0x00800000) ? (~std::uint64_t(0) << 33) : 0); - uint32_t const offset = (func[1] & 0x003ffc00) >> 10; - func = reinterpret_cast(((uintptr_t(func) + page) & (~uintptr_t(0) << 12)) + offset); - } - else if ((0xf9400010 == func[0]) && (0xf9400210 == (func[1] & 0xffc003ff)) && (0xd61f0200 == func[2])) - { - // virtual function call thunk - ldr xip0,[x0] ; ldr xip0,[x0,#...] ; br xip0 - uint32_t const *const *const vptr = *reinterpret_cast(handler.obj); - func = vptr[(func[1] & 0x003ffc00) >> 10]; - } - else - { - // not something we can easily bypass - break; - } - } - handler.func = reinterpret_cast(uintptr_t(func)); - } + auto const [entrypoint, adjusted] = util::resolve_member_function(accessor, &space); + handler.func = reinterpret_cast(entrypoint); + handler.obj = adjusted; }; m_resolved_accessors.resize(m_space.size()); diff --git a/src/devices/cpu/drcbex64.cpp b/src/devices/cpu/drcbex64.cpp index c7ddf18b53575..5e08d498443ad 100644 --- a/src/devices/cpu/drcbex64.cpp +++ b/src/devices/cpu/drcbex64.cpp @@ -172,6 +172,8 @@ #include "debug/debugcpu.h" #include "emuopts.h" +#include "mfpresolve.h" + #include @@ -185,6 +187,7 @@ using namespace asmjit; using namespace asmjit::x86; +namespace { //************************************************************************** // DEBUGGING @@ -229,33 +232,8 @@ const Gp::Id REG_PARAM4 = Gp::kIdCx; #endif - - -//************************************************************************** -// MACROS -//************************************************************************** - -#define X86_CONDITION(condition) (condition_map[condition - uml::COND_Z]) -#define X86_NOT_CONDITION(condition) negateCond(condition_map[condition - uml::COND_Z]) - -#define assert_no_condition(inst) assert((inst).condition() == uml::COND_ALWAYS) -#define assert_any_condition(inst) assert((inst).condition() == uml::COND_ALWAYS || ((inst).condition() >= uml::COND_Z && (inst).condition() < uml::COND_MAX)) -#define assert_no_flags(inst) assert((inst).flags() == 0) -#define assert_flags(inst, valid) assert(((inst).flags() & ~(valid)) == 0) - - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -drcbe_x64::opcode_generate_func drcbe_x64::s_opcode_table[OP_MAX]; - -// size-to-mask table -//static const uint64_t size_to_mask[] = { 0, 0xff, 0xffff, 0, 0xffffffff, 0, 0, 0, 0xffffffffffffffffU }; - // register mapping tables -static const Gp::Id int_register_map[REG_I_COUNT] = +const Gp::Id int_register_map[REG_I_COUNT] = { #ifdef X64_WINDOWS_ABI Gp::kIdBx, Gp::kIdSi, Gp::kIdDi, Gp::kIdR12, Gp::kIdR13, Gp::kIdR14, Gp::kIdR15, @@ -264,7 +242,7 @@ static const Gp::Id int_register_map[REG_I_COUNT] = #endif }; -static uint32_t float_register_map[REG_F_COUNT] = +uint32_t float_register_map[REG_F_COUNT] = { #ifdef X64_WINDOWS_ABI 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 @@ -276,7 +254,7 @@ static uint32_t float_register_map[REG_F_COUNT] = }; // condition mapping table -static const CondCode condition_map[uml::COND_MAX - uml::COND_Z] = +const CondCode condition_map[uml::COND_MAX - uml::COND_Z] = { CondCode::kZ, // COND_Z = 0x80, requires Z CondCode::kNZ, // COND_NZ, requires Z @@ -298,7 +276,7 @@ static const CondCode condition_map[uml::COND_MAX - uml::COND_Z] = #if 0 // rounding mode mapping table -static const uint8_t fprnd_map[4] = +const uint8_t fprnd_map[4] = { FPRND_CHOP, // ROUND_TRUNC, truncate FPRND_NEAR, // ROUND_ROUND, round @@ -307,6 +285,44 @@ static const uint8_t fprnd_map[4] = }; #endif +// size-to-mask table +//const uint64_t size_to_mask[] = { 0, 0xff, 0xffff, 0, 0xffffffff, 0, 0, 0, 0xffffffffffffffffU }; + + + +//************************************************************************** +// MACROS +//************************************************************************** + +#define X86_CONDITION(condition) (condition_map[condition - uml::COND_Z]) +#define X86_NOT_CONDITION(condition) negateCond(condition_map[condition - uml::COND_Z]) + +#define assert_no_condition(inst) assert((inst).condition() == uml::COND_ALWAYS) +#define assert_any_condition(inst) assert((inst).condition() == uml::COND_ALWAYS || ((inst).condition() >= uml::COND_Z && (inst).condition() < uml::COND_MAX)) +#define assert_no_flags(inst) assert((inst).flags() == 0) +#define assert_flags(inst, valid) assert(((inst).flags() & ~(valid)) == 0) + + + +class ThrowableErrorHandler : public ErrorHandler +{ +public: + void handleError(Error err, const char *message, BaseEmitter *origin) override + { + throw emu_fatalerror("asmjit error %d: %s", err, message); + } +}; + +} // anonymous namespace + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +drcbe_x64::opcode_generate_func drcbe_x64::s_opcode_table[OP_MAX]; + //************************************************************************** @@ -408,15 +424,6 @@ const drcbe_x64::opcode_table_entry drcbe_x64::s_opcode_table_source[] = { uml::OP_ICOPYF, &drcbe_x64::op_icopyf } // ICOPYF dst,src }; -class ThrowableErrorHandler : public ErrorHandler -{ -public: - void handleError(Error err, const char *message, BaseEmitter *origin) override - { - throw emu_fatalerror("asmjit error %d: %s", err, message); - } -}; - //************************************************************************** // INLINE FUNCTIONS @@ -689,65 +696,9 @@ drcbe_x64::drcbe_x64(drcuml_state &drcuml, device_t &device, drc_cache &cache, u auto const resolve_accessor = [] (resolved_handler &handler, address_space &space, auto accessor) { - if (MAME_DELEGATE_USE_TYPE == MAME_DELEGATE_TYPE_ITANIUM) - { - struct { uintptr_t ptr; ptrdiff_t adj; } equiv; - assert(sizeof(accessor) == sizeof(equiv)); - *reinterpret_cast(&equiv) = accessor; - handler.obj = uintptr_t(reinterpret_cast(&space) + equiv.adj); - if (BIT(equiv.ptr, 0)) - { - auto const vptr = *reinterpret_cast(handler.obj) + equiv.ptr - 1; - handler.func = *reinterpret_cast(vptr); - } - else - { - handler.func = reinterpret_cast(equiv.ptr); - } - } - else if (MAME_DELEGATE_USE_TYPE == MAME_DELEGATE_TYPE_MSVC) - { - // interpret the pointer to member function ignoring the virtual inheritance variant - struct single { uintptr_t ptr; }; - struct multi { uintptr_t ptr; int adj; }; - struct { uintptr_t ptr; int adj; int vadj; int vindex; } unknown; - assert(sizeof(accessor) <= sizeof(unknown)); - *reinterpret_cast(&unknown) = accessor; - handler.func = reinterpret_cast(unknown.ptr); - handler.obj = uintptr_t(&space); - if ((sizeof(unknown) == sizeof(accessor)) && unknown.vindex) - { - handler.obj += unknown.vadj; - auto const vptr = *reinterpret_cast(handler.obj); - handler.obj += *reinterpret_cast(vptr + unknown.vindex); - } - if (sizeof(single) < sizeof(accessor)) - handler.obj += unknown.adj; - - // walk past thunks - while (true) - { - if (0xe9 == handler.func[0]) - { - // absolute jump with 32-bit displacement - handler.func += 5 + *reinterpret_cast(handler.func + 1); - } - else if ((0x48 == handler.func[0]) && (0x8b == handler.func[1]) && (0x01 == handler.func[2]) && (0xff == handler.func[3]) && ((0x60 == handler.func[4]) || (0xa0 == handler.func[4]))) - { - // virtual function call thunk - auto const vptr = *reinterpret_cast(handler.obj); - if (0x60 == handler.func[4]) - handler.func = *reinterpret_cast(vptr + *reinterpret_cast(handler.func + 5)); - else - handler.func = *reinterpret_cast(vptr + *reinterpret_cast(handler.func + 5)); - } - else - { - // not something we can easily bypass - break; - } - } - } + auto const [entrypoint, adjusted] = util::resolve_member_function(accessor, &space); + handler.func = reinterpret_cast(entrypoint); + handler.obj = adjusted; }; m_resolved_accessors.resize(m_space.size()); for (int space = 0; m_space.size() > space; ++space) @@ -1772,9 +1723,12 @@ void drcbe_x64::op_exh(Assembler &a, const instruction &inst) drccodeptr *targetptr = handp.handle().codeptr_addr(); // perform the exception processing - Label no_exception = a.newLabel(); + Label no_exception; if (inst.condition() != uml::COND_ALWAYS) + { + no_exception = a.newLabel(); a.short_().j(X86_NOT_CONDITION(inst.condition()), no_exception); // jcc no_exception + } mov_mem_param(a, MABS(&m_state.exp, 4), exp); // mov [exp],exp if (*targetptr != nullptr) a.call(imm(*targetptr)); // call *targetptr @@ -1804,9 +1758,12 @@ void drcbe_x64::op_callh(Assembler &a, const instruction &inst) drccodeptr *targetptr = handp.handle().codeptr_addr(); // skip if conditional - Label skip = a.newLabel(); + Label skip; if (inst.condition() != uml::COND_ALWAYS) + { + skip = a.newLabel(); a.short_().j(X86_NOT_CONDITION(inst.condition()), skip); // jcc skip + } // jump through the handle; directly if a normal jump if (*targetptr != nullptr) @@ -1833,9 +1790,12 @@ void drcbe_x64::op_ret(Assembler &a, const instruction &inst) assert(inst.numparams() == 0); // skip if conditional - Label skip = a.newLabel(); + Label skip; if (inst.condition() != uml::COND_ALWAYS) + { + skip = a.newLabel(); a.short_().j(X86_NOT_CONDITION(inst.condition()), skip); // jcc skip + } // return a.lea(rsp, ptr(rsp, 40)); // lea rsp,[rsp+40] @@ -1864,9 +1824,12 @@ void drcbe_x64::op_callc(Assembler &a, const instruction &inst) be_parameter paramp(*this, inst.param(1), PTYPE_M); // skip if conditional - Label skip = a.newLabel(); + Label skip; if (inst.condition() != uml::COND_ALWAYS) + { + skip = a.newLabel(); a.short_().j(X86_NOT_CONDITION(inst.condition()), skip); // jcc skip + } // perform the call mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)paramp.memory()); // mov param1,paramp @@ -2958,9 +2921,12 @@ void drcbe_x64::op_mov(Assembler &a, const instruction &inst) be_parameter srcp(*this, inst.param(1), PTYPE_MRI); // add a conditional branch unless a conditional move is possible - Label skip = a.newLabel(); + Label skip; if (inst.condition() != uml::COND_ALWAYS && !(dstp.is_int_register() && !srcp.is_immediate())) + { + skip = a.newLabel(); a.short_().j(X86_NOT_CONDITION(inst.condition()), skip); + } // register to memory if (dstp.is_memory() && srcp.is_int_register()) @@ -4529,9 +4495,12 @@ void drcbe_x64::op_fmov(Assembler &a, const instruction &inst) Xmm dstreg = dstp.select_register(xmm0); // always start with a jmp - Label skip = a.newLabel(); + Label skip; if (inst.condition() != uml::COND_ALWAYS) + { + skip = a.newLabel(); a.short_().j(X86_NOT_CONDITION(inst.condition()), skip); // jcc skip + } // 32-bit form if (inst.size() == 4) diff --git a/src/devices/cpu/drcbex86.cpp b/src/devices/cpu/drcbex86.cpp index aadd119a3616d..19fc002949b87 100644 --- a/src/devices/cpu/drcbex86.cpp +++ b/src/devices/cpu/drcbex86.cpp @@ -100,6 +100,7 @@ using namespace asmjit; using namespace asmjit::x86; +namespace { //************************************************************************** // DEBUGGING @@ -124,42 +125,21 @@ const uint32_t PTYPE_MRI = PTYPE_M | PTYPE_R | PTYPE_I; const uint32_t PTYPE_MF = PTYPE_M | PTYPE_F; - -//************************************************************************** -// MACROS -//************************************************************************** - -#define X86_CONDITION(condition) (condition_map[condition - uml::COND_Z]) -#define X86_NOT_CONDITION(condition) negateCond(condition_map[condition - uml::COND_Z]) - -#define assert_no_condition(inst) assert((inst).condition() == uml::COND_ALWAYS) -#define assert_any_condition(inst) assert((inst).condition() == uml::COND_ALWAYS || ((inst).condition() >= uml::COND_Z && (inst).condition() < uml::COND_MAX)) -#define assert_no_flags(inst) assert((inst).flags() == 0) -#define assert_flags(inst, valid) assert(((inst).flags() & ~(valid)) == 0) - - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -drcbe_x86::opcode_generate_func drcbe_x86::s_opcode_table[OP_MAX]; - // size-to-mask table -//static const uint64_t size_to_mask[] = { 0, 0xff, 0xffff, 0, 0xffffffff, 0, 0, 0, 0xffffffffffffffffU }; +//const uint64_t size_to_mask[] = { 0, 0xff, 0xffff, 0, 0xffffffff, 0, 0, 0, 0xffffffffffffffffU }; // register mapping tables -static const Gp::Id int_register_map[REG_I_COUNT] = +const Gp::Id int_register_map[REG_I_COUNT] = { Gp::kIdBx, Gp::kIdSi, Gp::kIdDi, Gp::kIdBp }; // flags mapping tables -static uint8_t flags_map[0x1000]; -static uint32_t flags_unmap[0x20]; +uint8_t flags_map[0x1000]; +uint32_t flags_unmap[0x20]; // condition mapping table -static const CondCode condition_map[uml::COND_MAX - uml::COND_Z] = +const CondCode condition_map[uml::COND_MAX - uml::COND_Z] = { CondCode::kZ, // COND_Z = 0x80, requires Z CondCode::kNZ, // COND_NZ, requires Z @@ -180,7 +160,7 @@ static const CondCode condition_map[uml::COND_MAX - uml::COND_Z] = }; // FPU control register mapping -static const uint16_t fp_control[4] = +const uint16_t fp_control[4] = { 0x0e3f, // ROUND_TRUNC 0x023f, // ROUND_ROUND @@ -190,6 +170,41 @@ static const uint16_t fp_control[4] = +//************************************************************************** +// MACROS +//************************************************************************** + +#define X86_CONDITION(condition) (condition_map[condition - uml::COND_Z]) +#define X86_NOT_CONDITION(condition) negateCond(condition_map[condition - uml::COND_Z]) + +#define assert_no_condition(inst) assert((inst).condition() == uml::COND_ALWAYS) +#define assert_any_condition(inst) assert((inst).condition() == uml::COND_ALWAYS || ((inst).condition() >= uml::COND_Z && (inst).condition() < uml::COND_MAX)) +#define assert_no_flags(inst) assert((inst).flags() == 0) +#define assert_flags(inst, valid) assert(((inst).flags() & ~(valid)) == 0) + + + +class ThrowableErrorHandler : public ErrorHandler +{ +public: + void handleError(Error err, const char *message, BaseEmitter *origin) override + { + throw emu_fatalerror("asmjit error %d: %s", err, message); + } +}; + +} // anonymous namespace + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +drcbe_x86::opcode_generate_func drcbe_x86::s_opcode_table[OP_MAX]; + + + //************************************************************************** // TABLES //************************************************************************** @@ -289,15 +304,6 @@ const drcbe_x86::opcode_table_entry drcbe_x86::s_opcode_table_source[] = { uml::OP_ICOPYF, &drcbe_x86::op_icopyf }, // ICOPYF dst,src }; -class ThrowableErrorHandler : public ErrorHandler -{ -public: - void handleError(Error err, const char *message, BaseEmitter *origin) override - { - throw emu_fatalerror("asmjit error %d: %s", err, message); - } -}; - //************************************************************************** // INLINE FUNCTIONS @@ -2596,9 +2602,12 @@ void drcbe_x86::op_exh(Assembler &a, const instruction &inst) drccodeptr *targetptr = handp.handle().codeptr_addr(); // perform the exception processing - Label no_exception = a.newLabel(); + Label no_exception; if (inst.condition() != uml::COND_ALWAYS) + { + no_exception = a.newLabel(); a.short_().j(X86_NOT_CONDITION(inst.condition()), no_exception); // jcc no_exception + } emit_mov_m32_p32(a, MABS(&m_state.exp, 4), exp); // mov [exp],exp if (*targetptr != nullptr) a.call(imm(*targetptr)); // call *targetptr @@ -2628,9 +2637,12 @@ void drcbe_x86::op_callh(Assembler &a, const instruction &inst) drccodeptr *targetptr = handp.handle().codeptr_addr(); // skip if conditional - Label skip = a.newLabel(); + Label skip; if (inst.condition() != uml::COND_ALWAYS) + { + skip = a.newLabel(); a.short_().j(X86_NOT_CONDITION(inst.condition()), skip); // jcc skip + } // jump through the handle; directly if a normal jump if (*targetptr != nullptr) @@ -2660,9 +2672,12 @@ void drcbe_x86::op_ret(Assembler &a, const instruction &inst) assert(inst.numparams() == 0); // skip if conditional - Label skip = a.newLabel(); + Label skip; if (inst.condition() != uml::COND_ALWAYS) + { + skip = a.newLabel(); a.j(X86_NOT_CONDITION(inst.condition()), skip); // jcc skip + } // return a.lea(esp, ptr(esp, 28)); // lea rsp,[rsp+28] @@ -2694,9 +2709,12 @@ void drcbe_x86::op_callc(Assembler &a, const instruction &inst) be_parameter paramp(*this, inst.param(1), PTYPE_M); // skip if conditional - Label skip = a.newLabel(); + Label skip; if (inst.condition() != uml::COND_ALWAYS) + { + skip = a.newLabel(); a.j(X86_NOT_CONDITION(inst.condition()), skip); // jcc skip + } // perform the call a.mov(dword_ptr(esp, 0), imm(paramp.memory())); // mov [esp],paramp @@ -3717,9 +3735,12 @@ void drcbe_x86::op_mov(Assembler &a, const instruction &inst) Gp const dstreg = dstp.select_register(eax); // add a conditional branch unless a conditional move is possible - Label skip = a.newLabel(); + Label skip; if (inst.condition() != uml::COND_ALWAYS && ((inst.size() == 8) || !(dstp.is_int_register() && !srcp.is_immediate()))) + { + skip = a.newLabel(); a.short_().j(X86_NOT_CONDITION(inst.condition()), skip); // jcc skip + } // 32-bit form if (inst.size() == 4) @@ -6003,9 +6024,12 @@ void drcbe_x86::op_fmov(Assembler &a, const instruction &inst) be_parameter srcp(*this, inst.param(1), PTYPE_MF); // always start with a jmp - Label skip = a.newLabel(); + Label skip; if (inst.condition() != uml::COND_ALWAYS) + { + skip = a.newLabel(); a.j(X86_NOT_CONDITION(inst.condition()), skip); // jcc skip + } // general case a.mov(eax, MABS(srcp.memory(0))); // mov eax,[srcp] diff --git a/src/lib/util/delegate.cpp b/src/lib/util/delegate.cpp index 8949f90f14660..67fb7e72d4296 100644 --- a/src/lib/util/delegate.cpp +++ b/src/lib/util/delegate.cpp @@ -10,6 +10,8 @@ #include "delegate.h" +#include "mfpresolve.h" + #include #include @@ -70,31 +72,9 @@ const delegate_mfp_compatible::raw_mfp_data delegate_mfp_compatible::s_null_mfp delegate_generic_function delegate_mfp_itanium::convert_to_generic(delegate_generic_class *&object) const { - // apply the "this" delta to the object first - the value is shifted to the left one bit position for the ARM-like variant - LOG("Input this=%p ptr=%p adj=%ld ", reinterpret_cast(object), reinterpret_cast(m_function), long(m_this_delta)); - object = reinterpret_cast( - reinterpret_cast(object) + (m_this_delta >> ((MAME_ABI_CXX_ITANIUM_MFP_TYPE == MAME_ABI_CXX_ITANIUM_MFP_ARM) ? 1 : 0))); - LOG("Calculated this=%p ", reinterpret_cast(object)); - - // test the virtual member function flag - it's the low bit of either the ptr or adj field, depending on the variant - if ((MAME_ABI_CXX_ITANIUM_MFP_TYPE == MAME_ABI_CXX_ITANIUM_MFP_ARM) ? !(m_this_delta & 1) : !(m_function & 1)) - { - // conventional function pointer - LOG("ptr=%p\n", reinterpret_cast(m_function)); - return reinterpret_cast(m_function); - } - else - { - // byte index into the vtable to the function - std::uint8_t const *const vtable_ptr = *reinterpret_cast(object) + m_function - ((MAME_ABI_CXX_ITANIUM_MFP_TYPE == MAME_ABI_CXX_ITANIUM_MFP_ARM) ? 0 : 1); - delegate_generic_function result; - if (MAME_ABI_CXX_VTABLE_FNDESC) - result = reinterpret_cast(uintptr_t(vtable_ptr)); - else - result = *reinterpret_cast(vtable_ptr); - LOG("ptr=%p (vtable)\n", reinterpret_cast(result)); - return result; - } + auto const [entrypoint, adjusted] = detail::resolve_member_function_itanium(m_function, m_this_delta, object); + object = reinterpret_cast(adjusted); + return reinterpret_cast(entrypoint); } @@ -107,181 +87,9 @@ delegate_generic_function delegate_mfp_itanium::convert_to_generic(delegate_gene delegate_generic_function delegate_mfp_msvc::adjust_this_pointer(delegate_generic_class *&object) const { - LOG("Input this=%p ", reinterpret_cast(object)); - if (sizeof(single_base_equiv) < m_size) - LOG("thisdelta=%d ", m_this_delta); - if (sizeof(unknown_base_equiv) == m_size) - LOG("vptrdelta=%d vindex=%d ", m_vptr_offs, m_vt_index); - std::uint8_t *byteptr = reinterpret_cast(object); - - // test for pointer to member function cast across virtual inheritance relationship - if ((sizeof(unknown_base_equiv) == m_size) && m_vt_index) - { - // add offset from "this" pointer to location of vptr, and add offset to virtual base from vtable - byteptr += m_vptr_offs; - std::uint8_t const *const vptr = *reinterpret_cast(byteptr); - byteptr += *reinterpret_cast(vptr + m_vt_index); - } - - // add "this" pointer displacement if present in the pointer to member function - if (sizeof(single_base_equiv) < m_size) - byteptr += m_this_delta; - LOG("Calculated this=%p\n", reinterpret_cast(byteptr)); - object = reinterpret_cast(byteptr); - - // walk past recognisable thunks -#if defined(__x86_64__) || defined(_M_X64) - std::uint8_t const *func = reinterpret_cast(m_function); - while (true) - { - // Assumes Windows calling convention, and doesn't consider that - // the "this" pointer could be in RDX if RCX is a pointer to - // space for an oversize scalar result. Since the result area - // is uninitialised on entry, you won't see something that looks - // like a vtable dispatch through RCX in this case - it won't - // behave badly, it just won't bypass virtual call thunks in the - // rare situations where the return type is an oversize scalar. - if (0xe9 == func[0]) - { - // relative jump with 32-bit displacement (typically a resolved PLT entry) - LOG("Found relative jump at %p ", func); - func += std::ptrdiff_t(5) + *reinterpret_cast(func + 1); - LOG("redirecting to %p\n", func); - continue; - } - else if ((0x48 == func[0]) && (0x8b == func[1]) && (0x01 == func[2])) - { - if ((0xff == func[3]) && ((0x20 == func[4]) || (0x60 == func[4]) || (0xa0 == func[4]))) - { - // MSVC virtual function call thunk - mov rax,QWORD PTR [rcx] ; jmp QWORD PTR [rax+...] - LOG("Found virtual member function thunk at %p ", func); - std::uint8_t const *const vptr = *reinterpret_cast(object); - if (0x20 == func[4]) // no displacement - func = *reinterpret_cast(vptr); - else if (0x60 == func[4]) // 8-bit displacement - func = *reinterpret_cast(vptr + *reinterpret_cast(func + 5)); - else // 32-bit displacement - func = *reinterpret_cast(vptr + *reinterpret_cast(func + 5)); - LOG("redirecting to %p\n", func); - continue; - } - else if ((0x48 == func[3]) && (0x8b == func[4])) - { - // clang virtual function call thunk - mov rax,QWORD PTR [rcx] ; mov rax,QWORD PTR [rax+...] ; jmp rax - if ((0x00 == func[5]) && (0x48 == func[6]) && (0xff == func[7]) && (0xe0 == func[8])) - { - // no displacement - LOG("Found virtual member function thunk at %p ", func); - std::uint8_t const *const vptr = *reinterpret_cast(object); - func = *reinterpret_cast(vptr); - LOG("redirecting to %p\n", func); - continue; - } - else if ((0x40 == func[5]) && (0x48 == func[7]) && (0xff == func[8]) && (0xe0 == func[9])) - { - // 8-bit displacement - LOG("Found virtual member function thunk at %p ", func); - std::uint8_t const *const vptr = *reinterpret_cast(object); - func = *reinterpret_cast(vptr + *reinterpret_cast(func + 6)); - LOG("redirecting to %p\n", func); - continue; - } - else if ((0x80 == func[5]) && (0x48 == func[10]) && (0xff == func[11]) && (0xe0 == func[12])) - { - // 32-bit displacement - LOG("Found virtual member function thunk at %p ", func); - std::uint8_t const *const vptr = *reinterpret_cast(object); - func = *reinterpret_cast(vptr + *reinterpret_cast(func + 6)); - LOG("redirecting to %p\n", func); - continue; - } - } - } - - // clang uses unoptimised thunks if optimisation is disabled - // Without optimisation, clang produces thunks like: - // 50 push rax - // 48 89 0c 24 mov QWORD PTR [rsp],rcx - // 48 8b 0c 24 mov rcx,QWORD PTR [rsp] - // 48 8b 01 mov rax,QWORD PTR [rcx] - // 48 8b 80 xx xx xx xx mov rax,QWORD PTR [rax+...] - // 41 5a pop r10 - // 48 ff e0 jmp rax - // Trying to decode these thunks likely isn't worth the effort. - // Chasing performance in unoptimised builds isn't very useful, - // and the format of these thunks may be fragile. - - // not something we can easily bypass - break; - } - return reinterpret_cast(std::uintptr_t(func)); -#elif defined(__aarch64__) || defined(_M_ARM64) - std::uint32_t const *func = reinterpret_cast(m_function); - while (true) - { - // Assumes little Endian mode. Instructions are always stored - // in little Endian format on AArch64, so if big Endian mode is - // to be supported, the values need to be swapped. - if ((0x90000010 == (func[0] & 0x9f00001f)) && (0x91000210 == (func[1] & 0xffc003ff)) && (0xd61f0200 == func[2])) - { - // page-relative jump with +/-4GB reach - adrp xip0,... ; add xip0,xip0,#... ; br xip0 - LOG("Found page-relative jump at %p ", func); - std::int64_t const page = - (std::uint64_t(func[0] & 0x60000000) >> 17) | - (std::uint64_t(func[0] & 0x00ffffe0) << 9) | - ((func[0] & 0x00800000) ? (~std::uint64_t(0) << 33) : 0); - std::uint32_t const offset = (func[1] & 0x003ffc00) >> 10; - func = reinterpret_cast(((std::uintptr_t(func) + page) & (~std::uintptr_t(0) << 12)) + offset); - LOG("redirecting to %p\n", func); - } - else if ((0xf9400010 == func[0]) && (0xf9400210 == (func[1] & 0xffc003ff)) && (0xd61f0200 == func[2])) - { - // virtual function call thunk - ldr xip0,[x0] ; ldr xip0,[x0,#...] ; br xip0 - LOG("Found virtual member function thunk at %p ", func); - std::uint32_t const *const *const vptr = *reinterpret_cast(object); - func = vptr[(func[1] & 0x003ffc00) >> 10]; - LOG("redirecting to %p\n", func); - } - else - { - // not something we can easily bypass - break; - } - - // clang uses horribly sub-optimal thunks for AArch64 - // Without optimisation, clang produces thunks like: - // d10143ff sub sp,sp,#80 - // f90027e7 str x7,[sp,#72] - // f90023e6 str x6,[sp,#64] - // f9001fe5 str x5,[sp,#56] - // f9001be4 str x4,[sp,#48] - // f90017e3 str x3,[sp,#40] - // f90013e2 str x2,[sp,#32] - // f9000fe1 str x1,[sp,#24] - // f90007e0 str x0,[sp,#8] - // f94007e0 ldr x0,[sp,#8] - // f9400009 ldr x9,[x0] - // f9400129 ldr x9,[x9,#...] - // 910143ff add sp,sp,#80 - // d61f0120 br x9 - // With optimisation, clang produces thunks like: - // d10103ff sub sp,sp,#64 - // a9008be1 stp x1,x2,[sp,#8] - // a90193e3 stp x3,x4,[sp,#24] - // a9029be5 stp x5,x6,[sp,#40] - // f9001fe7 str x7,[sp,#56] - // f9400009 ldr x9,[x0] - // f9400129 ldr x9,[x9,#...] - // 910103ff add sp,sp,#64 - // d61f0120 br x9 - // It's more effort than it's worth to try decoding these - // thunks. - - } - return reinterpret_cast(std::uintptr_t(func)); -#else - return reinterpret_cast(m_function); -#endif + auto const [entrypoint, adjusted] = detail::resolve_member_function_msvc(&m_function, m_size, object); + object = reinterpret_cast(adjusted); + return reinterpret_cast(entrypoint); } } // namespace util::detail diff --git a/src/lib/util/mfpresolve.cpp b/src/lib/util/mfpresolve.cpp new file mode 100644 index 0000000000000..4542a29229ddc --- /dev/null +++ b/src/lib/util/mfpresolve.cpp @@ -0,0 +1,258 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/*************************************************************************** + + mfpresolve.h + + Helpers for resolving member function pointers to entry points. + +***************************************************************************/ + +#include "mfpresolve.h" + +#include "osdcomm.h" + +#include + + +//************************************************************************** +// MACROS +//************************************************************************** + +#if defined(MAME_DELEGATE_LOG_ADJ) + #define LOG(...) printf(__VA_ARGS__) +#else + #define LOG(...) do { if (false) printf(__VA_ARGS__); } while (false) +#endif + + + +namespace util::detail { + +std::pair resolve_member_function_itanium( + std::uintptr_t function, + std::ptrdiff_t delta, + void const *object) noexcept +{ + // apply the "this" delta to the object first - the value is shifted to the left one bit position for the ARM-like variant + LOG("Input this=%p ptr=%p adj=%ld ", object, reinterpret_cast(function), long(delta)); + constexpr int deltashift = (MAME_ABI_CXX_ITANIUM_MFP_TYPE == MAME_ABI_CXX_ITANIUM_MFP_ARM) ? 1 : 0; + object = reinterpret_cast(object) + (delta >> deltashift); + LOG("Calculated this=%p ", object); + + // test the virtual member function flag - it's the low bit of either the ptr or adj field, depending on the variant + if ((MAME_ABI_CXX_ITANIUM_MFP_TYPE == MAME_ABI_CXX_ITANIUM_MFP_ARM) ? !(delta & 1) : !(function & 1)) + { + // conventional function pointer + LOG("ptr=%p\n", reinterpret_cast(function)); + return std::make_pair(function, std::uintptr_t(object)); + } + else + { + // byte index into the vtable to the function + auto const vtable_ptr = *reinterpret_cast(object) + function - ((MAME_ABI_CXX_ITANIUM_MFP_TYPE == MAME_ABI_CXX_ITANIUM_MFP_ARM) ? 0 : 1); + std::uintptr_t result; + if (MAME_ABI_CXX_VTABLE_FNDESC) + result = std::uintptr_t(vtable_ptr); + else + result = *reinterpret_cast(vtable_ptr); + LOG("ptr=%p (vtable)\n", reinterpret_cast(result)); + return std::make_pair(result, std::uintptr_t(object)); + } +} + + +std::pair resolve_member_function_msvc( + void const *funcptr, + std::size_t size, + void const *object) noexcept +{ + struct single { std::uintptr_t entrypoint; }; + struct multi { std::uintptr_t entrypoint; int this_delta; }; + struct { std::uintptr_t entrypoint; int this_delta; int vptr_offs; int vt_index; } const *unknown; + assert(sizeof(*unknown) >= size); + unknown = reinterpret_cast(funcptr); + + LOG("Input this=%p ", object); + if (sizeof(single) < size) + LOG("thisdelta=%d ", unknown->this_delta); + if (sizeof(*unknown) == size) + LOG("vptrdelta=%d vindex=%d ", unknown->vptr_offs, unknown->vt_index); + auto byteptr = reinterpret_cast(object); + + // test for pointer to member function cast across virtual inheritance relationship + if ((sizeof(*unknown) == size) && unknown->vt_index) + { + // add offset from "this" pointer to location of vptr, and add offset to virtual base from vtable + byteptr += unknown->vptr_offs; + std::uint8_t const *const vptr = *reinterpret_cast(byteptr); + byteptr += *reinterpret_cast(vptr + unknown->vt_index); + } + + // add "this" pointer displacement if present in the pointer to member function + if (sizeof(single) < size) + byteptr += unknown->this_delta; + LOG("Calculated this=%p\n", reinterpret_cast(byteptr)); + + // walk past recognisable thunks + return std::make_pair(bypass_member_function_thunks(unknown->entrypoint, byteptr), std::uintptr_t(byteptr)); +} + + +std::uintptr_t bypass_member_function_thunks( + std::uintptr_t entrypoint, + void const *object) noexcept +{ +#if defined(__x86_64__) || defined(_M_X64) + std::uint8_t const *func = reinterpret_cast(entrypoint); + while (true) + { + // Assumes Windows calling convention, and doesn't consider that + // the "this" pointer could be in RDX if RCX is a pointer to + // space for an oversize scalar result. Since the result area + // is uninitialised on entry, you won't see something that looks + // like a vtable dispatch through RCX in this case - it won't + // behave badly, it just won't bypass virtual call thunks in the + // rare situations where the return type is an oversize scalar. + if (0xe9 == func[0]) + { + // relative jump with 32-bit displacement (typically a resolved PLT entry) + LOG("Found relative jump at %p ", func); + func += std::ptrdiff_t(5) + *reinterpret_cast(func + 1); + LOG("redirecting to %p\n", func); + continue; + } + else if (object && (0x48 == func[0]) && (0x8b == func[1]) && (0x01 == func[2])) + { + if ((0xff == func[3]) && ((0x20 == func[4]) || (0x60 == func[4]) || (0xa0 == func[4]))) + { + // MSVC virtual function call thunk - mov rax,QWORD PTR [rcx] ; jmp QWORD PTR [rax+...] + LOG("Found virtual member function thunk at %p ", func); + std::uint8_t const *const vptr = *reinterpret_cast(object); + if (0x20 == func[4]) // no displacement + func = *reinterpret_cast(vptr); + else if (0x60 == func[4]) // 8-bit displacement + func = *reinterpret_cast(vptr + *reinterpret_cast(func + 5)); + else // 32-bit displacement + func = *reinterpret_cast(vptr + *reinterpret_cast(func + 5)); + LOG("redirecting to %p\n", func); + continue; + } + else if ((0x48 == func[3]) && (0x8b == func[4])) + { + // clang virtual function call thunk - mov rax,QWORD PTR [rcx] ; mov rax,QWORD PTR [rax+...] ; jmp rax + if ((0x00 == func[5]) && (0x48 == func[6]) && (0xff == func[7]) && (0xe0 == func[8])) + { + // no displacement + LOG("Found virtual member function thunk at %p ", func); + std::uint8_t const *const vptr = *reinterpret_cast(object); + func = *reinterpret_cast(vptr); + LOG("redirecting to %p\n", func); + continue; + } + else if ((0x40 == func[5]) && (0x48 == func[7]) && (0xff == func[8]) && (0xe0 == func[9])) + { + // 8-bit displacement + LOG("Found virtual member function thunk at %p ", func); + std::uint8_t const *const vptr = *reinterpret_cast(object); + func = *reinterpret_cast(vptr + *reinterpret_cast(func + 6)); + LOG("redirecting to %p\n", func); + continue; + } + else if ((0x80 == func[5]) && (0x48 == func[10]) && (0xff == func[11]) && (0xe0 == func[12])) + { + // 32-bit displacement + LOG("Found virtual member function thunk at %p ", func); + std::uint8_t const *const vptr = *reinterpret_cast(object); + func = *reinterpret_cast(vptr + *reinterpret_cast(func + 6)); + LOG("redirecting to %p\n", func); + continue; + } + } + } + + // clang uses unoptimised thunks if optimisation is disabled + // Without optimisation, clang produces thunks like: + // 50 push rax + // 48 89 0c 24 mov QWORD PTR [rsp],rcx + // 48 8b 0c 24 mov rcx,QWORD PTR [rsp] + // 48 8b 01 mov rax,QWORD PTR [rcx] + // 48 8b 80 xx xx xx xx mov rax,QWORD PTR [rax+...] + // 41 5a pop r10 + // 48 ff e0 jmp rax + // Trying to decode these thunks likely isn't worth the effort. + // Chasing performance in unoptimised builds isn't very useful, + // and the format of these thunks may be fragile. + + // not something we can easily bypass + break; + } + return std::uintptr_t(func); +#elif defined(__aarch64__) || defined(_M_ARM64) + std::uint32_t const *func = reinterpret_cast(entrypoint); + auto const fetch = [&func] (auto offset) { return little_endianize_int32(func[offset]); }; + while (true) + { + if ((0x90000010 == (fetch(0) & 0x9f00001f)) && (0x91000210 == (fetch(1) & 0xffc003ff)) && (0xd61f0200 == fetch(2))) + { + // page-relative jump with +/-4GB reach - adrp xip0,... ; add xip0,xip0,#... ; br xip0 + LOG("Found page-relative jump at %p ", func); + std::int64_t const page = + (std::uint64_t(fetch(0) & 0x60000000) >> 17) | + (std::uint64_t(fetch(0) & 0x00ffffe0) << 9) | + ((fetch(0) & 0x00800000) ? (~std::uint64_t(0) << 33) : 0); + std::uint32_t const offset = (fetch(1) & 0x003ffc00) >> 10; + func = reinterpret_cast(((std::uintptr_t(func) + page) & (~std::uintptr_t(0) << 12)) + offset); + LOG("redirecting to %p\n", func); + } + else if (object && (0xf9400010 == fetch(0)) && (0xf9400210 == (fetch(1) & 0xffc003ff)) && (0xd61f0200 == fetch(2))) + { + // virtual function call thunk - ldr xip0,[x0] ; ldr xip0,[x0,#...] ; br xip0 + LOG("Found virtual member function thunk at %p ", func); + auto const vptr = *reinterpret_cast(object); + func = vptr[(fetch(1) & 0x003ffc00) >> 10]; + LOG("redirecting to %p\n", func); + } + else + { + // not something we can easily bypass + break; + } + + // clang uses horribly sub-optimal thunks for AArch64 + // Without optimisation, clang produces thunks like: + // d10143ff sub sp,sp,#80 + // f90027e7 str x7,[sp,#72] + // f90023e6 str x6,[sp,#64] + // f9001fe5 str x5,[sp,#56] + // f9001be4 str x4,[sp,#48] + // f90017e3 str x3,[sp,#40] + // f90013e2 str x2,[sp,#32] + // f9000fe1 str x1,[sp,#24] + // f90007e0 str x0,[sp,#8] + // f94007e0 ldr x0,[sp,#8] + // f9400009 ldr x9,[x0] + // f9400129 ldr x9,[x9,#...] + // 910143ff add sp,sp,#80 + // d61f0120 br x9 + // With optimisation, clang produces thunks like: + // d10103ff sub sp,sp,#64 + // a9008be1 stp x1,x2,[sp,#8] + // a90193e3 stp x3,x4,[sp,#24] + // a9029be5 stp x5,x6,[sp,#40] + // f9001fe7 str x7,[sp,#56] + // f9400009 ldr x9,[x0] + // f9400129 ldr x9,[x9,#...] + // 910103ff add sp,sp,#64 + // d61f0120 br x9 + // It's more effort than it's worth to try decoding these + // thunks. + + } + return std::uintptr_t(func); +#else + return entrypoint; +#endif +} + +} // namespace util::detail diff --git a/src/lib/util/mfpresolve.h b/src/lib/util/mfpresolve.h new file mode 100644 index 0000000000000..c9a2eba6a95a1 --- /dev/null +++ b/src/lib/util/mfpresolve.h @@ -0,0 +1,86 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/*************************************************************************** + + mfpresolve.h + + Helpers for resolving member function pointers to entry points. + +***************************************************************************/ +#ifndef MAME_LIB_UTIL_MFPRESOLVE_H +#define MAME_LIB_UTIL_MFPRESOLVE_H + +#pragma once + +#include "abi.h" + +#include +#include +#include + + +namespace util { + +namespace detail { + +std::pair resolve_member_function_itanium(std::uintptr_t function, std::ptrdiff_t delta, void const *object) noexcept; +std::pair resolve_member_function_msvc(void const *funcptr, std::size_t size, void const *object) noexcept; +std::uintptr_t bypass_member_function_thunks(std::uintptr_t entrypoint, void const *object) noexcept; + +} // namespace detail + + +template +inline T bypass_member_function_thunks(T entrypoint, U const *object) noexcept +{ + return reinterpret_cast( + detail::bypass_member_function_thunks( + reinterpret_cast(entrypoint), + reinterpret_cast(object))); +} + + +template +inline std::pair resolve_member_function(Ret (T::*function)(Params...), T *object) noexcept +{ + if (MAME_ABI_CXX_TYPE == MAME_ABI_CXX_ITANIUM) + { + struct { uintptr_t ptr; ptrdiff_t adj; } equiv; + static_assert(sizeof(function) == sizeof(equiv)); + *reinterpret_cast(&equiv) = function; + return detail::resolve_member_function_itanium(equiv.ptr, equiv.adj, object); + } + else if (MAME_ABI_CXX_TYPE == MAME_ABI_CXX_MSVC) + { + return detail::resolve_member_function_msvc(&function, sizeof(function), object); + } + else + { + return std::make_pair(std::uintptr_t(nullptr), std::uintptr_t(nullptr)); + } +} + + +template +inline std::pair resolve_member_function(Ret (T::*function)(Params...) const, T const *object) noexcept +{ + if (MAME_ABI_CXX_TYPE == MAME_ABI_CXX_ITANIUM) + { + struct { uintptr_t ptr; ptrdiff_t adj; } equiv; + static_assert(sizeof(function) == sizeof(equiv)); + *reinterpret_cast(&equiv) = function; + return detail::resolve_member_function_itanium(equiv.ptr, equiv.adj, object); + } + else if (MAME_ABI_CXX_TYPE == MAME_ABI_CXX_MSVC) + { + return detail::resolve_member_function_msvc(&function, sizeof(function), object); + } + else + { + return std::make_pair(std::uintptr_t(nullptr), std::uintptr_t(nullptr)); + } +} + +} // namespace util + +#endif // MAME_LIB_UTIL_MFPRESOLVE_H From 03cdb3ac3ff333e5262af8a02901fb0381b053f6 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Mon, 13 Jan 2025 18:14:10 +0100 Subject: [PATCH 03/80] New systems marked not working ------------------------------ Cherry Bonus (A.A.I. bootleg) [Ioannis Bampoulas] Cherry Bonus II (V2.00 06/01) [Ioannis Bampoulas] New clones marked not working ----------------------------- Cherry Bonus III (ver.5.1) [Ioannis Bampoulas] --- src/mame/igs/goldstar.cpp | 112 +++++++++++++++++++++++++++++++++++++- src/mame/mame.lst | 3 + 2 files changed, 114 insertions(+), 1 deletion(-) diff --git a/src/mame/igs/goldstar.cpp b/src/mame/igs/goldstar.cpp index 37c13829cda6d..160f2c374ca73 100644 --- a/src/mame/igs/goldstar.cpp +++ b/src/mame/igs/goldstar.cpp @@ -525,6 +525,7 @@ class wingco_state : public goldstar_state void system_outputb_w(uint8_t data); void system_outputc_w(uint8_t data); + void init_cb2(); void init_lucky8a(); void init_lucky8f(); void init_lucky8l(); @@ -12207,6 +12208,34 @@ ROM_START( cb3h ) // very similar to the cb3 set, but changes are legit ROM_LOAD( "dm74s288.d12", 0x0000, 0x0020, CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) ROM_END + // original Wing W4 PCB + Dyna D9005 subboard with Z80, ROM, RAM and Xilinx. Dumper says GFX ROMs are identical to many other sets. +ROM_START( cb3s51 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "cb3s-v51.ic5", 0x00000, 0x10000, CRC(1b9a12a1) SHA1(75f76b47147d07e8086812bc13c08f06952622a2) ) + + ROM_REGION( 0x18000, "gfx1", 0 ) + ROM_LOAD( "cb3-5.7h", 0x00000, 0x08000, CRC(83650a94) SHA1(e79420ab559d3f74013708767ca3f238fd333fb7) ) + ROM_LOAD( "cb3-6.8h", 0x08000, 0x08000, CRC(2f46a3f5) SHA1(3e6022ee8f84039e48f41aea5e68ee28aabdc556) ) + ROM_LOAD( "cb3-7.10h", 0x10000, 0x08000, CRC(dcf97517) SHA1(0a29696e0464c8878c499b1786a17080fd088a72) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "cb3-1.1h", 0x00000, 0x02000, CRC(7cc6d26b) SHA1(de33e8985affce7bd3ead89463117c9aaa93d5e4) ) + ROM_LOAD( "cb3-2.3h", 0x02000, 0x02000, CRC(e73ea4e3) SHA1(c9fd56461f6986d6bc170403d298fcc408a524e9) ) + ROM_LOAD( "cb3-3.4h", 0x04000, 0x02000, CRC(91162010) SHA1(3acc21e7074602b247f2f392eb181802092d2f21) ) + ROM_LOAD( "cb3-4.5h", 0x06000, 0x02000, CRC(cbcc6bfb) SHA1(5bafc934fef1f50d8c182c39d3a7ce795c89d175) ) + + ROM_REGION( 0x0200, "proms", 0 ) + ROM_LOAD_NIB_LOW( "n82s129.13g", 0x0000, 0x0100, CRC(59ac98e4) SHA1(5fc0f1a48c49c956cdb8826e20663dc57a9175e4) ) // 1st bank colors, low 4 bits. + ROM_LOAD_NIB_HIGH( "n82s129.14g", 0x0000, 0x0100, CRC(0d8f35bd) SHA1(0c2a0145cdaaf9beabdce241731a36b0c65f18a2) ) // 1st bank colors, high 4 bits. + ROM_LOAD( "dm74s288.13d", 0x0080, 0x0020, CRC(77a85e21) SHA1(3b41e0ab7cc55c5d78914d23e8289383f5bd5654) ) // 2nd bank colors + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "82s129.f3", 0x0000, 0x0100, CRC(1d668d4a) SHA1(459117f78323ea264d3a29f1da2889bbabe9e4be) ) + + ROM_REGION( 0x20, "unkprom2", 0 ) + ROM_LOAD( "dm74s288.d12", 0x0000, 0x0020, CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) +ROM_END + /* Cherry Gold I (bootleg) It runs in CB3e similar hardware... @@ -15345,6 +15374,76 @@ ROM_START( f16s8l) ROM_LOAD( "5.12d", 0x0000, 0x0020, CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) ROM_END +ROM_START( cb2 ) // W4 base board + Dyna D8905 CPU board + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "dyna_cb2_280.ic3", 0x0000, 0x1000, CRC(ad930734) SHA1(e47f827dbecc7679aa403d838922d69763736356) ) // on CPU board + ROM_CONTINUE( 0xd000, 0x1000 ) + ROM_CONTINUE( 0xc000, 0x1000 ) + ROM_CONTINUE( 0x3000, 0x1000 ) + ROM_CONTINUE( 0xf000, 0x1000 ) + ROM_CONTINUE( 0x1000, 0x1000 ) + ROM_CONTINUE( 0xe000, 0x1000 ) + ROM_CONTINUE( 0x2000, 0x1000 ) + + ROM_REGION( 0x18000, "gfx1", 0 ) + ROM_LOAD( "5.7h", 0x00000, 0x8000, CRC(28e7b2c4) SHA1(b457d1da74da562f4151e188786551692435367b) ) + ROM_LOAD( "6.8h", 0x08000, 0x8000, CRC(0625782b) SHA1(0bcc92f91b7b13ae6e87938379228108a47a8920) ) + ROM_LOAD( "7.9h", 0x10000, 0x8000, CRC(31144af6) SHA1(bc7ada0b0b255de14b2ffed46256213880d2e586) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "1.1h", 0x0000, 0x2000, CRC(d902512a) SHA1(7e67e6942415d3580255f587060f69a50b75f445) ) + ROM_LOAD( "2.2h", 0x2000, 0x2000, CRC(4baf17f8) SHA1(748630bcadbc40aaa64c0e3b82aca8cd28972cf8) ) + ROM_LOAD( "3.4h", 0x4000, 0x2000, CRC(5fe4deb5) SHA1(a10206d1f0040b448da38444556364db6b21b940) ) + ROM_LOAD( "4.5h", 0x6000, 0x2000, CRC(e3bc9e64) SHA1(a0ba18c0138233be8cb0b36f123cef16136df99b) ) + + // PROMs were not included in this set, but dumper's note says they match the ones for ns8lines + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "u4.bin", 0x0000, 0x0100, CRC(23e81049) SHA1(78071dae70fad870e972d944642fb3a2374be5e4) ) + ROM_LOAD( "u5.bin", 0x0100, 0x0100, CRC(526cf9d3) SHA1(eb779d70f2507d0f26d225ac8f5de8f2243599ca) ) + + ROM_REGION( 0x40, "proms2", 0 ) + ROM_LOAD( "u2.bin", 0x0000, 0x0020, CRC(c6b41352) SHA1(d7c3b5aa32e4e456c9432a13bede1db6d62eb270) ) + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "u3.bin", 0x0000, 0x0100, CRC(1d668d4a) SHA1(459117f78323ea264d3a29f1da2889bbabe9e4be) ) + + ROM_REGION( 0x20, "unkprom2", 0 ) + ROM_LOAD( "u1.bin", 0x0000, 0x0020, CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) +ROM_END + +/* + Dumper's note: the game uses 2x 6116 SRAM, one one the board and one on the subboard. If missing one of those the game will not boot. +*/ +ROM_START( cbaai ) // W4 base board + CPU board. + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "dyna_cb2_280.ic3", 0x00000, 0x10000, CRC(be8359bf) SHA1(e363fdb106ab2289e02c035875c1350f74d6c4fc) ) // on CPU board + + ROM_REGION( 0x18000, "gfx1", 0 ) + ROM_LOAD( "5.7h", 0x00000, 0x8000, CRC(a4c00251) SHA1(c8661ea98cdf78fed3890e822ab27bc82d65c234) ) + ROM_LOAD( "6.8h", 0x08000, 0x8000, CRC(e8171fa6) SHA1(42615668802b286d6867884ab487376538c24a33) ) + ROM_LOAD( "7.9h", 0x10000, 0x8000, CRC(60ba750d) SHA1(a7b78bc6d599a593f06a3d0adb5b0ff71224e2f8) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "1.1h", 0x0000, 0x2000, CRC(dc2e3af5) SHA1(d6b775601444274acaf8645e8df53c78219ac7e7) ) + ROM_LOAD( "2.2h", 0x2000, 0x2000, CRC(14f36329) SHA1(09ceb73e4cc5c83740ce2bfc65468b39e3b87cbe) ) + ROM_LOAD( "3.4h", 0x4000, 0x2000, CRC(d8189823) SHA1(26731dab01237c8d1b53861db0840cf66282d8e1) ) + ROM_LOAD( "4.5h", 0x6000, 0x2000, CRC(cee3d9fd) SHA1(987875fa4417940641b5a18636165d05db8c89ad) ) + + // PROMs were not included in this set, but dumper's note says they match the ones for ns8lines + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "u4.bin", 0x0000, 0x0100, CRC(23e81049) SHA1(78071dae70fad870e972d944642fb3a2374be5e4) ) + ROM_LOAD( "u5.bin", 0x0100, 0x0100, CRC(526cf9d3) SHA1(eb779d70f2507d0f26d225ac8f5de8f2243599ca) ) + + ROM_REGION( 0x40, "proms2", 0 ) + ROM_LOAD( "u2.bin", 0x0000, 0x0020, CRC(c6b41352) SHA1(d7c3b5aa32e4e456c9432a13bede1db6d62eb270) ) + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "u3.bin", 0x0000, 0x0100, CRC(1d668d4a) SHA1(459117f78323ea264d3a29f1da2889bbabe9e4be) ) + + ROM_REGION( 0x20, "unkprom2", 0 ) + ROM_LOAD( "u1.bin", 0x0000, 0x0020, CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) +ROM_END + /* Super 97-2 @@ -22734,6 +22833,14 @@ void cmaster_state::init_tsk() rom[i] = bitswap<8>(rom[i] ^ Xor_value, 6, 7, 4, 5, 2, 3, 0, 1); } +void wingco_state::init_cb2() +{ + uint8_t *rom = memregion("maincpu")->base(); + + for (int a = 0; a < 0x10000; a++) + rom[a] = bitswap<8>(rom[a], 6, 7, 5, 4, 3, 2, 1, 0); +} + } // anonymous namespace @@ -22768,6 +22875,7 @@ GAMEL( 199?, cb3e, ncb3, cb3e, chrygld, cb3_state, init_cb3e GAMEL( 199?, cb3f, ncb3, ncb3, ncb3, cb3_state, init_cb3f, ROT0, "bootleg (Cleco)", "Cherry Bonus III (set 5, encrypted bootleg)", MACHINE_NOT_WORKING, layout_chrygld ) // partially decrypted, stops at 'call attendant' GAMEL( 199?, cb3g, ncb3, ncb3, ncb3, cb3_state, init_cb3g, ROT0, "Dyna", "Cherry Bonus III (ver.1.40, set 6)", 0, layout_cherryb3 ) GAMEL( 199?, cb3h, ncb3, ncb3, ncb3, cb3_state, init_cb3, ROT0, "Dyna", "Cherry Bonus III (ver.1.40, set 7)", 0, layout_cherryb3 ) +GAMEL( 199?, cb3s51, ncb3, ncb3, ncb3, cb3_state, init_cb3g, ROT0, "Dyna", "Cherry Bonus III (ver.5.1)", MACHINE_NOT_WORKING, layout_cherryb3 ) // I/O need checking, seems to be working GAMEL( 199?, chryglda, ncb3, cb3e, chrygld, cb3_state, init_cb3e, ROT0, "bootleg", "Cherry Gold I (set 2, encrypted bootleg)", 0, layout_chrygld ) // Runs in CB3e hardware. GAME( 1994, chryangla, ncb3, chryangla,ncb3, cb3_state, init_chryangl, ROT0, "bootleg (G.C.I.)", "Cherry Angel (encrypted, W-4 hardware)", MACHINE_NOT_WORKING ) // DYNA CB3 V1.40 string, decrypted but only test screens work @@ -22880,7 +22988,9 @@ GAME( 198?, ladylinrd, ladylinr, ladylinrb,ladylinr, goldstar_state, init_lady GAME( 198?, ladylinre, ladylinr, ladylinrb,ladylinr, goldstar_state, init_ladylinre, ROT0, "TAB Austria", "Lady Liner (encrypted, set 4)", 0 ) GAME ( 1992?,wcat, 0, wcat3, lucky8b, wingco_state, init_wcat, ROT0, "Excel", "Wild Cat", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) // needs correct GFX ROMs, I/O, etc GAME( 1995, wcat3, 0, wcat3, lucky8, wingco_state, init_wcat3, ROT0, "E.A.I.", "Wild Cat 3", MACHINE_NOT_WORKING | MACHINE_WRONG_COLORS ) // decryption partially wrong, needs soft resets before running. Bad PROM decode -GAMEL( 199?, animalw, 0, lucky8, animalw, wingco_state, empty_init, ROT0, "bootleg", "Animal Wonders (ver A900)", MACHINE_NOT_WORKING, layout_lucky8 ) // inputs / DIPs need to be checked +GAMEL( 199?, animalw, 0, lucky8, animalw, wingco_state, empty_init, ROT0, "bootleg", "Animal Wonders (ver A900)", MACHINE_NOT_WORKING, layout_lucky8 ) // inputs / DIPs need to be checked +GAMEL( 1989, cb2, 0, lucky8, lucky8, wingco_state, init_cb2, ROT0, "Dyna", "Cherry Bonus II (V2.00 06/01)", MACHINE_NOT_WORKING, layout_lucky8 ) // I/O need to be checked, seems reasonably working +GAMEL( 1990, cbaai, 0, lucky8, lucky8, wingco_state, empty_init, ROT0, "Dyna", "Cherry Bonus (A.A.I. bootleg)", MACHINE_NOT_WORKING, layout_lucky8 ) // jumps to 0xf430 but there's nothing there? GAME( 1985, luckylad, 0, luckylad, luckylad, wingco_state, empty_init, ROT0, "Wing Co., Ltd.", "Lucky Lady (Wing, encrypted)", MACHINE_NOT_WORKING | MACHINE_WRONG_COLORS ) // controls / dips, colors not correctly decoded GAME( 1991, megaline, 0, megaline, megaline, unkch_state, empty_init, ROT0, "Fun World", "Mega Lines", MACHINE_NOT_WORKING ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 2f4b3ddd3bf06..93b8532362a15 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -20162,6 +20162,7 @@ bonusch // (c) 1990 Wing Co. Ltd bonuscha // (c) 1990 Wing Co. Ltd carb2002 // bootleg carb2003 // bootleg +cb2 // (c) 1989 Dyna Electronics cb3 // (c) 199? Dyna Electronics cb3a // (c) 199? Dyna Electronics cb3b // (c) 199? Dyna Electronics @@ -20171,6 +20172,8 @@ cb3e // 199? bootleg cb3f // 199? bootleg cb3g // (c) 199? Dyna Electronics cb3h // (c) 199? Dyna Electronics +cb3s51 // (c) 199? Dyna Electronics +cbaai // A.I.I. bootleg cherry96 // bootleg chry10 // bootleg chryangl // (c) 199? Dyna Electronics From 5e09f88a2b3b8db7d0b8120244256ae2f1a7a625 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Tue, 14 Jan 2025 04:33:40 +1100 Subject: [PATCH 04/80] util/mfpresolve.h: Linux wants for ptrdiff_t. --- src/lib/util/mfpresolve.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/util/mfpresolve.h b/src/lib/util/mfpresolve.h index c9a2eba6a95a1..4b4f62373d34f 100644 --- a/src/lib/util/mfpresolve.h +++ b/src/lib/util/mfpresolve.h @@ -15,6 +15,7 @@ #include "abi.h" #include +#include #include #include @@ -66,7 +67,7 @@ inline std::pair resolve_member_function(Ret (T: { if (MAME_ABI_CXX_TYPE == MAME_ABI_CXX_ITANIUM) { - struct { uintptr_t ptr; ptrdiff_t adj; } equiv; + struct { std::uintptr_t ptr; std::ptrdiff_t adj; } equiv; static_assert(sizeof(function) == sizeof(equiv)); *reinterpret_cast(&equiv) = function; return detail::resolve_member_function_itanium(equiv.ptr, equiv.adj, object); From 5ed05d5defb6b476e95493fa55d74512c2c1d59e Mon Sep 17 00:00:00 2001 From: AJR Date: Mon, 13 Jan 2025 14:07:26 -0500 Subject: [PATCH 05/80] drcbearm64.cpp: Add missing header (blind fix for Mac build) --- src/devices/cpu/drcbearm64.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/devices/cpu/drcbearm64.cpp b/src/devices/cpu/drcbearm64.cpp index 52fdd67e82dce..b20359aab07e8 100644 --- a/src/devices/cpu/drcbearm64.cpp +++ b/src/devices/cpu/drcbearm64.cpp @@ -8,6 +8,8 @@ #include "emuopts.h" #include "uml.h" +#include "mfpresolve.h" + #include From b33b81b4d290b5dde93d7d6887b7c8f90183cb00 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Mon, 13 Jan 2025 22:53:56 +0100 Subject: [PATCH 06/80] lependu.cpp driver improvements [Roberto Fresca, Grull Osgo]: * Fixed the ROM_LOAD. * Fixed the graphics banks. * Fixed the color/bank selector bits. --- src/mame/misc/lependu.cpp | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/mame/misc/lependu.cpp b/src/mame/misc/lependu.cpp index b9bc510ff479f..a31fa608577b2 100644 --- a/src/mame/misc/lependu.cpp +++ b/src/mame/misc/lependu.cpp @@ -179,19 +179,15 @@ TILE_GET_INFO_MEMBER(lependu_state::get_bg_tile_info) { /* - bits - 7654 3210 - ---x xxx- Color - -xx- ---- Bank - x--- ---x Unknown/Unused + --xx xx-- tiles color. + -x-- --x- tiles bank. + x--- ---x unused. */ + int attr = m_colorram[tile_index]; int code = m_videoram[tile_index]; - int bank = (attr & 0x60) >> 5; // bits 5-6 switch the gfx banks - int color; - - if (bank == 3) - color = ((attr & 0x1e) >> 1 ); - else - color = ((attr & 0x1e) >> 2 ); + int bank = (attr & 0x02) >> 1 | (attr & 0x40) >> 5; // bits 6 and 1 switch the gfx banks + int color = (attr & 0x3c) >> 2; // bits 2-3-4-5 for color tileinfo.set(bank, code, color, 0); } @@ -437,10 +433,11 @@ static const gfx_layout tilelayout = **************************************************/ static GFXDECODE_START( gfx_lependu ) +// banks ok GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 16 ) - GFXDECODE_ENTRY( "gfx1", 0x0800, tilelayout, 0, 16 ) - GFXDECODE_ENTRY( "gfx1", 0x1000, tilelayout, 0, 16 ) GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 16 ) + GFXDECODE_ENTRY( "gfx1", 0x1000, tilelayout, 0, 16 ) + GFXDECODE_ENTRY( "gfx2", 0x0800, tilelayout, 0, 16 ) GFXDECODE_END @@ -595,12 +592,12 @@ ROM_START( lependu ) ROM_FILL( 0x0000, 0x4000, 0x0000 ) // filling the R-G bitplanes ROM_LOAD( "1y.3a", 0x4000, 0x2000, CRC(ae0e37f8) SHA1(2e3404c55b92a7f9ec72d7b96bbea95ee028026c) ) // chars / multicolor tiles, bitplane 3 - ROM_REGION( 0x1800, "gfx2", 0 ) - ROM_LOAD( "3y.1a", 0x0000, 0x0800, CRC(ea868221) SHA1(fcf9a840537feb28c9fb65b58b9a41b2412aa4ef) ) // multicolor tiles, bitplane2 - ROM_CONTINUE( 0x0000, 0x0800) // discarding 1st half - ROM_LOAD( "2y.2a", 0x0800, 0x0800, CRC(6d1da4bb) SHA1(dc8c70faa301e2f7e9089d38e0ef618e8352e569) ) // multicolor tiles, bitplane1 - ROM_CONTINUE( 0x0800, 0x0800) // discarding 1st half - ROM_COPY( "gfx1", 0x5800, 0x1000, 0x0800 ) // multicolor tiles, bitplane3. found in the 3rd quarter of the chars rom + ROM_REGION( 0x3000, "gfx2", 0 ) + ROM_LOAD( "3y.1a", 0x0000, 0x1000, CRC(ea868221) SHA1(fcf9a840537feb28c9fb65b58b9a41b2412aa4ef) ) // cards deck and alt gfx, bitplane1 + ROM_LOAD( "2y.3a", 0x1000, 0x1000, CRC(6d1da4bb) SHA1(dc8c70faa301e2f7e9089d38e0ef618e8352e569) ) // cards deck gfx, bitplane2 + ROM_COPY( "gfx1", 0x4800, 0x2000, 0x0800 ) // cards deck gfx, bitplane3. + ROM_COPY( "gfx1", 0x5800, 0x2800, 0x0800 ) // cards deck alt gfx, bitplane3. + ROM_REGION( 0x0100, "proms", 0 ) ROM_LOAD( "mini.5d", 0x0000, 0x0100, CRC(7f31066b) SHA1(15420780ec6b2870fc4539ec3afe4f0c58eedf12) ) From adee79cf846d836b77c6743a16e1814f69d50f78 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Tue, 14 Jan 2025 12:57:19 +1100 Subject: [PATCH 07/80] util/mfpresolve.h: Fix build with MSVC ABI. All ABI paths must be valid C++ - can't use a static assertion. --- src/lib/util/mfpresolve.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/util/mfpresolve.h b/src/lib/util/mfpresolve.h index 4b4f62373d34f..eee3711ebeae5 100644 --- a/src/lib/util/mfpresolve.h +++ b/src/lib/util/mfpresolve.h @@ -46,8 +46,8 @@ inline std::pair resolve_member_function(Ret (T: { if (MAME_ABI_CXX_TYPE == MAME_ABI_CXX_ITANIUM) { - struct { uintptr_t ptr; ptrdiff_t adj; } equiv; - static_assert(sizeof(function) == sizeof(equiv)); + struct { std::uintptr_t ptr; std::ptrdiff_t adj; } equiv; + assert(sizeof(function) == sizeof(equiv)); *reinterpret_cast(&equiv) = function; return detail::resolve_member_function_itanium(equiv.ptr, equiv.adj, object); } @@ -68,7 +68,7 @@ inline std::pair resolve_member_function(Ret (T: if (MAME_ABI_CXX_TYPE == MAME_ABI_CXX_ITANIUM) { struct { std::uintptr_t ptr; std::ptrdiff_t adj; } equiv; - static_assert(sizeof(function) == sizeof(equiv)); + assert(sizeof(function) == sizeof(equiv)); *reinterpret_cast(&equiv) = function; return detail::resolve_member_function_itanium(equiv.ptr, equiv.adj, object); } From a0bcdfc011c46c6250e147b0e644ef01b0ded1dd Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Tue, 14 Jan 2025 03:58:49 +0100 Subject: [PATCH 08/80] lependu.cpp driver improvements [Roberto Fresca, Grull Osgo]: * Created new machine config for Code Magik. * Added proper PIAs connections for Code Magik. * Added lamps set for Code Magik. * Added button-lamps layout for Code Magik. * Inputs from the scratch for Code Magik. --- src/mame/misc/lependu.cpp | 123 +++++++++++++++++++++++++++++++++++--- 1 file changed, 116 insertions(+), 7 deletions(-) diff --git a/src/mame/misc/lependu.cpp b/src/mame/misc/lependu.cpp index a31fa608577b2..93c8452970cce 100644 --- a/src/mame/misc/lependu.cpp +++ b/src/mame/misc/lependu.cpp @@ -87,6 +87,7 @@ #include "tilemap.h" #include "lependu.lh" +#include "codemagik.lh" namespace { @@ -115,10 +116,13 @@ class lependu_state : public driver_device { } void lependu(machine_config &config); + void codemagik(machine_config &config); void init_lependu(); void lamps_w(uint8_t data); + void lamps_cm_w(uint8_t data); + void sound_w(uint8_t data); void mux_w(uint8_t data); @@ -146,12 +150,13 @@ class lependu_state : public driver_device void lependu_map(address_map &map) ATTR_COLD; uint8_t lependu_mux_port_r(); + void pia0_ca2_w(int state); required_shared_ptr m_videoram; required_shared_ptr m_colorram; required_memory_bank_array<2> m_bank; required_ioport_array<4> m_input; - output_finder<5> m_lamps; + output_finder<6> m_lamps; tilemap_t *m_bg_tilemap = nullptr; uint8_t m_mux_data = 0xff; @@ -289,6 +294,25 @@ void lependu_state::lamps_w(uint8_t data) m_lamps[i] = BIT(~data, i + 3); } +void lependu_state::lamps_cm_w(uint8_t data) +{ +/********** General Lamps wiring *********** + + 7654 3210 + ---- ---x Unused. + ---- --x- Unused. + ---- -x-- Unused. + ---- x--- Button 5. + ---x ---- Button 2. + --x- ---- Button 3. + -x-- ---- Button 1. + x--- ---- Button 4. + +*/ + for (int i = 0; i < 6 ; i++) + m_lamps[i] = BIT(~data, i); +} + void lependu_state::sound_w(uint8_t data) { @@ -300,6 +324,9 @@ void lependu_state::sound_w(uint8_t data) m_discrete->write(NODE_10, data & 0x07); } +void lependu_state::pia0_ca2_w(int state) +{ +} /********************************************* * Memory Map Information * @@ -308,12 +335,12 @@ void lependu_state::sound_w(uint8_t data) void lependu_state::lependu_map(address_map &map) { map(0x0000, 0x07ff).ram().share("nvram"); + map(0x0800, 0x0bff).ram().w(FUNC(lependu_state::lependu_videoram_w)).share("videoram"); + map(0x0c00, 0x0fff).ram().w(FUNC(lependu_state::lependu_colorram_w)).share("colorram"); map(0x10b0, 0x10b0).w("crtc", FUNC(mc6845_device::address_w)); map(0x10b1, 0x10b1).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); map(0x10f4, 0x10f7).rw("pia0", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); map(0x10f8, 0x10fb).rw("pia1", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); - map(0x0800, 0x0bff).ram().w(FUNC(lependu_state::lependu_videoram_w)).share("videoram"); - map(0x0c00, 0x0fff).ram().w(FUNC(lependu_state::lependu_colorram_w)).share("colorram"); map(0x8000, 0x9fff).bankr("bank0"); map(0xa000, 0xbfff).bankr("bank1"); map(0xc000, 0xffff).rom(); @@ -412,6 +439,77 @@ static INPUT_PORTS_START(lependu) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END +static INPUT_PORTS_START(codemagik) + // Multiplexed - 4x5bits + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_M) PORT_NAME("Mise") // mise + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Service / Test") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_1) PORT_NAME("Carte / Done") // done/deal + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_V) PORT_NAME("BUTTON 4") // cancel + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Z) PORT_NAME("BUTTON 1") // <-- + PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN.1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_2) PORT_NAME("IN1-1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_3) PORT_NAME("IN1-2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_X) PORT_NAME("BUTTON 2") // --> + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_B) PORT_NAME("BUTTON 5") // fin + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_C) PORT_NAME("BUTTON 3") // choice + PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN.2") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.3") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) // 25c coin + PORT_BIT( 0xfb, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("SW1") + // only bits 4-7 are connected here and were routed to SW1 1-4 + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1") + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("SW2") // just for test + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + /********************************************* * Graphics Layouts * @@ -546,6 +644,7 @@ void lependu_state::lependu(machine_config &config) PIA6821(config, m_pia[0]); m_pia[0]->readpa_handler().set(FUNC(lependu_state::lependu_mux_port_r)); m_pia[0]->writepb_handler().set(FUNC(lependu_state::lamps_w)); + m_pia[0]->ca2_handler().set(FUNC(lependu_state::pia0_ca2_w)); PIA6821(config, m_pia[1]); m_pia[1]->readpa_handler().set_ioport("SW1"); @@ -572,6 +671,17 @@ void lependu_state::lependu(machine_config &config) DISCRETE(config, m_discrete, lependu_discrete).add_route(ALL_OUTPUTS, "mono", 1.0); } +void lependu_state::codemagik(machine_config &config) +{ + lependu(config); + + // basic machine hardware + PIA6821(config.replace(), m_pia[0]); + m_pia[0]->readpa_handler().set(FUNC(lependu_state::lependu_mux_port_r)); + m_pia[0]->writepb_handler().set(FUNC(lependu_state::lamps_cm_w)); + m_pia[0]->ca2_handler().set(FUNC(lependu_state::pia0_ca2_w)); +} + /********************************************* * Rom Load * @@ -598,7 +708,6 @@ ROM_START( lependu ) ROM_COPY( "gfx1", 0x4800, 0x2000, 0x0800 ) // cards deck gfx, bitplane3. ROM_COPY( "gfx1", 0x5800, 0x2800, 0x0800 ) // cards deck alt gfx, bitplane3. - ROM_REGION( 0x0100, "proms", 0 ) ROM_LOAD( "mini.5d", 0x0000, 0x0100, CRC(7f31066b) SHA1(15420780ec6b2870fc4539ec3afe4f0c58eedf12) ) ROM_END @@ -676,6 +785,6 @@ void lependu_state::init_lependu() * Game Drivers * *********************************************/ -// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS LAYOUT -GAMEL( 198?, lependu, 0, lependu, lependu, lependu_state, init_lependu, ROT0, "Avenir Amusement Inc.", "Le Pendu (Bilingue, Version 04)", 0, layout_lependu ) -GAMEL( 198?, codemagik, 0, lependu, lependu, lependu_state, empty_init, ROT0, "Voyageur de L'Espace Inc.", "Code Magik", MACHINE_NOT_WORKING, layout_lependu ) +// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS LAYOUT +GAMEL( 198?, lependu, 0, lependu, lependu, lependu_state, init_lependu, ROT0, "Avenir Amusement Inc.", "Le Pendu (Bilingue, Version 04)", 0, layout_lependu ) +GAMEL( 198?, codemagik, 0, codemagik, codemagik, lependu_state, empty_init, ROT0, "Voyageur de L'Espace Inc.", "Code Magik", MACHINE_NOT_WORKING, layout_codemagik ) From af7cf3b55c3da2c33892d1d1efe1996b7d20fa08 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Tue, 14 Jan 2025 04:19:09 +0100 Subject: [PATCH 09/80] Code Magik: Standardized inputs. --- src/mame/layout/codemagik.lay | 153 ++++++++++++++++++++++++++++++++++ src/mame/misc/lependu.cpp | 20 ++--- 2 files changed, 163 insertions(+), 10 deletions(-) create mode 100644 src/mame/layout/codemagik.lay diff --git a/src/mame/layout/codemagik.lay b/src/mame/layout/codemagik.lay new file mode 100644 index 0000000000000..688b8da801e52 --- /dev/null +++ b/src/mame/layout/codemagik.lay @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/misc/lependu.cpp b/src/mame/misc/lependu.cpp index 93c8452970cce..1d57b0fd345d3 100644 --- a/src/mame/misc/lependu.cpp +++ b/src/mame/misc/lependu.cpp @@ -442,19 +442,19 @@ INPUT_PORTS_END static INPUT_PORTS_START(codemagik) // Multiplexed - 4x5bits PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_M) PORT_NAME("Mise") // mise - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Service / Test") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_1) PORT_NAME("Carte / Done") // done/deal - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_V) PORT_NAME("BUTTON 4") // cancel - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Z) PORT_NAME("BUTTON 1") // <-- + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) PORT_NAME("Mise") // mise/bet + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) PORT_NAME("Service / Test") // test + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL ) PORT_NAME("Carte / Exit") // carte/deal/exit + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) PORT_NAME("BUTTON 4") // cancel + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("BUTTON 1") // <-- PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START("IN.1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_2) PORT_NAME("IN1-1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_3) PORT_NAME("IN1-2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_X) PORT_NAME("BUTTON 2") // --> - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_B) PORT_NAME("BUTTON 5") // fin - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_C) PORT_NAME("BUTTON 3") // choice + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("BUTTON 2") // --> + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_NAME("BUTTON 5") // fin + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME("BUTTON 3") // choice PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START("IN.2") From ab6b6fc9e7971b367ec54d565cf10f04e71109ec Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Tue, 14 Jan 2025 13:53:33 +0700 Subject: [PATCH 10/80] x68k: add serial mouse --- src/mame/sharp/x68k.cpp | 169 ++++------------------------------ src/mame/sharp/x68k.h | 24 +---- src/mame/sharp/x68k_mouse.cpp | 103 +++++++++++++++++++++ src/mame/sharp/x68k_mouse.h | 36 ++++++++ 4 files changed, 158 insertions(+), 174 deletions(-) create mode 100644 src/mame/sharp/x68k_mouse.cpp create mode 100644 src/mame/sharp/x68k_mouse.h diff --git a/src/mame/sharp/x68k.cpp b/src/mame/sharp/x68k.cpp index 8e5def0a501a6..c6787eeef393d 100644 --- a/src/mame/sharp/x68k.cpp +++ b/src/mame/sharp/x68k.cpp @@ -119,6 +119,7 @@ #include "x68k.h" #include "x68k_hdc.h" #include "x68k_kbd.h" +#include "x68k_mouse.h" #include "machine/nvram.h" @@ -174,127 +175,6 @@ TIMER_CALLBACK_MEMBER(x68k_state::led_callback) } - -// mouse input -// port B of the Z8530 SCC -// typically read from the SCC data port on receive buffer full interrupt per byte -int x68k_state::read_mouse() -{ - char val = 0; - char ipt = 0; - - if(!(m_scc->get_reg_b(5) & 0x02)) - return 0xff; - - switch(m_mouse.inputtype) - { - case 0: - ipt = m_mouse1->read(); - break; - case 1: - val = m_mouse2->read(); - ipt = val - m_mouse.last_mouse_x; - m_mouse.last_mouse_x = val; - break; - case 2: - val = m_mouse3->read(); - ipt = val - m_mouse.last_mouse_y; - m_mouse.last_mouse_y = val; - break; - } - m_mouse.inputtype++; - if(m_mouse.inputtype > 2) - { - int i_val = m_scc->get_reg_b(0); - m_mouse.inputtype = 0; - m_mouse.bufferempty = 1; - i_val &= ~0x01; - m_scc->set_reg_b(0, i_val); - LOGMASKED(LOG_SYS, "SCC: mouse buffer empty\n"); - } - - return ipt; -} - -/* - 0xe98001 - Z8530 command port B - 0xe98003 - Z8530 data port B (mouse input) - 0xe98005 - Z8530 command port A - 0xe98007 - Z8530 data port A (RS232) -*/ -uint16_t x68k_state::scc_r(offs_t offset) -{ - offset %= 4; - switch(offset) - { - case 0: - return m_scc->reg_r(0); - case 1: - return read_mouse(); - case 2: - return m_scc->reg_r(1); - case 3: - return m_scc->reg_r(3); - default: - return 0xff; - } -} - -void x68k_state::scc_w(offs_t offset, uint16_t data) -{ - offset %= 4; - - switch(offset) - { - case 0: - m_scc->reg_w(0,(uint8_t)data); - if((m_scc->get_reg_b(5) & 0x02) != m_scc_prev) - { - if(m_scc->get_reg_b(5) & 0x02) // Request to Send - { - int val = m_scc->get_reg_b(0); - m_mouse.bufferempty = 0; - val |= 0x01; - m_scc->set_reg_b(0,val); - } - } - break; - case 1: - m_scc->reg_w(2,(uint8_t)data); - break; - case 2: - m_scc->reg_w(1,(uint8_t)data); - break; - case 3: - m_scc->reg_w(3,(uint8_t)data); - break; - } - m_scc_prev = m_scc->get_reg_b(5) & 0x02; -} - -TIMER_CALLBACK_MEMBER(x68k_state::scc_ack) -{ - if(m_mouse.bufferempty != 0) // nothing to do if the mouse data buffer is empty - return; - -// if((m_ioc.irqstatus & 0xc0) != 0) -// return; - - // hard-code the IRQ vector for now, until the SCC code is more complete - if((m_scc->get_reg_a(9) & 0x08) || (m_scc->get_reg_b(9) & 0x08)) // SCC reg WR9 is the same for both channels - { - if((m_scc->get_reg_b(1) & 0x18) != 0) // if bits 3 and 4 of WR1 are 0, then Rx IRQs are disabled on this channel - { - if(m_scc->get_reg_b(5) & 0x02) // RTS signal - { - m_mouse.irqactive = true; - m_mouse.irqvector = 0x54; - update_ipl(); - } - } - } -} - void x68k_state::set_adpcm() { uint32_t rate = adpcm_div[m_adpcm.rate]; @@ -833,7 +713,7 @@ void x68k_state::update_ipl() new_ipl = 7; else if (m_mfp_int) new_ipl = 6; - else if (m_mouse.irqactive) + else if (m_scc_int) new_ipl = 5; else if (m_exp_irq4[0] || m_exp_irq4[1]) new_ipl = 4; @@ -946,18 +826,6 @@ uint8_t x68k_state::iack4() return 0x18; // spurious interrupt } -uint8_t x68k_state::iack5() -{ - if (!machine().side_effects_disabled()) - { - m_mouse.irqactive = false; - update_ipl(); - } - - // TODO: use vector from SCC - return m_mouse.irqvector; -} - void x68k_state::cpu_space_map(address_map &map) { map.global_mask(0xffffff); @@ -965,7 +833,7 @@ void x68k_state::cpu_space_map(address_map &map) map(0xfffff5, 0xfffff5).r(FUNC(x68k_state::iack2)); map(0xfffff7, 0xfffff7).r(m_hd63450, FUNC(hd63450_device::iack)); map(0xfffff9, 0xfffff9).r(FUNC(x68k_state::iack4)); - map(0xfffffb, 0xfffffb).r(FUNC(x68k_state::iack5)); + map(0xfffffb, 0xfffffb).lr8(NAME([this]() { return m_scc->m1_r(); })); map(0xfffffd, 0xfffffd).r(m_mfpdev, FUNC(mc68901_device::get_vector)); map(0xffffff, 0xffffff).lr8(NAME([] () { return m68000_base_device::autovector(7); })); } @@ -1005,7 +873,7 @@ void x68k_state::x68k_base_map(address_map &map) map(0xe90000, 0xe91fff).rw(m_ym2151, FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask16(0x00ff); map(0xe94000, 0xe94003).m(m_upd72065, FUNC(upd72065_device::map)).umask16(0x00ff); map(0xe94004, 0xe94007).rw(FUNC(x68k_state::fdc_r), FUNC(x68k_state::fdc_w)); - map(0xe98000, 0xe99fff).rw(FUNC(x68k_state::scc_r), FUNC(x68k_state::scc_w)); + map(0xe98000, 0xe99fff).rw(m_scc, FUNC(scc8530_device::ab_dc_r), FUNC(scc8530_device::ab_dc_w)).umask16(0x00ff); map(0xe9a000, 0xe9bfff).rw(FUNC(x68k_state::ppi_r), FUNC(x68k_state::ppi_w)); map(0xe9c000, 0xe9dfff).rw(FUNC(x68k_state::ioc_r), FUNC(x68k_state::ioc_w)); map(0xe9e000, 0xe9e3ff).rw(FUNC(x68k_state::exp_r), FUNC(x68k_state::exp_w)); // FPU (Optional) @@ -1068,16 +936,6 @@ static INPUT_PORTS_START( x68000 ) PORT_CONFNAME( 0x02, 0x02, "Enable fake bus errors") PORT_CONFSETTING( 0x00, DEF_STR( Off )) PORT_CONFSETTING( 0x02, DEF_STR( On )) - - PORT_START("mouse1") // mouse buttons - PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_BUTTON9) PORT_NAME("Left mouse button") PORT_CODE(MOUSECODE_BUTTON1) - PORT_BIT( 0x00000002, IP_ACTIVE_HIGH, IPT_BUTTON10) PORT_NAME("Right mouse button") PORT_CODE(MOUSECODE_BUTTON2) - - PORT_START("mouse2") // X-axis - PORT_BIT( 0xff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1) - - PORT_START("mouse3") // Y-axis - PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1) INPUT_PORTS_END void x68k_state::floppy_load_unload(bool load, floppy_image_device *dev) @@ -1151,10 +1009,6 @@ void x68k_state::machine_start() m_spriteram = (uint16_t*)(memregion("user1")->base()); space.install_ram(0x000000,m_ram->size()-1,m_ram->pointer()); - // start mouse timer - m_mouse_timer->adjust(attotime::zero, 0, attotime::from_msec(1)); // a guess for now - m_mouse.inputtype = 0; - // start LED timer m_led_timer->adjust(attotime::zero, 0, attotime::from_msec(400)); @@ -1173,11 +1027,11 @@ void x68k_state::machine_start() m_dmac_int = false; m_mfp_int = false; + m_scc_int = false; m_exp_irq2[0] = m_exp_irq2[1] = false; m_exp_irq4[0] = m_exp_irq4[1] = false; m_exp_nmi[0] = m_exp_nmi[1] = false; m_ioc.irqstatus = 0; - m_mouse.irqactive = false; m_current_ipl = 0; m_adpcm.rate = 0; m_adpcm.clock = 0; @@ -1204,7 +1058,6 @@ void x68k_state::driver_start() // copy last half of BIOS to a user region, to use for initial startup memcpy(user2,(rom+0xff0000),0x10000); - m_mouse_timer = timer_alloc(FUNC(x68ksupr_state::scc_ack), this); m_led_timer = timer_alloc(FUNC(x68ksupr_state::led_callback), this); m_fdc_tc = timer_alloc(FUNC(x68ksupr_state::floppy_tc_tick), this); m_adpcm_timer = timer_alloc(FUNC(x68ksupr_state::adpcm_drq_tick), this); @@ -1249,6 +1102,11 @@ static void keyboard_devices(device_slot_interface &device) device.option_add("x68k", X68K_KEYBOARD); } +static void mouse_devices(device_slot_interface &device) +{ + device.option_add("x68k", X68K_MOUSE); +} + void x68k_state::x68000_base(machine_config &config) { config.set_maximum_quantum(attotime::from_hz(60)); @@ -1281,7 +1139,12 @@ void x68k_state::x68000_base(machine_config &config) m_hd63450->dma_read<0>().set("upd72065", FUNC(upd72065_device::dma_r)); m_hd63450->dma_write<0>().set("upd72065", FUNC(upd72065_device::dma_w)); - SCC8530(config, m_scc, 40_MHz_XTAL / 8); + SCC8530N(config, m_scc, 40_MHz_XTAL / 8); + m_scc->out_int_callback().set([this](int state) { m_scc_int = state; update_ipl(); }); + + rs232_port_device &mouse(RS232_PORT(config, "mouse_port", mouse_devices, "x68k")); + mouse.rxd_handler().set(m_scc, FUNC(scc8530_device::rxb_w)); + m_scc->out_rtsb_callback().set(mouse, FUNC(rs232_port_device::write_rts)); RP5C15(config, m_rtc, 32.768_kHz_XTAL); m_rtc->alarm().set(m_mfpdev, FUNC(mc68901_device::i0_w)); diff --git a/src/mame/sharp/x68k.h b/src/mame/sharp/x68k.h index 2c1dc8552af67..b5c40b213b6bb 100644 --- a/src/mame/sharp/x68k.h +++ b/src/mame/sharp/x68k.h @@ -20,7 +20,7 @@ #include "cpu/m68000/m68000.h" #include "cpu/m68000/m68030.h" #include "imagedev/floppy.h" -#include "machine/8530scc.h" +#include "machine/z80scc.h" #include "machine/hd63450.h" #include "machine/i8255.h" #include "machine/mb87030.h" @@ -64,9 +64,6 @@ class x68k_state : public driver_device , m_expansion(*this, "exp%u", 1U) , m_adpcm_out(*this, {"adpcm_outl", "adpcm_outr"}) , m_options(*this, "options") - , m_mouse1(*this, "mouse1") - , m_mouse2(*this, "mouse2") - , m_mouse3(*this, "mouse3") , m_eject_drv_out(*this, "eject_drv%u", 0U) , m_ctrl_drv_out(*this, "ctrl_drv%u", 0U) , m_access_drv_out(*this, "access_drv%u", 0U) @@ -100,7 +97,7 @@ class x68k_state : public driver_device required_device m_pcgpalette; required_device m_mfpdev; required_device m_rtc; - required_device m_scc; + required_device m_scc; required_device m_ym2151; required_device m_ppi; required_device m_screen; @@ -111,9 +108,6 @@ class x68k_state : public driver_device required_device_array m_adpcm_out; required_ioport m_options; - required_ioport m_mouse1; - required_ioport m_mouse2; - required_ioport m_mouse3; output_finder<4> m_eject_drv_out; output_finder<4> m_ctrl_drv_out; @@ -178,24 +172,15 @@ class x68k_state : public driver_device uint8_t hdcvector = 0; uint8_t prnvector = 0; } m_ioc; - struct - { - int inputtype = 0; // determines which input is to be received - bool irqactive = false; // true if IRQ is being serviced - uint8_t irqvector = 0; - char last_mouse_x = 0; // previous mouse x-axis value - char last_mouse_y = 0; // previous mouse y-axis value - int bufferempty = 0; // non-zero if buffer is empty - } m_mouse; uint8_t m_ppi_portc = 0; bool m_dmac_int = false; bool m_mfp_int = false; + bool m_scc_int = false; bool m_exp_irq2[2]{}; bool m_exp_irq4[2]{}; bool m_exp_nmi[2]{}; uint8_t m_current_ipl = 0; int m_led_state = 0; - emu_timer* m_mouse_timer = nullptr; emu_timer* m_led_timer = nullptr; unsigned char m_scc_prev = 0; emu_timer* m_fdc_tc = nullptr; @@ -233,7 +218,6 @@ class x68k_state : public driver_device void dma_irq(int state); void dma_end(offs_t offset, uint8_t data); - int read_mouse(); void set_adpcm(); void fm_irq(int state); @@ -241,8 +225,6 @@ class x68k_state : public driver_device template void irq4_line(int state); template void nmi_line(int state); - void scc_w(offs_t offset, uint16_t data); - uint16_t scc_r(offs_t offset); void fdc_w(offs_t offset, uint16_t data); uint16_t fdc_r(offs_t offset); void ioc_w(offs_t offset, uint16_t data); diff --git a/src/mame/sharp/x68k_mouse.cpp b/src/mame/sharp/x68k_mouse.cpp new file mode 100644 index 0000000000000..f30cfc7d25d54 --- /dev/null +++ b/src/mame/sharp/x68k_mouse.cpp @@ -0,0 +1,103 @@ +// license:BSD-3-Clause +// copyright-holders:Patrick Mackinlay + +#include "emu.h" +#include "x68k_mouse.h" + +#include + +//#define VERBOSE (LOG_GENERAL) +#include "logmacro.h" + +enum status_mask : u8 +{ + STS_RB = 0x01, // right button + STS_LB = 0x02, // left button + STS_OX = 0x10, // x overflow + STS_UX = 0x20, // x underflow + STS_OY = 0x40, // y overflow + STS_UY = 0x80, // y underflow +}; + +DEFINE_DEVICE_TYPE(X68K_MOUSE, x68k_mouse_device, "x68k_mouse", "Sharp X68000 Mouse") + +x68k_mouse_device::x68k_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) + : buffered_rs232_device<3>(mconfig, X68K_MOUSE, tag, owner, clock) + , m_buttons(*this, "BTN") + , m_x_axis(*this, "X") + , m_y_axis(*this, "Y") +{ +} + +void x68k_mouse_device::device_start() +{ + buffered_rs232_device<3>::device_start(); + + save_item(NAME(m_b)); + save_item(NAME(m_x)); + save_item(NAME(m_y)); + + set_data_frame(1, 8, PARITY_NONE, STOP_BITS_2); + set_tra_rate(4'800); + + transmit_register_reset(); + + m_b = 0; + m_x = 0; + m_y = 0; +} + +s16 read_axis(ioport_port &port, u16 &old_val) +{ + u16 const new_val = port.read(); + s16 const delta = new_val - old_val; + + old_val = new_val; + + return delta; +} + +void x68k_mouse_device::input_rts(int state) +{ + if (!state && fifo_empty()) + { + u8 status = m_buttons->read(); + s16 const dx = read_axis(*m_x_axis, m_x); + s16 const dy = read_axis(*m_y_axis, m_y); + + if (dx || dy || m_b != status) + { + if (dy < -128) + status |= STS_UY; + if (dy > 127) + status |= STS_OY; + if (dx < -128) + status |= STS_UX; + if (dx > 127) + status |= STS_OX; + + transmit_byte(status); + transmit_byte(s8(std::clamp(dx, -128, 127))); + transmit_byte(s8(std::clamp(dy, -128, 127))); + + m_b = status & (STS_LB | STS_RB); + } + } +} + +INPUT_PORTS_START(x68k) + PORT_START("BTN") + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_CODE(MOUSECODE_BUTTON1) + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_CODE(MOUSECODE_BUTTON2) + + PORT_START("X") + PORT_BIT(0xfff, 0x000, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) + + PORT_START("Y") + PORT_BIT(0xfff, 0x000, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) +INPUT_PORTS_END + +ioport_constructor x68k_mouse_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(x68k); +} diff --git a/src/mame/sharp/x68k_mouse.h b/src/mame/sharp/x68k_mouse.h new file mode 100644 index 0000000000000..9028c831fe47e --- /dev/null +++ b/src/mame/sharp/x68k_mouse.h @@ -0,0 +1,36 @@ +// license:BSD-3-Clause +// copyright-holders:Patrick Mackinlay + +#ifndef MAME_SHARP_X68K_MOUSE_H +#define MAME_SHARP_X68K_MOUSE_H + +#pragma once + +#include "bus/rs232/rs232.h" + +class x68k_mouse_device : public buffered_rs232_device<3> +{ +public: + x68k_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock = 0); + + virtual void input_rts(int state) override; // MSCTRL (active low) + +protected: + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + virtual void device_start() override ATTR_COLD; + + virtual void received_byte(u8 byte) override {} + +private: + required_ioport m_buttons; + required_ioport m_x_axis; + required_ioport m_y_axis; + + u8 m_b; + u16 m_x; + u16 m_y; +}; + +DECLARE_DEVICE_TYPE(X68K_MOUSE, x68k_mouse_device) + +#endif // MAME_SHARP_X68K_MOUSE_H From 2e17f70c2322b6e42b81a71f02a62b45c65fe8dc Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Tue, 14 Jan 2025 14:24:13 +0700 Subject: [PATCH 11/80] 8530scc: retire legacy device --- scripts/src/machine.lua | 12 - src/devices/bus/interpro/sr/edge.cpp | 6 +- src/devices/bus/interpro/sr/gt.cpp | 2 +- src/devices/bus/nubus/quadralink.cpp | 4 +- src/devices/bus/vme/hk68v10.cpp | 2 +- src/devices/machine/8530scc.cpp | 635 --------------------------- src/devices/machine/8530scc.h | 105 ----- src/devices/machine/z80scc.cpp | 4 +- src/devices/machine/z80scc.h | 2 +- src/mame/acorn/aa310.cpp | 2 +- src/mame/apple/lisa.h | 4 +- src/mame/apple/lisa_m.cpp | 4 +- src/mame/apple/lwriter.cpp | 2 +- src/mame/apple/macquadra700.cpp | 2 +- src/mame/atari/atarist.cpp | 2 +- src/mame/ausnz/applix.cpp | 2 +- src/mame/barcrest/mpu4plasma.cpp | 2 +- src/mame/ceres/ceres.cpp | 2 +- src/mame/ibm/rtpc.cpp | 2 +- src/mame/informer/informer_213.cpp | 2 +- src/mame/luxor/abc1600.cpp | 2 +- src/mame/luxor/ds90.cpp | 6 +- src/mame/misc/hotstuff.cpp | 4 +- src/mame/misc/micro3d.cpp | 2 +- src/mame/misc/triplex.cpp | 2 +- src/mame/next/next.cpp | 4 +- src/mame/next/next.h | 4 +- src/mame/sharp/x68k.cpp | 2 +- src/mame/skeleton/clxvme186.cpp | 2 +- src/mame/skeleton/digilog320.cpp | 4 +- src/mame/skeleton/lft.cpp | 2 +- src/mame/sun/sun2.cpp | 8 +- src/mame/sun/sun3.cpp | 8 +- src/mame/sun/sun3x.cpp | 8 +- src/mame/tektronix/tekigw.cpp | 2 +- 35 files changed, 53 insertions(+), 805 deletions(-) delete mode 100644 src/devices/machine/8530scc.cpp delete mode 100644 src/devices/machine/8530scc.h diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua index a79fe0654bf33..1e5ffa1dce042 100644 --- a/scripts/src/machine.lua +++ b/scripts/src/machine.lua @@ -617,18 +617,6 @@ if (MACHINES["KBDC8042"]~=null) then } end ---------------------------------------------------- --- ---@src/devices/machine/8530scc.h,MACHINES["8530SCC"] = true ---------------------------------------------------- - -if (MACHINES["8530SCC"]~=null) then - files { - MAME_DIR .. "src/devices/machine/8530scc.cpp", - MAME_DIR .. "src/devices/machine/8530scc.h", - } -end - --------------------------------------------------- -- --@src/devices/machine/adc0804.h,MACHINES["ADC0804"] = true diff --git a/src/devices/bus/interpro/sr/edge.cpp b/src/devices/bus/interpro/sr/edge.cpp index 45429a1e62762..4d4df1113a17a 100644 --- a/src/devices/bus/interpro/sr/edge.cpp +++ b/src/devices/bus/interpro/sr/edge.cpp @@ -478,7 +478,7 @@ void mpcb828_device::device_add_mconfig(machine_config &config) BT458(config, "ramdac", 83'020'800); - SCC8530N(config, m_scc, 4.9152_MHz_XTAL); + SCC8530(config, m_scc, 4.9152_MHz_XTAL); m_scc->out_int_callback().set(FUNC(mpcb828_device::scc_irq)); m_scc->out_txda_callback().set("kbd", FUNC(interpro_keyboard_port_device::write_txd)); @@ -509,7 +509,7 @@ void mpcb849_device::device_add_mconfig(machine_config &config) BT458(config, "ramdac", 0); // unconfirmed clock - SCC8530N(config, m_scc, 4.9152_MHz_XTAL); + SCC8530(config, m_scc, 4.9152_MHz_XTAL); m_scc->out_int_callback().set(FUNC(mpcb849_device::scc_irq)); m_scc->out_txda_callback().set("kbd", FUNC(interpro_keyboard_port_device::write_txd)); @@ -561,7 +561,7 @@ void msmt094_device::device_add_mconfig(machine_config &config) //TMS32030(config, m_dsp3, 40_MHz_XTAL); // FIXME: actually Z0853006VSC - scc8530_device& scc(SCC8530N(config, "scc", 4.9152_MHz_XTAL)); + scc8530_device& scc(SCC8530(config, "scc", 4.9152_MHz_XTAL)); scc.out_int_callback().set(FUNC(msmt094_device::scc_irq)); scc.out_txda_callback().set("kbd", FUNC(interpro_keyboard_port_device::write_txd)); diff --git a/src/devices/bus/interpro/sr/gt.cpp b/src/devices/bus/interpro/sr/gt.cpp index bae9a72f739a7..5a7dc3c4639b7 100644 --- a/src/devices/bus/interpro/sr/gt.cpp +++ b/src/devices/bus/interpro/sr/gt.cpp @@ -309,7 +309,7 @@ void gtdb_device::device_add_mconfig(machine_config &config) { gt_device_base::device_add_mconfig(config); - SCC8530N(config, m_scc, 4.9152_MHz_XTAL); + SCC8530(config, m_scc, 4.9152_MHz_XTAL); interpro_keyboard_port_device &keyboard(INTERPRO_KEYBOARD_PORT(config, "kbd", interpro_keyboard_devices, "lle_en_us")); keyboard.rxd_handler_cb().set(m_scc, FUNC(z80scc_device::rxa_w)); diff --git a/src/devices/bus/nubus/quadralink.cpp b/src/devices/bus/nubus/quadralink.cpp index 0e6ecd1a567da..7088c1df9de8c 100644 --- a/src/devices/bus/nubus/quadralink.cpp +++ b/src/devices/bus/nubus/quadralink.cpp @@ -39,11 +39,11 @@ DEFINE_DEVICE_TYPE(NUBUS_QUADRALINK, nubus_quadralink_device, "nb_qdlink", "Appl void nubus_quadralink_device::device_add_mconfig(machine_config &config) { - SCC8530N(config, m_scc1, 3.6864_MHz_XTAL); + SCC8530(config, m_scc1, 3.6864_MHz_XTAL); m_scc1->out_txda_callback().set("serport0", FUNC(rs232_port_device::write_txd)); m_scc1->out_txdb_callback().set("serport1", FUNC(rs232_port_device::write_txd)); - SCC8530N(config, m_scc2, 3.6864_MHz_XTAL); + SCC8530(config, m_scc2, 3.6864_MHz_XTAL); m_scc2->out_txda_callback().set("serport2", FUNC(rs232_port_device::write_txd)); m_scc2->out_txdb_callback().set("serport3", FUNC(rs232_port_device::write_txd)); diff --git a/src/devices/bus/vme/hk68v10.cpp b/src/devices/bus/vme/hk68v10.cpp index afee4bd1988f9..c821a421305c3 100644 --- a/src/devices/bus/vme/hk68v10.cpp +++ b/src/devices/bus/vme/hk68v10.cpp @@ -299,7 +299,7 @@ void vme_hk68v10_card_device::device_add_mconfig(machine_config &config) Z8536(config, "cio", SCC_CLOCK); /* Terminal Port config */ - SCC8530N(config, m_sccterm, SCC_CLOCK); + SCC8530(config, m_sccterm, SCC_CLOCK); m_sccterm->out_txda_callback().set("rs232trm", FUNC(rs232_port_device::write_txd)); m_sccterm->out_dtra_callback().set("rs232trm", FUNC(rs232_port_device::write_dtr)); m_sccterm->out_rtsa_callback().set("rs232trm", FUNC(rs232_port_device::write_rts)); diff --git a/src/devices/machine/8530scc.cpp b/src/devices/machine/8530scc.cpp deleted file mode 100644 index 72e438366dbb4..0000000000000 --- a/src/devices/machine/8530scc.cpp +++ /dev/null @@ -1,635 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:R. Belmont -/********************************************************************* - - 8530scc.c - - Zilog 8530 SCC (Serial Control Chip) code - -*********************************************************************/ - - -#include "emu.h" -#include "8530scc.h" - -DEFINE_DEVICE_TYPE(SCC8530, scc8530_legacy_device, "scc8530l", "Zilog 8530 SCC (legacy)") - - -/*************************************************************************** - PARAMETERS -***************************************************************************/ - -#define VERBOSE (0) -#include "logmacro.h" - -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ - -scc8530_legacy_device::scc8530_legacy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, SCC8530, tag, owner, clock), - mode(0), reg(0), status(0), IRQV(0), MasterIRQEnable(0), lastIRQStat(0), IRQType(), - intrq_cb(*this) -{ -} - - -/*------------------------------------------------- - scc_updateirqs --------------------------------------------------*/ - -void scc8530_legacy_device::updateirqs() -{ - int irqstat; - - irqstat = 0; - if (MasterIRQEnable) - { - if ((channel[0].txIRQEnable) && (channel[0].txIRQPending)) - { - IRQType = IRQ_B_TX; - irqstat = 1; - } - else if ((channel[1].txIRQEnable) && (channel[1].txIRQPending)) - { - IRQType = IRQ_A_TX; - irqstat = 1; - } - else if ((channel[0].extIRQEnable) && (channel[0].extIRQPending)) - { - IRQType = IRQ_B_EXT; - irqstat = 1; - } - else if ((channel[1].extIRQEnable) && (channel[1].extIRQPending)) - { - IRQType = IRQ_A_EXT; - irqstat = 1; - } - } - else - { - IRQType = IRQ_NONE; - } - -// printf("SCC: irqstat %d, last %d\n", irqstat, lastIRQStat); -// printf("ch0: en %d pd %d ch1: en %d pd %d\n", channel[0].txIRQEnable, channel[0].txIRQPending, channel[1].txIRQEnable, channel[1].txIRQPending); - - // don't spam the driver with unnecessary transitions - if (irqstat != lastIRQStat) - { - lastIRQStat = irqstat; - - // tell the driver the new IRQ line status if possible - LOG("SCC8530 IRQ status => %d\n", irqstat); - intrq_cb(irqstat); - } -} - -/*------------------------------------------------- - scc_initchannel --------------------------------------------------*/ -void scc8530_legacy_device::initchannel(int ch) -{ - channel[ch].syncHunt = 1; -} - -/*------------------------------------------------- - scc_resetchannel --------------------------------------------------*/ -void scc8530_legacy_device::resetchannel(int ch) -{ - emu_timer *timersave = channel[ch].baudtimer; - - memset(&channel[ch], 0, sizeof(Chan)); - - channel[ch].txUnderrun = 1; - channel[ch].baudtimer = timersave; - - channel[ch].baudtimer->adjust(attotime::never, ch); -} - -/*------------------------------------------------- - updatebaudtimer - baud rate timer calculation --------------------------------------------------*/ - -void scc8530_legacy_device::updatebaudtimer(int ch) -{ - Chan *pChan = &channel[ch]; - // BR Generator Enable - if(!BIT(pChan->reg_val[14], 0)) - { - pChan->baudtimer->adjust(attotime::never, ch, attotime::never); - return; - } - - // BR Time Constant - int brconst = pChan->reg_val[13] << 8 | pChan->reg_val[12]; - - // Clock Mode is 1x, 16x, 32x, or 64x - int clockmode = pChan->reg_val[4] >> 6; - int clockrate = 1; - if (clockmode) - { - clockrate = 8 << clockmode; - } - - int baudrate = clock() / ((brconst + 2) * 2 * clockrate); - attotime attorate = attotime::from_hz(baudrate); - pChan->baudtimer->adjust(attorate, ch, attorate); -} - -/*------------------------------------------------- - baud_expire - baud rate timer expiry --------------------------------------------------*/ - -TIMER_CALLBACK_MEMBER(scc8530_legacy_device::baud_expire) -{ - Chan *pChan = &channel[param]; - - // always flag IRQ pending in case baud IRQ is enabled after this - pChan->baudIRQPending = 1; - if (pChan->baudIRQEnable) - { - if (pChan->extIRQEnable) - { - pChan->extIRQPending = 1; - pChan->baudIRQPending = 0; - updateirqs(); - } - } - updatebaudtimer(param); -} - -/*------------------------------------------------- - device_start - device-specific startup --------------------------------------------------*/ - -void scc8530_legacy_device::device_start() -{ - memset(channel, 0, sizeof(channel)); - - mode = 0; - reg = 0; - status = 0; - IRQV = 0; - MasterIRQEnable = 0; - lastIRQStat = 0; - IRQType = IRQ_NONE; - - channel[0].baudtimer = timer_alloc(FUNC(scc8530_legacy_device::baud_expire), this); - channel[1].baudtimer = timer_alloc(FUNC(scc8530_legacy_device::baud_expire), this); -} - - -/*------------------------------------------------- - device_reset - device-specific reset --------------------------------------------------*/ -void scc8530_legacy_device::device_reset() -{ - IRQType = IRQ_NONE; - MasterIRQEnable = 0; - IRQV = 0; - - initchannel(0); - initchannel(1); - resetchannel(0); - resetchannel(1); -} - -/*------------------------------------------------- - scc_set_status --------------------------------------------------*/ - -void scc8530_legacy_device::set_status(int _status) -{ - status = _status; -} - -/*------------------------------------------------- - scc_acknowledge --------------------------------------------------*/ - -void scc8530_legacy_device::acknowledge() -{ - intrq_cb(0); -} - -/*------------------------------------------------- - scc_getareg --------------------------------------------------*/ - -uint8_t scc8530_legacy_device::getareg() -{ - LOG("SCC: port A reg %d read 0x%02x\n", reg, channel[0].reg_val[reg]); - - if (reg == 0) - { - uint8_t rv = 0; - - Chan *ourCh = &channel[0]; - - rv |= (ourCh->txUnderrun) ? 0x40 : 0; - rv |= (ourCh->syncHunt) ? 0x10 : 0; - rv |= channel[0].reg_val[0] & 0x0D; // pick up TXBE, RXBF, DCD bits - - return rv; - } - else if (reg == 10) - { - return 0; - } - return channel[0].reg_val[reg]; -} - - - -/*------------------------------------------------- - scc_getareg --------------------------------------------------*/ - -uint8_t scc8530_legacy_device::getbreg() -{ - LOG("SCC: port B reg %i read 0x%02x\n", reg, channel[1].reg_val[reg]); - - if (reg == 0) - { - uint8_t rv = 0; - - Chan *ourCh = &channel[1]; - - rv |= (ourCh->txUnderrun) ? 0x40 : 0; - rv |= (ourCh->syncHunt) ? 0x10 : 0; - rv |= channel[1].reg_val[0] & 0x0D; // pick up TXBE, RXBF, DCD bits - - return rv; - } - else if (reg == 2) - { - /* HACK! but lets the Mac Plus mouse move again. Needs further investigation. */ - acknowledge(); - - return status; - } - else if (reg == 10) - { - return 0; - } - - return channel[1].reg_val[reg]; -} - - - -/*------------------------------------------------- - scc_putreg --------------------------------------------------*/ - -void scc8530_legacy_device::putreg(int ch, uint8_t data) -{ - Chan *pChan = &channel[ch]; - - channel[ch].reg_val[reg] = data; - LOG("SCC: port %c reg %d write 0x%02x\n", 'A'+ch, reg, data); - - switch (reg) - { - case 0: // command register - switch ((data >> 3) & 7) - { - case 1: // select high registers (handled elsewhere) - break; - - case 2: // reset external and status IRQs - pChan->syncHunt = 0; - break; - - case 5: // ack Tx IRQ - pChan->txIRQPending = 0; - updateirqs(); - break; - - case 0: // nothing - case 3: // send SDLC abort - case 4: // enable IRQ on next Rx byte - case 6: // reset errors - case 7: // reset highest IUS - // we don't handle these yet - break; - - } - break; - - case 1: // Tx/Rx IRQ and data transfer mode defintion - pChan->extIRQEnable = (data & 1); - pChan->txIRQEnable = (data & 2) ? 1 : 0; - pChan->rxIRQEnable = (data >> 3) & 3; - updateirqs(); - break; - - case 2: // IRQ vector - IRQV = data; - break; - - case 3: // Rx parameters and controls - pChan->rxEnable = (data & 1); - pChan->syncHunt = (data & 0x10) ? 1 : 0; - break; - - case 5: // Tx parameters and controls -// printf("ch %d TxEnable = %d [%02x]\n", ch, data & 8, data); - pChan->txEnable = data & 8; - - if (pChan->txEnable) - { - pChan->reg_val[0] |= 0x04; // Tx empty - } - break; - - case 4: // Tx/Rx misc parameters and modes - case 6: // sync chars/SDLC address field - case 7: // sync char/SDLC flag - break; - - case 9: // master IRQ control - MasterIRQEnable = (data & 8) ? 1 : 0; - updateirqs(); - - // channel reset command - switch ((data>>6) & 3) - { - case 0: // do nothing - break; - - case 1: // reset channel B - resetchannel(0); - break; - - case 2: // reset channel A - resetchannel(1); - break; - - case 3: // force h/w reset (entire chip) - IRQType = IRQ_NONE; - MasterIRQEnable = 0; - IRQV = 0; - - initchannel(0); - initchannel(1); - resetchannel(0); - resetchannel(1); - - // make sure we stop yanking the IRQ line if we were - updateirqs(); - break; - - } - break; - - case 10: // misc transmitter/receiver control bits - case 11: // clock mode control - case 12: // lower byte of baud rate gen - case 13: // upper byte of baud rate gen - break; - - case 14: // misc control bits - updatebaudtimer(ch); - break; - - case 15: // external/status interrupt control - pChan->baudIRQEnable = (data & 2) ? 1 : 0; - pChan->DCDEnable = (data & 8) ? 1 : 0; - pChan->CTSEnable = (data & 0x20) ? 1 : 0; - pChan->txUnderrunEnable = (data & 0x40) ? 1 : 0; - break; - } -} - -/*------------------------------------------------- - scc8530_get_reg_a --------------------------------------------------*/ - -uint8_t scc8530_legacy_device::get_reg_a(int reg) -{ - return channel[0].reg_val[reg]; -} - - - -/*------------------------------------------------- - scc8530_get_reg_b --------------------------------------------------*/ - -uint8_t scc8530_legacy_device::get_reg_b(int reg) -{ - return channel[1].reg_val[reg]; -} - - - -/*------------------------------------------------- - scc8530_set_reg_a --------------------------------------------------*/ - -void scc8530_legacy_device::set_reg_a(int reg, uint8_t data) -{ - channel[0].reg_val[reg] = data; -} - - - -/*------------------------------------------------- - scc8530_set_reg_b --------------------------------------------------*/ - -void scc8530_legacy_device::set_reg_b(int reg, uint8_t data) -{ - channel[1].reg_val[reg] = data; -} - - - -//------------------------------------------------- -// reg_r - read handler, trampolines into normal -// getter -//------------------------------------------------- - -uint8_t scc8530_legacy_device::reg_r(offs_t offset) -{ - return read_reg(offset & 3); -} - - - -//------------------------------------------------- -// read_reg - reads either the control or data -// port for either SCC channel. -//------------------------------------------------- - -uint8_t scc8530_legacy_device::read_reg(int offset) -{ - uint8_t result = 0; - - switch(offset) - { - case 0: /* Channel B (Printer Port) Control */ - case 1: /* Channel A (Modem Port) Control */ - - if (mode == 1) - mode = 0; - else - reg = 0; - - result = (offset == 0) ? getbreg() : getareg(); - break; - - case 2: /* Channel B (Printer Port) Data */ - case 3:/* Channel A (Modem Port) Data */ - result = channel[offset == 2 ? 1 : 0].rxData; - break; - } - return result; -} - - - -//------------------------------------------------- -// reg_w - write handler, trampolines into normal -// setter -//------------------------------------------------- - -void scc8530_legacy_device::reg_w(offs_t offset, uint8_t data) -{ - write_reg(offset & 3, data); -} - - - -//------------------------------------------------- -// write_reg - writes either the control or data -// port for either SCC channel. -//------------------------------------------------- - -void scc8530_legacy_device::write_reg(int offset, uint8_t data) -{ - //offset & 3; - -// printf(" mode %d data %x offset %d \n", mode, data, offset); - - //Chan *pChan; - switch(offset) - { - case 0: /* Channel B (Printer Port) Control */ - case 1: /* Channel A (Modem Port) Control */ - { - int chan = ((offset == 0) ? 1 : 0); - if (mode == 0) - { - if((data & 0xf0) == 0) // not a reset command - { - mode = 1; - reg = data & 0x0f; -// putbreg(data & 0xf0); - } - else if (data == 0x10) - { - // clear ext. interrupts - channel[chan].extIRQPending = 0; - channel[chan].baudIRQPending = 0; - updateirqs(); - } - } - else - { - mode = 0; - putreg(chan, data); - } - break; - } - - case 2: /* Channel B (Printer Port) Data */ - case 3: /* Channel A (Modem Port) Data */ - { - int chan = ((offset == 2) ? 1 : 0); - if (channel[chan].txEnable) - { - channel[chan].txData = data; - // local loopback? - if (channel[chan].reg_val[14] & 0x10) - { - channel[chan].rxData = data; - channel[chan].reg_val[0] |= 0x01; // Rx character available - } - channel[chan].reg_val[1] |= 0x01; // All sent - channel[chan].reg_val[0] |= 0x04; // Tx empty - channel[chan].txUnderrun = 1; - channel[chan].txIRQPending = 1; - updateirqs(); - } - break; - } - } -} - - -/* - -AppleTalk check: - -SCC: port B reg 9 write 0x40 Channel Reset B -SCC: port B reg 4 write 0x20 SDLC mode -SCC: port B reg 10 write 0xe0 CRC preset + FM0 -SCC: port B reg 6 write 0x00 SDLC address -SCC: port B reg 7 write 0x7e SDLC flag -SCC: port B reg 12 write 0x06 baud rate low -SCC: port B reg 13 write 0x00 baud rate high -SCC: port B reg 14 write 0xc0 Set FM mode -SCC: port B reg 3 write 0xdd Rx 8 bits, enter hunt mode, CRC enable, address search mode, Rx enable -SCC: port B reg 2 write 0x00 interrupt vector 0 -SCC: port B reg 15 write 0x08 DCD interrupt enable -SCC: port B reg 1 write 0x09 Rx IRQ on first char or special, ext int enable -SCC: port B reg 9 write 0x0a Master IRQ enable, no-vector mode -SCC: port B reg 11 write 0x70 Rx clock = DPLL output, Tx clock = BR generator -SCC: port B reg 14 write 0x21 Enter search mode, BR generator enable -SCC: port B reg 5 write 0x60 Tx 8 bits/char -SCC: port B reg 6 write 0x2a SDLC address -SCC: port B reg 0 read 0x00 -SCC: port B reg 15 write 0x88 DCD interrupt enable, break/abort interrupt enable - -(repeats) -SCC: port B reg 1 read 0x09 -SCC: port B reg 3 write 0xd0 -SCC: port B reg 3 write 0xdd Rx 8 bits, enter hunt mode, CRC enable, address search mode, Rx enable -SCC: port B reg 15 write 0x08 DCD interrupt enable -SCC: port B reg 0 read 0x00 -SCC: port B reg 15 write 0x88 - -System 7: - -SCC: port B reg 9 write 0x40 Channel Reset B -SCC: port B reg 4 write 0x20 SDLC mode -SCC: port B reg 10 write 0xe0 CRC preset + FM0 -SCC: port B reg 6 write 0x00 SDLC address -SCC: port B reg 7 write 0x7e SDLC flag -SCC: port B reg 12 write 0x06 baud rate low -SCC: port B reg 13 write 0x00 baud rate high -SCC: port B reg 14 write 0xc0 Set FM mode -SCC: port B reg 3 write 0xdd Rx 8 bits, enter hunt mode, CRC enable, address search mode, Rx enable -SCC: port B reg 2 write 0x00 interrupt vector 0 -SCC: port B reg 15 write 0x08 DCD interrupt enable -SCC: port B reg 1 write 0x09 Rx IRQ on first char or special, ext int enable -SCC: port B reg 9 write 0x0a Master IRQ enable, no-vector mode -SCC: port B reg 11 write 0x70 Rx clock = DPLL output, Tx clock = BR generator -SCC: port B reg 14 write 0x21 Enter search mode, BR generator enable -SCC: port B reg 5 write 0x60 Tx 8 bits/char -SCC: port B reg 6 write 0x01 SDLC address -SCC: port B reg 3 write 0xdd Rx 8 bits, enter hunt mode, CRC enable, address search mode, Rx enable - -(repeats) - -SCC: port B reg 0 read 0x00 -SCC: port B reg 15 write 0x88 DCD interrupt enable, break/abort interrupt enable -SCC: port B reg 15 write 0x08 DCD interrupt enable -SCC: port B reg 1 read 0x09 Rx IRQ on first char or special, ext int enable -SCC: port B reg 3 write 0xdd Rx 8 bits, enter hunt mode, CRC enable, address search mode, Rx enable - -*/ diff --git a/src/devices/machine/8530scc.h b/src/devices/machine/8530scc.h deleted file mode 100644 index cb2bd8d92eb8e..0000000000000 --- a/src/devices/machine/8530scc.h +++ /dev/null @@ -1,105 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:R. Belmont -/********************************************************************* - - 8530scc.h - - Zilog 8530 SCC (Serial Control Chip) code - -*********************************************************************/ - -#ifndef MAME_MACHINE_8530SCC_H -#define MAME_MACHINE_8530SCC_H - -class scc8530_legacy_device : public device_t -{ -public: - enum IRQType_t { - IRQ_NONE, - IRQ_A_RX, - IRQ_A_RX_SPECIAL, - IRQ_B_RX, - IRQ_B_RX_SPECIAL, - IRQ_A_TX, - IRQ_B_TX, - IRQ_A_EXT, - IRQ_B_EXT - }; - - scc8530_legacy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - auto intrq_callback() { return intrq_cb.bind(); } - - uint8_t get_reg_a(int reg); - uint8_t get_reg_b(int reg); - void set_reg_a(int reg, uint8_t data); - void set_reg_b(int reg, uint8_t data); - - void set_status(int status); - - uint8_t reg_r(offs_t offset); - void reg_w(offs_t offset, uint8_t data); - - void write_reg(int offset, uint8_t data); - uint8_t read_reg(int offset); - -protected: - virtual void device_start() override ATTR_COLD; - virtual void device_reset() override ATTR_COLD; - - TIMER_CALLBACK_MEMBER(baud_expire); - -private: - struct Chan { - bool txIRQEnable; - bool rxIRQEnable; - bool extIRQEnable; - bool baudIRQEnable; - bool txIRQPending; - bool rxIRQPending; - bool extIRQPending; - bool baudIRQPending; - bool txEnable; - bool rxEnable; - bool txUnderrun; - bool txUnderrunEnable; - bool syncHunt; - bool DCDEnable; - bool CTSEnable; - uint8_t rxData; - uint8_t txData; - - emu_timer *baudtimer; - - uint8_t reg_val[16]; - }; - - int mode; - int reg; - int status; - int IRQV; - int MasterIRQEnable; - int lastIRQStat; - IRQType_t IRQType; - - Chan channel[2]; - - devcb_write_line intrq_cb; - - void updatebaudtimer(int ch); - void updateirqs(); - void initchannel(int ch); - void resetchannel(int ch); - void acknowledge(); - uint8_t getareg(); - uint8_t getbreg(); - void putreg(int ch, uint8_t data); -}; - -/*************************************************************************** - MACROS -***************************************************************************/ - -DECLARE_DEVICE_TYPE(SCC8530, scc8530_legacy_device) - -#endif // MAME_MACHINE_8530SCC_H diff --git a/src/devices/machine/z80scc.cpp b/src/devices/machine/z80scc.cpp index 30b658e354be6..3af007c997205 100644 --- a/src/devices/machine/z80scc.cpp +++ b/src/devices/machine/z80scc.cpp @@ -374,7 +374,7 @@ DEFINE_DEVICE_TYPE(Z80SCC_CHANNEL, z80scc_channel, "z80scc_channel", "Z80 SCC C DEFINE_DEVICE_TYPE(SCC8030, scc8030_device, "scc8030", "Zilog Z8030 SCC") DEFINE_DEVICE_TYPE(SCC80C30, scc80c30_device, "scc80c30", "Zilog Z80C30 SCC") DEFINE_DEVICE_TYPE(SCC80230, scc80230_device, "scc80230", "Zilog Z80230 ESCC") -DEFINE_DEVICE_TYPE(SCC8530N, scc8530_device, "scc8530", "Zilog Z8530 SCC") // remove trailing N when 8530scc.c is fully replaced and removed +DEFINE_DEVICE_TYPE(SCC8530, scc8530_device, "scc8530", "Zilog Z8530 SCC") DEFINE_DEVICE_TYPE(SCC85C30, scc85c30_device, "scc85c30", "Zilog Z85C30 SCC") DEFINE_DEVICE_TYPE(SCC85230, scc85230_device, "scc85230", "Zilog Z85230 ESCC") DEFINE_DEVICE_TYPE(SCC85233, scc85233_device, "scc85233", "Zilog Z85233 EMSCC") @@ -455,7 +455,7 @@ scc80230_device::scc80230_device(const machine_config &mconfig, const char *tag, } scc8530_device::scc8530_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : z80scc_device(mconfig, SCC8530N, tag, owner, clock, TYPE_SCC8530) + : z80scc_device(mconfig, SCC8530, tag, owner, clock, TYPE_SCC8530) { } diff --git a/src/devices/machine/z80scc.h b/src/devices/machine/z80scc.h index b193037b72073..40b7984718a12 100644 --- a/src/devices/machine/z80scc.h +++ b/src/devices/machine/z80scc.h @@ -512,7 +512,7 @@ DECLARE_DEVICE_TYPE(Z80SCC_CHANNEL, z80scc_channel) DECLARE_DEVICE_TYPE(SCC8030, scc8030_device) DECLARE_DEVICE_TYPE(SCC80C30, scc80c30_device) DECLARE_DEVICE_TYPE(SCC80230, scc80230_device) -DECLARE_DEVICE_TYPE(SCC8530N, scc8530_device) // remove trailing N when 8530scc.c is fully replaced and removed +DECLARE_DEVICE_TYPE(SCC8530, scc8530_device) DECLARE_DEVICE_TYPE(SCC85C30, scc85c30_device) DECLARE_DEVICE_TYPE(SCC85230, scc85230_device) DECLARE_DEVICE_TYPE(SCC85233, scc85233_device) diff --git a/src/mame/acorn/aa310.cpp b/src/mame/acorn/aa310.cpp index 229ab883dd80a..e25f06fc76217 100644 --- a/src/mame/acorn/aa310.cpp +++ b/src/mame/acorn/aa310.cpp @@ -1335,7 +1335,7 @@ void aa680_state::aa680(machine_config &config) m_cent_ctrl_out->bit_handler<3>().set(m_centronics, FUNC(centronics_device::write_ack)); m_cent_ctrl_out->bit_handler<4>().set(m_centronics, FUNC(centronics_device::write_busy)); - scc8530_device &scc(SCC8530N(config, "scc", 3.6864_MHz_XTAL)); + scc8530_device &scc(SCC8530(config, "scc", 3.6864_MHz_XTAL)); scc.out_txda_callback().set("rs232a", FUNC(rs232_port_device::write_txd)); scc.out_dtra_callback().set("rs232a", FUNC(rs232_port_device::write_dtr)); scc.out_rtsa_callback().set("rs232a", FUNC(rs232_port_device::write_rts)); diff --git a/src/mame/apple/lisa.h b/src/mame/apple/lisa.h index 5fd8e4872b68a..065212287c58a 100644 --- a/src/mame/apple/lisa.h +++ b/src/mame/apple/lisa.h @@ -16,7 +16,7 @@ #include "machine/74259.h" #include "machine/6522via.h" #include "machine/6522via.h" -#include "machine/8530scc.h" +#include "machine/z80scc.h" #include "machine/applefdintf.h" #include "machine/iwm.h" #include "machine/nvram.h" @@ -144,7 +144,7 @@ class lisa_state : public driver_device required_device m_via1; required_device m_fdc; required_device_array m_floppy; - required_device m_scc; + required_device m_scc; required_device m_speaker; required_device m_nvram; required_device m_latch; diff --git a/src/mame/apple/lisa_m.cpp b/src/mame/apple/lisa_m.cpp index a5d6485e155db..fa217b4b7a7c6 100644 --- a/src/mame/apple/lisa_m.cpp +++ b/src/mame/apple/lisa_m.cpp @@ -1674,7 +1674,7 @@ uint16_t lisa_state::lisa_IO_r(offs_t offset, uint16_t mem_mask) switch ((offset & 0x0600) >> 9) { case 0: /* serial ports control */ - answer = m_scc->reg_r(offset&7); + answer = m_scc->dc_ab_r(offset&3); break; case 2: /* parallel port */ @@ -1798,7 +1798,7 @@ void lisa_state::lisa_IO_w(offs_t offset, uint16_t data, uint16_t mem_mask) switch ((offset & 0x0600) >> 9) { case 0: /* serial ports control */ - m_scc->reg_w(offset&7, data); + m_scc->dc_ab_w(offset&3, data); break; case 2: /* paralel port */ diff --git a/src/mame/apple/lwriter.cpp b/src/mame/apple/lwriter.cpp index cd1fc1d69ce57..3749b4da7a867 100644 --- a/src/mame/apple/lwriter.cpp +++ b/src/mame/apple/lwriter.cpp @@ -660,7 +660,7 @@ void lwriter_state::lwriter(machine_config &config) m_screen->set_visarea_full(); m_screen->set_screen_update(FUNC(lwriter_state::screen_update)); - SCC8530N(config, m_scc, CPU_CLK); + SCC8530(config, m_scc, CPU_CLK); m_scc->configure_channels(RXC_CLK, 0, RXC_CLK, 0); /* Port A */ m_scc->out_txda_callback().set("rs232a", FUNC(rs232_port_device::write_txd)); diff --git a/src/mame/apple/macquadra700.cpp b/src/mame/apple/macquadra700.cpp index 99ab89c45a505..1cfbe1b7946d1 100644 --- a/src/mame/apple/macquadra700.cpp +++ b/src/mame/apple/macquadra700.cpp @@ -737,7 +737,7 @@ void eclipse_state::via2_out_b_q900(u8 data) applefdintf_device::add_35_hd(config, m_floppy[0]); applefdintf_device::add_35_nc(config, m_floppy[1]); - SCC8530N(config, m_scc, C7M); + SCC8530(config, m_scc, C7M); m_scc->configure_channels(3'686'400, 3'686'400, 3'686'400, 3'686'400); m_scc->out_txda_callback().set("printer", FUNC(rs232_port_device::write_txd)); m_scc->out_txdb_callback().set("modem", FUNC(rs232_port_device::write_txd)); diff --git a/src/mame/atari/atarist.cpp b/src/mame/atari/atarist.cpp index 5a7425475640e..81470df514c51 100644 --- a/src/mame/atari/atarist.cpp +++ b/src/mame/atari/atarist.cpp @@ -16,7 +16,7 @@ #include "cpu/m68000/m68000.h" #include "imagedev/floppy.h" #include "machine/6850acia.h" -#include "machine/8530scc.h" +#include "machine/z80scc.h" #include "machine/clock.h" #include "machine/input_merger.h" #include "machine/mc68901.h" diff --git a/src/mame/ausnz/applix.cpp b/src/mame/ausnz/applix.cpp index fb498efc53d75..47bf2659a34dd 100644 --- a/src/mame/ausnz/applix.cpp +++ b/src/mame/ausnz/applix.cpp @@ -909,7 +909,7 @@ void applix_state::applix(machine_config &config) FLOPPY_CONNECTOR(config, m_floppy[1], applix_floppies, "35dd", applix_state::floppy_formats).enable_sound(true); TIMER(config, "applix_c").configure_periodic(FUNC(applix_state::cass_timer), attotime::from_hz(100000)); - scc8530_device &scc(SCC8530N(config, "scc", 30_MHz_XTAL / 8)); + scc8530_device &scc(SCC8530(config, "scc", 30_MHz_XTAL / 8)); scc.out_txda_callback().set("serial_a", FUNC(rs232_port_device::write_txd)); scc.out_rtsa_callback().set("serial_a", FUNC(rs232_port_device::write_rts)); scc.out_dtra_callback().set("serial_a", FUNC(rs232_port_device::write_dtr)); diff --git a/src/mame/barcrest/mpu4plasma.cpp b/src/mame/barcrest/mpu4plasma.cpp index 228846f983d2b..0bb01fd2a1e4c 100644 --- a/src/mame/barcrest/mpu4plasma.cpp +++ b/src/mame/barcrest/mpu4plasma.cpp @@ -87,7 +87,7 @@ void mpu4plasma_state::mpu4plasma_f(machine_config &config) m68000_device &plasmacpu(M68000(config, "plasmacpu", 10000000)); plasmacpu.set_addrmap(AS_PROGRAM, &mpu4plasma_state::mpu4plasma_map); - SCC8530N(config, "scc", 4915200).out_int_callback().set_inputline("plasmacpu", 4); + SCC8530(config, "scc", 4915200).out_int_callback().set_inputline("plasmacpu", 4); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); diff --git a/src/mame/ceres/ceres.cpp b/src/mame/ceres/ceres.cpp index a8edd2c1ec52d..acc1cd3fb9665 100644 --- a/src/mame/ceres/ceres.cpp +++ b/src/mame/ceres/ceres.cpp @@ -369,7 +369,7 @@ void ceres1_state::ceres1(machine_config &config) m_serial->dsr_handler().set(m_uart, FUNC(scn2681_device::ip2_w)); // TODO: RS-485 ports "na" and "nb" - SCC8530N(config, m_scc, 6_MHz_XTAL); + SCC8530(config, m_scc, 6_MHz_XTAL); m_scc->configure_channels(m_uart->clock(), 0, m_uart->clock(), 0); m_scc->out_int_callback().set(m_icu, FUNC(am9519_device::ireq1_w)).invert(); diff --git a/src/mame/ibm/rtpc.cpp b/src/mame/ibm/rtpc.cpp index ca41db76ee3a4..d03edb69da3a4 100644 --- a/src/mame/ibm/rtpc.cpp +++ b/src/mame/ibm/rtpc.cpp @@ -763,7 +763,7 @@ void rtpc_state::ibm6150(machine_config &config) common(config); m_iocc->set_addrmap(2, &rtpc_state::iocc_pio_map); - SCC8530N(config, m_scc, 3'580'000); + SCC8530(config, m_scc, 3'580'000); m_scc->configure_channels(3'072'000, 3'072'000, 3'072'000, 3'072'000); m_scc->out_int_callback().set(m_pic[0], FUNC(pic8259_device::ir6_w)); diff --git a/src/mame/informer/informer_213.cpp b/src/mame/informer/informer_213.cpp index 124108d7590b6..56d02e986d2f7 100644 --- a/src/mame/informer/informer_213.cpp +++ b/src/mame/informer/informer_213.cpp @@ -408,7 +408,7 @@ void informer_213_state::informer_213(machine_config &config) NVRAM(config, m_nvram[0], nvram_device::DEFAULT_ALL_0); NVRAM(config, m_nvram[1], nvram_device::DEFAULT_ALL_0); - SCC8530N(config, m_scc, 18.432_MHz_XTAL / 5); + SCC8530(config, m_scc, 18.432_MHz_XTAL / 5); m_scc->out_txda_callback().set("host", FUNC(rs232_port_device::write_txd)); m_scc->out_dtra_callback().set("host", FUNC(rs232_port_device::write_dtr)); m_scc->out_rtsa_callback().set("host", FUNC(rs232_port_device::write_rts)); diff --git a/src/mame/luxor/abc1600.cpp b/src/mame/luxor/abc1600.cpp index b49a7da6a5bf6..c96160ad05482 100644 --- a/src/mame/luxor/abc1600.cpp +++ b/src/mame/luxor/abc1600.cpp @@ -986,7 +986,7 @@ void abc1600_state::abc1600(machine_config &config) //rs232pr.rts_handler().set(m_dart, FUNC(z80dart_device::ctsa_w)); //rs232pr.dtr_handler().set(m_dart, FUNC(z80dart_device::dcda_w)); - SCC8530N(config, m_scc, 64_MHz_XTAL / 16); + SCC8530(config, m_scc, 64_MHz_XTAL / 16); m_scc->out_int_callback().set(FUNC(abc1600_state::scc_irq_w)); m_scc->out_wreqa_callback().set(FUNC(abc1600_state::sccrq_a_w)); m_scc->out_wreqb_callback().set(FUNC(abc1600_state::sccrq_b_w)); diff --git a/src/mame/luxor/ds90.cpp b/src/mame/luxor/ds90.cpp index 1f98f52e29344..8c5618312f484 100644 --- a/src/mame/luxor/ds90.cpp +++ b/src/mame/luxor/ds90.cpp @@ -121,9 +121,9 @@ void x37_state::x37(machine_config &config) NMC9306(config, m_nvram, 0); E0516(config, E050_16_TAG, 32'768); - SCC8530N(config, m_scc[0], 6000000); - SCC8530N(config, m_scc[1], 6000000); - SCC8530N(config, m_scc[2], 6000000); + SCC8530(config, m_scc[0], 6000000); + SCC8530(config, m_scc[1], 6000000); + SCC8530(config, m_scc[2], 6000000); FD1797(config, m_fdc, 16'000'000/16); diff --git a/src/mame/misc/hotstuff.cpp b/src/mame/misc/hotstuff.cpp index 5cd6a809160a1..bcd281983c4d1 100644 --- a/src/mame/misc/hotstuff.cpp +++ b/src/mame/misc/hotstuff.cpp @@ -108,10 +108,10 @@ void hotstuff_state::hotstuff(machine_config &config) PALETTE(config, "palette").set_entries(0x200); - scc8530_device &scc1(SCC8530N(config, "scc1", 4915200)); + scc8530_device &scc1(SCC8530(config, "scc1", 4915200)); scc1.out_int_callback().set_inputline(m_maincpu, M68K_IRQ_4); - scc8530_device &scc2(SCC8530N(config, "scc2", 4915200)); + scc8530_device &scc2(SCC8530(config, "scc2", 4915200)); scc2.out_int_callback().set_inputline(m_maincpu, M68K_IRQ_5); mc146818_device &rtc(MC146818(config, "rtc", XTAL(32'768))); diff --git a/src/mame/misc/micro3d.cpp b/src/mame/misc/micro3d.cpp index 86766148cc58f..e57e0c56caed1 100644 --- a/src/mame/misc/micro3d.cpp +++ b/src/mame/misc/micro3d.cpp @@ -327,7 +327,7 @@ void micro3d_state::micro3d(machine_config &config) m_drmath->set_addrmap(AS_PROGRAM, µ3d_state::drmath_prg); m_drmath->set_addrmap(AS_DATA, µ3d_state::drmath_data); - scc8530_device &scc(SCC8530N(config, "scc", 32_MHz_XTAL / 2 / 2)); + scc8530_device &scc(SCC8530(config, "scc", 32_MHz_XTAL / 2 / 2)); scc.out_txdb_callback().set("monitor_drmath", FUNC(rs232_port_device::write_txd)); I8051(config, m_audiocpu, 11.0592_MHz_XTAL); diff --git a/src/mame/misc/triplex.cpp b/src/mame/misc/triplex.cpp index 9ae0a68b36347..897d955906f1a 100644 --- a/src/mame/misc/triplex.cpp +++ b/src/mame/misc/triplex.cpp @@ -329,7 +329,7 @@ void triplex_state::triplex(machine_config &config) downcast(*device).drq_handler().set(":dmac", FUNC(hd63450_device::drq0_w)); }); - scc8530_device &scc(SCC8530N(config, "scc", 4.9152_MHz_XTAL)); + scc8530_device &scc(SCC8530(config, "scc", 4.9152_MHz_XTAL)); scc.out_int_callback().set_inputline(m_maincpu, M68K_IRQ_5); scc.out_wreqa_callback().set("dmac", FUNC(hd63450_device::drq1_w)); scc.out_dtra_callback().set("dmac", FUNC(hd63450_device::drq2_w)); diff --git a/src/mame/next/next.cpp b/src/mame/next/next.cpp index 80e911f736c61..dbba0b3806378 100644 --- a/src/mame/next/next.cpp +++ b/src/mame/next/next.cpp @@ -908,7 +908,7 @@ void next_state::next_mem(address_map &map) map(0x02014020, 0x02014023).mirror(0x300000).rw(FUNC(next_state::scsictrl_r), FUNC(next_state::scsictrl_w)); map(0x02016000, 0x02016003).mirror(0x300000).rw(FUNC(next_state::timer_data_r), FUNC(next_state::timer_data_w)); map(0x02016004, 0x02016007).mirror(0x300000).rw(FUNC(next_state::timer_ctrl_r), FUNC(next_state::timer_ctrl_w)); - map(0x02018000, 0x02018003).mirror(0x300000).rw(scc, FUNC(scc8530_legacy_device::reg_r), FUNC(scc8530_legacy_device::reg_w)); + map(0x02018000, 0x02018003).mirror(0x300000).rw(scc, FUNC(scc8530_device::dc_ab_r), FUNC(scc8530_device::dc_ab_w)); // map(0x02018004, 0x02018007).mirror(0x300000); SCC CLK // map(0x02018190, 0x02018197).mirror(0x300000); warp 9c DRAM timing // map(0x02018198, 0x0201819f).mirror(0x300000); warp 9c VRAM timing @@ -1036,7 +1036,7 @@ void next_state::next_base(machine_config &config) MCCS1850(config, rtc, XTAL(32'768)); SCC8530(config, scc, XTAL(25'000'000)); - scc->intrq_callback().set(FUNC(next_state::scc_irq)); + scc->out_int_callback().set(FUNC(next_state::scc_irq)); NEXTKBD(config, keyboard, 0); keyboard->int_change_wr_callback().set(FUNC(next_state::keyboard_irq)); diff --git a/src/mame/next/next.h b/src/mame/next/next.h index be5bef74d0f7d..78c8fd87b2b72 100644 --- a/src/mame/next/next.h +++ b/src/mame/next/next.h @@ -10,7 +10,7 @@ #include "imagedev/floppy.h" #include "machine/nscsi_bus.h" #include "machine/mccs1850.h" -#include "machine/8530scc.h" +#include "machine/z80scc.h" #include "nextkbd.h" #include "machine/upd765.h" #include "machine/ncr53c90.h" @@ -65,7 +65,7 @@ class next_state : public driver_device private: required_device maincpu; required_device rtc; - required_device scc; + required_device scc; required_device keyboard; required_device scsibus; required_device scsi; diff --git a/src/mame/sharp/x68k.cpp b/src/mame/sharp/x68k.cpp index c6787eeef393d..3a49c788a9f11 100644 --- a/src/mame/sharp/x68k.cpp +++ b/src/mame/sharp/x68k.cpp @@ -1139,7 +1139,7 @@ void x68k_state::x68000_base(machine_config &config) m_hd63450->dma_read<0>().set("upd72065", FUNC(upd72065_device::dma_r)); m_hd63450->dma_write<0>().set("upd72065", FUNC(upd72065_device::dma_w)); - SCC8530N(config, m_scc, 40_MHz_XTAL / 8); + SCC8530(config, m_scc, 40_MHz_XTAL / 8); m_scc->out_int_callback().set([this](int state) { m_scc_int = state; update_ipl(); }); rs232_port_device &mouse(RS232_PORT(config, "mouse_port", mouse_devices, "x68k")); diff --git a/src/mame/skeleton/clxvme186.cpp b/src/mame/skeleton/clxvme186.cpp index 54064aed71b26..d8ac6f0061193 100644 --- a/src/mame/skeleton/clxvme186.cpp +++ b/src/mame/skeleton/clxvme186.cpp @@ -103,7 +103,7 @@ void clxvme186_state::clxvme186(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &clxvme186_state::mem_map); m_maincpu->set_addrmap(AS_IO, &clxvme186_state::io_map); - SCC8530N(config, "scc", 3.6864_MHz_XTAL); + SCC8530(config, "scc", 3.6864_MHz_XTAL); M3000(config, "rtc", 32.768_kHz_XTAL); diff --git a/src/mame/skeleton/digilog320.cpp b/src/mame/skeleton/digilog320.cpp index 90cb8ed2ee600..3286933c78140 100644 --- a/src/mame/skeleton/digilog320.cpp +++ b/src/mame/skeleton/digilog320.cpp @@ -387,9 +387,9 @@ void digilog320_state::digilog320(machine_config &config) I8251(config, "usart", 0); - SCC8530N(config, m_scc[0], 3.6864_MHz_XTAL); + SCC8530(config, m_scc[0], 3.6864_MHz_XTAL); - SCC8530N(config, m_scc[1], 3.6864_MHz_XTAL); + SCC8530(config, m_scc[1], 3.6864_MHz_XTAL); MB8877(config, m_fdc, 16_MHz_XTAL / 16); m_fdc->intrq_wr_callback().set(m_maincpu, FUNC(i80186_cpu_device::int3_w)); diff --git a/src/mame/skeleton/lft.cpp b/src/mame/skeleton/lft.cpp index 87dedb8eeeef5..ea9a80f98744a 100644 --- a/src/mame/skeleton/lft.cpp +++ b/src/mame/skeleton/lft.cpp @@ -94,7 +94,7 @@ void lft_state::lft(machine_config &config) // Devices MM58167(config, m_rtc, 32.768_kHz_XTAL); - SCC8530N(config, m_scc, 4.9152_MHz_XTAL); + SCC8530(config, m_scc, 4.9152_MHz_XTAL); m_scc->out_txda_callback().set("rs232a", FUNC(rs232_port_device::write_txd)); m_scc->out_dtra_callback().set("rs232a", FUNC(rs232_port_device::write_dtr)); m_scc->out_rtsa_callback().set("rs232a", FUNC(rs232_port_device::write_rts)); diff --git a/src/mame/sun/sun2.cpp b/src/mame/sun/sun2.cpp index 8e8a1769c3a66..139b7193ad07d 100644 --- a/src/mame/sun/sun2.cpp +++ b/src/mame/sun/sun2.cpp @@ -720,8 +720,8 @@ void sun2_state::sun2vme(machine_config &config) INPUT_MERGER_ANY_HIGH(config, "irq5").output_handler().set_inputline(m_maincpu, M68K_IRQ_5); // 74LS05 open collectors - SCC8530N(config, SCC1_TAG, 19.6608_MHz_XTAL / 4); - scc8530_device& scc2(SCC8530N(config, SCC2_TAG, 19.6608_MHz_XTAL / 4)); + SCC8530(config, SCC1_TAG, 19.6608_MHz_XTAL / 4); + scc8530_device& scc2(SCC8530(config, SCC2_TAG, 19.6608_MHz_XTAL / 4)); scc2.out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd)); scc2.out_txdb_callback().set(RS232B_TAG, FUNC(rs232_port_device::write_txd)); scc2.out_int_callback().set_inputline(m_maincpu, M68K_IRQ_6); @@ -772,8 +772,8 @@ void sun2_state::sun2mbus(machine_config &config) INPUT_MERGER_ANY_HIGH(config, "irq5").output_handler().set_inputline(m_maincpu, M68K_IRQ_5); // 74LS05 open collectors - SCC8530N(config, SCC1_TAG, 39.3216_MHz_XTAL / 8); - scc8530_device& scc2(SCC8530N(config, SCC2_TAG, 39.3216_MHz_XTAL / 8)); + SCC8530(config, SCC1_TAG, 39.3216_MHz_XTAL / 8); + scc8530_device& scc2(SCC8530(config, SCC2_TAG, 39.3216_MHz_XTAL / 8)); scc2.out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd)); scc2.out_txdb_callback().set(RS232B_TAG, FUNC(rs232_port_device::write_txd)); scc2.out_int_callback().set_inputline(m_maincpu, M68K_IRQ_6); diff --git a/src/mame/sun/sun3.cpp b/src/mame/sun/sun3.cpp index 17cb06831fa34..af782b9cca88f 100644 --- a/src/mame/sun/sun3.cpp +++ b/src/mame/sun/sun3.cpp @@ -1049,7 +1049,7 @@ void sun3_state::sun3(machine_config &config) TIMER(config, "timer").configure_periodic(FUNC(sun3_state::sun3_timer), attotime::from_hz(100)); - SCC8530N(config, m_scc1, 4.9152_MHz_XTAL); + SCC8530(config, m_scc1, 4.9152_MHz_XTAL); m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd)); m_scc1->out_txdb_callback().set(MOUSE_TAG, FUNC(sun_mouse_port_device::write_txd)); @@ -1057,7 +1057,7 @@ void sun3_state::sun3(machine_config &config) SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w)); - SCC8530N(config, m_scc2, 4.9152_MHz_XTAL); + SCC8530(config, m_scc2, 4.9152_MHz_XTAL); m_scc2->out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd)); m_scc2->out_txdb_callback().set(RS232B_TAG, FUNC(rs232_port_device::write_txd)); @@ -1157,7 +1157,7 @@ void sun3_state::sun3_50(machine_config &config) // MMU Type 3 device space ADDRESS_MAP_BANK(config, "type3").set_map(&sun3_state::vmetype3space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); - SCC8530N(config, m_scc1, 4.9152_MHz_XTAL); + SCC8530(config, m_scc1, 4.9152_MHz_XTAL); m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd)); m_scc1->out_txdb_callback().set(MOUSE_TAG, FUNC(sun_mouse_port_device::write_txd)); @@ -1165,7 +1165,7 @@ void sun3_state::sun3_50(machine_config &config) SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w)); - SCC8530N(config, m_scc2, 4.9152_MHz_XTAL); + SCC8530(config, m_scc2, 4.9152_MHz_XTAL); m_scc2->out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd)); m_scc2->out_txdb_callback().set(RS232B_TAG, FUNC(rs232_port_device::write_txd)); diff --git a/src/mame/sun/sun3x.cpp b/src/mame/sun/sun3x.cpp index 62328e4a5116c..c438b0cf02945 100644 --- a/src/mame/sun/sun3x.cpp +++ b/src/mame/sun/sun3x.cpp @@ -605,14 +605,14 @@ void sun3x_state::sun3_80(machine_config &config) M48T02(config, TIMEKEEPER_TAG, 0); - SCC8530N(config, m_scc1, 4.9152_MHz_XTAL); + SCC8530(config, m_scc1, 4.9152_MHz_XTAL); m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd)); m_scc1->out_txdb_callback().set(MOUSE_TAG, FUNC(sun_mouse_port_device::write_txd)); SUNKBD_PORT(config, KEYBOARD_TAG, default_sun_keyboard_devices, "type3hle").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxa_w)); SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w)); - SCC8530N(config, m_scc2, 4.9152_MHz_XTAL); + SCC8530(config, m_scc2, 4.9152_MHz_XTAL); m_scc2->out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd)); m_scc2->out_txdb_callback().set(RS232B_TAG, FUNC(rs232_port_device::write_txd)); @@ -657,8 +657,8 @@ void sun3x_state::sun3_460(machine_config &config) ICM7170(config, "rtc", 32768).irq().set_inputline(m_maincpu, M68K_IRQ_7); - SCC8530N(config, m_scc1, 4.9152_MHz_XTAL); - SCC8530N(config, m_scc2, 4.9152_MHz_XTAL); + SCC8530(config, m_scc1, 4.9152_MHz_XTAL); + SCC8530(config, m_scc2, 4.9152_MHz_XTAL); m_scc2->out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd)); m_scc2->out_txdb_callback().set(RS232B_TAG, FUNC(rs232_port_device::write_txd)); diff --git a/src/mame/tektronix/tekigw.cpp b/src/mame/tektronix/tekigw.cpp index e10fa3480c18c..cf298416a3599 100644 --- a/src/mame/tektronix/tekigw.cpp +++ b/src/mame/tektronix/tekigw.cpp @@ -752,7 +752,7 @@ void tekigw_state_base::common_config(machine_config &config) RAM(config, m_ram); m_ram->set_default_size("1M"); - SCC8530N(config, m_scc, 16_MHz_XTAL / 4); + SCC8530(config, m_scc, 16_MHz_XTAL / 4); m_scc->out_int_callback().set(m_icu, FUNC(ns32202_device::ir_w<1>)).invert(); m_scc->configure_channels(2'457'600, 0, 2'457'600, 0); From 47d64dc6bd2c7e48979b1c9d111c3253ab4637a8 Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Tue, 14 Jan 2025 14:57:19 +0700 Subject: [PATCH 12/80] mcs51: don't mask P3.1 at reset --- src/devices/cpu/mcs51/mcs51.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/cpu/mcs51/mcs51.cpp b/src/devices/cpu/mcs51/mcs51.cpp index d07c67da854b3..ef6703c3db160 100644 --- a/src/devices/cpu/mcs51/mcs51.cpp +++ b/src/devices/cpu/mcs51/mcs51.cpp @@ -2502,7 +2502,7 @@ void mcs51_cpu_device::device_reset() m_uart.rx_clk = 0; m_uart.tx_clk = 0; m_uart.txbit = SIO_IDLE; - m_uart.txd = 0; + m_uart.txd = 1; m_uart.rxbit = SIO_IDLE; m_uart.rxb8 = 0; m_uart.smod_div = 0; From 52b77e0df7e2e754b5bdd611dbbaa6187d2f47a6 Mon Sep 17 00:00:00 2001 From: m1macrophage <168948267+m1macrophage@users.noreply.github.com> Date: Tue, 14 Jan 2025 00:00:37 -0800 Subject: [PATCH 13/80] oberheim/dmx.cpp: AA filters, VCA as a device, optimizations, bug fix. (#13228) * oberheim/dmx.cpp: AA filters, VCA as a device, optimizations, bug fix. - Refactored the gain and decay logic into its own VCA device, to make it easy to add the anti-aliasing filters. - Added the anti-aliasing / reconstruction filters. - Optimization: Gain and decay-RC-constant variations computed at initialization. - Bugfix: voices with pith control have 1 instead of 3 decay variations. Fixes decay speed in some TOM variations. * dmx: Initializing with non-zero filter params in "default" constructor. Fixes validation errors. --- src/mame/oberheim/dmx.cpp | 402 +++++++++++++++++++++++++++++--------- 1 file changed, 308 insertions(+), 94 deletions(-) diff --git a/src/mame/oberheim/dmx.cpp b/src/mame/oberheim/dmx.cpp index 2e87b31d570bd..35291f4b07dd2 100644 --- a/src/mame/oberheim/dmx.cpp +++ b/src/mame/oberheim/dmx.cpp @@ -44,9 +44,9 @@ educational tool. - 2 x cymbal cards: A single voice that occupies two card slots. Known audio inaccuracies (reasons for MACHINE_IMPERFECT_SOUND): -- No anti-aliasing filters (coming soon). - Closed and Accent hi-hat volume variations might be wrong. See comments in HIHAT_CONFIG (to be researched soon). +- Uncertainty on component values for PERC2 (see comments in PERC_CONFIG). - No metronome yet. - Linear- instead of audio-taper faders. - The DMX stereo output uses fixed panning for each voice. Not yet emulated. @@ -79,6 +79,7 @@ Usage notes: #include "machine/rescap.h" #include "machine/timer.h" #include "sound/dac76.h" +#include "sound/flt_biquad.h" #include "sound/mixer.h" #include "video/dl1416.h" #include "speaker.h" @@ -98,6 +99,8 @@ Usage notes: #include "logmacro.h" +static constexpr const float VCC = 5; + // Voice card configuration. Captures jumper configuration and component values. struct dmx_voice_card_config { @@ -141,8 +144,219 @@ struct dmx_voice_card_config // Early decay enabled when trigger mode is 1. }; const early_decay_mode early_decay; + + // A cascade of 3 Sallen-Key filters. Components ordered from left to right + // on the schematic, which also matches the order in opamp_sk_lowpass_setup. + struct filter_components + { + const float r15; + const float r14; + const float c5; + const float c4; + + const float r13; + const float r18; + const float c6; + const float c7; + + const float r19; + const float r20; + const float c8; + const float c9; + }; + const filter_components filter; +}; + +class dmx_voice_card_vca : public device_t, public device_sound_interface +{ +public: + dmx_voice_card_vca(const machine_config &mconfig, const char *tag, device_t *owner, const dmx_voice_card_config &config) ATTR_COLD; + dmx_voice_card_vca(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0) ATTR_COLD; + + void start(int trigger_mode); + void decay(); + void finish(); + + bool in_decay() const { return m_decaying; } + +protected: + void device_start() override ATTR_COLD; + void device_reset() override ATTR_COLD; + void sound_stream_update(sound_stream &stream, const std::vector &inputs, std::vector &outputs) override; + +private: + void init_gain_and_decay_variations(const dmx_voice_card_config &config) ATTR_COLD; + + bool has_decay() const { return !m_decay_rc_inv.empty(); } + bool has_decay_variations() const { return m_decay_rc_inv.size() > 1; } + + // Configuration. Do not include in save state. + sound_stream *m_stream = nullptr; + const bool m_gain_control; // Is VCA configured for gain variations? + std::vector m_gain; // Gain variations. + std::vector m_decay_rc_inv; // Decay 1/RC variations. + + // Device state. + bool m_running = false; + float m_selected_gain = 1; + bool m_decaying = false; + float m_selected_rc_inv = 1; + attotime m_decay_start_time; }; +DEFINE_DEVICE_TYPE(DMX_VOICE_CARD_VCA, dmx_voice_card_vca, "dmx_voice_card_vca", "DMX Voice Card VCA"); + +dmx_voice_card_vca::dmx_voice_card_vca(const machine_config &mconfig, const char *tag, device_t *owner, const dmx_voice_card_config &config) + : device_t(mconfig, DMX_VOICE_CARD_VCA, tag, owner, 0) + , device_sound_interface(mconfig, *this) + , m_gain_control(!config.pitch_control) +{ + init_gain_and_decay_variations(config); +} + +dmx_voice_card_vca::dmx_voice_card_vca(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, DMX_VOICE_CARD_VCA, tag, owner, clock) + , device_sound_interface(mconfig, *this) + , m_gain_control(false) +{ +} + +void dmx_voice_card_vca::start(int trigger_mode) +{ + assert(trigger_mode >= 1 && trigger_mode <= 3); + + m_stream->update(); + m_running = true; + m_decaying = false; + + if (m_gain_control) + m_selected_gain = m_gain[trigger_mode]; + else + m_selected_gain = m_gain[0]; + + if (has_decay_variations()) + m_selected_rc_inv = m_decay_rc_inv[trigger_mode]; + else if (has_decay()) + m_selected_rc_inv = m_decay_rc_inv[0]; + else + m_selected_rc_inv = 1; + + LOGMASKED(LOG_VOLUME, "Selected gain: %f, 1/RC: %f\n", + m_selected_gain, m_selected_rc_inv); +} + +void dmx_voice_card_vca::decay() +{ + assert(has_decay()); + if (!has_decay()) + return; + + m_stream->update(); + m_decaying = true; + m_decay_start_time = machine().time(); +} + +void dmx_voice_card_vca::finish() +{ + m_running = false; +} + +void dmx_voice_card_vca::device_start() +{ + m_stream = stream_alloc(1, 1, machine().sample_rate()); + + save_item(NAME(m_running)); + save_item(NAME(m_selected_gain)); + save_item(NAME(m_decaying)); + save_item(NAME(m_selected_rc_inv)); + save_item(NAME(m_decay_start_time)); + +} + +void dmx_voice_card_vca::device_reset() +{ + m_running = false; + m_selected_gain = 1; + m_decaying = false; + m_selected_rc_inv = 1; +} + +void dmx_voice_card_vca::sound_stream_update(sound_stream &stream, const std::vector &inputs, std::vector &outputs) +{ + const read_stream_view &in = inputs[0]; + write_stream_view &out = outputs[0]; + const int n = in.samples(); + + attotime t = in.start_time() - m_decay_start_time; + assert(!m_decaying || t >= attotime::from_double(0)); + + for (int i = 0; i < n; ++i, t += in.sample_period()) + { + const float decay = m_decaying ? expf(-t.as_double() * m_selected_rc_inv) : 1; + out.put(i, decay * m_selected_gain * in.get(i)); + if (m_running && i == 0) + { + LOGMASKED(LOG_SAMPLES, "Sample: %d, %f, %d, %f, %f\n", + i, m_selected_gain, m_decaying, t.as_double(), decay); + } + } +} + +void dmx_voice_card_vca::init_gain_and_decay_variations(const dmx_voice_card_config &config) +{ + static constexpr const float VD = 0.6; // Diode drop. + static constexpr const float R8 = RES_K(2.7); + static constexpr const float R9 = RES_K(5.6); + static constexpr const float MAX_IREF = 5.0F / (R8 + R9); + + const float r12 = config.r12; + const float r17 = config.r17; + const float c3 = config.c3; + + // Precompute gain variations. + m_gain.clear(); + m_gain.push_back(MAX_IREF); + if (m_gain_control) // Configured for gain variations. + { + // The equations below were derived from Kirchhoff analysis and verified + // with simulations: https://tinyurl.com/22wxwh8h + + // For trigger mode 1. + m_gain.push_back((r12 * r17 * VCC + R8 * r12 * VD + R8 * r17 * VD) / + ((R8 * r12 * r17) + (r12 * r17 * R9) + (R8 * r17 * R9) + (R8 * r12 * R9))); + // For trigger mode 2. + m_gain.push_back((r12 * VCC + R8 * VD) / (r12 * R8 + R8 * R9 + r12 * R9)); + // For trigger mode 3. + m_gain.push_back(m_gain[0]); + } + for (int i = 0; i < m_gain.size(); ++i) + { + LOGMASKED(LOG_VOLUME, "%s: Gain variation %d: %f uA, %f\n", + tag(), i, m_gain[i] * 1e6F, m_gain[i] / MAX_IREF); + m_gain[i] /= MAX_IREF; // Normalize. + } + + // Precompute decay variations. + m_decay_rc_inv.clear(); + if (config.decay != dmx_voice_card_config::decay_mode::DISABLED && c3 > 0) + { + std::vector r_lower; + r_lower.push_back(R9); // For when there are no variations. + if (m_gain_control) + { + r_lower.push_back(RES_3_PARALLEL(R9, r12, r17)); // For trigger mode 1. + r_lower.push_back(RES_2_PARALLEL(R9, r12)); // For trigger mode 2. + r_lower.push_back(R9); // For trigger mode 3. + } + for (float r : r_lower) + { + m_decay_rc_inv.push_back(1.0F / ((R8 + r) * c3)); + LOGMASKED(LOG_VOLUME, "%s: Decay 1/RC variation %d: %f\n", + tag(), m_decay_rc_inv.size() - 1, m_decay_rc_inv.back()); + } + } +} + // Emulates the original DMX voice cards, including the cymbal card. Later // DMX models shipped with the "Mark II" voice cards for the Tom voices. // The Mark II cards are not yet emulated. @@ -169,7 +383,6 @@ class dmx_voice_card : public device_t, public device_sound_interface void init_pitch() ATTR_COLD; void compute_pitch_variations(); void select_pitch(); - void configure_volume(); bool is_decay_enabled() const; bool is_early_decay_enabled() const; @@ -179,6 +392,8 @@ class dmx_voice_card : public device_t, public device_sound_interface required_device m_timer; // 555, U5. required_device m_dac; // AM6070, U8. Compatible with DAC76. + required_device m_vca; + required_device_array m_filters; // Configuration. Do not include in save state. const dmx_voice_card_config m_config; @@ -188,45 +403,35 @@ class dmx_voice_card : public device_t, public device_sound_interface s32 m_t1_percent = T1_DEFAULT_PERCENT; // Device state. - bool m_counting = false; u16 m_counter = 0; // 4040 counter. - u8 m_trigger_mode = 0; // Valid modes: 1-3. - float m_volume = 0; // Volume attenuation: 0-1. - - bool m_decaying = false; - attotime m_decay_start_time; - - static constexpr const float VCC = 5; - static constexpr const float R8 = RES_K(2.7); - static constexpr const float R9 = RES_K(5.6); + u8 m_trigger_mode = 0; // Valid modes: 1-3. 0 OK after reset. }; DEFINE_DEVICE_TYPE(DMX_VOICE_CARD, dmx_voice_card, "dmx_voice_card", "DMX Voice Card"); -dmx_voice_card::dmx_voice_card( - const machine_config &mconfig, - const char *tag, device_t *owner, - const dmx_voice_card_config &config, - required_memory_region *sample_rom) +dmx_voice_card::dmx_voice_card(const machine_config &mconfig, const char *tag, device_t *owner, const dmx_voice_card_config &config, required_memory_region *sample_rom) : device_t(mconfig, DMX_VOICE_CARD, tag, owner, 0) , device_sound_interface(mconfig, *this) , m_timer(*this, "555_u5") , m_dac(*this, "dac_u8") + , m_vca(*this, "dmx_vca") + , m_filters(*this, "aa_sk_filter_%d", 0) , m_config(config) , m_sample_rom(sample_rom) { init_pitch(); } -dmx_voice_card::dmx_voice_card( - const machine_config &mconfig, const char *tag, device_t *owner, - uint32_t clock) +dmx_voice_card::dmx_voice_card(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, DMX_VOICE_CARD, tag, owner, clock) , device_sound_interface(mconfig, *this) , m_timer(*this, "555_u5") , m_dac(*this, "dac_u8") - , m_config(dmx_voice_card_config{}) + , m_vca(*this, "dmx_vca") + , m_filters(*this, "aa_sk_filter_%d", 0) + // Need non-zero entries for the filter for validation to pass. + , m_config(dmx_voice_card_config{.filter={1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}) { } @@ -245,16 +450,11 @@ void dmx_voice_card::trigger(bool tr0, bool tr1) m_stream->update(); m_counter = 0; m_counting = true; - m_volume = 1; - m_decaying = false; - if (m_config.pitch_control) select_pitch(); - else - configure_volume(); + m_vca->start(m_trigger_mode); - LOGMASKED(LOG_SOUND, "Trigger: (%d, %d) %d %f\n", - tr0, tr1, m_trigger_mode, m_volume); + LOGMASKED(LOG_SOUND, "Trigger: (%d, %d) %d %f\n", tr0, tr1, m_trigger_mode); } void dmx_voice_card::set_pitch_adj(s32 t1_percent) @@ -266,8 +466,28 @@ void dmx_voice_card::set_pitch_adj(s32 t1_percent) void dmx_voice_card::device_add_mconfig(machine_config &config) { + static constexpr const double SK_R3 = RES_M(999.99); + static constexpr const double SK_R4 = RES_R(0.001); + TIMER(config, m_timer).configure_generic(FUNC(dmx_voice_card::clock_callback)); - DAC76(config, m_dac, 0U).add_route(ALL_OUTPUTS, *this, 1.0); + DAC76(config, m_dac, 0U); + DMX_VOICE_CARD_VCA(config, m_vca, m_config); + + FILTER_BIQUAD(config, m_filters[0]).opamp_sk_lowpass_setup( + m_config.filter.r15, m_config.filter.r14, SK_R3, SK_R4, + m_config.filter.c5, m_config.filter.c4); + FILTER_BIQUAD(config, m_filters[1]).opamp_sk_lowpass_setup( + m_config.filter.r13, m_config.filter.r18, SK_R3, SK_R4, + m_config.filter.c6, m_config.filter.c7); + FILTER_BIQUAD(config, m_filters[2]).opamp_sk_lowpass_setup( + m_config.filter.r19, m_config.filter.r20, SK_R3, SK_R4, + m_config.filter.c8, m_config.filter.c9); + + m_dac->add_route(ALL_OUTPUTS, m_vca, 1.0); + m_vca->add_route(ALL_OUTPUTS, m_filters[0], 1.0); + m_filters[0]->add_route(ALL_OUTPUTS, m_filters[1], 1.0); + m_filters[1]->add_route(ALL_OUTPUTS, m_filters[2], 1.0); + m_filters[2]->add_route(ALL_OUTPUTS, *this, 1.0); } void dmx_voice_card::device_start() @@ -277,9 +497,6 @@ void dmx_voice_card::device_start() save_item(NAME(m_counting)); save_item(NAME(m_counter)); save_item(NAME(m_trigger_mode)); - save_item(NAME(m_volume)); - save_item(NAME(m_decaying)); - save_item(NAME(m_decay_start_time)); } void dmx_voice_card::device_reset() @@ -287,45 +504,17 @@ void dmx_voice_card::device_reset() m_trigger_mode = 0; reset_counter(); compute_pitch_variations(); - configure_volume(); } -void dmx_voice_card::sound_stream_update( - sound_stream &stream, - const std::vector &inputs, - std::vector &outputs) +void dmx_voice_card::sound_stream_update(sound_stream &stream, const std::vector &inputs, std::vector &outputs) { - const read_stream_view &in = inputs[0]; - write_stream_view &out = outputs[0]; - - float rc_inv = 0; - if (m_decaying) - { - float r_lower = R9; - if (m_trigger_mode == 1) - r_lower = RES_3_PARALLEL(R9, m_config.r12, m_config.r17); - else if (m_trigger_mode == 2) - r_lower = RES_2_PARALLEL(R9, m_config.r12); - rc_inv = 1.0F / ((R8 + r_lower) * m_config.c3); - } - - const int n = in.samples(); - attotime t = in.start_time() - m_decay_start_time; - for (int i = 0; i < n; ++i, t += in.sample_period()) - { - const float decay = m_decaying ? expf(-t.as_double() * rc_inv) : 1.0F; - out.put(i, decay * m_volume * in.get(i)); - if (m_counting && i == 0) - { - LOGMASKED(LOG_SAMPLES, "Sample: %d, %d, %f, %d, %f, %f\n", - i, m_counter, m_volume, m_decaying, t.as_double(), decay); - } - } + const int n = inputs[0].samples(); + for (int i = 0; i < n; ++i) + outputs[0].put(i, inputs[0].get(i)); } void dmx_voice_card::reset_counter() { - m_stream->update(); m_counter = 0; m_counting = false; } @@ -451,32 +640,6 @@ void dmx_voice_card::select_pitch() 1.0 / sampling_t.as_double()); } -void dmx_voice_card::configure_volume() -{ - // The equations below were derived from Kirchhoff analysis and verified - // with simulations: https://tinyurl.com/22wxwh8h - - static constexpr const float VD = 0.6; // Diode drop. - static constexpr const float MAX_IREF = 5.0 / (R8 + R9); - - const float r12 = m_config.r12; - const float r17 = m_config.r17; - - float i_ref = MAX_IREF; - if (m_trigger_mode == 1) - { - i_ref = (r12 * r17 * VCC + R8 * r12 * VD + R8 * r17 * VD) / - ((R8 * r12 * r17) + (r12 * r17 * R9) + (R8 * r17 * R9) + (R8 * r12 * R9)); - } - else if (m_trigger_mode == 2) - { - i_ref = (r12 * VCC + R8 * VD) / (r12 * R8 + R8 * R9 + r12 * R9); - } - - m_volume = i_ref / MAX_IREF; - LOGMASKED(LOG_VOLUME, "Volume %d, Iref: %f uA\n", m_volume, i_ref * 1e6f); -} - bool dmx_voice_card::is_decay_enabled() const { switch (m_config.decay) @@ -515,6 +678,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(dmx_voice_card::clock_callback) if (m_counter >= max_count) { reset_counter(); + m_vca->finish(); LOGMASKED(LOG_SOUND, "Done counting %d\n\n", m_config.split_rom); } @@ -536,14 +700,12 @@ TIMER_DEVICE_CALLBACK_MEMBER(dmx_voice_card::clock_callback) // the counter's bit 10 transitions to 1. static constexpr const u16 LATE_DECAY_START = 1 << 10; - if (!m_decaying && is_decay_enabled()) + if (!m_vca->in_decay() && is_decay_enabled()) { if ((is_early_decay_enabled() && m_counter >= EARLY_DECAY_START) || m_counter >= LATE_DECAY_START) { - m_stream->update(); - m_decaying = true; - m_decay_start_time = machine().time(); + m_vca->decay(); } } } @@ -553,6 +715,47 @@ namespace { constexpr const char MAINCPU_TAG[] = "z80"; constexpr const char NVRAM_TAG[] = "nvram"; +// There are two anti-aliasing / reconstruction filter setups used. One for +// lower- and one for higher-frequency voices. + +// ~10Khz cuttoff. +constexpr const dmx_voice_card_config::filter_components FILTER_CONFIG_LOW = +{ + .r15 = RES_K(6.8), + .r14 = RES_K(6.2), + .c5 = CAP_U(0.01), + .c4 = CAP_U(0.0047), + + .r13 = RES_K(9.1), + .r18 = RES_K(9.1), + .c6 = CAP_U(0.01), + .c7 = CAP_P(560), + + .r19 = RES_K(5.1), + .r20 = RES_K(5.1), + .c8 = CAP_U(0.047), + .c9 = CAP_P(200), +}; + +// ~16 KHz cuttoff. +constexpr const dmx_voice_card_config::filter_components FILTER_CONFIG_HIGH = +{ + .r15 = RES_K(4.7), + .r14 = RES_K(4.7), + .c5 = CAP_U(0.01), + .c4 = CAP_U(0.0047), + + .r13 = RES_K(5.6), + .r18 = RES_K(5.6), + .c6 = CAP_U(0.01), + .c7 = CAP_P(560), + + .r19 = RES_K(3.3), + .r20 = RES_K(3.3), + .c8 = CAP_U(0.047), + .c9 = CAP_P(200), +}; + // Voice card configurations below reverse R12 and R17 compared to the 1981 // schematics. See comments in dmx_voice_card_config for more on this. @@ -567,6 +770,7 @@ constexpr const dmx_voice_card_config BASS_CONFIG = .pitch_control = false, .decay = dmx_voice_card_config::decay_mode::ENABLED, .early_decay = dmx_voice_card_config::early_decay_mode::ENABLED, + .filter = FILTER_CONFIG_LOW, }; constexpr const dmx_voice_card_config SNARE_CONFIG = @@ -580,6 +784,7 @@ constexpr const dmx_voice_card_config SNARE_CONFIG = .pitch_control = false, .decay = dmx_voice_card_config::decay_mode::DISABLED, .early_decay = dmx_voice_card_config::early_decay_mode::ENABLED_ON_TR1, + .filter = FILTER_CONFIG_HIGH, }; // Some component values in HIHAT_CONFIG might be wrong. @@ -600,6 +805,7 @@ constexpr const dmx_voice_card_config HIHAT_CONFIG = .pitch_control = false, .decay = dmx_voice_card_config::decay_mode::ENABLED_ON_TR12, .early_decay = dmx_voice_card_config::early_decay_mode::ENABLED_ON_TR1, + .filter = FILTER_CONFIG_HIGH, }; constexpr const dmx_voice_card_config TOM_CONFIG = @@ -613,10 +819,16 @@ constexpr const dmx_voice_card_config TOM_CONFIG = .pitch_control = true, .decay = dmx_voice_card_config::decay_mode::ENABLED, .early_decay = dmx_voice_card_config::early_decay_mode::ENABLED, + .filter = FILTER_CONFIG_LOW, }; constexpr dmx_voice_card_config PERC_CONFIG(float c2) { + // The schematic and electrongate.com agree on all components for PERC1, + // but disagree for PERC2: + // * C2: 0.0033uF in schematic, but 0.0047uF on electrongate.com. + // * Filter: "high" configuration in the schematic, but "low" on + // electrongate.com. return { .c2 = c2, @@ -628,6 +840,7 @@ constexpr dmx_voice_card_config PERC_CONFIG(float c2) .pitch_control = false, .decay = dmx_voice_card_config::decay_mode::DISABLED, .early_decay = dmx_voice_card_config::early_decay_mode::ENABLED_ON_TR1, + .filter = FILTER_CONFIG_HIGH, }; } @@ -642,6 +855,7 @@ constexpr const dmx_voice_card_config CYMBAL_CONFIG = .pitch_control = false, .decay = dmx_voice_card_config::decay_mode::DISABLED, .early_decay = dmx_voice_card_config::early_decay_mode::ENABLED_ON_TR1, + .filter = FILTER_CONFIG_HIGH, }; From ed86f1d725cf77247f0b37c1c7e58fe2b82cad59 Mon Sep 17 00:00:00 2001 From: 987123879113 <63495610+987123879113@users.noreply.github.com> Date: Tue, 14 Jan 2025 19:19:04 +0900 Subject: [PATCH 14/80] DRC: Calculate negative and zero flags for shifts/rotates with a zero shift count. (#13232) * cpu/drcbec.cpp, cpu/drcbearm64.cpp, cpu/drcbex64.cpp, cpu/drcbex86.cpp: Calculate NZ flags for shifts/rotates by 0 bits. * cpu/drcbex86.cpp: Fixed flag calculation for 64-bit multiplication when result is zero. --- src/devices/cpu/drcbearm64.cpp | 103 ++++++------ src/devices/cpu/drcbec.cpp | 56 ++----- src/devices/cpu/drcbex64.cpp | 40 ++--- src/devices/cpu/drcbex86.cpp | 284 ++++++++++++++++++++++----------- 4 files changed, 273 insertions(+), 210 deletions(-) diff --git a/src/devices/cpu/drcbearm64.cpp b/src/devices/cpu/drcbearm64.cpp index b20359aab07e8..bc956d84c383b 100644 --- a/src/devices/cpu/drcbearm64.cpp +++ b/src/devices/cpu/drcbearm64.cpp @@ -810,9 +810,14 @@ void drcbe_arm64::get_shifted_bit(a64::Assembler &a, const a64::Gp &dst, const a void drcbe_arm64::calculate_carry_shift_left(a64::Assembler &a, const a64::Gp ®, const a64::Gp &shift, int maxBits) const { - Label skip = a.newLabel(); - a.cbz(shift, skip); + Label calc = a.newLabel(); + Label end = a.newLabel(); + + a.cbnz(shift, calc); + store_carry_reg(a, a64::xzr); + a.b(end); + a.bind(calc); const a64::Gp scratch = select_register(SCRATCH_REG1, reg.isGpW() ? 4 : 8); // carry = ((PARAM1 << (shift - 1)) >> maxBits) & 1 @@ -821,13 +826,16 @@ void drcbe_arm64::calculate_carry_shift_left(a64::Assembler &a, const a64::Gp &r a.lsr(scratch, reg, scratch); store_carry_reg(a, scratch); - a.bind(skip); + a.bind(end); } void drcbe_arm64::calculate_carry_shift_left_imm(a64::Assembler &a, const a64::Gp ®, const int shift, int maxBits) const { if (shift == 0) + { + store_carry_reg(a, a64::xzr); return; + } const a64::Gp scratch = select_register(SCRATCH_REG1, reg.isGpW() ? 4 : 8); @@ -838,9 +846,14 @@ void drcbe_arm64::calculate_carry_shift_left_imm(a64::Assembler &a, const a64::G void drcbe_arm64::calculate_carry_shift_right(a64::Assembler &a, const a64::Gp ®, const a64::Gp &shift) const { - Label skip = a.newLabel(); - a.cbz(shift, skip); + Label calc = a.newLabel(); + Label end = a.newLabel(); + + a.cbnz(shift, calc); + store_carry_reg(a, a64::xzr); + a.b(end); + a.bind(calc); const a64::Gp scratch = select_register(SCRATCH_REG1, reg.isGpW() ? 4 : 8); // carry = (PARAM1 >> (shift - 1)) & 1 @@ -848,13 +861,16 @@ void drcbe_arm64::calculate_carry_shift_right(a64::Assembler &a, const a64::Gp & a.lsr(scratch, reg, scratch); store_carry_reg(a, scratch); - a.bind(skip); + a.bind(end); } void drcbe_arm64::calculate_carry_shift_right_imm(a64::Assembler &a, const a64::Gp ®, const int shift) const { if (shift == 0) + { + store_carry_reg(a, a64::xzr); return; + } const a64::Gp scratch = select_register(SCRATCH_REG1, reg.isGpW() ? 4 : 8); @@ -3517,16 +3533,10 @@ template void drcbe_arm64::op_shift(a64::Assembler &a, co a.emit(Opcode, dst, src, shift); - if (shift != 0) - { - if (Opcode == a64::Inst::kIdRor || Opcode == a64::Inst::kIdLsr || Opcode == a64::Inst::kIdAsr) - calculate_carry_shift_right_imm(a, src, shift); - else if (Opcode == a64::Inst::kIdLsl) - calculate_carry_shift_left_imm(a, src, shift, maxBits); - - if (inst.flags()) - a.tst(dst, dst); - } + if (Opcode == a64::Inst::kIdRor || Opcode == a64::Inst::kIdLsr || Opcode == a64::Inst::kIdAsr) + calculate_carry_shift_right_imm(a, src, shift); + else if (Opcode == a64::Inst::kIdLsl) + calculate_carry_shift_left_imm(a, src, shift, maxBits); } else { @@ -3536,20 +3546,15 @@ template void drcbe_arm64::op_shift(a64::Assembler &a, co a.emit(Opcode, dst, src, scratch); - Label skip = a.newLabel(); - a.cbz(scratch, skip); - if (Opcode == a64::Inst::kIdRor || Opcode == a64::Inst::kIdLsr || Opcode == a64::Inst::kIdAsr) calculate_carry_shift_right(a, src, scratch); else if (Opcode == a64::Inst::kIdLsl) calculate_carry_shift_left(a, src, scratch, maxBits); - - if (inst.flags()) - a.tst(dst, dst); - - a.bind(skip); } + if (inst.flags()) + a.tst(dst, dst); + // save dst after using inputs for calculations so the registers have no chance of being overwritten mov_param_reg(a, inst.size(), dstp, dst); } @@ -3594,18 +3599,10 @@ void drcbe_arm64::op_rol(a64::Assembler &a, const uml::instruction &inst) a.ror(output, param, s2); } - if (s != 0) - { - calculate_carry_shift_left_imm(a, param, s, maxBits); - - if (inst.flags()) - a.tst(output, output); - } + calculate_carry_shift_left_imm(a, param, s, maxBits); } else { - Label skip = a.newLabel(); - mov_reg_param(a, inst.size(), shift, src2p); const a64::Gp scratch = select_register(SCRATCH_REG1, inst.size()); @@ -3614,16 +3611,12 @@ void drcbe_arm64::op_rol(a64::Assembler &a, const uml::instruction &inst) a.sub(scratch, scratch, scratch2); a.ror(output, param, scratch); - a.cbz(scratch2, skip); - calculate_carry_shift_left(a, param, scratch2, maxBits); - - if (inst.flags()) - a.tst(output, output); - - a.bind(skip); } + if (inst.flags()) + a.tst(output, output); + mov_param_reg(a, inst.size(), dstp, output); } @@ -3666,14 +3659,13 @@ void drcbe_arm64::op_rolc(a64::Assembler &a, const uml::instruction &inst) a.bfi(output.x(), FLAGS_REG, shift - 1, 1); a.bfi(output, param1, shift, (inst.size() * 8) - shift); a.bfi(FLAGS_REG, carry.x(), 0, 1); - - if (inst.flags()) - a.tst(output, output); } else { a.mov(output, param1); } + + calculate_carry_shift_left_imm(a, param1, shift, maxBits); } else { @@ -3708,14 +3700,14 @@ void drcbe_arm64::op_rolc(a64::Assembler &a, const uml::instruction &inst) a.orr(output, output, carry); - calculate_carry_shift_left(a, param1, scratch2, maxBits); - - if (inst.flags()) - a.tst(output, output); - a.bind(skip3); + + calculate_carry_shift_left(a, param1, scratch2, maxBits); } + if (inst.flags()) + a.tst(output, output); + mov_param_reg(a, inst.size(), dstp, output); } @@ -3760,14 +3752,13 @@ void drcbe_arm64::op_rorc(a64::Assembler &a, const uml::instruction &inst) if (shift > 1) a.bfi(output, param1, (inst.size() * 8) - shift + 1, shift - 1); a.bfi(FLAGS_REG, carry.x(), 0, 1); - - if (inst.flags()) - a.tst(output, output); } else { a.mov(output, param1); } + + calculate_carry_shift_right_imm(a, param1, shift); } else { @@ -3803,14 +3794,14 @@ void drcbe_arm64::op_rorc(a64::Assembler &a, const uml::instruction &inst) a.orr(output, output, carry); - calculate_carry_shift_right(a, param1, scratch2); - - if (inst.flags()) - a.tst(output, output); - a.bind(skip3); + + calculate_carry_shift_right(a, param1, scratch2); } + if (inst.flags()) + a.tst(output, output); + mov_param_reg(a, inst.size(), dstp, output); } diff --git a/src/devices/cpu/drcbec.cpp b/src/devices/cpu/drcbec.cpp index 5e93429dbf650..82cfc10979abd 100644 --- a/src/devices/cpu/drcbec.cpp +++ b/src/devices/cpu/drcbec.cpp @@ -1187,11 +1187,9 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_SHL, 4, 1): shift = PARAM2 & 31; temp32 = PARAM1 << shift; + flags = FLAGS32_NZ(temp32); if (shift != 0) - { - flags = FLAGS32_NZ(temp32); flags |= ((PARAM1 << (shift - 1)) >> 31) & FLAG_C; - } PARAM0 = temp32; break; @@ -1202,11 +1200,9 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_SHR, 4, 1): shift = PARAM2 & 31; temp32 = PARAM1 >> shift; + flags = FLAGS32_NZ(temp32); if (shift != 0) - { - flags = FLAGS32_NZ(temp32); flags |= (PARAM1 >> (shift - 1)) & FLAG_C; - } PARAM0 = temp32; break; @@ -1217,11 +1213,9 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_SAR, 4, 1): shift = PARAM2 & 31; temp32 = (int32_t)PARAM1 >> shift; + flags = FLAGS32_NZ(temp32); if (shift != 0) - { - flags = FLAGS32_NZ(temp32); flags |= (PARAM1 >> (shift - 1)) & FLAG_C; - } PARAM0 = temp32; break; @@ -1232,11 +1226,9 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_ROL, 4, 1): shift = PARAM2 & 31; temp32 = rotl_32(PARAM1, shift); + flags = FLAGS32_NZ(temp32); if (shift != 0) - { - flags = FLAGS32_NZ(temp32); flags |= ((PARAM1 << (shift - 1)) >> 31) & FLAG_C; - } PARAM0 = temp32; break; @@ -1258,11 +1250,9 @@ int drcbe_c::execute(code_handle &entry) temp32 = (PARAM1 << shift) | (flags & FLAG_C); else temp32 = PARAM1; + flags = FLAGS32_NZ(temp32); if (shift != 0) - { - flags = FLAGS32_NZ(temp32); flags |= ((PARAM1 << (shift - 1)) >> 31) & FLAG_C; - } PARAM0 = temp32; break; @@ -1273,11 +1263,9 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_ROR, 4, 1): shift = PARAM2 & 31; temp32 = rotr_32(PARAM1, shift); + flags = FLAGS32_NZ(temp32); if (shift != 0) - { - flags = FLAGS32_NZ(temp32); flags |= (PARAM1 >> (shift - 1)) & FLAG_C; - } PARAM0 = temp32; break; @@ -1299,11 +1287,9 @@ int drcbe_c::execute(code_handle &entry) temp32 = (PARAM1 >> shift) | ((flags & FLAG_C) << 31); else temp32 = PARAM1; + flags = FLAGS32_NZ(temp32); if (shift != 0) - { - flags = FLAGS32_NZ(temp32); flags |= (PARAM1 >> (shift - 1)) & FLAG_C; - } PARAM0 = temp32; break; @@ -1823,11 +1809,9 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_SHL, 8, 1): shift = DPARAM2 & 63; temp64 = DPARAM1 << shift; + flags = FLAGS64_NZ(temp64); if (shift != 0) - { - flags = FLAGS64_NZ(temp64); flags |= ((DPARAM1 << (shift - 1)) >> 63) & FLAG_C; - } DPARAM0 = temp64; break; @@ -1838,11 +1822,9 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_SHR, 8, 1): shift = DPARAM2 & 63; temp64 = DPARAM1 >> shift; + flags = FLAGS64_NZ(temp64); if (shift != 0) - { - flags = FLAGS64_NZ(temp64); flags |= (DPARAM1 >> (shift - 1)) & FLAG_C; - } DPARAM0 = temp64; break; @@ -1853,11 +1835,9 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_SAR, 8, 1): shift = DPARAM2 & 63; temp64 = (int64_t)DPARAM1 >> shift; + flags = FLAGS64_NZ(temp64); if (shift != 0) - { - flags = FLAGS64_NZ(temp64); flags |= (DPARAM1 >> (shift - 1)) & FLAG_C; - } DPARAM0 = temp64; break; @@ -1868,11 +1848,9 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_ROL, 8, 1): shift = DPARAM2 & 63; temp64 = rotl_64(DPARAM1, shift); + flags = FLAGS64_NZ(temp64); if (shift != 0) - { - flags = FLAGS64_NZ(temp64); flags |= ((DPARAM1 << (shift - 1)) >> 63) & FLAG_C; - } DPARAM0 = temp64; break; @@ -1894,11 +1872,9 @@ int drcbe_c::execute(code_handle &entry) temp64 = (DPARAM1 << shift) | (flags & FLAG_C); else temp64 = DPARAM1; + flags = FLAGS64_NZ(temp64); if (shift != 0) - { - flags = FLAGS64_NZ(temp64); flags |= ((DPARAM1 << (shift - 1)) >> 63) & FLAG_C; - } DPARAM0 = temp64; break; @@ -1909,11 +1885,9 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_ROR, 8, 1): shift = DPARAM2 & 63; temp64 = rotr_64(DPARAM1, shift); + flags = FLAGS64_NZ(temp64); if (shift != 0) - { - flags = FLAGS64_NZ(temp64); flags |= (DPARAM1 >> (shift - 1)) & FLAG_C; - } DPARAM0 = temp64; break; @@ -1935,11 +1909,9 @@ int drcbe_c::execute(code_handle &entry) temp64 = (DPARAM1 >> shift) | (((uint64_t)flags & FLAG_C) << 63); else temp64 = DPARAM1; + flags = FLAGS64_NZ(temp64); if (shift != 0) - { - flags = FLAGS64_NZ(temp64); flags |= (DPARAM1 >> (shift - 1)) & FLAG_C; - } DPARAM0 = temp64; break; diff --git a/src/devices/cpu/drcbex64.cpp b/src/devices/cpu/drcbex64.cpp index 5e08d498443ad..aa7b3dc68e210 100644 --- a/src/devices/cpu/drcbex64.cpp +++ b/src/devices/cpu/drcbex64.cpp @@ -1162,52 +1162,54 @@ void drcbe_x64::shift_op_param(Assembler &a, Inst::Id const opcode, size_t opsiz { if (param.is_immediate()) { - if ((param.immediate() & (opsize * 8 - 1)) == 0) - return; + const uint32_t bitshift = param.immediate() & (opsize * 8 - 1); - a.emit(opcode, dst, imm(param.immediate())); + if (bitshift != 0) + a.emit(opcode, dst, imm(param.immediate())); if (update_flags) - calculate_status_flags(a, opsize, dst, FLAG_S | FLAG_Z); // calculate status flags but preserve carry + { + if (bitshift == 0) + a.clc(); // throw away carry since it'll never be used + + calculate_status_flags(a, opsize, dst, FLAG_S | FLAG_Z); + } } else { - Label restore_flags = a.newLabel(); + Label calc = a.newLabel(); Label end = a.newLabel(); Gp shift = cl; a.mov(r10, rax); - a.seto(al); - a.movzx(r11, al); - a.lahf(); // no status flags should change if shift is 0, so preserve flags + a.lahf(); mov_reg_param(a, shift, param); a.and_(shift, opsize * 8 - 1); a.test(shift, shift); - a.short_().jz(restore_flags); - a.sahf(); // restore flags to keep carry for rolc/rorc - a.mov(rax, r10); + a.short_().jnz(calc); - a.emit(opcode, dst, shift); + a.mov(rax, r10); if (update_flags) - calculate_status_flags(a, opsize, dst, FLAG_S | FLAG_Z); // calculate status flags but preserve carry + a.clc(); // throw away carry since it'll never be used a.short_().jmp(end); - a.bind(restore_flags); - - // restore overflow flag - a.add(r11.r32(), 0x7fffffff); + a.bind(calc); - // restore other flags - a.sahf(); + a.sahf(); // restore flags to keep carry for rolc/rorc a.mov(rax, r10); + a.emit(opcode, dst, shift); + a.bind(end); + + if (update_flags) + calculate_status_flags(a, opsize, dst, FLAG_S | FLAG_Z); // calculate status flags but preserve carry } } diff --git a/src/devices/cpu/drcbex86.cpp b/src/devices/cpu/drcbex86.cpp index 19fc002949b87..f97ef78046852 100644 --- a/src/devices/cpu/drcbex86.cpp +++ b/src/devices/cpu/drcbex86.cpp @@ -1122,44 +1122,52 @@ void drcbe_x86::shift_op_param(Assembler &a, Inst::Id const opcode, size_t opsiz { if (param.is_immediate()) { - uint32_t bitshift = (param.immediate() & (opsize * 8 - 1)); + const uint32_t bitshift = param.immediate() & (opsize * 8 - 1); - if (optimize(a, dst, param) || bitshift == 0) - return; - - a.emit(opcode, dst, imm(bitshift)); + if (!optimize(a, dst, param) && bitshift != 0) + a.emit(opcode, dst, imm(bitshift)); if (update_flags) + { + if (bitshift == 0) + a.clc(); // throw away carry since it'll never be used + calculate_status_flags(a, dst, FLAG_S | FLAG_Z); // calculate status flags but preserve carry + } } else { - Label restore_flags = a.newLabel(); + Label calc = a.newLabel(); Label end = a.newLabel(); Gp shift = dst.as().id() == ecx.id() ? ebx : ecx; - a.pushfd(); // no status flags should change if shift is 0, so preserve flags + a.pushfd(); // preserve flags for carry emit_mov_r32_p32(a, shift, param); a.and_(shift, opsize * 8 - 1); a.test(shift, shift); - a.short_().jz(restore_flags); - a.popfd(); // restore flags to keep carry for rolc/rorc + a.short_().jnz(calc); - a.emit(opcode, dst, shift); + a.popfd(); // preserved flags not needed so throw it away if (update_flags) - calculate_status_flags(a, dst, FLAG_S | FLAG_Z); // calculate status flags but preserve carry + a.clc(); // throw away carry since it'll never be used a.short_().jmp(end); - a.bind(restore_flags); - a.popfd(); + a.bind(calc); + + a.popfd(); // restore flags to keep carry for rolc/rorc + + a.emit(opcode, dst, shift); a.bind(end); + + if (update_flags) + calculate_status_flags(a, dst, FLAG_S | FLAG_Z); // calculate status flags but preserve carry } } @@ -1552,8 +1560,6 @@ void drcbe_x86::emit_shl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, ;// skip else { - saveflags = saveflags && count > 0; - while (count >= 32) { if (inst.flags() != 0) @@ -1572,13 +1578,25 @@ void drcbe_x86::emit_shl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, if (inst.flags() != 0 || count > 0) { a.shld(reghi, reglo, count); // shld reghi,reglo,count - if (saveflags) a.pushfd(); // pushf + if (saveflags && count != 0) a.pushfd(); // pushf a.shl(reglo, count); // shl reglo,count } } if (saveflags) - emit_combine_z_shl_flags(a); + { + if (count == 0) + { + a.test(reglo, reglo); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); + emit_combine_z_flags(a); + } + else + { + emit_combine_z_shl_flags(a); + } + } } else { @@ -1587,8 +1605,6 @@ void drcbe_x86::emit_shl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, Label skip1 = a.newLabel(); Label skip2 = a.newLabel(); - a.pushfd(); - emit_mov_r32_p32(a, ecx, param); // mov ecx,param a.and_(ecx, 63); @@ -1622,14 +1638,21 @@ void drcbe_x86::emit_shl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.shl(reglo, cl); // shl reglo,cl if (saveflags) + { emit_combine_z_shl_flags(a); - a.lea(esp, ptr(esp, 4)); - - a.jmp(end); + a.short_().jmp(end); + } a.bind(skipall); - a.popfd(); + + if (saveflags) + { + a.test(reglo, reglo); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); + emit_combine_z_flags(a); + } a.bind(end); } @@ -1651,8 +1674,6 @@ void drcbe_x86::emit_shr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, ;// skip else { - saveflags = saveflags && count > 0; - while (count >= 32) { if (inst.flags() != 0) @@ -1671,22 +1692,32 @@ void drcbe_x86::emit_shr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, if (inst.flags() != 0 || count > 0) { a.shrd(reglo, reghi, count); // shrd reglo,reghi,count - if (saveflags) a.pushfd(); // pushf + if (saveflags && count != 0) a.pushfd(); // pushf a.shr(reghi, count); // shr reghi,count } } if (saveflags) { - // take carry from lower register's flags - a.pushfd(); - a.mov(ecx, dword_ptr(esp, 4)); - a.and_(ecx, 0x01); // carry flag - a.and_(dword_ptr(esp, 0), ~0x01); - a.or_(dword_ptr(esp, 0), ecx); - a.popfd(); + if (count == 0) + { + a.test(reglo, reglo); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); + emit_combine_z_flags(a); + } + else + { + // take carry from lower register's flags + a.pushfd(); + a.mov(ecx, dword_ptr(esp, 4)); + a.and_(ecx, 0x01); // carry flag + a.and_(dword_ptr(esp, 0), ~0x01); + a.or_(dword_ptr(esp, 0), ecx); + a.popfd(); - emit_combine_z_flags(a); + emit_combine_z_flags(a); + } } } else @@ -1696,8 +1727,6 @@ void drcbe_x86::emit_shr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, Label skip1 = a.newLabel(); Label skip2 = a.newLabel(); - a.pushfd(); - emit_mov_r32_p32(a, ecx, param); // mov ecx,param a.and_(ecx, 63); @@ -1741,14 +1770,19 @@ void drcbe_x86::emit_shr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.popfd(); emit_combine_z_flags(a); - } - - a.lea(esp, ptr(esp, 4)); - a.jmp(end); + a.short_().jmp(end); + } a.bind(skipall); - a.popfd(); + + if (saveflags) + { + a.test(reglo, reglo); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); + emit_combine_z_flags(a); + } a.bind(end); } @@ -1770,8 +1804,6 @@ void drcbe_x86::emit_sar_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, ;// skip else { - saveflags = saveflags && count > 0; - while (count >= 32) { if (inst.flags() != 0) @@ -1790,32 +1822,40 @@ void drcbe_x86::emit_sar_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, if (inst.flags() != 0 || count > 0) { a.shrd(reglo, reghi, count); // shrd reglo,reghi,count - if (saveflags) a.pushfd(); // pushf + if (saveflags && count != 0) a.pushfd(); // pushf a.sar(reghi, count); // sar reghi,count } } if (saveflags) { - // take carry from lower register's flags - a.pushfd(); - a.mov(ecx, dword_ptr(esp, 4)); - a.and_(ecx, 0x01); // carry flag - a.and_(dword_ptr(esp, 0), ~0x01); - a.or_(dword_ptr(esp, 0), ecx); - a.popfd(); + if (count == 0) + { + a.test(reglo, reglo); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); + emit_combine_z_flags(a); + } + else + { + // take carry from lower register's flags + a.pushfd(); + a.mov(ecx, dword_ptr(esp, 4)); + a.and_(ecx, 0x01); // carry flag + a.and_(dword_ptr(esp, 0), ~0x01); + a.or_(dword_ptr(esp, 0), ecx); + a.popfd(); - emit_combine_z_flags(a); + emit_combine_z_flags(a); + } } } else { - Label skipall = a.newLabel(); - Label end = a.newLabel(); Label skip1 = a.newLabel(); Label skip2 = a.newLabel(); - - a.pushfd(); + Label skipall = a.newLabel(); + Label end = a.newLabel(); emit_mov_r32_p32(a, ecx, param); // mov ecx,param @@ -1860,14 +1900,19 @@ void drcbe_x86::emit_sar_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.popfd(); emit_combine_z_flags(a); - } - a.lea(esp, ptr(esp, 4)); - - a.jmp(end); + a.short_().jmp(end); + } a.bind(skipall); - a.popfd(); + + if (saveflags) + { + a.test(reglo, reglo); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); + emit_combine_z_flags(a); + } a.bind(end); } @@ -1893,8 +1938,6 @@ void drcbe_x86::emit_rol_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, ;// skip else { - saveflags = saveflags && count > 0; - while (count >= 32) { if (inst.flags() != 0) @@ -1913,24 +1956,34 @@ void drcbe_x86::emit_rol_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.mov(ecx, reglo); a.shld(reglo, reghi, count); - if (saveflags) a.pushfd(); + if (saveflags && count != 0) a.pushfd(); a.shld(reghi, ecx, count); } if (saveflags) - emit_combine_zs_flags(a); + { + if (count == 0) + { + a.test(reglo, reglo); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); + emit_combine_z_flags(a); + } + else + { + emit_combine_zs_flags(a); + } + } } else { - Label end = a.newLabel(); Label skipall = a.newLabel(); + Label end = a.newLabel(); Label skip1 = a.newLabel(); Label shift_loop = a.newLabel(); emit_mov_r32_p32(a, ecx, param); - a.pushfd(); - a.and_(ecx, 63); a.test(ecx, ecx); a.short_().jz(skipall); @@ -1956,20 +2009,26 @@ void drcbe_x86::emit_rol_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.bind(skip1); reset_last_upper_lower_reg(); - a.mov(tempreg, reglo); a.shld(reglo, reghi, cl); if (saveflags) a.pushfd(); a.shld(reghi, tempreg, cl); if (saveflags) + { emit_combine_zs_flags(a); - - a.lea(esp, ptr(esp, 4)); - a.jmp(end); + a.short_().jmp(end); + } a.bind(skipall); - a.popfd(); + + if (saveflags) + { + a.test(reglo, reglo); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); + emit_combine_z_flags(a); + } a.bind(end); } @@ -1997,8 +2056,6 @@ void drcbe_x86::emit_ror_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, ;// skip else { - saveflags = saveflags && count > 0; - while (count >= 32) { if (inst.flags() != 0) @@ -2017,24 +2074,34 @@ void drcbe_x86::emit_ror_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.mov(tempreg, reghi); a.shrd(reghi, reglo, count); - if (saveflags) a.pushfd(); + if (saveflags && count != 0) a.pushfd(); a.shrd(reglo, tempreg, count); if (saveflags) - emit_combine_zs_flags(a); + { + if (count == 0) + { + a.test(reglo, reglo); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); + emit_combine_z_flags(a); + } + else + { + emit_combine_zs_flags(a); + } + } } } else { - Label end = a.newLabel(); Label skipall = a.newLabel(); + Label end = a.newLabel(); Label skip1 = a.newLabel(); Label shift_loop = a.newLabel(); emit_mov_r32_p32(a, ecx, param); - a.pushfd(); - a.and_(ecx, 63); a.test(ecx, ecx); a.short_().jz(skipall); @@ -2060,20 +2127,26 @@ void drcbe_x86::emit_ror_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.bind(skip1); reset_last_upper_lower_reg(); - a.mov(tempreg, reghi); a.shrd(reghi, reglo, cl); if (saveflags) a.pushfd(); a.shrd(reglo, tempreg, cl); if (saveflags) + { emit_combine_zs_flags(a); - - a.lea(esp, ptr(esp, 4)); - a.jmp(end); + a.short_().jmp(end); + } a.bind(skipall); - a.popfd(); + + if (saveflags) + { + a.test(reglo, reglo); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); + emit_combine_z_flags(a); + } a.bind(end); } @@ -2092,6 +2165,7 @@ void drcbe_x86::emit_rcl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, Label loop = a.newLabel(); Label skipall = a.newLabel(); Label skiploop = a.newLabel(); + Label end = a.newLabel(); a.pushfd(); // keep carry flag after and emit_mov_r32_p32_keepflags(a, ecx, param); @@ -2107,7 +2181,7 @@ void drcbe_x86::emit_rcl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.lea(ecx, ptr(ecx, -1)); a.rcl(reglo, 1); a.rcl(reghi, 1); - a.jmp(loop); + a.short_().jmp(loop); a.bind(skiploop); reset_last_upper_lower_reg(); @@ -2120,9 +2194,21 @@ void drcbe_x86::emit_rcl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.pushfd(); calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); emit_combine_z_flags(a); + + a.short_().jmp(end); } a.bind(skipall); + + if (inst.flags()) + { + a.test(reglo, reglo); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); + emit_combine_z_flags(a); + } + + a.bind(end); reset_last_upper_lower_reg(); } @@ -2137,6 +2223,7 @@ void drcbe_x86::emit_rcr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, Label loop = a.newLabel(); Label skipall = a.newLabel(); Label skiploop = a.newLabel(); + Label end = a.newLabel(); a.pushfd(); // keep carry flag after and emit_mov_r32_p32_keepflags(a, ecx, param); @@ -2152,7 +2239,7 @@ void drcbe_x86::emit_rcr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.lea(ecx, ptr(ecx, -1)); a.rcr(reghi, 1); a.rcr(reglo, 1); - a.jmp(loop); + a.short_().jmp(loop); a.bind(skiploop); reset_last_upper_lower_reg(); @@ -2165,9 +2252,20 @@ void drcbe_x86::emit_rcr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.pushfd(); calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); emit_combine_z_flags(a); + + a.short_().jmp(end); } a.bind(skipall); + if (inst.flags()) + { + a.test(reglo, reglo); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); + emit_combine_z_flags(a); + } + + a.bind(end); reset_last_upper_lower_reg(); } @@ -3614,7 +3712,7 @@ void drcbe_x86::op_carry(Assembler &a, const instruction &inst) if (bitp.is_immediate()) { - uint32_t bitshift = (bitp.immediate() & (inst.size() * 8 - 1)); + const uint32_t bitshift = bitp.immediate() & (inst.size() * 8 - 1); if (bitshift < 32) { if (srcp.is_memory()) @@ -5335,7 +5433,7 @@ void drcbe_x86::op_lzcnt(Assembler &a, const instruction &inst) a.jz(skip); a.xor_(edx, 31 ^ 63); a.mov(dstreg, edx); - a.jmp(end); + a.short_().jmp(end); a.bind(skip); a.mov(edx, 64 ^ 63); @@ -6610,9 +6708,9 @@ int drcbe_x86::dmulu(uint64_t &dstlo, uint64_t &dsthi, uint64_t src1, uint64_t s dstlo = lo; if (halfmul_flags) - return ((lo >> 60) & FLAG_S) | ((hi != 0) << 1); + return ((lo >> 60) & FLAG_S) | ((hi != 0) << 1) | ((dstlo == 0) << 2); - return ((hi >> 60) & FLAG_S) | ((hi != 0) << 1); + return ((hi >> 60) & FLAG_S) | ((hi != 0) << 1) | ((dsthi == 0 && dstlo == 0) << 2); } @@ -6668,9 +6766,9 @@ int drcbe_x86::dmuls(uint64_t &dstlo, uint64_t &dsthi, int64_t src1, int64_t src dstlo = lo; if (halfmul_flags) - return ((lo >> 60) & FLAG_S) | ((hi != ((int64_t)lo >> 63)) << 1); + return ((lo >> 60) & FLAG_S) | ((hi != ((int64_t)lo >> 63)) << 1) | ((dstlo == 0) << 2); - return ((hi >> 60) & FLAG_S) | ((hi != ((int64_t)lo >> 63)) << 1); + return ((hi >> 60) & FLAG_S) | ((hi != ((int64_t)lo >> 63)) << 1) | ((dsthi == 0 && dstlo == 0) << 2); } From faeca8f2551a01abbcbc0e790e94555300d796eb Mon Sep 17 00:00:00 2001 From: angelosa Date: Tue, 14 Jan 2025 11:40:22 +0100 Subject: [PATCH 15/80] amiga/agnus_copper.cpp: 0x5c is actual h blank minimum position --- src/mame/amiga/agnus_copper.cpp | 7 ++++--- src/mame/amiga/amiga_m.cpp | 8 +++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/mame/amiga/agnus_copper.cpp b/src/mame/amiga/agnus_copper.cpp index a4c74d4e8028a..0af247679479f 100644 --- a/src/mame/amiga/agnus_copper.cpp +++ b/src/mame/amiga/agnus_copper.cpp @@ -324,8 +324,9 @@ int agnus_copper_device::execute_next(int xpos, int ypos, bool is_blitter_busy, return xpos; } // delay write to the next available DMA slot if not in blanking area - // - bchvolly (title), suprfrog & abreed (bottom playfield rows) - const bool horizontal_blank = xpos < 0x47; + // - suprfrog & abreed (bottom playfield rows). + // - beast, biochall and cd32 bios wants this to be 0x5c + const bool horizontal_blank = xpos <= 0x5c; const int move_offset = horizontal_blank ? 0 : std::max(num_planes - 4, 0); m_pending_offset = word0; @@ -358,7 +359,7 @@ int agnus_copper_device::execute_next(int xpos, int ypos, bool is_blitter_busy, /* handle a wait */ if ((word1 & 1) == 0) { - const bool horizontal_blank = xpos < 0x47; + const bool horizontal_blank = xpos <= 0x5c; const int wait_offset = horizontal_blank ? 0 : std::max(num_planes - 4, 0) + 1; LOGINST(" WAIT %04x & %04x (currently %04x, num planes %d +%d)\n", diff --git a/src/mame/amiga/amiga_m.cpp b/src/mame/amiga/amiga_m.cpp index e0e2118c7aec8..2f59fc4bbba6e 100644 --- a/src/mame/amiga/amiga_m.cpp +++ b/src/mame/amiga/amiga_m.cpp @@ -1241,6 +1241,11 @@ void amiga_state::aga_map(address_map &map) void amiga_state::custom_chip_reset() { + // TODO: not entirely correct + // - OCS Denise returns open bus + // - ECS Denise should return 0xff << 8 | ID + // - AGA Lisa bits 15-10 are jumper selectable (at least on A4000), returns 0xfc << 8 | ID + // cfr. https://eab.abime.net/showpost.php?p=627136&postcount=59 CUSTOM_REG(REG_DENISEID) = m_denise_id; CUSTOM_REG(REG_VPOSR) = m_agnus_id << 8; CUSTOM_REG(REG_DDFSTRT) = 0x18; @@ -1367,7 +1372,8 @@ uint16_t amiga_state::custom_chip_r(offs_t offset) temp = CUSTOM_REG(REG_CLXDAT); if (!machine().side_effects_disabled()) CUSTOM_REG(REG_CLXDAT) = 0; - // - "Barney [& Freddy] Mouse" requires bit 15 high all the time + // Undocumented bit 15 always high + // - "Barney [& Freddy] Mouse" will always detect a player-enemy hit out of iframe cycles otherwise return temp | (1 << 15); case REG_DENISEID: From 790786657794192697b8b0054f1c4709ebb7829d Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 14 Jan 2025 14:25:39 +0100 Subject: [PATCH 16/80] micro3d: remove obsolete underclock hack --- src/mame/misc/micro3d.cpp | 4 ++-- src/mame/misc/micro3d.h | 1 - src/mame/misc/micro3d_m.cpp | 10 ---------- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/mame/misc/micro3d.cpp b/src/mame/misc/micro3d.cpp index e57e0c56caed1..4edf916788f75 100644 --- a/src/mame/misc/micro3d.cpp +++ b/src/mame/misc/micro3d.cpp @@ -8,7 +8,7 @@ Games supported: * F-15 Strike Eagle [3 sets] - * B.O.T.S.S. - Battle of the Solar System [2 sets] + * B.O.T.S.S.: Battle of the Solar System [2 sets] * Tank Battle (prototype) * Super Tank Attack (prototype) @@ -339,7 +339,7 @@ void micro3d_state::micro3d(machine_config &config) m_audiocpu->port_out_cb<3>().set(FUNC(micro3d_state::sound_p3_w)); MC68681(config, m_duart, 3.6864_MHz_XTAL); - m_duart->irq_cb().set(FUNC(micro3d_state::duart_irq_handler)); + m_duart->irq_cb().set_inputline("maincpu", M68K_IRQ_3); m_duart->a_tx_cb().set("monitor_host", FUNC(rs232_port_device::write_txd)); m_duart->b_tx_cb().set(FUNC(micro3d_state::duart_txb)); m_duart->inport_cb().set(FUNC(micro3d_state::duart_input_r)); diff --git a/src/mame/misc/micro3d.h b/src/mame/misc/micro3d.h index 47af053ac7ab2..1e32da2e09cad 100644 --- a/src/mame/misc/micro3d.h +++ b/src/mame/misc/micro3d.h @@ -177,7 +177,6 @@ class micro3d_state : public driver_device INTERRUPT_GEN_MEMBER(vblank); TIMER_CALLBACK_MEMBER(mac_done_callback); void upd7759_w(uint8_t data); - void duart_irq_handler(int state); uint8_t duart_input_r(); void duart_output_w(uint8_t data); void duart_txb(int state); diff --git a/src/mame/misc/micro3d_m.cpp b/src/mame/misc/micro3d_m.cpp index 3d2b413a57aa2..4be9c6aa43d13 100644 --- a/src/mame/misc/micro3d_m.cpp +++ b/src/mame/misc/micro3d_m.cpp @@ -32,11 +32,6 @@ static constexpr XTAL MAC_CLK = XTAL(10'000'000); * *************************************/ -void micro3d_state::duart_irq_handler(int state) -{ - m_maincpu->set_input_line(3, state); -} - void micro3d_state::duart_txb(int state) { if (state) @@ -481,11 +476,6 @@ void micro3d_state::init_micro3d() /* The Am29000 program seems to rely on RAM from 0x00470000 onwards being non-zero on a reset, otherwise the 3D object data doesn't get uploaded! */ space.write_dword(0x00470000, 0xa5a5a5a5); - - /* TODO? BOTSS crashes when starting the final stage because the 68000 - overwrites memory in use by the Am29000. Slowing down the 68000 slightly - avoids this */ - m_maincpu->set_clock_scale(0.945f); } void micro3d_state::init_botss() From 96736e433eec420fb544a6983eaa2dd8098ac82b Mon Sep 17 00:00:00 2001 From: angelosa Date: Tue, 14 Jan 2025 14:44:27 +0100 Subject: [PATCH 17/80] amiga/paulafdc.cpp: stabilize wordsync --- src/mame/amiga/paulafdc.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/mame/amiga/paulafdc.cpp b/src/mame/amiga/paulafdc.cpp index 33df573e72ee9..103af564b62f2 100644 --- a/src/mame/amiga/paulafdc.cpp +++ b/src/mame/amiga/paulafdc.cpp @@ -7,13 +7,6 @@ Contained inside MOS 8364 Paula device TODO: - - Some games currently writes 2+ dsksync to the buffer (marked as "[FDC] dsksync" in SW list): - Current workaround: - 1. comment out dma_write in DMA_WAIT_START handling and change the dma_state *only*; - 2. remove all of the non-DMA_WAIT_START phase inside the dsksync sub-section; - NB: according to documentation syncing doesn't really write anything on the bus, - so technically this "workaround" is more correct. - However it unfortunately causes other SW regressions, most notably in Workbench. - Other games trashes memory or refuses to boot, in a few instances randomly (marked as "[FDC] with adkcon=1100", implies dsksync disabled): they often uses the AmigaDOS trackdisk BIOS functions, which may be expecting a @@ -281,7 +274,6 @@ void paula_fdc_device::live_run(const attotime &limit) if(!(dskbyt & 0x2000)) { if(cur_live.shift_reg == dsksync) { if(adkcon & 0x0400) { - // FIXME: exact dsksync behaviour, cfr. note at top if(dma_state == DMA_WAIT_START) { cur_live.bit_counter = 0; @@ -290,6 +282,12 @@ void paula_fdc_device::live_run(const attotime &limit) else dma_done(); } + else if (dma_state != DMA_IDLE) + { + // assume wordsync (12) and DMA byte ready (15) mutually exclusive + dma_write(dsksync); + cur_live.bit_counter = 0; + } } dskbyt |= 0x1000; From 2ffd6a09aff19a677c64d0ad0feec87901a7209e Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Wed, 15 Jan 2025 00:48:19 +1100 Subject: [PATCH 18/80] -cpu/drcbex64.cpp: Be nicer to the return address predictor. -cpu/drcbex86.cpp: Give hints to use short displacements for jumps to local unbound labels. -util/mfpresolve.h: Use references for some things that must not be null pointers. --- src/devices/cpu/drcbearm64.cpp | 2 +- src/devices/cpu/drcbex64.cpp | 48 +++++++++++++++++----------------- src/devices/cpu/drcbex86.cpp | 44 +++++++++++++++---------------- src/lib/util/delegate.cpp | 4 +-- src/lib/util/mfpresolve.h | 12 ++++----- 5 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/devices/cpu/drcbearm64.cpp b/src/devices/cpu/drcbearm64.cpp index bc956d84c383b..d6e5e03d024e7 100644 --- a/src/devices/cpu/drcbearm64.cpp +++ b/src/devices/cpu/drcbearm64.cpp @@ -911,7 +911,7 @@ drcbe_arm64::drcbe_arm64(drcuml_state &drcuml, device_t &device, drc_cache &cach auto const resolve_accessor = [] (resolved_handler &handler, address_space &space, auto accessor) { - auto const [entrypoint, adjusted] = util::resolve_member_function(accessor, &space); + auto const [entrypoint, adjusted] = util::resolve_member_function(accessor, space); handler.func = reinterpret_cast(entrypoint); handler.obj = adjusted; }; diff --git a/src/devices/cpu/drcbex64.cpp b/src/devices/cpu/drcbex64.cpp index aa7b3dc68e210..880ad231868af 100644 --- a/src/devices/cpu/drcbex64.cpp +++ b/src/devices/cpu/drcbex64.cpp @@ -2,7 +2,7 @@ // copyright-holders:Aaron Giles /*************************************************************************** - drcbex64.c + drcbex64.cpp 64-bit x64 back-end for the universal machine language. @@ -158,10 +158,10 @@ [rsp+48] - saved r14 [rsp+56] - saved r13 [rsp+64] - saved r12 - [rsp+72] - saved ebp - [rsp+80] - saved edi - [rsp+88] - saved esi - [rsp+96] - saved ebx + [rsp+72] - saved rbp + [rsp+80] - saved rdi + [rsp+88] - saved rsi + [rsp+96] - saved rbx [rsp+104] - ret ***************************************************************************/ @@ -696,7 +696,7 @@ drcbe_x64::drcbe_x64(drcuml_state &drcuml, device_t &device, drc_cache &cache, u auto const resolve_accessor = [] (resolved_handler &handler, address_space &space, auto accessor) { - auto const [entrypoint, adjusted] = util::resolve_member_function(accessor, &space); + auto const [entrypoint, adjusted] = util::resolve_member_function(accessor, space); handler.func = reinterpret_cast(entrypoint); handler.obj = adjusted; }; @@ -837,9 +837,8 @@ void drcbe_x64::reset() a.emitProlog(frame); a.emitArgsAssignment(frame, args); - a.sub(rsp, 32); + a.sub(rsp, 40); a.mov(MABS(&m_near.hashstacksave), rsp); - a.sub(rsp, 8); a.mov(MABS(&m_near.stacksave), rsp); a.stmxcsr(MABS(&m_near.ssemode)); a.jmp(Gpq(REG_PARAM2)); @@ -849,13 +848,13 @@ void drcbe_x64::reset() a.bind(a.newNamedLabel("exit_point")); a.ldmxcsr(MABS(&m_near.ssemode)); a.mov(rsp, MABS(&m_near.hashstacksave)); - a.add(rsp, 32); + a.add(rsp, 40); a.emitEpilog(frame); // generate a no code point m_nocode = dst + a.offset(); a.bind(a.newNamedLabel("nocode_point")); - a.ret(); + a.jmp(Gpq(REG_PARAM1)); // emit the generated code size_t bytes = emit(ch); @@ -1612,30 +1611,32 @@ void drcbe_x64::op_hashjmp(Assembler &a, const instruction &inst) smart_call_m64(a, &m_near.debug_log_hashjmp); } - // load the stack base one word early so we end up at the right spot after our call below + // load the stack base + Label nocode = a.newLabel(); a.mov(rsp, MABS(&m_near.hashstacksave)); // mov rsp,[hashstacksave] // fixed mode cases if (modep.is_immediate() && m_hash.is_mode_populated(modep.immediate())) { - // a straight immediate jump is direct, though we need the PC in EAX in case of failure if (pcp.is_immediate()) { + // a straight immediate jump is direct, though we need the PC in EAX in case of failure uint32_t l1val = (pcp.immediate() >> m_hash.l1shift()) & m_hash.l1mask(); uint32_t l2val = (pcp.immediate() >> m_hash.l2shift()) & m_hash.l2mask(); - a.call(MABS(&m_hash.base()[modep.immediate()][l1val][l2val])); // call hash[modep][l1val][l2val] + a.short_().lea(Gpq(REG_PARAM1), ptr(nocode)); // lea rcx,[rip+nocode] + a.jmp(MABS(&m_hash.base()[modep.immediate()][l1val][l2val])); // jmp hash[modep][l1val][l2val] } - - // a fixed mode but variable PC else { + // a fixed mode but variable PC mov_reg_param(a, eax, pcp); // mov eax,pcp a.mov(edx, eax); // mov edx,eax a.shr(edx, m_hash.l1shift()); // shr edx,l1shift a.and_(eax, m_hash.l2mask() << m_hash.l2shift()); // and eax,l2mask << l2shift a.mov(rdx, ptr(rbp, rdx, 3, offset_from_rbp(&m_hash.base()[modep.immediate()][0]))); // mov rdx,hash[modep+edx*8] - a.call(ptr(rdx, rax, 3 - m_hash.l2shift())); // call [rdx+rax*shift] + a.short_().lea(Gpq(REG_PARAM1), ptr(nocode)); // lea rcx,[rip+nocode] + a.jmp(ptr(rdx, rax, 3 - m_hash.l2shift())); // jmp [rdx+rax*shift] } } else @@ -1645,31 +1646,30 @@ void drcbe_x64::op_hashjmp(Assembler &a, const instruction &inst) mov_reg_param(a, modereg, modep); // mov modereg,modep a.mov(rcx, ptr(rbp, modereg, 3, offset_from_rbp(m_hash.base()))); // mov rcx,hash[modereg*8] - // fixed PC if (pcp.is_immediate()) { + // fixed PC uint32_t l1val = (pcp.immediate() >> m_hash.l1shift()) & m_hash.l1mask(); uint32_t l2val = (pcp.immediate() >> m_hash.l2shift()) & m_hash.l2mask(); a.mov(rdx, ptr(rcx, l1val * 8)); // mov rdx,[rcx+l1val*8] - a.call(ptr(rdx, l2val * 8)); // call [l2val*8] + a.short_().lea(Gpq(REG_PARAM1), ptr(nocode)); // lea rcx,[rip+nocode] + a.jmp(ptr(rdx, l2val * 8)); // jmp [l2val*8] } - - // variable PC else { + // variable PC mov_reg_param(a, eax, pcp); // mov eax,pcp a.mov(edx, eax); // mov edx,eax a.shr(edx, m_hash.l1shift()); // shr edx,l1shift a.mov(rdx, ptr(rcx, rdx, 3)); // mov rdx,[rcx+rdx*8] a.and_(eax, m_hash.l2mask() << m_hash.l2shift()); // and eax,l2mask << l2shift - a.call(ptr(rdx, rax, 3 - m_hash.l2shift())); // call [rdx+rax*shift] + a.short_().lea(Gpq(REG_PARAM1), ptr(nocode)); // lea rcx,[rip+nocode] + a.jmp(ptr(rdx, rax, 3 - m_hash.l2shift())); // jmp [rdx+rax*shift] } } - // fix stack alignment if "no code" landing returned from abuse of call with misaligned stack - a.sub(rsp, 8); // sub rsp,8 - // in all cases, if there is no code, we return here to generate the exception + a.bind(nocode); if (LOG_HASHJMPS) smart_call_m64(a, &m_near.debug_log_hashjmp_fail); diff --git a/src/devices/cpu/drcbex86.cpp b/src/devices/cpu/drcbex86.cpp index f97ef78046852..6d7c6c1de1d07 100644 --- a/src/devices/cpu/drcbex86.cpp +++ b/src/devices/cpu/drcbex86.cpp @@ -2173,11 +2173,11 @@ void drcbe_x86::emit_rcl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.and_(ecx, 63); a.popfd(); - a.jecxz(skipall); + a.short_().jecxz(skipall); a.lea(ecx, ptr(ecx, -1)); a.bind(loop); - a.jecxz(skiploop); + a.short_().jecxz(skiploop); a.lea(ecx, ptr(ecx, -1)); a.rcl(reglo, 1); a.rcl(reghi, 1); @@ -2231,11 +2231,11 @@ void drcbe_x86::emit_rcr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.and_(ecx, 63); a.popfd(); - a.jecxz(skipall); + a.short_().jecxz(skipall); a.lea(ecx, ptr(ecx, -1)); a.bind(loop); - a.jecxz(skiploop); + a.short_().jecxz(skiploop); a.lea(ecx, ptr(ecx, -1)); a.rcr(reghi, 1); a.rcr(reglo, 1); @@ -2674,9 +2674,9 @@ void drcbe_x86::op_jmp(Assembler &a, const instruction &inst) jmptarget = a.newNamedLabel(labelName.c_str()); if (inst.condition() == uml::COND_ALWAYS) - a.jmp(jmptarget); // jmp target + a.jmp(jmptarget); else - a.j(X86_CONDITION(inst.condition()), jmptarget); // jcc target + a.j(X86_CONDITION(inst.condition()), jmptarget); } @@ -2774,7 +2774,7 @@ void drcbe_x86::op_ret(Assembler &a, const instruction &inst) if (inst.condition() != uml::COND_ALWAYS) { skip = a.newLabel(); - a.j(X86_NOT_CONDITION(inst.condition()), skip); // jcc skip + a.short_().j(X86_NOT_CONDITION(inst.condition()), skip); } // return @@ -2811,17 +2811,17 @@ void drcbe_x86::op_callc(Assembler &a, const instruction &inst) if (inst.condition() != uml::COND_ALWAYS) { skip = a.newLabel(); - a.j(X86_NOT_CONDITION(inst.condition()), skip); // jcc skip + a.short_().j(X86_NOT_CONDITION(inst.condition()), skip); } // perform the call - a.mov(dword_ptr(esp, 0), imm(paramp.memory())); // mov [esp],paramp - a.call(imm(funcp.cfunc())); // call funcp + a.mov(dword_ptr(esp, 0), imm(paramp.memory())); + a.call(imm(funcp.cfunc())); // resolve the conditional link if (inst.condition() != uml::COND_ALWAYS) { - a.bind(skip); // skip: + a.bind(skip); reset_last_upper_lower_reg(); } } @@ -3738,7 +3738,7 @@ void drcbe_x86::op_carry(Assembler &a, const instruction &inst) Label higher = a.newLabel(); a.cmp(ecx, 32); - a.jge(higher); + a.short_().jge(higher); if (srcp.is_memory()) { @@ -4795,7 +4795,7 @@ void drcbe_x86::op_divu(Assembler &a, const instruction &inst) a.add(eax, eax); // add eax,eax } Label skip = a.newLabel(); - a.jecxz(skip); // jecxz skip + a.short_().jecxz(skip); // jecxz skip emit_mov_r32_p32(a, eax, src1p); // mov eax,src1p a.xor_(edx, edx); // xor edx,edx a.div(ecx); // div ecx @@ -4866,7 +4866,7 @@ void drcbe_x86::op_divs(Assembler &a, const instruction &inst) a.add(eax, eax); // add eax,eax } Label skip = a.newLabel(); - a.jecxz(skip); // jecxz skip + a.short_().jecxz(skip); // jecxz skip emit_mov_r32_p32(a, eax, src1p); // mov eax,src1p a.cdq(); // cdq a.idiv(ecx); // idiv ecx @@ -5430,7 +5430,7 @@ void drcbe_x86::op_lzcnt(Assembler &a, const instruction &inst) Label end = a.newLabel(); a.bsr(edx, edx); - a.jz(skip); + a.short_().jz(skip); a.xor_(edx, 31 ^ 63); a.mov(dstreg, edx); a.short_().jmp(end); @@ -5494,7 +5494,7 @@ void drcbe_x86::op_tzcnt(Assembler &a, const instruction &inst) Label skip = a.newLabel(); emit_mov_r64_p64(a, dstreg, edx, srcp); // mov dstreg:edx,srcp a.bsf(dstreg, dstreg); // bsf dstreg,dstreg - a.jnz(skip); // jnz skip + a.short_().jnz(skip); // jnz skip a.mov(ecx, 32); // mov ecx,32 a.bsf(dstreg, edx); // bsf dstreg,edx a.cmovz(dstreg, ecx); // cmovz dstreg,ecx @@ -6126,21 +6126,21 @@ void drcbe_x86::op_fmov(Assembler &a, const instruction &inst) if (inst.condition() != uml::COND_ALWAYS) { skip = a.newLabel(); - a.j(X86_NOT_CONDITION(inst.condition()), skip); // jcc skip + a.short_().j(X86_NOT_CONDITION(inst.condition()), skip); } // general case - a.mov(eax, MABS(srcp.memory(0))); // mov eax,[srcp] + a.mov(eax, MABS(srcp.memory(0))); if (inst.size() == 8) - a.mov(edx, MABS(srcp.memory(4))); // mov edx,[srcp + 4] - a.mov(MABS(dstp.memory(0)), eax); // mov [dstp],eax + a.mov(edx, MABS(srcp.memory(4))); + a.mov(MABS(dstp.memory(0)), eax); if (inst.size() == 8) - a.mov(MABS(dstp.memory(4)), edx); // mov [dstp + 4],edx + a.mov(MABS(dstp.memory(4)), edx); // resolve the jump if (inst.condition() != uml::COND_ALWAYS) { - a.bind(skip); // skip: + a.bind(skip); reset_last_upper_lower_reg(); } } diff --git a/src/lib/util/delegate.cpp b/src/lib/util/delegate.cpp index 67fb7e72d4296..fb2fd4e209192 100644 --- a/src/lib/util/delegate.cpp +++ b/src/lib/util/delegate.cpp @@ -72,7 +72,7 @@ const delegate_mfp_compatible::raw_mfp_data delegate_mfp_compatible::s_null_mfp delegate_generic_function delegate_mfp_itanium::convert_to_generic(delegate_generic_class *&object) const { - auto const [entrypoint, adjusted] = detail::resolve_member_function_itanium(m_function, m_this_delta, object); + auto const [entrypoint, adjusted] = resolve_member_function_itanium(m_function, m_this_delta, object); object = reinterpret_cast(adjusted); return reinterpret_cast(entrypoint); } @@ -87,7 +87,7 @@ delegate_generic_function delegate_mfp_itanium::convert_to_generic(delegate_gene delegate_generic_function delegate_mfp_msvc::adjust_this_pointer(delegate_generic_class *&object) const { - auto const [entrypoint, adjusted] = detail::resolve_member_function_msvc(&m_function, m_size, object); + auto const [entrypoint, adjusted] = resolve_member_function_msvc(&m_function, m_size, object); object = reinterpret_cast(adjusted); return reinterpret_cast(entrypoint); } diff --git a/src/lib/util/mfpresolve.h b/src/lib/util/mfpresolve.h index eee3711ebeae5..7661623572afc 100644 --- a/src/lib/util/mfpresolve.h +++ b/src/lib/util/mfpresolve.h @@ -42,18 +42,18 @@ inline T bypass_member_function_thunks(T entrypoint, U const *object) noexcept template -inline std::pair resolve_member_function(Ret (T::*function)(Params...), T *object) noexcept +inline std::pair resolve_member_function(Ret (T::*function)(Params...), T &object) noexcept { if (MAME_ABI_CXX_TYPE == MAME_ABI_CXX_ITANIUM) { struct { std::uintptr_t ptr; std::ptrdiff_t adj; } equiv; assert(sizeof(function) == sizeof(equiv)); *reinterpret_cast(&equiv) = function; - return detail::resolve_member_function_itanium(equiv.ptr, equiv.adj, object); + return detail::resolve_member_function_itanium(equiv.ptr, equiv.adj, &object); } else if (MAME_ABI_CXX_TYPE == MAME_ABI_CXX_MSVC) { - return detail::resolve_member_function_msvc(&function, sizeof(function), object); + return detail::resolve_member_function_msvc(&function, sizeof(function), &object); } else { @@ -63,18 +63,18 @@ inline std::pair resolve_member_function(Ret (T: template -inline std::pair resolve_member_function(Ret (T::*function)(Params...) const, T const *object) noexcept +inline std::pair resolve_member_function(Ret (T::*function)(Params...) const, T const &object) noexcept { if (MAME_ABI_CXX_TYPE == MAME_ABI_CXX_ITANIUM) { struct { std::uintptr_t ptr; std::ptrdiff_t adj; } equiv; assert(sizeof(function) == sizeof(equiv)); *reinterpret_cast(&equiv) = function; - return detail::resolve_member_function_itanium(equiv.ptr, equiv.adj, object); + return detail::resolve_member_function_itanium(equiv.ptr, equiv.adj, &object); } else if (MAME_ABI_CXX_TYPE == MAME_ABI_CXX_MSVC) { - return detail::resolve_member_function_msvc(&function, sizeof(function), object); + return detail::resolve_member_function_msvc(&function, sizeof(function), &object); } else { From 6a26c661e29712a092b323eefcff7d508d7c4a3c Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Wed, 15 Jan 2025 01:02:16 +1100 Subject: [PATCH 19/80] cpu/drcbearm64.cpp: Use saved return address from stack for op_recover. Handle landing pads save the LR/FP pair, so the return address for the first level of callh, exh or "no code" handler can be recovered from below the base frame pointer. --- src/devices/cpu/drcbearm64.cpp | 37 +--------------------------------- src/devices/cpu/drcbearm64.h | 2 -- 2 files changed, 1 insertion(+), 38 deletions(-) diff --git a/src/devices/cpu/drcbearm64.cpp b/src/devices/cpu/drcbearm64.cpp index d6e5e03d024e7..29702390bcf01 100644 --- a/src/devices/cpu/drcbearm64.cpp +++ b/src/devices/cpu/drcbearm64.cpp @@ -976,9 +976,6 @@ void drcbe_arm64::reset() CodeHolder ch; ch.init(Environment::host(), uint64_t(dst)); - m_near.calldepth = 0; - m_near.hashstacksave = nullptr; - FileLogger logger(m_log_asmjit); if (logger.file()) { @@ -1013,8 +1010,6 @@ void drcbe_arm64::reset() a.ldr(BASE_REG, get_mem_absolute(a, &m_baseptr)); emit_ldr_mem(a, FLAGS_REG.w(), &m_near.emulated_flags); - emit_str_mem(a, a64::wzr, &m_near.calldepth); - emit_str_mem(a, a64::xzr, &m_near.hashstacksave); a.emitArgsAssignment(frame, args); @@ -1284,7 +1279,6 @@ void drcbe_arm64::op_hashjmp(a64::Assembler &a, const uml::instruction &inst) const parameter &exp = inst.param(2); assert(exp.is_code_handle()); - emit_str_mem(a, a64::wzr, &m_near.calldepth); a.mov(a64::sp, a64::x29); if (modep.is_immediate() && m_hash.is_mode_populated(modep.immediate())) @@ -1366,10 +1360,6 @@ void drcbe_arm64::op_hashjmp(a64::Assembler &a, const uml::instruction &inst) a.br(TEMP_REG1); a.bind(lab); - emit_str_mem(a, REG_PARAM1, &m_near.hashstacksave); - - a.mov(SCRATCH_REG1, 1); - emit_str_mem(a, SCRATCH_REG1.w(), &m_near.calldepth); mov_mem_param(a, 4, &m_state.exp, pcp); @@ -1437,15 +1427,6 @@ void drcbe_arm64::op_exh(a64::Assembler &a, const uml::instruction &inst) a.b(ARM_NOT_CONDITION(a, inst.condition()), no_exception); } - Label lab = a.newLabel(); - emit_ldr_mem(a, SCRATCH_REG1.w(), &m_near.calldepth); - a.cbnz(SCRATCH_REG1, lab); - a.adr(SCRATCH_REG2, lab); - emit_str_mem(a, SCRATCH_REG2, &m_near.hashstacksave); - a.bind(lab); - a.add(SCRATCH_REG1, SCRATCH_REG1, 1); - emit_str_mem(a, SCRATCH_REG1.w(), &m_near.calldepth); - mov_mem_param(a, 4, &m_state.exp, exp); drccodeptr *const targetptr = handp.handle().codeptr_addr(); @@ -1486,15 +1467,6 @@ void drcbe_arm64::op_callh(a64::Assembler &a, const uml::instruction &inst) a.b(ARM_NOT_CONDITION(a, inst.condition()), skip); } - Label lab = a.newLabel(); - emit_ldr_mem(a, SCRATCH_REG1.w(), &m_near.calldepth); - a.cbnz(SCRATCH_REG1, lab); - a.adr(SCRATCH_REG2, lab); - emit_str_mem(a, SCRATCH_REG2, &m_near.hashstacksave); - a.bind(lab); - a.add(SCRATCH_REG1, SCRATCH_REG1, 1); - emit_str_mem(a, SCRATCH_REG1.w(), &m_near.calldepth); - drccodeptr *const targetptr = handp.handle().codeptr_addr(); if (*targetptr != nullptr) { @@ -1531,13 +1503,6 @@ void drcbe_arm64::op_ret(a64::Assembler &a, const uml::instruction &inst) a.b(ARM_NOT_CONDITION(a, inst.condition()), skip); } - Label lab = a.newLabel(); - emit_ldr_mem(a, SCRATCH_REG1.w(), &m_near.calldepth); - a.cbz(SCRATCH_REG1, lab); - a.sub(SCRATCH_REG1, SCRATCH_REG1, 1); - emit_str_mem(a, SCRATCH_REG1.w(), &m_near.calldepth); - a.bind(lab); - a.ldp(a64::x29, a64::x30, arm::Mem(a64::sp).post(16)); a.ret(a64::x30); @@ -1590,7 +1555,7 @@ void drcbe_arm64::op_recover(a64::Assembler &a, const uml::instruction &inst) be_parameter dstp(*this, inst.param(0), PTYPE_MR); get_imm_relative(a, REG_PARAM1, (uintptr_t)&m_map); - emit_ldr_mem(a, REG_PARAM2, &m_near.hashstacksave); + a.ldr(REG_PARAM2, arm::Mem(a64::x29, -8)); // saved LR (x30) from first level CALLH/EXH or failed hash jump a.mov(REG_PARAM3, inst.param(1).mapvar()); emit_ldr_mem(a, TEMP_REG1, &m_near.drcmap_get_value); diff --git a/src/devices/cpu/drcbearm64.h b/src/devices/cpu/drcbearm64.h index 6acf3aa01f00e..4cbbaa7cf26ee 100644 --- a/src/devices/cpu/drcbearm64.h +++ b/src/devices/cpu/drcbearm64.h @@ -240,10 +240,8 @@ class drcbe_arm64 : public drcbe_interface { void *debug_cpu_instruction_hook; void *drcmap_get_value; - void *hashstacksave; uint32_t emulated_flags; - uint32_t calldepth; }; near_state &m_near; From c0f4bcb5d4bef655a04a3a1ea4db4ac0bcdb8e40 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Wed, 15 Jan 2025 03:29:58 +1100 Subject: [PATCH 20/80] cpu/drcbe*.cpp: Added write byte with explicit mask. This wasn't added to the DRC implementations when it was added to the address space classes. --- src/devices/cpu/drcbearm64.cpp | 34 +++++++++++++++++++++++++++-- src/devices/cpu/drcbearm64.h | 2 ++ src/devices/cpu/drcbec.cpp | 8 +++++++ src/devices/cpu/drcbex64.cpp | 40 +++++++++++++++++++++++++++++----- src/devices/cpu/drcbex64.h | 3 ++- src/devices/cpu/drcbex86.cpp | 11 ++++++++-- 6 files changed, 87 insertions(+), 11 deletions(-) diff --git a/src/devices/cpu/drcbearm64.cpp b/src/devices/cpu/drcbearm64.cpp index 29702390bcf01..b9851e3bf705f 100644 --- a/src/devices/cpu/drcbearm64.cpp +++ b/src/devices/cpu/drcbearm64.cpp @@ -922,6 +922,7 @@ drcbe_arm64::drcbe_arm64(drcuml_state &drcuml, device_t &device, drc_cache &cach if (m_space[space]) { resolve_accessor(m_resolved_accessors[space].read_byte, *m_space[space], static_cast(&address_space::read_byte)); + resolve_accessor(m_resolved_accessors[space].read_byte_masked, *m_space[space], static_cast(&address_space::read_byte)); resolve_accessor(m_resolved_accessors[space].read_word, *m_space[space], static_cast(&address_space::read_word)); resolve_accessor(m_resolved_accessors[space].read_word_masked, *m_space[space], static_cast(&address_space::read_word)); resolve_accessor(m_resolved_accessors[space].read_dword, *m_space[space], static_cast(&address_space::read_dword)); @@ -930,6 +931,7 @@ drcbe_arm64::drcbe_arm64(drcuml_state &drcuml, device_t &device, drc_cache &cach resolve_accessor(m_resolved_accessors[space].read_qword_masked, *m_space[space], static_cast(&address_space::read_qword)); resolve_accessor(m_resolved_accessors[space].write_byte, *m_space[space], static_cast(&address_space::write_byte)); + resolve_accessor(m_resolved_accessors[space].write_byte_masked, *m_space[space], static_cast(&address_space::write_byte)); resolve_accessor(m_resolved_accessors[space].write_word, *m_space[space], static_cast(&address_space::write_word)); resolve_accessor(m_resolved_accessors[space].write_word_masked, *m_space[space], static_cast(&address_space::write_word)); resolve_accessor(m_resolved_accessors[space].write_dword, *m_space[space], static_cast(&address_space::write_dword)); @@ -2081,7 +2083,21 @@ void drcbe_arm64::op_readm(a64::Assembler &a, const uml::instruction &inst) mov_reg_param(a, 4, REG_PARAM2, addrp); mov_reg_param(a, inst.size(), REG_PARAM3, maskp); - if (spacesizep.size() == SIZE_WORD) + if (spacesizep.size() == SIZE_BYTE) + { + if (resolved.read_byte_masked.func) + { + get_imm_relative(a, REG_PARAM1, resolved.read_byte_masked.obj); + call_arm_addr(a, resolved.read_byte_masked.func); + } + else + { + get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]); + emit_ldr_mem(a, TEMP_REG1, &trampolines.read_byte_masked); + a.blr(TEMP_REG1); + } + } + else if (spacesizep.size() == SIZE_WORD) { if (resolved.read_word_masked.func) { @@ -2222,7 +2238,21 @@ void drcbe_arm64::op_writem(a64::Assembler &a, const uml::instruction &inst) mov_reg_param(a, inst.size(), REG_PARAM3, srcp); mov_reg_param(a, inst.size(), REG_PARAM4, maskp); - if (spacesizep.size() == SIZE_WORD) + if (spacesizep.size() == SIZE_BYTE) + { + if (resolved.write_byte_masked.func) + { + get_imm_relative(a, REG_PARAM1, resolved.write_byte_masked.obj); + call_arm_addr(a, resolved.write_byte_masked.func); + } + else + { + get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]); + emit_ldr_mem(a, TEMP_REG1, &trampolines.write_byte_masked); + a.blr(TEMP_REG1); + } + } + else if (spacesizep.size() == SIZE_WORD) { if (resolved.write_word_masked.func) { diff --git a/src/devices/cpu/drcbearm64.h b/src/devices/cpu/drcbearm64.h index 4cbbaa7cf26ee..20938f214fe0b 100644 --- a/src/devices/cpu/drcbearm64.h +++ b/src/devices/cpu/drcbearm64.h @@ -259,6 +259,7 @@ class drcbe_arm64 : public drcbe_interface { resolved_handler read_byte; + resolved_handler read_byte_masked; resolved_handler read_word; resolved_handler read_word_masked; resolved_handler read_dword; @@ -267,6 +268,7 @@ class drcbe_arm64 : public drcbe_interface resolved_handler read_qword_masked; resolved_handler write_byte; + resolved_handler write_byte_masked; resolved_handler write_word; resolved_handler write_word_masked; resolved_handler write_dword; diff --git a/src/devices/cpu/drcbec.cpp b/src/devices/cpu/drcbec.cpp index 82cfc10979abd..c058d256a1838 100644 --- a/src/devices/cpu/drcbec.cpp +++ b/src/devices/cpu/drcbec.cpp @@ -871,6 +871,10 @@ int drcbe_c::execute(code_handle &entry) PARAM0 = m_space[PARAM2]->read_dword(PARAM1); break; + case MAKE_OPCODE_SHORT(OP_READM1, 4, 0): // READM dst,src1,mask,space_BYTE + PARAM0 = m_space[PARAM3]->read_byte(PARAM1, PARAM2); + break; + case MAKE_OPCODE_SHORT(OP_READM2, 4, 0): // READM dst,src1,mask,space_WORD PARAM0 = m_space[PARAM3]->read_word(PARAM1, PARAM2); break; @@ -891,6 +895,10 @@ int drcbe_c::execute(code_handle &entry) m_space[PARAM2]->write_dword(PARAM0, PARAM1); break; + case MAKE_OPCODE_SHORT(OP_WRITEM1, 4, 0): // WRITEM dst,src1,mask,space_BYTE + m_space[PARAM3]->write_byte(PARAM0, PARAM1, PARAM2); + break; + case MAKE_OPCODE_SHORT(OP_WRITEM2, 4, 0): // WRITEM dst,src1,mask,space_WORD m_space[PARAM3]->write_word(PARAM0, PARAM1, PARAM2); break; diff --git a/src/devices/cpu/drcbex64.cpp b/src/devices/cpu/drcbex64.cpp index 880ad231868af..14f89a35cbd48 100644 --- a/src/devices/cpu/drcbex64.cpp +++ b/src/devices/cpu/drcbex64.cpp @@ -706,6 +706,7 @@ drcbe_x64::drcbe_x64(drcuml_state &drcuml, device_t &device, drc_cache &cache, u if (m_space[space]) { resolve_accessor(m_resolved_accessors[space].read_byte, *m_space[space], static_cast(&address_space::read_byte)); + resolve_accessor(m_resolved_accessors[space].read_byte_masked, *m_space[space], static_cast(&address_space::read_byte)); resolve_accessor(m_resolved_accessors[space].read_word, *m_space[space], static_cast(&address_space::read_word)); resolve_accessor(m_resolved_accessors[space].read_word_masked, *m_space[space], static_cast(&address_space::read_word)); resolve_accessor(m_resolved_accessors[space].read_dword, *m_space[space], static_cast(&address_space::read_dword)); @@ -714,6 +715,7 @@ drcbe_x64::drcbe_x64(drcuml_state &drcuml, device_t &device, drc_cache &cache, u resolve_accessor(m_resolved_accessors[space].read_qword_masked, *m_space[space], static_cast(&address_space::read_qword)); resolve_accessor(m_resolved_accessors[space].write_byte, *m_space[space], static_cast(&address_space::write_byte)); + resolve_accessor(m_resolved_accessors[space].write_byte_masked, *m_space[space], static_cast(&address_space::write_byte)); resolve_accessor(m_resolved_accessors[space].write_word, *m_space[space], static_cast(&address_space::write_word)); resolve_accessor(m_resolved_accessors[space].write_word_masked, *m_space[space], static_cast(&address_space::write_word)); resolve_accessor(m_resolved_accessors[space].write_dword, *m_space[space], static_cast(&address_space::write_dword)); @@ -838,7 +840,6 @@ void drcbe_x64::reset() a.emitArgsAssignment(frame, args); a.sub(rsp, 40); - a.mov(MABS(&m_near.hashstacksave), rsp); a.mov(MABS(&m_near.stacksave), rsp); a.stmxcsr(MABS(&m_near.ssemode)); a.jmp(Gpq(REG_PARAM2)); @@ -847,7 +848,7 @@ void drcbe_x64::reset() m_exit = dst + a.offset(); a.bind(a.newNamedLabel("exit_point")); a.ldmxcsr(MABS(&m_near.ssemode)); - a.mov(rsp, MABS(&m_near.hashstacksave)); + a.mov(rsp, MABS(&m_near.stacksave)); a.add(rsp, 40); a.emitEpilog(frame); @@ -1613,7 +1614,7 @@ void drcbe_x64::op_hashjmp(Assembler &a, const instruction &inst) // load the stack base Label nocode = a.newLabel(); - a.mov(rsp, MABS(&m_near.hashstacksave)); // mov rsp,[hashstacksave] + a.mov(rsp, MABS(&m_near.stacksave)); // mov rsp,[stacksave] // fixed mode cases if (modep.is_immediate() && m_hash.is_mode_populated(modep.immediate())) @@ -2616,12 +2617,26 @@ void drcbe_x64::op_readm(Assembler &a, const instruction &inst) mov_reg_param(a, Gpd(REG_PARAM3), maskp); // mov param3,maskp else mov_reg_param(a, Gpq(REG_PARAM3), maskp); // mov param3,maskp - if (spacesizep.size() == SIZE_WORD) + if (spacesizep.size() == SIZE_BYTE) + { + if (resolved.read_byte_masked.func) + { + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_byte_masked.obj); // mov param1,space + smart_call_r64(a, resolved.read_byte_masked.func, rax); // call read_byte_masked + } + else + { + mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space + smart_call_m64(a, (x86code **)&trampolines.read_byte_masked); // call read_byte_masked + } + a.movzx(dstreg, al); // movzx dstreg,al + } + else if (spacesizep.size() == SIZE_WORD) { if (resolved.read_word_masked.func) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_word_masked.obj); // mov param1,space - smart_call_r64(a, resolved.read_word_masked.func, rax); // call read_byte_masked + smart_call_r64(a, resolved.read_word_masked.func, rax); // call read_word_masked } else { @@ -2781,7 +2796,20 @@ void drcbe_x64::op_writem(Assembler &a, const instruction &inst) mov_reg_param(a, Gpq(REG_PARAM3), srcp); // mov param3,srcp mov_reg_param(a, Gpq(REG_PARAM4), maskp); // mov param4,maskp } - if (spacesizep.size() == SIZE_WORD) + if (spacesizep.size() == SIZE_BYTE) + { + if (resolved.write_byte.func) + { + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_byte_masked.obj); // mov param1,space + smart_call_r64(a, resolved.write_byte_masked.func, rax); // call write_byte_masked + } + else + { + mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space + smart_call_m64(a, (x86code **)&trampolines.write_byte_masked); // call write_byte_masked + } + } + else if (spacesizep.size() == SIZE_WORD) { if (resolved.write_word.func) { diff --git a/src/devices/cpu/drcbex64.h b/src/devices/cpu/drcbex64.h index 826b56d8b3256..b2c9195bd9e5b 100644 --- a/src/devices/cpu/drcbex64.h +++ b/src/devices/cpu/drcbex64.h @@ -263,7 +263,6 @@ class drcbe_x64 : public drcbe_interface double double1; // 1.0 in double-precision void * stacksave; // saved stack pointer - void * hashstacksave; // saved stack pointer for hashjmp uint8_t flagsmap[0x1000]; // flags map uint64_t flagsunmap[0x20]; // flags unmapper @@ -276,6 +275,7 @@ class drcbe_x64 : public drcbe_interface { resolved_handler read_byte; + resolved_handler read_byte_masked; resolved_handler read_word; resolved_handler read_word_masked; resolved_handler read_dword; @@ -284,6 +284,7 @@ class drcbe_x64 : public drcbe_interface resolved_handler read_qword_masked; resolved_handler write_byte; + resolved_handler write_byte_masked; resolved_handler write_word; resolved_handler write_word_masked; resolved_handler write_dword; diff --git a/src/devices/cpu/drcbex86.cpp b/src/devices/cpu/drcbex86.cpp index 6d7c6c1de1d07..6be6ab0af41f8 100644 --- a/src/devices/cpu/drcbex86.cpp +++ b/src/devices/cpu/drcbex86.cpp @@ -3527,7 +3527,12 @@ void drcbe_x86::op_readm(Assembler &a, const instruction &inst) emit_mov_m64_p64(a, qword_ptr(esp, 8), maskp); // mov [esp+8],maskp emit_mov_m32_p32(a, dword_ptr(esp, 4), addrp); // mov [esp+4],addrp a.mov(dword_ptr(esp, 0), imm(m_space[spacesizep.space()])); // mov [esp],space - if (spacesizep.size() == SIZE_WORD) + if (spacesizep.size() == SIZE_BYTE) + { + a.call(imm(m_accessors[spacesizep.space()].read_byte_masked)); // call read_byte_masked + a.movzx(dstreg, al); // movzx dstreg,al + } + else if (spacesizep.size() == SIZE_WORD) { a.call(imm(m_accessors[spacesizep.space()].read_word_masked)); // call read_word_masked a.movzx(dstreg, ax); // movzx dstreg,ax @@ -3636,7 +3641,9 @@ void drcbe_x86::op_writem(Assembler &a, const instruction &inst) } emit_mov_m32_p32(a, dword_ptr(esp, 4), addrp); // mov [esp+4],addrp a.mov(dword_ptr(esp, 0), imm(m_space[spacesizep.space()])); // mov [esp],space - if (spacesizep.size() == SIZE_WORD) + if (spacesizep.size() == SIZE_BYTE) + a.call(imm(m_accessors[spacesizep.space()].write_byte_masked)); // call write_byte_masked + else if (spacesizep.size() == SIZE_WORD) a.call(imm(m_accessors[spacesizep.space()].write_word_masked)); // call write_word_masked else if (spacesizep.size() == SIZE_DWORD) a.call(imm(m_accessors[spacesizep.space()].write_dword_masked)); // call write_dword_masked From e2327efaeb5e69f8dc8883f0b7f2dea3622c7cc7 Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 14 Jan 2025 19:14:26 +0100 Subject: [PATCH 21/80] williams: small cleanup, fix splat regression --- src/mame/midway/williams.cpp | 4 +- src/mame/midway/williams_m.cpp | 44 +++++++++++----------- src/mame/midway/williams_v.cpp | 67 ++++++++++++++-------------------- src/mame/midway/wmg.cpp | 25 ++++++++----- 4 files changed, 69 insertions(+), 71 deletions(-) diff --git a/src/mame/midway/williams.cpp b/src/mame/midway/williams.cpp index aef8ed98ea234..33cb34d7fc0db 100644 --- a/src/mame/midway/williams.cpp +++ b/src/mame/midway/williams.cpp @@ -1654,8 +1654,10 @@ void williams_state::joust(machine_config &config) void williams_state::splat(machine_config &config) { williams_base(config); - WILLIAMS_BLITTER_SC2(config, m_blitter, 0xc000, m_maincpu, m_videoram); williams_muxed(config); + + WILLIAMS_BLITTER_SC2(config, m_blitter, 0xc000, m_maincpu, m_videoram); + m_maincpu->set_addrmap(AS_PROGRAM, &williams_state::main_map_blitter); } void williams_state::alienar(machine_config &config) diff --git a/src/mame/midway/williams_m.cpp b/src/mame/midway/williams_m.cpp index d7f60a1df0dad..87e1774a5539c 100644 --- a/src/mame/midway/williams_m.cpp +++ b/src/mame/midway/williams_m.cpp @@ -24,7 +24,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams_state::va11_callback) if (scanline == 256) return; - /* the IRQ signal comes into CB1, and is set to VA11 */ + // the IRQ signal comes into CB1, and is set to VA11 m_pia[1]->cb1_w(BIT(scanline, 5)); } @@ -88,7 +88,7 @@ void williams2_state::machine_start() { williams_state::machine_start(); - /* configure memory banks */ + // configure memory banks m_mainbank->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x8000); } @@ -97,7 +97,7 @@ void williams2_state::machine_reset() { williams_state::machine_reset(); - /* make sure our banking is reset */ + // make sure our banking is reset bank_select_w(0); } @@ -111,29 +111,29 @@ void williams2_state::machine_reset() void williams_state::vram_select_w(u8 data) { - /* VRAM/ROM banking from bit 0 */ + // VRAM/ROM banking from bit 0 if (BIT(data, 0)) m_rom_view.select(0); else m_rom_view.disable(); - /* cocktail flip from bit 1 */ + // cocktail flip from bit 1 m_cocktail = BIT(data, 1); } void williams2_state::bank_select_w(u8 data) { - /* the low two bits control the paging */ + // the low two bits control the paging switch (data & 0x03) { - /* page 0 is video ram */ + // page 0 is video ram case 0: m_rom_view.disable(); m_palette_view.disable(); break; - /* pages 1 and 2 are ROM */ + // pages 1 and 2 are ROM case 1: case 2: m_mainbank->set_entry((data & 6) >> 1); @@ -141,7 +141,7 @@ void williams2_state::bank_select_w(u8 data) m_palette_view.disable(); break; - /* page 3 accesses palette RAM; the remaining areas are as if page 1 ROM was selected */ + // page 3 accesses palette RAM; the remaining areas are as if page 1 ROM was selected case 3: m_mainbank->set_entry((data & 4) >> 1); m_rom_view.select(0); @@ -246,7 +246,7 @@ void williams_state::cmos_4bit_w(offs_t offset, u8 data) void williams_state::watchdog_reset_w(u8 data) { - /* yes, the data bits are checked for this specific value */ + // yes, the data bits are checked for this specific value if (data == 0x39) m_watchdog->watchdog_reset(); } @@ -254,7 +254,7 @@ void williams_state::watchdog_reset_w(u8 data) void williams2_state::watchdog_reset_w(u8 data) { - /* yes, the data bits are checked for this specific value */ + // yes, the data bits are checked for this specific value if ((data & 0x3f) == 0x14) m_watchdog->watchdog_reset(); } @@ -353,11 +353,11 @@ void defender_state::bank_select_w(u8 data) u8 mayday_state::protection_r(offs_t offset) { - /* Mayday does some kind of protection check that is not currently understood */ - /* However, the results of that protection check are stored at $a190 and $a191 */ - /* These are compared against $a193 and $a194, respectively. Thus, to prevent */ - /* the protection from resetting the machine, we just return $a193 for $a190, */ - /* and $a194 for $a191. */ + // Mayday does some kind of protection check that is not currently understood + // However, the results of that protection check are stored at $a190 and $a191 + // These are compared against $a193 and $a194, respectively. Thus, to prevent + // the protection from resetting the machine, we just return $a193 for $a190, + // and $a194 for $a191. return m_videoram[0xa193 + offset]; } @@ -409,6 +409,12 @@ void blaster_state::machine_reset() } +void blaster_state::video_control_w(u8 data) +{ + m_video_control = data; +} + + void blaster_state::blaster_vram_select_w(u8 data) { // VRAM/ROM banking from bit 0 @@ -495,20 +501,16 @@ void tshoot_state::machine_start() void tshoot_state::maxvol_w(int state) { - /* something to do with the sound volume */ + // something to do with the sound volume logerror("tshoot maxvol = %d (%s)\n", state, machine().describe_context()); } void tshoot_state::lamp_w(u8 data) { - /* set the grenade lamp */ m_grenade_lamp = BIT(~data, 2); - /* set the gun lamp */ m_gun_lamp = BIT(~data, 3); - /* gun coil */ m_p1_gun_recoil = BIT(data, 4); - /* feather coil */ m_feather_blower = BIT(data, 5); } diff --git a/src/mame/midway/williams_v.cpp b/src/mame/midway/williams_v.cpp index 75eb1c7fa763a..e49503d426b27 100644 --- a/src/mame/midway/williams_v.cpp +++ b/src/mame/midway/williams_v.cpp @@ -169,6 +169,7 @@ void williams_state::video_start() void blaster_state::video_start() { williams_state::video_start(); + save_item(NAME(m_color0)); save_item(NAME(m_video_control)); } @@ -178,7 +179,7 @@ void williams2_state::video_start() { williams_state::video_start(); - /* create the tilemap */ + // create the tilemap m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(williams2_state::get_tile_info)), TILEMAP_SCAN_COLS, 24,16, 128,16); m_bg_tilemap->set_scrolldx(2, 0); @@ -227,35 +228,35 @@ uint32_t blaster_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma uint8_t const *const scanline_control = &m_videoram[0xbc00]; rgb_t pens[16]; - /* precompute the palette */ + // precompute the palette for (int x = 0; x < 16; x++) pens[x] = m_palette->pen_color(m_paletteram[x]); - /* if we're blitting from the top, start with a 0 for color 0 */ + // if we're blitting from the top, start with a 0 for color 0 if (cliprect.min_y == screen.visible_area().min_y || !(m_video_control & 1)) m_color0 = m_palette->pen_color(palette_0[0] ^ 0xff); - /* loop over rows */ + // loop over rows for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { int const erase_behind = m_video_control & scanline_control[y] & 2; uint8_t *const source = &m_videoram[y]; uint32_t *const dest = &bitmap.pix(y); - /* latch a new color0 pen? */ + // latch a new color0 pen? if (m_video_control & scanline_control[y] & 1) m_color0 = m_palette->pen_color(palette_0[y] ^ 0xff); - /* loop over columns */ + // loop over columns for (int x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { uint8_t const pix = source[(x/2) * 256]; - /* clear behind us if requested */ + // clear behind us if requested if (erase_behind) source[(x/2) * 256] = 0; - /* now draw */ + // now draw dest[x+0] = (pix & 0xf0) ? pens[pix >> 4] : rgb_t(m_color0 | pens[0]); dest[x+1] = (pix & 0x0f) ? pens[pix & 0x0f] : rgb_t(m_color0 | pens[0]); } @@ -268,20 +269,20 @@ uint32_t williams2_state::screen_update(screen_device &screen, bitmap_rgb32 &bit { rgb_t pens[16]; - /* draw the background */ + // draw the background m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); - /* fetch the relevant pens */ + // fetch the relevant pens for (int x = 1; x < 16; x++) pens[x] = m_palette->pen_color(m_fg_color * 16 + x); - /* loop over rows */ + // loop over rows for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { uint8_t const *const source = &m_videoram[y]; uint32_t *const dest = &bitmap.pix(y); - /* loop over columns */ + // loop over columns for (int x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { uint8_t const pix = source[(x/2) * 256]; @@ -300,21 +301,21 @@ uint32_t mysticm_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma { rgb_t pens[16]; - /* draw the background */ + // draw the background m_bg_tilemap->mark_all_dirty(); m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0); - /* loop over rows */ + // loop over rows for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { - /* fetch the relevant pens */ + // fetch the relevant pens for (int x = 1; x < 16; x++) pens[x] = m_palette->pen_color(color_decode(m_fg_color, 1, y) * 16 + x); uint8_t const *const source = &m_videoram[y]; uint32_t *const dest = &bitmap.pix(y); - /* loop over columns */ + // loop over columns for (int x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { uint8_t const pix = source[(x/2) * 256]; @@ -422,7 +423,6 @@ rgb_t williams2_state::calc_col(uint16_t lo, uint16_t hi) }; // update the palette entry - const uint16_t i = (hi >> 4) & 15; const uint16_t ub = (hi >> 0) & 15; const uint16_t ug = (lo >> 4) & 15; @@ -449,10 +449,10 @@ rgb_t williams2_state::calc_col(uint16_t lo, uint16_t hi) void williams2_state::paletteram_w(offs_t offset, u8 data) { - /* set the new value */ + // set the new value m_paletteram[offset] = data; - /* pull the associated low/high bytes */ + // pull the associated low/high bytes uint16_t entry_lo = m_paletteram[offset & ~1]; uint16_t entry_hi = m_paletteram[offset | 1]; @@ -510,7 +510,7 @@ TILE_GET_INFO_MEMBER(williams2_state::get_tile_info) int const data = m_tileram[tile_index]; int const y = (tile_index >> 1) & 7; - /* On tshoot and inferno, IC79 is a 74LS157 selector jumpered to be enabled */ + // On tshoot and inferno, IC79 is a 74LS157 selector jumpered to be enabled int const color = y; tileinfo.set(0, data & mask, color, (data & ~mask) ? TILE_FLIPX : 0); @@ -539,7 +539,7 @@ int mysticm_state::color_decode(uint8_t base_col, int sig_J1, int y) // FIXME: Investigate further. - /* IC79 is a 74LS85 comparator that controls the low bit */ + // IC79 is a 74LS85 comparator that controls the low bit int const a = 1 | ((base_col & 1) << 2) | ((base_col & 1) << 3); int const b = (sig_W12 << 0) | (sig_W13 << 1) | (0 << 2) | (sig_J1 << 3); int const color = (a > b) || ((a == b) && !sig_W11); @@ -575,31 +575,31 @@ TILE_GET_INFO_MEMBER(joust2_state::get_tile_info) int const mask = m_gfxdecode->gfx(0)->elements() - 1; int const data = m_tileram[tile_index]; - /* IC79 is a 74LS157 selector jumpered to be disabled */ + // IC79 is a 74LS157 selector jumpered to be disabled int const color = 0; tileinfo.set(0, data & mask, color, (data & ~mask) ? TILE_FLIPX : 0); } -/* based on the board type, only certain bits are used */ -/* the rest are determined by other factors */ +// based on the board type, only certain bits are used +// the rest are determined by other factors void williams2_state::bg_select_w(u8 data) { - /* IC79 is a 74LS157 selector jumpered to be enabled */ + // IC79 is a 74LS157 selector jumpered to be enabled m_bg_tilemap->set_palette_offset((data & 0x38) << 4); } void mysticm_state::bg_select_w(u8 data) { - /* IC79 is a 74LS85 comparator that controls the low bit */ + // IC79 is a 74LS85 comparator that controls the low bit m_bg_color = data; m_bg_tilemap->mark_all_dirty(); } void joust2_state::bg_select_w(u8 data) { - /* IC79 is a 74LS157 selector jumpered to be disabled */ + // IC79 is a 74LS157 selector jumpered to be disabled m_bg_tilemap->set_palette_offset((data & 0x3f) << 4); } @@ -622,16 +622,3 @@ void williams2_state::xscroll_high_w(u8 data) m_tilemap_xscroll = (m_tilemap_xscroll & 0x00f) | (data << 4); m_bg_tilemap->set_scrollx(0, (m_tilemap_xscroll & 7) + ((m_tilemap_xscroll >> 3) * 6)); } - - - -/************************************* - * - * Blaster-specific enhancements - * - *************************************/ - -void blaster_state::video_control_w(u8 data) -{ - m_video_control = data; -} diff --git a/src/mame/midway/wmg.cpp b/src/mame/midway/wmg.cpp index 0a7cf9e787dde..5e221e2288bc3 100644 --- a/src/mame/midway/wmg.cpp +++ b/src/mame/midway/wmg.cpp @@ -65,7 +65,6 @@ The game works perfectly. However the code is a bit of a bodge-job, originally f then updated for HBMAME 0.148u1. It could do with a cleanup, and removal of the various hacks. Support of save-state is also needed. - ***********************************************************************************************************/ #include "emu.h" @@ -135,6 +134,7 @@ class wmg_state : public williams_state * Address Map * *************************************/ + void wmg_state::wmg_cpu1(address_map &map) { map(0x0000, 0xbfff).ram().share(m_videoram); @@ -168,6 +168,7 @@ void wmg_state::wmg_cpu2(address_map &map) map(0xf000, 0xffff).bankr(m_soundbank); } + /*************************************************************** * * Inputs, banked. One set for each game. @@ -176,6 +177,7 @@ void wmg_state::wmg_cpu2(address_map &map) * JOYSTICK PLAYER(2) is really JOYSTICKRIGHT on WMG hardware * ***************************************************************/ + static INPUT_PORTS_START( wmg ) PORT_START("IN0") PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(FUNC(wmg_state::wmg_mux_r<0>)) @@ -193,7 +195,7 @@ static INPUT_PORTS_START( wmg ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_TILT ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) -/* menu */ + /* menu */ PORT_START("X0") // IN000 (game,port,player) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_NAME("Menu/Left/Up") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_NAME("Menu/Left/Down") @@ -214,7 +216,7 @@ static INPUT_PORTS_START( wmg ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Menu/Reverse") PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Menu/Inviso or Flap") -/* robotron */ + /* robotron */ PORT_START("X2") // IN100 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_NAME("Robotron/Left/Move Up") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_NAME("Robotron/Left/Move Down") @@ -230,7 +232,7 @@ static INPUT_PORTS_START( wmg ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY PORT_NAME("Robotron/Right/Fire Right") PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) -/* joust */ + /* joust */ PORT_START("X4") // IN201 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(1) PORT_NAME("Joust/P1/Left") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(1) PORT_NAME("Joust/P1/Right") @@ -250,7 +252,7 @@ static INPUT_PORTS_START( wmg ) PORT_START("X6") // IN210 PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) -/* stargate */ + /* stargate */ PORT_START("X7") // IN300 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Stargate/Fire") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Stargate/Thrust") @@ -266,7 +268,7 @@ static INPUT_PORTS_START( wmg ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Stargate/Inviso") PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) -/* bubbles */ + /* bubbles */ PORT_START("X9") // IN400 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_NAME("Bubbles/Up") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_NAME("Bubbles/Down") @@ -279,7 +281,7 @@ static INPUT_PORTS_START( wmg ) PORT_START("X10") // IN410 PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) -/* defender */ + /* defender */ PORT_START("X11") // IN500 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Defender/Fire") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Defender/Thrust") @@ -294,7 +296,7 @@ static INPUT_PORTS_START( wmg ) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_2WAY PORT_NAME("Defender/Up") PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNKNOWN ) -/* splat - there are no P2 controls, so it can only be played by a single player */ + /* splat - there are no P2 controls, so it can only be played by a single player */ PORT_START("X13") // IN601 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Move Up") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Move Down") @@ -319,6 +321,7 @@ static INPUT_PORTS_START( wmg ) PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) INPUT_PORTS_END + /************************************* * * Bankswitching @@ -430,6 +433,7 @@ void wmg_state::machine_reset() m_maincpu->reset(); } + /************************************* * * Input selector code @@ -458,7 +462,7 @@ ioport_value wmg_state::wmg_mux_r() u8 wmg_state::wmg_pia_0_r(offs_t offset) { -/* if player presses P1 and P2 in a game, return to the menu. + /* if player presses P1 and P2 in a game, return to the menu. Since there is no code in rom to handle this, it must be a hardware feature which probably just resets the cpu. */ @@ -476,6 +480,7 @@ u8 wmg_state::wmg_pia_0_r(offs_t offset) return data; } + /************************************* * * Machine Driver @@ -542,11 +547,13 @@ void wmg_state::wmg(machine_config &config) WILLIAMS_BLITTER_SC1(config, m_blitter, 0xc000, m_maincpu, m_videoram); } + /************************************* * * Roms * *************************************/ + ROM_START( wmg ) ROM_REGION( 0x80000, "maincpu", 0 ) ROM_LOAD( "wmg.cpu", 0x00000, 0x80000, CRC(975516ec) SHA1(571aaf9bff8ebfc36448cd9394b47bcfae7d1b83) ) From 4a3c1a05803377eaf3870ad387296b667b731452 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Tue, 14 Jan 2025 19:28:35 +0100 Subject: [PATCH 22/80] New working clones ------------------ New Lucky 8 Lines (set 14, W-4, Yamate) [Ioannis Bampoulas] New Lucky 8 Lines / New Super 8 Lines (F-5, Witch Bonus, Yamate) [Ioannis Bampoulas] New Lucky 8 Lines / New Super 8 Lines (W-4, Witch Bonus, Yamate, 1988, set 1) [Ioannis Bampoulas] New Lucky 8 Lines / New Super 8 Lines (W-4, Witch Bonus, Yamate, 1988, set 2) [Ioannis Bampoulas] New Lucky 8 Lines (set 15, W-4, Cleco bootleg) [Ioannis Bampoulas] New systems marked not working ------------------------------ Top-7 (V8.8, set 1) [Ioannis Bampoulas] New clones marked not working ----------------------------- Tic Tac Toe (Sundance bootleg of New Lucky 8 Lines) [Ioannis Bampoulas] Top-7 (V8.8, set 2) [Ioannis Bampoulas] - misc/norautp.cpp: corrected PAL for drhl [f205v] --- src/mame/igs/goldstar.cpp | 346 +++++++++++++++++++++++++++++++++++++- src/mame/mame.lst | 10 +- src/mame/misc/norautp.cpp | 4 +- 3 files changed, 356 insertions(+), 4 deletions(-) diff --git a/src/mame/igs/goldstar.cpp b/src/mame/igs/goldstar.cpp index 160f2c374ca73..a60acbc9b78f5 100644 --- a/src/mame/igs/goldstar.cpp +++ b/src/mame/igs/goldstar.cpp @@ -531,6 +531,7 @@ class wingco_state : public goldstar_state void init_lucky8l(); void init_lucky8m(); void init_lucky8n(); + void init_lucky8p(); void init_magoddsc(); void init_flaming7(); void init_flam7_tw(); @@ -554,6 +555,7 @@ class wingco_state : public goldstar_state void lucky8(machine_config &config); void lucky8f(machine_config &config); void lucky8k(machine_config &config); + void lucky8p(machine_config &config); void luckylad(machine_config &config); void nd8lines(machine_config &config); void super972(machine_config &config); @@ -575,6 +577,7 @@ class wingco_state : public goldstar_state uint8_t m_nmi_enable = 0U; uint8_t m_vidreg = 0U; + void lucky8p_map(address_map &map) ATTR_COLD; void nd8lines_map(address_map &map) ATTR_COLD; }; @@ -2401,6 +2404,13 @@ void goldstar_state::lucky8_map(address_map &map) map(0xf800, 0xffff).ram(); } +void wingco_state::lucky8p_map(address_map &map) +{ + lucky8_map(map); + + map(0xf800, 0xffff).rom(); +} + void wingco_state::nd8lines_map(address_map &map) { map(0x0000, 0x7fff).rom(); @@ -10760,6 +10770,13 @@ void wingco_state::lucky8k(machine_config &config) maincpu.set_decrypted_tag(m_decrypted_opcodes); } +void wingco_state::lucky8p(machine_config &config) +{ + lucky8(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &wingco_state::lucky8p_map); +} + void wingco_state::luckylad(machine_config &config) { lucky8(config); @@ -13681,6 +13698,78 @@ ROM_START( aplan ) // Has "DYNA QL-1 V1.01" string. ROM_LOAD( "82s129.u46", 0x100, 0x100, CRC(21eb5b19) SHA1(9b8425bdb97f11f4855c998c7792c3291fd07470) ) ROM_END + // DYNA QL-1 V7.07 string, but not original. Utech Top-7v8.8 05/26/1993 string. According to pics also sports a 金鸡报喜 (Jin Ji Bao Xi) title screen +ROM_START( top7 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "top7.u81", 0x0000, 0x1000, CRC(29b5a888) SHA1(695bebcad1d3034d6a3d0ca2fd0eb279a5db240a) ) + ROM_CONTINUE( 0x4000, 0x1000 ) + ROM_CONTINUE( 0x3000, 0x1000 ) + ROM_CONTINUE( 0x7000, 0x1000 ) + ROM_CONTINUE( 0x1000, 0x1000 ) + ROM_CONTINUE( 0x6000, 0x1000 ) + ROM_CONTINUE( 0x2000, 0x1000 ) + ROM_CONTINUE( 0x5000, 0x1000 ) + ROM_CONTINUE( 0x8000, 0x8000 ) + + ROM_REGION( 0x18000, "gfx1", 0 ) + ROM_LOAD( "7.u16", 0x00000, 0x8000, CRC(40a35a3e) SHA1(040a645bd1201d484181b55f2a4ab3d6457ce21e) ) + ROM_LOAD( "6.u11", 0x08000, 0x8000, CRC(6760ee4d) SHA1(10412d5ec62e8c442a5a772867daeaf38521b87c) ) + ROM_LOAD( "5.u4", 0x10000, 0x8000, CRC(23246ab5) SHA1(860231a185c6d286171e0bd265d2a646fb0ee7df) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "4.u15", 0x0000, 0x2000, CRC(02b3d190) SHA1(4a68dd9f392996942c3d3e2aa28e880a9d0f62d4) ) + ROM_LOAD( "3.u10", 0x2000, 0x2000, CRC(32972c9e) SHA1(6ebf18d9e91f7a7ef23961c31c6fbad933e1b708) ) + ROM_LOAD( "2.u14", 0x4000, 0x2000, CRC(741f707d) SHA1(a9eb4045794662c2029c71dca2bd70142befcc5e) ) + ROM_LOAD( "1.u9", 0x6000, 0x2000, CRC(12f9071f) SHA1(92f13ba8dffce56934b110da73c41f8aa7151e81) ) + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_FILL( 0x0000, 0x10000, 0xff ) // U53 (girl bitmaps) not populated + + // PROMs not dumped for this set + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "82s129.u84", 0x0000, 0x0100, BAD_DUMP CRC(0489b760) SHA1(78f8632b17a76335183c5c204cdec856988368b0) ) + ROM_LOAD( "82s129.u79", 0x0100, 0x0100, BAD_DUMP CRC(21eb5b19) SHA1(9b8425bdb97f11f4855c998c7792c3291fd07470) ) + + ROM_REGION( 0x100, "proms2", 0 ) + ROM_LOAD( "82s129.u46", 0x0000, 0x0100, BAD_DUMP CRC(50ec383b) SHA1(ae95b92bd3946b40134bcdc22708d5c6b0f4c23e) ) +ROM_END + + // Minor differences from above, but legit. +ROM_START( top7a ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "top7a.u81", 0x0000, 0x1000, CRC(68874abe) SHA1(bfd2c38475be8cc2bc7061b1f25bb1b6eafbc333) ) + ROM_CONTINUE( 0x4000, 0x1000 ) + ROM_CONTINUE( 0x3000, 0x1000 ) + ROM_CONTINUE( 0x7000, 0x1000 ) + ROM_CONTINUE( 0x1000, 0x1000 ) + ROM_CONTINUE( 0x6000, 0x1000 ) + ROM_CONTINUE( 0x2000, 0x1000 ) + ROM_CONTINUE( 0x5000, 0x1000 ) + ROM_CONTINUE( 0x8000, 0x8000 ) + + ROM_REGION( 0x18000, "gfx1", 0 ) + ROM_LOAD( "7.u16", 0x00000, 0x8000, CRC(40a35a3e) SHA1(040a645bd1201d484181b55f2a4ab3d6457ce21e) ) + ROM_LOAD( "6.u11", 0x08000, 0x8000, CRC(6760ee4d) SHA1(10412d5ec62e8c442a5a772867daeaf38521b87c) ) + ROM_LOAD( "5.u4", 0x10000, 0x8000, CRC(23246ab5) SHA1(860231a185c6d286171e0bd265d2a646fb0ee7df) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "4.u15", 0x0000, 0x2000, CRC(02b3d190) SHA1(4a68dd9f392996942c3d3e2aa28e880a9d0f62d4) ) + ROM_LOAD( "3.u10", 0x2000, 0x2000, CRC(32972c9e) SHA1(6ebf18d9e91f7a7ef23961c31c6fbad933e1b708) ) + ROM_LOAD( "2.u14", 0x4000, 0x2000, CRC(741f707d) SHA1(a9eb4045794662c2029c71dca2bd70142befcc5e) ) + ROM_LOAD( "1.u9", 0x6000, 0x2000, CRC(12f9071f) SHA1(92f13ba8dffce56934b110da73c41f8aa7151e81) ) + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_FILL( 0x0000, 0x10000, 0xff ) // U53 (girl bitmaps) not populated + + // PROMs not dumped for this set + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "82s129.u84", 0x0000, 0x0100, BAD_DUMP CRC(0489b760) SHA1(78f8632b17a76335183c5c204cdec856988368b0) ) + ROM_LOAD( "82s129.u79", 0x0100, 0x0100, BAD_DUMP CRC(21eb5b19) SHA1(9b8425bdb97f11f4855c998c7792c3291fd07470) ) + + ROM_REGION( 0x100, "proms2", 0 ) + ROM_LOAD( "82s129.u46", 0x0000, 0x0100, BAD_DUMP CRC(50ec383b) SHA1(ae95b92bd3946b40134bcdc22708d5c6b0f4c23e) ) +ROM_END + ROM_START( war3cb ) // WANG QL-0B V1.00 in NVRAM, SANGHO in GFX ROMs ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "27c512 9 sub-board.bin", 0x2000, 0x2000, CRC(7fc6009d) SHA1(cb664890cffaddb741e8fe94d73ca23634c21e95) ) @@ -14779,6 +14868,66 @@ ROM_START( lucky8n ) ROM_LOAD( "g13", 0x00, 0x20, BAD_DUMP CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) ROM_END +ROM_START( lucky8o ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "256.bin", 0x0000, 0x8000, CRC(fe8e5110) SHA1(98b6a1db64312482d6ffbd5d9985e6feaa747111) ) + + // only the program ROM was provided, with no indication of the other ROMs / PROMs. Using bog-standard lucky8 ones for now + ROM_REGION( 0x18000, "gfx1", 0 ) + ROM_LOAD( "5.h7", 0x00000, 0x8000, BAD_DUMP CRC(59026af3) SHA1(3d7f7e78968ca26275635aeaa0e994468a3da575) ) + ROM_LOAD( "6.h8", 0x08000, 0x8000, BAD_DUMP CRC(67a073c1) SHA1(36194d57d0dc0601fa1fdf2e6806f11b2ea6da36) ) + ROM_LOAD( "7.h10", 0x10000, 0x8000, BAD_DUMP CRC(c415b9d0) SHA1(fd558fe8a116c33bbd712a639224d041447a45c1) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "1.h1", 0x0000, 0x2000, BAD_DUMP CRC(29d6f197) SHA1(1542ca457594f6b7fe8f28f7d78023edd7021bc8) ) + ROM_LOAD( "2.h3", 0x2000, 0x2000, BAD_DUMP CRC(5f812e65) SHA1(70d9ea82f9337936bf21f82b6961768d436f3a6f) ) + ROM_LOAD( "3.h4", 0x4000, 0x2000, BAD_DUMP CRC(898b9ed5) SHA1(11b7d1cfcf425d00d086c74e0dbcb72068dda9fe) ) + ROM_LOAD( "4.h5", 0x6000, 0x2000, BAD_DUMP CRC(4f7cfb35) SHA1(0617cf4419be00d9bacc78724089cb8af4104d68) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "d12", 0x0000, 0x0100, BAD_DUMP CRC(23e81049) SHA1(78071dae70fad870e972d944642fb3a2374be5e4) ) + ROM_LOAD( "prom4", 0x0100, 0x0100, BAD_DUMP CRC(526cf9d3) SHA1(eb779d70f2507d0f26d225ac8f5de8f2243599ca) ) + + ROM_REGION( 0x20, "proms2", 0 ) + ROM_LOAD( "d13", 0x0000, 0x0020, BAD_DUMP CRC(c6b41352) SHA1(d7c3b5aa32e4e456c9432a13bede1db6d62eb270) ) + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "g14", 0x0000, 0x0100, BAD_DUMP CRC(bd48de71) SHA1(e4fa1e774af1499bc568be5b2deabb859d8c8172) ) + + ROM_REGION( 0x20, "unkprom2", 0 ) + ROM_LOAD( "g13", 0x0000, 0x0020, BAD_DUMP CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) +ROM_END + +ROM_START( lucky8p ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "27c512.bin", 0x00000, 0x10000, CRC(6b7d70be) SHA1(d6520f2da2b74eae02b6ee3375fe982c358dc927) ) + + // only the program ROM was provided, with no indication of the other ROMs / PROMs. Using bog-standard lucky8 ones for now + ROM_REGION( 0x18000, "gfx1", 0 ) // may be wrong, see missing GFX on title screen + ROM_LOAD( "5.h7", 0x00000, 0x8000, BAD_DUMP CRC(59026af3) SHA1(3d7f7e78968ca26275635aeaa0e994468a3da575) ) + ROM_LOAD( "6.h8", 0x08000, 0x8000, BAD_DUMP CRC(67a073c1) SHA1(36194d57d0dc0601fa1fdf2e6806f11b2ea6da36) ) + ROM_LOAD( "7.h10", 0x10000, 0x8000, BAD_DUMP CRC(c415b9d0) SHA1(fd558fe8a116c33bbd712a639224d041447a45c1) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "1.h1", 0x0000, 0x2000, BAD_DUMP CRC(29d6f197) SHA1(1542ca457594f6b7fe8f28f7d78023edd7021bc8) ) + ROM_LOAD( "2.h3", 0x2000, 0x2000, BAD_DUMP CRC(5f812e65) SHA1(70d9ea82f9337936bf21f82b6961768d436f3a6f) ) + ROM_LOAD( "3.h4", 0x4000, 0x2000, BAD_DUMP CRC(898b9ed5) SHA1(11b7d1cfcf425d00d086c74e0dbcb72068dda9fe) ) + ROM_LOAD( "4.h5", 0x6000, 0x2000, BAD_DUMP CRC(4f7cfb35) SHA1(0617cf4419be00d9bacc78724089cb8af4104d68) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "d12", 0x0000, 0x0100, BAD_DUMP CRC(23e81049) SHA1(78071dae70fad870e972d944642fb3a2374be5e4) ) + ROM_LOAD( "prom4", 0x0100, 0x0100, BAD_DUMP CRC(526cf9d3) SHA1(eb779d70f2507d0f26d225ac8f5de8f2243599ca) ) + + ROM_REGION( 0x20, "proms2", 0 ) + ROM_LOAD( "d13", 0x0000, 0x0020, BAD_DUMP CRC(c6b41352) SHA1(d7c3b5aa32e4e456c9432a13bede1db6d62eb270) ) + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "g14", 0x0000, 0x0100, BAD_DUMP CRC(bd48de71) SHA1(e4fa1e774af1499bc568be5b2deabb859d8c8172) ) + + ROM_REGION( 0x20, "unkprom2", 0 ) + ROM_LOAD( "g13", 0x0000, 0x0020, BAD_DUMP CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) +ROM_END + // only the subboard available (Z80, ROM, 2 stickered chips (sanded), 2 banks of 8 DIP switches (marked SW5 and SW6) and a rotary switch (SW7)) // very professional-looking subboard marked Excel Planning // needs correct GFX ROMs / color PROMs (using the ones from wcat3, for now) @@ -15295,6 +15444,112 @@ ROM_START( ns8linewa ) ROM_LOAD( "5.12d", 0x0000, 0x0020, CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) // same as ns8lines ROM_END +ROM_START( ns8linewb ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "27c256.14h", 0x0000, 0x8000, CRC(d28ec9b3) SHA1(1aa6b777f6c4cdd70b7779ac3c693de21105dcbd) ) + + ROM_REGION( 0x18000, "gfx1", 0 ) + ROM_LOAD( "27c512.4h", 0x00000, 0x8000, CRC(833a2735) SHA1(8073a6d50c63b4a4bcb643fa7109e5b357f1531a) ) // 1xxxxxxxxxxxxxxx = 0x00 + ROM_IGNORE( 0x8000 ) + ROM_LOAD( "27c512.6h", 0x10000, 0x8000, CRC(64376fa8) SHA1(d0a9f5df7261403f8a1e42cab2cda17767ec13e6) ) + ROM_CONTINUE( 0x08000, 0x8000 ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "27c256.10h", 0x6000, 0x2000, CRC(4df0ee91) SHA1(de99331a98b7853e417b730f52c09fb95f9da4ca) ) // BADADDR x-xxxxxxxxxxxxx + ROM_CONTINUE( 0x4000, 0x2000 ) + ROM_CONTINUE( 0x4000, 0x2000 ) + ROM_IGNORE( 0x2000 ) + ROM_LOAD( "27c256.9h", 0x2000, 0x2000, CRC(a29c9da9) SHA1(58c532b109a7fcf79566c0ab904b498ca7149d69) ) // BADADDR x-xxxxxxxxxxxxx + ROM_CONTINUE( 0x0000, 0x2000 ) + ROM_CONTINUE( 0x0000, 0x2000 ) + ROM_IGNORE( 0x2000 ) + + // no PROMs provided for this set + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "dm74s287.g13", 0x0000, 0x0100, BAD_DUMP CRC(23e81049) SHA1(78071dae70fad870e972d944642fb3a2374be5e4) ) + ROM_LOAD( "dm74s287.g14", 0x0100, 0x0100, BAD_DUMP CRC(526cf9d3) SHA1(eb779d70f2507d0f26d225ac8f5de8f2243599ca) ) + + ROM_REGION( 0x20, "proms2", 0 ) + ROM_LOAD( "dm74s288.d13", 0x0000, 0x0020, BAD_DUMP CRC(c6b41352) SHA1(d7c3b5aa32e4e456c9432a13bede1db6d62eb270) ) + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "dm74s287.f3", 0x0000, 0x0100, BAD_DUMP CRC(1d668d4a) SHA1(459117f78323ea264d3a29f1da2889bbabe9e4be) ) + + ROM_REGION( 0x20, "unkprom2", 0 ) + ROM_LOAD( "dm74s288.d12", 0x0000, 0x0020, BAD_DUMP CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) +ROM_END + +ROM_START( ns8linewc ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "27c256.14h", 0x0000, 0x8000, CRC(9e2f3adb) SHA1(9d45059f04115548daa53b356db688995e7efba0) ) + + ROM_REGION( 0x18000, "gfx1", 0 ) + ROM_LOAD( "27c512.4h", 0x00000, 0x8000, CRC(833a2735) SHA1(8073a6d50c63b4a4bcb643fa7109e5b357f1531a) ) // 1xxxxxxxxxxxxxxx = 0x00 + ROM_IGNORE( 0x8000 ) + ROM_LOAD( "27c512.6h", 0x10000, 0x8000, CRC(64376fa8) SHA1(d0a9f5df7261403f8a1e42cab2cda17767ec13e6) ) + ROM_CONTINUE( 0x08000, 0x8000 ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "27c256.10h", 0x6000, 0x2000, CRC(4df0ee91) SHA1(de99331a98b7853e417b730f52c09fb95f9da4ca) ) // BADADDR x-xxxxxxxxxxxxx + ROM_CONTINUE( 0x4000, 0x2000 ) + ROM_CONTINUE( 0x4000, 0x2000 ) + ROM_IGNORE( 0x2000 ) + ROM_LOAD( "27c256.9h", 0x2000, 0x2000, CRC(a29c9da9) SHA1(58c532b109a7fcf79566c0ab904b498ca7149d69) ) // BADADDR x-xxxxxxxxxxxxx + ROM_CONTINUE( 0x0000, 0x2000 ) + ROM_CONTINUE( 0x0000, 0x2000 ) + ROM_IGNORE( 0x2000 ) + + // no PROMs provided for this set + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "dm74s287.g13", 0x0000, 0x0100, BAD_DUMP CRC(23e81049) SHA1(78071dae70fad870e972d944642fb3a2374be5e4) ) + ROM_LOAD( "dm74s287.g14", 0x0100, 0x0100, BAD_DUMP CRC(526cf9d3) SHA1(eb779d70f2507d0f26d225ac8f5de8f2243599ca) ) + + ROM_REGION( 0x20, "proms2", 0 ) + ROM_LOAD( "dm74s288.d13", 0x0000, 0x0020, BAD_DUMP CRC(c6b41352) SHA1(d7c3b5aa32e4e456c9432a13bede1db6d62eb270) ) + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "dm74s287.f3", 0x0000, 0x0100, BAD_DUMP CRC(1d668d4a) SHA1(459117f78323ea264d3a29f1da2889bbabe9e4be) ) + + ROM_REGION( 0x20, "unkprom2", 0 ) + ROM_LOAD( "dm74s288.d12", 0x0000, 0x0020, BAD_DUMP CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) +ROM_END + +ROM_START( ns8linewd ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "27c256.14h", 0x0000, 0x8000, CRC(eedfc910) SHA1(ef07e1aa08bedb62cdba264b8e48593b0d55f539) ) + + ROM_REGION( 0x18000, "gfx1", 0 ) + ROM_LOAD( "27c512.4h", 0x00000, 0x8000, CRC(833a2735) SHA1(8073a6d50c63b4a4bcb643fa7109e5b357f1531a) ) // 1xxxxxxxxxxxxxxx = 0x00 + ROM_IGNORE( 0x8000 ) + ROM_LOAD( "27c512.6h", 0x10000, 0x8000, CRC(64376fa8) SHA1(d0a9f5df7261403f8a1e42cab2cda17767ec13e6) ) + ROM_CONTINUE( 0x08000, 0x8000 ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "27c256.10h", 0x6000, 0x2000, CRC(4df0ee91) SHA1(de99331a98b7853e417b730f52c09fb95f9da4ca) ) // BADADDR x-xxxxxxxxxxxxx + ROM_CONTINUE( 0x4000, 0x2000 ) + ROM_CONTINUE( 0x4000, 0x2000 ) + ROM_IGNORE( 0x2000 ) + ROM_LOAD( "27c256.9h", 0x2000, 0x2000, CRC(a29c9da9) SHA1(58c532b109a7fcf79566c0ab904b498ca7149d69) ) // BADADDR x-xxxxxxxxxxxxx + ROM_CONTINUE( 0x0000, 0x2000 ) + ROM_CONTINUE( 0x0000, 0x2000 ) + ROM_IGNORE( 0x2000 ) + + // no PROMs provided for this set + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "dm74s287.g13", 0x0000, 0x0100, BAD_DUMP CRC(23e81049) SHA1(78071dae70fad870e972d944642fb3a2374be5e4) ) + ROM_LOAD( "dm74s287.g14", 0x0100, 0x0100, BAD_DUMP CRC(526cf9d3) SHA1(eb779d70f2507d0f26d225ac8f5de8f2243599ca) ) + + ROM_REGION( 0x20, "proms2", 0 ) + ROM_LOAD( "dm74s288.d13", 0x0000, 0x0020, BAD_DUMP CRC(c6b41352) SHA1(d7c3b5aa32e4e456c9432a13bede1db6d62eb270) ) + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "dm74s287.f3", 0x0000, 0x0100, BAD_DUMP CRC(1d668d4a) SHA1(459117f78323ea264d3a29f1da2889bbabe9e4be) ) + + ROM_REGION( 0x20, "unkprom2", 0 ) + ROM_LOAD( "dm74s288.d12", 0x0000, 0x0020, BAD_DUMP CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) +ROM_END + + /* New Lucky 8 Lines / New Super 8 Lines (W-4) @@ -15444,6 +15699,36 @@ ROM_START( cbaai ) // W4 base board + CPU board. ROM_LOAD( "u1.bin", 0x0000, 0x0020, CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) ROM_END +ROM_START( ttactoe ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "tic_8.14b", 0x0000, 0x8000, CRC(a3b8f6ce) SHA1(e85803a0683f11f763bbcec82b0ab5b6dcc31d8f) ) + + ROM_REGION( 0x18000, "gfx1", 0 ) + ROM_LOAD( "t5.7h", 0x00000, 0x8000, CRC(868fd100) SHA1(00b09049c34865206d324fb329cee74f35dce7ea) ) // 1ST AND 2ND HALF IDENTICAL + ROM_LOAD( "t6.8h", 0x08000, 0x8000, CRC(f39ac672) SHA1(80f1b734e4321917778ce226348c31b19dc677c7) ) // 1ST AND 2ND HALF IDENTICAL + ROM_LOAD( "t7.9h", 0x10000, 0x8000, CRC(8b23b265) SHA1(3fc66ab5844d49e12e20f30deb6aa0d07cac3333) ) // 1ST AND 2ND HALF IDENTICAL + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "t1.1h", 0x0000, 0x2000, CRC(be8b3c26) SHA1(369703a91f430af91083cde2bbec210fa355c4a7) ) + ROM_LOAD( "t2.2h", 0x2000, 0x2000, CRC(2385ce3d) SHA1(49d8e3357ccfbe9e2c214276e884fff97d3da472) ) + ROM_LOAD( "t3.4h", 0x4000, 0x2000, CRC(e2074f7f) SHA1(d2ccfd52372d37fd258d8544f0d53440b6b575f9) ) + ROM_LOAD( "t4.5h", 0x6000, 0x2000, CRC(da56407d) SHA1(9a02c8b9d2489332ac64e8af5059bc6e7a1c9902) ) + + // PROMs were not included in this set + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "u4.bin", 0x0000, 0x0100, NO_DUMP CRC(23e81049) SHA1(78071dae70fad870e972d944642fb3a2374be5e4) ) + ROM_LOAD( "u5.bin", 0x0100, 0x0100, NO_DUMP CRC(526cf9d3) SHA1(eb779d70f2507d0f26d225ac8f5de8f2243599ca) ) + + ROM_REGION( 0x40, "proms2", 0 ) + ROM_LOAD( "u2.bin", 0x0000, 0x0020, NO_DUMP CRC(c6b41352) SHA1(d7c3b5aa32e4e456c9432a13bede1db6d62eb270) ) + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "u3.bin", 0x0000, 0x0100, NO_DUMP CRC(1d668d4a) SHA1(459117f78323ea264d3a29f1da2889bbabe9e4be) ) + + ROM_REGION( 0x20, "unkprom2", 0 ) + ROM_LOAD( "u1.bin", 0x0000, 0x0020, NO_DUMP CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) +ROM_END + /* Super 97-2 @@ -22015,6 +22300,57 @@ void wingco_state::init_lucky8n() } } +void wingco_state::init_lucky8p() +{ + uint8_t *rom = memregion("maincpu")->base(); + + for (int i = 0; i < 0x10000; i++) + { + uint8_t x = rom[i]; + + switch(i & 0xf8) + { + case 0x00: x ^= 0xd3; break; + case 0x08: x ^= 0xc3; break; + case 0x10: x ^= 0x93; break; + case 0x18: x ^= 0x83; break; + case 0x20: x ^= 0x93; break; + case 0x28: x ^= 0x83; break; + case 0x30: x ^= 0xd3; break; + case 0x38: x ^= 0xc3; break; + case 0x40: x ^= 0xc0; break; + case 0x48: x ^= 0xd0; break; + case 0x50: x ^= 0x80; break; + case 0x58: x ^= 0x90; break; + case 0x60: x ^= 0x80; break; + case 0x68: x ^= 0x90; break; + case 0x70: x ^= 0xc0; break; + case 0x78: x ^= 0xd0; break; + case 0x80: x ^= 0x5a; break; + case 0x88: x ^= 0x4a; break; + case 0x90: x ^= 0x1a; break; + case 0x98: x ^= 0x0a; break; + case 0xa0: x ^= 0x1a; break; + case 0xa8: x ^= 0x0a; break; + case 0xb0: x ^= 0x5a; break; + case 0xb8: x ^= 0x4a; break; + case 0xc0: x ^= 0x49; break; + case 0xc8: x ^= 0x59; break; + case 0xd0: x ^= 0x09; break; + case 0xd8: x ^= 0x19; break; + case 0xe0: x ^= 0x09; break; + case 0xe8: x ^= 0x19; break; + case 0xf0: x ^= 0x49; break; + case 0xf8: x ^= 0x59; break; + } + + if (i & 0x4000) x ^= 0x08; + if (i & 0x8000) x ^= 0x82; + + rom[i] = x; + } +} + void wingco_state::init_nd8lines() { uint8_t *rom = memregion("maincpu")->base(); @@ -22950,6 +23286,8 @@ GAME( 1996, cmast97i, cmast97, cm97, cmv801, cmaster_state, empty_ini GAME( 1999, cmast99, 0, cm, cmast99, cmaster_state, init_cmv4, ROT0, "Dyna", "Cherry Master '99 (V9B.00)", MACHINE_NOT_WORKING ) GAME( 1999, cmast99b, cmast99, cm, cmast99, cmaster_state, init_cmv4, ROT0, "bootleg", "Cherry Master '99 (V9B.00 bootleg / hack)", MACHINE_NOT_WORKING ) GAME( 1993, aplan, 0, cm, cmast99, cmaster_state, init_cmv4, ROT0, "WeaShing H.K.", "A-Plan", MACHINE_NOT_WORKING ) +GAME( 1999, top7, 0, cm, cmast99, cmaster_state, empty_init, ROT0, "bootleg (UTech)", "Top-7 (V8.8, set 1)", MACHINE_NOT_WORKING ) // doesn't boot, not investigated yet +GAME( 1999, top7a, top7, cm, cmast99, cmaster_state, empty_init, ROT0, "bootleg (UTech)", "Top-7 (V8.8, set 2)", MACHINE_NOT_WORKING ) // doesn't boot, not investigated yet GAME( 1996, war3cb, 0, cm, cmast99, cmaster_state, empty_init, ROT0, "S.B.E.", "War III Cherry Best", MACHINE_NOT_WORKING ) // different portmap? @@ -22971,10 +23309,15 @@ GAMEL( 1989, lucky8k, lucky8, lucky8k, lucky8, wingco_state, empty_ini GAMEL( 1989, lucky8l, lucky8, lucky8, lucky8, wingco_state, init_lucky8l, ROT0, "Wing Co., Ltd.", "New Lucky 8 Lines (set 11, W-4)", MACHINE_WRONG_COLORS, layout_lucky8 ) // uses a strange mix of PLDs and PROMs for colors GAMEL( 1989, lucky8m, lucky8, lucky8f, lucky8, wingco_state, init_lucky8m, ROT0, "Wing Co., Ltd.", "New Lucky 8 Lines (set 12, W-4, encrypted)", 0, layout_lucky8 ) GAMEL( 1989, lucky8n, lucky8, lucky8f, lucky8, wingco_state, init_lucky8n, ROT0, "Wing Co., Ltd.", "New Lucky 8 Lines (set 13)", 0, layout_lucky8 ) // 2 control sets... +GAMEL( 1988, lucky8o, lucky8, lucky8, lucky8, wingco_state, empty_init, ROT0, "Yamate", "New Lucky 8 Lines (set 14, W-4, Yamate)", 0, layout_lucky8 ) // 2 control sets... +GAMEL( 1988, lucky8p, lucky8, lucky8p, lucky8, wingco_state, init_lucky8p, ROT0, "bootleg (Cleco)", "New Lucky 8 Lines (set 15, W-4, Cleco bootleg)", MACHINE_IMPERFECT_GRAPHICS, layout_lucky8 ) // 2 control sets, missing GFX on title screen (wrong GFX ROMs) GAMEL( 198?, ns8lines, 0, lucky8, lucky8b, wingco_state, empty_init, ROT0, "", "New Lucky 8 Lines / New Super 8 Lines (W-4)", 0, layout_lucky8p1 ) // only 1 control set... GAMEL( 1985, ns8linesa, ns8lines, lucky8, lucky8b, wingco_state, empty_init, ROT0, "Yamate (bootleg)", "New Lucky 8 Lines / New Super 8 Lines (W-4, Lucky97 HW)", 0, layout_lucky8p1 ) // only 1 control set... GAMEL( 198?, ns8linew, ns8lines, lucky8, ns8linew, wingco_state, empty_init, ROT0, "", "New Lucky 8 Lines / New Super 8 Lines (F-5, Witch Bonus)", 0, layout_lucky8 ) // 2 control sets... GAMEL( 198?, ns8linewa, ns8lines, lucky8, ns8linwa, wingco_state, empty_init, ROT0, "", "New Lucky 8 Lines / New Super 8 Lines (W-4, Witch Bonus)", 0, layout_lucky8p1 ) // only 1 control set... +GAMEL( 1985, ns8linewb, ns8lines, lucky8, ns8linwa, wingco_state, empty_init, ROT0, "Yamate", "New Lucky 8 Lines / New Super 8 Lines (F-5, Witch Bonus, Yamate, 1985)", 0, layout_lucky8p1 ) // only 1 control set... +GAMEL( 1988, ns8linewc, ns8lines, lucky8, ns8linwa, wingco_state, empty_init, ROT0, "Yamate", "New Lucky 8 Lines / New Super 8 Lines (W-4, Witch Bonus, Yamate, 1988, set 1)", 0, layout_lucky8p1 ) // only 1 control set... +GAMEL( 1988, ns8linewd, ns8lines, lucky8, ns8linwa, wingco_state, empty_init, ROT0, "Yamate", "New Lucky 8 Lines / New Super 8 Lines (W-4, Witch Bonus, Yamate, 1988, set 2)", 0, layout_lucky8p1 ) // only 1 control set... GAMEL( 1989, f16s8l, lucky8, lucky8, lucky8, wingco_state, empty_init, ROT0, "Leisure Ent", "F-16 Super 8 Lines", MACHINE_NOT_WORKING, layout_lucky8 ) // needs I/O check, seems mostly playable GAMEL( 1991, nd8lines, lucky8, nd8lines, nd8lines, wingco_state, init_nd8lines, ROT0, "Yamate (bootleg)", "New Draw 8 Lines (Version 2.1)", MACHINE_NOT_WORKING | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_SOUND, layout_lucky8 ) // PROM decode wrong, SN emits terrible sound, inputs not done yet GAMEL( 198?, super972, ns8lines, super972, ns8linwa, wingco_state, init_super972, ROT0, "", "Super 97-2 (Witch Bonus)", MACHINE_NOT_WORKING, layout_lucky8p1 ) // decrypted, needs correct inputs @@ -22990,7 +23333,8 @@ GAME ( 1992?,wcat, 0, wcat3, lucky8b, wingco_state, init_wcat GAME( 1995, wcat3, 0, wcat3, lucky8, wingco_state, init_wcat3, ROT0, "E.A.I.", "Wild Cat 3", MACHINE_NOT_WORKING | MACHINE_WRONG_COLORS ) // decryption partially wrong, needs soft resets before running. Bad PROM decode GAMEL( 199?, animalw, 0, lucky8, animalw, wingco_state, empty_init, ROT0, "bootleg", "Animal Wonders (ver A900)", MACHINE_NOT_WORKING, layout_lucky8 ) // inputs / DIPs need to be checked GAMEL( 1989, cb2, 0, lucky8, lucky8, wingco_state, init_cb2, ROT0, "Dyna", "Cherry Bonus II (V2.00 06/01)", MACHINE_NOT_WORKING, layout_lucky8 ) // I/O need to be checked, seems reasonably working -GAMEL( 1990, cbaai, 0, lucky8, lucky8, wingco_state, empty_init, ROT0, "Dyna", "Cherry Bonus (A.A.I. bootleg)", MACHINE_NOT_WORKING, layout_lucky8 ) // jumps to 0xf430 but there's nothing there? +GAMEL( 1990, cbaai, 0, lucky8, lucky8, wingco_state, empty_init, ROT0, "bootleg (A.A.I.)", "Cherry Bonus (A.A.I. bootleg)", MACHINE_NOT_WORKING, layout_lucky8 ) // jumps to 0xf430 but there's nothing there? +GAMEL( 199?, ttactoe, 0, lucky8, lucky8, wingco_state, empty_init, ROT0, "bootleg (Sundance)","Tic Tac Toe (Sundance bootleg of New Lucky 8 Lines)", MACHINE_NOT_WORKING, layout_lucky8 ) // I/O need to be checked, seems reasonably working GAME( 1985, luckylad, 0, luckylad, luckylad, wingco_state, empty_init, ROT0, "Wing Co., Ltd.", "Lucky Lady (Wing, encrypted)", MACHINE_NOT_WORKING | MACHINE_WRONG_COLORS ) // controls / dips, colors not correctly decoded GAME( 1991, megaline, 0, megaline, megaline, unkch_state, empty_init, ROT0, "Fun World", "Mega Lines", MACHINE_NOT_WORKING ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 93b8532362a15..d6222863af618 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -20276,6 +20276,8 @@ lucky8k // (c) 1989 Wing. With CPU NEC D315-5136 lucky8l // (c) 1989 Wing Co. Ltd lucky8m // (c) 1989 Wing Co. Ltd lucky8n // (c) 1989 Wing Co. Ltd +lucky8o // +lucky8p // luckybar // unknown luckylad // (c) 1985 Wing Co. Ltd magodds // 198? (c) Micro Manufacturing Ltd. @@ -20329,9 +20331,12 @@ nfma // bootleg noved // bootleg nd8lines // bootleg ns8lines // unknown +ns8linesa // (c) 1985 Yamate (bootleg) ns8linew // unknown ns8linewa // unknown -ns8linesa // (c) 1985 Yamate (bootleg) +ns8linewb // (c) 1985 Yamate +ns8linewc // (c) 1988 Yamate +ns8linewd // (c) 1988 Yamate pkrmast // (c) 199? unknown pkrmasta // (c) 199? unknown pokonl97 // (c) 1997 Amcoe @@ -20353,6 +20358,9 @@ super9a // (c) 2001 Playmark super972 // unknown tcl // (c) 1995 Uniwang tonypok // (c) 1991 Corsica +top7 // +top7a // +ttactoe // unkch1 // bootleg unkch2 // bootleg unkch3 // bootleg diff --git a/src/mame/misc/norautp.cpp b/src/mame/misc/norautp.cpp index a35730014d959..013ee53b642f4 100644 --- a/src/mame/misc/norautp.cpp +++ b/src/mame/misc/norautp.cpp @@ -3394,8 +3394,8 @@ ROM_START( drhl ) ROM_REGION( 0x1000, "gfx", 0 ) ROM_LOAD( "drhl_v1.0.u31", 0x0000, 0x1000, CRC(bbc7c970) SHA1(9268a430764a5ea8ba7cd18944ec254a44d9dff2) ) - ROM_REGION( 0x0200, "plds", 0 ) // possible bad dump. fusemap's 1st half is all 1's and 2nd half 0's */ - ROM_LOAD( "drhl_ampal16l8pc.u51", 0x0000, 0x0104, CRC(bd76fb53) SHA1(2d0634e8edb3289a103719466465e9777606086e) ) + ROM_REGION( 0x0200, "plds", 0 ) + ROM_LOAD( "147-pal_ampal16l8pc.u51", 0x0000, 0x0104, CRC(4c98193f) SHA1(b6bdb6eef0d962a3aa4df0e23a8937a7e3210062) ) ROM_END ROM_START( drhla ) From 8cfc62f24d0b8f6f4c3a727e2c2546f9467a773d Mon Sep 17 00:00:00 2001 From: Dirk Best Date: Tue, 14 Jan 2025 21:29:20 +0100 Subject: [PATCH 23/80] ci-linux.yml: Add libfontconfig-dev in preparation for ubuntu 24.04 --- .github/workflows/ci-linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index ab8601406dde1..eecc258d3bfeb 100644 --- a/.github/workflows/ci-linux.yml +++ b/.github/workflows/ci-linux.yml @@ -48,7 +48,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y libsdl2-dev libsdl2-ttf-dev libasound2-dev libxinerama-dev libxi-dev qtbase5-dev qtbase5-dev-tools + sudo apt-get install -y libsdl2-dev libsdl2-ttf-dev libfontconfig-dev libasound2-dev libxinerama-dev libxi-dev qtbase5-dev qtbase5-dev-tools - name: Install clang if: matrix.compiler == 'clang' run: sudo apt-get install -y clang From 26d8e47c002f7aa0efd2a6db56a5f48108e1c79c Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Thu, 16 Jan 2025 06:24:11 +1100 Subject: [PATCH 24/80] DRC cleanup and minor optimisation: [Windy Fairy, Vas Crabb] * Build all native back-ends if any native back-end is enabled so errors caused by changing interfaces can be found faster. * cpu/drcbeut.cpp: Moved resolved member function stuff to a place where it can be shared by back-ends. * cpu/drcbearm64.cpp: Use ubfx instruction to extract unordered flag. * cpu/drcbearm64.cpp, cpu/drcbex64.cpp: Bypass trampolines when calling get map variable value and debugger instruction hook functions. * cpu/drcbearm64.cpp: Moved some internal helpers that don't need to be members to anonymous namespace. * cpu/drcbearm64.cpp: Added a comment with some info to help when debugging generated code. * cpu/drcbec.cpp: Put code in the drc namespace. --- scripts/src/3rdparty.lua | 7 - scripts/src/cpu.lua | 21 +- src/devices/cpu/drcbearm64.cpp | 531 ++++++++++++++++++--------------- src/devices/cpu/drcbearm64.h | 45 +-- src/devices/cpu/drcbec.cpp | 4 + src/devices/cpu/drcbec.h | 4 + src/devices/cpu/drcbeut.cpp | 61 +++- src/devices/cpu/drcbeut.h | 77 ++++- src/devices/cpu/drcbex64.cpp | 94 +++--- src/devices/cpu/drcbex64.h | 29 +- 10 files changed, 469 insertions(+), 404 deletions(-) diff --git a/scripts/src/3rdparty.lua b/scripts/src/3rdparty.lua index 785daa4a93b34..492f01faabe03 100755 --- a/scripts/src/3rdparty.lua +++ b/scripts/src/3rdparty.lua @@ -1959,13 +1959,6 @@ project "asmjit" end end - if (_OPTIONS["PLATFORM"]=="arm64") then - configuration { } - defines { - "ASMJIT_NO_X86", - } - end - files { MAME_DIR .. "3rdparty/asmjit/src/asmjit/a64.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/arm.h", diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index 8d115a91ed06e..f65aaf725becd 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -42,19 +42,14 @@ if (CPU_INCLUDE_DRC) then MAME_DIR .. "src/devices/cpu/drcumlsh.h", } if not _OPTIONS["FORCE_DRC_C_BACKEND"] then - if (_OPTIONS["PLATFORM"]=="arm64") then - files { - MAME_DIR .. "src/devices/cpu/drcbearm64.cpp", - MAME_DIR .. "src/devices/cpu/drcbearm64.h", - } - else - files { - MAME_DIR .. "src/devices/cpu/drcbex64.cpp", - MAME_DIR .. "src/devices/cpu/drcbex64.h", - MAME_DIR .. "src/devices/cpu/drcbex86.cpp", - MAME_DIR .. "src/devices/cpu/drcbex86.h", - } - end + files { + MAME_DIR .. "src/devices/cpu/drcbearm64.cpp", + MAME_DIR .. "src/devices/cpu/drcbearm64.h", + MAME_DIR .. "src/devices/cpu/drcbex64.cpp", + MAME_DIR .. "src/devices/cpu/drcbex64.h", + MAME_DIR .. "src/devices/cpu/drcbex86.cpp", + MAME_DIR .. "src/devices/cpu/drcbex86.h", + } end if _OPTIONS["targetos"]=="macosx" and _OPTIONS["gcc"]~=nil then diff --git a/src/devices/cpu/drcbearm64.cpp b/src/devices/cpu/drcbearm64.cpp index b9851e3bf705f..710023644613e 100644 --- a/src/devices/cpu/drcbearm64.cpp +++ b/src/devices/cpu/drcbearm64.cpp @@ -1,5 +1,76 @@ // license:BSD-3-Clause // copyright-holders:windyfairy +/*************************************************************************** + +Register use: + +r0 first function parameter/return value +r1 second function parameter +r2 third function parameter +r3 fourth function parameter +r4 +r5 +r6 +r7 +r8 +r9 temporary for intermediate values +r10 temporary for intermediate values +r11 temporary for intermediate values +r12 scratch register used by helper functions +r13 scratch register used by helper functions +r14 scratch register used for address calculation +r15 temporary used in opcode functions +r16 +r17 +r18 +r19 UML register I0 +r20 UML register I1 +r21 UML register I2 +r22 UML register I3 +r23 UML register I4 +r24 UML register I5 +r35 UML register I6 +r26 UML register I7 +r27 near cache pointer +r28 emulated flags +r29 base generated code frame pointer +r30 link register +sp stack pointer + + +Stack layout in top-level generated code frame: + +FP -> SP + 0x00 previous FP + SP + 0x08 top-level return address + SP + 0x10 saved non-volatile registers + SP + 0x18 ... + +Stack layout in nested generated code subroutine call frame: + +SP -> SP + 0x00 previous FP + SP + 0x08 return address + ... + FP - 0x10 previous FP + FP - 0x08 return address +FP -> FP + 0x00 previous FP + FP + 0x08 top-level return address + +The frame pointer (FP or x29) is only updated by the top-level generated +code entry point. Generated code subroutines (called using CALLH, EXH or +on a failed HASHJMP) push FP and LR onto the stack but do not update FP. +All the saved FP values will be identical. + +A native debugger following the FP chain will see any number of nested +generated code subroutine call frames as a single stack frame. The return +addresses and duplicate saved FP values for the generated code subroutine +calls will appear as the local variable area of the frame. + +You can calculate the generated code subroutine call depth as +(FP - SP) / 0x10. You can see the return addresses for the generated code +subroutine calls at SP + 0x08, SP + 0x18, SP + 0x28, etc. until reaching +the location FP points to. + +***************************************************************************/ #include "emu.h" #include "drcbearm64.h" @@ -8,8 +79,6 @@ #include "emuopts.h" #include "uml.h" -#include "mfpresolve.h" - #include @@ -44,12 +113,12 @@ const a64::Gp TEMP_REG3 = a64::x11; const a64::Gp SCRATCH_REG1 = a64::x12; const a64::Gp SCRATCH_REG2 = a64::x13; -// Only to be used in an opcode level function. Should not be used in helper functions -const a64::Gp FUNC_SCRATCH_REG = a64::x15; - // Temporary memory calculation register, should not be used outside of functions that calculate memory addresses const a64::Gp MEM_SCRATCH_REG = a64::x14; +// Only to be used in an opcode level function. Should not be used in helper functions +const a64::Gp FUNC_SCRATCH_REG = a64::x15; + const a64::Vec TEMPF_REG1 = a64::d16; const a64::Vec TEMPF_REG2 = a64::d17; const a64::Vec TEMPF_REG3 = a64::d18; @@ -124,6 +193,111 @@ class ThrowableErrorHandler : public ErrorHandler } }; + +// helper functions + +a64::Vec select_register(a64::Vec const ®, uint32_t regsize) +{ + if (regsize == 4) + return reg.s(); + return reg.d(); +} + +a64::Gp select_register(a64::Gp const ®, uint32_t regsize) +{ + if (regsize == 4) + return reg.w(); + return reg.x(); +} + +bool is_valid_immediate_mask(uint64_t val, size_t bytes) +{ + // all zeros and all ones aren't allowed, and disallow any value with bits outside of the max bit range + if (val == 0 || val == make_bitmask(bytes * 8)) + return false; + + uint32_t head = 64 - count_leading_zeros_64(val); + if (head >= (bytes * 8)) + return false; + + uint32_t tail = 0; + while (tail < head) + { + if (BIT(val, tail)) + break; + tail++; + } + + return population_count_64(val) == head - tail; +} + +bool is_valid_immediate(uint64_t val, size_t bits) +{ + assert(bits < 64); + return val < (uint64_t(1) << bits); +} + +bool is_valid_immediate_signed(int64_t val, size_t bits) +{ + return util::sext(val, bits) == val; +} + +bool emit_add_optimized(a64::Assembler &a, const a64::Gp &dst, const a64::Gp &src, int64_t val) +{ + // If the bottom 12 bits are 0s then an optimized form can be used if the remaining bits are <= 12 + if (is_valid_immediate(val, 12) || ((val & 0xfff) == 0 && is_valid_immediate(val >> 12, 12))) + { + a.add(dst, src, val); + return true; + } + + return false; +} + +bool emit_sub_optimized(a64::Assembler &a, const a64::Gp &dst, const a64::Gp &src, int64_t val) +{ + if (val < 0) + val = -val; + + // If the bottom 12 bits are 0s then an optimized form can be used if the remaining bits are <= 12 + if (is_valid_immediate(val, 12) || ((val & 0xfff) == 0 && is_valid_immediate(val >> 12, 12))) + { + a.sub(dst, src, val); + return true; + } + + return false; +} + +arm::Mem get_mem_absolute(a64::Assembler &a, const void *ptr) +{ + const uint64_t codeoffs = a.code()->baseAddress() + a.offset(); + const int64_t reloffs = codeoffs - (int64_t)ptr; + if (is_valid_immediate_signed(reloffs, 21)) + { + a.adr(MEM_SCRATCH_REG, ptr); + return arm::Mem(MEM_SCRATCH_REG); + } + + const uint64_t pagebase = codeoffs & ~make_bitmask(12); + const int64_t pagerel = (int64_t)ptr - pagebase; + if (is_valid_immediate_signed(pagerel, 33)) + { + const uint64_t targetpage = (uint64_t)ptr & ~make_bitmask(12); + const uint64_t pageoffs = (uint64_t)ptr & util::make_bitmask(12); + + a.adrp(MEM_SCRATCH_REG, targetpage); + + if (is_valid_immediate_signed(pageoffs, 9)) + return arm::Mem(MEM_SCRATCH_REG, pageoffs); + else if (emit_add_optimized(a, MEM_SCRATCH_REG, MEM_SCRATCH_REG, pageoffs)) + return arm::Mem(MEM_SCRATCH_REG); + } + + a.mov(MEM_SCRATCH_REG, ptr); + return arm::Mem(MEM_SCRATCH_REG); +} + } // anonymous namespace @@ -161,67 +335,67 @@ const drcbe_arm64::opcode_table_entry drcbe_arm64::s_opcode_table_source[] = { uml::OP_RESTORE, &drcbe_arm64::op_restore }, // RESTORE dst // Integer Operations - { uml::OP_LOAD, &drcbe_arm64::op_load }, // LOAD dst,base,index,size - { uml::OP_LOADS, &drcbe_arm64::op_loads }, // LOADS dst,base,index,size - { uml::OP_STORE, &drcbe_arm64::op_store }, // STORE base,index,src,size - { uml::OP_READ, &drcbe_arm64::op_read }, // READ dst,src1,spacesize - { uml::OP_READM, &drcbe_arm64::op_readm }, // READM dst,src1,mask,spacesize - { uml::OP_WRITE, &drcbe_arm64::op_write }, // WRITE dst,src1,spacesize - { uml::OP_WRITEM, &drcbe_arm64::op_writem }, // WRITEM dst,src1,spacesize - { uml::OP_CARRY, &drcbe_arm64::op_carry }, // CARRY src,bitnum - { uml::OP_SET, &drcbe_arm64::op_set }, // SET dst,c - { uml::OP_MOV, &drcbe_arm64::op_mov }, // MOV dst,src[,c] - { uml::OP_SEXT, &drcbe_arm64::op_sext }, // SEXT dst,src - { uml::OP_ROLAND, &drcbe_arm64::op_roland }, // ROLAND dst,src1,src2,src3 - { uml::OP_ROLINS, &drcbe_arm64::op_rolins }, // ROLINS dst,src1,src2,src3 - { uml::OP_ADD, &drcbe_arm64::op_add }, // ADD dst,src1,src2[,f] - { uml::OP_ADDC, &drcbe_arm64::op_add }, // ADDC dst,src1,src2[,f] - { uml::OP_SUB, &drcbe_arm64::op_sub }, // SUB dst,src1,src2[,f] - { uml::OP_SUBB, &drcbe_arm64::op_sub }, // SUBB dst,src1,src2[,f] - { uml::OP_CMP, &drcbe_arm64::op_cmp }, // CMP src1,src2[,f] - { uml::OP_MULU, &drcbe_arm64::op_mulu }, // MULU dst,edst,src1,src2[,f] - { uml::OP_MULULW, &drcbe_arm64::op_mululw }, // MULULW dst,src1,src2[,f] - { uml::OP_MULS, &drcbe_arm64::op_muls }, // MULS dst,edst,src1,src2[,f] - { uml::OP_MULSLW, &drcbe_arm64::op_mulslw }, // MULSLW dst,src1,src2[,f] - { uml::OP_DIVU, &drcbe_arm64::op_div }, // DIVU dst,edst,src1,src2[,f] - { uml::OP_DIVS, &drcbe_arm64::op_div }, // DIVS dst,edst,src1,src2[,f] - { uml::OP_AND, &drcbe_arm64::op_and }, // AND dst,src1,src2[,f] - { uml::OP_TEST, &drcbe_arm64::op_test }, // TEST src1,src2[,f] - { uml::OP_OR, &drcbe_arm64::op_or }, // OR dst,src1,src2[,f] - { uml::OP_XOR, &drcbe_arm64::op_xor }, // XOR dst,src1,src2[,f] - { uml::OP_LZCNT, &drcbe_arm64::op_lzcnt }, // LZCNT dst,src[,f] - { uml::OP_TZCNT, &drcbe_arm64::op_tzcnt }, // TZCNT dst,src[,f] - { uml::OP_BSWAP, &drcbe_arm64::op_bswap }, // BSWAP dst,src - { uml::OP_SHL, &drcbe_arm64::op_shift }, // SHL dst,src,count[,f] - { uml::OP_SHR, &drcbe_arm64::op_shift }, // SHR dst,src,count[,f] - { uml::OP_SAR, &drcbe_arm64::op_shift }, // SAR dst,src,count[,f] - { uml::OP_ROL, &drcbe_arm64::op_rol }, // ROL dst,src,count[,f] - { uml::OP_ROLC, &drcbe_arm64::op_rolc }, // ROLC dst,src,count[,f] + { uml::OP_LOAD, &drcbe_arm64::op_load }, // LOAD dst,base,index,size + { uml::OP_LOADS, &drcbe_arm64::op_loads }, // LOADS dst,base,index,size + { uml::OP_STORE, &drcbe_arm64::op_store }, // STORE base,index,src,size + { uml::OP_READ, &drcbe_arm64::op_read }, // READ dst,src1,spacesize + { uml::OP_READM, &drcbe_arm64::op_readm }, // READM dst,src1,mask,spacesize + { uml::OP_WRITE, &drcbe_arm64::op_write }, // WRITE dst,src1,spacesize + { uml::OP_WRITEM, &drcbe_arm64::op_writem }, // WRITEM dst,src1,spacesize + { uml::OP_CARRY, &drcbe_arm64::op_carry }, // CARRY src,bitnum + { uml::OP_SET, &drcbe_arm64::op_set }, // SET dst,c + { uml::OP_MOV, &drcbe_arm64::op_mov }, // MOV dst,src[,c] + { uml::OP_SEXT, &drcbe_arm64::op_sext }, // SEXT dst,src + { uml::OP_ROLAND, &drcbe_arm64::op_roland }, // ROLAND dst,src1,src2,src3 + { uml::OP_ROLINS, &drcbe_arm64::op_rolins }, // ROLINS dst,src1,src2,src3 + { uml::OP_ADD, &drcbe_arm64::op_add }, // ADD dst,src1,src2[,f] + { uml::OP_ADDC, &drcbe_arm64::op_add }, // ADDC dst,src1,src2[,f] + { uml::OP_SUB, &drcbe_arm64::op_sub }, // SUB dst,src1,src2[,f] + { uml::OP_SUBB, &drcbe_arm64::op_sub }, // SUBB dst,src1,src2[,f] + { uml::OP_CMP, &drcbe_arm64::op_cmp }, // CMP src1,src2[,f] + { uml::OP_MULU, &drcbe_arm64::op_mulu }, // MULU dst,edst,src1,src2[,f] + { uml::OP_MULULW, &drcbe_arm64::op_mululw }, // MULULW dst,src1,src2[,f] + { uml::OP_MULS, &drcbe_arm64::op_muls }, // MULS dst,edst,src1,src2[,f] + { uml::OP_MULSLW, &drcbe_arm64::op_mulslw }, // MULSLW dst,src1,src2[,f] + { uml::OP_DIVU, &drcbe_arm64::op_div }, // DIVU dst,edst,src1,src2[,f] + { uml::OP_DIVS, &drcbe_arm64::op_div }, // DIVS dst,edst,src1,src2[,f] + { uml::OP_AND, &drcbe_arm64::op_and }, // AND dst,src1,src2[,f] + { uml::OP_TEST, &drcbe_arm64::op_test }, // TEST src1,src2[,f] + { uml::OP_OR, &drcbe_arm64::op_or }, // OR dst,src1,src2[,f] + { uml::OP_XOR, &drcbe_arm64::op_xor }, // XOR dst,src1,src2[,f] + { uml::OP_LZCNT, &drcbe_arm64::op_lzcnt }, // LZCNT dst,src[,f] + { uml::OP_TZCNT, &drcbe_arm64::op_tzcnt }, // TZCNT dst,src[,f] + { uml::OP_BSWAP, &drcbe_arm64::op_bswap }, // BSWAP dst,src + { uml::OP_SHL, &drcbe_arm64::op_shift }, // SHL dst,src,count[,f] + { uml::OP_SHR, &drcbe_arm64::op_shift }, // SHR dst,src,count[,f] + { uml::OP_SAR, &drcbe_arm64::op_shift }, // SAR dst,src,count[,f] + { uml::OP_ROL, &drcbe_arm64::op_rol }, // ROL dst,src,count[,f] + { uml::OP_ROLC, &drcbe_arm64::op_rolc }, // ROLC dst,src,count[,f] { uml::OP_ROR, &drcbe_arm64::op_shift }, // ROR dst,src,count[,f] - { uml::OP_RORC, &drcbe_arm64::op_rorc }, // RORC dst,src,count[,f] + { uml::OP_RORC, &drcbe_arm64::op_rorc }, // RORC dst,src,count[,f] // Floating Point Operations - { uml::OP_FLOAD, &drcbe_arm64::op_fload }, // FLOAD dst,base,index - { uml::OP_FSTORE, &drcbe_arm64::op_fstore }, // FSTORE base,index,src - { uml::OP_FREAD, &drcbe_arm64::op_fread }, // FREAD dst,space,src1 - { uml::OP_FWRITE, &drcbe_arm64::op_fwrite }, // FWRITE space,dst,src1 - { uml::OP_FMOV, &drcbe_arm64::op_fmov }, // FMOV dst,src1[,c] - { uml::OP_FTOINT, &drcbe_arm64::op_ftoint }, // FTOINT dst,src1,size,round - { uml::OP_FFRINT, &drcbe_arm64::op_ffrint }, // FFRINT dst,src1,size - { uml::OP_FFRFLT, &drcbe_arm64::op_ffrflt }, // FFRFLT dst,src1,size - { uml::OP_FRNDS, &drcbe_arm64::op_frnds }, // FRNDS dst,src1 - { uml::OP_FADD, &drcbe_arm64::op_float_alu }, // FADD dst,src1,src2 - { uml::OP_FSUB, &drcbe_arm64::op_float_alu }, // FSUB dst,src1,src2 - { uml::OP_FCMP, &drcbe_arm64::op_fcmp }, // FCMP src1,src2 - { uml::OP_FMUL, &drcbe_arm64::op_float_alu }, // FMUL dst,src1,src2 - { uml::OP_FDIV, &drcbe_arm64::op_float_alu }, // FDIV dst,src1,src2 - { uml::OP_FNEG, &drcbe_arm64::op_float_alu2 }, // FNEG dst,src1 - { uml::OP_FABS, &drcbe_arm64::op_float_alu2 }, // FABS dst,src1 - { uml::OP_FSQRT, &drcbe_arm64::op_float_alu2 }, // FSQRT dst,src1 - { uml::OP_FRECIP, &drcbe_arm64::op_float_alu2 }, // FRECIP dst,src1 - { uml::OP_FRSQRT, &drcbe_arm64::op_float_alu2 }, // FRSQRT dst,src1 - { uml::OP_FCOPYI, &drcbe_arm64::op_fcopyi }, // FCOPYI dst,src - { uml::OP_ICOPYF, &drcbe_arm64::op_icopyf } // ICOPYF dst,src + { uml::OP_FLOAD, &drcbe_arm64::op_fload }, // FLOAD dst,base,index + { uml::OP_FSTORE, &drcbe_arm64::op_fstore }, // FSTORE base,index,src + { uml::OP_FREAD, &drcbe_arm64::op_fread }, // FREAD dst,space,src1 + { uml::OP_FWRITE, &drcbe_arm64::op_fwrite }, // FWRITE space,dst,src1 + { uml::OP_FMOV, &drcbe_arm64::op_fmov }, // FMOV dst,src1[,c] + { uml::OP_FTOINT, &drcbe_arm64::op_ftoint }, // FTOINT dst,src1,size,round + { uml::OP_FFRINT, &drcbe_arm64::op_ffrint }, // FFRINT dst,src1,size + { uml::OP_FFRFLT, &drcbe_arm64::op_ffrflt }, // FFRFLT dst,src1,size + { uml::OP_FRNDS, &drcbe_arm64::op_frnds }, // FRNDS dst,src1 + { uml::OP_FADD, &drcbe_arm64::op_float_alu }, // FADD dst,src1,src2 + { uml::OP_FSUB, &drcbe_arm64::op_float_alu }, // FSUB dst,src1,src2 + { uml::OP_FCMP, &drcbe_arm64::op_fcmp }, // FCMP src1,src2 + { uml::OP_FMUL, &drcbe_arm64::op_float_alu }, // FMUL dst,src1,src2 + { uml::OP_FDIV, &drcbe_arm64::op_float_alu }, // FDIV dst,src1,src2 + { uml::OP_FNEG, &drcbe_arm64::op_float_alu2 }, // FNEG dst,src1 + { uml::OP_FABS, &drcbe_arm64::op_float_alu2 }, // FABS dst,src1 + { uml::OP_FSQRT, &drcbe_arm64::op_float_alu2 }, // FSQRT dst,src1 + { uml::OP_FRECIP, &drcbe_arm64::op_float_alu2 }, // FRECIP dst,src1 + { uml::OP_FRSQRT, &drcbe_arm64::op_float_alu2 }, // FRSQRT dst,src1 + { uml::OP_FCOPYI, &drcbe_arm64::op_fcopyi }, // FCOPYI dst,src + { uml::OP_ICOPYF, &drcbe_arm64::op_icopyf } // ICOPYF dst,src }; drcbe_arm64::be_parameter::be_parameter(drcbe_arm64 &drcbe, const parameter ¶m, uint32_t allowed) @@ -300,108 +474,6 @@ a64::Gp drcbe_arm64::be_parameter::select_register(a64::Gp const ®, uint32_t return reg.x(); } -a64::Vec drcbe_arm64::select_register(a64::Vec const ®, uint32_t regsize) const -{ - if (regsize == 4) - return reg.s(); - return reg.d(); -} - -a64::Gp drcbe_arm64::select_register(a64::Gp const ®, uint32_t regsize) const -{ - if (regsize == 4) - return reg.w(); - return reg.x(); -} - -bool drcbe_arm64::is_valid_immediate_mask(uint64_t val, size_t bytes) -{ - // all zeros and all ones aren't allowed, and disallow any value with bits outside of the max bit range - if (val == 0 || val == make_bitmask(bytes * 8)) - return false; - - uint32_t head = 64 - count_leading_zeros_64(val); - if (head >= (bytes * 8)) - return false; - - uint32_t tail = 0; - while (tail < head) - { - if (BIT(val, tail)) - break; - tail++; - } - - return population_count_64(val) == head - tail; -} - -bool drcbe_arm64::is_valid_immediate(uint64_t val, size_t bits) -{ - assert(bits < 64); - return val < (uint64_t(1) << bits); -} - -bool drcbe_arm64::is_valid_immediate_signed(int64_t val, size_t bits) -{ - return util::sext(val, bits) == val; -} - -arm::Mem drcbe_arm64::get_mem_absolute(a64::Assembler &a, const void *ptr) const -{ - const uint64_t codeoffs = a.code()->baseAddress() + a.offset(); - const int64_t reloffs = codeoffs - (int64_t)ptr; - if (is_valid_immediate_signed(reloffs, 21)) - { - a.adr(MEM_SCRATCH_REG, ptr); - return arm::Mem(MEM_SCRATCH_REG); - } - - const uint64_t pagebase = codeoffs & ~make_bitmask(12); - const int64_t pagerel = (int64_t)ptr - pagebase; - if (is_valid_immediate_signed(pagerel, 33)) - { - const uint64_t targetpage = (uint64_t)ptr & ~make_bitmask(12); - const uint64_t pageoffs = (uint64_t)ptr & util::make_bitmask(12); - - a.adrp(MEM_SCRATCH_REG, targetpage); - - if (is_valid_immediate_signed(pageoffs, 9)) - return arm::Mem(MEM_SCRATCH_REG, pageoffs); - else if (emit_add_optimized(a, MEM_SCRATCH_REG, MEM_SCRATCH_REG, pageoffs)) - return arm::Mem(MEM_SCRATCH_REG); - } - - a.mov(MEM_SCRATCH_REG, ptr); - return arm::Mem(MEM_SCRATCH_REG); -} - -bool drcbe_arm64::emit_add_optimized(a64::Assembler &a, const a64::Gp &dst, const a64::Gp &src, int64_t val) const -{ - // If the bottom 12 bits are 0s then an optimized form can be used if the remaining bits are <= 12 - if (is_valid_immediate(val, 12) || ((val & 0xfff) == 0 && is_valid_immediate(val >> 12, 12))) - { - a.add(dst, src, val); - return true; - } - - return false; -} - -bool drcbe_arm64::emit_sub_optimized(a64::Assembler &a, const a64::Gp &dst, const a64::Gp &src, int64_t val) const -{ - if (val < 0) - val = -val; - - // If the bottom 12 bits are 0s then an optimized form can be used if the remaining bits are <= 12 - if (is_valid_immediate(val, 12) || ((val & 0xfff) == 0 && is_valid_immediate(val >> 12, 12))) - { - a.sub(dst, src, val); - return true; - } - - return false; -} - void drcbe_arm64::get_imm_relative(a64::Assembler &a, const a64::Gp ®, const uint64_t ptr) const { // If a value can be expressed relative to the base register then it's worth using it instead of a mov @@ -765,7 +837,7 @@ void drcbe_arm64::store_unordered(a64::Assembler &a) const void drcbe_arm64::get_unordered(a64::Assembler &a, const a64::Gp ®) const { - get_shifted_bit(a, reg.x(), FLAGS_REG, 1, 4); + a.ubfx(reg.x(), FLAGS_REG, 4, 1); } void drcbe_arm64::store_carry_reg(a64::Assembler &a, const a64::Gp ®) const @@ -802,12 +874,6 @@ void drcbe_arm64::load_carry(a64::Assembler &a, bool inverted) const a.msr(a64::Predicate::SysReg::kNZCV, SCRATCH_REG1); } -void drcbe_arm64::get_shifted_bit(a64::Assembler &a, const a64::Gp &dst, const a64::Gp &src, uint32_t bits, uint32_t shift) const -{ - a.lsr(dst.x(), src.x(), shift); - a.and_(dst.x(), dst.x(), bits); -} - void drcbe_arm64::calculate_carry_shift_left(a64::Assembler &a, const a64::Gp ®, const a64::Gp &shift, int maxBits) const { Label calc = a.newLabel(); @@ -890,11 +956,6 @@ drcbe_arm64::drcbe_arm64(drcuml_state &drcuml, device_t &device, drc_cache &cach , m_baseptr(cache.near() + 0x80) , m_near(*(near_state *)cache.alloc_near(sizeof(m_near))) { - // get pointers to C functions we need to call - using debugger_hook_func = void (*)(device_debug *, offs_t); - static const debugger_hook_func debugger_inst_hook = [] (device_debug *dbg, offs_t pc) { dbg->instruction_hook(pc); }; - m_near.debug_cpu_instruction_hook = (uint8_t *)debugger_inst_hook; - m_near.drcmap_get_value = (uint8_t *)&drc_map_variables::static_get_value; m_near.emulated_flags = 0; // build the opcode table (static but it doesn't hurt to regenerate it) @@ -907,38 +968,18 @@ drcbe_arm64::drcbe_arm64(drcuml_state &drcuml, device_t &device, drc_cache &cach m_log_asmjit = fopen(std::string("drcbearm64_asmjit_").append(device.shortname()).append(".asm").c_str(), "w"); } - // resolve the actual addresses of the address space handlers - auto const resolve_accessor = - [] (resolved_handler &handler, address_space &space, auto accessor) - { - auto const [entrypoint, adjusted] = util::resolve_member_function(accessor, space); - handler.func = reinterpret_cast(entrypoint); - handler.obj = adjusted; - }; - + // resolve the actual addresses of member functions we need to call + m_drcmap_get_value.set(m_map, &drc_map_variables::get_value); + if (!m_drcmap_get_value) + { + m_drcmap_get_value.obj = uintptr_t(&m_map); + m_drcmap_get_value.func = reinterpret_cast(uintptr_t(&drc_map_variables::static_get_value)); + } m_resolved_accessors.resize(m_space.size()); for (int space = 0; m_space.size() > space; ++space) { if (m_space[space]) - { - resolve_accessor(m_resolved_accessors[space].read_byte, *m_space[space], static_cast(&address_space::read_byte)); - resolve_accessor(m_resolved_accessors[space].read_byte_masked, *m_space[space], static_cast(&address_space::read_byte)); - resolve_accessor(m_resolved_accessors[space].read_word, *m_space[space], static_cast(&address_space::read_word)); - resolve_accessor(m_resolved_accessors[space].read_word_masked, *m_space[space], static_cast(&address_space::read_word)); - resolve_accessor(m_resolved_accessors[space].read_dword, *m_space[space], static_cast(&address_space::read_dword)); - resolve_accessor(m_resolved_accessors[space].read_dword_masked, *m_space[space], static_cast(&address_space::read_dword)); - resolve_accessor(m_resolved_accessors[space].read_qword, *m_space[space], static_cast(&address_space::read_qword)); - resolve_accessor(m_resolved_accessors[space].read_qword_masked, *m_space[space], static_cast(&address_space::read_qword)); - - resolve_accessor(m_resolved_accessors[space].write_byte, *m_space[space], static_cast(&address_space::write_byte)); - resolve_accessor(m_resolved_accessors[space].write_byte_masked, *m_space[space], static_cast(&address_space::write_byte)); - resolve_accessor(m_resolved_accessors[space].write_word, *m_space[space], static_cast(&address_space::write_word)); - resolve_accessor(m_resolved_accessors[space].write_word_masked, *m_space[space], static_cast(&address_space::write_word)); - resolve_accessor(m_resolved_accessors[space].write_dword, *m_space[space], static_cast(&address_space::write_dword)); - resolve_accessor(m_resolved_accessors[space].write_dword_masked, *m_space[space], static_cast(&address_space::write_dword)); - resolve_accessor(m_resolved_accessors[space].write_qword, *m_space[space], static_cast(&address_space::write_qword)); - resolve_accessor(m_resolved_accessors[space].write_qword_masked, *m_space[space], static_cast(&address_space::write_qword)); - } + m_resolved_accessors[space].set(*m_space[space]); } } @@ -1048,6 +1089,19 @@ int drcbe_arm64::execute(code_handle &entry) void drcbe_arm64::generate(drcuml_block &block, const instruction *instlist, uint32_t numinst) { + // do this here because device.debug() isn't initialised at construction time + if (!m_debug_cpu_instruction_hook && (m_device.machine().debug_flags & DEBUG_FLAG_ENABLED)) + { + m_debug_cpu_instruction_hook.set(*m_device.debug(), &device_debug::instruction_hook); + if (!m_debug_cpu_instruction_hook) + { + m_debug_cpu_instruction_hook.obj = uintptr_t(m_device.debug()); + using debugger_hook_func = void (*)(device_debug *, offs_t); + static const auto debugger_inst_hook = [] (device_debug *dbg, offs_t pc) { dbg->instruction_hook(pc); }; + m_debug_cpu_instruction_hook.func = reinterpret_cast(uintptr_t(debugger_hook_func(debugger_inst_hook))); + } + } + // tell all of our utility objects that a block is beginning m_hash.block_begin(block, instlist, numinst); m_map.block_begin(block); @@ -1233,11 +1287,10 @@ void drcbe_arm64::op_debug(a64::Assembler &a, const uml::instruction &inst) emit_ldr_mem(a, temp, &m_device.machine().debug_flags); a.tbz(temp, 1, skip); // DEBUG_FLAG_CALL_HOOK - get_imm_relative(a, REG_PARAM1, (uintptr_t)m_device.debug()); + get_imm_relative(a, REG_PARAM1, m_debug_cpu_instruction_hook.obj); mov_reg_param(a, 4, REG_PARAM2, pcp); - emit_ldr_mem(a, TEMP_REG2, &m_near.debug_cpu_instruction_hook); - a.blr(TEMP_REG2); + call_arm_addr(a, m_debug_cpu_instruction_hook.func); a.bind(skip); } @@ -1556,13 +1609,11 @@ void drcbe_arm64::op_recover(a64::Assembler &a, const uml::instruction &inst) be_parameter dstp(*this, inst.param(0), PTYPE_MR); - get_imm_relative(a, REG_PARAM1, (uintptr_t)&m_map); + get_imm_relative(a, REG_PARAM1, m_drcmap_get_value.obj); a.ldr(REG_PARAM2, arm::Mem(a64::x29, -8)); // saved LR (x30) from first level CALLH/EXH or failed hash jump a.mov(REG_PARAM3, inst.param(1).mapvar()); - emit_ldr_mem(a, TEMP_REG1, &m_near.drcmap_get_value); - - a.blr(TEMP_REG1); + call_arm_addr(a, m_drcmap_get_value.func); mov_param_reg(a, inst.size(), dstp, REG_PARAM1); } @@ -2007,7 +2058,7 @@ void drcbe_arm64::op_read(a64::Assembler &a, const uml::instruction &inst) if (spacesizep.size() == SIZE_BYTE) { - if (resolved.read_byte.func) + if (resolved.read_byte) { get_imm_relative(a, REG_PARAM1, resolved.read_byte.obj); call_arm_addr(a, resolved.read_byte.func); @@ -2021,7 +2072,7 @@ void drcbe_arm64::op_read(a64::Assembler &a, const uml::instruction &inst) } else if (spacesizep.size() == SIZE_WORD) { - if (resolved.read_word.func) + if (resolved.read_word) { get_imm_relative(a, REG_PARAM1, resolved.read_word.obj); call_arm_addr(a, resolved.read_word.func); @@ -2035,7 +2086,7 @@ void drcbe_arm64::op_read(a64::Assembler &a, const uml::instruction &inst) } else if (spacesizep.size() == SIZE_DWORD) { - if (resolved.read_dword.func) + if (resolved.read_dword) { get_imm_relative(a, REG_PARAM1, resolved.read_dword.obj); call_arm_addr(a, resolved.read_dword.func); @@ -2049,7 +2100,7 @@ void drcbe_arm64::op_read(a64::Assembler &a, const uml::instruction &inst) } else if (spacesizep.size() == SIZE_QWORD) { - if (resolved.read_qword.func) + if (resolved.read_qword) { get_imm_relative(a, REG_PARAM1, resolved.read_qword.obj); call_arm_addr(a, resolved.read_qword.func); @@ -2085,7 +2136,7 @@ void drcbe_arm64::op_readm(a64::Assembler &a, const uml::instruction &inst) if (spacesizep.size() == SIZE_BYTE) { - if (resolved.read_byte_masked.func) + if (resolved.read_byte_masked) { get_imm_relative(a, REG_PARAM1, resolved.read_byte_masked.obj); call_arm_addr(a, resolved.read_byte_masked.func); @@ -2099,7 +2150,7 @@ void drcbe_arm64::op_readm(a64::Assembler &a, const uml::instruction &inst) } else if (spacesizep.size() == SIZE_WORD) { - if (resolved.read_word_masked.func) + if (resolved.read_word_masked) { get_imm_relative(a, REG_PARAM1, resolved.read_word_masked.obj); call_arm_addr(a, resolved.read_word_masked.func); @@ -2113,7 +2164,7 @@ void drcbe_arm64::op_readm(a64::Assembler &a, const uml::instruction &inst) } else if (spacesizep.size() == SIZE_DWORD) { - if (resolved.read_dword_masked.func) + if (resolved.read_dword_masked) { get_imm_relative(a, REG_PARAM1, resolved.read_dword_masked.obj); call_arm_addr(a, resolved.read_dword_masked.func); @@ -2127,7 +2178,7 @@ void drcbe_arm64::op_readm(a64::Assembler &a, const uml::instruction &inst) } else if (spacesizep.size() == SIZE_QWORD) { - if (resolved.read_qword_masked.func) + if (resolved.read_qword_masked) { get_imm_relative(a, REG_PARAM1, resolved.read_qword_masked.obj); call_arm_addr(a, resolved.read_qword_masked.func); @@ -2162,7 +2213,7 @@ void drcbe_arm64::op_write(a64::Assembler &a, const uml::instruction &inst) if (spacesizep.size() == SIZE_BYTE) { - if (resolved.write_byte.func) + if (resolved.write_byte) { get_imm_relative(a, REG_PARAM1, resolved.write_byte.obj); call_arm_addr(a, resolved.write_byte.func); @@ -2176,7 +2227,7 @@ void drcbe_arm64::op_write(a64::Assembler &a, const uml::instruction &inst) } else if (spacesizep.size() == SIZE_WORD) { - if (resolved.write_word.func) + if (resolved.write_word) { get_imm_relative(a, REG_PARAM1, resolved.write_word.obj); call_arm_addr(a, resolved.write_word.func); @@ -2190,7 +2241,7 @@ void drcbe_arm64::op_write(a64::Assembler &a, const uml::instruction &inst) } else if (spacesizep.size() == SIZE_DWORD) { - if (resolved.write_dword.func) + if (resolved.write_dword) { get_imm_relative(a, REG_PARAM1, resolved.write_dword.obj); call_arm_addr(a, resolved.write_dword.func); @@ -2204,7 +2255,7 @@ void drcbe_arm64::op_write(a64::Assembler &a, const uml::instruction &inst) } else if (spacesizep.size() == SIZE_QWORD) { - if (resolved.write_qword.func) + if (resolved.write_qword) { get_imm_relative(a, REG_PARAM1, resolved.write_qword.obj); call_arm_addr(a, resolved.write_qword.func); @@ -2240,7 +2291,7 @@ void drcbe_arm64::op_writem(a64::Assembler &a, const uml::instruction &inst) if (spacesizep.size() == SIZE_BYTE) { - if (resolved.write_byte_masked.func) + if (resolved.write_byte_masked) { get_imm_relative(a, REG_PARAM1, resolved.write_byte_masked.obj); call_arm_addr(a, resolved.write_byte_masked.func); @@ -2254,7 +2305,7 @@ void drcbe_arm64::op_writem(a64::Assembler &a, const uml::instruction &inst) } else if (spacesizep.size() == SIZE_WORD) { - if (resolved.write_word_masked.func) + if (resolved.write_word_masked) { get_imm_relative(a, REG_PARAM1, resolved.write_word_masked.obj); call_arm_addr(a, resolved.write_word_masked.func); @@ -2268,7 +2319,7 @@ void drcbe_arm64::op_writem(a64::Assembler &a, const uml::instruction &inst) } else if (spacesizep.size() == SIZE_DWORD) { - if (resolved.write_dword_masked.func) + if (resolved.write_dword_masked) { get_imm_relative(a, REG_PARAM1, resolved.write_dword_masked.obj); call_arm_addr(a, resolved.write_dword_masked.func); @@ -2282,7 +2333,7 @@ void drcbe_arm64::op_writem(a64::Assembler &a, const uml::instruction &inst) } else if (spacesizep.size() == SIZE_QWORD) { - if (resolved.write_qword_masked.func) + if (resolved.write_qword_masked) { get_imm_relative(a, REG_PARAM1, resolved.write_qword_masked.obj); call_arm_addr(a, resolved.write_qword_masked.func); @@ -2676,12 +2727,12 @@ void drcbe_arm64::op_rolins(a64::Assembler &a, const uml::instruction &inst) if (is_right_aligned || is_contiguous) { - uint32_t rot = 0; - uint32_t lsb = 0; - dst = can_use_dst_reg ? dstp.select_register(SCRATCH_REG1, inst.size()) : select_register(SCRATCH_REG1, inst.size()); mov_reg_param(a, inst.size(), dst, dstp); + uint32_t rot = 0; + uint32_t lsb = 0; + if (is_right_aligned) { // Optimize a contiguous right-aligned mask @@ -2707,10 +2758,6 @@ void drcbe_arm64::op_rolins(a64::Assembler &a, const uml::instruction &inst) result = rotr_64(srcp.immediate(), rot); a.mov(src, result); - - a.bfi(dst, src, lsb, pop); - - optimized = true; } else { @@ -2718,11 +2765,11 @@ void drcbe_arm64::op_rolins(a64::Assembler &a, const uml::instruction &inst) if (rot > 0) a.ror(src, src, rot); + } - a.bfi(dst, src, lsb, pop); + a.bfi(dst, src, lsb, pop); - optimized = true; - } + optimized = true; } else if (srcp.is_immediate()) { @@ -3881,7 +3928,7 @@ void drcbe_arm64::op_fread(a64::Assembler &a, const uml::instruction &inst) if (inst.size() == 4) { - if (resolved.read_dword.func) + if (resolved.read_dword) { get_imm_relative(a, REG_PARAM1, resolved.read_dword.obj); call_arm_addr(a, resolved.read_dword.func); @@ -3897,7 +3944,7 @@ void drcbe_arm64::op_fread(a64::Assembler &a, const uml::instruction &inst) } else if (inst.size() == 8) { - if (resolved.read_qword.func) + if (resolved.read_qword) { get_imm_relative(a, REG_PARAM1, resolved.read_qword.obj); call_arm_addr(a, resolved.read_qword.func); @@ -3935,7 +3982,7 @@ void drcbe_arm64::op_fwrite(a64::Assembler &a, const uml::instruction &inst) if (inst.size() == 4) { - if (resolved.write_dword.func) + if (resolved.write_dword) { get_imm_relative(a, REG_PARAM1, resolved.write_dword.obj); call_arm_addr(a, resolved.write_dword.func); @@ -3949,7 +3996,7 @@ void drcbe_arm64::op_fwrite(a64::Assembler &a, const uml::instruction &inst) } else if (inst.size() == 8) { - if (resolved.write_qword.func) + if (resolved.write_qword) { get_imm_relative(a, REG_PARAM1, resolved.write_qword.obj); call_arm_addr(a, resolved.write_qword.func); diff --git a/src/devices/cpu/drcbearm64.h b/src/devices/cpu/drcbearm64.h index 20938f214fe0b..258d2947d3e68 100644 --- a/src/devices/cpu/drcbearm64.h +++ b/src/devices/cpu/drcbearm64.h @@ -167,19 +167,8 @@ class drcbe_arm64 : public drcbe_interface // helper functions - asmjit::a64::Vec select_register(asmjit::a64::Vec const ®, uint32_t regsize) const; - asmjit::a64::Gp select_register(asmjit::a64::Gp const ®, uint32_t regsize) const; - - static bool is_valid_immediate(uint64_t val, size_t bits); - static bool is_valid_immediate_signed(int64_t val, size_t bits); - static bool is_valid_immediate_mask(uint64_t val, size_t bytes); - - asmjit::arm::Mem get_mem_absolute(asmjit::a64::Assembler &a, const void *ptr) const; void get_imm_relative(asmjit::a64::Assembler &a, const asmjit::a64::Gp ®, const uint64_t ptr) const; - bool emit_add_optimized(asmjit::a64::Assembler &a, const asmjit::a64::Gp &dst, const asmjit::a64::Gp &src, int64_t val) const; - bool emit_sub_optimized(asmjit::a64::Assembler &a, const asmjit::a64::Gp &dst, const asmjit::a64::Gp &src, int64_t val) const; - void emit_ldr_str_base_mem(asmjit::a64::Assembler &a, asmjit::a64::Inst::Id opcode, const asmjit::a64::Reg ®, const void *ptr) const; void emit_ldr_mem(asmjit::a64::Assembler &a, const asmjit::a64::Gp ®, const void *ptr) const; void emit_ldrb_mem(asmjit::a64::Assembler &a, const asmjit::a64::Gp ®, const void *ptr) const; @@ -203,8 +192,6 @@ class drcbe_arm64 : public drcbe_interface void get_unordered(asmjit::a64::Assembler &a, const asmjit::a64::Gp ®) const; void check_unordered_condition(asmjit::a64::Assembler &a, uml::condition_t cond, asmjit::Label condition_met, bool not_equal) const; - void get_shifted_bit(asmjit::a64::Assembler &a, const asmjit::a64::Gp &dst, const asmjit::a64::Gp &src, uint32_t bits, uint32_t shift) const; - void calculate_carry_shift_left(asmjit::a64::Assembler &a, const asmjit::a64::Gp ®, const asmjit::a64::Gp &shift, int maxBits) const; void calculate_carry_shift_left_imm(asmjit::a64::Assembler &a, const asmjit::a64::Gp ®, const int shift, int maxBits) const; @@ -238,9 +225,6 @@ class drcbe_arm64 : public drcbe_interface struct near_state { - void *debug_cpu_instruction_hook; - void *drcmap_get_value; - uint32_t emulated_flags; }; near_state &m_near; @@ -254,33 +238,12 @@ class drcbe_arm64 : public drcbe_interface static const opcode_table_entry s_opcode_table_source[]; static opcode_generate_func s_opcode_table[uml::OP_MAX]; - struct resolved_handler { uintptr_t obj = 0; void *func = nullptr; }; - struct resolved_accessors - { - - resolved_handler read_byte; - resolved_handler read_byte_masked; - resolved_handler read_word; - resolved_handler read_word_masked; - resolved_handler read_dword; - resolved_handler read_dword_masked; - resolved_handler read_qword; - resolved_handler read_qword_masked; - - resolved_handler write_byte; - resolved_handler write_byte_masked; - resolved_handler write_word; - resolved_handler write_word_masked; - resolved_handler write_dword; - resolved_handler write_dword_masked; - resolved_handler write_qword; - resolved_handler write_qword_masked; - }; - using resolved_accessors_vector = std::vector; - resolved_accessors_vector m_resolved_accessors; + resolved_member_function m_debug_cpu_instruction_hook; + resolved_member_function m_drcmap_get_value; + resolved_memory_accessors_vector m_resolved_accessors; }; -} +} // namespace drc using drc::drcbe_arm64; diff --git a/src/devices/cpu/drcbec.cpp b/src/devices/cpu/drcbec.cpp index c058d256a1838..8758b1989c739 100644 --- a/src/devices/cpu/drcbec.cpp +++ b/src/devices/cpu/drcbec.cpp @@ -14,6 +14,8 @@ #include +namespace drc { + using namespace uml; @@ -2436,3 +2438,5 @@ uint64_t drcbe_c::tzcount64(uint64_t value) } return 64; } + +} // namespace drc diff --git a/src/devices/cpu/drcbec.h b/src/devices/cpu/drcbec.h index a4bc68b5168bd..6c572fb65b002 100644 --- a/src/devices/cpu/drcbec.h +++ b/src/devices/cpu/drcbec.h @@ -17,6 +17,7 @@ #include "drcbeut.h" +namespace drc { //************************************************************************** // TYPE DEFINITIONS @@ -57,5 +58,8 @@ class drcbe_c : public drcbe_interface static uint64_t s_immediate_zero; }; +} // namespace drc + +using drc::drcbe_c; #endif // MAME_CPU_DRCBEC_H diff --git a/src/devices/cpu/drcbeut.cpp b/src/devices/cpu/drcbeut.cpp index 8ccd8d31fb3f2..3d990d374555e 100644 --- a/src/devices/cpu/drcbeut.cpp +++ b/src/devices/cpu/drcbeut.cpp @@ -11,6 +11,8 @@ #include "emu.h" #include "drcbeut.h" +namespace drc { + using namespace uml; @@ -30,19 +32,19 @@ using namespace uml; // drc_hash_table - constructor //------------------------------------------------- -drc_hash_table::drc_hash_table(drc_cache &cache, uint32_t modes, uint8_t addrbits, uint8_t ignorebits) - : m_cache(cache), - m_modes(modes), - m_nocodeptr(nullptr), - m_l1bits((addrbits - ignorebits) / 2), - m_l2bits((addrbits - ignorebits) - m_l1bits), - m_l1shift(ignorebits + m_l2bits), - m_l2shift(ignorebits), - m_l1mask((1 << m_l1bits) - 1), - m_l2mask((1 << m_l2bits) - 1), - m_base(reinterpret_cast(cache.alloc(modes * sizeof(**m_base)))), - m_emptyl1(nullptr), - m_emptyl2(nullptr) +drc_hash_table::drc_hash_table(drc_cache &cache, uint32_t modes, uint8_t addrbits, uint8_t ignorebits) : + m_cache(cache), + m_modes(modes), + m_nocodeptr(nullptr), + m_l1bits((addrbits - ignorebits) / 2), + m_l2bits((addrbits - ignorebits) - m_l1bits), + m_l1shift(ignorebits + m_l2bits), + m_l2shift(ignorebits), + m_l1mask((1 << m_l1bits) - 1), + m_l2mask((1 << m_l2bits) - 1), + m_base(reinterpret_cast(cache.alloc(modes * sizeof(**m_base)))), + m_emptyl1(nullptr), + m_emptyl2(nullptr) { reset(); } @@ -577,3 +579,36 @@ void drc_label_list::oob_callback(drccodeptr *codeptr, void *param1, void *param label_fixup *fixup = reinterpret_cast(param1); fixup->m_callback(param2, fixup->m_label->m_codeptr); } + + + +//************************************************************************** +// RESOLVED MEMORY ACCESSORS +//************************************************************************** + +//------------------------------------------------- +// set - bind to address space +//------------------------------------------------- + +void resolved_memory_accessors::set(address_space &space) noexcept +{ + read_byte .set(space, static_cast(&address_space::read_byte)); + read_byte_masked .set(space, static_cast(&address_space::read_byte)); + read_word .set(space, static_cast(&address_space::read_word)); + read_word_masked .set(space, static_cast(&address_space::read_word)); + read_dword .set(space, static_cast(&address_space::read_dword)); + read_dword_masked .set(space, static_cast(&address_space::read_dword)); + read_qword .set(space, static_cast(&address_space::read_qword)); + read_qword_masked .set(space, static_cast(&address_space::read_qword)); + + write_byte .set(space, static_cast(&address_space::write_byte)); + write_byte_masked .set(space, static_cast(&address_space::write_byte)); + write_word .set(space, static_cast(&address_space::write_word)); + write_word_masked .set(space, static_cast(&address_space::write_word)); + write_dword .set(space, static_cast(&address_space::write_dword)); + write_dword_masked .set(space, static_cast(&address_space::write_dword)); + write_qword .set(space, static_cast(&address_space::write_qword)); + write_qword_masked .set(space, static_cast(&address_space::write_qword)); +} + +} // namespace drc diff --git a/src/devices/cpu/drcbeut.h b/src/devices/cpu/drcbeut.h index ee398e168f1c3..f020b6b5ef61b 100644 --- a/src/devices/cpu/drcbeut.h +++ b/src/devices/cpu/drcbeut.h @@ -15,6 +15,13 @@ #include "drcuml.h" +#include "mfpresolve.h" + +#include +#include + + +namespace drc { //************************************************************************** // TYPE DEFINITIONS @@ -55,14 +62,14 @@ class drc_hash_table private: // internal state drc_cache & m_cache; // cache where allocations come from - uint32_t m_modes; // number of modes supported + uint32_t m_modes; // number of modes supported drccodeptr m_nocodeptr; // pointer to code which will handle missing entries - uint8_t m_l1bits; // bits worth of entries in l1 hash tables - uint8_t m_l2bits; // bits worth of entries in l2 hash tables - uint8_t m_l1shift; // shift to apply to the PC to get the l1 hash entry - uint8_t m_l2shift; // shift to apply to the PC to get the l2 hash entry + uint8_t m_l1bits; // bits worth of entries in l1 hash tables + uint8_t m_l2bits; // bits worth of entries in l2 hash tables + uint8_t m_l1shift; // shift to apply to the PC to get the l1 hash entry + uint8_t m_l2shift; // shift to apply to the PC to get the l2 hash entry offs_t m_l1mask; // mask to apply after shifting offs_t m_l2mask; // mask to apply after shifting @@ -97,8 +104,8 @@ class drc_map_variables private: // internal state drc_cache & m_cache; // pointer to the cache - uint64_t m_uniquevalue; // unique value used to find the table - uint32_t m_mapvalue[uml::MAPVAR_END - uml::MAPVAR_M0]; // array of current values + uint64_t m_uniquevalue; // unique value used to find the table + uint32_t m_mapvalue[uml::MAPVAR_END - uml::MAPVAR_M0]; // array of current values // list of entries struct map_entry @@ -106,8 +113,8 @@ class drc_map_variables map_entry *next() const { return m_next; } map_entry * m_next; // pointer to next map entry drccodeptr m_codeptr; // pointer to the relevant code - uint32_t m_mapvar; // map variable id - uint32_t m_newval; // value of the variable starting at codeptr + uint32_t m_mapvar; // map variable id + uint32_t m_newval; // value of the variable starting at codeptr }; simple_list m_entry_list; // list of entries }; @@ -163,4 +170,56 @@ class drc_label_list }; +// ======================> resolved_member_function + +struct resolved_member_function +{ + uintptr_t obj = uintptr_t(nullptr); + uint8_t *func = nullptr; + + explicit operator bool() const noexcept + { + return bool(func); + } + + template + void set(C &&instance, F &&mfp) noexcept + { + auto const [entrypoint, adjusted] = util::resolve_member_function(std::forward(mfp), std::forward(instance)); + obj = adjusted; + func = reinterpret_cast(entrypoint); + } +}; + + +// ======================> resolved_memory_accessors + +struct resolved_memory_accessors +{ + resolved_member_function read_byte; + resolved_member_function read_byte_masked; + resolved_member_function read_word; + resolved_member_function read_word_masked; + resolved_member_function read_dword; + resolved_member_function read_dword_masked; + resolved_member_function read_qword; + resolved_member_function read_qword_masked; + + resolved_member_function write_byte; + resolved_member_function write_byte_masked; + resolved_member_function write_word; + resolved_member_function write_word_masked; + resolved_member_function write_dword; + resolved_member_function write_dword_masked; + resolved_member_function write_qword; + resolved_member_function write_qword_masked; + + void set(address_space &space) noexcept; +}; + +using resolved_memory_accessors_vector = std::vector; + +} // namespace drc + + #endif // MAME_CPU_DRCBEUT_H diff --git a/src/devices/cpu/drcbex64.cpp b/src/devices/cpu/drcbex64.cpp index 14f89a35cbd48..b57c48828d189 100644 --- a/src/devices/cpu/drcbex64.cpp +++ b/src/devices/cpu/drcbex64.cpp @@ -172,8 +172,6 @@ #include "debug/debugcpu.h" #include "emuopts.h" -#include "mfpresolve.h" - #include @@ -660,15 +658,11 @@ drcbe_x64::drcbe_x64(drcuml_state &drcuml, device_t &device, drc_cache &cache, u m_absmask64[0] = m_absmask64[1] = 0x7fffffffffffffffU; // get pointers to C functions we need to call - using debugger_hook_func = void (*)(device_debug *, offs_t); - static const debugger_hook_func debugger_inst_hook = [] (device_debug *dbg, offs_t pc) { dbg->instruction_hook(pc); }; // TODO: kill trampoline if possible - m_near.debug_cpu_instruction_hook = (x86code *)debugger_inst_hook; if (LOG_HASHJMPS) { m_near.debug_log_hashjmp = (x86code *)debug_log_hashjmp; m_near.debug_log_hashjmp_fail = (x86code *)debug_log_hashjmp_fail; } - m_near.drcmap_get_value = (x86code *)&drc_map_variables::static_get_value; // build the flags map for (int entry = 0; entry < std::size(m_near.flagsmap); entry++) @@ -692,37 +686,18 @@ drcbe_x64::drcbe_x64(drcuml_state &drcuml, device_t &device, drc_cache &cache, u m_near.flagsunmap[entry] = flags; } - // resolve the actual addresses of the address space handlers - auto const resolve_accessor = - [] (resolved_handler &handler, address_space &space, auto accessor) - { - auto const [entrypoint, adjusted] = util::resolve_member_function(accessor, space); - handler.func = reinterpret_cast(entrypoint); - handler.obj = adjusted; - }; + // resolve the actual addresses of member functions we need to call + m_drcmap_get_value.set(m_map, &drc_map_variables::get_value); + if (!m_drcmap_get_value) + { + m_drcmap_get_value.obj = uintptr_t(&m_map); + m_drcmap_get_value.func = reinterpret_cast(uintptr_t(&drc_map_variables::static_get_value)); + } m_resolved_accessors.resize(m_space.size()); for (int space = 0; m_space.size() > space; ++space) { if (m_space[space]) - { - resolve_accessor(m_resolved_accessors[space].read_byte, *m_space[space], static_cast(&address_space::read_byte)); - resolve_accessor(m_resolved_accessors[space].read_byte_masked, *m_space[space], static_cast(&address_space::read_byte)); - resolve_accessor(m_resolved_accessors[space].read_word, *m_space[space], static_cast(&address_space::read_word)); - resolve_accessor(m_resolved_accessors[space].read_word_masked, *m_space[space], static_cast(&address_space::read_word)); - resolve_accessor(m_resolved_accessors[space].read_dword, *m_space[space], static_cast(&address_space::read_dword)); - resolve_accessor(m_resolved_accessors[space].read_dword_masked, *m_space[space], static_cast(&address_space::read_dword)); - resolve_accessor(m_resolved_accessors[space].read_qword, *m_space[space], static_cast(&address_space::read_qword)); - resolve_accessor(m_resolved_accessors[space].read_qword_masked, *m_space[space], static_cast(&address_space::read_qword)); - - resolve_accessor(m_resolved_accessors[space].write_byte, *m_space[space], static_cast(&address_space::write_byte)); - resolve_accessor(m_resolved_accessors[space].write_byte_masked, *m_space[space], static_cast(&address_space::write_byte)); - resolve_accessor(m_resolved_accessors[space].write_word, *m_space[space], static_cast(&address_space::write_word)); - resolve_accessor(m_resolved_accessors[space].write_word_masked, *m_space[space], static_cast(&address_space::write_word)); - resolve_accessor(m_resolved_accessors[space].write_dword, *m_space[space], static_cast(&address_space::write_dword)); - resolve_accessor(m_resolved_accessors[space].write_dword_masked, *m_space[space], static_cast(&address_space::write_dword)); - resolve_accessor(m_resolved_accessors[space].write_qword, *m_space[space], static_cast(&address_space::write_qword)); - resolve_accessor(m_resolved_accessors[space].write_qword_masked, *m_space[space], static_cast(&address_space::write_qword)); - } + m_resolved_accessors[space].set(*m_space[space]); } // build the opcode table (static but it doesn't hurt to regenerate it) @@ -892,6 +867,19 @@ int drcbe_x64::execute(code_handle &entry) void drcbe_x64::generate(drcuml_block &block, const instruction *instlist, uint32_t numinst) { + // do this here because device.debug() isn't initialised at construction time + if (!m_debug_cpu_instruction_hook && (m_device.machine().debug_flags & DEBUG_FLAG_ENABLED)) + { + m_debug_cpu_instruction_hook.set(*m_device.debug(), &device_debug::instruction_hook); + if (!m_debug_cpu_instruction_hook) + { + m_debug_cpu_instruction_hook.obj = uintptr_t(m_device.debug()); + using debugger_hook_func = void (*)(device_debug *, offs_t); + static const auto debugger_inst_hook = [] (device_debug *dbg, offs_t pc) { dbg->instruction_hook(pc); }; + m_debug_cpu_instruction_hook.func = reinterpret_cast(uintptr_t(debugger_hook_func(debugger_inst_hook))); + } + } + // tell all of our utility objects that a block is beginning m_hash.block_begin(block, instlist, numinst); m_map.block_begin(block); @@ -1556,9 +1544,9 @@ void drcbe_x64::op_debug(Assembler &a, const instruction &inst) a.short_().jz(skip); // push the parameter - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_device.debug()); // mov param1,device.debug + mov_r64_imm(a, Gpq(REG_PARAM1), m_debug_cpu_instruction_hook.obj); // mov param1,device.debug mov_reg_param(a, Gpd(REG_PARAM2), pcp); // mov param2,pcp - smart_call_m64(a, &m_near.debug_cpu_instruction_hook); // call debug_cpu_instruction_hook + smart_call_r64(a, m_debug_cpu_instruction_hook.func, rax); // call debug_cpu_instruction_hook a.bind(skip); } @@ -1861,10 +1849,10 @@ void drcbe_x64::op_recover(Assembler &a, const instruction &inst) // call the recovery code a.mov(rax, MABS(&m_near.stacksave)); // mov rax,stacksave a.mov(rax, ptr(rax, -8)); // mov rax,[rax-8] - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)&m_map); // mov param1,m_map + mov_r64_imm(a, Gpq(REG_PARAM1), m_drcmap_get_value.obj); // mov param1,m_map a.lea(Gpq(REG_PARAM2), ptr(rax, -1)); // lea param2,[rax-1] mov_r64_imm(a, Gpq(REG_PARAM3), inst.param(1).mapvar()); // mov param3,param[1].value - smart_call_m64(a, &m_near.drcmap_get_value); // call drcmap_get_value + smart_call_r64(a, m_drcmap_get_value.func, rax); // call drcmap_get_value mov_param_reg(a, dstp, eax); // mov dstp,eax } @@ -2523,7 +2511,7 @@ void drcbe_x64::op_read(Assembler &a, const instruction &inst) mov_reg_param(a, Gpd(REG_PARAM2), addrp); // mov param2,addrp if (spacesizep.size() == SIZE_BYTE) { - if (resolved.read_byte.func) + if (resolved.read_byte) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_byte.obj); // mov param1,space smart_call_r64(a, resolved.read_byte.func, rax); // call read_byte @@ -2537,7 +2525,7 @@ void drcbe_x64::op_read(Assembler &a, const instruction &inst) } else if (spacesizep.size() == SIZE_WORD) { - if (resolved.read_word.func) + if (resolved.read_word) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_word.obj); // mov param1,space smart_call_r64(a, resolved.read_word.func, rax); // call read_word @@ -2551,7 +2539,7 @@ void drcbe_x64::op_read(Assembler &a, const instruction &inst) } else if (spacesizep.size() == SIZE_DWORD) { - if (resolved.read_dword.func) + if (resolved.read_dword) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_dword.obj); // mov param1,space smart_call_r64(a, resolved.read_dword.func, rax); // call read_dword @@ -2566,7 +2554,7 @@ void drcbe_x64::op_read(Assembler &a, const instruction &inst) } else if (spacesizep.size() == SIZE_QWORD) { - if (resolved.read_qword.func) + if (resolved.read_qword) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_qword.obj); // mov param1,space smart_call_r64(a, resolved.read_qword.func, rax); // call read_qword @@ -2619,7 +2607,7 @@ void drcbe_x64::op_readm(Assembler &a, const instruction &inst) mov_reg_param(a, Gpq(REG_PARAM3), maskp); // mov param3,maskp if (spacesizep.size() == SIZE_BYTE) { - if (resolved.read_byte_masked.func) + if (resolved.read_byte_masked) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_byte_masked.obj); // mov param1,space smart_call_r64(a, resolved.read_byte_masked.func, rax); // call read_byte_masked @@ -2633,7 +2621,7 @@ void drcbe_x64::op_readm(Assembler &a, const instruction &inst) } else if (spacesizep.size() == SIZE_WORD) { - if (resolved.read_word_masked.func) + if (resolved.read_word_masked) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_word_masked.obj); // mov param1,space smart_call_r64(a, resolved.read_word_masked.func, rax); // call read_word_masked @@ -2647,7 +2635,7 @@ void drcbe_x64::op_readm(Assembler &a, const instruction &inst) } else if (spacesizep.size() == SIZE_DWORD) { - if (resolved.read_dword_masked.func) + if (resolved.read_dword_masked) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_dword_masked.obj); // mov param1,space smart_call_r64(a, resolved.read_dword_masked.func, rax); // call read_dword_masked @@ -2662,7 +2650,7 @@ void drcbe_x64::op_readm(Assembler &a, const instruction &inst) } else if (spacesizep.size() == SIZE_QWORD) { - if (resolved.read_qword_masked.func) + if (resolved.read_qword_masked) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_qword_masked.obj); // mov param1,space smart_call_r64(a, resolved.read_qword_masked.func, rax); // call read_qword_masked @@ -2711,7 +2699,7 @@ void drcbe_x64::op_write(Assembler &a, const instruction &inst) mov_reg_param(a, Gpq(REG_PARAM3), srcp); // mov param3,srcp if (spacesizep.size() == SIZE_BYTE) { - if (resolved.write_byte.func) + if (resolved.write_byte) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_byte.obj); // mov param1,space smart_call_r64(a, resolved.write_byte.func, rax); // call write_byte @@ -2724,7 +2712,7 @@ void drcbe_x64::op_write(Assembler &a, const instruction &inst) } else if (spacesizep.size() == SIZE_WORD) { - if (resolved.write_word.func) + if (resolved.write_word) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_word.obj); // mov param1,space smart_call_r64(a, resolved.write_word.func, rax); // call write_word @@ -2737,7 +2725,7 @@ void drcbe_x64::op_write(Assembler &a, const instruction &inst) } else if (spacesizep.size() == SIZE_DWORD) { - if (resolved.write_dword.func) + if (resolved.write_dword) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_dword.obj); // mov param1,space smart_call_r64(a, resolved.write_dword.func, rax); // call write_dword @@ -2750,7 +2738,7 @@ void drcbe_x64::op_write(Assembler &a, const instruction &inst) } else if (spacesizep.size() == SIZE_QWORD) { - if (resolved.write_qword.func) + if (resolved.write_qword) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_qword.obj); // mov param1,space smart_call_r64(a, resolved.write_qword.func, rax); // call write_qword @@ -2798,7 +2786,7 @@ void drcbe_x64::op_writem(Assembler &a, const instruction &inst) } if (spacesizep.size() == SIZE_BYTE) { - if (resolved.write_byte.func) + if (resolved.write_byte) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_byte_masked.obj); // mov param1,space smart_call_r64(a, resolved.write_byte_masked.func, rax); // call write_byte_masked @@ -2811,7 +2799,7 @@ void drcbe_x64::op_writem(Assembler &a, const instruction &inst) } else if (spacesizep.size() == SIZE_WORD) { - if (resolved.write_word.func) + if (resolved.write_word) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_word_masked.obj); // mov param1,space smart_call_r64(a, resolved.write_word_masked.func, rax); // call write_word_masked @@ -2824,7 +2812,7 @@ void drcbe_x64::op_writem(Assembler &a, const instruction &inst) } else if (spacesizep.size() == SIZE_DWORD) { - if (resolved.write_word.func) + if (resolved.write_word) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_dword_masked.obj); // mov param1,space smart_call_r64(a, resolved.write_dword_masked.func, rax); // call write_dword_masked @@ -2837,7 +2825,7 @@ void drcbe_x64::op_writem(Assembler &a, const instruction &inst) } else if (spacesizep.size() == SIZE_QWORD) { - if (resolved.write_word.func) + if (resolved.write_word) { mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_qword_masked.obj); // mov param1,space smart_call_r64(a, resolved.write_qword_masked.func, rax); // call write_qword_masked diff --git a/src/devices/cpu/drcbex64.h b/src/devices/cpu/drcbex64.h index b2c9195bd9e5b..18c5f1d59b8aa 100644 --- a/src/devices/cpu/drcbex64.h +++ b/src/devices/cpu/drcbex64.h @@ -251,10 +251,8 @@ class drcbe_x64 : public drcbe_interface // state to live in the near cache struct near_state { - x86code * debug_cpu_instruction_hook;// debugger callback x86code * debug_log_hashjmp; // hashjmp debugging x86code * debug_log_hashjmp_fail; // hashjmp debugging - x86code * drcmap_get_value; // map lookup helper uint32_t ssemode; // saved SSE mode uint32_t ssemodesave; // temporary location for saving @@ -270,30 +268,9 @@ class drcbe_x64 : public drcbe_interface near_state & m_near; // resolved memory handler functions - struct resolved_handler { uintptr_t obj = 0; x86code *func = nullptr; }; - struct resolved_accessors - { - - resolved_handler read_byte; - resolved_handler read_byte_masked; - resolved_handler read_word; - resolved_handler read_word_masked; - resolved_handler read_dword; - resolved_handler read_dword_masked; - resolved_handler read_qword; - resolved_handler read_qword_masked; - - resolved_handler write_byte; - resolved_handler write_byte_masked; - resolved_handler write_word; - resolved_handler write_word_masked; - resolved_handler write_dword; - resolved_handler write_dword_masked; - resolved_handler write_qword; - resolved_handler write_qword_masked; - }; - using resolved_accessors_vector = std::vector; - resolved_accessors_vector m_resolved_accessors; + resolved_member_function m_debug_cpu_instruction_hook; + resolved_member_function m_drcmap_get_value; + resolved_memory_accessors_vector m_resolved_accessors; // globals using opcode_generate_func = void (drcbe_x64::*)(asmjit::x86::Assembler &, const uml::instruction &); From d7b26bdd6c7923d3d68b4cd127d3bc99dc9209fe Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Wed, 15 Jan 2025 22:28:20 +0100 Subject: [PATCH 25/80] seta/macs.cpp: dumped GAL for kisekaem [buffi] --- src/mame/seta/macs.cpp | 18 ++++++++---------- src/mame/skeleton/cle68k.cpp | 9 +++++++++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/mame/seta/macs.cpp b/src/mame/seta/macs.cpp index 1d4cafac73511..990bd5ea9c4d4 100644 --- a/src/mame/seta/macs.cpp +++ b/src/mame/seta/macs.cpp @@ -58,10 +58,12 @@ KISEKAE -- info */ #include "emu.h" + #include "st0016.h" -#include "bus/generic/slot.h" #include "bus/generic/carts.h" +#include "bus/generic/slot.h" + #include "speaker.h" @@ -104,8 +106,6 @@ class macs_state : public driver_device void macs_output_w(offs_t offset, uint8_t data); uint8_t dma_offset(); - uint32_t screen_update_macs(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - optional_device m_maincpu; optional_device m_cart1; optional_device m_cart2; @@ -490,12 +490,6 @@ static INPUT_PORTS_START( macs_h ) INPUT_PORTS_END -uint32_t macs_state::screen_update_macs(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - return m_maincpu->update(screen,bitmap,cliprect); -} - - uint8_t macs_state::dma_offset() { return m_cart_bank; @@ -517,7 +511,7 @@ void macs_state::macs(machine_config &config) screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_size(128*8, 128*8); screen.set_visarea(0*8, 128*8-1, 0*8, 128*8-1); - screen.set_screen_update(FUNC(macs_state::screen_update_macs)); + screen.set_screen_update(m_maincpu, FUNC(st0016_cpu_device::update)); screen.set_palette("maincpu:palette"); screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_IRQ0, HOLD_LINE); // FIXME: HOLD_LINE is bad juju @@ -575,6 +569,10 @@ ROM_START( kisekaem ) ROM_LOAD16_BYTE( "am-mj.u7", 0x000001, 0x100000, CRC(4b645354) SHA1(1dbf9141c3724e5dff2cd8066117fb1b94671a80) ) ROM_LOAD16_BYTE( "am-mj.u6", 0x200000, 0x100000, CRC(23b3aa24) SHA1(bfabdb16f9b1b60230bb636a944ab46fdfda49d7) ) ROM_LOAD16_BYTE( "am-mj.u5", 0x200001, 0x100000, CRC(b4d53e29) SHA1(d7683fdd5531bf1aa0ef1e4e6f517b31e2d5829e) ) + + ROM_REGION( 0x117, "slot_a:pld", 0 ) + ROM_LOAD( "sx011-02.bin", 0x000, 0x117, CRC(ac8040b4) SHA1(1dc1cd93eaed13fb5b8cba024d93fdb9193a47c0) ) // GAL16V8B + ROM_REGION( 0x400000, "slot_b:rom", ROMREGION_ERASEFF ) ROM_REGION( 0x1000000, "maincpu", 0 ) diff --git a/src/mame/skeleton/cle68k.cpp b/src/mame/skeleton/cle68k.cpp index f4f9546604b2e..ec87e0c8ec7dd 100644 --- a/src/mame/skeleton/cle68k.cpp +++ b/src/mame/skeleton/cle68k.cpp @@ -234,6 +234,9 @@ ROM_START( dmndhrt ) ROM_LOAD16_BYTE( "diamond_heart_u.s.a_u8.u8", 0x00000, 0x20000, CRC(d1f340ce) SHA1(7567448c8694bb24f7957bb461d3be51d138634a) ) ROM_LOAD16_BYTE( "diamond_heart_u.s.a_u3.u3", 0x00001, 0x20000, CRC(78885bb8) SHA1(51e360036d32b609b4036be086549c011ab41fe3) ) + ROM_REGION( 0x1000, "mcu", 0 ) + ROM_LOAD( "at90s4414.u51", 0x0000, 0x1000, NO_DUMP ) + ROM_REGION( 0x100000, "tiles", 0 ) ROM_LOAD( "diamond_heart_u.s.a_u10.u10", 0x00000, 0x80000, CRC(00b691a7) SHA1(8cc530ad204cf9168d59419a01abf338c46a49e1) ) ROM_LOAD( "diamond_heart_u.s.a_u11.u11", 0x80000, 0x80000, CRC(2c666c44) SHA1(15c8e97900444046adb9455bfa827735c226a727) ) @@ -254,6 +257,9 @@ ROM_START( dmndhrtn ) // u51 was scratched for this set but believed to be AT90S ROM_LOAD16_BYTE( "w27e010.u8", 0x00000, 0x20000, CRC(2a1ba91e) SHA1(af340d9e0aa7874669557067a9e043eecdf5301b) ) // no sticker ROM_LOAD16_BYTE( "w27e010.u3", 0x00001, 0x20000, CRC(cdb26ff2) SHA1(33ddda977a5f6436a690fa53763f36c7e6acfb94) ) // no sticker + ROM_REGION( 0x1000, "mcu", 0 ) + ROM_LOAD( "at90s4414.u51", 0x0000, 0x1000, NO_DUMP ) + ROM_REGION( 0x100000, "tiles", 0 ) ROM_LOAD( "diamond_heart_new_mon_v20.0_u10.u10", 0x00000, 0x80000, CRC(7525bd95) SHA1(b34ab59bde9ecdfe03489a6eceda2c95afdee6c8) ) ROM_LOAD( "diamond_heart_new_mon_v20.0_u11.u11", 0x80000, 0x80000, CRC(1ffc66a6) SHA1(fd5bfa9ec01ad7aa3060929dbce417babe241700) ) @@ -274,6 +280,9 @@ ROM_START( honeybee ) // u51 was scratched for this set but believed to be AT90S ROM_LOAD16_BYTE( "honey_bee_hb_tw_u8.u8", 0x00000, 0x40000, CRC(1e7e53a3) SHA1(30d426cca499adf82338ba6cc1391f754e908a5b) ) ROM_LOAD16_BYTE( "honey_bee_hb_tw_u3.u3", 0x00001, 0x40000, CRC(0ed5f0cc) SHA1(f64c27f04f74162027070f889daaec6f1847f19e) ) + ROM_REGION( 0x1000, "mcu", 0 ) + ROM_LOAD( "at90s4414.u51", 0x0000, 0x1000, NO_DUMP ) + ROM_REGION( 0x100000, "tiles", 0 ) ROM_LOAD( "honey_bee_hb_tw_u10.u10", 0x00000, 0x80000, CRC(40526fe1) SHA1(58a3a16c4dc0fa6527571b924f43377657f0cc76) ) ROM_LOAD( "honey_bee_hb_tw_u11.u11", 0x80000, 0x80000, CRC(3036a082) SHA1(16393fac3ccd5c2fc6ab9fd11f8530aace94e4fc) ) From 9c3bee6b9fb562b1046668f0a39641a55afc848e Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Thu, 16 Jan 2025 01:40:49 +0100 Subject: [PATCH 26/80] Systems promoted to working --------------------------- Code Magik (Ver 5.5) / Super 7 (stealth game) [Roberto Fresca, Grull Osgo] --- src/mame/misc/lependu.cpp | 65 +++++++++++++-------------------------- 1 file changed, 22 insertions(+), 43 deletions(-) diff --git a/src/mame/misc/lependu.cpp b/src/mame/misc/lependu.cpp index 1d57b0fd345d3..e34e5a8b6de0f 100644 --- a/src/mame/misc/lependu.cpp +++ b/src/mame/misc/lependu.cpp @@ -103,6 +103,7 @@ class lependu_state : public driver_device lependu_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_nvram(*this, "nvram"), m_pia(*this, "pia%u", 0U), m_screen(*this, "screen"), m_gfxdecode(*this, "gfxdecode"), @@ -138,6 +139,7 @@ class lependu_state : public driver_device void lependu_colorram_w(offs_t offset, uint8_t data); required_device m_maincpu; + required_shared_ptr m_nvram; required_device_array m_pia; required_device m_screen; required_device m_gfxdecode; @@ -311,6 +313,9 @@ void lependu_state::lamps_cm_w(uint8_t data) */ for (int i = 0; i < 6 ; i++) m_lamps[i] = BIT(~data, i); + + // Select stealth game (Keyboard "L" toggle) + m_nvram[0x0004] = m_input[3]->read() >> 7; } @@ -462,7 +467,8 @@ static INPUT_PORTS_START(codemagik) PORT_START("IN.3") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) // 25c coin - PORT_BIT( 0xfb, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Sealth Mode") PORT_CODE(KEYCODE_L) PORT_TOGGLE + PORT_BIT( 0x7b, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("SW1") // only bits 4-7 are connected here and were routed to SW1 1-4 @@ -483,31 +489,8 @@ static INPUT_PORTS_START(codemagik) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("SW2") // just for test - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("SW2") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -578,9 +561,9 @@ static const discrete_dac_r1_ladder dac_lependu_ladder = 3, // size of ladder {RES_K(30), RES_K(15), RES_K(7.5)}, // elements -/* external vBias doesn't seems to be accurate. - using the 555 internal values sound better. -*/ +// external vBias doesn't seems to be accurate. +// using the 555 internal values sound better. + 5, // voltage Bias resistor is tied to RES_K(5), // additional resistor tied to vBias RES_K(10), // resistor tied to ground @@ -713,20 +696,13 @@ ROM_START( lependu ) ROM_END /* - Code Magik + Code Magik / Super 7 Voyageur de L'Espace Inc. - Obscure vintage game. - Using IRQ instead of NMI. - - VideoRAM: 0x800-0xbff - ColorRAM: 0xc00-0xfff + Obscure stealth vintage game, using IRQ instead of NMI. - CRTC addr: 0x10b0-0x10b0 - CRTC data: 0x10b1-0x10b1 - - PIA0 offs: 0x10f4-0x10f7 - PIA1 offs: 0x10f8-0x10fb + Code Magik is a sort of Mastermind game that can be switched + to a poker bonus game called Super 7, through a complex use of the hardware. */ ROM_START( codemagik ) @@ -750,6 +726,9 @@ ROM_START( codemagik ) ROM_COPY( "gfx1", 0x4800, 0x2000, 0x0800 ) // cards deck gfx, bitplane3. ROM_COPY( "gfx1", 0x5800, 0x2800, 0x0800 ) // cards deck alt gfx, bitplane3. + ROM_REGION( 0x0800, "nvram", 0 ) // default NVRAM, otherwise the game can't be played. + ROM_LOAD( "codemagik_nvram.bin", 0x0000, 0x0800, CRC(55f269ca) SHA1(c55b9f1eff66811d122718bef2bb067d4f4b817a) ) + ROM_REGION( 0x0100, "proms", 0 ) ROM_LOAD( "dex.5d", 0x0000, 0x0100, CRC(7f31066b) SHA1(15420780ec6b2870fc4539ec3afe4f0c58eedf12) ) ROM_END @@ -785,6 +764,6 @@ void lependu_state::init_lependu() * Game Drivers * *********************************************/ -// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS LAYOUT -GAMEL( 198?, lependu, 0, lependu, lependu, lependu_state, init_lependu, ROT0, "Avenir Amusement Inc.", "Le Pendu (Bilingue, Version 04)", 0, layout_lependu ) -GAMEL( 198?, codemagik, 0, codemagik, codemagik, lependu_state, empty_init, ROT0, "Voyageur de L'Espace Inc.", "Code Magik", MACHINE_NOT_WORKING, layout_codemagik ) +// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS LAYOUT +GAMEL( 198?, lependu, 0, lependu, lependu, lependu_state, init_lependu, ROT0, "Avenir Amusement Inc.", "Le Pendu (Bilingue, Version 04)", 0, layout_lependu ) +GAMEL( 198?, codemagik, 0, codemagik, codemagik, lependu_state, empty_init, ROT0, "Voyageur de L'Espace Inc.", "Code Magik (Ver 5.5) / Super 7 (stealth game)", 0, layout_codemagik ) From 4199f2c1681b033016c183e245a6d54e7df42fa7 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Thu, 16 Jan 2025 01:49:54 +0100 Subject: [PATCH 27/80] Adjusted Le Pendu buttons-lamps layout intensity. --- src/mame/layout/lependu.lay | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/layout/lependu.lay b/src/mame/layout/lependu.lay index 1b5ba8379863f..fba392c3a7563 100644 --- a/src/mame/layout/lependu.lay +++ b/src/mame/layout/lependu.lay @@ -50,7 +50,7 @@ license:CC0-1.0 - + From fd6d7c0f00c7d3cfbc6c3eec545332e626149884 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Thu, 16 Jan 2025 03:34:48 +0100 Subject: [PATCH 28/80] Code Magik / Super 7: Added game and technical notes. --- src/mame/misc/lependu.cpp | 48 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/mame/misc/lependu.cpp b/src/mame/misc/lependu.cpp index e34e5a8b6de0f..f4469fd998a38 100644 --- a/src/mame/misc/lependu.cpp +++ b/src/mame/misc/lependu.cpp @@ -12,6 +12,12 @@ Driver by Roberto Fresca & Grull Osgo. + Games supported: + + * Le Pendu (Bilingue, Version 04), 198?, Avenir Amusement Inc. + * Code Magik (Ver 5.5) / Super 7 (stealth game), 198?, Voyageur de L'Espace Inc. + + *********************************************************************************** The "mini-boy" poker games made by Bonanza Enterprises were very popular @@ -70,6 +76,48 @@ Discrete circuitry for sound. +*********************************************************************************** + + Code Magik (Ver 5.5) / Super 7 + + This is a very rare game that has a gambling game hidden inside in stealth mode. + + The front game is a very good Mastermind type game, where you must to guess + a 4-numbers code to deactivate the bomb. The game will return how many numbers + are correct, and how many in the right position. You have 20 attempts to beat + the machine and win the game. + + Instructions (French/English/Spanish): + + - Entrez votre code en choisissant 4 chiffres de 0 a 9. + - Vous avez 20 essaiz. + - Reussissez a l'interieur de 5 essais et vous aurez una partie gratuite. + - Abandonnez la partie en appuyant d'abord sur CARTE et ensuite sur MISE. + + - Enter your code by choosing 4 digits from 0 to 9. + - You have 20 attempts. + - Succeed within 5 tries and you will have a free game. + - Give up the game by first pressing CARTE and then MISE. + + - Ingrese su código eligiendo 4 dígitos del 0 al 9. + - Tienes 20 intentos. + - Si lo logras en 5 intentos, tendrás un juego gratis. + - Abandona el juego presionando primero CARTE y luego MISE. + + + This is the very first arcade game of this type. + + The game has complex routines that allow a serial comm with an unknown external + device that can transfer a whole NVRAM to the game, so I strongly think that + the game could be configurable and switched remotely. + + Part of the code was injected in the NVRAM, so once the battery drains, the game + will be inoperable, showing only the attract (title + explanation screen). + + After a big effort and days of reverse-engineering, we were capable to reconstruct + the NVRAM structure and the hidden game switch. + + **********************************************************************************/ From d30cf2cb87ce33b0db094c0e2d8b8989e43195ca Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Thu, 16 Jan 2025 16:22:59 +0700 Subject: [PATCH 29/80] mg1: improve to mostly-working state * add hardware cursor emulation * complete mouse emulation * add iop vblank input * fix iop to cpu interrupt --- src/mame/mg1/mg1.cpp | 149 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 138 insertions(+), 11 deletions(-) diff --git a/src/mame/mg1/mg1.cpp b/src/mame/mg1/mg1.cpp index e6efa83289834..a43af1e9da09f 100644 --- a/src/mame/mg1/mg1.cpp +++ b/src/mame/mg1/mg1.cpp @@ -12,7 +12,9 @@ */ /* * WIP - * - boots 42nix from hard disk image, but can't operate GUI without mouse + * - boots 42nix from hard disk image + * - cursor sometimes "trapped" + * - keyboard intermittently outputs garbage */ #include "emu.h" @@ -81,7 +83,8 @@ class mg1_state : public driver_device , m_kbd(*this, "kbd") , m_buzzer(*this, "buzzer") , m_buzzen(*this, "buzzer_enable") - , m_mouse_buttons(*this, "mouse_buttons") + , m_mouse_buttons(*this, "MOUSE_B") + , m_mouse_axis(*this, "MOUSE_%c", 'X') , m_led_err(*this, "led_err") , m_led_fdd(*this, "led_fdd") { @@ -102,6 +105,9 @@ class mg1_state : public driver_device private: MC6845_UPDATE_ROW(update_row); + MC6845_END_UPDATE(draw_cursor); + + template u8 mouse_axis_r(); // devices required_device m_cpu; @@ -137,24 +143,88 @@ class mg1_state : public driver_device required_device m_buzzen; required_ioport m_mouse_buttons; + required_ioport_array<2> m_mouse_axis; output_finder<> m_led_err; output_finder<> m_led_fdd; u8 m_sem[6] = { 0xc0, 0x80, 0xc0, 0xc0, 0xc0, 0xc0 }; u8 m_iop_p2; + + s16 m_mouse[2]; + + struct cursor_cnt + { + bool partial; + u16 data; + s16 value; + } + m_cursor_cnt[2]; + + u8 m_cursor_reg; // cursor page number and x offset + bool m_cursor_fn; // cursor function (1=nor, 0=xnor) }; void mg1_state::machine_start() { m_led_err.resolve(); m_led_fdd.resolve(); + + save_item(NAME(m_sem)); + save_item(NAME(m_iop_p2)); + save_item(NAME(m_mouse)); + save_item(STRUCT_MEMBER(m_cursor_cnt, partial)); + save_item(STRUCT_MEMBER(m_cursor_cnt, data)); + save_item(STRUCT_MEMBER(m_cursor_cnt, value)); + save_item(NAME(m_cursor_reg)); + save_item(NAME(m_cursor_fn)); } void mg1_state::machine_reset() { m_fdc->set_floppy(m_fdd); m_iop_p2 = 0; + + m_mouse[0] = 0; + m_mouse[1] = 0; + + for (cursor_cnt &c : m_cursor_cnt) + { + c.partial = false; + c.data = 0; + c.value = 0; + } + + m_cursor_reg = 0; + m_cursor_fn = false; + + // HACK: capture the counter 1 and 2 values which control the hardware cursor location + m_iop->space(0).install_write_tap(0x20e1, 0x20e2, "cursor_cnt_w", + [this](offs_t offset, u8 &data, u8 mem_mask) + { + cursor_cnt &c = m_cursor_cnt[(offset & 3) - 1]; + + // data is written least-significant byte first + c.data = u16(data) << 8 | (c.data >> 8); + c.partial = !c.partial; + + // convert counter values to pixel coordinates after each update + if (!c.partial) + { + switch (offset & 3) + { + case 1: + // counter 1 holds cursor y position multiplied by number of characters + // per line (20), plus an offset (0x4d); except for lines <1 + c.value = (c.data > 0x4c) ? (c.data - 0x4d) / 0x14 : (c.data - 0x4d); + break; + case 2: + // counter 2 holds cursor x position in character columns (+1) + c.value = (c.data - 1) * 64; + break; + } + } + }); } template void mg1_state::cpu_map(address_map &map) @@ -250,14 +320,17 @@ void mg1_state::iop_map(address_map &map) }, "iop_sem_w"); // i/o area - map(0x2000, 0x201f).mirror(0x1e00).lw8([this](u8 data) { m_buzzen->in_w<1>(BIT(data, 0)); }, "mouse_x"); // mouse x counter/buzzer enable + map(0x2000, 0x201f).mirror(0x1e00).r(FUNC(mg1_state::mouse_axis_r<0>)); + map(0x2000, 0x201f).mirror(0x1e00).lw8([this](u8 data) { m_buzzen->in_w<1>(BIT(data, 0)); }, "buzzer_w"); map(0x2020, 0x2020).mirror(0x1e00).lw8([this](offs_t offset, u8 data) { logerror("host reset %x,0x%02x\n", offset, data); }, "host_reset").select(0x0100); - //map(0x2040, 0x205f).mirror(0x1e00).lw8([this](u8 data) { logerror("cursor 0x%02x\n", data); }, "cursor"); // cursor pixel offset & cursor number - map(0x2060, 0x207f).mirror(0x1e00).lw8([this](u8 data) { m_icu->ir_w<10>(0); }, "iopint"); + map(0x2040, 0x205f).mirror(0x1e00).lw8([this](u8 data) { m_cursor_reg = data; }, "cursor_reg_w"); + map(0x2060, 0x207f).mirror(0x1e00).lw8([this](u8 data) { m_icu->ir_w<10>(1); m_icu->ir_w<10>(0); }, "iopint"); map(0x2080, 0x2080).mirror(0x1e00).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w)); map(0x2081, 0x2081).mirror(0x1e00).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); - map(0x20a0, 0x20bf).mirror(0x1e00).lr8([this]() { return m_mouse_buttons->read(); }, "mouse_b"); // mouse buttons - //map(0x20c0, 0x20df).mirror(0x1e00).lw8([this](u8 data) { logerror("mouse y counter 0x%02x\n", data); }, "mouse_y"); // mouse y counter + map(0x20a0, 0x20bf).mirror(0x1e00).lrw8( + [this]() { return m_mouse_buttons->read(); }, "mouse_b_r", + [this](u8 data) { m_cursor_fn = BIT(data, 0); }, "cursor_fn_w"); + map(0x20c0, 0x20df).mirror(0x1e00).r(FUNC(mg1_state::mouse_axis_r<1>)); map(0x20e0, 0x20ff).mirror(0x1e00).rw(m_iop_ctc, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0x4000, 0x47ff).mirror(0x3800).ram().share("iop_sram"); // D4016C-3 2048x8 SRAM @@ -272,11 +345,27 @@ void mg1_state::dma_map(address_map &map) [this](offs_t offset, u16 data, u16 mem_mask) { m_cpu->space(0).write_word(offset << 1, swapendian_int16(data), swapendian_int16(mem_mask)); }, "dma_w"); } +template u8 mg1_state::mouse_axis_r() +{ + s16 const value = m_mouse_axis[Axis]->read(); + s8 const delta = std::clamp(value - m_mouse[Axis], -128, 127); + + m_mouse[Axis] = value; + + return delta; +} + static INPUT_PORTS_START(mg1) - PORT_START("mouse_buttons") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Mouse Left Button") PORT_CODE(MOUSECODE_BUTTON1) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Mouse Middle Button") PORT_CODE(MOUSECODE_BUTTON3) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Mouse Right Button") PORT_CODE(MOUSECODE_BUTTON2) + PORT_START("MOUSE_B") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Mouse Left Button") PORT_CODE(MOUSECODE_BUTTON1) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("Mouse Middle Button") PORT_CODE(MOUSECODE_BUTTON3) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_NAME("Mouse Right Button") PORT_CODE(MOUSECODE_BUTTON2) + + PORT_START("MOUSE_X") + PORT_BIT(0xffff, 0x0000, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) + + PORT_START("MOUSE_Y") + PORT_BIT(0xffff, 0x0000, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) INPUT_PORTS_END MC6845_UPDATE_ROW(mg1_state::update_row) @@ -307,6 +396,42 @@ MC6845_UPDATE_ROW(mg1_state::update_row) } } +MC6845_END_UPDATE(mg1_state::draw_cursor) +{ + s32 const cursor_y = m_cursor_cnt[0].value; + s32 const cursor_x = m_cursor_cnt[1].value - BIT(m_cursor_reg, 2, 6); + + rectangle cursor(cursor_x, cursor_x + 63, cursor_y, cursor_y + 63); + cursor &= cliprect; + + for (s32 y = cursor.top(); y <= cursor.bottom(); y++) + { + // vma0-5 from counter, vma6-7 from register, vma8-15 high, vma16 low + u16 const vma = 0xff00 | BIT(m_cursor_reg, 0, 2) << 6; + u32 const va = (u32(m_vmram[vma >> 6]) << 6) + y - cursor_y; + + // read first displayed byte of cursor data + unsigned bit = cursor.left() - cursor_x; + u8 data = m_ram->read((va << 3) | BYTE8_XOR_LE(bit >> 3)); + + for (s32 x = cursor.left(); x <= cursor.right(); x++) + { + // apply cursor function + if (BIT(data, bit++ & 7)) + { + if (m_cursor_fn) + bitmap.pix(y, x) = rgb_t::black(); + else + bitmap.pix(y, x) ^= rgb_t::white(); + } + + // read next byte of cursor data + if (!(bit & 7) && (bit < 64)) + data = m_ram->read((va << 3) | BYTE8_XOR_LE(bit >> 3)); + } + } +} + static void floppy_formats(format_registration &fr) { fr.add_mfm_containers(); @@ -404,6 +529,7 @@ void mg1_state::mg1(machine_config &config) m_crtc->set_show_border_area(false); m_crtc->set_hpixels_per_column(64); m_crtc->set_update_row_callback(FUNC(mg1_state::update_row)); + m_crtc->set_end_update_callback(FUNC(mg1_state::draw_cursor)); m_crtc->out_vsync_callback().set(m_iop_ctc, FUNC(pit8253_device::write_gate1)); m_crtc->out_hsync_callback().set(m_iop_ctc, FUNC(pit8253_device::write_gate2)); @@ -412,6 +538,7 @@ void mg1_state::mg1(machine_config &config) SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_raw(60_MHz_XTAL, 20*64, 1*64, 17*64, 51*16 + 4, 0, 50*16); m_screen->set_screen_update(m_crtc, FUNC(mc6845_device::screen_update)); + m_screen->screen_vblank().set_inputline(m_iop, M6801_TIN_LINE); AM7990(config, m_net); m_net->intr_out().set(m_icu, FUNC(ns32202_device::ir_w<6>)); From 12c491b13f5acae6acba9ea2a0cf50e0dc0edced Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 16 Jan 2025 14:36:24 +0100 Subject: [PATCH 30/80] drivfrcg: fix crash sound [Robbbert], superbikg: don't mark game as bootleg, rom contents looks original, can't judge bootleg from overall pcb quality of a conversion kit --- src/mame/galaxian/galaxold.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/mame/galaxian/galaxold.cpp b/src/mame/galaxian/galaxold.cpp index 9c2e21e91b3a6..7a906d9cdc403 100644 --- a/src/mame/galaxian/galaxold.cpp +++ b/src/mame/galaxian/galaxold.cpp @@ -524,14 +524,11 @@ void galaxold_state::drivfrcg_program(address_map &map) map(0x1500, 0x1500).mirror(0x6000).portr("IN0"); map(0x1503, 0x1503).mirror(0x6000).w(FUNC(galaxold_state::galaxold_coin_counter_w)); map(0x1580, 0x1580).mirror(0x6000).portr("IN1"); - map(0x1580, 0x1582).mirror(0x6000).w("cust", FUNC(galaxian_sound_device::background_enable_w)); - map(0x1583, 0x1583).mirror(0x6000).nopw(); - map(0x1585, 0x1585).mirror(0x6000).nopw(); - map(0x1586, 0x1587).mirror(0x6000).w("cust", FUNC(galaxian_sound_device::lfo_freq_w)); + map(0x1580, 0x1587).mirror(0x6000).w("cust", FUNC(galaxian_sound_device::sound_w)); map(0x1600, 0x1600).mirror(0x6000).portr("DSW0").w("cust", FUNC(galaxian_sound_device::pitch_w)); map(0x1700, 0x1700).mirror(0x6000).portr("DSW1").nopw(); map(0x1701, 0x1701).mirror(0x6000).nopw(); - map(0x1704, 0x1707).mirror(0x6000).w("cust", FUNC(galaxian_sound_device::vol_w)); + map(0x1704, 0x1707).mirror(0x6000).w("cust", FUNC(galaxian_sound_device::lfo_freq_w)); map(0x1800, 0x1bff).mirror(0x6000).w(FUNC(galaxold_state::galaxold_videoram_w)).share("videoram"); map(0x1c00, 0x1fff).mirror(0x6000).ram(); map(0x2000, 0x2fff).rom(); @@ -1863,7 +1860,7 @@ void galaxold_state::superbikg(machine_config &config) { galaxold_base(config); - s2650_device &s2650(S2650(config.replace(), m_maincpu, 1'500'000)); // 1.53292 MHz measured with logic analyzer + s2650_device &s2650(S2650(config.replace(), m_maincpu, PIXEL_CLOCK / 4)); // 1.53292 MHz measured with logic analyzer s2650.set_addrmap(AS_PROGRAM, &galaxold_state::superbikg_map); s2650.set_addrmap(AS_IO, &galaxold_state::superbikg_io); s2650.set_addrmap(AS_DATA, &galaxold_state::superbikg_data); @@ -2311,8 +2308,8 @@ ROM_START( spcwarp ) ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "swarpt7f.bin", 0x0000, 0x1000, CRC(04d744e3) SHA1(db8218510052a05670cb0b722b73d3f10464788c) ) ROM_LOAD( "swarpt7h.bin", 0x2000, 0x1000, CRC(34a36536) SHA1(bc438515618683b2a7c29637871ee00ed95ad7f8) ) - // missing ROM at $4000 - ROM_LOAD( "swarpt7m.bin", 0x6000, 0x1000, BAD_DUMP CRC(a2dff6c8) SHA1(d1c72848450dc5ff386dc94a26e4bf704ccc7121) ) // ROMCMP reports "BADADDR xxxxxx-xxxxx". Observed data sequence repeated every 32 bytes + ROM_LOAD( "swarpt7k.bin", 0x4000, 0x1000, NO_DUMP ) + ROM_LOAD( "swarpt7m.bin", 0x6000, 0x1000, BAD_DUMP CRC(a2dff6c8) SHA1(d1c72848450dc5ff386dc94a26e4bf704ccc7121) ) // ROMCMP reports "BADADDR xxxxxx-xxxxx". Observed data sequence repeated every 32 bytes ROM_REGION( 0x1000, "gfx1", 0 ) ROM_LOAD( "swarpb1h.bin", 0x0000, 0x0800, CRC(6ee3b5f7) SHA1(8150f2ecd59d3a165c0541b550664c56d049edd5) ) @@ -2324,7 +2321,8 @@ ROM_START( spcwarp ) ROM_END // GX-01 main PCB + MV-2 ROM board + HB CPU board -// In-game it still shows the Century copyright but the PCB has no sign of being an original +// In-game it still shows the Century copyright but the PCB has no sign of being an original. +// Though PCB manufacture quality doesn't apply since it was sold as a Galaxian conversion kit. ROM_START( superbikg ) ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "moto1-2516.bin", 0x0000, 0x0800, CRC(2903f8c8) SHA1(288401a941853751caa8d1d69e6908dbfbcfb5ac) ) @@ -2652,7 +2650,7 @@ GAME( 1981, froggerv, frogger, videotron, froggerv, galaxold_state, empty_ini GAME( 1983, hunchbkg, hunchbak, hunchbkg, hunchbkg, galaxold_state, empty_init, ROT90, "Century Electronics", "Hunchback (Galaxian hardware)", MACHINE_SUPPORTS_SAVE ) GAME( 1983, hunchbgb, hunchbak, hunchbkg, hunchbkg, galaxold_state, empty_init, ROT90, "bootleg (FAR S.A.)", "Hunchback (FAR S.A. bootleg on Galaxian hardware)", MACHINE_SUPPORTS_SAVE ) GAME( 1983, spcwarp, 0, spcwarp, hunchbkg, galaxold_state, empty_init, ROT90, "Century Electronics", "Space Warp? (Cosmos conversion on Galaxian hardware)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_WRONG_COLORS ) // bad dump -GAME( 1983, superbikg, superbik, superbikg, superbikg, galaxold_state, init_superbikg, ROT90, "bootleg", "Superbike (bootleg on Galaxian hardware)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // colors look strange but match real hw video +GAME( 1983, superbikg, superbik, superbikg, superbikg, galaxold_state, init_superbikg, ROT90, "Century Electronics", "Superbike (Galaxian hardware)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // colors look strange but match real hw video GAME( 1984, drivfrcg, drivfrcp, drivfrcg, drivfrcg, galaxold_state, empty_init, ROT90, "Shinkai Inc. (Magic Electronics USA license)", "Driving Force (Galaxian conversion)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, drivfrct, drivfrcp, drivfrcg, drivfrcg, galaxold_state, empty_init, ROT90, "bootleg (EMT Germany)", "Top Racer (bootleg of Driving Force)", MACHINE_SUPPORTS_SAVE ) // Video Klein PCB GAME( 1985, drivfrcb, drivfrcp, drivfrcg, drivfrcg, galaxold_state, empty_init, ROT90, "bootleg (Elsys Software)", "Driving Force (Galaxian conversion bootleg)", MACHINE_SUPPORTS_SAVE ) From 375877823c1cf7a4eaa1fa376ef3a038d0bbb54e Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 17 Jan 2025 00:46:34 +1100 Subject: [PATCH 31/80] Slight DRC code generation optimisation: cpu/drcbex64.cpp: Consider a RIP-relative LEA for generating 64-bit values (7-byte instruction versus a 10-byte MOV instruction). Seems to work pretty well for heap pointers. cpu/drcbearm64.cpp: Changed the near cache base pointer offset from 0x80 to 0x100. The value 0x80 was copied from the x86-64 back-end where it was choses to allow an 8-bit signed displacement to reach as much of the top of the near cache as possible. However, AArch64 use 9-bit signed displacements, so a quarter of the range was being wasted. cpu/drcbearm64.cpp: Consider an adrp/add sequence for generating immediate values as well as memory references. --- src/devices/cpu/drcbearm64.cpp | 20 +++++++++++++++++--- src/devices/cpu/drcbex64.cpp | 8 +++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/devices/cpu/drcbearm64.cpp b/src/devices/cpu/drcbearm64.cpp index 710023644613e..fa625ba595399 100644 --- a/src/devices/cpu/drcbearm64.cpp +++ b/src/devices/cpu/drcbearm64.cpp @@ -47,10 +47,10 @@ FP -> SP + 0x00 previous FP Stack layout in nested generated code subroutine call frame: -SP -> SP + 0x00 previous FP +SP -> SP + 0x00 saved FP SP + 0x08 return address ... - FP - 0x10 previous FP + FP - 0x10 saved FP FP - 0x08 return address FP -> FP + 0x00 previous FP FP + 0x08 top-level return address @@ -492,6 +492,20 @@ void drcbe_arm64::get_imm_relative(a64::Assembler &a, const a64::Gp ®, const return; } + const uint64_t pagebase = codeoffs & ~make_bitmask(12); + const int64_t pagerel = (int64_t)ptr - pagebase; + if (is_valid_immediate_signed(pagerel, 33)) + { + const uint64_t targetpage = (uint64_t)ptr & ~make_bitmask(12); + const uint64_t pageoffs = (uint64_t)ptr & util::make_bitmask(12); + + a.adrp(reg, targetpage); + if (pageoffs != 0) + a.add(reg, reg, pageoffs); + + return; + } + a.mov(reg, ptr); } @@ -953,7 +967,7 @@ drcbe_arm64::drcbe_arm64(drcuml_state &drcuml, device_t &device, drc_cache &cach , m_entry(nullptr) , m_exit(nullptr) , m_nocode(nullptr) - , m_baseptr(cache.near() + 0x80) + , m_baseptr(cache.near() + 0x100) , m_near(*(near_state *)cache.alloc_near(sizeof(m_near))) { m_near.emulated_flags = 0; diff --git a/src/devices/cpu/drcbex64.cpp b/src/devices/cpu/drcbex64.cpp index b57c48828d189..7538ee25b83c6 100644 --- a/src/devices/cpu/drcbex64.cpp +++ b/src/devices/cpu/drcbex64.cpp @@ -1287,7 +1287,13 @@ void drcbe_x64::mov_r64_imm(Assembler &a, Gp const ®, uint64_t const imm) else if (s32(imm) == imm) a.mov(reg.r64(), s32(imm)); else - a.mov(reg.r64(), imm); + { + const int64_t delta = imm - (a.code()->baseAddress() + a.offset() + 7); + if (short_immediate(delta)) + a.lea(reg.r64(), ptr(rip, delta)); + else + a.mov(reg.r64(), imm); + } } From 8954c5fd8938256accd8bb7b83e685024f0ae57d Mon Sep 17 00:00:00 2001 From: angelosa Date: Thu, 16 Jan 2025 16:00:19 +0100 Subject: [PATCH 32/80] amiga/agnus_copper.cpp: calculate cycles remainders on end of scanlines --- src/mame/amiga/agnus_copper.cpp | 16 ++++++++++++++++ src/mame/amiga/agnus_copper.h | 3 +++ src/mame/amiga/amiga_v.cpp | 4 +++- src/mame/amiga/amigaaga.cpp | 5 ++++- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/mame/amiga/agnus_copper.cpp b/src/mame/amiga/agnus_copper.cpp index 0af247679479f..6de9b35b2c61d 100644 --- a/src/mame/amiga/agnus_copper.cpp +++ b/src/mame/amiga/agnus_copper.cpp @@ -97,6 +97,7 @@ void agnus_copper_device::device_start() save_item(NAME(m_waitmask)); save_item(NAME(m_pending_data)); save_item(NAME(m_pending_offset)); + save_item(NAME(m_xpos_state)); } @@ -235,6 +236,21 @@ void agnus_copper_device::copins_w(u16 data) void agnus_copper_device::vblank_sync() { set_pc(0, true); + m_xpos_state = 0; +} + +// check current copper cycle at end of scanline +// - auntaadv (gameplay), WAITs with $xxd9 +void agnus_copper_device::suspend_offset(int xpos, int hblank_width) +{ + m_xpos_state = (xpos == 511) ? 0 : xpos - hblank_width; +// std::assert(m_xpos_state > 0); +} + +// restore at start +int agnus_copper_device::restore_offset() +{ + return m_xpos_state; } // TODO: h/vblank checks against xpos/vpos diff --git a/src/mame/amiga/agnus_copper.h b/src/mame/amiga/agnus_copper.h index 06b0c866047aa..064b7ee6e8068 100644 --- a/src/mame/amiga/agnus_copper.h +++ b/src/mame/amiga/agnus_copper.h @@ -34,6 +34,8 @@ class agnus_copper_device : public device_t // getters/setters void vblank_sync(); int execute_next(int xpos, int ypos, bool is_blitter_busy, int num_planes); + void suspend_offset(int xpos, int hblank_width); + int restore_offset(); protected: // device-level overrides @@ -69,6 +71,7 @@ class agnus_copper_device : public device_t u16 m_waitmask; u16 m_pending_offset; u16 m_pending_data; + u16 m_xpos_state; }; diff --git a/src/mame/amiga/amiga_v.cpp b/src/mame/amiga/amiga_v.cpp index 557ebd9c419b3..552e9686da075 100644 --- a/src/mame/amiga/amiga_v.cpp +++ b/src/mame/amiga/amiga_v.cpp @@ -537,7 +537,7 @@ void amiga_state::render_scanline(bitmap_rgb32 &bitmap, int scanline) /* loop over the line */ // TODO: copper runs on odd timeslots - next_copper_x = 0; + next_copper_x = m_copper->restore_offset(); // FIXME: without the add this increment will skip bitplane ops // ddf_stop_pixel_max = 0xd8 * 2 = 432 + 17 + 15 + 1(*) = 465 > width / 2 (455) // (*) because there's a comparison with <= in the bitplane code. @@ -880,6 +880,8 @@ void amiga_state::render_scanline(bitmap_rgb32 &bitmap, int scanline) CUSTOM_REG_LONG(REG_BPL1PTH + pl * 2) += CUSTOM_REG_SIGNED(REG_BPL2MOD); } + m_copper->suspend_offset(next_copper_x, amiga_state::SCREEN_WIDTH / 2); + // restore color00 CUSTOM_REG(REG_COLOR00) = save_color0; diff --git a/src/mame/amiga/amigaaga.cpp b/src/mame/amiga/amigaaga.cpp index d94333433be79..30a51d902d1a2 100644 --- a/src/mame/amiga/amigaaga.cpp +++ b/src/mame/amiga/amigaaga.cpp @@ -528,7 +528,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) /* loop over the line */ // TODO: copper runs on odd timeslots - next_copper_x = 0; + next_copper_x = m_copper->restore_offset(); // TODO: verify where we're missing pixels here for the GFX pitch bitplane corruptions // - wbenc30 scrolling in lores mode (fmode=3, expects a +58!, verify ddfstrt) // - roadkill title (fmode=3, max +14), gameplay uses fmode=1 @@ -876,6 +876,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) pri = (sprpix >> 12); /* sprite has priority */ + // TODO: porting OCS alfred fix to AGA will break OCS rodland status bar (!?) if (sprpix && pf1pri > pri) { dst[x*2+0] = @@ -946,6 +947,8 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) } } + m_copper->suspend_offset(next_copper_x, amiga_state::SCREEN_WIDTH / 2); + /* restore color00 */ CUSTOM_REG(REG_COLOR00) = save_color0; From 4621f74889969b9c3ad396311df780a3f2fad424 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 17 Jan 2025 03:49:28 +1100 Subject: [PATCH 33/80] cpu/drcbearm64.cpp, src/drcbec.cpp: Fixed off-by-one errors in map variable handling. --- src/devices/cpu/drcbearm64.cpp | 1 + src/devices/cpu/drcbec.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/devices/cpu/drcbearm64.cpp b/src/devices/cpu/drcbearm64.cpp index fa625ba595399..5929c53583b3e 100644 --- a/src/devices/cpu/drcbearm64.cpp +++ b/src/devices/cpu/drcbearm64.cpp @@ -1625,6 +1625,7 @@ void drcbe_arm64::op_recover(a64::Assembler &a, const uml::instruction &inst) get_imm_relative(a, REG_PARAM1, m_drcmap_get_value.obj); a.ldr(REG_PARAM2, arm::Mem(a64::x29, -8)); // saved LR (x30) from first level CALLH/EXH or failed hash jump + a.sub(REG_PARAM2, REG_PARAM2, 4); a.mov(REG_PARAM3, inst.param(1).mapvar()); call_arm_addr(a, m_drcmap_get_value.func); diff --git a/src/devices/cpu/drcbec.cpp b/src/devices/cpu/drcbec.cpp index 8758b1989c739..d2fa0e744ab22 100644 --- a/src/devices/cpu/drcbec.cpp +++ b/src/devices/cpu/drcbec.cpp @@ -676,7 +676,7 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_RECOVER, 4, 0): // RECOVER dst,mapvar assert(sp > 0); - PARAM0 = m_map.get_value((drccodeptr)callstack[0], MAPVAR_M0 + PARAM1); + PARAM0 = m_map.get_value(drccodeptr(callstack[0] - 1), PARAM1); break; From f23ea9b46780a60ca39324345450a4736e60f186 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 16 Jan 2025 18:26:23 +0100 Subject: [PATCH 34/80] 4in1: fix explosion sound [Robbbert] --- src/mame/galaxian/galaxold.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/mame/galaxian/galaxold.cpp b/src/mame/galaxian/galaxold.cpp index 7a906d9cdc403..32ebed4a744ea 100644 --- a/src/mame/galaxian/galaxold.cpp +++ b/src/mame/galaxian/galaxold.cpp @@ -326,10 +326,7 @@ void galaxold_state::_4in1_map(address_map &map) map(0x6003, 0x6003).w(FUNC(galaxold_state::galaxold_coin_counter_w)); map(0x6004, 0x6007).w("cust", FUNC(galaxian_sound_device::lfo_freq_w)); map(0x6800, 0x6800).portr("IN1"); - map(0x6800, 0x6802).w("cust", FUNC(galaxian_sound_device::background_enable_w)); -// map(0x6803, 0x6803).w(FUNC(galaxold_state::galaxian_noise_enable_w)); // not hooked up? - map(0x6805, 0x6805).w("cust", FUNC(galaxian_sound_device::fire_enable_w)); - map(0x6806, 0x6807).w("cust", FUNC(galaxian_sound_device::vol_w)); + map(0x6800, 0x6807).w("cust", FUNC(galaxian_sound_device::sound_w)); map(0x7000, 0x7000).portr("DSW0"); map(0x7001, 0x7001).w(FUNC(galaxold_state::galaxold_nmi_enable_w)); map(0x7004, 0x7004).w(FUNC(galaxold_state::galaxold_stars_enable_w)); From 625f8df7a24c5382d88d21fd6968994eee8b850c Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Thu, 16 Jan 2025 18:29:57 +0100 Subject: [PATCH 35/80] New working clones ------------------ Cherry Master I (E-Z Spin Hands Count bootleg / hack, set 1) [Ioannis Bampoulas] Cherry Master I (E-Z Spin Hands Count bootleg / hack, set 2) [Ioannis Bampoulas] New systems marked not working ------------------------------ Skill Chance (W-7, set 1) [Ioannis Bampoulas] New clones marked not working ----------------------------- Skill Chance (W-7, set 2) [Ioannis Bampoulas] --- src/mame/igs/goldstar.cpp | 219 ++++++++++++++++++++++++++++++-------- src/mame/mame.lst | 6 +- 2 files changed, 180 insertions(+), 45 deletions(-) diff --git a/src/mame/igs/goldstar.cpp b/src/mame/igs/goldstar.cpp index a60acbc9b78f5..a44f7018fd15b 100644 --- a/src/mame/igs/goldstar.cpp +++ b/src/mame/igs/goldstar.cpp @@ -334,6 +334,7 @@ class goldstar_state : public driver_device void goldstar(machine_config &config); void goldstbl(machine_config &config); void feverch(machine_config &config); + void megaline(machine_config &config); void bonusch_portmap(address_map &map) ATTR_COLD; void feverch_portmap(address_map &map) ATTR_COLD; void feverch_map(address_map &map) ATTR_COLD; @@ -348,6 +349,7 @@ class goldstar_state : public driver_device void common_decrypted_opcodes_map(address_map &map) ATTR_COLD; void super972_decrypted_opcodes_map(address_map &map) ATTR_COLD; void mbstar_map(address_map &map) ATTR_COLD; + void megaline_map(address_map &map) ATTR_COLD; void megaline_portmap(address_map &map) ATTR_COLD; void ncb3_readwriteport(address_map &map) ATTR_COLD; void nfm_map(address_map &map) ATTR_COLD; @@ -459,6 +461,7 @@ class cmaster_state : public goldstar_state void init_cll(); void init_animalhs(); void init_eldoraddoa(); + void init_cmezspina(); template void init_tsk(); uint32_t screen_update_amcoe1a(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); @@ -686,13 +689,11 @@ class unkch_state : public goldstar_state void vblank_irq(int state); - void megaline(machine_config &config); void unkch(machine_config &config); void bonusch(machine_config &config); void rolling(machine_config &config); void bonusch_map(address_map &map) ATTR_COLD; - void megaline_map(address_map &map) ATTR_COLD; void unkch_map(address_map &map) ATTR_COLD; void unkch_portmap(address_map &map) ATTR_COLD; protected: @@ -2778,47 +2779,43 @@ void unkch_state::unkch_portmap(address_map &map) } -void unkch_state::megaline_map(address_map &map) +void goldstar_state::megaline_map(address_map &map) { -/* Reels stuff are there just as placeholder, and obviously in wrong offset */ map(0x0000, 0x9fff).rom(); - map(0xd000, 0xd7ff).ram(); //.share("nvram"); - - map(0xd840, 0xd87f).ram().share("reel1_scroll"); - map(0xd880, 0xd8bf).ram().share("reel2_scroll"); - map(0xd900, 0xd93f).ram().share("reel3_scroll"); - map(0xdfc0, 0xdfff).ram(); + map(0xd000, 0xd03f).ram().share("reel1_scroll"); + map(0xd200, 0xd23f).ram().share("reel2_scroll"); + map(0xd400, 0xd43f).ram().share("reel3_scroll"); - map(0xe000, 0xe7ff).ram().w(FUNC(unkch_state::fg_vidram_w)).share("fg_vidram"); - map(0xe800, 0xefff).ram().w(FUNC(unkch_state::fg_atrram_w)).share("fg_atrram"); + map(0xd800, 0xd9ff).ram().w(FUNC(goldstar_state::goldstar_reel1_ram_w)).share("reel1_ram"); + map(0xda00, 0xdbff).ram().w(FUNC(goldstar_state::goldstar_reel2_ram_w)).share("reel2_ram"); + map(0xdc00, 0xddff).ram().w(FUNC(goldstar_state::goldstar_reel3_ram_w)).share("reel3_ram"); + map(0xde00, 0xdfff).ram(); - map(0xf000, 0xf1ff).ram().w(FUNC(unkch_state::goldstar_reel1_ram_w)).share("reel1_ram"); - map(0xf200, 0xf3ff).ram().w(FUNC(unkch_state::goldstar_reel2_ram_w)).share("reel2_ram"); - map(0xf400, 0xf5ff).ram().w(FUNC(unkch_state::goldstar_reel3_ram_w)).share("reel3_ram"); - map(0xf600, 0xf7ff).ram(); - map(0xf800, 0xf9ff).ram().w(FUNC(unkch_state::reel1_attrram_w)).share("reel1_attrram"); - map(0xfa00, 0xfbff).ram().w(FUNC(unkch_state::reel2_attrram_w)).share("reel2_attrram"); - map(0xfc00, 0xfdff).ram().w(FUNC(unkch_state::reel3_attrram_w)).share("reel3_attrram"); - map(0xfe00, 0xffff).ram(); + map(0xe000, 0xe7ff).ram().w(FUNC(goldstar_state::fg_vidram_w)).share("fg_vidram"); + map(0xe800, 0xefff).ram().w(FUNC(goldstar_state::fg_atrram_w)).share("fg_atrram"); + map(0xf000, 0xf7ff).ram(); + map(0xf800, 0xffff).ram(); } /* unknown I/O byte R/W PSGs: A0 - C0 - E0 - AY8910?: 60 - 80 */ -void goldstar_state::megaline_portmap(address_map &map) +void goldstar_state::megaline_portmap(address_map &map) // TODO: verify everything. Strange reads at 0x0f and 0x07- { map.global_mask(0xff); - map(0xa0, 0xa0).w("sn1", FUNC(sn76489_device::write)); /* SN76489 #1 */ - map(0xc0, 0xc0).w("sn2", FUNC(sn76489_device::write)); /* SN76489 #2 */ - map(0xe0, 0xe0).w("sn3", FUNC(sn76489_device::write)); /* SN76489 #3 */ - map(0x60, 0x60).w("aysnd", FUNC(ay8910_device::address_w)); /* AY8910 control? */ - map(0x80, 0x80).rw("aysnd", FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w)); /* AY8910 Input? */ -// map(0x01, 0x01).r("aysnd", FUNC(ay8910_device::data_r)); -// map(0x02, 0x03).w("aysnd", FUNC(ay8910_device::data_address_w)); + map(0x20, 0x20).portr("IN0").nopw(); // ?? + map(0x40, 0x40).portr("IN1").nopw(); // ?? + map(0x60, 0x60).portr("IN2").nopw(); // ?? + map(0x80, 0x80).portr("IN3").nopw(); // ?? + map(0xa0, 0xa0).portr("IN4").w("sn1", FUNC(sn76489_device::write)); + map(0xc0, 0xc0).portr("DSW1").w("sn2", FUNC(sn76489_device::write)); + map(0xe0, 0xe0).portr("DSW2").w("sn3", FUNC(sn76489_device::write)); + map(0xe1, 0xe1).portr("DSW3"); + map(0xe2, 0xe2).portr("DSW4"); + //map(0xe3, 0xe3).portr("DSW5"); } @@ -11354,16 +11351,12 @@ void cmaster_state::eldoraddoa(machine_config &config) m_maincpu->set_addrmap(AS_IO, &cmaster_state::eldoraddoa_portmap); } -void unkch_state::megaline(machine_config &config) +void goldstar_state::megaline(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, CPU_CLOCK); - m_maincpu->set_addrmap(AS_PROGRAM, &unkch_state::megaline_map); - m_maincpu->set_addrmap(AS_IO, &unkch_state::megaline_portmap); - - //I8255A(config, m_ppi[0], 0); - //I8255A(config, m_ppi[1], 0); - //I8255A(config, m_ppi[2], 0); + m_maincpu->set_addrmap(AS_PROGRAM, &goldstar_state::megaline_map); + m_maincpu->set_addrmap(AS_IO, &goldstar_state::megaline_portmap); /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); @@ -11388,13 +11381,6 @@ void unkch_state::megaline(machine_config &config) SN76489(config, "sn2", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80); SN76489(config, "sn3", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80); - - ay8910_device &aysnd(AY8910(config, "aysnd", AY_CLOCK)); - aysnd.port_a_read_callback().set_ioport("DSW3"); - aysnd.port_b_read_callback().set_ioport("DSW4"); - aysnd.port_a_write_callback().set(FUNC(goldstar_state::ay8910_outputa_w)); - aysnd.port_b_write_callback().set(FUNC(goldstar_state::ay8910_outputb_w)); - aysnd.add_route(ALL_OUTPUTS, "mono", 0.50); } @@ -12853,6 +12839,76 @@ ROM_START( cmezspin ) ROM_END +ROM_START( cmezspina ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ezspinhcv2.rom", 0x0000, 0x1000, CRC(5203f088) SHA1(2ac2e32350661dc54fb78cff5543d68bda072614) ) + ROM_CONTINUE( 0x4000, 0x1000 ) + ROM_CONTINUE( 0x3000, 0x1000 ) + ROM_CONTINUE( 0x7000, 0x1000 ) + ROM_CONTINUE( 0x1000, 0x1000 ) + ROM_CONTINUE( 0x6000, 0x1000 ) + ROM_CONTINUE( 0x2000, 0x1000 ) + ROM_CONTINUE( 0x5000, 0x1000 ) + + // only the program ROM was provided, but dumper's readme says everything else matches cmezspin set + ROM_REGION( 0x18000, "gfx1", 0 ) + ROM_LOAD( "u16.7", 0x00000, 0x8000, CRC(19cc1d67) SHA1(47487f9362bfb36a32100ed772960628844462bf) ) + ROM_LOAD( "u11.6", 0x08000, 0x8000, CRC(c1466efa) SHA1(d725fc507c77e66bde93d0c33bf469add15f39b9) ) + ROM_LOAD( "u4.5", 0x10000, 0x8000, CRC(e39fff9c) SHA1(22fdc517fa478441622c6245cecb5728c5595757) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "u15.4", 0x0000, 0x2000, CRC(8607ffd9) SHA1(9bc94715554aa2473ae2ed249a47f29c7886b3dc) ) + ROM_LOAD( "u10.3", 0x2000, 0x2000, CRC(c32367be) SHA1(ff217021b9c58e23b2226f8b0a7f5da966225715) ) + ROM_LOAD( "u14.2", 0x4000, 0x2000, CRC(6dfcb188) SHA1(22430429c798954d9d979e62699b58feae7fdbf4) ) + ROM_LOAD( "u9.1", 0x6000, 0x2000, CRC(9678ead2) SHA1(e80aefa98b2363fe9e6b2415762695ace272e4d3) ) + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_LOAD( "u53.8", 0x0000, 0x10000, CRC(e92443d3) SHA1(4b6ca4521841610054165f085ae05510e77af191) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "82s129.u84", 0x0000, 0x0100, CRC(0489b760) SHA1(78f8632b17a76335183c5c204cdec856988368b0) ) + ROM_LOAD( "82s129.u79", 0x0100, 0x0100, CRC(21eb5b19) SHA1(9b8425bdb97f11f4855c998c7792c3291fd07470) ) + + ROM_REGION( 0x100, "proms2", 0 ) + ROM_LOAD( "82s129.u46", 0x0000, 0x0100, CRC(50ec383b) SHA1(ae95b92bd3946b40134bcdc22708d5c6b0f4c23e) ) +ROM_END + + +ROM_START( cmezspinb ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ezspinhcv3.rom", 0x0000, 0x1000, CRC(1c7538f8) SHA1(ca458e45161284e6cb7ad7a66d799cd93bfdeb93) ) + ROM_CONTINUE( 0x4000, 0x1000 ) + ROM_CONTINUE( 0x3000, 0x1000 ) + ROM_CONTINUE( 0x7000, 0x1000 ) + ROM_CONTINUE( 0x1000, 0x1000 ) + ROM_CONTINUE( 0x6000, 0x1000 ) + ROM_CONTINUE( 0x2000, 0x1000 ) + ROM_CONTINUE( 0x5000, 0x1000 ) + + // only the program ROM was provided, but dumper's readme says everything else matches cmezspin set + ROM_REGION( 0x18000, "gfx1", 0 ) + ROM_LOAD( "u16.7", 0x00000, 0x8000, CRC(19cc1d67) SHA1(47487f9362bfb36a32100ed772960628844462bf) ) + ROM_LOAD( "u11.6", 0x08000, 0x8000, CRC(c1466efa) SHA1(d725fc507c77e66bde93d0c33bf469add15f39b9) ) + ROM_LOAD( "u4.5", 0x10000, 0x8000, CRC(e39fff9c) SHA1(22fdc517fa478441622c6245cecb5728c5595757) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "u15.4", 0x0000, 0x2000, CRC(8607ffd9) SHA1(9bc94715554aa2473ae2ed249a47f29c7886b3dc) ) + ROM_LOAD( "u10.3", 0x2000, 0x2000, CRC(c32367be) SHA1(ff217021b9c58e23b2226f8b0a7f5da966225715) ) + ROM_LOAD( "u14.2", 0x4000, 0x2000, CRC(6dfcb188) SHA1(22430429c798954d9d979e62699b58feae7fdbf4) ) + ROM_LOAD( "u9.1", 0x6000, 0x2000, CRC(9678ead2) SHA1(e80aefa98b2363fe9e6b2415762695ace272e4d3) ) + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_LOAD( "u53.8", 0x0000, 0x10000, CRC(e92443d3) SHA1(4b6ca4521841610054165f085ae05510e77af191) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "82s129.u84", 0x0000, 0x0100, CRC(0489b760) SHA1(78f8632b17a76335183c5c204cdec856988368b0) ) + ROM_LOAD( "82s129.u79", 0x0100, 0x0100, CRC(21eb5b19) SHA1(9b8425bdb97f11f4855c998c7792c3291fd07470) ) + + ROM_REGION( 0x100, "proms2", 0 ) + ROM_LOAD( "82s129.u46", 0x0000, 0x0100, CRC(50ec383b) SHA1(ae95b92bd3946b40134bcdc22708d5c6b0f4c23e) ) +ROM_END + + ROM_START( cmasterc ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "msii841.u81", 0x3000, 0x1000, CRC(977db602) SHA1(0fd3d6781b654ac6befdc9278f84ca708d5d448c) ) @@ -19832,6 +19888,56 @@ ROM_START( megaline ) ROM_LOAD( "tbp24s10.m3", 0x0000, 0x0100, CRC(7edb311b) SHA1(8e7f933313dc7a1f2a5e8803c26953ced3f798d0) ) ROM_END +ROM_START( skillch ) // same PCB as megaline + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "16.r1", 0x00000, 0x10000, CRC(c0fee794) SHA1(0f0c268dc4e9370929948e66e4db4fb95108a00b) ) + + ROM_REGION( 0x20000, "gfx1", 0 ) + ROM_LOAD( "1.b1", 0x00000, 0x10000, CRC(c2554538) SHA1(ecb5ab7f611b937a5ff6dc26c6b0cb18b82acd93) ) + ROM_LOAD( "2.d1", 0x10000, 0x10000, CRC(a7eb57bf) SHA1(1346b03f9540d9235c5ca41f328c39b9ac9c3b17) ) + + ROM_REGION( 0x10000, "gfx2", 0 ) + ROM_LOAD( "3.j1", 0x0000, 0x8000, CRC(1cbaaae6) SHA1(d56bb5a6a466bc74d5bbb2ba6f52a5ae8b0748a3) ) // 1ST AND 2ND HALF IDENTICAL + ROM_IGNORE( 0x8000 ) + ROM_LOAD( "4.k1", 0x8000, 0x8000, CRC(9640841d) SHA1(421c78148884029e15a126652679fde990a24064) ) // 1ST AND 2ND HALF IDENTICAL + ROM_IGNORE( 0x8000 ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "tbp24s10n.f4", 0x0000, 0x0100, CRC(d864b6f1) SHA1(6edc1941fe49cf53f073bf4acc466cd28b788146) ) + ROM_LOAD( "tbp24s10n.h4", 0x0100, 0x0100, CRC(4acd5887) SHA1(dca1187a74d9f4abc53b77a1590ec726f682dd91) ) + + ROM_REGION( 0x100, "proms2", 0 ) + ROM_LOAD( "tbp18s030n.j4", 0x0000, 0x0020, CRC(abda0acb) SHA1(b1781f4c2a54e40eb83ea315d23b3f3f0019aaf8) ) + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "tbp24s10n.m3", 0x0000, 0x0100, CRC(7edb311b) SHA1(8e7f933313dc7a1f2a5e8803c26953ced3f798d0) ) +ROM_END + +ROM_START( skillcha ) // same PCB as megaline + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "16.r1", 0x00000, 0x10000, CRC(7364624f) SHA1(55b54d92bc76060d88f78aca98e935953a7c9e22) ) + + ROM_REGION( 0x20000, "gfx1", 0 ) + ROM_LOAD( "1.b1", 0x00000, 0x10000, CRC(c2554538) SHA1(ecb5ab7f611b937a5ff6dc26c6b0cb18b82acd93) ) + ROM_LOAD( "2.d1", 0x10000, 0x10000, CRC(a7eb57bf) SHA1(1346b03f9540d9235c5ca41f328c39b9ac9c3b17) ) + + ROM_REGION( 0x10000, "gfx2", 0 ) + ROM_LOAD( "3.j1", 0x0000, 0x8000, CRC(1cbaaae6) SHA1(d56bb5a6a466bc74d5bbb2ba6f52a5ae8b0748a3) ) // 1ST AND 2ND HALF IDENTICAL + ROM_IGNORE( 0x8000 ) + ROM_LOAD( "4.k1", 0x8000, 0x8000, CRC(9640841d) SHA1(421c78148884029e15a126652679fde990a24064) ) // 1ST AND 2ND HALF IDENTICAL + ROM_IGNORE( 0x8000 ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "tbp24s10n.f4", 0x0000, 0x0100, CRC(d864b6f1) SHA1(6edc1941fe49cf53f073bf4acc466cd28b788146) ) + ROM_LOAD( "tbp24s10n.h4", 0x0100, 0x0100, CRC(4acd5887) SHA1(dca1187a74d9f4abc53b77a1590ec726f682dd91) ) + + ROM_REGION( 0x100, "proms2", 0 ) + ROM_LOAD( "tbp18s030n.j4", 0x0000, 0x0020, CRC(abda0acb) SHA1(b1781f4c2a54e40eb83ea315d23b3f3f0019aaf8) ) + + ROM_REGION( 0x100, "unkprom", 0 ) + ROM_LOAD( "tbp24s10n.m3", 0x0000, 0x0100, CRC(7edb311b) SHA1(8e7f933313dc7a1f2a5e8803c26953ced3f798d0) ) +ROM_END + /* Bonus Chance (W-8). Wing Co. Ltd. @@ -23177,6 +23283,26 @@ void wingco_state::init_cb2() rom[a] = bitswap<8>(rom[a], 6, 7, 5, 4, 3, 2, 1, 0); } +void cmaster_state::init_cmezspina() +{ + uint8_t *rom = memregion("maincpu")->base(); + for (int i = 0; i < 0x8000; i++) + { + uint8_t x = rom[i]; + switch (i & 0x12) + { + case 0x00: x = bitswap<8>(x ^ 0x24, 2, 1, 0, 7, 6, 5, 4, 3); break; + case 0x02: x = bitswap<8>(x ^ 0x4d, 0, 7, 6, 5, 4, 3, 2, 1); break; + case 0x10: x = bitswap<8>(x ^ 0x3e, 1, 0, 7, 6, 5, 4, 3, 2); break; + case 0x12: x = bitswap<8>(x ^ 0xbb, 4, 3, 2, 1, 0, 7, 6, 5); break; + } + + rom[i] = x; + } + + init_cmv4(); +} + } // anonymous namespace @@ -23240,6 +23366,8 @@ GAMEL( 1995, 3cdpokera, 3cdpoker, cm, cmtetris, cmaster_state, empty_ini GAMEL( 1991, cmaster, 0, cm, cmaster, cmaster_state, empty_init, ROT0, "Dyna", "Cherry Master I (ver.1.01, set 1)", 0, layout_cmaster ) GAMEL( 1991, cmasterb, cmaster, cm, cmasterb, cmaster_state, init_cmv4, ROT0, "Dyna", "Cherry Master I (ver.1.01, set 2)", 0, layout_cmasterb ) GAMEL( 1991, cmezspin, cmaster, cm, cmezspin, cmaster_state, init_cmv4, ROT0, "Dyna", "Cherry Master I (E-Z Spin bootleg / hack)", 0, layout_cmezspin ) // CM Fruit Bonus 55 ver.2 bootleg/hack +GAMEL( 199?, cmezspina, cmaster, cm, cmezspin, cmaster_state, init_cmezspina, ROT0, "bootleg", "Cherry Master I (E-Z Spin Hands Count bootleg / hack, set 1)", 0, layout_cmezspin ) +GAMEL( 199?, cmezspinb, cmaster, cm, cmezspin, cmaster_state, init_cmezspina, ROT0, "bootleg", "Cherry Master I (E-Z Spin Hands Count bootleg / hack, set 2)", 0, layout_cmezspin ) GAMEL( 1991, cmasterc, cmaster, cmasterc, cmasterc, cmaster_state, init_cmv4, ROT0, "Dyna", "Cherry Master I (ver.1.01, set 3)", 0, layout_cmasterc ) GAMEL( 1991, cmasterbv, cmaster, cm, cmasterb, cmaster_state, init_cmv4, ROT0, "Dyna", "Cherry Master I (ver.1.01, set 4, with Blitz Poker ROM?)", MACHINE_NOT_WORKING, layout_cmasterb ) // Cherry Master works, but no idea how to use the Blitz ROM GAMEL( 1991, cmasterd, cmaster, cm, cmasterb, cmaster_state, init_cmv4, ROT0, "Dyna", "Cherry Master I (ver.1.01, set 5)", 0, layout_cmasterb ) @@ -23337,7 +23465,6 @@ GAMEL( 1990, cbaai, 0, lucky8, lucky8, wingco_state, empty_ini GAMEL( 199?, ttactoe, 0, lucky8, lucky8, wingco_state, empty_init, ROT0, "bootleg (Sundance)","Tic Tac Toe (Sundance bootleg of New Lucky 8 Lines)", MACHINE_NOT_WORKING, layout_lucky8 ) // I/O need to be checked, seems reasonably working GAME( 1985, luckylad, 0, luckylad, luckylad, wingco_state, empty_init, ROT0, "Wing Co., Ltd.", "Lucky Lady (Wing, encrypted)", MACHINE_NOT_WORKING | MACHINE_WRONG_COLORS ) // controls / dips, colors not correctly decoded -GAME( 1991, megaline, 0, megaline, megaline, unkch_state, empty_init, ROT0, "Fun World", "Mega Lines", MACHINE_NOT_WORKING ) GAMEL( 1993, bingowng, 0, bingowng, bingowng, wingco_state, empty_init, ROT0, "Wing Co., Ltd.", "Bingo (set 1)", 0, layout_bingowng ) GAMEL( 1993, bingownga, bingowng, bingownga,bingownga,wingco_state, empty_init, ROT0, "Wing Co., Ltd.", "Bingo (set 2)", 0, layout_bingowng ) @@ -23359,6 +23486,10 @@ GAME( 1986, feverch, 0, feverch, feverch, goldstar_state, empty_ini GAME( 1986, fevercha, feverch, feverch, feverch, goldstar_state, empty_init, ROT0, "Wing Co., Ltd.", "Fever Chance (W-6, Japan, set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) // unimplemented arithmetic chip, reels scrolling, I/O GAME( 1986, feverchtw, feverch, feverch, feverch, goldstar_state, empty_init, ROT0, "Yamate", "Fever Chance (W-6, Taiwan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) // reels scrolling, I/O +// --- Wing W-7 hardware --- +GAME( 1986, skillch, 0, megaline, megaline, goldstar_state, empty_init, ROT0, "Wing Co., Ltd.", "Skill Chance (W-7, set 1)", MACHINE_NOT_WORKING ) // not looked at yet +GAME( 1986, skillcha, skillch, megaline, megaline, goldstar_state, empty_init, ROT0, "Wing Co., Ltd.", "Skill Chance (W-7, set 2)", MACHINE_NOT_WORKING ) // " +GAME( 1991, megaline, 0, megaline, megaline, goldstar_state, empty_init, ROT0, "Fun World", "Mega Lines", MACHINE_NOT_WORKING ) // " // --- Wing W-8 hardware --- GAME( 1990, bonusch, 0, bonusch, bonusch, unkch_state, empty_init, ROT0, "Wing Co., Ltd.", "Bonus Chance (W-8, set 1)", MACHINE_NOT_WORKING ) // M80C51F MCU diff --git a/src/mame/mame.lst b/src/mame/mame.lst index d6222863af618..b8bd65c2d4d95 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -20204,7 +20204,9 @@ cmasteri // (c) 1991 Dyna Electronics cmasterj // (c) 1991 Dyna Electronics cmasterk // (c) 1991 Dyna Electronics cmasterl // (c) 1991 Dyna Electronics -cmezspin // (c) 1991 Dyna Electronics +cmezspin // bootleg +cmezspina // bootleg +cmezspinb // bootleg cmfb55 // bootleg cmfun // (c) 1995 Dyna Electronics cmpacman // @@ -20349,6 +20351,8 @@ schery97 // (c) 1998 Amcoe schery97a // (c) 1998 Amcoe scmaster // 1994, unknown skill98 // (c) 1998 Amcoe +skillch // +skillcha // srmagic // bootleg ss2001 // bootleg / hack star100 // (c) 199? Sang Ho From cf04431cb9362fe4a57b90ce839471c375dc7827 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 16 Jan 2025 21:15:52 +0100 Subject: [PATCH 36/80] raizing_batrider: hook up z80 busrq pin --- src/devices/cpu/z80/z80.h | 4 + src/devices/cpu/z80/z80.lst | 12 +-- src/mame/toaplan/raizing.cpp | 4 +- src/mame/toaplan/raizing.h | 4 +- src/mame/toaplan/raizing_batrider.cpp | 149 +++++++++++--------------- 5 files changed, 75 insertions(+), 98 deletions(-) diff --git a/src/devices/cpu/z80/z80.h b/src/devices/cpu/z80/z80.h index 0db8b93c7599c..eadaae4ba07e1 100644 --- a/src/devices/cpu/z80/z80.h +++ b/src/devices/cpu/z80/z80.h @@ -49,6 +49,10 @@ class z80_device : public cpu_device, public z80_daisy_chain_interface auto irqfetch_cb() { return m_irqfetch_cb.bind(); } auto reti_cb() { return m_reti_cb.bind(); } + // output pins state + int halt_r() { return m_halt; } + int busack_r() { return m_busack_state; } + protected: z80_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); diff --git a/src/devices/cpu/z80/z80.lst b/src/devices/cpu/z80/z80.lst index 360401242cc21..95427589e9271 100644 --- a/src/devices/cpu/z80/z80.lst +++ b/src/devices/cpu/z80/z80.lst @@ -85,13 +85,13 @@ macro push macro jp call arg16 PC = TDAT; WZ = PC; - m_branch_cb(true); + m_branch_cb(1); macro jp_cond if (TDAT8) { call arg16 PC = TDAT; WZ = PC; - m_branch_cb(true); + m_branch_cb(1); } else { // implicit do PC += 2 call arg16 @@ -103,7 +103,7 @@ macro jr TADR = PC-1; 5 * call nomreq_addr PC += (s8)TDAT8; WZ = PC; - m_branch_cb(true); + m_branch_cb(1); macro r800:jr call arg @@ -167,7 +167,7 @@ macro z80n:retn macro reti call pop PC = TDAT; WZ = PC; m_iff1 = m_iff2; - m_reti_cb(true); + m_reti_cb(1); daisy_call_reti_device(); macro ld_r_a @@ -535,11 +535,11 @@ macro take_interrupt m_iff1 = m_iff2 = 0; // say hi // Not precise in all cases. z80 must finish current instruction (NOP) to reach this state - in such case frame timings are shifter from cb event if calculated based on it. - m_irqack_cb(true); + m_irqack_cb(1); m_r++; { // fetch the IRQ vector - m_irqfetch_cb(true); + m_irqfetch_cb(1); device_z80daisy_interface *intf = daisy_get_irq_device(); m_tmp_irq_vector = (intf != nullptr) ? intf->z80daisy_irq_ack() : standard_irq_callback(0, m_pc.w); LOGMASKED(LOG_INT, "single INT m_tmp_irq_vector $%02x\n", m_tmp_irq_vector); diff --git a/src/mame/toaplan/raizing.cpp b/src/mame/toaplan/raizing.cpp index 35857f08b3ab3..813745dde78a0 100644 --- a/src/mame/toaplan/raizing.cpp +++ b/src/mame/toaplan/raizing.cpp @@ -222,7 +222,7 @@ void raizing_base_state::raizing_oki_bankswitch_w(offs_t offset, u8 data) m_raizing_okibank[(offset & 4) >> 2][4 + (offset & 3)]->set_entry(data & 0xf); } -void raizing_base_state::common_bgaregga_reset() +void raizing_base_state::raizing_oki_reset() { for (int chip = 0; chip < 2; chip++) { @@ -747,7 +747,7 @@ void bgaregga_state::machine_reset() { raizing_base_state::machine_reset(); - common_bgaregga_reset(); + raizing_oki_reset(); } void sstriker_state::mahoudai_68k_mem(address_map &map) diff --git a/src/mame/toaplan/raizing.h b/src/mame/toaplan/raizing.h index 5581077073839..61b8c6ef9d62a 100644 --- a/src/mame/toaplan/raizing.h +++ b/src/mame/toaplan/raizing.h @@ -60,7 +60,7 @@ class raizing_base_state : public driver_device void raizing_z80_bankswitch_w(u8 data); void raizing_oki_bankswitch_w(offs_t offset, u8 data); void install_raizing_okibank(int chip); - void common_bgaregga_reset(); + void raizing_oki_reset(); void common_mem(address_map &map, offs_t rom_limit) ATTR_COLD; @@ -100,7 +100,7 @@ class raizing_base_state : public driver_device optional_memory_bank_array<8> m_raizing_okibank[2]; optional_shared_ptr m_shared_ram; // 8 bit RAM shared between 68K and sound CPU required_device m_maincpu; - optional_device m_audiocpu; + optional_device m_audiocpu; required_device m_vdp; optional_device_array m_oki; optional_device m_gfxdecode; diff --git a/src/mame/toaplan/raizing_batrider.cpp b/src/mame/toaplan/raizing_batrider.cpp index 2d06f9dde6b69..e99cfc7f44d1c 100644 --- a/src/mame/toaplan/raizing_batrider.cpp +++ b/src/mame/toaplan/raizing_batrider.cpp @@ -159,7 +159,6 @@ class batrider_state : public raizing_base_state void init_batrider() ATTR_COLD; protected: - virtual void machine_start() override ATTR_COLD; virtual void machine_reset() override ATTR_COLD; virtual void video_start() override ATTR_COLD; @@ -174,8 +173,8 @@ class batrider_state : public raizing_base_state void batrider_soundlatch_w(u8 data); void batrider_soundlatch2_w(u8 data); void batrider_unknown_sound_w(u16 data); - void batrider_clear_sndirq_w(u16 data); - void batrider_sndirq_w(u8 data); + template void batrider_clear_sndirq_w(u16 data); + template void batrider_sndirq_w(u8 data); void batrider_clear_nmi_w(u8 data); void batrider_tx_gfxram_w(offs_t offset, u16 data, u16 mem_mask = ~0); void batrider_textdata_dma_w(u16 data); @@ -183,14 +182,11 @@ class batrider_state : public raizing_base_state void batrider_objectbank_w(offs_t offset, u8 data); void batrider_bank_cb(u8 layer, u32 &code); - required_device m_dma_space; required_shared_ptr m_mainram; optional_region_ptr m_z80_rom; - u16 m_gfxrom_bank[8]{}; /* Batrider object bank */ - u8 m_sndirq_line = 0; /* IRQ4 for batrider, IRQ2 for bbakraid */ - u8 m_z80_busreq = 0; + u16 m_gfxrom_bank[8] = { }; // Batrider object bank }; @@ -205,8 +201,6 @@ class bbakraid_state : public batrider_state void bbakraid(machine_config &config) ATTR_COLD; - void init_bbakraid() ATTR_COLD; - private: void bbakraid_68k_mem(address_map &map) ATTR_COLD; void bbakraid_sound_z80_mem(address_map &map) ATTR_COLD; @@ -240,7 +234,6 @@ class nprobowl_state : public batrider_state void batrider_state::batrider_tx_gfxram_w(offs_t offset, u16 data, u16 mem_mask) { /*** Dynamic GFX decoding for Batrider / Battle Bakraid ***/ - const u16 oldword = m_tx_gfxram[offset]; if (oldword != data) @@ -298,29 +291,28 @@ void batrider_state::video_start() m_vdp->disable_sprite_buffer(); // disable buffering on this game - /* Create the Text tilemap for this game */ + // Create the Text tilemap for this game m_gfxdecode->gfx(0)->set_source(reinterpret_cast(m_tx_gfxram.target())); create_tx_tilemap(0x1d4, 0x16b); - /* Has special banking */ + // Has special banking save_item(NAME(m_gfxrom_bank)); } u16 batrider_state::batrider_z80_busack_r() { - // Bit 0x01 returns the status of BUSAK from the Z80. - // These accesses are made when the 68K wants to read the Z80 - // ROM code. Failure to return the correct status incurrs a Sound Error. - - return m_z80_busreq; // Loop BUSRQ to BUSAK + // bit 0x01 returns the status of BUSACK from the Z80 + return m_audiocpu->busack_r(); } void batrider_state::batrider_z80_busreq_w(u8 data) { - m_z80_busreq = (data & 0x01); // see batrider_z80_busack_r above + // bit 0x01 sets Z80 BUSRQ, when the 68K wants to read the Z80 ROM code + m_audiocpu->set_input_line(Z80_INPUT_LINE_BUSRQ, (data & 0x01) ? ASSERT_LINE : CLEAR_LINE); + machine().scheduler().perfect_quantum(attotime::from_usec(10)); } @@ -332,14 +324,14 @@ u16 batrider_state::batrider_z80rom_r(offs_t offset) // these two latches are always written together, via a single move.l instruction void batrider_state::batrider_soundlatch_w(u8 data) { - m_soundlatch[0]->write(data & 0xff); + m_soundlatch[0]->write(data); m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } void batrider_state::batrider_soundlatch2_w(u8 data) { - m_soundlatch[1]->write(data & 0xff); + m_soundlatch[1]->write(data); m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } @@ -349,19 +341,18 @@ void batrider_state::batrider_unknown_sound_w(u16 data) // for bbakraid this is on every sound command; for batrider, only on certain commands } - +template void batrider_state::batrider_clear_sndirq_w(u16 data) { - // not sure whether this is correct - // the 68K writes here during the sound IRQ handler, and nowhere else... - m_maincpu->set_input_line(m_sndirq_line, CLEAR_LINE); + // not sure whether this is correct, the 68K writes here during the sound IRQ handler, and nowhere else... + m_maincpu->set_input_line(Line, CLEAR_LINE); } - +template void batrider_state::batrider_sndirq_w(u8 data) { - // if batrider_clear_sndirq_w() is correct, should this be ASSERT_LINE? - m_maincpu->set_input_line(m_sndirq_line, HOLD_LINE); + // IRQ4 for batrider, IRQ2 for bbakraid + m_maincpu->set_input_line(Line, ASSERT_LINE); } @@ -373,16 +364,8 @@ void batrider_state::batrider_clear_nmi_w(u8 data) u16 bbakraid_state::bbakraid_eeprom_r() { - // Bit 0x01 returns the status of BUSAK from the Z80. - // BUSRQ is activated via bit 0x10 on the EEPROM write port. - // These accesses are made when the 68K wants to read the Z80 - // ROM code. Failure to return the correct status incurrs a Sound Error. - - u8 data; - data = ((m_eeprom->do_read() & 0x01) << 4); - data |= ((m_z80_busreq >> 4) & 0x01); // Loop BUSRQ to BUSAK - - return data; + // bit 0x01 returns the status of BUSACK from the Z80 + return ((m_eeprom->do_read() & 0x01) << 4) | m_audiocpu->busack_r(); } @@ -393,14 +376,9 @@ void bbakraid_state::bbakraid_eeprom_w(u8 data) m_eepromout->write(data, 0xff); - m_z80_busreq = data & 0x10; // see bbakraid_eeprom_r above -} - -void batrider_state::machine_start() -{ - raizing_base_state::machine_start(); - - save_item(NAME(m_z80_busreq)); + // bit 0x10 sets Z80 BUSRQ, when the 68K wants to read the Z80 ROM code + m_audiocpu->set_input_line(Z80_INPUT_LINE_BUSRQ, (data & 0x10) ? ASSERT_LINE : CLEAR_LINE); + machine().scheduler().perfect_quantum(attotime::from_usec(10)); } @@ -413,7 +391,7 @@ void batrider_state::machine_reset() { raizing_base_state::machine_reset(); - common_bgaregga_reset(); + raizing_oki_reset(); } static INPUT_PORTS_START( batrider ) @@ -512,7 +490,7 @@ static INPUT_PORTS_START( batrider ) PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW3:!4") PORT_DIPSETTING( 0x0800, DEF_STR( No ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x1000, 0x0000, "Invulnerability (Cheat)" ) PORT_DIPLOCATION("SW3:!5") + PORT_DIPNAME( 0x1000, 0x0000, "Invulnerability (Cheat)" ) PORT_DIPLOCATION("SW3:!5") PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x1000, DEF_STR( On ) ) // These dips are shown only when Coin_A is set to Free_Play, but they work in normal play mode too @@ -549,7 +527,7 @@ static INPUT_PORTS_START( bbakraid ) PORT_INCLUDE( batrider ) PORT_MODIFY("DSW") // DSWA and DSWB - PORT_DIPNAME( 0xc000, 0x0000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!7,!8") + PORT_DIPNAME( 0xc000, 0x0000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!7,!8") PORT_DIPSETTING( 0xc000, DEF_STR( None ) ) PORT_DIPSETTING( 0x8000, "Every 4000k" ) PORT_DIPSETTING( 0x4000, "Every 3000k" ) @@ -672,7 +650,7 @@ void batrider_state::batrider_68k_mem(address_map &map) map(0x500021, 0x500021).w(FUNC(batrider_state::batrider_soundlatch_w)); map(0x500023, 0x500023).w(FUNC(batrider_state::batrider_soundlatch2_w)); map(0x500024, 0x500025).w(FUNC(batrider_state::batrider_unknown_sound_w)); - map(0x500026, 0x500027).w(FUNC(batrider_state::batrider_clear_sndirq_w)); + map(0x500026, 0x500027).w(FUNC(batrider_state::batrider_clear_sndirq_w)); map(0x500061, 0x500061).w(FUNC(batrider_state::batrider_z80_busreq_w)); map(0x500080, 0x500081).w(FUNC(batrider_state::batrider_textdata_dma_w)); map(0x500082, 0x500083).w(FUNC(batrider_state::batrider_pal_text_dma_w)); @@ -701,7 +679,7 @@ void bbakraid_state::bbakraid_68k_mem(address_map &map) map(0x500017, 0x500017).w(FUNC(bbakraid_state::batrider_soundlatch2_w)); map(0x500018, 0x500019).r(FUNC(bbakraid_state::bbakraid_eeprom_r)); map(0x50001a, 0x50001b).w(FUNC(bbakraid_state::batrider_unknown_sound_w)); - map(0x50001c, 0x50001d).w(FUNC(bbakraid_state::batrider_clear_sndirq_w)); + map(0x50001c, 0x50001d).w(FUNC(bbakraid_state::batrider_clear_sndirq_w)); map(0x50001f, 0x50001f).w(FUNC(bbakraid_state::bbakraid_eeprom_w)); map(0x500080, 0x500081).w(FUNC(bbakraid_state::batrider_textdata_dma_w)); map(0x500082, 0x500083).w(FUNC(bbakraid_state::batrider_pal_text_dma_w)); @@ -744,7 +722,7 @@ void batrider_state::batrider_sound_z80_port(address_map &map) map.global_mask(0xff); map(0x40, 0x40).w(m_soundlatch[2], FUNC(generic_latch_8_device::write)); map(0x42, 0x42).w(m_soundlatch[3], FUNC(generic_latch_8_device::write)); - map(0x44, 0x44).w(FUNC(batrider_state::batrider_sndirq_w)); + map(0x44, 0x44).w(FUNC(batrider_state::batrider_sndirq_w)); map(0x46, 0x46).w(FUNC(batrider_state::batrider_clear_nmi_w)); map(0x48, 0x48).r(m_soundlatch[0], FUNC(generic_latch_8_device::read)); map(0x4a, 0x4a).r(m_soundlatch[1], FUNC(generic_latch_8_device::read)); @@ -758,7 +736,7 @@ void batrider_state::batrider_sound_z80_port(address_map &map) void bbakraid_state::bbakraid_sound_z80_mem(address_map &map) { - map(0x0000, 0xbfff).rom(); // No banking? ROM only contains code and data up to 0x28DC + map(0x0000, 0xbfff).rom(); // No banking? ROM only contains code and data up to 0x28DC map(0xc000, 0xffff).ram(); } @@ -768,7 +746,7 @@ void bbakraid_state::bbakraid_sound_z80_port(address_map &map) map.global_mask(0xff); map(0x40, 0x40).w(m_soundlatch[2], FUNC(generic_latch_8_device::write)); map(0x42, 0x42).w(m_soundlatch[3], FUNC(generic_latch_8_device::write)); - map(0x44, 0x44).w(FUNC(bbakraid_state::batrider_sndirq_w)); + map(0x44, 0x44).w(FUNC(bbakraid_state::batrider_sndirq_w)); map(0x46, 0x46).w(FUNC(bbakraid_state::batrider_clear_nmi_w)); map(0x48, 0x48).r(m_soundlatch[0], FUNC(generic_latch_8_device::read)); map(0x4a, 0x4a).r(m_soundlatch[1], FUNC(generic_latch_8_device::read)); @@ -796,18 +774,18 @@ GFXDECODE_END void batrider_state::batrider(machine_config &config) { - /* basic machine hardware */ - M68000(config, m_maincpu, 32_MHz_XTAL/2); // 16MHz, 32MHz Oscillator (verified) + // basic machine hardware + M68000(config, m_maincpu, 32_MHz_XTAL/2); // 16MHz, 32MHz Oscillator (verified) m_maincpu->set_addrmap(AS_PROGRAM, &batrider_state::batrider_68k_mem); m_maincpu->reset_cb().set(FUNC(batrider_state::reset_audiocpu)); - Z80(config, m_audiocpu, 32_MHz_XTAL/6); // 5.333MHz, 32MHz Oscillator (verified) + Z80(config, m_audiocpu, 32_MHz_XTAL/6); // 5.333MHz, 32MHz Oscillator (verified) m_audiocpu->set_addrmap(AS_PROGRAM, &batrider_state::batrider_sound_z80_mem); m_audiocpu->set_addrmap(AS_IO, &batrider_state::batrider_sound_z80_port); TOAPLAN_COINCOUNTER(config, m_coincounter, 0); - config.set_maximum_quantum(attotime::from_hz(600)); + config.set_maximum_quantum(attotime::from_hz(6000)); ADDRESS_MAP_BANK(config, m_dma_space, 0); m_dma_space->set_addrmap(0, &batrider_state::batrider_dma_mem); @@ -816,7 +794,7 @@ void batrider_state::batrider(machine_config &config) m_dma_space->set_addr_width(16); m_dma_space->set_stride(0x8000); - /* video hardware */ + // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240); @@ -832,7 +810,7 @@ void batrider_state::batrider(machine_config &config) m_vdp->set_tile_callback(FUNC(batrider_state::batrider_bank_cb)); m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_2); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); // these two latches are always written together, via a single move.l instruction @@ -855,19 +833,21 @@ void batrider_state::batrider(machine_config &config) void bbakraid_state::bbakraid(machine_config &config) { - /* basic machine hardware */ - M68000(config, m_maincpu, 32_MHz_XTAL/2); // 16MHz, 32MHz Oscillator + // basic machine hardware + M68000(config, m_maincpu, 32_MHz_XTAL/2); // 16MHz, 32MHz Oscillator m_maincpu->set_addrmap(AS_PROGRAM, &bbakraid_state::bbakraid_68k_mem); m_maincpu->reset_cb().set(FUNC(bbakraid_state::reset_audiocpu)); - Z80(config, m_audiocpu, XTAL(32'000'000)/6); /* 5.3333MHz , 32MHz Oscillator */ + Z80(config, m_audiocpu, 32_MHz_XTAL/6); // 5.3333MHz, 32MHz Oscillator m_audiocpu->set_addrmap(AS_PROGRAM, &bbakraid_state::bbakraid_sound_z80_mem); m_audiocpu->set_addrmap(AS_IO, &bbakraid_state::bbakraid_sound_z80_port); - m_audiocpu->set_periodic_int(FUNC(bbakraid_state::bbakraid_snd_interrupt), attotime::from_hz(XTAL(32'000'000) / 6 / 12000)); // sound CPU clock (divider unverified) + + attotime snd_irq_period = attotime::from_hz(32_MHz_XTAL / 6 / 12000); // from sound CPU clock? (divider unverified) + m_audiocpu->set_periodic_int(FUNC(bbakraid_state::bbakraid_snd_interrupt), snd_irq_period); TOAPLAN_COINCOUNTER(config, m_coincounter, 0); - config.set_maximum_quantum(attotime::from_hz(600)); + config.set_maximum_quantum(attotime::from_hz(6000)); EEPROM_93C66_8BIT(config, m_eeprom); @@ -878,7 +858,7 @@ void bbakraid_state::bbakraid(machine_config &config) m_dma_space->set_addr_width(16); m_dma_space->set_stride(0x8000); - /* video hardware */ + // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240); @@ -894,7 +874,7 @@ void bbakraid_state::bbakraid(machine_config &config) m_vdp->set_tile_callback(FUNC(bbakraid_state::batrider_bank_cb)); m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_1); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); // these two latches are always written together, via a single move.l instruction @@ -911,7 +891,7 @@ void bbakraid_state::bbakraid(machine_config &config) void nprobowl_state::nprobowl(machine_config &config) { // basic machine hardware - M68000(config, m_maincpu, 32_MHz_XTAL / 2); // 32MHz Oscillator, divisor not verified + M68000(config, m_maincpu, 32_MHz_XTAL / 2); // 32MHz Oscillator, divisor not verified m_maincpu->set_addrmap(AS_PROGRAM, &nprobowl_state::nprobowl_68k_mem); m_maincpu->reset_cb().set(FUNC(nprobowl_state::reset_audiocpu)); @@ -952,13 +932,6 @@ void batrider_state::init_batrider() m_audiobank->configure_entries(0, 16, &m_z80_rom[0], 0x4000); install_raizing_okibank(0); install_raizing_okibank(1); - m_sndirq_line = 4; -} - - -void bbakraid_state::init_bbakraid() -{ - m_sndirq_line = 2; } @@ -1413,24 +1386,24 @@ ROM_END } // anonymous namespace // these are all based on Version B, even if only the Japan version states 'version B' -GAME( 1998, batrider, 0, batrider, batrider, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (Europe) (Fri Feb 13 1998)", MACHINE_SUPPORTS_SAVE ) -GAME( 1998, batrideru, batrider, batrider, batrider, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (USA) (Fri Feb 13 1998)", MACHINE_SUPPORTS_SAVE ) -GAME( 1998, batriderc, batrider, batrider, batrider, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (China) (Fri Feb 13 1998)", MACHINE_SUPPORTS_SAVE ) -GAME( 1998, batriderj, batrider, batrider, batriderj, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (Japan, B version) (Fri Feb 13 1998)", MACHINE_SUPPORTS_SAVE ) -GAME( 1998, batriderk, batrider, batrider, batrider, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (Korea) (Fri Feb 13 1998)", MACHINE_SUPPORTS_SAVE ) +GAME( 1998, batrider, 0, batrider, batrider, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (Europe) (Fri Feb 13 1998)", MACHINE_SUPPORTS_SAVE ) +GAME( 1998, batrideru, batrider, batrider, batrider, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (USA) (Fri Feb 13 1998)", MACHINE_SUPPORTS_SAVE ) +GAME( 1998, batriderc, batrider, batrider, batrider, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (China) (Fri Feb 13 1998)", MACHINE_SUPPORTS_SAVE ) +GAME( 1998, batriderj, batrider, batrider, batriderj, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (Japan, B version) (Fri Feb 13 1998)", MACHINE_SUPPORTS_SAVE ) +GAME( 1998, batriderk, batrider, batrider, batrider, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (Korea) (Fri Feb 13 1998)", MACHINE_SUPPORTS_SAVE ) // older revision of the code -GAME( 1998, batriderja, batrider, batrider, batriderj, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (Japan, older version) (Mon Dec 22 1997)", MACHINE_SUPPORTS_SAVE ) -GAME( 1998, batriderhk, batrider, batrider, batrider, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (Hong Kong) (Mon Dec 22 1997)", MACHINE_SUPPORTS_SAVE ) -GAME( 1998, batridert, batrider, batrider, batrider, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (Taiwan) (Mon Dec 22 1997)", MACHINE_SUPPORTS_SAVE ) +GAME( 1998, batriderja, batrider, batrider, batriderj, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (Japan, older version) (Mon Dec 22 1997)", MACHINE_SUPPORTS_SAVE ) +GAME( 1998, batriderhk, batrider, batrider, batrider, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (Hong Kong) (Mon Dec 22 1997)", MACHINE_SUPPORTS_SAVE ) +GAME( 1998, batridert, batrider, batrider, batrider, batrider_state, init_batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (Taiwan) (Mon Dec 22 1997)", MACHINE_SUPPORTS_SAVE ) // Battle Bakraid // the 'unlimited' version is a newer revision of the code -GAME( 1999, bbakraid, 0, bbakraid, bbakraid, bbakraid_state, init_bbakraid, ROT270, "Eighting", "Battle Bakraid - Unlimited Version (USA) (Tue Jun 8 1999)", MACHINE_SUPPORTS_SAVE ) -GAME( 1999, bbakraidc, bbakraid, bbakraid, bbakraid, bbakraid_state, init_bbakraid, ROT270, "Eighting", "Battle Bakraid - Unlimited Version (China) (Tue Jun 8 1999)", MACHINE_SUPPORTS_SAVE ) -GAME( 1999, bbakraidj, bbakraid, bbakraid, bbakraid, bbakraid_state, init_bbakraid, ROT270, "Eighting", "Battle Bakraid - Unlimited Version (Japan) (Tue Jun 8 1999)", MACHINE_SUPPORTS_SAVE ) +GAME( 1999, bbakraid, 0, bbakraid, bbakraid, bbakraid_state, empty_init, ROT270, "Eighting", "Battle Bakraid - Unlimited Version (USA) (Tue Jun 8 1999)", MACHINE_SUPPORTS_SAVE ) +GAME( 1999, bbakraidc, bbakraid, bbakraid, bbakraid, bbakraid_state, empty_init, ROT270, "Eighting", "Battle Bakraid - Unlimited Version (China) (Tue Jun 8 1999)", MACHINE_SUPPORTS_SAVE ) +GAME( 1999, bbakraidj, bbakraid, bbakraid, bbakraid, bbakraid_state, empty_init, ROT270, "Eighting", "Battle Bakraid - Unlimited Version (Japan) (Tue Jun 8 1999)", MACHINE_SUPPORTS_SAVE ) // older revision of the code -GAME( 1999, bbakraidja, bbakraid, bbakraid, bbakraid, bbakraid_state, init_bbakraid, ROT270, "Eighting", "Battle Bakraid (Japan) (Wed Apr 7 1999)", MACHINE_SUPPORTS_SAVE ) +GAME( 1999, bbakraidja, bbakraid, bbakraid, bbakraid, bbakraid_state, empty_init, ROT270, "Eighting", "Battle Bakraid (Japan) (Wed Apr 7 1999)", MACHINE_SUPPORTS_SAVE ) // dedicated PCB -GAME( 1996, nprobowl, 0, nprobowl, nprobowl, nprobowl_state, empty_init, ROT0, "Zuck / Able Corp", "New Pro Bowl", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE ) // bad GFXs, no sound banking, controls, etc -GAME( 1996, probowl2, nprobowl, nprobowl, nprobowl, nprobowl_state, empty_init, ROT0, "Zuck / Able Corp", "Pro Bowl 2", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE ) // bad GFXs, no sound banking, controls, etc +GAME( 1996, nprobowl, 0, nprobowl, nprobowl, nprobowl_state, empty_init, ROT0, "Zuck / Able Corp", "New Pro Bowl", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE ) // bad GFXs, no sound banking, controls, etc +GAME( 1996, probowl2, nprobowl, nprobowl, nprobowl, nprobowl_state, empty_init, ROT0, "Zuck / Able Corp", "Pro Bowl 2", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE ) // bad GFXs, no sound banking, controls, etc From d1cbfd7909c95cb8e3edfd0132ee113d11f13c99 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 16 Jan 2025 21:31:37 +0100 Subject: [PATCH 37/80] gp9001: fix regression with vdpcount_r --- src/mame/toaplan/gp9001.cpp | 10 +++++----- src/mame/toaplan/raizing_batrider.cpp | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mame/toaplan/gp9001.cpp b/src/mame/toaplan/gp9001.cpp index 32d49d7cb68d4..5062ea616395a 100644 --- a/src/mame/toaplan/gp9001.cpp +++ b/src/mame/toaplan/gp9001.cpp @@ -389,22 +389,22 @@ u16 gp9001vdp_device::vdpcount_r() int vpos = screen().vpos(); - u16 video_status = 0xff00; // Set signals inactive + u16 video_status = 0xff00; // Set signals inactive vpos = (vpos + 15) % 262; - if (hsync_r()) + if (!hsync_r()) video_status &= ~0x8000; - if (vsync_r()) + if (!vsync_r()) video_status &= ~0x4000; - if (fblank_r()) + if (!fblank_r()) video_status &= ~0x0100; if (vpos < 256) video_status |= (vpos & 0xff); else video_status |= 0xff; -// logerror("VC: vpos=%04x hpos=%04x VBL=%04x\n",vpos,hpos,m_screen->vblank()); + //logerror("VC: vpos=%04x hpos=%04x VBL=%04x\n",vpos,hpos,m_screen->vblank()); return video_status; } diff --git a/src/mame/toaplan/raizing_batrider.cpp b/src/mame/toaplan/raizing_batrider.cpp index e99cfc7f44d1c..7a6db39507129 100644 --- a/src/mame/toaplan/raizing_batrider.cpp +++ b/src/mame/toaplan/raizing_batrider.cpp @@ -813,7 +813,7 @@ void batrider_state::batrider(machine_config &config) // sound hardware SPEAKER(config, "mono").front_center(); - // these two latches are always written together, via a single move.l instruction + // first two latches are always written together, via a single move.l instruction GENERIC_LATCH_8(config, m_soundlatch[0]); GENERIC_LATCH_8(config, m_soundlatch[1]); GENERIC_LATCH_8(config, m_soundlatch[2]); @@ -877,7 +877,7 @@ void bbakraid_state::bbakraid(machine_config &config) // sound hardware SPEAKER(config, "mono").front_center(); - // these two latches are always written together, via a single move.l instruction + // first two latches are always written together, via a single move.l instruction GENERIC_LATCH_8(config, m_soundlatch[0]); GENERIC_LATCH_8(config, m_soundlatch[1]); GENERIC_LATCH_8(config, m_soundlatch[2]); From 03fd365300ba2f8b6bbec0f115a548abdf031103 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Thu, 16 Jan 2025 22:58:10 +0100 Subject: [PATCH 38/80] lependu.cpp: Fix typo in input description. --- src/mame/misc/lependu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/misc/lependu.cpp b/src/mame/misc/lependu.cpp index f4469fd998a38..e269386c88302 100644 --- a/src/mame/misc/lependu.cpp +++ b/src/mame/misc/lependu.cpp @@ -515,7 +515,7 @@ static INPUT_PORTS_START(codemagik) PORT_START("IN.3") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) // 25c coin - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Sealth Mode") PORT_CODE(KEYCODE_L) PORT_TOGGLE + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Stealth mode / Switch Games") PORT_CODE(KEYCODE_L) PORT_TOGGLE PORT_BIT( 0x7b, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("SW1") From 9a5b59e273181f1c467232afac71d79d1e4e9adb Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Thu, 16 Jan 2025 23:04:29 +0100 Subject: [PATCH 39/80] lependu.cpp: Fix description in rom load. --- src/mame/misc/lependu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/misc/lependu.cpp b/src/mame/misc/lependu.cpp index e269386c88302..19e75b28b6d53 100644 --- a/src/mame/misc/lependu.cpp +++ b/src/mame/misc/lependu.cpp @@ -770,7 +770,7 @@ ROM_START( codemagik ) ROM_REGION( 0x3000, "gfx2", 0 ) ROM_LOAD( "3y_2732.1a", 0x0000, 0x1000, CRC(ea868221) SHA1(fcf9a840537feb28c9fb65b58b9a41b2412aa4ef) ) // cards deck and alt gfx, bitplane1 - ROM_LOAD( "2y_2732.3a", 0x1000, 0x1000, CRC(6d1da4bb) SHA1(dc8c70faa301e2f7e9089d38e0ef618e8352e569) ) // cards deck gfx, bitplane2 + ROM_LOAD( "2y_2732.3a", 0x1000, 0x1000, CRC(6d1da4bb) SHA1(dc8c70faa301e2f7e9089d38e0ef618e8352e569) ) // cards deck and alt gfx, bitplane2 ROM_COPY( "gfx1", 0x4800, 0x2000, 0x0800 ) // cards deck gfx, bitplane3. ROM_COPY( "gfx1", 0x5800, 0x2800, 0x0800 ) // cards deck alt gfx, bitplane3. From 0df6022122abd12e9f132f73ff20061d79de3acb Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Thu, 16 Jan 2025 23:47:17 +0100 Subject: [PATCH 40/80] Night Mare: According to the manual, button 1 is INK, button 2 is JUMP. --- src/mame/efo/nightmare.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/mame/efo/nightmare.cpp b/src/mame/efo/nightmare.cpp index 762e1ad6e16ab..268b31c743cbf 100644 --- a/src/mame/efo/nightmare.cpp +++ b/src/mame/efo/nightmare.cpp @@ -397,10 +397,12 @@ static INPUT_PORTS_START( nightmare ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL + + // from the manual... button1: ink, button2: jump. + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) // jump + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) // ink + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_START("EF") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_WRITE_LINE_DEVICE_MEMBER("cdp1802", FUNC(cosmac_device::ef3_w)) //ic17 - cpu From 8430afa2bc10dbfa81f75642b43759810056e01a Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Fri, 17 Jan 2025 00:17:26 +0100 Subject: [PATCH 41/80] Break the parent/clone relationship between both big10 games. They are very different games playing the same type of keno. --- src/mame/success/big10.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/success/big10.cpp b/src/mame/success/big10.cpp index 59c72e55c012b..29b38cd76e7a3 100644 --- a/src/mame/success/big10.cpp +++ b/src/mame/success/big10.cpp @@ -282,4 +282,4 @@ ROM_END // YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS GAME( 1985, big10, 0, big10, big10, big10_state, empty_init, ROT0, "Success", "Big 10 (1985, Success)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, big10a, big10, big10, big10, big10_state, empty_init, ROT0, "System Make", "Big 10 (1986, System Make)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, big10a, 0, big10, big10, big10_state, empty_init, ROT0, "System Make", "Big 10 (1986, System Make)", MACHINE_SUPPORTS_SAVE ) From 4b221bbfce010b3c4baa62745ba0975c1bddee5f Mon Sep 17 00:00:00 2001 From: 987123879113 <63495610+987123879113@users.noreply.github.com> Date: Fri, 17 Jan 2025 19:45:37 +0900 Subject: [PATCH 42/80] cpu/drcbearm64.cpp: Fixed ADRP usage. (#13239) ADRP output must always be an X register. --- src/devices/cpu/drcbearm64.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/cpu/drcbearm64.cpp b/src/devices/cpu/drcbearm64.cpp index 5929c53583b3e..36a03a793bead 100644 --- a/src/devices/cpu/drcbearm64.cpp +++ b/src/devices/cpu/drcbearm64.cpp @@ -499,7 +499,7 @@ void drcbe_arm64::get_imm_relative(a64::Assembler &a, const a64::Gp ®, const const uint64_t targetpage = (uint64_t)ptr & ~make_bitmask(12); const uint64_t pageoffs = (uint64_t)ptr & util::make_bitmask(12); - a.adrp(reg, targetpage); + a.adrp(reg.x(), targetpage); if (pageoffs != 0) a.add(reg, reg, pageoffs); From e7b78bc374b6c241b44599418f4686ec3cc52aaa Mon Sep 17 00:00:00 2001 From: flama12333 <143599905+flama12333@users.noreply.github.com> Date: Fri, 17 Jan 2025 05:49:12 -0500 Subject: [PATCH 43/80] misc/changyu.cpp: change year 19?? to 1991 for changyu2, pinpoint voice roms (#13234) --- src/mame/misc/changyu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mame/misc/changyu.cpp b/src/mame/misc/changyu.cpp index c7f8d4f37ef9e..3acdd921d9b89 100644 --- a/src/mame/misc/changyu.cpp +++ b/src/mame/misc/changyu.cpp @@ -532,7 +532,7 @@ ROM_START( changyu2 ) // 999 ROM999 II BY HUANGYEH string ROM_LOAD( "93.bin", 0x10000, 0x08000, CRC(1d2b75de) SHA1(89b201b75691ee6ac3fc71fb8a998dbf05a1b0b2) ) // 27256 ROM_LOAD( "94.bin", 0x18000, 0x08000, CRC(f61a8410) SHA1(3c4df3e973322200aa72cf1d1df827c2ba69671b) ) // 27256 - ROM_REGION(0x30000, "unsorted", 0) + ROM_REGION(0x30000, "voice", 0) ROM_LOAD( "96c.bin", 0x00000, 0x10000, CRC(06d11350) SHA1(3c65d1d71010a3f10b00c799ede2debc96f6f3cf) ) // 27C512 ROM_LOAD( "97c.bin", 0x10000, 0x10000, CRC(e242ab79) SHA1(a7b14692556605eb039d1ef98fb3b8b007717c12) ) // 27C512 ROM_LOAD( "98c.bin", 0x20000, 0x10000, CRC(c8879f76) SHA1(6bcc686720dc63f50509f3f003b1f62ff43fc6b1) ) // 27C512 @@ -553,4 +553,4 @@ ROM_END // No copyright for both, are these really bootlegs? GAME( 1989, changyu, 0, changyu, changyu, changyu_state, empty_init, ROT0, "Chang Yu Electronic", "Mayo no 21", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // Wing Co. in GFX1, year taken from start of maincpu ROM -GAME( 19??, changyu2, 0, changyu2, changyu2,changyu2_state, empty_init, ROT0, "Chang Yu Electronic", "999", MACHINE_NOT_WORKING ) // Wing Co. in GFX1 +GAME( 1991, changyu2, 0, changyu2, changyu2,changyu2_state, empty_init, ROT0, "Chang Yu Electronic", "999", MACHINE_NOT_WORKING ) // Wing Co. in GFX1 From 6ce4178f790a15d79fb89711e0b4dbdb7455f780 Mon Sep 17 00:00:00 2001 From: angelosa Date: Fri, 17 Jan 2025 12:08:13 +0100 Subject: [PATCH 44/80] misc/changyu.cpp: pinpoint CVSD sample ROMs for changyu --- src/mame/mame.lst | 2 +- src/mame/misc/changyu.cpp | 31 ++++++++++++++++++------------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index b8bd65c2d4d95..f6ef1206ac4b9 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -12115,7 +12115,7 @@ sc4lotrrb // sc4lotrrc // sc4lotrrd // sc4lotrre // -sc4lotrt // Lord Of The Rings Triology (Bellfruit) +sc4lotrt // Lord Of The Rings Trilogy (Bellfruit) sc4lotrta // sc4ltr2c // Lord Of The Rings - The Two Towers Club (Bellfruit) sc4ltr2ca // diff --git a/src/mame/misc/changyu.cpp b/src/mame/misc/changyu.cpp index 3acdd921d9b89..28a6784b26ade 100644 --- a/src/mame/misc/changyu.cpp +++ b/src/mame/misc/changyu.cpp @@ -1,10 +1,14 @@ // license:BSD-3-Clause -// copyright-holders: +// copyright-holders: Angelo Salese +/************************************************************************************************** -/* +Chang Yu Electronic (CYE) misc gambling games -This skeleton driver hosts 2 unidentified Chang Yu Electronic (CYE) games. The PCBs, -while sharing most components, differ, so they may very well go in different drivers when emulated. +TODO: +- hookup UM5100, merge from pc/filetto.cpp; +- both games should be working at this point, verify and promote; + +=================================================================================================== unknown Chang Yu Electronic gambling game 1: @@ -40,7 +44,8 @@ main PCB (marked 9101): 1 x UM3567 (YM2413 clone) 1 x D8253C 1 x P87C51 MCU -*/ + +**************************************************************************************************/ #include "emu.h" @@ -496,17 +501,17 @@ ROM_START( changyu ) ROM_LOAD( "7.u19", 0x10000, 0x08000, CRC(ed69d69d) SHA1(adbcea3045bec61aef9ee2ee8425f429bf5e0fc8) ) // 27C256 ROM_LOAD( "8.u42", 0x18000, 0x08000, CRC(4013b219) SHA1(735c64647595285fc0c79c617cd6833c473daa12) ) // 27C256 - ROM_REGION(0x58000, "unsorted", 0) + ROM_REGION(0x28000, "unsorted", 0) ROM_LOAD( "1.u1", 0x00000, 0x08000, CRC(8d60cb76) SHA1(f33e14549ceb6511509be16dd1c238512e6ae758) ) // 27C256 ROM_LOAD( "2.u2", 0x08000, 0x08000, CRC(b9d78664) SHA1(763876f075f2b5b07e96b36b4e670dc466808f08) ) // 27C256 ROM_LOAD( "3.u3", 0x10000, 0x08000, CRC(17cc6716) SHA1(df8af0fbe93b8f92219721a35772ef93bca7adb5) ) // 27C256 ROM_LOAD( "4.u4", 0x18000, 0x08000, CRC(31b76c13) SHA1(c46da02aff8f57c0277e493c82e01970c0acd4fb) ) // 27C256 + ROM_LOAD( "14.u70", 0x20000, 0x08000, CRC(cdfdfe11) SHA1(b170f9a6e2c77ce3ae01aabc8a963a11eb7fe74e) ) // under the sub board and near an empty socket (u77), program for a removed second CPU? or for the first? - ROM_LOAD( "9a.u74", 0x20000, 0x10000, CRC(12f3fd7a) SHA1(e220694b8fa5cfc172bf23149fceaeeb6d0b6230) ) // 27C512 - ROM_LOAD( "10a.u61", 0x30000, 0x10000, CRC(8869968b) SHA1(fbab29436acde19d7d559160ef2394d43a6ebb87) ) // 27C512 - ROM_LOAD( "11a.u62", 0x40000, 0x10000, CRC(d05e6348) SHA1(5b8bd4c94631aed46cbf7cd4db749e4855d4516c) ) // 27C512 - - ROM_LOAD( "14.u70", 0x50000, 0x08000, CRC(cdfdfe11) SHA1(b170f9a6e2c77ce3ae01aabc8a963a11eb7fe74e) ) // under the sub board and near an empty socket (u77), program for a removed second CPU? or for the first? + ROM_REGION(0x30000, "samples", 0) + ROM_LOAD( "9a.u74", 0x00000, 0x10000, CRC(12f3fd7a) SHA1(e220694b8fa5cfc172bf23149fceaeeb6d0b6230) ) // 27C512 + ROM_LOAD( "10a.u61", 0x10000, 0x10000, CRC(8869968b) SHA1(fbab29436acde19d7d559160ef2394d43a6ebb87) ) // 27C512 + ROM_LOAD( "11a.u62", 0x20000, 0x10000, CRC(d05e6348) SHA1(5b8bd4c94631aed46cbf7cd4db749e4855d4516c) ) // 27C512 // u9 and u63 not populated @@ -532,7 +537,7 @@ ROM_START( changyu2 ) // 999 ROM999 II BY HUANGYEH string ROM_LOAD( "93.bin", 0x10000, 0x08000, CRC(1d2b75de) SHA1(89b201b75691ee6ac3fc71fb8a998dbf05a1b0b2) ) // 27256 ROM_LOAD( "94.bin", 0x18000, 0x08000, CRC(f61a8410) SHA1(3c4df3e973322200aa72cf1d1df827c2ba69671b) ) // 27256 - ROM_REGION(0x30000, "voice", 0) + ROM_REGION(0x30000, "samples", 0) ROM_LOAD( "96c.bin", 0x00000, 0x10000, CRC(06d11350) SHA1(3c65d1d71010a3f10b00c799ede2debc96f6f3cf) ) // 27C512 ROM_LOAD( "97c.bin", 0x10000, 0x10000, CRC(e242ab79) SHA1(a7b14692556605eb039d1ef98fb3b8b007717c12) ) // 27C512 ROM_LOAD( "98c.bin", 0x20000, 0x10000, CRC(c8879f76) SHA1(6bcc686720dc63f50509f3f003b1f62ff43fc6b1) ) // 27C512 @@ -553,4 +558,4 @@ ROM_END // No copyright for both, are these really bootlegs? GAME( 1989, changyu, 0, changyu, changyu, changyu_state, empty_init, ROT0, "Chang Yu Electronic", "Mayo no 21", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // Wing Co. in GFX1, year taken from start of maincpu ROM -GAME( 1991, changyu2, 0, changyu2, changyu2,changyu2_state, empty_init, ROT0, "Chang Yu Electronic", "999", MACHINE_NOT_WORKING ) // Wing Co. in GFX1 +GAME( 1991?, changyu2, 0, changyu2, changyu2,changyu2_state, empty_init, ROT0, "Chang Yu Electronic", "999", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // Wing Co. in GFX1, year from a CYE flyer, cfr. pics in PR #13234 From 16e752db6982b23701dfc33e617eadb76f80ce81 Mon Sep 17 00:00:00 2001 From: m1macrophage <168948267+m1macrophage@users.noreply.github.com> Date: Fri, 17 Jan 2025 05:01:54 -0800 Subject: [PATCH 45/80] alesis/midiverb.cpp: Adding "non-working" driver for midiverb. (#13238) --- src/mame/alesis/midiverb.cpp | 201 ++++++++++++++++++++++++++++ src/mame/layout/alesis_midiverb.lay | 111 +++++++++++++++ src/mame/mame.lst | 3 + 3 files changed, 315 insertions(+) create mode 100644 src/mame/alesis/midiverb.cpp create mode 100644 src/mame/layout/alesis_midiverb.lay diff --git a/src/mame/alesis/midiverb.cpp b/src/mame/alesis/midiverb.cpp new file mode 100644 index 0000000000000..daee371321de6 --- /dev/null +++ b/src/mame/alesis/midiverb.cpp @@ -0,0 +1,201 @@ +// license:BSD-3-Clause +// copyright-holders:m1macrophage + +/* +The Midiverb is a digital delay & reverb unit. + +The computer portion of the device is very simple. The firmware runs on a +80C31 microcontroller. It reads the 4 buttons, drives the two 7-segment +displays, and listens to MIDI for program changes. It also controls which +program (effect) is running on the DSP. + +An interesting aspect of the Midiverb is its DSP, which is built out of discrete +logic components. This runs custom microcode consisting of 4 instructions. + +The UI is very simple. The user can choose one of 63 effects by using the +"up" and "down" buttons on the unit. The effect can also be set via MIDI +program changes, and the MIDI channel is configurable ("channel" button). The +"defeat" button will run the 64th effect, which is just a bypass. That same +bypass effect is also enabled temporarily, when switching between effects. +Finally, there is a wet/dry control knob. + +This driver is intended as an educational tool. + +TODO: Audio & DSP (coming soon). + +Usage notes: + +The driver comes with an interactive layout. +MIDI is optional, and can be configured as follows: +./mame -listmidi # List MIDI devices, physical or virtual (e.g. DAWs). +./mame -window midiverb -midiin "{midi device}" +*/ + +#include "emu.h" + +#include "cpu/mcs51/mcs51.h" +#include "bus/midi/midiinport.h" +#include "bus/midi/midioutport.h" +#include "video/pwm.h" + +#include "alesis_midiverb.lh" + +#define LOG_PROGRAM_CHANGE (1U << 1) + +#define VERBOSE (LOG_GENERAL | LOG_PROGRAM_CHANGE) +//#define LOG_OUTPUT_FUNC osd_printf_info + +#include "logmacro.h" + +namespace { + +constexpr const char MAINCPU_TAG[] = "80c31"; + +class midiverb_state : public driver_device +{ +public: + midiverb_state(const machine_config &mconfig, device_type type, const char *tag) ATTR_COLD + : driver_device(mconfig, type, tag) + , m_maincpu(*this, MAINCPU_TAG) + , m_digit_device(*this, "pwm_digit_device") + , m_digit_out(*this, "digit_%d", 1U) + { + } + + void midiverb(machine_config &config) ATTR_COLD; + +protected: + void machine_start() override ATTR_COLD; + +private: + u8 midi_rxd_r() const; + void program_select_w(u8 data); + void digit_select_w(u8 data); + void digit_latch_w(u8 data); + void digit_out_update_w(offs_t offset, u8 data); + void midi_rxd_w(int state); + + void program_map(address_map &map) ATTR_COLD; + void external_memory_map(address_map &map) ATTR_COLD; + + required_device m_maincpu; + required_device m_digit_device; + output_finder<2> m_digit_out; // 2 x MAN4710A (7-seg display), DS1 & DS2. + + bool m_midi_rxd_bit = true; // Start high for serial idle. + u8 m_digit_latch_inv = 0x00; + u8 m_digit_mask = 0x00; + u8 m_program = 0; +}; + +u8 midiverb_state::midi_rxd_r() const +{ + return m_midi_rxd_bit ? 1 : 0; +} + +void midiverb_state::program_select_w(u8 data) +{ + const u8 new_program = data & 0x3f; + if (m_program == new_program) + return; + m_program = new_program; + LOGMASKED(LOG_PROGRAM_CHANGE, "Program set to: %d\n", m_program); +} + +void midiverb_state::digit_select_w(u8 data) +{ + // The digit select signals (bit 0 and 1) are active-low. They connect to + // the base of PNP transistors (2N4403, Q4 and Q3 for DS1 and DS2 + // respectively). When low, power is connected to the MAN4710 anode inputs. + m_digit_mask = ~data & 0x03; + m_digit_device->matrix(m_digit_mask, m_digit_latch_inv); +} + +void midiverb_state::digit_latch_w(u8 data) +{ + // The Data bus is connected to the latch in an unintuitive way. Same goes + // for the connections from the latch to the 7seg display. Presumably done + // to save board space, which was limited. + const u8 descrambled = bitswap<8>(data, 3, 1, 6, 7, 4, 0, 2, 5); + + // Inverting because segment LEDs are active-low, but pwm_display_device + // expects active-high. + m_digit_latch_inv = ~descrambled & 0x7f; + m_digit_device->matrix(m_digit_mask, m_digit_latch_inv); +} + +void midiverb_state::digit_out_update_w(offs_t offset, u8 data) +{ + // Digits are ordered from left to right. So offset 0 (corresponding to + // digit_1) is the most significant digit. + m_digit_out[offset] = data; +} + +void midiverb_state::midi_rxd_w(int state) +{ + m_midi_rxd_bit = state; +} + +void midiverb_state::program_map(address_map &map) +{ + // 2764 ROM has A0-A11 connected to the MCU, and A12 tied high. ROM /OE + // is tied to MCU A15, so it is only active when A15 is 0. + map(0x0000, 0x0fff).mirror(0x7000).rom().region(MAINCPU_TAG, 0x1000); +} + +void midiverb_state::external_memory_map(address_map &map) +{ + // Address lines ignored when writing to external memory. + map(0x0000, 0x0000).mirror(0xffff).w(FUNC(midiverb_state::digit_latch_w)); +} + +void midiverb_state::machine_start() +{ + m_digit_out.resolve(); + save_item(NAME(m_midi_rxd_bit)); + save_item(NAME(m_digit_latch_inv)); + save_item(NAME(m_digit_mask)); + save_item(NAME(m_program)); +} + +void midiverb_state::midiverb(machine_config &config) +{ + I80C31(config, m_maincpu, 6_MHz_XTAL); // U55. + m_maincpu->set_addrmap(AS_PROGRAM, &midiverb_state::program_map); + m_maincpu->set_addrmap(AS_IO, &midiverb_state::external_memory_map); + + m_maincpu->port_out_cb<1>().set(FUNC(midiverb_state::digit_select_w)).mask(0x03); // P1.0-P1.1 + m_maincpu->port_out_cb<1>().append(FUNC(midiverb_state::program_select_w)).rshift(2); // P1.2-P1.7 + m_maincpu->port_in_cb<3>().set(FUNC(midiverb_state::midi_rxd_r)).mask(0x01); // P3.0 + m_maincpu->port_in_cb<3>().append_ioport("buttons").lshift(2).mask(0x3c); // P3.2-P3.5 + + midi_port_device &midi_in = MIDI_PORT(config, "mdin", midiin_slot, "midiin"); + MIDI_PORT(config, "mdthru", midiout_slot, "midiout"); + midi_in.rxd_handler().set(FUNC(midiverb_state::midi_rxd_w)); + midi_in.rxd_handler().append("mdthru", FUNC(midi_port_device::write_txd)); + + PWM_DISPLAY(config, m_digit_device).set_size(2, 7); // 2 x MAN4710. + m_digit_device->set_segmask(0x03, 0x7f); + m_digit_device->output_digit().set(FUNC(midiverb_state::digit_out_update_w)); + + config.set_default_layout(layout_alesis_midiverb); +} + +INPUT_PORTS_START(midiverb) + PORT_START("buttons") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("MIDI CHANNEL") PORT_CODE(KEYCODE_C) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("UP") PORT_CODE(KEYCODE_UP) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("DOWN") PORT_CODE(KEYCODE_DOWN) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("DEFEAT") PORT_CODE(KEYCODE_D) +INPUT_PORTS_END + +ROM_START(midiverb) + ROM_REGION(0x2000, MAINCPU_TAG, 0) + // U54. 2764 ROM. + ROM_LOAD("mvop_4-7-86.u54", 0x000000, 0x002000, CRC(14d6596d) SHA1(c6dc579d8086556b2dd4909c8deb3c7006293816)) +ROM_END + +} // anonymous namespace + +SYST(1986, midiverb, 0, 0, midiverb, midiverb, midiverb_state, empty_init, "Alesis", "MIDIverb", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING | MACHINE_NO_SOUND) + diff --git a/src/mame/layout/alesis_midiverb.lay b/src/mame/layout/alesis_midiverb.lay new file mode 100644 index 0000000000000..d8af1eb680947 --- /dev/null +++ b/src/mame/layout/alesis_midiverb.lay @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.lst b/src/mame/mame.lst index f6ef1206ac4b9..b6d974c7f95d1 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -495,6 +495,9 @@ hr16b // mmt8 // sr16 // +@source:alesis/midiverb.cpp +midiverb // Alesis MIDIVerb + @source:alliedleisure/ace.cpp ace // [1976 Allied Leisure] From f5622e67def94de823ce537364aae6296c16470e Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 17 Jan 2025 15:11:46 +0100 Subject: [PATCH 46/80] nightmare: remove obsolete todo note, small cleanup --- src/mame/efo/nightmare.cpp | 71 +++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 39 deletions(-) diff --git a/src/mame/efo/nightmare.cpp b/src/mame/efo/nightmare.cpp index 268b31c743cbf..3f77ecf72b276 100644 --- a/src/mame/efo/nightmare.cpp +++ b/src/mame/efo/nightmare.cpp @@ -198,7 +198,6 @@ TODO: - - Soft reset doesn't work. - Verify video mixing (Press F2 to enter service mode, then press 1 + 2 to continue to settings screen. There's diagnostic color pattern at the top of screen) - Quitting MAME while in service mode settings screen will invalidate settings @@ -227,8 +226,7 @@ class nightmare_state : public driver_device : driver_device(mconfig, type, tag) , m_maincpu(*this, "cdp1802") , m_sound3(*this, "sound3") - , m_vdc(*this, "vdc") - , m_vdc2(*this, "vdc2") + , m_vdc(*this, "vdc%u", 1) , m_eeprom(*this,"eeprom") { } @@ -238,6 +236,7 @@ class nightmare_state : public driver_device virtual void machine_start() override ATTR_COLD; virtual void machine_reset() override ATTR_COLD; +private: TIMER_CALLBACK_MEMBER(clear_reset); int clear_r(); @@ -253,8 +252,7 @@ class nightmare_state : public driver_device required_device m_maincpu; required_device m_sound3; - required_device m_vdc; - required_device m_vdc2; + required_device_array m_vdc; required_device m_eeprom; // cpu state @@ -296,31 +294,28 @@ void nightmare_state::q_w(int state) int nightmare_state::ef1_r() { - //EEPROM Inv ??? - + // EEPROM Inv ??? return 0; } int nightmare_state::ef2_r() { - //EEPROM Dq data read; + // EEPROM Dq data read; return m_eeprom->read_data(); } void nightmare_state::ic10_w(uint8_t data) { - /* - 7 - EEPROM Di - 6 - EEPROM Clock - 5 - J2 - 4 - J2 - 3 - J2 - 2 - J2 - 1 - J2 - 0 - ? - */ + // 7 - EEPROM Di + // 6 - EEPROM Clock + // 5 - J2 + // 4 - J2 + // 3 - J2 + // 2 - J2 + // 1 - J2 + // 0 - ? m_eeprom->write_data(BIT(data, 7)); m_eeprom->write_enable(BIT(data, 6)); @@ -349,8 +344,8 @@ void nightmare_state::io_map(address_map &map) map(1, 1).r("ic8", FUNC(cdp1852_device::read)).w(FUNC(nightmare_state::sound_w)); map(2, 2).r("ic9", FUNC(cdp1852_device::read)).w("ic10", FUNC(cdp1852_device::write)); - map(4, 5).rw(m_vdc, FUNC(tms9928a_device::read), FUNC(tms9928a_device::write)); - map(6, 7).rw(m_vdc2, FUNC(tms9928a_device::read), FUNC(tms9928a_device::write)); + map(4, 5).rw(m_vdc[0], FUNC(tms9928a_device::read), FUNC(tms9928a_device::write)); + map(6, 7).rw(m_vdc[1], FUNC(tms9928a_device::read), FUNC(tms9928a_device::write)); } uint32_t nightmare_state::screen_update_nightmare(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) @@ -358,8 +353,8 @@ uint32_t nightmare_state::screen_update_nightmare(screen_device &screen, bitmap_ // combine two buffers (additive?) for (int y = cliprect.top(); y <= cliprect.bottom(); y++) { - uint32_t const *const bitmap1 = &m_vdc2->get_bitmap().pix(y); - uint32_t const *const bitmap2 = &m_vdc->get_bitmap().pix(y); + uint32_t const *const bitmap1 = &m_vdc[1]->get_bitmap().pix(y); + uint32_t const *const bitmap2 = &m_vdc[0]->get_bitmap().pix(y); uint32_t *const dst = &bitmap.pix(y); for (int x = cliprect.left(); x <= cliprect.right(); x++) @@ -368,12 +363,12 @@ uint32_t nightmare_state::screen_update_nightmare(screen_device &screen, bitmap_ uint32_t p2 = bitmap2[x]; uint32_t result = 0; - for (int shift=0; shift<32;shift+=8) + for (int shift = 0; shift < 32; shift += 8) { - uint32_t const data = ((p2>>shift)&0xff)+((p1>>shift)&0xff); - result|=((data>0xff)?0xff:data)<> shift) & 0xff) + ((p1 >> shift) & 0xff); + result |= ((data > 0xff) ? 0xff : data) << shift; } - dst[x]=result; + dst[x] = result; } } @@ -397,15 +392,13 @@ static INPUT_PORTS_START( nightmare ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) - - // from the manual... button1: ink, button2: jump. - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) // jump - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) // ink + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) // button2: jump + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) // button1: ink PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_START("EF") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_WRITE_LINE_DEVICE_MEMBER("cdp1802", FUNC(cosmac_device::ef3_w)) //ic17 - cpu + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_WRITE_LINE_DEVICE_MEMBER("cdp1802", FUNC(cosmac_device::ef3_w)) // ic17 - cpu PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_TILT ) PORT_WRITE_LINE_DEVICE_MEMBER("cdp1802", FUNC(cosmac_device::ef4_w)) INPUT_PORTS_END @@ -439,14 +432,14 @@ void nightmare_state::nightmare(machine_config &config) SDA2006(config, m_eeprom); // video hardware - EFO90501( config, m_vdc, MASTER_CLOCK ); - m_vdc->set_screen("screen"); - m_vdc->set_vram_size(0x4000); - - EFO90501( config, m_vdc2, MASTER_CLOCK ); - m_vdc2->set_screen("screen"); - m_vdc2->set_vram_size(0x4000); - m_vdc2->int_callback().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT); + EFO90501(config, m_vdc[0], MASTER_CLOCK); + m_vdc[0]->set_screen("screen"); + m_vdc[0]->set_vram_size(0x4000); + + EFO90501(config, m_vdc[1], MASTER_CLOCK); + m_vdc[1]->set_screen("screen"); + m_vdc[1]->set_vram_size(0x4000); + m_vdc[1]->int_callback().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_screen_update(FUNC(nightmare_state::screen_update_nightmare)); From 08234042acc80aeff8c8604c3ff5ea8c27953d8d Mon Sep 17 00:00:00 2001 From: Mark Garlanger Date: Fri, 17 Jan 2025 08:40:32 -0600 Subject: [PATCH 47/80] heathzenith/h89.cpp: Update gpp handling for MMS FDC (#13226) --- src/devices/bus/heathzenith/h89/h89bus.cpp | 2 +- src/mame/heathzenith/h89.cpp | 31 ---------------------- 2 files changed, 1 insertion(+), 32 deletions(-) diff --git a/src/devices/bus/heathzenith/h89/h89bus.cpp b/src/devices/bus/heathzenith/h89/h89bus.cpp index 8bff638a3c857..b9715af853f08 100644 --- a/src/devices/bus/heathzenith/h89/h89bus.cpp +++ b/src/devices/bus/heathzenith/h89/h89bus.cpp @@ -280,7 +280,7 @@ void h89bus_device::io_dispatch_w(offs_t offset, u8 data) if (decode) { - if (decode & H89_GPP) m_out_gpp_cb(offset, data); + if ((decode & H89_GPP) && ((offset & 7) == 2)) m_out_gpp_cb(offset, data); if (decode & H89_NMI) { m_out_nmi_cb(offset, data); return; } if (decode & H89_TERM) { m_out_tlb_cb(offset & 7, data); return; } diff --git a/src/mame/heathzenith/h89.cpp b/src/mame/heathzenith/h89.cpp index 19300b532e96a..c03507b2d6cc5 100644 --- a/src/mame/heathzenith/h89.cpp +++ b/src/mame/heathzenith/h89.cpp @@ -247,9 +247,6 @@ class h89_mms_state : public h89_base_state void h89_mms(machine_config &config); -protected: - u8 port_f2_mms_r(offs_t offset); - void port_f2_mms_w(offs_t offset, u8 data); }; @@ -885,31 +882,6 @@ void h89_base_state::port_f2_w(offs_t offset, u8 data) m_intr_socket->set_irq_level(1, CLEAR_LINE); } -// MMS intercepts the GPIO decoding so the GPIO pin on -// the right slots can be used as a card select without -// interfering with normal GPIO port operation. -u8 h89_mms_state::port_f2_mms_r(offs_t offset) -{ - if ((offset & 7) != 2) - { - return 0; - } - - return m_sw501->read(); -} - -void h89_mms_state::port_f2_mms_w(offs_t offset, u8 data) -{ - if ((offset & 7) != 2) - { - return; - } - - update_gpp(data); - - m_intr_socket->set_irq_level(1, CLEAR_LINE); -} - static void tlb_options(device_slot_interface &device) { device.option_add("heath", HEATH_TLB); @@ -1071,9 +1043,6 @@ void h89_mms_state::h89_mms(machine_config &config) h89_base(config); m_h89bus->set_default_bios_tag("444-61c"); - m_h89bus->in_gpp_callback().set(FUNC(h89_mms_state::port_f2_mms_r)); - m_h89bus->out_gpp_callback().set(FUNC(h89_mms_state::port_f2_mms_w)); - // the card selection is different with the MMS mapping PROM H89BUS_RIGHT_SLOT(config.replace(), "p504", "h89bus", [this](device_slot_interface &device) { h89_right_cards_mms(device); }, "mms77316"); H89BUS_RIGHT_SLOT(config.replace(), "p505", "h89bus", [this](device_slot_interface &device) { h89_right_cards_mms(device); }, "ha_88_3"); From 835630cc7a5fdf8a214f83b3d7cb3a95ca3f85a7 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Fri, 17 Jan 2025 15:43:18 +0100 Subject: [PATCH 48/80] ef9345: implement service row for the TS9347 variant (#13225) With this change, the minitel2 can correctly display its status row at the top of the screen. --- src/devices/video/ef9345.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/devices/video/ef9345.cpp b/src/devices/video/ef9345.cpp index f4780a7e79094..16436fe72f405 100644 --- a/src/devices/video/ef9345.cpp +++ b/src/devices/video/ef9345.cpp @@ -378,7 +378,23 @@ void ef9345_device::zoom(uint8_t *pix, uint16_t n) uint16_t ef9345_device::indexblock(uint16_t x, uint16_t y) { uint16_t i = x, j; - j = (y == 0) ? ((m_tgs & 0x20) >> 5) : ((m_ror & 0x1f) + y - 1); + + if (m_variant == EF9345_MODE::TYPE_EF9345) + { + // On the EF9345 the service row is always displayed at the top, and + // it can be fetched from either Y=0 or Y=1. + j = (y == 0) ? ((m_tgs & 0x20) >> 5) : ((m_ror & 0x1f) + y - 1); + } + else + { + // On the TS9347 the service row is displayed either at the top or at + // the bottom, and it is always fetched from Y=0. + if (m_tgs & 1) + j = (y == 24) ? 0 : ((m_ror & 0x1f) + y); + else + j = (y == 0) ? 0 : ((m_ror & 0x1f) + y - 1); + } + j = (j > 31) ? (j - 24) : j; //right side of a double width character From 32bcdcf70675674d43eeb189d14f51b3521ed6f2 Mon Sep 17 00:00:00 2001 From: Paul-Arnold <98924583+Paul-Arnold@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:36:42 +0000 Subject: [PATCH 49/80] bfm/bfcobra.cpp: Load Inquizitor attract mode ROM, and added alternate versions as clones. (#13196) New clones marked not working ---------------------------- Inquizitor (V1.2, alt) Inquizitor (V1.1) --- src/mame/bfm/bfcobra.cpp | 53 ++++++++++++++++++++++++++++------------ src/mame/mame.lst | 2 ++ 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/mame/bfm/bfcobra.cpp b/src/mame/bfm/bfcobra.cpp index abc0523d37742..9f1a7703f2703 100644 --- a/src/mame/bfm/bfcobra.cpp +++ b/src/mame/bfm/bfcobra.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Philip Bennett, Anonymous +// copyright-holders:Philip Bennett, Paul Arnold /****************************************************************************** Bell-Fruit Cobra I/II and Viper Hardware @@ -2812,25 +2812,44 @@ void bfcobjam_state::bfcobjam_with_dmd(machine_config &config) ***************************************************************************/ +// Version 1.2 ROM_START( inquiztr ) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "inq6809", 0x08000, 0x08000, CRC(ae996600) SHA1(f360399e77b81399d910770fa8106c196f04363c) ) ROM_REGION( 0x20000, "user1", 0 ) - ROM_LOAD( "9576002.bin", 0x00000, 0x10000, CRC(5b8c8a04) SHA1(af5328fee79c370f45bff36f534aaf50964b6900) ) + ROM_LOAD( "inqv1.2", 0x00000, 0x10000, CRC(5b8c8a04) SHA1(af5328fee79c370f45bff36f534aaf50964b6900) ) + ROM_LOAD( "9576002.bin", 0x10000, 0x010000, CRC(f9cd196c) SHA1(0ac31d87462cbee6f41e19aefe740d876910bdf5) ) - ROM_REGION( 0x20000, "altuser1", 0 ) - ROM_LOAD( "9576028.bin", 0x10000, 0x10000, CRC(2d85682c) SHA1(baec47bff4b8beef5afbb737dc57b22bf93ebcf8) ) + ROM_REGION( 0x1c2000, "user2", 0 ) + ROM_LOAD( "inqdisk.img", 0x000000, 0x1c2000, NO_DUMP ) +ROM_END - // these look quite different.. (like they belong together) but booting with these gives a checksum error (banking?) - ROM_LOAD( "inqvypp1", 0x00000, 0x010000, CRC(9bac8c6e) SHA1(15e24d60c2f3997e637694f60daa552b22628766) ) - ROM_LOAD( "inqvypp2", 0x10000, 0x010000, CRC(f9cd196c) SHA1(0ac31d87462cbee6f41e19aefe740d876910bdf5) ) +// Alternate Version 1.2 +ROM_START( inquiztr12a ) + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "inq6809", 0x08000, 0x08000, CRC(ae996600) SHA1(f360399e77b81399d910770fa8106c196f04363c) ) + + ROM_REGION( 0x20000, "user1", 0 ) + ROM_LOAD( "9576028.bin", 0x00000, 0x10000, CRC(2d85682c) SHA1(baec47bff4b8beef5afbb737dc57b22bf93ebcf8) ) + ROM_LOAD( "9576002.bin", 0x10000, 0x010000, CRC(f9cd196c) SHA1(0ac31d87462cbee6f41e19aefe740d876910bdf5) ) ROM_REGION( 0x1c2000, "user2", 0 ) ROM_LOAD( "inqdisk.img", 0x000000, 0x1c2000, NO_DUMP ) ROM_END +// Version 1.1 +ROM_START( inquiztr11 ) + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "inq6809", 0x08000, 0x08000, CRC(ae996600) SHA1(f360399e77b81399d910770fa8106c196f04363c) ) + + ROM_REGION( 0x20000, "user1", 0 ) + ROM_LOAD( "95760001.bin", 0x00000, 0x010000, CRC(314aa59e) SHA1(b65daa58465a789274d542b3ffd5e2f9129f24f9) ) + ROM_LOAD( "9576002.bin", 0x10000, 0x010000, CRC(f9cd196c) SHA1(0ac31d87462cbee6f41e19aefe740d876910bdf5) ) + ROM_REGION( 0x1c2000, "user2", 0 ) + ROM_LOAD( "inqdisk.img", 0x000000, 0x1c2000, NO_DUMP ) +ROM_END ROM_START( escounts ) @@ -2978,12 +2997,14 @@ ROM_END } // Anonymous namespace -GAME( 1989, inquiztr, 0, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "Inquizitor", MACHINE_NOT_WORKING ) -GAME( 1990, escounts, 0, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "Every Second Counts (39-360-053)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1991, trebltop, 0, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "Treble Top (39-360-070)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1991, beeline, 0, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "Beeline (39-360-075)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1991, quizvadr, 0, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "Quizvaders (39-360-078)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, qos, 0, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "A Question of Sport (set 1, 39-960-107)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, qosa, qos, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "A Question of Sport (set 2, 39-960-099)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, qosb, qos, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "A Question of Sport (set 3, 39-960-089)", MACHINE_IMPERFECT_GRAPHICS ) -GAMEL(1994, brkball, 0, bfcobjam_with_dmd,brkball, bfcobjam_state,init_bfcobjam,ROT0, "BFM/ATOD", "Break Ball", MACHINE_IMPERFECT_GRAPHICS, layout_brkball ) +GAME( 1989, inquiztr, 0, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "Inquizitor (V1.2)", MACHINE_NOT_WORKING ) +GAME( 1989, inquiztr12a, inquiztr, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "Inquizitor (V1.2, alt)", MACHINE_NOT_WORKING ) +GAME( 1989, inquiztr11, inquiztr, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "Inquizitor (V1.1)", MACHINE_NOT_WORKING ) +GAME( 1990, escounts, 0, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "Every Second Counts (39-360-053)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1991, trebltop, 0, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "Treble Top (39-360-070)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1991, beeline, 0, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "Beeline (39-360-075)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1991, quizvadr, 0, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "Quizvaders (39-360-078)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, qos, 0, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "A Question of Sport (set 1, 39-960-107)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, qosa, qos, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "A Question of Sport (set 2, 39-960-099)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, qosb, qos, bfcobra, bfcobra, bfcobra_state, init_bfcobra, ROT0, "BFM", "A Question of Sport (set 3, 39-960-089)", MACHINE_IMPERFECT_GRAPHICS ) +GAMEL(1994, brkball, 0, bfcobjam_with_dmd,brkball, bfcobjam_state,init_bfcobjam,ROT0, "BFM/ATOD", "Break Ball", MACHINE_IMPERFECT_GRAPHICS, layout_brkball ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index b6d974c7f95d1..b96af179d8107 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -9296,6 +9296,8 @@ beeline // 1991 BFM brkball // 1994 BFM / ATOD escounts // 1990 BFM inquiztr // 1989 BFM +inquiztr11 // 1989 BFM +inquiztr12a // 1989 BFM qos // 1992 BFM qosa // 1992 BFM qosb // 1992 BFM From 8a960d3525f49f006db6dca1052a00331eb2e8e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A4rt=20P=C3=B5der?= Date: Fri, 17 Jan 2025 19:17:46 +0200 Subject: [PATCH 50/80] juku.xml: Added JUKU E5104 system disks from 1988-1989. (#13217) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New working software list items (juku.xml) ----------------------------- E5104 System Disks [Elektroonikamuuseum, Märt Põder] EKTA Utilities Disk #4 [Elektroonikamuuseum, Märt Põder] --- hash/juku.xml | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/hash/juku.xml b/hash/juku.xml index ca69ab5bcfe53..beca0332ae69e 100644 --- a/hash/juku.xml +++ b/hash/juku.xml @@ -11,7 +11,7 @@ license:CC0-1.0 2018 Универсальный эмулятор - + @@ -24,7 +24,7 @@ license:CC0-1.0 EKDOS 2.29 1988 EKTA - + @@ -41,7 +41,7 @@ license:CC0-1.0 EKDOS 2.30 1989 EKTA - + @@ -54,5 +54,47 @@ license:CC0-1.0 + + E5104 System Disks + 1988 + Baltiyets + + + + + + + + + + + + + + + + + + + + + + + + + EKTA Utilities Disk #4 + 1989 + EKTA + + + + + + + + + + + From 02ee19d3fde5731eccfe38737e558c84460f6fbd Mon Sep 17 00:00:00 2001 From: ClawGrip Date: Fri, 17 Jan 2025 19:03:44 +0100 Subject: [PATCH 51/80] vtech/vtech5303.cpp: Added a skeleton driver for the VTech Paw Patrol Learning Tablet. (#13236) Internal CPU ROM is not dumped New systems marked not working ------------------------------ Paw Patrol: The Movie Learning Tablet (Spanish) [ArcadeHacker] --- src/mame/mame.lst | 3 ++ src/mame/vtech/vtech5303.cpp | 86 ++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 src/mame/vtech/vtech5303.cpp diff --git a/src/mame/mame.lst b/src/mame/mame.lst index b96af179d8107..4b0829646471e 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -47145,6 +47145,9 @@ laser350 // 1984? Laser 350 laser500 // 1984? Laser 500 laser700 // 1984? Laser 700 +@source:vtech/vtech5303.cpp +pawmoviesp // (c) 2022 + @source:vtech/vtech_eu3a12.cpp vreadere diff --git a/src/mame/vtech/vtech5303.cpp b/src/mame/vtech/vtech5303.cpp new file mode 100644 index 0000000000000..8113848dc0575 --- /dev/null +++ b/src/mame/vtech/vtech5303.cpp @@ -0,0 +1,86 @@ +// license:BSD-3-Clause +// copyright-holders: + + +/********************************************************************************************* + + Skeleton driver for toy computers on VTech 5303 hardware. + + PCB with a 25VQ16A serial flash and a 8 MHz xtal on one side and a big glob on the other. + +*********************************************************************************************/ + + +#include "emu.h" + +#include "cpu/m6502/w65c02.h" + +#include "screen.h" +#include "speaker.h" + + +namespace { + + +class vtech5303_state : public driver_device +{ +public: + vtech5303_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_screen(*this, "screen") + { } + + void vtech5303(machine_config &config) ATTR_COLD; + +protected: + required_device m_maincpu; + required_device m_screen; + + uint32_t screen_update_vtech5303(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); +}; + +uint32_t vtech5303_state::screen_update_vtech5303(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + return 0; +} + +/* The Paw Patrol the keyboard has: + -6 "character" buttons (Marshall, Rocky, Chase, Skye, Ryder, Rubble). + -6 "activity" buttons (bone, letters, maths, pairs, maze, adventure). + -26 leter keys in QWERTY layout (QWERTYUIOP ASDFGHJKL ZXCVBNM). + -Mute button to the left of Z. + -3 navigation buttons (right arrow, left arrow, OK). + -Clock button. + The Spanish version repurposes the mute button as a letter key and organises + the letters in alphabetical order (ABCDEFGHIJ KLMNÑOPQR STUVWXYZ) +*/ +INPUT_PORTS_START( vtech5303 ) +INPUT_PORTS_END + +void vtech5303_state::vtech5303(machine_config &config) +{ + W65C02(config, m_maincpu, 8_MHz_XTAL); // Unknown core and frequency, probably 6802 + + SCREEN(config, m_screen, SCREEN_TYPE_LCD); // Monochrome 64x32 LCD screen + m_screen->set_refresh_hz(60); // Guess + m_screen->set_size(64, 32); + m_screen->set_visarea(0, 64-1, 0, 32-1); + m_screen->set_screen_update(FUNC(vtech5303_state::screen_update_vtech5303)); + + SPEAKER(config, "mono").front_left(); +} + +// Spanish machine +ROM_START( pawpatrols ) + ROM_REGION( 0x010000, "maincpu", 0 ) + ROM_LOAD( "internal.bin", 0x000000, 0x010000, NO_DUMP ) // Unknown CPU type, unknown internal ROM size + + ROM_REGION( 0x200300, "program", 0 ) + ROM_LOAD( "vtech_paw_patrol_5303_25vq16a.u5", 0x000000, 0x200300, CRC(fee8abd7) SHA1(4ea120246fb4a7efc699e0295864beba4e3317cc) ) +ROM_END + +} // anonymous namespace + + +CONS( 2022, pawmoviesp, 0, 0, vtech5303, vtech5303, vtech5303_state, empty_init, "VTech", "Paw Patrol: The Movie Learning Tablet (Spanish)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) From 4832f653ea9e4ae5207da4475f2bcece37873b1f Mon Sep 17 00:00:00 2001 From: cam900 Date: Sat, 18 Jan 2025 03:14:44 +0900 Subject: [PATCH 52/80] dataeast/deco156_m.cpp: Updated comments and cleaned up code a little. (#13240) * Updated source file names and system names in comments. * Reduced variable scope, made some variables const, fixed tabulation. --- src/mame/dataeast/deco156_m.cpp | 70 ++++++++++++++++----------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/mame/dataeast/deco156_m.cpp b/src/mame/dataeast/deco156_m.cpp index d1dae4948cbde..5de666c9ee349 100644 --- a/src/mame/dataeast/deco156_m.cpp +++ b/src/mame/dataeast/deco156_m.cpp @@ -6,29 +6,33 @@ The 156 Chip is used on the following games: - deco_mlc.c + dataeast/deco_mlc.cpp - Stadium Hero 96 (stadhr96, stadh96a) - Skull Fang (skullfng) - Dunk Dream '95 / Hoops '96 (ddream95, hoops96) + Stadium Hero 96 (stadhr96*) + Skull Fang (skullfng*) + Dunk Dream '95 / Hoops / Hoops '96 (ddream95, hoops95, hoops96) + Janken Game Acchi Muite Hoi! (acchi) - deco32.c + dataeast/deco32.cpp - Night Slashers (nslasher, nslashej) + Night Slashers (nslasher*) - simpl156 + dataeast/simpl156.cpp Charlie Ninja (charlien) - Magical Drop / Magical Drop Plus / Chain Reaction (magdrop, magdropp, chainrec) - Joe & Mac Returns (joemacr, joemacra) + Magical Drop / Magical Drop Plus 1 / Chain Reaction (magdrop, magdropp, chainrec) + Joe & Mac Returns (joemacr*) Party Time / Ganbare! Gonta!! 2 (prtytime, gangonta) + Osman / Cannon Dancer (osman, candance) - deco156.c + dataeast/deco156.cpp - Osman (osman) - Heavy Smash (hvysmsh) - World Cup Volly '95 (wcvol95) - Backfire!! (backfire, backfira) + Heavy Smash (hvysmsh*) + World Cup Volley '95 (wcvol95*) + + dataeast/backfire.cpp + + Backfire! (backfire*) */ @@ -38,13 +42,9 @@ static void decrypt(uint32_t *src, uint32_t *dst, int length) { - int a; - - for (a = 0; a < length/4; a++) + for (int a = 0; a < length / 4; a++) { - int addr, dword; - - addr = (a & 0xff0000) | 0x92c6; + int addr = (a & 0xff0000) | 0x92c6; if (a & 0x0001) addr ^= 0xce4a; if (a & 0x0002) addr ^= 0x4db2; @@ -63,7 +63,7 @@ static void decrypt(uint32_t *src, uint32_t *dst, int length) if (a & 0x4000) addr ^= 0x1eef; if (a & 0x8000) addr ^= 0xf5a5; - dword = src[addr]; + uint32_t dword = src[addr]; // note that each of the following lines affects exactly two bits @@ -87,35 +87,35 @@ static void decrypt(uint32_t *src, uint32_t *dst, int length) switch (a & 3) { case 0: - dword = bitswap<32>( dword ^ 0xec63197a, - 1, 4, 7, 28, 22, 18, 20, 9, + dword = bitswap<32>(dword ^ 0xec63197a, + 1, 4, 7, 28, 22, 18, 20, 9, 16, 10, 30, 2, 31, 24, 19, 29, - 6, 21, 23, 11, 12, 13, 5, 0, - 8, 26, 27, 15, 14, 17, 25, 3 ); + 6, 21, 23, 11, 12, 13, 5, 0, + 8, 26, 27, 15, 14, 17, 25, 3); break; case 1: - dword = bitswap<32>( dword ^ 0x58a5a55f, + dword = bitswap<32>(dword ^ 0x58a5a55f, 14, 23, 28, 29, 6, 24, 10, 1, - 5, 16, 7, 2, 30, 8, 18, 3, + 5, 16, 7, 2, 30, 8, 18, 3, 31, 22, 25, 20, 17, 0, 19, 27, - 9, 12, 21, 15, 26, 13, 4, 11 ); + 9, 12, 21, 15, 26, 13, 4, 11); break; case 2: - dword = bitswap<32>( dword ^ 0xe3a65f16, + dword = bitswap<32>(dword ^ 0xe3a65f16, 19, 30, 21, 4, 2, 18, 15, 1, 12, 25, 8, 0, 24, 20, 17, 23, 22, 26, 28, 16, 9, 27, 6, 11, - 31, 10, 3, 13, 14, 7, 29, 5 ); + 31, 10, 3, 13, 14, 7, 29, 5); break; case 3: - dword = bitswap<32>( dword ^ 0x28d93783, + dword = bitswap<32>(dword ^ 0x28d93783, 30, 6, 15, 0, 31, 18, 26, 22, 14, 23, 19, 17, 10, 8, 11, 20, - 1, 28, 2, 4, 9, 24, 25, 27, - 7, 21, 13, 29, 5, 3, 16, 12 ); + 1, 28, 2, 4, 9, 24, 25, 27, + 7, 21, 13, 29, 5, 3, 16, 12); break; } @@ -127,8 +127,8 @@ static void decrypt(uint32_t *src, uint32_t *dst, int length) void deco156_decrypt(running_machine &machine) { uint32_t *rom = (uint32_t *)machine.root_device().memregion("maincpu")->base(); - int length = machine.root_device().memregion("maincpu")->bytes(); - std::vector buf(length/4); + int const length = machine.root_device().memregion("maincpu")->bytes(); + std::vector buf(length / 4); memcpy(&buf[0], rom, length); decrypt(&buf[0], rom, length); From d4ed4c401f164721a6ea89cf73b18ade7d918231 Mon Sep 17 00:00:00 2001 From: mamehaze <140764005+mamehaze@users.noreply.github.com> Date: Fri, 17 Jan 2025 19:03:09 +0000 Subject: [PATCH 53/80] Dumped 11 systems (two working). (#13235) * machine/generalplus_gpl16250soc_video.cpp: Treat DMA destination 0 sprite RAM to work around issue in jak_spmm. * cpu/m6502: Use conventional call stack for SuperXaviX. * super_tv_pc_cart.xml: Verified dump of Double Mouse Party. * machine/spg_renderer.cpp: Fixed lower bit depth modes (added games use 6 bits per pixel modes). New working systems --------------------- Bandai Let's! TV Play Nou to Karada o Kitaeru Taikan Zunou Family Mattore (Japan) [David Haywood, Team Europe] Takara / SSD Company LTD Webdiver DX W-05 Gladion (Japan) [David Haywood, TeamEurope] New systems marked not working -------------------------------- Bandai Let's! TV Play Digital Monster Battle Junction (Japan) [David Haywood, Team Europe] Bandai / SSD Company LTD Let's! TV Play Narikiri Taikan Boukenger Hashire! Ute! Mission Start!! (Japan) [David Haywood, TeamEurope] Bandai / SSD Company LTD Let's! TV Play Taikan Cast Off - Kamen Rider Kabuto Clock Up & Rider Kick!! (Japan) [David Haywood, TeamEurope] Enter Tech Leadsinger II (LS-K2) [David Haywood, Sean Riddle] Epoch / SSD Company LTD Doraemon Taikan Take-copter! Sora Tobu Daibouken (Japan) [David Haywood, TeamEurope] Epoch / SSD Company LTD Ishikawa Ryou Excite Golf (Japan) [David Haywood, TeamEurope] JAKKS Pacific Inc / Santa Cruz Games The Amazing Spider-Man and The Masked Menace (JAKKS Pacific TV Game) [David Haywood, TeamEurope] Radica / FarSight Studios Connectv Real Swing Golf (set 2) [David Haywood, Sean Riddle] WinFun TV Art Design Center [David Haywood, TeamEurope] --- hash/super_tv_pc_cart.xml | 3 +- src/devices/cpu/m6502/oxavix.lst | 8 +- src/devices/cpu/m6502/xavix.cpp | 40 ++- src/devices/cpu/m6502/xavix.h | 14 +- src/devices/cpu/m6502/xavix2000.cpp | 1 + .../machine/generalplus_gpl16250soc_video.cpp | 5 + src/devices/machine/spg_renderer.cpp | 41 ++- src/mame/mame.lst | 13 + src/mame/skeleton/leadsinger2.cpp | 108 +++++++ src/mame/tvgames/elan_eu3a14.cpp | 8 +- src/mame/tvgames/generalplus_gpl16250_rom.cpp | 286 +++++------------- src/mame/tvgames/spg2xx.cpp | 65 +++- src/mame/tvgames/xavix.cpp | 56 +++- src/mame/tvgames/xavix.h | 18 +- src/mame/tvgames/xavix2.cpp | 11 + src/mame/tvgames/xavix_2002.cpp | 43 ++- src/mame/tvgames/xavix_v.cpp | 69 ++++- 17 files changed, 533 insertions(+), 256 deletions(-) create mode 100644 src/mame/skeleton/leadsinger2.cpp diff --git a/hash/super_tv_pc_cart.xml b/hash/super_tv_pc_cart.xml index 0f4f59d3788a4..1c3d31e1802f4 100644 --- a/hash/super_tv_pc_cart.xml +++ b/hash/super_tv_pc_cart.xml @@ -40,8 +40,7 @@ license:CC0-1.0 - - + diff --git a/src/devices/cpu/m6502/oxavix.lst b/src/devices/cpu/m6502/oxavix.lst index 9d3c0dcfe955d..84caf0a2277b2 100644 --- a/src/devices/cpu/m6502/oxavix.lst +++ b/src/devices/cpu/m6502/oxavix.lst @@ -4,7 +4,7 @@ callf_xa3 read_stack(SP); - write_special_stack(get_codebank()); + write_special_stack(SP, get_codebank()); dec_special_stack(); TMP2 = read_pc(); PC++; @@ -40,7 +40,7 @@ retf_imp inc_SP(); PC = set_h(PC, read_stack(SP)); inc_special_stack(); - TMP2 = read_special_stack(); + TMP2 = read_special_stack(SP); set_codebank(TMP2); read_pc(); PC++; @@ -55,7 +55,7 @@ brk_xav_imp read_pc(); PC++; } - write_special_stack(get_codebank()); + write_special_stack(SP, get_codebank()); set_codebank(0x00); // epo_efdx, rad_ping and rad_mtrk strongly suggest that interrupts must force bank 0 as code jumps to a ROM pointer stored earlier / a fixed pointer to a rom address in bank 0 dec_special_stack(); write_stack(SP, PC >> 8); @@ -123,7 +123,7 @@ rti_xav_imp inc_SP(); PC = set_h(PC, read_stack(SP)); inc_special_stack(); - TMP2 = read_special_stack(); + TMP2 = read_special_stack(SP); set_codebank(TMP2); prefetch(); diff --git a/src/devices/cpu/m6502/xavix.cpp b/src/devices/cpu/m6502/xavix.cpp index b97bd9999a07b..bf5eb25b92522 100644 --- a/src/devices/cpu/m6502/xavix.cpp +++ b/src/devices/cpu/m6502/xavix.cpp @@ -106,24 +106,52 @@ xavix_device::mi_xavix::mi_xavix(xavix_device *_base) base = _base; } -void xavix_device::write_special_stack(uint8_t data) +void xavix_device::write_special_stack(uint32_t addr, uint8_t data) { - m_special_stack[m_special_stackpos&0xff] = data; + if (m_use_private_stack_for_extra_callf_byte) + { + m_special_stack[m_special_stackpos & 0xff] = data; + } + else + { + write_stack(addr, data); + } } void xavix_device::dec_special_stack() { - m_special_stackpos--; + if (m_use_private_stack_for_extra_callf_byte) + { + m_special_stackpos--; + } + else + { + dec_SP(); + } } void xavix_device::inc_special_stack() { - m_special_stackpos++; + if (m_use_private_stack_for_extra_callf_byte) + { + m_special_stackpos++; + } + else + { + inc_SP(); + } } -uint8_t xavix_device::read_special_stack() +uint8_t xavix_device::read_special_stack(uint32_t addr) { - return m_special_stack[m_special_stackpos&0xff]; + if (m_use_private_stack_for_extra_callf_byte) + { + return m_special_stack[m_special_stackpos & 0xff]; + } + else + { + return read_stack(addr); + } } diff --git a/src/devices/cpu/m6502/xavix.h b/src/devices/cpu/m6502/xavix.h index 1afa58d365cbe..5363bb77d3660 100644 --- a/src/devices/cpu/m6502/xavix.h +++ b/src/devices/cpu/m6502/xavix.h @@ -192,10 +192,10 @@ class xavix_device : public m6502_device { void set_databank(uint8_t bank); uint8_t get_databank(); - void write_special_stack(uint8_t data); + void write_special_stack(uint32_t addr, uint8_t data); void dec_special_stack(); void inc_special_stack(); - uint8_t read_special_stack(); + uint8_t read_special_stack(uint32_t addr); /* we store the additional 'codebank' used for far calls in a different, private stack this seems to be neccessary for 'rad_hnt2' not to crash when bringing up the calibration / score table screens @@ -211,6 +211,16 @@ class xavix_device : public m6502_device { uint8_t read_zeropage(uint32_t addr); void write_zeropage(uint32_t addr, uint8_t val); + // Some original XaviX games seemed to suggest that the extra byte of the far calls went to a different + // stack, but dblmouse on suprtvpc does direct stack manipulation which challenges this assumption. + // It could be a SuperXaviX vs XaviX differences however, so currently leaving this as a toggle for testing. + // + // pausing in rad_hnt2 (press shift when on the map) is broken without this logic as the stack becomes too + // big with the extra bytes + // + // we currently use the private stack for regular XaviX but not for the later CPUs, however the root cause + // of needing it for regular XaviX could be somewhere else + bool m_use_private_stack_for_extra_callf_byte = true; }; enum { diff --git a/src/devices/cpu/m6502/xavix2000.cpp b/src/devices/cpu/m6502/xavix2000.cpp index a33218423e4ee..328a357e23e80 100644 --- a/src/devices/cpu/m6502/xavix2000.cpp +++ b/src/devices/cpu/m6502/xavix2000.cpp @@ -38,6 +38,7 @@ DEFINE_DEVICE_TYPE(XAVIX2002, xavix2002_device, "xavix2002", "XaviX (SSD 2002) ( xavix2000_device::xavix2000_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : xavix_device(mconfig, type, tag, owner, clock) { + m_use_private_stack_for_extra_callf_byte = false; } xavix2000_device::xavix2000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : diff --git a/src/devices/machine/generalplus_gpl16250soc_video.cpp b/src/devices/machine/generalplus_gpl16250soc_video.cpp index 1b878ca8e41f4..5c05f545bf22d 100644 --- a/src/devices/machine/generalplus_gpl16250soc_video.cpp +++ b/src/devices/machine/generalplus_gpl16250soc_video.cpp @@ -779,6 +779,11 @@ void gcm394_base_video_device::video_dma_size_trigger_w(address_space &space, ui LOGMASKED(LOG_GCM394_VIDEO_DMA, "%s: doing sprite / video DMA source %04x dest %04x size %04x value of 707e (bank) %04x value of 707f %04x\n", machine().describe_context(), m_videodma_source, m_videodma_dest, m_videodma_size, m_707e_spritebank, m_707f ); + // jak_spmm sets dest to 0 when it wants to write to spriteram, looks intentional? + // does something else force writes to go to spriteram or does 0 always just mean there? + if (m_videodma_dest == 0) + m_videodma_dest = 0x7400; + for (int i = 0; i <= m_videodma_size; i++) { uint16_t dat = space.read_word(m_videodma_source+i); diff --git a/src/devices/machine/spg_renderer.cpp b/src/devices/machine/spg_renderer.cpp index 0bb116ef784eb..7e02154d7982e 100644 --- a/src/devices/machine/spg_renderer.cpp +++ b/src/devices/machine/spg_renderer.cpp @@ -255,7 +255,8 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang uint32_t tilemap = tilemapregs[2]; uint32_t palette_map = tilemapregs[3]; - //popmessage("draw draw_linemap bases %04x %04x\n", tilemap, palette_map); + //if (scanline == 128) + // popmessage("draw draw_linemap reg0 %04x reg1 %04x bases %04x %04x\n", tilemapregs[0], tilemapregs[1], tilemap, palette_map); //uint32_t xscroll = scrollregs[0]; uint32_t yscroll = scrollregs[1]; @@ -294,26 +295,36 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang } else { - for (int i = 0; i < 320 / 2; i++) - { - uint8_t palette_entry; - uint16_t color; - const uint16_t data = spc.read_word(sourcebase + i); + const uint32_t attr = tilemapregs[0]; + const uint8_t bpp = attr & 0x0003; + const uint32_t nc_bpp = ((bpp)+1) << 1; + uint32_t palette_offset = (attr & 0x0f00) >> 4; + palette_offset >>= nc_bpp; + palette_offset <<= nc_bpp; - palette_entry = (data & 0x00ff); - color = paletteram[palette_entry]; + uint32_t bits = 0; + uint32_t nbits = 0; - if (!(color & 0x8000)) - { - m_linebuf[(i * 2) + 0] = color & 0x7fff; + for (int i = 0; i < 320; i++) + { + bits <<= nc_bpp; + if (nbits < nc_bpp) + { + uint16_t b = spc.read_word(sourcebase++ & 0x3fffff); + b = (b << 8) | (b >> 8); + bits |= b << (nc_bpp - nbits); + nbits += 16; } + nbits -= nc_bpp; + + uint32_t pal = palette_offset + (bits >> 16); + bits &= 0xffff; - palette_entry = (data & 0xff00) >> 8; - color = paletteram[palette_entry]; + uint16_t rgb = paletteram[pal]; - if (!(color & 0x8000)) + if (!(rgb & 0x8000)) { - m_linebuf[(i * 2) + 1] = color & 0x7fff; + m_linebuf[i] = rgb; } } } diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 4b0829646471e..787947c17a43e 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -42710,6 +42710,9 @@ dbzscout @source:skeleton/kron.cpp kron180 // 1995 Kron Ltd, Ukraine +@source:skeleton/leadsinger2.cpp +leadsng2 + @source:skeleton/lee1214.cpp lee1214d // @@ -45874,6 +45877,7 @@ batvgc rad_gtg rad_rsg rad_rsgp +rad_rsgpa rad_foot rad_bb3 rad_bb3p @@ -45917,6 +45921,7 @@ gameu50 gameu108 gormiti imgame +jak_spmm myac220 smartfp // Smart Fit Park smartfpf @@ -46021,10 +46026,12 @@ zone3d ablkickb abltenni // anpantv +ban_krkk comil // ddr33v decathln decathlna +dmbtjunc doraglob // (c) 2007 VTech doraglobf doraglobg @@ -46067,6 +46074,7 @@ virtbb virtten vtechtvsgr // (c) 2006 VTech vtechtvssp // (c) 2006 VTech +wfart wfcentro @source:tvgames/spg2xx_digimake.cpp @@ -46347,6 +46355,7 @@ tak_gin // tak_geig // tak_hamr // tak_town // +tak_wdg // tak_zuba // tcarnavi // tom_tvho // @@ -46364,6 +46373,7 @@ ltv_naru // domfitad // dombikec // epo_dabj +epo_dtcj @source:tvgames/xavix_2000.cpp ban_omt // @@ -46388,9 +46398,12 @@ ttv_swj // @source:tvgames/xavix_2002.cpp anpanmdx apmj2009 +ban_bkgj ban_dn1j ban_kksj +ban_utmj epo_ntpj +epo_rgfj ban_ordj domdance // domfitch // diff --git a/src/mame/skeleton/leadsinger2.cpp b/src/mame/skeleton/leadsinger2.cpp new file mode 100644 index 0000000000000..a3574148cfc18 --- /dev/null +++ b/src/mame/skeleton/leadsinger2.cpp @@ -0,0 +1,108 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +/****************************************************************************** + +-------- Label on product -------- + +Enter Tech +Music Video Karaoke +MODEL: LS-K2 + +-------- Boot Screen -------- + +MVK +Music Video / MP3 Karaoke +Leadsinger II +www.leadsinger.com + +-------- Main SoC -------- + +SUNPLUS +SPHE8104AW +0729-H +0001697 + +-------- ROM -------- + +EXCELSEMI +ES29LV800EB-70TG +0720 + +-------- RAM -------- + +SAMSUNG 710 +K4S641632K-U75 + +-------- Other -------- + +27Mhz Xtal +Card Slot + +*******************************************************************************/ + +#include "emu.h" + +#include "screen.h" +#include "speaker.h" + +namespace { + +class leadsng2_state : public driver_device +{ +public: + leadsng2_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_screen(*this, "screen") + { } + + void leadsng2(machine_config &config) ATTR_COLD; + +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + +private: + required_device m_screen; + + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); +}; + +uint32_t leadsng2_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + return 0; +} + +void leadsng2_state::machine_start() +{ + +} + +void leadsng2_state::machine_reset() +{ +} + +static INPUT_PORTS_START( leadsng2 ) +INPUT_PORTS_END + +void leadsng2_state::leadsng2(machine_config &config) +{ + // unknown CPU core + + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(60); + m_screen->set_size(320, 262); + m_screen->set_visarea(0, 320-1, 0, 240-1); + m_screen->set_screen_update(FUNC(leadsng2_state::screen_update)); + + SPEAKER(config, "lspeaker").front_left(); + SPEAKER(config, "rspeaker").front_right(); +} + +ROM_START( leadsng2 ) + ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASEFF ) + ROM_LOAD( "ls-k2_es29lv800eb_004a225b.bin", 0x000000, 0x100000, CRC(e70f1e1f) SHA1(5aa3187adffcba5bd4a9e3e89a1c210d7f1a978e) ) +ROM_END + +} // anonymous namespace + +CONS( 200?, leadsng2, 0, 0, leadsng2, leadsng2, leadsng2_state, empty_init, "Enter Tech", "Leadsinger II (LS-K2)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) diff --git a/src/mame/tvgames/elan_eu3a14.cpp b/src/mame/tvgames/elan_eu3a14.cpp index a5ebe0685877a..cb95a0f9a2168 100644 --- a/src/mame/tvgames/elan_eu3a14.cpp +++ b/src/mame/tvgames/elan_eu3a14.cpp @@ -855,6 +855,10 @@ ROM_START( rad_rsgp ) ROM_LOAD( "realswinggolf.bin", 0x000000, 0x400000, CRC(89e5b6a6) SHA1(0b14aa84d7e7ae7190cd64e3eb125de2104342bc) ) ROM_END +ROM_START( rad_rsgpa ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "realswinggolf_multilanguage.bin", 0x000000, 0x400000, CRC(c03752a6) SHA1(7e9cc804edf0c23a8dedfa0c0a51d1bc811ea5c1) ) +ROM_END ROM_START( rad_foot ) ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) @@ -977,8 +981,8 @@ ROM_END CONS( 2006, rad_gtg, 0, 0, radica_eu3a14_altrambase_adc, rad_gtg, elan_eu3a14_state, empty_init, "Radica / FarSight Studios (licensed from Incredible Technologies)", "Golden Tee Golf: Home Edition", MACHINE_NOT_WORKING ) CONS( 2005, rad_rsg, 0, 0, radica_eu3a14_altrambase, rad_rsg, elan_eu3a14_state, empty_init, "Radica / FarSight Studios", "Play TV Real Swing Golf", MACHINE_NOT_WORKING ) -// some Connectv branded Real Swing Golf units have a language selection (checksum in test mode confirmed as different on said units) -CONS( 2005, rad_rsgp, rad_rsg, 0, radica_eu3a14p_altrambase, rad_rsg, elan_eu3a14_state, empty_init, "Radica / FarSight Studios", "Connectv Real Swing Golf", MACHINE_NOT_WORKING ) +CONS( 2005, rad_rsgp, rad_rsg, 0, radica_eu3a14p_altrambase, rad_rsg, elan_eu3a14_state, empty_init, "Radica / FarSight Studios", "Connectv Real Swing Golf (set 1)", MACHINE_NOT_WORKING ) // English only +CONS( 2005, rad_rsgpa,rad_rsg, 0, radica_eu3a14p_altrambase, rad_rsg, elan_eu3a14_state, empty_init, "Radica / FarSight Studios", "Connectv Real Swing Golf (set 2)", MACHINE_NOT_WORKING ) // English, German, French, Spanish, Italian // also has a Connectv Real Soccer logo in the roms, apparently unused, maybe that was to be the US title (without the logo being changed to Play TV) but Play TV Soccer ended up being a different game licensed from Epoch instead. CONS( 2006, rad_foot, 0, 0, radica_eu3a14p, radica_foot, elan_eu3a14_state, empty_init, "Radica / Medialink", "Connectv Football", MACHINE_NOT_WORKING ) diff --git a/src/mame/tvgames/generalplus_gpl16250_rom.cpp b/src/mame/tvgames/generalplus_gpl16250_rom.cpp index 6408640753529..ef44329c50439 100644 --- a/src/mame/tvgames/generalplus_gpl16250_rom.cpp +++ b/src/mame/tvgames/generalplus_gpl16250_rom.cpp @@ -16,33 +16,10 @@ #include "generalplus_gpl16250.h" -static INPUT_PORTS_START( smartfp ) - PORT_START("IN0") - // entirely non-standard mat based controller (0-11 are where your feet are placed normally, row of selection places to step above those) - // no sensible default mapping unless forced - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_CODE(KEYCODE_Q) PORT_NAME("0") - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_CODE(KEYCODE_W) PORT_NAME("1") - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_CODE(KEYCODE_E) PORT_NAME("2") - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_CODE(KEYCODE_R) PORT_NAME("3") - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_CODE(KEYCODE_T) PORT_NAME("4") - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_CODE(KEYCODE_Y) PORT_NAME("5") - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON11 ) PORT_CODE(KEYCODE_U) PORT_NAME("6") - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON12 ) PORT_CODE(KEYCODE_I) PORT_NAME("7") - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON13 ) PORT_CODE(KEYCODE_O) PORT_NAME("8") - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON14 ) PORT_CODE(KEYCODE_P) PORT_NAME("9") - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON15 ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("10") - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON16 ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("11") - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(KEYCODE_A) PORT_NAME("Circle / Red") - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(KEYCODE_S) PORT_NAME("Square / Orange") - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(KEYCODE_D) PORT_NAME("Triangle / Yellow") - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_CODE(KEYCODE_F) PORT_NAME("Star / Blue") - - PORT_START("IN1") - PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN2") - PORT_DIPNAME( 0x0001, 0x0001, "IN2" ) +static INPUT_PORTS_START( base ) + PORT_START("IN0") + PORT_DIPNAME( 0x0001, 0x0001, "IN0" ) PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) @@ -66,49 +43,15 @@ static INPUT_PORTS_START( smartfp ) PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("HOME") - PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) -INPUT_PORTS_END - -static INPUT_PORTS_START( gormiti ) // DOWN with A+B+C for test mode? - PORT_START("IN0") - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) - PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_START1 ) // causes long delay in test mode? + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) @@ -226,124 +169,85 @@ static INPUT_PORTS_START( gormiti ) // DOWN with A+B+C for test mode? PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) INPUT_PORTS_END +static INPUT_PORTS_START( jak_spmm ) + PORT_INCLUDE( base ) + + // are these inputs meant to be split across 3 ports, or is that a unSP2.0 / GPL16250 emulation bug? + PORT_MODIFY("IN0") + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Pause/Menu") + + PORT_MODIFY("IN1") + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) + + PORT_MODIFY("IN2") + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON3 ) +INPUT_PORTS_END + +static INPUT_PORTS_START( smartfp ) + PORT_INCLUDE( base ) + + PORT_MODIFY("IN0") + // entirely non-standard mat based controller (0-11 are where your feet are placed normally, row of selection places to step above those) + // no sensible default mapping unless forced + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_CODE(KEYCODE_Q) PORT_NAME("0") + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_CODE(KEYCODE_W) PORT_NAME("1") + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_CODE(KEYCODE_E) PORT_NAME("2") + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_CODE(KEYCODE_R) PORT_NAME("3") + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_CODE(KEYCODE_T) PORT_NAME("4") + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_CODE(KEYCODE_Y) PORT_NAME("5") + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON11 ) PORT_CODE(KEYCODE_U) PORT_NAME("6") + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON12 ) PORT_CODE(KEYCODE_I) PORT_NAME("7") + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON13 ) PORT_CODE(KEYCODE_O) PORT_NAME("8") + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON14 ) PORT_CODE(KEYCODE_P) PORT_NAME("9") + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON15 ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("10") + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON16 ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("11") + + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(KEYCODE_A) PORT_NAME("Circle / Red") + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(KEYCODE_S) PORT_NAME("Square / Orange") + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(KEYCODE_D) PORT_NAME("Triangle / Yellow") + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_CODE(KEYCODE_F) PORT_NAME("Star / Blue") + + PORT_MODIFY("IN1") + PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_MODIFY("IN2") + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("HOME") +INPUT_PORTS_END + +static INPUT_PORTS_START( gormiti ) // DOWN with A+B+C for test mode? + PORT_INCLUDE( base ) + + PORT_MODIFY("IN0") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_START1 ) // causes long delay in test mode? +INPUT_PORTS_END static INPUT_PORTS_START( tkmag220 ) - PORT_START("IN0") - PORT_DIPNAME( 0x0001, 0x0001, "IN0" ) - PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_INCLUDE( base ) - PORT_START("IN1") - PORT_DIPNAME( 0x0001, 0x0001, "IN1" ) - PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_MODIFY("IN1") PORT_DIPNAME( 0x0040, 0x0000, "Important" ) // gets stuck in inf loop if this is wrong PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_START("IN2") + PORT_MODIFY("IN2") PORT_DIPNAME( 0x0001, 0x0001, "IN2" ) // set 0x0001 and 0x0002 on to get a test mode (some of the ROM banks fail their test, but dumps were repeatable, should be verified on another unit) PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) @@ -351,21 +255,8 @@ static INPUT_PORTS_START( tkmag220 ) PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Menu") - PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) INPUT_PORTS_END - static INPUT_PORTS_START( gameu ) PORT_START("IN0") PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -404,7 +295,6 @@ static INPUT_PORTS_START( beijuehh ) PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // this one must be kept in this state or the machine will freeze after a few seconds? PORT_BIT( 0xe000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("IN3") // is there a 4th button? PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON1 ) @@ -413,70 +303,51 @@ static INPUT_PORTS_START( beijuehh ) PORT_BIT( 0xfff0, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END +ROM_START( jak_spmm ) + ROM_REGION(0x800000, "maincpu", ROMREGION_ERASE00) + ROM_LOAD16_WORD_SWAP("amazingspiderman.bin", 0x000000, 0x400000, CRC(00d2a62c) SHA1(6a08760dc6dabc2aea32e6eb8b1f98e7edf60791) ) + // has a HT24LC04 to store settings +ROM_END ROM_START( smartfp ) - //ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different) - //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) - ROM_REGION(0x800000, "maincpu", ROMREGION_ERASE00) ROM_LOAD16_WORD_SWAP("smartfitparkuk.bin", 0x000000, 0x800000, CRC(2072d7d0) SHA1(eaa4f254d6dee3a7eac64ae2204dd6291e4d27cc) ) ROM_END ROM_START( smartfps ) - //ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different) - //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) - ROM_REGION(0x800000, "maincpu", ROMREGION_ERASE00) ROM_LOAD16_WORD_SWAP("smartfitpark.bin", 0x000000, 0x800000, CRC(ada84507) SHA1(a3a80bf71fae62ebcbf939166a51d29c24504428) ) ROM_END ROM_START( smartfpf ) - //ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different) - //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) - ROM_REGION(0x800000, "maincpu", ROMREGION_ERASE00) ROM_LOAD16_WORD_SWAP("smartfitpark_fr.bin", 0x000000, 0x800000, CRC(e6d3ba29) SHA1(14e4632997318329be3291f2c4e62f088181f3c8) ) ROM_END ROM_START( gormiti ) - //ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different) - //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) - ROM_REGION(0x800000, "maincpu", ROMREGION_ERASE00) ROM_LOAD16_WORD_SWAP("gormiti.bin", 0x000000, 0x800000, CRC(71b82d41) SHA1(169b35dc7bdd05b7b32176ddf901ace27736cb86) ) ROM_END ROM_START( tkmag220 ) - //ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different) - //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) - ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD16_WORD_SWAP( "taikee220.bin", 0x0000000, 0x8000000, CRC(02881534) SHA1(a0e0c9cfa3a6b1c6107f06abd3268b82bd663d06) ) ROM_END ROM_START( imgame ) - //ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different) - //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) - ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 ) // the 2nd half of this ROM required multiple attempts to get a matching dump, so could be suspect, might also be unused as this only has 120 games ROM_LOAD16_WORD_SWAP( "imgame.bin", 0x0000000, 0x8000000, CRC(6fba9021) SHA1(852f4c0aaed682aa8ff5b8cd52313ea2d3d920a1)) ROM_END ROM_START( myac220 ) - //ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different) - //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) - ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD16_WORD_SWAP( "myarcadegogamerportable.bin", 0x0000000, 0x8000000, BAD_DUMP CRC(c929a2fa) SHA1(e99007ccc45a268267b4ea0efaf22e3117f5a6bd) ) // several sections seemed to be erased, was repaired with data from tkmag220, likely good but should be verified ROM_END ROM_START( beijuehh ) - //ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different) - //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) - ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD16_WORD_SWAP( "beijeu.bin", 0x0000000, 0x8000000, CRC(e7b968af) SHA1(a39a3a70e6e0827e4395e09e55983eb9e9348e4a) ) // some address lines might be swapped ROM_END @@ -493,7 +364,6 @@ ROM_START( bornkidh ) ROM_CONTINUE(0x3800000, 0x0800000) ROM_END - ROM_START( gameu50 ) ROM_REGION( 0x2000000, "maincpu", ROMREGION_ERASEFF ) ROM_LOAD16_WORD_SWAP( "gameu.bin", 0x000000, 0x2000000, CRC(13c42bce) SHA1(f769ceabb8ab4e60c0d663dffd5cca91c6aec206) ) @@ -784,6 +654,8 @@ void gameu_handheld_game_state::init_gameu108() } // the JAKKS ones of these seem to be known as 'Generalplus GPAC500' hardware? +CONS(2008, jak_spmm, 0, 0, base, jak_spmm, gormiti_game_state, empty_init, "JAKKS Pacific Inc / Santa Cruz Games", "The Amazing Spider-Man and The Masked Menace (JAKKS Pacific TV Game)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) + CONS(2009, smartfp, 0, 0, base, smartfp, gcm394_game_state, empty_init, "Fisher-Price", "Fun 2 Learn Smart Fit Park (UK)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) CONS(2009, smartfps, smartfp, 0, base, smartfp, gcm394_game_state, empty_init, "Fisher-Price", "Fun 2 Learn Smart Fit Park (Spain)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) CONS(2009, smartfpf, smartfp, 0, base, smartfp, gcm394_game_state, empty_init, "Fisher-Price", "Fun 2 Learn Smart Fit Park (France)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // boxart simply has 'Smart Fit' diff --git a/src/mame/tvgames/spg2xx.cpp b/src/mame/tvgames/spg2xx.cpp index 57ef4f7c64e2f..fdcd96040ab8a 100644 --- a/src/mame/tvgames/spg2xx.cpp +++ b/src/mame/tvgames/spg2xx.cpp @@ -485,6 +485,39 @@ static INPUT_PORTS_START( spg2xx ) // base structure for easy debugging / figuri PORT_DIPSETTING( 0x8000, "8000" ) INPUT_PORTS_END +static INPUT_PORTS_START( dmbtjunc ) + PORT_INCLUDE( spg2xx ) + + PORT_MODIFY("P1") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Red") + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 Green") + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P1 Blue") + // there's a 2nd set of buttons for P2, where do they map? + // battery state is likely in here too +INPUT_PORTS_END + +static INPUT_PORTS_START( ban_krkk ) + // inputs shown in hidden text mode, although it refers to the physical placement of the each button on the mat rather than the colours / symbols + PORT_INCLUDE( spg2xx ) + + PORT_MODIFY("P1") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Blue/Top-Left") + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Yellow/Top-Right") + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Red/Bottom-Left") + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("P1 Green/Bottom-Right") + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("P1 Select") + + PORT_MODIFY("P3") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Blue/Top-Left") + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Yellow/Top-Right") + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Red/Bottom-Left") + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Green/Bottom-Right") + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Select") + + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_CUSTOM ) // Battery State +INPUT_PORTS_END + + static INPUT_PORTS_START( drumsups ) PORT_INCLUDE( spg2xx ) @@ -495,7 +528,6 @@ static INPUT_PORTS_START( drumsups ) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Drum pad 3: Purple") PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Drum pad 4: Red") PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Drum pad 5: Green") - INPUT_PORTS_END static INPUT_PORTS_START( lexiart ) @@ -2333,6 +2365,11 @@ ROM_START( wfcentro ) ROM_LOAD16_WORD_SWAP( "winfuncentro.bin", 0x000000, 0x800000, CRC(fd6ad052) SHA1(78af844729bf4843dc70531349e38a8c25caf748) ) ROM_END +ROM_START( wfart ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD16_WORD_SWAP( "artstudio.bin", 0x000000, 0x800000, CRC(f5fd657e) SHA1(0005826a5b22a17cafffaf7328092c8d84217398) ) +ROM_END + ROM_START( lexiart ) ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD16_WORD_SWAP( "lexibookartstudio.u3", 0x000000, 0x800000, CRC(fc417abb) SHA1(c0a18a2cf11c47086722f0ec88410614fed7c6f7) ) @@ -2381,6 +2418,16 @@ ROM_START( anpantv ) ROM_LOAD16_WORD_SWAP( "anpanman_tv.bin", 0x000000, 0x800000, CRC(5e32dc1a) SHA1(bae260ffc56f5315cdafd5bc40966ec6d31e267f) ) ROM_END +ROM_START( dmbtjunc ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD16_WORD_SWAP( "battlejunction.u3", 0x000000, 0x800000, CRC(31471c53) SHA1(94fdd8c4c67914054e304a55042c10710af2e596) ) +ROM_END + +ROM_START( ban_krkk ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD16_WORD_SWAP( "quiz.bin", 0x000000, 0x400000, CRC(6f51180a) SHA1(38017ecaae4eead38482aeb04c90b5a5eeebd6ca) ) +ROM_END + ROM_START( prail ) ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD16_WORD_SWAP( "traingame.u1", 0x000000, 0x8000000, CRC(5c96d526) SHA1(cda0280b320762bda7a7358ec7ce29690aa815fb) ) @@ -2549,7 +2596,8 @@ CONS( 2006, hotwhl2p, 0, 0, hotwheels, hotwheels, spg2xx_game_hotwheels CONS( 2007, ordentv, 0, 0, ordentv, ordentv, spg2xx_game_ordentv_state, init_ordentv, "Taikee / V-Tac", "Ordenador-TV (Spain)", MACHINE_NOT_WORKING ) CONS( 2007, jeuint, ordentv, 0, ordentv, ordentv, spg2xx_game_ordentv_state, init_jeuint, "Taikee / V-Tac", u8"Jeu Intéractif TV (France)", MACHINE_NOT_WORKING) -CONS( 200?, wfcentro, 0, 0, wfcentro, spg2xx, spg2xx_game_wfcentro_state, empty_init, "WinFun", "Centro TV de Diseno Artistico (Spain)", MACHINE_NOT_WORKING ) +CONS( 200?, wfart, 0, 0, wfcentro, spg2xx, spg2xx_game_wfcentro_state, empty_init, "WinFun", "TV Art Design Center", MACHINE_NOT_WORKING ) +CONS( 200?, wfcentro, wfart, 0, wfcentro, spg2xx, spg2xx_game_wfcentro_state, empty_init, "WinFun", "Centro TV de Diseno Artistico (Spain)", MACHINE_NOT_WORKING ) CONS( 200?, lexiart, 0, 0, lexiart, lexiart, spg2xx_game_lexiart_state, empty_init, "Lexibook", "Lexibook Junior My 1st Drawing Studio", MACHINE_NOT_WORKING ) @@ -2568,6 +2616,19 @@ CONS( 2008, ddr33v, 0, 0, spg2xx, ddr33v, spg2xx_game_ddr33v_st // PCB has 'Anpanman TV 2006 Ver 1.4' printed on it, ROM has SPG260 header. Uses custom built-in keyboard, no display built into the unit. CONS( 2006, anpantv, 0, 0, spg2xx, spg2xx, spg2xx_game_state, empty_init, "Bandai", "Anpanman TV (Japan)", MACHINE_NOT_WORKING ) +// Has an AT24C08, not currently hooked up (probably for storing database unlocks) +// +// There is also a card reader/scanner which can read barcodes from Digimon cards +// and IR connectivity which allowed for data exchange with various services using +// an external device, including transfering characters to/from an arcade game. +// Neither is currently emulated +// +// Will report 'ERROR' sometimes, maybe as a result of these not being hooked up. +CONS( 2006, dmbtjunc, 0, 0, spg2xx, dmbtjunc, spg2xx_game_state, empty_init, "Bandai", "Let's! TV Play Digital Monster Battle Junction (Japan)", MACHINE_NOT_WORKING ) + +// Let's!TVプレイ 脳と体を鍛える 体感頭脳ファミリーマットレ - Let's! TV Play branding appears on the box +CONS( 2006, ban_krkk, 0, 0, spg2xx, ban_krkk, spg2xx_game_state, init_crc, "Bandai", "Let's! TV Play Nou to Karada o Kitaeru Taikan Zunou Family Mattore (Japan)", MACHINE_IMPERFECT_SOUND ) + // Train Game V1.4 2012-08-15 on PCB. SPG243 headers in each chunk. // Last few bytes of SEEPROM have 'JUNGT' in them, is this developed by JungleSoft/JungleTac? CONS( 2012, prail, 0, 0, prail, prail, spg2xx_game_prail_state, empty_init, "Takara Tomy", "Boku wa Plarail Untenshi - Shinkansen de Ikou! (Japan)", MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/tvgames/xavix.cpp b/src/mame/tvgames/xavix.cpp index 6f5a5d19ad0b6..ff2cc6a2a02db 100644 --- a/src/mame/tvgames/xavix.cpp +++ b/src/mame/tvgames/xavix.cpp @@ -35,11 +35,8 @@ year name PCB ID ROM width TSOP pads ROM size SEEPROM die markings extra components / notes 2006 Hello Kitty カードでおままごと あいうおえ図鑑 / エポック社 / 日本 Hello Kitty Play House with Cards Aiuoe Illustrated Book / Epochsha / Japan - ドラえもん 体感タケコプター! 空とぶ大冒険 / エポック社 / 日本 Doraemon Experience Takecopter! Great Flying Adventure / Epoch Publishing / Japan スーパーテレビパソコンLink / エポック社 / 日本 Super TV PC Link / Epoch / Japan Let's!TVプレイ ふしぎ星のふたご姫Gyu! ドレスチェンジでキュートにダンス / バンダイ / 日本 Let's!TV Play Gyu, the Twin Princess of the Mysterious Planet! Dance cutely with a dress change / Bandai / Japan - Let's!TVプレイ 体感キャストオフ 仮面ライダーカブト クロックアップ&ライダーキック / バンダイ / 日本 Let's!TV Play Experience Cast Off Kamen Rider Kabuto Clock Up & Rider Kick / Bandai / Japan - Let's!TVプレイ なりきり体感 ボウケンジャー 走れ!撃て!ミッションスタート!! / バンダイ / 日本 Let's! TV Play Narikiri Experience Boukenger Run! Shoot! Mission starts! ! / Bandai / Japan Let's!TVプレイ なりきりファイト ウルトラマン 撃て!必殺光線!! / タカラトミー / 日本 Let's!TV Play Narikiri Fight Ultraman Shoot! Deadly ray! ! / Takara Tomy / Japan Jala Jaland /atlus/Japan (arcade version) - - - - - - - 2004 Printer for TV computer /EPOCH/Japan - - - - - - - @@ -56,7 +53,6 @@ not dumped: no TSOP pads 2003 Beyblade Arcade Challenge 5-in-1 /Hasbro/USA - - - - - - have - 2001 Webdiver Gradion /TAKARA/Japan - - - - - - - not dumped: xavix2.cpp @@ -66,7 +62,10 @@ 2005 Let's!TVプレイ ドラゴンボ-ルZ バトル体感かめはめ波~ おめぇとフュージョン / バンダイ / 日本 Let's!TV Play Dragon Ball Z Battle Experience Kamehameha ~ Ometo Fusion / Bandai / Japan dumped: either here, xavix_2000.cpp, or xavix_2002.cpp - Let's!TVプレイ 魔法戦隊マジレンジャー マジマットでダンス&バトル / バンダイ / 日本 Let's!TV Play Mahou Sentai Magiranger Dance & Battle at Magimat / Bandai / Japan + Let's!TVプレイ 体感キャストオフ 仮面ライダーカブト クロックアップ&ライダーキック / バンダイ / 日本 Let's!TV Play Experience Cast Off Kamen Rider Kabuto Clock Up & Rider Kick / Bandai / Japan + Let's!TVプレイ なりきり体感 ボウケンジャー 走れ!撃て!ミッションスタート!! / バンダイ / 日本 Let's! TV Play Narikiri Experience Boukenger Run! Shoot! Mission starts! ! / Bandai / Japan + Webdiver Gradion /TAKARA/Japan - - - - - - - + Let's!TVプレイ 魔法戦隊マジレンジャー マジマットでダンス&バトル / バンダイ / 日本 Let's!TV Play Mahou Sentai Magiranger Dance & Battle at Magimat / Bandai / Japan anpan-man pyon-pyon ikunou mat /JoyPalette/Japan - - - - - - - どこでもドラえもん 日本旅行ゲームDX体感!どこドラグランプリ! / エポック社 / 日本 Doraemon anywhere - Japan travel game DX experience! Where is the Dragon Grand Prix! / Epoch / Japan Let's!TVプレイ ふたりはプリキュアMaxHeart マットでダンス MaxHeartにおどっちゃおう / バンダイ / 日本 Let's!TV Play Futari wa PreCure MaxHeart Dance on the mat Let's go to MaxHeart / Bandai / Japan @@ -200,6 +199,7 @@ 2006 Let's!TVプレイ NARUTO-ナルト- 忍者体感~だってばよ~ / バンダイ / 日本 Let's!TV Play NARUTO Ninja Experience ~Dattebayo~ / Bandai / Japan 2006 テレビであそぼう!まなぼう!超能力あいうえお図鑑 / エポック社 / 日本 Let's play on TV! Learn! Superpower Aiueo Illustrated Book / Epochsha / Japan 2006 Let's!TVプレイ ドラゴンボールZ バトル体感かめはめ波2~オッスおめぇ悟空 天下一武道会~ / バンダイ / 日本 Let's!TV Play Dragon Ball Z Battle Experience Kamehameha 2 ~Ossu Ome Goku Tenkaichi Budokai~ / Bandai / Japan + 2006 ドラえもん 体感タケコプター! 空とぶ大冒険 / エポック社 / 日本 Doraemon Experience Takecopter! Great Flying Adventure / Epoch Publishing / Japan @@ -460,7 +460,7 @@ void superxavix_state::superxavix_lowbus_map(address_map &map) map(0x6c00, 0x6cff).ram().w(FUNC(superxavix_state::bmp_palram_sh_w)).share("bmp_palram_sh"); map(0x6d00, 0x6dff).ram().w(FUNC(superxavix_state::bmp_palram_l_w)).share("bmp_palram_l"); - // map(0x6a40, 0x6a7f).ram().share("ext_segment_regs"); // 16x32 extended segment regs + map(0x6a40, 0x6a7f).ram().w(FUNC(superxavix_state::ext_segment_regs_w)).share("ext_segment_regs"); // 16x32 extended segment regs // bitmap plotter(!) (with auto-inc?) - used by super pc tv units map(0x6f60, 0x6f60).w(FUNC(superxavix_state::superxavix_plt_flush_w)); // writes here to flush plotter FIFO @@ -1254,6 +1254,42 @@ static INPUT_PORTS_START( tak_geig ) INPUT_PORTS_END +static INPUT_PORTS_START( tak_wdg ) + PORT_INCLUDE(xavix) + + // there is unemulated IR connectivity with other devices that isn't emulated, might rely on some of the unused bits here + // could also just be that the other robots change the state of another port somewhere in order to be detected + + // test mode code suggesting IR is at 0eb771 (part of it requires opposing directions to be held as this is not a joystick) + + // To access test mode (do this on a fresh boot, not after an F3 reset or it will hang after the red screen): + // first it checks bits 0x01 in port IN1 and expects them to be 0 (this doesn't seem to be connected to anything normally?) + // then reads port IN0, masks with 0xf7 and expects only LEFT & RIGHT to he held together + + PORT_MODIFY("IN0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) // shoot (robot form) / whistle (train form) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) // charge shot (robot form) maybe should be a toggle if it represents an arm position? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Combine") PORT_TOGGLE // if you toggle it in the robot game it pauses, no effect in train game + // 0x08 not used? + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_16WAY // robot form only? + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_16WAY // robot form only? + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_16WAY + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_16WAY + + PORT_MODIFY("IN1") + // these must all be flipped to one state or the other to transform (not sure the best way to handle this) + // pre-rendered animations will play for each transform, and any running game mode will exit when you start this process + + // 0x01 doesn't trigger any animation, is not used by game, and isn't listed in test mode, but it must be 'off' (returning 0) to access the test mode in the first place (debug pin maybe) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Transformation Head State") PORT_TOGGLE + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Transformation Body State") PORT_TOGGLE + // 0x08 doesn't trigger any animation, not used? + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("Transformation Arm 1 State") PORT_TOGGLE + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("Transformation Arm 2 State") PORT_TOGGLE + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) + // 0x80 not used? +INPUT_PORTS_END + static INPUT_PORTS_START( tak_comt ) PORT_INCLUDE(xavix) @@ -2469,6 +2505,11 @@ ROM_START( tak_geig ) ROM_LOAD("geigeki.bin", 0x000000, 0x400000, CRC(bd0c3576) SHA1(06f614dbec0225ce4ed866b98450912986d72faf) ) ROM_END +ROM_START( tak_wdg ) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) + ROM_LOAD("wdgrobot.bin", 0x000000, 0x200000, CRC(7ffc6386) SHA1(e33de5f8e6686e4160d1b90d59167418e87f5a47) ) +ROM_END + ROM_START( tom_tvho ) // ET105 REV 0.0 ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("tvhockey.u4", 0x000000, 0x200000, CRC(9cd72ae2) SHA1(0530851123b607ddb85f9513405ce97c493f5fd6) ) @@ -2865,6 +2906,9 @@ CONS( 2005, has_wamg, 0, 0, xavix_4mb, has_wamg, xavix_state, // GEIGEKI ゴーゴーシューティング CONS( 2002, tak_geig, 0, 0, xavix_4mb_nv, tak_geig, xavix_state, init_xavix, "Takara / SSD Company LTD", "Geigeki Go Go Shooting (Japan)", MACHINE_IMPERFECT_SOUND ) +// some unemulated connectivity features to add other robots into the game +CONS( 2001, tak_wdg, 0, 0, xavix_2mb_nv, tak_wdg, xavix_state, init_xavix, "Takara / SSD Company LTD", "Webdiver DX W-05 Gladion (Japan)", MACHINE_IMPERFECT_SOUND ) + // TVホッケー // playable but could do with better deadzome handling on the controls at least // the trackball functionality works well in the menus, but not the games diff --git a/src/mame/tvgames/xavix.h b/src/mame/tvgames/xavix.h index bb0a74bd40213..5077c667ecad6 100644 --- a/src/mame/tvgames/xavix.h +++ b/src/mame/tvgames/xavix.h @@ -104,6 +104,7 @@ class xavix_state : public driver_device m_posirq_x(*this, "posirq_x"), m_posirq_y(*this, "posirq_y"), m_segment_regs(*this, "segment_regs"), + m_ext_segment_regs(*this, "ext_segment_regs"), m_palette(*this, "palette"), m_region(*this, "REGION"), m_gfxdecode(*this, "gfxdecode"), @@ -464,12 +465,12 @@ class xavix_state : public driver_device else if (offset < 0x300) { offset &= 0xff; - return ((~offset >> 4) | (offset << 4)); + return (((~offset >> 4) & 0x0f) | (offset << 4)); } else if (offset < 0x400) { offset &= 0xff; - return ((~offset >> 4) | (~offset << 4)); + return (((~offset >> 4) & 0x0f) | (~offset << 4)); } else if (offset < 0x800) { @@ -557,6 +558,7 @@ class xavix_state : public driver_device required_shared_ptr m_posirq_y; required_shared_ptr m_segment_regs; + optional_shared_ptr m_ext_segment_regs; required_device m_palette; @@ -611,6 +613,7 @@ class xavix_state : public driver_device bool m_disable_memory_bypass = false; bool m_disable_sprite_yflip = false; + bool m_disable_tile_regs_flip = false; int m_video_hres_multiplier; }; @@ -649,6 +652,8 @@ class superxavix_state : public xavix_state void xavix2002(machine_config &config); void xavix2002_4mb(machine_config &config); + void init_epo_doka(); + protected: virtual void machine_start() override ATTR_COLD; virtual void machine_reset() override ATTR_COLD; @@ -662,6 +667,7 @@ class superxavix_state : public xavix_state virtual void get_tile_pixel_dat(uint8_t &dat, int bpp) override; private: + void ext_segment_regs_w(offs_t offset, uint8_t data); void superxavix_plt_flush_w(uint8_t data); uint8_t superxavix_plt_dat_r(); void superxavix_plt_dat_w(uint8_t data); @@ -706,6 +712,14 @@ class superxavix_state : public xavix_state void extended_extbus_reg1_w(uint8_t data); void extended_extbus_reg2_w(uint8_t data); + uint8_t superxavix_read_extended_io0(offs_t offset, uint8_t mem_mask) { logerror("%s: superxavix_read_extended_io0 (mask %02x)\n", machine().describe_context(), mem_mask); return 0x00; } + uint8_t superxavix_read_extended_io1(offs_t offset, uint8_t mem_mask) { logerror("%s: superxavix_read_extended_io1 (mask %02x)\n", machine().describe_context(), mem_mask); return 0x00; } + uint8_t superxavix_read_extended_io2(offs_t offset, uint8_t mem_mask) { logerror("%s: superxavix_read_extended_io2 (mask %02x)\n", machine().describe_context(), mem_mask); return 0x00; } + + void superxavix_write_extended_io0(offs_t offset, uint8_t data, uint8_t mem_mask) { logerror("%s: superxavix_write_extended_io0 %02x (mask %02x)\n", machine().describe_context(), data, mem_mask); } + void superxavix_write_extended_io1(offs_t offset, uint8_t data, uint8_t mem_mask) { logerror("%s: superxavix_write_extended_io1 %02x (mask %02x)\n", machine().describe_context(), data, mem_mask); } + void superxavix_write_extended_io2(offs_t offset, uint8_t data, uint8_t mem_mask) { logerror("%s: superxavix_write_extended_io2 %02x (mask %02x)\n", machine().describe_context(), data, mem_mask); } + void draw_bitmap_layer(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); uint8_t get_next_bit_sx(); diff --git a/src/mame/tvgames/xavix2.cpp b/src/mame/tvgames/xavix2.cpp index bf43fe20f525f..da3571e58bd4c 100644 --- a/src/mame/tvgames/xavix2.cpp +++ b/src/mame/tvgames/xavix2.cpp @@ -767,6 +767,13 @@ ROM_START( epo_dabj ) ROM_LOAD( "dabj.u3", 0x000000, 0x800000, CRC(9ebc1384) SHA1(38abaebd05bc9ab300ee5fbf37bd88ce9cbd20e1) ) ROM_END +ROM_START( epo_dtcj ) + ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "dtcj.u2", 0x000000, 0x800000, CRC(64c2aabb) SHA1(14f02eb01f1c6e76202f7a70818c300ba23fd879) ) + + // SEEPROM is a AT24C04 at u4 +ROM_END + ROM_START( domfitad ) ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "xpfitnessadventure.bin", 0x000000, 0x1000000, CRC(a7917081) SHA1(95ae5dc6e64a78ae060cb0e61d8b0af34a93c4ce) ) @@ -788,6 +795,10 @@ CONS( 2006, ban_db2j, 0, 0, config, naruto, naruto_state, empty_init, "Bandai / // テレビであそぼう!まなぼう! 超脳力あいうえお図鑑 CONS( 2006, epo_dabj, 0, 0, config, dabj, xavix2_state, empty_init, "Epoch / SSD Company LTD", "TV de Asobou! Manabou! Chou Nouryoku AIUEO Zukan (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +// ドラえもん 体感タケコプター! 空とぶ大冒険 +CONS( 2006, epo_dtcj, 0, 0, config, dabj, xavix2_state, empty_init, "Epoch / SSD Company LTD", "Doraemon Taikan Take-copter! Sora Tobu Daibouken (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) + + // These are for the 'Domyos Interactive System' other Domyos Interactive System games can be found in xavix.cpp (the SoC is inside the cartridge, base acts as a 'TV adapter' only) // Has SEEPROM and an RTC. Adventure has the string DOMYSSDCOLTD a couple of times. diff --git a/src/mame/tvgames/xavix_2002.cpp b/src/mame/tvgames/xavix_2002.cpp index 3fb8642373df3..696339f3234cc 100644 --- a/src/mame/tvgames/xavix_2002.cpp +++ b/src/mame/tvgames/xavix_2002.cpp @@ -296,7 +296,7 @@ static INPUT_PORTS_START( suprtvpc ) PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(1) INPUT_PORTS_END -/* SuperXavix IO port handliner (per game) */ +/* SuperXavix IO port handlers (per game) */ uint8_t superxavix_i2c_jmat_state::read_extended_io0(offs_t offset, uint8_t mem_mask) { @@ -375,6 +375,13 @@ void superxavix_state::xavix2002(machine_config &config) m_screen->set_visarea(0*8, 64*8-1, 2*8, 30*8-1); XAVIX2002IO(config, m_xavix2002io, 0); + + m_xavix2002io->read_0_callback().set(FUNC(superxavix_state::superxavix_read_extended_io0)); + m_xavix2002io->write_0_callback().set(FUNC(superxavix_state::superxavix_write_extended_io0)); + m_xavix2002io->read_1_callback().set(FUNC(superxavix_state::superxavix_read_extended_io1)); + m_xavix2002io->write_1_callback().set(FUNC(superxavix_state::superxavix_write_extended_io1)); + m_xavix2002io->read_2_callback().set(FUNC(superxavix_state::superxavix_read_extended_io2)); + m_xavix2002io->write_2_callback().set(FUNC(superxavix_state::superxavix_write_extended_io2)); } void superxavix_state::xavix2002_4mb(machine_config &config) @@ -708,7 +715,25 @@ ROM_START( epo_doka ) ROM_LOAD("doka.u1", 0x000000, 0x400000, CRC(853266d2) SHA1(d4121b89ee464088951898282404e5a2b788dd69) ) ROM_END +ROM_START( ban_utmj ) + ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00) + ROM_LOAD("utmj.u7", 0x000000, 0x800000, CRC(0ac2bcd9) SHA1(ca7c82e2015c86bb37bd66016c33343d174e9965) ) + + // SEEPROM is HT24LC02 at u3 +ROM_END + +ROM_START( ban_bkgj ) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) + ROM_LOAD("bkgj.u2", 0x000000, 0x400000, CRC(a59ce23c) SHA1(d2a6be9e46f3cfc3cf798bf1f76732eee909c93b) ) + + // SEEPROM is a S-24CS04A at u4 +ROM_END +ROM_START( epo_rgfj ) + ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00) + // gave consistent reads 5 times, then started not, should be good, but there is the potential for the ROM to have already been failing + ROM_LOAD("rgfj.u1", 0x000000, 0x800000, CRC(96c9563a) SHA1(36b9dd3e5dcc8099787b25d28143997f61273234) ) +ROM_END ROM_START( udance ) ROM_REGION(0x800000, "bios", ROMREGION_ERASE00) @@ -779,6 +804,11 @@ void superxavix_piano_pc_state::init_piano_pc() m_disable_memory_bypass = true; } +void superxavix_state::init_epo_doka() +{ + init_xavix(); + m_disable_tile_regs_flip = true; +} void superxavix_doradraw_state::init_doradraw() { @@ -825,11 +855,20 @@ CONS( 2005, mrangbat, 0, 0, superxavix_i2c_mrangbat, mrangbat, superxavix_i2c_ // エキサイトスポーツ テニス×フィットネス CONS( 2004, epo_tfit, 0, 0, superxavix_i2c_24c04_4mb, epo_tfit, superxavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Excite Sports Tennis x Fitness (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +石川遼 エキサイトゴルフ +CONS( 2010, epo_rgfj, 0, 0, superxavix_i2c_24c08, xavix_i2c, superxavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Ishikawa Ryou Excite Golf (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) + // Let's!TVプレイ ふたりはプリキュアMaxHeart マットでダンス MaxHeartにおどっちゃおう CONS( 2004, maxheart, 0, 0, superxavix_i2c_24c04_4mb, xavix_i2c, superxavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Futari wa PreCure MaxHeart Dance on the mat Let's go to MaxHeart (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // どこでもドラえもん 日本旅行ゲームDX体感!どこドラグランプリ! -CONS( 2004, epo_doka, 0, 0, xavix2002_4mb, xavix, superxavix_state, init_xavix, "Epoch / SSD Company LTD", "Doraemon anywhere - Japan travel game DX experience! Where is the Dragon Grand Prix! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2004, epo_doka, 0, 0, xavix2002_4mb, xavix, superxavix_state, init_epo_doka, "Epoch / SSD Company LTD", "Doko Demo Doraemon Nihon Ryokou Game DX Taikan! Doko Dora Grand Prix! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) + +// Let's!TVプレイ なりきり体感 ボウケンジャー 走れ!撃て!ミッションスタート!! +CONS( 2006, ban_bkgj, 0, 0, superxavix_i2c_24c04_4mb,xavix_i2c, superxavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Narikiri Taikan Boukenger Hashire! Ute! Mission Start!! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) + +// Let's!TV プレイ 体感キャストオフ 仮面ライダーカブト クロックアップ&ライダーキック +CONS( 2006, ban_utmj, 0, 0, superxavix_i2c_24c02, xavix_i2c, superxavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Taikan Cast Off - Kamen Rider Kabuto Clock Up & Rider Kick!! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // それいけトーマス ソドー島のなかまたち CONS( 2005, tmy_thom, 0, 0, superxavix_i2c_24c04, xavix_i2c, superxavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Soreike Thomas - Sodor Tou no Nakamatachi / Thomas & Friends on the Island of Sodor (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/tvgames/xavix_v.cpp b/src/mame/tvgames/xavix_v.cpp index a8f3e0bed4273..aba96081e7111 100644 --- a/src/mame/tvgames/xavix_v.cpp +++ b/src/mame/tvgames/xavix_v.cpp @@ -167,6 +167,12 @@ uint8_t superxavix_state::superxavix_crtc_2_r(offs_t offset) return m_sx_crtc_2[offset]; } +void superxavix_state::ext_segment_regs_w(offs_t offset, uint8_t data) +{ + logerror("%s ext_segment_regs_w %02x %02x\n", machine().describe_context(), offset, data); + m_ext_segment_regs[offset] = data; +} + void superxavix_state::superxavix_plt_flush_w(uint8_t data) { // flush current write buffer (as we might not have filled a byte when plotting) @@ -731,7 +737,7 @@ void xavix_state::draw_tilemap_line(screen_device &screen, bitmap_rgb32 &bitmap, if (!(tileregs[0x7] & 0x80)) return; - int alt_tileaddressing = 0; + int use_inline_header = 0; int alt_tileaddressing2 = 0; int ydimension = 0; @@ -776,9 +782,9 @@ void xavix_state::draw_tilemap_line(screen_device &screen, bitmap_rgb32 &bitmap, } if (tileregs[0x7] & 0x10) - alt_tileaddressing = 1; + use_inline_header = 1; else - alt_tileaddressing = 0; + use_inline_header = 0; if (tileregs[0x7] & 0x02) alt_tileaddressing2 = 1; @@ -786,6 +792,10 @@ void xavix_state::draw_tilemap_line(screen_device &screen, bitmap_rgb32 &bitmap, if ((tileregs[0x7] & 0x7f) == 0x04) alt_tileaddressing2 = 2; + // SuperXaviX only? + if ((tileregs[0x7] & 0x7f) == 0x0d) + alt_tileaddressing2 = 3; + //LOG("draw tilemap %d, regs base0 %02x base1 %02x base2 %02x tilesize,bpp %02x scrollx %02x scrolly %02x pal %02x mode %02x\n", which, tileregs[0x0], tileregs[0x1], tileregs[0x2], tileregs[0x3], tileregs[0x4], tileregs[0x5], tileregs[0x6], tileregs[0x7]); // there's a tilemap register to specify base in main ram, although in the monster truck test mode it points to an unmapped region @@ -847,6 +857,16 @@ void xavix_state::draw_tilemap_line(screen_device &screen, bitmap_rgb32 &bitmap, int basereg; int flipx = (tileregs[0x03]&0x40)>>6; int flipy = (tileregs[0x03]&0x80)>>7; + + // epo_doka explicitly sets these registers on the XaviX logo + // but expects no flipping. Is code being executed out of order or + // is this further evidence that they don't work as expected on SuperXaviX + // hardware (see other hack for xavmusic needing sprite flip disabled) + if (m_disable_tile_regs_flip) + { + flipx = flipy = 0; + } + int gfxbase; // tile 0 is always skipped, doesn't even point to valid data packets in alt mode @@ -863,7 +883,7 @@ void xavix_state::draw_tilemap_line(screen_device &screen, bitmap_rgb32 &bitmap, int test = 0; - if (!alt_tileaddressing) + if (!use_inline_header) { if (alt_tileaddressing2 == 0) { @@ -896,6 +916,27 @@ void xavix_state::draw_tilemap_line(screen_device &screen, bitmap_rgb32 &bitmap, tile += gfxbase; } } + else if (alt_tileaddressing2 == 3) + { + // SuperXaviX only? + if (m_ext_segment_regs) + { + // Tile Based Addressing takes into account Tile Sizes and bpp + const int offset_multiplier = (ytilesize * xtilesize) / 8; + const int basereg = 0; + gfxbase = (m_ext_segment_regs[(basereg * 4) + 3] << 24) | + (m_ext_segment_regs[(basereg * 4) + 2] << 16) | + (m_ext_segment_regs[(basereg * 4) + 1] << 8) | + (m_ext_segment_regs[(basereg * 4) + 0] << 0); + + tile = tile * (offset_multiplier * bpp); + tile += gfxbase; + } + else + { + tile = 0; + } + } // Tilemap specific mode extension with an 8-bit per tile attribute, works in all modes except 24-bit (no room for attribute) and header (not needed?) if (tileregs[0x7] & 0x08) @@ -1038,7 +1079,7 @@ void xavix_state::draw_sprites_line(screen_device &screen, bitmap_rgb32 &bitmap, int zval = (attr1 & 0xf0) >> 4; int flipx = (attr1 & 0x01); - int flipy = (attr1 & 0x02); + int flipy = (attr1 & 0x02); // many elements, including the XaviX logo on xavmusic have yflip set, but don't want it, why? if (m_disable_sprite_yflip) @@ -1154,6 +1195,20 @@ void xavix_state::draw_sprites_line(screen_device &screen, bitmap_rgb32 &bitmap, int gfxbase = (m_segment_regs[1] << 16) | (m_segment_regs[0] << 8); // always use segment 0 tile += gfxbase; + // ban_bkgj is in sprite mode 0x01 but seems to expect the extended SuperXaviX registers to apply too? + // + // Is the register being set correctly? I'd expect it to be a different value to enable this. It does + // briefly set mode 4 and 5 on the startup logos, where it *doesn't* need this logic + if (m_ext_segment_regs) + { + int gfxbase = (m_ext_segment_regs[3] << 24) | + (m_ext_segment_regs[2] << 16) | + (m_ext_segment_regs[1] << 8) | + (m_ext_segment_regs[0] << 0); + tile += gfxbase; + } + + } else if (alt_addressing == 2) { @@ -1384,7 +1439,7 @@ void superxavix_state::draw_bitmap_layer(screen_device &screen, bitmap_rgb32 &bi // anpanmdx title screen ends up with a seemingly incorrect value for start // when it does the scroller. There is presumably an opcode or math bug causing this. //if (start >= 0x7700) - /// start -= 0x3c00; + /// start -= 0x3c00; int base = start * 0x800; int base2 = topadr * 0x8; @@ -1602,6 +1657,8 @@ void xavix_state::tmap1_regs_w(offs_t offset, uint8_t data, uint8_t mem_mask) ---0 1010 (0a) 16-bit+8 addressing (8-byte alignment Addressing Mode + 8-bit Attribute) (boxing, Snowboard) ---0 1011 (0b) 16-bit+8 addressing (Addressing Mode 2 + 8-bit Attribute) + ---0 1100 (0d) ban_bkgj - seems to be a SuperXaviX only mode using the extended 32-bit segment regs + ---1 0011 (13) 16-bit addressing (Addressing Mode 2 + Inline Header) (monster truck) ---1 0100 (14) 24-bit addressing (Addressing Mode 2 + Inline Header) From a0d086a67e9b5bda08b84719ff5cb4e9996d8b0b Mon Sep 17 00:00:00 2001 From: AJR Date: Fri, 17 Jan 2025 14:09:30 -0500 Subject: [PATCH 54/80] tvgames/xavix_2002.cpp, vtech/vtech5303.cpp: Build fixes --- src/mame/tvgames/xavix_2002.cpp | 2 +- src/mame/vtech/vtech5303.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mame/tvgames/xavix_2002.cpp b/src/mame/tvgames/xavix_2002.cpp index 696339f3234cc..00f5038a5cb6e 100644 --- a/src/mame/tvgames/xavix_2002.cpp +++ b/src/mame/tvgames/xavix_2002.cpp @@ -855,7 +855,7 @@ CONS( 2005, mrangbat, 0, 0, superxavix_i2c_mrangbat, mrangbat, superxavix_i2c_ // エキサイトスポーツ テニス×フィットネス CONS( 2004, epo_tfit, 0, 0, superxavix_i2c_24c04_4mb, epo_tfit, superxavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Excite Sports Tennis x Fitness (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -石川遼 エキサイトゴルフ +// 石川遼 エキサイトゴルフ CONS( 2010, epo_rgfj, 0, 0, superxavix_i2c_24c08, xavix_i2c, superxavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Ishikawa Ryou Excite Golf (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Let's!TVプレイ ふたりはプリキュアMaxHeart マットでダンス MaxHeartにおどっちゃおう diff --git a/src/mame/vtech/vtech5303.cpp b/src/mame/vtech/vtech5303.cpp index 8113848dc0575..f37bd82b2983f 100644 --- a/src/mame/vtech/vtech5303.cpp +++ b/src/mame/vtech/vtech5303.cpp @@ -72,7 +72,7 @@ void vtech5303_state::vtech5303(machine_config &config) } // Spanish machine -ROM_START( pawpatrols ) +ROM_START( pawmoviesp ) ROM_REGION( 0x010000, "maincpu", 0 ) ROM_LOAD( "internal.bin", 0x000000, 0x010000, NO_DUMP ) // Unknown CPU type, unknown internal ROM size From f7f3257411f7432179b18f2be3d311d9cf7b63c1 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sat, 18 Jan 2025 04:23:53 +0900 Subject: [PATCH 55/80] edevices/edevices.cpp: Use device_gfx_interface to decode graphics, and cleaned up code. (#13221) * edevices/mwarr.cpp: Simplified graphics ROM loading and decoding, reduced literal tags, improved member and ROM region names. * edevices/stlforce.cpp: Simplified graphics ROM loading and decoding, removed unused code. --- src/mame/edevices/edevices.cpp | 69 +++++++++--------- src/mame/edevices/edevices.h | 19 +++-- src/mame/edevices/mwarr.cpp | 128 ++++++++++++--------------------- src/mame/edevices/stlforce.cpp | 97 +++++++++---------------- 4 files changed, 127 insertions(+), 186 deletions(-) diff --git a/src/mame/edevices/edevices.cpp b/src/mame/edevices/edevices.cpp index 13f11d7aa4aac..31466df66711c 100644 --- a/src/mame/edevices/edevices.cpp +++ b/src/mame/edevices/edevices.cpp @@ -23,6 +23,7 @@ DEFINE_DEVICE_TYPE(EDEVICES_SFORCE_VID, edevices_sforce_device, "edevices_sforce edevices_device::edevices_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock), + device_gfx_interface(mconfig, *this), m_bg_videoram(*this, finder_base::DUMMY_TAG), m_mlow_videoram(*this, finder_base::DUMMY_TAG), m_mhigh_videoram(*this, finder_base::DUMMY_TAG), @@ -32,8 +33,6 @@ edevices_device::edevices_device(const machine_config &mconfig, device_type type m_mhigh_scrollram(*this, finder_base::DUMMY_TAG), m_vidattrram(*this, finder_base::DUMMY_TAG), m_spriteram(*this, finder_base::DUMMY_TAG), - m_gfxdecode(*this, finder_base::DUMMY_TAG), - m_palette(*this, finder_base::DUMMY_TAG), m_spritexoffs(0) // might come from the clock, twinbrat has different video timings and resolution { } @@ -52,10 +51,10 @@ edevices_sforce_device::edevices_sforce_device(const machine_config &mconfig, co void edevices_device::device_start() { - m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(edevices_device::get_bg_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 64, 16); - m_mlow_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(edevices_device::get_mlow_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 64, 16); - m_mhigh_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(edevices_device::get_mhigh_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 64, 16); - m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(edevices_device::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + m_bg_tilemap = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(edevices_device::get_bg_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 64, 16); + m_mlow_tilemap = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(edevices_device::get_mlow_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 64, 16); + m_mhigh_tilemap = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(edevices_device::get_mhigh_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 64, 16); + m_tx_tilemap = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(edevices_device::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); m_mlow_tilemap->set_transparent_pen(0); m_mhigh_tilemap->set_transparent_pen(0); @@ -135,32 +134,32 @@ void edevices_device::sprites_commands_w(uint16_t data) TILE_GET_INFO_MEMBER(edevices_device::get_bg_tile_info) { - int tileno = m_bg_videoram[tile_index] & 0x1fff; - int colour = (m_bg_videoram[tile_index] & 0xe000) >> 13; + int const tileno = m_bg_videoram[tile_index] & 0x1fff; + int const colour = (m_bg_videoram[tile_index] & 0xe000) >> 13; tileinfo.set(4, tileno, colour, 0); } TILE_GET_INFO_MEMBER(edevices_device::get_mlow_tile_info) { - int tileno = m_mlow_videoram[tile_index] & 0x1fff; - int colour = (m_mlow_videoram[tile_index] & 0xe000) >> 13; + int const tileno = m_mlow_videoram[tile_index] & 0x1fff; + int const colour = (m_mlow_videoram[tile_index] & 0xe000) >> 13; tileinfo.set(3, tileno, colour, 0); } TILE_GET_INFO_MEMBER(edevices_device::get_mhigh_tile_info) { - int tileno = m_mhigh_videoram[tile_index] & 0x1fff; - int colour = (m_mhigh_videoram[tile_index] & 0xe000) >> 13; + int const tileno = m_mhigh_videoram[tile_index] & 0x1fff; + int const colour = (m_mhigh_videoram[tile_index] & 0xe000) >> 13; tileinfo.set(2, tileno, colour, 0); } TILE_GET_INFO_MEMBER(edevices_device::get_tx_tile_info) { - int tileno = m_tx_videoram[tile_index] & 0x1fff; - int colour = (m_tx_videoram[tile_index] & 0xe000) >> 13; + int const tileno = m_tx_videoram[tile_index] & 0x1fff; + int const colour = (m_tx_videoram[tile_index] & 0xe000) >> 13; tileinfo.set(1, tileno, colour, 0); } @@ -194,28 +193,26 @@ void edevices_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, { const uint16_t *source = m_sprites_buffer + 0x400 - 4; const uint16_t *finish = m_sprites_buffer; - gfx_element *gfx = m_gfxdecode->gfx(0); - int x, y, color, flipx, dy, pri, pri_mask, i; while (source >= finish) { /* draw sprite */ - if (source[0] & 0x0800) + if (BIT(source[0], 11)) { - y = 0x1ff - (source[0] & 0x01ff); - x = (source[3] & 0x3ff) - m_spritexoffs; + int const y = 0x1ff - (source[0] & 0x01ff); + int const x = (source[3] & 0x3ff) - m_spritexoffs; - color = source[1] & 0x000f; - flipx = source[1] & 0x0200; + int const color = source[1] & 0x000f; + bool const flipx = BIT(source[1], 9); - dy = (source[0] & 0xf000) >> 12; + int const dy = (source[0] & 0xf000) >> 12; - pri = get_priority(source); - pri_mask = ~((1 << (pri + 1)) - 1); // Above the first "pri" levels + int const pri = get_priority(source); + uint32_t const pri_mask = ~((1 << (pri + 1)) - 1); // Above the first "pri" levels - for (i = 0; i <= dy; i++) + for (int i = 0; i <= dy; i++) { - gfx->prio_transpen(bitmap, + gfx(0)->prio_transpen(bitmap, cliprect, source[2] + i, color, @@ -224,7 +221,7 @@ void edevices_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, screen.priority(), pri_mask, 0); /* wrap around x */ - gfx->prio_transpen(bitmap, + gfx(0)->prio_transpen(bitmap, cliprect, source[2] + i, color, @@ -233,7 +230,7 @@ void edevices_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, screen.priority(), pri_mask, 0); /* wrap around y */ - gfx->prio_transpen(bitmap, + gfx(0)->prio_transpen(bitmap, cliprect, source[2] + i, color, @@ -242,7 +239,7 @@ void edevices_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, screen.priority(), pri_mask, 0); /* wrap around x & y */ - gfx->prio_transpen(bitmap, + gfx(0)->prio_transpen(bitmap, cliprect, source[2] + i, color, @@ -270,42 +267,40 @@ void edevices_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, uint32_t edevices_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int i; - bitmap.fill(0, cliprect); screen.priority().fill(0, cliprect); /* xscrolls - Steel Force clearly shows that each layer needs -1 scroll compared to the previous, do enable flags change this? */ if (BIT(m_vidattrram[6], 0)) { - for (i = 0; i < 256; i++) + for (int i = 0; i < 256; i++) m_bg_tilemap->set_scrollx(i, m_bg_scrollram[i] + 18); } else { - for (i = 0; i < 256; i++) + for (int i = 0; i < 256; i++) m_bg_tilemap->set_scrollx(i, m_bg_scrollram[0] + 18); } if (BIT(m_vidattrram[6], 2)) { - for (i = 0; i < 256; i++) + for (int i = 0; i < 256; i++) m_mlow_tilemap->set_scrollx(i, m_mlow_scrollram[i] + 17); } else { - for (i = 0; i < 256; i++) + for (int i = 0; i < 256; i++) m_mlow_tilemap->set_scrollx(i, m_mlow_scrollram[0] + 17); } if (BIT(m_vidattrram[6], 4)) { - for (i = 0; i < 256; i++) + for (int i = 0; i < 256; i++) m_mhigh_tilemap->set_scrollx(i, m_mhigh_scrollram[i] + 16); } else { - for (i = 0; i < 256; i++) + for (int i = 0; i < 256; i++) m_mhigh_tilemap->set_scrollx(i, m_mhigh_scrollram[0] + 16); } diff --git a/src/mame/edevices/edevices.h b/src/mame/edevices/edevices.h index a610821bdeec8..cd9f0fc6dc092 100644 --- a/src/mame/edevices/edevices.h +++ b/src/mame/edevices/edevices.h @@ -9,11 +9,17 @@ #include "emupal.h" #include "tilemap.h" -class edevices_device : public device_t +class edevices_device : public device_t, public device_gfx_interface { public: edevices_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); edevices_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + template edevices_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&palette_tag, const gfx_decode_entry *gfxinfo) + : edevices_device(mconfig, tag, owner, clock) + { + set_info(gfxinfo); + set_palette(std::forward(palette_tag)); + } template void set_bg_videoram_tag(T &&tag) { m_bg_videoram.set_tag(std::forward(tag)); } template void set_mlow_videoram_tag(T &&tag) { m_mlow_videoram.set_tag(std::forward(tag)); } @@ -24,8 +30,6 @@ class edevices_device : public device_t template void set_mhigh_scrollram_tag(T &&tag) { m_mhigh_scrollram.set_tag(std::forward(tag)); } template void set_vidattrram_tag(T &&tag) { m_vidattrram.set_tag(std::forward(tag)); } template void set_spriteram_tag(T &&tag) { m_spriteram.set_tag(std::forward(tag)); } - template void set_gfxdecode_tag(T &&tag) { m_gfxdecode.set_tag(std::forward(tag)); } - template void set_palette_tag(T &&tag) { m_palette.set_tag(std::forward(tag)); } void set_spritexoffset(int offset) { @@ -71,8 +75,6 @@ class edevices_device : public device_t required_shared_ptr m_mhigh_scrollram; required_shared_ptr m_vidattrram; required_shared_ptr m_spriteram; - required_device m_gfxdecode; - required_device m_palette; /* misc */ int m_which = 0; @@ -83,6 +85,13 @@ class edevices_sforce_device : public edevices_device { public: edevices_sforce_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + template edevices_sforce_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&palette_tag, const gfx_decode_entry *gfxinfo) + : edevices_sforce_device(mconfig, tag, owner, clock) + { + set_info(gfxinfo); + set_palette(std::forward(palette_tag)); + } + protected: virtual int get_priority(const uint16_t *source) override; }; diff --git a/src/mame/edevices/mwarr.cpp b/src/mame/edevices/mwarr.cpp index af33ca4d9661f..7d079007baa40 100644 --- a/src/mame/edevices/mwarr.cpp +++ b/src/mame/edevices/mwarr.cpp @@ -51,42 +51,39 @@ PCB Layout namespace { -#define MASTER_CLOCK XTAL(12'000'000) -#define SOUND_CLOCK XTAL(45'000'000) - class mwarr_state : public driver_device { public: mwarr_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_mwarr_ram(*this, "mwarr_ram"), - m_okibank(*this, "okibank"), m_maincpu(*this, "maincpu"), m_video(*this, "edevices_vid"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") + m_palette(*this, "palette"), + m_work_ram(*this, "work_ram"), + m_okibank(*this, "okibank") { } void mwarr(machine_config &config); +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + private: + required_device m_maincpu; + required_device m_video; + required_device m_palette; + /* memory pointers */ - required_shared_ptr m_mwarr_ram; + required_shared_ptr m_work_ram; required_memory_bank m_okibank; - void mwarr_brightness_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void brightness_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void oki1_bank_w(uint16_t data); + void oki2_bank_w(uint16_t data); - virtual void machine_start() override ATTR_COLD; - virtual void machine_reset() override ATTR_COLD; - uint32_t screen_update_mwarr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - required_device m_maincpu; - required_device m_video; - required_device m_gfxdecode; - required_device m_palette; void mwarr_map(address_map &map) ATTR_COLD; void oki2_map(address_map &map) ATTR_COLD; }; @@ -97,7 +94,7 @@ class mwarr_state : public driver_device * *************************************/ -void mwarr_state::oki1_bank_w(uint16_t data) +void mwarr_state::oki2_bank_w(uint16_t data) { m_okibank->set_entry(data & 3); } @@ -122,12 +119,12 @@ void mwarr_state::mwarr_map(address_map &map) map(0x104000, 0x104fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x108000, 0x1087ff).ram().share("spriteram"); map(0x108800, 0x108fff).ram(); - map(0x110000, 0x11ffff).ram().share("mwarr_ram"); + map(0x110000, 0x11ffff).ram().share(m_work_ram); map(0x110000, 0x110001).portr("P1_P2"); map(0x110002, 0x110003).portr("SYSTEM"); map(0x110004, 0x110005).portr("DSW"); - map(0x110010, 0x110011).w(FUNC(mwarr_state::oki1_bank_w)); - map(0x110014, 0x110015).w(FUNC(mwarr_state::mwarr_brightness_w)); + map(0x110010, 0x110011).w(FUNC(mwarr_state::oki2_bank_w)); + map(0x110014, 0x110015).w(FUNC(mwarr_state::brightness_w)); map(0x110016, 0x110017).w(m_video, FUNC(edevices_device::sprites_commands_w)); map(0x180001, 0x180001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x190001, 0x190001).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); @@ -138,7 +135,7 @@ void mwarr_state::oki2_map(address_map &map) /* $00000-$20000 stays the same in all sound banks, */ /* the second half of the bank is what gets switched */ map(0x00000, 0x1ffff).rom().region("oki2", 0); - map(0x20000, 0x3ffff).bankr("okibank"); + map(0x20000, 0x3ffff).bankr(m_okibank); } /************************************* @@ -227,46 +224,23 @@ INPUT_PORTS_END * *************************************/ -static const gfx_layout mwarr_tile8_layout = -{ - 8,8, - RGN_FRAC(1,2), - 4, - { 0,1,2,3 }, - { 4, 0, RGN_FRAC(1,2)+4, RGN_FRAC(1,2)+0, 12, 8, RGN_FRAC(1,2)+12, RGN_FRAC(1,2)+8 }, - { 0*16,1*16,2*16,3*16,4*16,5*16,6*16,7*16 }, - 8*16 -}; - -static const gfx_layout mwarr_tile16_layout = -{ - 16,16, - RGN_FRAC(1,2), - 4, - { 0,1,2,3 }, - { 4, 0, RGN_FRAC(1,2)+4, RGN_FRAC(1,2)+0, 12, 8, RGN_FRAC(1,2)+12, RGN_FRAC(1,2)+8, - 256+4, 256+0, 256+RGN_FRAC(1,2)+4, 256+RGN_FRAC(1,2)+0, 256+12, 256+8, 256+RGN_FRAC(1,2)+12, 256+RGN_FRAC(1,2)+8 }, - { 0*16,1*16,2*16,3*16,4*16,5*16,6*16,7*16,8*16,9*16,10*16,11*16,12*16,13*16,14*16,15*16 }, - 32*16 -}; - static const gfx_layout mwarr_6bpp_sprites = { 16,16, RGN_FRAC(1,6), 6, { RGN_FRAC(5,6), RGN_FRAC(4,6), RGN_FRAC(3,6), RGN_FRAC(2,6), RGN_FRAC(1,6), RGN_FRAC(0,6) }, - { 135,134,133,132,131,130,129,128,7,6,5,4,3,2,1,0 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,8*8,9*8,10*8,11*8,12*8,13*8,14*8,15*8 }, + { STEP8(16*8+7, -1), STEP8(7, -1) }, + { STEP16(0, 8) }, 32*8 }; static GFXDECODE_START( gfx_mwarr ) - GFXDECODE_ENTRY( "gfx1", 0, mwarr_6bpp_sprites, 1024, 16 ) - GFXDECODE_ENTRY( "gfx2", 0, mwarr_tile8_layout, 384, 8 ) - GFXDECODE_ENTRY( "gfx3", 0, mwarr_tile16_layout, 256, 8 ) - GFXDECODE_ENTRY( "gfx4", 0, mwarr_tile16_layout, 128, 8 ) - GFXDECODE_ENTRY( "gfx5", 0, mwarr_tile16_layout, 0, 8 ) + GFXDECODE_ENTRY( "sprites", 0, mwarr_6bpp_sprites, 1024, 16 ) + GFXDECODE_ENTRY( "txtiles", 0, gfx_8x8x4_packed_lsb, 384, 8 ) + GFXDECODE_ENTRY( "midhightiles", 0, gfx_8x8x4_col_2x2_group_packed_lsb, 256, 8 ) + GFXDECODE_ENTRY( "midlowtiles", 0, gfx_8x8x4_col_2x2_group_packed_lsb, 128, 8 ) + GFXDECODE_ENTRY( "bgtiles", 0, gfx_8x8x4_col_2x2_group_packed_lsb, 0, 8 ) GFXDECODE_END /************************************* @@ -275,16 +249,11 @@ GFXDECODE_END * *************************************/ -uint32_t mwarr_state::screen_update_mwarr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - return m_video->draw(screen, bitmap, cliprect); -} - -void mwarr_state::mwarr_brightness_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void mwarr_state::brightness_w(offs_t offset, uint16_t data, uint16_t mem_mask) { - COMBINE_DATA(&m_mwarr_ram[0x14 / 2]); + COMBINE_DATA(&m_work_ram[0x14 / 2]); - double brightness = (double)(data & 0xff); + double const brightness = (double)(data & 0xff); for (int i = 0; i < 0x800; i++) { m_palette->set_pen_contrast(i, brightness/255); @@ -309,7 +278,7 @@ void mwarr_state::machine_reset() void mwarr_state::mwarr(machine_config &config) { /* basic machine hardware */ - M68000(config, m_maincpu, MASTER_CLOCK); + M68000(config, m_maincpu, XTAL(12'000'000)); m_maincpu->set_addrmap(AS_PROGRAM, &mwarr_state::mwarr_map); m_maincpu->set_vblank_int("screen", FUNC(mwarr_state::irq4_line_hold)); @@ -319,13 +288,12 @@ void mwarr_state::mwarr(machine_config &config) screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */); screen.set_size(64*8, 32*8); screen.set_visarea(8+1, 48*8-1-8-1, 0, 30*8-1); - screen.set_screen_update(FUNC(mwarr_state::screen_update_mwarr)); + screen.set_screen_update(m_video, FUNC(edevices_device::draw)); screen.set_palette(m_palette); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_mwarr); PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x800); - EDEVICES_VID(config, m_video, 0); + EDEVICES_VID(config, m_video, 0, m_palette, gfx_mwarr); m_video->set_bg_videoram_tag("bg_videoram"); m_video->set_mlow_videoram_tag("mlow_videoram"); m_video->set_mhigh_videoram_tag("mhigh_videoram"); @@ -335,16 +303,14 @@ void mwarr_state::mwarr(machine_config &config) m_video->set_mhigh_scrollram_tag("mhigh_scrollram"); m_video->set_vidattrram_tag("vidattrram"); m_video->set_spriteram_tag("spriteram"); - m_video->set_gfxdecode_tag("gfxdecode"); - m_video->set_palette_tag("palette"); m_video->set_spritexoffset(9); /* sound hardware */ SPEAKER(config, "mono").front_center(); - OKIM6295(config, "oki1", SOUND_CLOCK/48 , okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); + OKIM6295(config, "oki1", XTAL(45'000'000)/48, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); - okim6295_device &oki2(OKIM6295(config, "oki2", SOUND_CLOCK/48 , okim6295_device::PIN7_HIGH)); + okim6295_device &oki2(OKIM6295(config, "oki2", XTAL(45'000'000)/48, okim6295_device::PIN7_HIGH)); oki2.add_route(ALL_OUTPUTS, "mono", 1.0); oki2.set_addrmap(0, &mwarr_state::oki2_map); } @@ -362,7 +328,7 @@ ROM_START( mwarr ) ROM_LOAD16_BYTE( "prg_ev", 0x00000, 0x80000, CRC(d1d5e0a6) SHA1(f47955459d41c904b96de000b32cae156ee3bcba) ) // date 24/1 ROM_LOAD16_BYTE( "prg_od", 0x00001, 0x80000, CRC(e5217d91) SHA1(6a5d282e8e5b98628f98530e3c47b9b398e9334e) ) // date 24/1 - ROM_REGION( 0x900000, "gfx1", 0 ) + ROM_REGION( 0x900000, "sprites", 0 ) ROM_LOAD( "obm-0", 0x000000, 0x80000, CRC(b4707ba1) SHA1(35330a31e9837e5f848a21fa6f589412b35a04a0) ) // 7/11 ROM_LOAD( "obm-6", 0x080000, 0x80000, CRC(f9675acc) SHA1(06e0c0c0928ace331ebd08cfeeaa2c8b5603457f) ) // 7/11 ROM_LOAD( "obm-12", 0x100000, 0x80000, CRC(6239c4dd) SHA1(128040e9517151faf15c75dc1f2d79c5a66b9e1c) ) // 22/11 @@ -383,21 +349,21 @@ ROM_START( mwarr ) ROM_LOAD( "obm-11", 0x800000, 0x80000, CRC(7bf1e4da) SHA1(4aeef3b7c23303580a851dc793e9671a2a0f421f) ) // 7/11 ROM_LOAD( "obm-17", 0x880000, 0x80000, CRC(47bd56e8) SHA1(e10569e89083165a7efe29f84167a1c15171ccaf) ) // 22/11 - ROM_REGION( 0x100000, "gfx2", 0 ) - ROM_LOAD( "sf4-0", 0x000000, 0x80000, CRC(25938b2d) SHA1(6336e41eee58cab9a524b9bca08965786cc133d3) ) // 7/11 - ROM_LOAD( "sf4-1", 0x080000, 0x80000, CRC(2269ce5c) SHA1(4c6169acf17bba94dc5684f5db60d5bcf73ad068) ) // 7/11 + ROM_REGION( 0x100000, "txtiles", 0 ) + ROM_LOAD16_BYTE( "sf4-0", 0x000000, 0x80000, CRC(25938b2d) SHA1(6336e41eee58cab9a524b9bca08965786cc133d3) ) // 7/11 + ROM_LOAD16_BYTE( "sf4-1", 0x000001, 0x80000, CRC(2269ce5c) SHA1(4c6169acf17bba94dc5684f5db60d5bcf73ad068) ) // 7/11 - ROM_REGION( 0x100000, "gfx3", 0 ) - ROM_LOAD( "sf3-0", 0x000000, 0x80000, CRC(86cd162c) SHA1(95d5f300e3671ebe29b2331325f4d80b96988619) ) // 7/11 - ROM_LOAD( "sf3-1", 0x080000, 0x80000, CRC(2e755e54) SHA1(74b1e099358a07848f7c22c71fbe2661e1ebb417) ) // 7/11 + ROM_REGION( 0x100000, "midhightiles", 0 ) + ROM_LOAD16_BYTE( "sf3-0", 0x000000, 0x80000, CRC(86cd162c) SHA1(95d5f300e3671ebe29b2331325f4d80b96988619) ) // 7/11 + ROM_LOAD16_BYTE( "sf3-1", 0x000001, 0x80000, CRC(2e755e54) SHA1(74b1e099358a07848f7c22c71fbe2661e1ebb417) ) // 7/11 - ROM_REGION( 0x100000, "gfx4", 0 ) - ROM_LOAD( "sf2-0", 0x000000, 0x80000, CRC(622a1816) SHA1(b7b88a90ff69e8f2e291e1f9299708ec97ef9b77) ) // 7/11 - ROM_LOAD( "sf2-1", 0x080000, 0x80000, CRC(545f89e9) SHA1(e7d52dc2da3770d7310698af47da9ff7ec32388c) ) // 7/11 + ROM_REGION( 0x100000, "midlowtiles", 0 ) + ROM_LOAD16_BYTE( "sf2-0", 0x000000, 0x80000, CRC(622a1816) SHA1(b7b88a90ff69e8f2e291e1f9299708ec97ef9b77) ) // 7/11 + ROM_LOAD16_BYTE( "sf2-1", 0x000001, 0x80000, CRC(545f89e9) SHA1(e7d52dc2da3770d7310698af47da9ff7ec32388c) ) // 7/11 - ROM_REGION( 0x100000, "gfx5", 0 ) - ROM_LOAD( "dw-0", 0x000000, 0x80000, CRC(b9b18d00) SHA1(4f38502c75eae88916bc58bfd5d255bac59d0813) ) // 22/11 - ROM_LOAD( "dw-1", 0x080000, 0x80000, CRC(7aea0b12) SHA1(07cbcd6ddcd9ead068b0f5763829e8474b699085) ) // 22/11 + ROM_REGION( 0x100000, "bgtiles", 0 ) + ROM_LOAD16_BYTE( "dw-0", 0x000000, 0x80000, CRC(b9b18d00) SHA1(4f38502c75eae88916bc58bfd5d255bac59d0813) ) // 22/11 + ROM_LOAD16_BYTE( "dw-1", 0x000001, 0x80000, CRC(7aea0b12) SHA1(07cbcd6ddcd9ead068b0f5763829e8474b699085) ) // 22/11 ROM_REGION( 0x40000, "oki1", 0 ) /* Samples */ ROM_LOAD( "oki0", 0x000000, 0x40000, CRC(005811ce) SHA1(9149bc8e9cc16ce3db4e22f8cb7ea8a57a66980e) ) // no date diff --git a/src/mame/edevices/stlforce.cpp b/src/mame/edevices/stlforce.cpp index 9fb224ca25ae2..3c0add6373db2 100644 --- a/src/mame/edevices/stlforce.cpp +++ b/src/mame/edevices/stlforce.cpp @@ -92,7 +92,6 @@ class stlforce_state : public driver_device driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_eeprom(*this, "eeprom"), - m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette") { } @@ -106,7 +105,6 @@ class stlforce_state : public driver_device private: required_device m_eeprom; - required_device m_gfxdecode; required_device m_palette; void eeprom_w(uint8_t data); @@ -130,8 +128,6 @@ class twinbrat_state : public stlforce_state void oki_bank_w(uint8_t data); - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void program_map(address_map &map) ATTR_COLD; void oki_map(address_map &map) ATTR_COLD; }; @@ -145,9 +141,9 @@ void twinbrat_state::machine_start() void stlforce_state::eeprom_w(uint8_t data) { - m_eeprom->di_write(data & 0x01); - m_eeprom->cs_write((data & 0x02) ? ASSERT_LINE : CLEAR_LINE ); - m_eeprom->clk_write((data & 0x04) ? ASSERT_LINE : CLEAR_LINE ); + m_eeprom->di_write(BIT(data, 0)); + m_eeprom->cs_write(BIT(data, 1)); + m_eeprom->clk_write(BIT(data, 2)); } void twinbrat_state::oki_bank_w(uint8_t data) @@ -230,45 +226,23 @@ static INPUT_PORTS_START( stlforce ) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END -static const gfx_layout stlforce_bglayout = -{ - 16,16, - RGN_FRAC(1,1), - 4, - {0,1,2,3}, - {12,8,4,0,28,24,20,16,16*32+12,16*32+8,16*32+4,16*32+0,16*32+28,16*32+24,16*32+20,16*32+16}, - {STEP16(0, 32)}, - 32*32 -}; - -static const gfx_layout stlforce_txlayout = -{ - 8,8, - RGN_FRAC(1,1), - 4, - {0,1,2,3}, - {12,8,4,0,28,24,20,16}, - {0*32,1*32,2*32,3*32,4*32,5*32,6*32,7*32 }, - 8*32 -}; - static const gfx_layout stlforce_splayout = { 16,16, RGN_FRAC(1,4), 4, - {RGN_FRAC(3,4),RGN_FRAC(2,4),RGN_FRAC(1,4),RGN_FRAC(0,4)}, - {16*8+7,16*8+6,16*8+5,16*8+4,16*8+3,16*8+2,16*8+1,16*8+0,7,6,5,4,3,2,1,0}, - {0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8,8*8,9*8,10*8,11*8,12*8,13*8,14*8,15*8}, + { RGN_FRAC(3,4), RGN_FRAC(2,4), RGN_FRAC(1,4), RGN_FRAC(0,4) }, + { STEP8(16*8+7, -1), STEP8(7, -1) }, + { STEP16(0, 8) }, 32*8 }; static GFXDECODE_START( gfx_stlforce ) - GFXDECODE_ENTRY( "sprites", 0x000000, stlforce_splayout, 1024, 16 ) - GFXDECODE_ENTRY( "txtile", 0x000000, stlforce_txlayout, 384, 8 ) - GFXDECODE_ENTRY( "midhightile", 0x000000, stlforce_bglayout, 256, 8 ) - GFXDECODE_ENTRY( "midlowtile", 0x000000, stlforce_bglayout, 128, 8 ) - GFXDECODE_ENTRY( "bgtile", 0x000000, stlforce_bglayout, 0, 8 ) + GFXDECODE_ENTRY( "sprites", 0x000000, stlforce_splayout, 1024, 16 ) + GFXDECODE_ENTRY( "txtile", 0x000000, gfx_8x8x4_packed_lsb, 384, 8 ) + GFXDECODE_ENTRY( "midhightile", 0x000000, gfx_8x8x4_col_2x2_group_packed_lsb, 256, 8 ) + GFXDECODE_ENTRY( "midlowtile", 0x000000, gfx_8x8x4_col_2x2_group_packed_lsb, 128, 8 ) + GFXDECODE_ENTRY( "bgtile", 0x000000, gfx_8x8x4_col_2x2_group_packed_lsb, 0, 8 ) GFXDECODE_END void stlforce_state::stlforce(machine_config &config) @@ -289,10 +263,9 @@ void stlforce_state::stlforce(machine_config &config) screen.set_screen_update("video", FUNC(edevices_sforce_device::draw)); screen.set_palette(m_palette); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_stlforce); PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x800); - edevices_sforce_device &video(EDEVICES_SFORCE_VID(config, "video", 0)); + edevices_sforce_device &video(EDEVICES_SFORCE_VID(config, "video", 0, m_palette, gfx_stlforce)); video.set_bg_videoram_tag("bg_videoram"); video.set_mlow_videoram_tag("mlow_videoram"); video.set_mhigh_videoram_tag("mhigh_videoram"); @@ -302,8 +275,6 @@ void stlforce_state::stlforce(machine_config &config) video.set_mhigh_scrollram_tag("mhigh_scrollram"); video.set_vidattrram_tag("vidattrram"); video.set_spriteram_tag("spriteram"); - video.set_gfxdecode_tag("gfxdecode"); - video.set_palette_tag("palette"); video.set_spritexoffset(7); // sound hardware @@ -344,10 +315,10 @@ ROM_START( stlforce ) ROM_LOAD16_BYTE( "stlforce.104", 0x00001, 0x20000, CRC(69b5f429) SHA1(5bd20fad91a22f4d62f85a5190d72dd824ee26a5) ) ROM_REGION( 0x200000, "tiles", 0 ) // 16x16 bg tiles & 8x8 tx tiles merged - ROM_LOAD16_BYTE( "stlforce.u27", 0x000001, 0x080000, CRC(c42ef365) SHA1(40e9ee29ea14b3bc2fbfa4e6acb7d680cf72f01a) ) - ROM_LOAD16_BYTE( "stlforce.u28", 0x000000, 0x080000, CRC(6a4b7c98) SHA1(004d7f3c703c6abc79286fa58a4c6793d66fca39) ) - ROM_LOAD16_BYTE( "stlforce.u29", 0x100001, 0x080000, CRC(30488f44) SHA1(af0d92d8952ce3cd893ab9569afdda12e17795e7) ) - ROM_LOAD16_BYTE( "stlforce.u30", 0x100000, 0x080000, CRC(cf19d43a) SHA1(dc04930548ac5b7e2b74c6041325eac06e773ed5) ) + ROM_LOAD16_BYTE( "stlforce.u27", 0x000000, 0x080000, CRC(c42ef365) SHA1(40e9ee29ea14b3bc2fbfa4e6acb7d680cf72f01a) ) + ROM_LOAD16_BYTE( "stlforce.u28", 0x000001, 0x080000, CRC(6a4b7c98) SHA1(004d7f3c703c6abc79286fa58a4c6793d66fca39) ) + ROM_LOAD16_BYTE( "stlforce.u29", 0x100000, 0x080000, CRC(30488f44) SHA1(af0d92d8952ce3cd893ab9569afdda12e17795e7) ) + ROM_LOAD16_BYTE( "stlforce.u30", 0x100001, 0x080000, CRC(cf19d43a) SHA1(dc04930548ac5b7e2b74c6041325eac06e773ed5) ) ROM_REGION( 0x080000, "bgtile", 0 ) ROM_COPY( "tiles", 0x000000, 0x000000, 0x080000) @@ -390,12 +361,12 @@ ROM_START( mortalr ) ROM_REGION( 0x300000, "tiles", ROMREGION_ERASE00 ) // 16x16 bg tiles // 2 pairs of piggyback ROMs to give double usual capacity - ROM_LOAD16_BYTE( "8_bot.u27", 0x000001, 0x080000, CRC(042297f3) SHA1(08640cb7997d10baae776f377a605fa70499f6ef) ) - ROM_LOAD16_BYTE( "9_bot.u28", 0x000000, 0x080000, CRC(ab330185) SHA1(6403d472499897395e47a05f73e3760ef632ab8a) ) - ROM_LOAD16_BYTE( "12_top.u27", 0x100001, 0x080000, CRC(fa95773c) SHA1(849f3ab4950b34200e3043d849273622e4bdbfa3) ) - ROM_LOAD16_BYTE( "13_top.u28", 0x100000, 0x080000, CRC(f2342348) SHA1(0f197e88a1911715d3b98af9e303fd1f137e5fe3) ) - ROM_LOAD16_BYTE( "10.u29", 0x200001, 0x080000, CRC(fb39b032) SHA1(c2dfb24fccd4b588d92214addee2a9bbb6e45065) ) - ROM_LOAD16_BYTE( "11.u30", 0x200000, 0x080000, CRC(a82f2421) SHA1(b0787decd1b668af5b2ed032947ca5c0ccc020e8) ) + ROM_LOAD16_BYTE( "8_bot.u27", 0x000000, 0x080000, CRC(042297f3) SHA1(08640cb7997d10baae776f377a605fa70499f6ef) ) + ROM_LOAD16_BYTE( "9_bot.u28", 0x000001, 0x080000, CRC(ab330185) SHA1(6403d472499897395e47a05f73e3760ef632ab8a) ) + ROM_LOAD16_BYTE( "12_top.u27", 0x100000, 0x080000, CRC(fa95773c) SHA1(849f3ab4950b34200e3043d849273622e4bdbfa3) ) + ROM_LOAD16_BYTE( "13_top.u28", 0x100001, 0x080000, CRC(f2342348) SHA1(0f197e88a1911715d3b98af9e303fd1f137e5fe3) ) + ROM_LOAD16_BYTE( "10.u29", 0x200000, 0x080000, CRC(fb39b032) SHA1(c2dfb24fccd4b588d92214addee2a9bbb6e45065) ) + ROM_LOAD16_BYTE( "11.u30", 0x200001, 0x080000, CRC(a82f2421) SHA1(b0787decd1b668af5b2ed032947ca5c0ccc020e8) ) ROM_REGION( 0x100000, "bgtile", 0 ) ROM_COPY( "tiles", 0x000000, 0x000000, 0x100000) @@ -474,10 +445,10 @@ ROM_START( twinbrat ) ROM_LOAD16_BYTE( "13.u104", 0x00001, 0x20000, CRC(9805ba90) SHA1(cdc188fa38220d18c60c9f438520ee574e6ce0f7) ) // higher numbers are newer?? ROM_REGION( 0x200000, "tiles", 0 ) - ROM_LOAD16_BYTE( "6.bin", 0x000000, 0x80000, CRC(af10ddfd) SHA1(e5e83044f20d6cbbc1b4ef1812ac57b6dc958a8a) ) - ROM_LOAD16_BYTE( "7.bin", 0x000001, 0x80000, CRC(3696345a) SHA1(ea38be3586757527b2a1aad2e22b83937f8602da) ) - ROM_LOAD16_BYTE( "4.bin", 0x100000, 0x80000, CRC(1ae8a751) SHA1(5f30306580c6ab4af0ddbdc4519eb4e0ab9bd23a) ) - ROM_LOAD16_BYTE( "5.bin", 0x100001, 0x80000, CRC(cf235eeb) SHA1(d067e2dd4f28a8986dd76ec0eba90e1adbf5787c) ) + ROM_LOAD16_BYTE( "6.bin", 0x000001, 0x80000, CRC(af10ddfd) SHA1(e5e83044f20d6cbbc1b4ef1812ac57b6dc958a8a) ) + ROM_LOAD16_BYTE( "7.bin", 0x000000, 0x80000, CRC(3696345a) SHA1(ea38be3586757527b2a1aad2e22b83937f8602da) ) + ROM_LOAD16_BYTE( "4.bin", 0x100001, 0x80000, CRC(1ae8a751) SHA1(5f30306580c6ab4af0ddbdc4519eb4e0ab9bd23a) ) + ROM_LOAD16_BYTE( "5.bin", 0x100000, 0x80000, CRC(cf235eeb) SHA1(d067e2dd4f28a8986dd76ec0eba90e1adbf5787c) ) ROM_REGION( 0x080000, "bgtile", 0 ) ROM_COPY( "tiles", 0x000000, 0x000000, 0x080000) @@ -510,10 +481,10 @@ ROM_START( twinbrata ) ROM_LOAD16_BYTE( "3.u104", 0x00001, 0x20000, CRC(b1186a67) SHA1(502074063101885874db76ae707db1082313efcf) ) ROM_REGION( 0x200000, "tiles", 0 ) - ROM_LOAD16_BYTE( "6.bin", 0x000000, 0x80000, CRC(af10ddfd) SHA1(e5e83044f20d6cbbc1b4ef1812ac57b6dc958a8a) ) - ROM_LOAD16_BYTE( "7.bin", 0x000001, 0x80000, CRC(3696345a) SHA1(ea38be3586757527b2a1aad2e22b83937f8602da) ) - ROM_LOAD16_BYTE( "4.bin", 0x100000, 0x80000, CRC(1ae8a751) SHA1(5f30306580c6ab4af0ddbdc4519eb4e0ab9bd23a) ) - ROM_LOAD16_BYTE( "5.bin", 0x100001, 0x80000, CRC(cf235eeb) SHA1(d067e2dd4f28a8986dd76ec0eba90e1adbf5787c) ) + ROM_LOAD16_BYTE( "6.bin", 0x000001, 0x80000, CRC(af10ddfd) SHA1(e5e83044f20d6cbbc1b4ef1812ac57b6dc958a8a) ) + ROM_LOAD16_BYTE( "7.bin", 0x000000, 0x80000, CRC(3696345a) SHA1(ea38be3586757527b2a1aad2e22b83937f8602da) ) + ROM_LOAD16_BYTE( "4.bin", 0x100001, 0x80000, CRC(1ae8a751) SHA1(5f30306580c6ab4af0ddbdc4519eb4e0ab9bd23a) ) + ROM_LOAD16_BYTE( "5.bin", 0x100000, 0x80000, CRC(cf235eeb) SHA1(d067e2dd4f28a8986dd76ec0eba90e1adbf5787c) ) ROM_REGION( 0x080000, "bgtile", 0 ) ROM_COPY( "tiles", 0x000000, 0x000000, 0x080000) @@ -550,10 +521,10 @@ ROM_START( twinbratb ) ROM_LOAD16_BYTE( "3.bin", 0x00001, 0x20000, CRC(0e3fa9b0) SHA1(0148cc616eac84dc16415e1557ec6040d14392d4) ) ROM_REGION( 0x200000, "tiles", 0 ) - ROM_LOAD16_BYTE( "6.bin", 0x000000, 0x80000, CRC(af10ddfd) SHA1(e5e83044f20d6cbbc1b4ef1812ac57b6dc958a8a) ) - ROM_LOAD16_BYTE( "7.bin", 0x000001, 0x80000, CRC(3696345a) SHA1(ea38be3586757527b2a1aad2e22b83937f8602da) ) - ROM_LOAD16_BYTE( "4.bin", 0x100000, 0x80000, CRC(1ae8a751) SHA1(5f30306580c6ab4af0ddbdc4519eb4e0ab9bd23a) ) - ROM_LOAD16_BYTE( "5.bin", 0x100001, 0x80000, CRC(cf235eeb) SHA1(d067e2dd4f28a8986dd76ec0eba90e1adbf5787c) ) + ROM_LOAD16_BYTE( "6.bin", 0x000001, 0x80000, CRC(af10ddfd) SHA1(e5e83044f20d6cbbc1b4ef1812ac57b6dc958a8a) ) + ROM_LOAD16_BYTE( "7.bin", 0x000000, 0x80000, CRC(3696345a) SHA1(ea38be3586757527b2a1aad2e22b83937f8602da) ) + ROM_LOAD16_BYTE( "4.bin", 0x100001, 0x80000, CRC(1ae8a751) SHA1(5f30306580c6ab4af0ddbdc4519eb4e0ab9bd23a) ) + ROM_LOAD16_BYTE( "5.bin", 0x100000, 0x80000, CRC(cf235eeb) SHA1(d067e2dd4f28a8986dd76ec0eba90e1adbf5787c) ) ROM_REGION( 0x080000, "bgtile", 0 ) ROM_COPY( "tiles", 0x000000, 0x000000, 0x080000) From d7492dd3cd85ca218d4cc9f4f0622a2f6082e1a6 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 18 Jan 2025 06:46:02 +1100 Subject: [PATCH 56/80] Tidy up some stuff. --- src/devices/bus/heathzenith/h89/h17_fdc.cpp | 3 +- src/devices/cpu/drcbearm64.cpp | 22 +++++++------- src/lib/formats/h17disk.cpp | 33 +++++++++++++-------- src/mame/apple/lisa.cpp | 6 +++- src/mame/apple/lisa.h | 6 ++-- src/mame/sharp/x68k.h | 2 +- src/mame/skeleton/tvcobrasd.cpp | 16 +++++----- 7 files changed, 51 insertions(+), 37 deletions(-) diff --git a/src/devices/bus/heathzenith/h89/h17_fdc.cpp b/src/devices/bus/heathzenith/h89/h17_fdc.cpp index 8f57a8ed72d98..ba43a379b8b42 100644 --- a/src/devices/bus/heathzenith/h89/h17_fdc.cpp +++ b/src/devices/bus/heathzenith/h89/h17_fdc.cpp @@ -15,10 +15,11 @@ #include "emu.h" #include "h17_fdc.h" -#include "formats/h17disk.h" #include "imagedev/floppy.h" #include "machine/s2350.h" +#include "formats/h17disk.h" + #define LOG_REG (1U << 1) // Register setup #define LOG_LINES (1U << 2) // Control lines diff --git a/src/devices/cpu/drcbearm64.cpp b/src/devices/cpu/drcbearm64.cpp index 36a03a793bead..195a0bda9a820 100644 --- a/src/devices/cpu/drcbearm64.cpp +++ b/src/devices/cpu/drcbearm64.cpp @@ -272,7 +272,7 @@ bool emit_sub_optimized(a64::Assembler &a, const a64::Gp &dst, const a64::Gp &sr arm::Mem get_mem_absolute(a64::Assembler &a, const void *ptr) { const uint64_t codeoffs = a.code()->baseAddress() + a.offset(); - const int64_t reloffs = codeoffs - (int64_t)ptr; + const int64_t reloffs = (int64_t)ptr - codeoffs; if (is_valid_immediate_signed(reloffs, 21)) { a.adr(MEM_SCRATCH_REG, ptr); @@ -474,30 +474,30 @@ a64::Gp drcbe_arm64::be_parameter::select_register(a64::Gp const ®, uint32_t return reg.x(); } -void drcbe_arm64::get_imm_relative(a64::Assembler &a, const a64::Gp ®, const uint64_t ptr) const +void drcbe_arm64::get_imm_relative(a64::Assembler &a, const a64::Gp ®, const uint64_t val) const { // If a value can be expressed relative to the base register then it's worth using it instead of a mov // which can be expanded to up to 4 instructions for large immediates - const int64_t diff = (int64_t)ptr - (int64_t)m_baseptr; + const int64_t diff = (int64_t)val - (int64_t)m_baseptr; if (diff > 0 && emit_add_optimized(a, reg, BASE_REG, diff)) return; else if (diff < 0 && emit_sub_optimized(a, reg, BASE_REG, diff)) return; const uint64_t codeoffs = a.code()->baseAddress() + a.offset(); - const int64_t reloffs = codeoffs - (int64_t)ptr; + const int64_t reloffs = (int64_t)val - codeoffs; if (is_valid_immediate_signed(reloffs, 21)) { - a.adr(reg, ptr); + a.adr(reg, val); return; } const uint64_t pagebase = codeoffs & ~make_bitmask(12); - const int64_t pagerel = (int64_t)ptr - pagebase; + const int64_t pagerel = (int64_t)val - pagebase; if (is_valid_immediate_signed(pagerel, 33)) { - const uint64_t targetpage = (uint64_t)ptr & ~make_bitmask(12); - const uint64_t pageoffs = (uint64_t)ptr & util::make_bitmask(12); + const uint64_t targetpage = val & ~make_bitmask(12); + const uint64_t pageoffs = val & util::make_bitmask(12); a.adrp(reg.x(), targetpage); if (pageoffs != 0) @@ -506,7 +506,7 @@ void drcbe_arm64::get_imm_relative(a64::Assembler &a, const a64::Gp ®, const return; } - a.mov(reg, ptr); + a.mov(reg, val); } void drcbe_arm64::emit_ldr_str_base_mem(a64::Assembler &a, a64::Inst::Id opcode, const a64::Reg ®, const void *ptr) const @@ -521,7 +521,7 @@ void drcbe_arm64::emit_ldr_str_base_mem(a64::Assembler &a, a64::Inst::Id opcode, // If it can fit as an offset relative to PC const uint64_t codeoffs = a.code()->baseAddress() + a.offset(); - const int64_t reloffs = codeoffs - (int64_t)ptr; + const int64_t reloffs = (int64_t)ptr - codeoffs; if (is_valid_immediate_signed(reloffs, 21)) { a.adr(MEM_SCRATCH_REG, ptr); @@ -802,7 +802,7 @@ void drcbe_arm64::mov_float_param_param(a64::Assembler &a, uint32_t regsize, con void drcbe_arm64::call_arm_addr(a64::Assembler &a, const void *offs) const { const uint64_t codeoffs = a.code()->baseAddress() + a.offset(); - const int64_t reloffs = codeoffs - (int64_t)offs; + const int64_t reloffs = (int64_t)offs - codeoffs; if (is_valid_immediate_signed(reloffs, 26)) { a.bl(offs); diff --git a/src/lib/formats/h17disk.cpp b/src/lib/formats/h17disk.cpp index 47d164fda1d77..a02112d8ec77d 100644 --- a/src/lib/formats/h17disk.cpp +++ b/src/lib/formats/h17disk.cpp @@ -13,23 +13,23 @@ Heath H17D disk image format (version 2.0.0) *********************************************************************/ #include "h17disk.h" -#include "ioprocs.h" + #include "imageutl.h" +#include "ioprocs.h" + #include -static constexpr int TRACK_SIZE = 50'000; -static constexpr int BITCELL_SIZE = 4000; -static constexpr int SECTOR_METADATA_SIZE = 16; +namespace { -static constexpr int SECTOR_DATA_SIZE = 256; -static constexpr int SECTORS_PER_TRACK = 10; +constexpr int TRACK_SIZE = 50'000; +constexpr int BITCELL_SIZE = 4000; +constexpr int SECTOR_METADATA_SIZE = 16; -heath_h17d_format::heath_h17d_format() : floppy_image_format_t() -{ -} +constexpr int SECTOR_DATA_SIZE = 256; +constexpr int SECTORS_PER_TRACK = 10; struct format { int head_count; @@ -37,7 +37,7 @@ struct format { uint32_t variant; }; -static const format formats[] = { +const format formats[] = { { 1, 40, floppy_image::SSSD10 }, // H-17-1 { 2, 40, floppy_image::DSSD10 }, { 1, 80, floppy_image::SSQD10 }, @@ -64,7 +64,7 @@ enum { Comm = 0x6d6d6f43, //!< "Comm", Comment }; -static std::pair find_block(util::random_read &io, uint32_t block_id) +std::pair find_block(util::random_read &io, uint32_t block_id) { LOG_FORMATS("find_block: 0x%x\n", block_id); @@ -88,7 +88,7 @@ static std::pair find_block(util::random_read &io, u return std::make_pair(pos + 8, header.length); } -static format find_format(util::random_read &io) +format find_format(util::random_read &io) { auto const [pos, length] = find_block(io, DskF); if ((pos == 0) || (length < 2) || (length > 3)) @@ -125,6 +125,13 @@ static format find_format(util::random_read &io) return {}; } +} // anonymous namespace + + +heath_h17d_format::heath_h17d_format() : floppy_image_format_t() +{ +} + int heath_h17d_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t h[4]; @@ -238,7 +245,7 @@ bool heath_h17d_format::load(util::random_read &io, uint32_t form_factor, const void heath_h17d_format::fm_reverse_byte_w(std::vector &buffer, uint8_t val) const { - static unsigned char lookup[16] = { 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe, 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf }; + constexpr unsigned char lookup[16] = { 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe, 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf }; fm_w(buffer, 8, lookup[val & 0x0f] << 4 | lookup[val >> 4], BITCELL_SIZE); } diff --git a/src/mame/apple/lisa.cpp b/src/mame/apple/lisa.cpp index 4b6fa2e5fee90..537608dc6e2af 100644 --- a/src/mame/apple/lisa.cpp +++ b/src/mame/apple/lisa.cpp @@ -12,12 +12,16 @@ #include "emu.h" #include "lisa.h" + #include "cpu/cop400/cop400.h" -#include "formats/ap_dsk35.h" + #include "screen.h" #include "softlist_dev.h" #include "speaker.h" +#include "formats/ap_dsk35.h" + + /*************************************************************************** ADDRESS MAP ***************************************************************************/ diff --git a/src/mame/apple/lisa.h b/src/mame/apple/lisa.h index 065212287c58a..1c7f93b64b7f2 100644 --- a/src/mame/apple/lisa.h +++ b/src/mame/apple/lisa.h @@ -13,19 +13,21 @@ #include "cpu/m6502/m6504.h" #include "cpu/m68000/m68000.h" -#include "machine/74259.h" #include "machine/6522via.h" #include "machine/6522via.h" -#include "machine/z80scc.h" +#include "machine/74259.h" #include "machine/applefdintf.h" #include "machine/iwm.h" #include "machine/nvram.h" +#include "machine/z80scc.h" #include "sound/spkrdev.h" + #include "emupal.h" #include "screen.h" #include "formats/ap_dsk35.h" + /* lisa MMU segment regs */ struct real_mmu_entry { diff --git a/src/mame/sharp/x68k.h b/src/mame/sharp/x68k.h index b5c40b213b6bb..70554ee832825 100644 --- a/src/mame/sharp/x68k.h +++ b/src/mame/sharp/x68k.h @@ -20,7 +20,6 @@ #include "cpu/m68000/m68000.h" #include "cpu/m68000/m68030.h" #include "imagedev/floppy.h" -#include "machine/z80scc.h" #include "machine/hd63450.h" #include "machine/i8255.h" #include "machine/mb87030.h" @@ -28,6 +27,7 @@ #include "machine/ram.h" #include "machine/rp5c15.h" #include "machine/upd765.h" +#include "machine/z80scc.h" #include "sound/flt_vol.h" #include "sound/okim6258.h" #include "sound/ymopm.h" diff --git a/src/mame/skeleton/tvcobrasd.cpp b/src/mame/skeleton/tvcobrasd.cpp index ba327dbfa234c..1b769e7da8b41 100644 --- a/src/mame/skeleton/tvcobrasd.cpp +++ b/src/mame/skeleton/tvcobrasd.cpp @@ -86,13 +86,13 @@ class cobrasd_state : public driver_device m_maincpu(*this, "maincpu") { } - void cobrasdoki(machine_config &config); - void cobrasday(machine_config &config); + void cobrasd_oki(machine_config &config) ATTR_COLD; + void cobrasd_ay(machine_config &config) ATTR_COLD; private: required_device m_maincpu; - void cobrasd(machine_config &config); + void cobrasd(machine_config &config) ATTR_COLD; void program_map(address_map &map) ATTR_COLD; void io_map(address_map &map) ATTR_COLD; @@ -159,7 +159,7 @@ void cobrasd_state::cobrasd(machine_config &config) PCF8583(config, "rtc", 32.768_kHz_XTAL); // External xtal labeled "S833", unknown frequency } -void cobrasd_state::cobrasdoki(machine_config &config) +void cobrasd_state::cobrasd_oki(machine_config &config) { // Basic machine hardware @@ -172,7 +172,7 @@ void cobrasd_state::cobrasdoki(machine_config &config) OKIM6376(config, "oki", 4_MHz_XTAL / 8).add_route(ALL_OUTPUTS, "mono", 0.5); // Divider not verified } -void cobrasd_state::cobrasday(machine_config &config) +void cobrasd_state::cobrasd_ay(machine_config &config) { // Basic machine hardware @@ -210,6 +210,6 @@ ROM_END } // anonymous namespace -// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS -GAME(1998, cobrasd, 0, cobrasdoki, cobrasd, cobrasd_state, empty_init, ROT0, u8"TourVisión", "Cobra Sport Dart / Tour Sport Dart (OKI M6376 sound)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK) -GAME(1997, cobrasda, cobrasd, cobrasday, cobrasd, cobrasd_state, empty_init, ROT0, u8"TourVisión", "Cobra Sport Dart / Tour Sport Dart (AY-8910 sound)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK) +// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS +GAME(1998, cobrasd, 0, cobrasd_oki, cobrasd, cobrasd_state, empty_init, ROT0, u8"TourVisión", "Cobra Sport Dart / Tour Sport Dart (Oki MSM6376 sound)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK) +GAME(1997, cobrasda, cobrasd, cobrasd_ay, cobrasd, cobrasd_state, empty_init, ROT0, u8"TourVisión", "Cobra Sport Dart / Tour Sport Dart (AY-8910 sound)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK) From dfbcf4db84281ceaf3672b36c478a77aa011d8b0 Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 17 Jan 2025 20:51:08 +0100 Subject: [PATCH 57/80] mc68681,micro3d: small cleanup --- src/devices/machine/mc68681.cpp | 30 +++++++++++++++--------------- src/mame/misc/micro3d.cpp | 14 +++++++------- src/mame/misc/micro3d_m.cpp | 5 ++--- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/devices/machine/mc68681.cpp b/src/devices/machine/mc68681.cpp index c84b3bbee0d4b..96d37fec9969a 100644 --- a/src/devices/machine/mc68681.cpp +++ b/src/devices/machine/mc68681.cpp @@ -33,16 +33,14 @@ The extra baud rates are implemented by an 'X' bit for each channel. The X bit chooses between two baud rate tables, in addition to the ACR[7] bit. - The X bit is changed by additional commands that are written to CRA and - CRB. + The X bit is changed by additional commands that are written to CRA and CRB. The MISR is a read only register that takes the place of the 'BRG Test' register on the MC68681. The low power standby mode is entered and left by a command written to CRA or CRB registers. Writing the commands to either register affects the whole - DUART, not just one channel. Resetting the DUART also leaves low power - mode. + DUART, not just one channel. Resetting the DUART also leaves low power mode. */ #include "emu.h" @@ -70,8 +68,8 @@ static const int baud_rate_ACR_0_X_1[] = { 75, 110, 134, 150, 3600, 14400, 28800 static const int baud_rate_ACR_1[] = { 75, 110, 134, 150, 300, 600, 1200, 2000, 2400, 4800, 1800, 9600, 19200, 0, 0, 0 }; /* xr68c681 X=0 */ static const int baud_rate_ACR_1_X_1[] = { 50, 110, 134, 200, 3600, 14400, 28800, 57600, 115200, 4800, 7200, 9600, 38400, 0, 0, 0 }; -static const int baud_rate_ACR_0_340[] = { 50, 110, 134, 200, 300, 600, 1200, 1050, 2400, 4800, 7200, 9600, 38400, 76800, 0, 0 }; /* xr68c681 ACR:7=0 */ -static const int baud_rate_ACR_1_340[] = { 75, 110, 134, 150, 300, 600, 1200, 2000, 2400, 4800, 1800, 9600, 19200, 38400, 0, 0 }; /* xr68c681 ACR:7=1 */ +static const int baud_rate_ACR_0_340[] = { 50, 110, 134, 200, 300, 600, 1200, 1050, 2400, 4800, 7200, 9600, 38400, 76800, 0, 0 }; /* xr68c681 ACR:7=0 */ +static const int baud_rate_ACR_1_340[] = { 75, 110, 134, 150, 300, 600, 1200, 2000, 2400, 4800, 1800, 9600, 19200, 38400, 0, 0 }; /* xr68c681 ACR:7=1 */ #define INT_INPUT_PORT_CHANGE 0x80 #define INT_DELTA_BREAK_B 0x40 @@ -103,7 +101,7 @@ static const int baud_rate_ACR_1_340[] = { 75, 110, 134, 150, 300, 600, 1 DEFINE_DEVICE_TYPE(SCN2681, scn2681_device, "scn2681", "SCN2681 DUART") DEFINE_DEVICE_TYPE(MC68681, mc68681_device, "mc68681", "MC68681 DUART") DEFINE_DEVICE_TYPE(SC28C94, sc28c94_device, "sc28c94", "SC28C94 QUART") -DEFINE_DEVICE_TYPE(MC68340_DUART, mc68340_duart_device, "mc68340duart", "MC68340 DUART Device") +DEFINE_DEVICE_TYPE(MC68340_DUART, mc68340_duart_device, "mc68340duart", "MC68340 DUART") DEFINE_DEVICE_TYPE(XR68C681, xr68c681_device, "xr68c681", "XR68C681 DUART") DEFINE_DEVICE_TYPE(DUART_CHANNEL, duart_channel, "duart_channel", "DUART channel") @@ -140,8 +138,8 @@ scn2681_device::scn2681_device(const machine_config &mconfig, const char *tag, d } mc68681_device::mc68681_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) - : duart_base_device(mconfig, type, tag, owner, clock), - m_read_vector(false) + : duart_base_device(mconfig, type, tag, owner, clock) + , m_read_vector(false) { } @@ -173,11 +171,11 @@ mc68340_duart_device::mc68340_duart_device(const machine_config &mconfig, const } xr68c681_device::xr68c681_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : mc68681_device(mconfig, XR68C681, tag, owner, clock), - m_XTXA(false), - m_XRXA(false), - m_XTXB(false), - m_XRXB(false) + : mc68681_device(mconfig, XR68C681, tag, owner, clock) + , m_XTXA(false) + , m_XRXA(false) + , m_XTXB(false) + , m_XRXB(false) { } @@ -1300,8 +1298,10 @@ void duart_channel::tra_callback() } } else + { // loop back transmitted bit rx_w(transmit_register_get_data_bit()); + } // TxRDY is not set until the end of start bit time if (++m_bits_transmitted > 1 && !m_tx_data_in_buffer) @@ -1453,7 +1453,7 @@ void duart_channel::write_chan_reg(int reg, uint8_t data) CSR = data; tx_baud_rate = m_uart->calc_baud(m_ch, false, data & 0xf); rx_baud_rate = m_uart->calc_baud(m_ch, true, (data>>4) & 0xf); - //printf("%s ch %d CSR %02x Tx baud %d Rx baud %d\n", tag(), m_ch, data, tx_baud_rate, rx_baud_rate); + //printf("%s ch %d CSR %02x Tx baud %d Rx baud %d\n", tag(), m_ch, data, tx_baud_rate, rx_baud_rate); set_rcv_rate(rx_baud_rate); set_tra_rate(tx_baud_rate); break; diff --git a/src/mame/misc/micro3d.cpp b/src/mame/misc/micro3d.cpp index 4edf916788f75..08ffc24b49b9f 100644 --- a/src/mame/misc/micro3d.cpp +++ b/src/mame/misc/micro3d.cpp @@ -223,6 +223,12 @@ void micro3d_state::hostmem(address_map &map) map(0xa40002, 0xa40003).r(FUNC(micro3d_state::encoder_l_r)); } +void micro3d_state::cpu_space_map(address_map &map) +{ + map(0xfffff0, 0xffffff).m(m_maincpu, FUNC(m68000_base_device::autovectors_map)); + map(0xfffff6, 0xfffff7).lr16(NAME([this] () -> u16 { return m_duart->get_irq_vector(); })); +} + /************************************* * @@ -294,12 +300,6 @@ void micro3d_state::soundmem_io(address_map &map) map(0xff01, 0xff01).w(FUNC(micro3d_state::snd_dac_b)); } -void micro3d_state::cpu_space_map(address_map &map) -{ - map(0xfffff0, 0xffffff).m(m_maincpu, FUNC(m68000_base_device::autovectors_map)); - map(0xfffff6, 0xfffff7).lr16(NAME([this] () -> u16 { return m_duart->get_irq_vector(); })); -} - /************************************* * @@ -480,7 +480,7 @@ ROM_START( f15se22 ) ROM_LOAD16_BYTE( "110-00001-007.u94", 0x0c0000, 0x20000, CRC(36e06cba) SHA1(5ffee5da6f475978be10fa5e1a2c24f00497ea5f) ) ROM_LOAD16_BYTE( "110-00001-008.u71", 0x100001, 0x20000, CRC(d96fd4e2) SHA1(001af758da437e955b4ee914eabeb9739ebc4454) ) ROM_LOAD16_BYTE( "110-00001-009.u95", 0x100000, 0x20000, CRC(33e3b473) SHA1(66deda79ba94f0ed722b399b3fc6062dcdd1a6c9) ) - ROM_FILL( 0x140000, 0x40000, 0xff ) + ROM_FILL( 0x140000, 0x40000, 0xff ) // Dr Math PCB (MPG 010-00002-001) ROM_REGION32_BE( 0x100000, "drmath", 0 ) diff --git a/src/mame/misc/micro3d_m.cpp b/src/mame/misc/micro3d_m.cpp index 4be9c6aa43d13..e97fa8fcb9d7e 100644 --- a/src/mame/misc/micro3d_m.cpp +++ b/src/mame/misc/micro3d_m.cpp @@ -401,9 +401,9 @@ void micro3d_state::drmath_intr2_ack(uint32_t data) /*************************************************************************** - 8031 port mappings: + 8051 port mappings: - Port 1 Port 2 + Port 1 Port 3 ======= ====== 0: S/H sel A (O) 0: 1: S/H sel B (O) 1: @@ -416,7 +416,6 @@ void micro3d_state::drmath_intr2_ack(uint32_t data) ***************************************************************************/ - void micro3d_state::snd_dac_a(uint8_t data) { m_noise[0]->dac_w(data); From 6d60f631a5cb497888f96399fb9f58663462309e Mon Sep 17 00:00:00 2001 From: AJR Date: Fri, 17 Jan 2025 14:53:51 -0500 Subject: [PATCH 58/80] leadsng2: Decrypt ROM and tentatively identify CPU architecture --- src/mame/skeleton/leadsinger2.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/mame/skeleton/leadsinger2.cpp b/src/mame/skeleton/leadsinger2.cpp index a3574148cfc18..9fb032b84f9f9 100644 --- a/src/mame/skeleton/leadsinger2.cpp +++ b/src/mame/skeleton/leadsinger2.cpp @@ -42,6 +42,8 @@ Card Slot #include "emu.h" +#include "cpu/mips/mips3.h" + #include "screen.h" #include "speaker.h" @@ -52,16 +54,22 @@ class leadsng2_state : public driver_device public: leadsng2_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") , m_screen(*this, "screen") { } void leadsng2(machine_config &config) ATTR_COLD; + void init_leadsng2(); + protected: virtual void machine_start() override ATTR_COLD; virtual void machine_reset() override ATTR_COLD; private: + void mem_map(address_map &map); + + required_device m_maincpu; required_device m_screen; uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); @@ -81,12 +89,19 @@ void leadsng2_state::machine_reset() { } +void leadsng2_state::mem_map(address_map &map) +{ + map(0x18000000, 0x180fffff).mirror(0x07c00000).rom().region("maincpu", 0); +} + static INPUT_PORTS_START( leadsng2 ) INPUT_PORTS_END void leadsng2_state::leadsng2(machine_config &config) { - // unknown CPU core + // unknown CPU core (MIPS-based, little endian?) + R4400LE(config, m_maincpu, 27_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &leadsng2_state::mem_map); SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_refresh_hz(60); @@ -103,6 +118,13 @@ ROM_START( leadsng2 ) ROM_LOAD( "ls-k2_es29lv800eb_004a225b.bin", 0x000000, 0x100000, CRC(e70f1e1f) SHA1(5aa3187adffcba5bd4a9e3e89a1c210d7f1a978e) ) ROM_END +void leadsng2_state::init_leadsng2() +{ + memory_region *rgn = memregion("maincpu"); + for (offs_t offset = 0; offset < rgn->bytes(); offset++) + rgn->as_u8(offset) ^= (offset & 0x54) ^ 0xa5; +} + } // anonymous namespace -CONS( 200?, leadsng2, 0, 0, leadsng2, leadsng2, leadsng2_state, empty_init, "Enter Tech", "Leadsinger II (LS-K2)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) +CONS( 200?, leadsng2, 0, 0, leadsng2, leadsng2, leadsng2_state, init_leadsng2, "Enter Tech", "Leadsinger II (LS-K2)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) From e0866584df10e9bfd4f9e6c3b5858603eb619a0f Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Sat, 18 Jan 2025 08:10:17 +0100 Subject: [PATCH 59/80] New clones marked not working ----------------------------- Batman Forever (Italian, 4.0, Sept. 26 1995, Display Rev. 4.00, earlier sound ROM) [Corrado Tomaselli] Pentacup (rev. S) [Ken Sumrall, PinMAME] --- src/mame/mame.lst | 2 + src/mame/pinball/de_3.cpp | 249 ++++++++++++++++++---------------- src/mame/pinball/micropin.cpp | 9 ++ 3 files changed, 142 insertions(+), 118 deletions(-) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 787947c17a43e..4e5376744bc06 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -36984,6 +36984,7 @@ bmf_de // bmf_fr // bmf_it // bmf_ita // +bmf_itb // bmf_jp // bmf_nl // bmf_nl302 // @@ -37456,6 +37457,7 @@ sport2k // @source:pinball/micropin.cpp pentacup // pentacup2 // +pentacups // pentacupt // @source:pinball/missamer.cpp diff --git a/src/mame/pinball/de_3.cpp b/src/mame/pinball/de_3.cpp index d4f698753ac88..2522e3f90b4af 100644 --- a/src/mame/pinball/de_3.cpp +++ b/src/mame/pinball/de_3.cpp @@ -55,14 +55,13 @@ Roach Racers (not emulated) 5054 *********************************************************************************************************************/ #include "emu.h" +#include "decobsmt.h" #include "decodmd1.h" #include "decodmd2.h" #include "decodmd3.h" #include "decopincpu.h" #include "genpin.h" -#include "decobsmt.h" - #include "cpu/m6809/m6809.h" #include "sound/msm5205.h" #include "sound/ymopm.h" @@ -1838,6 +1837,19 @@ ROM_START(bmf_ita) ROM_LOAD("bmfu21.bin", 0x080000, 0x80000, CRC(e41a516d) SHA1(9c41803a01046e57f8bd8759fe5e62ad6abaa80c)) ROM_END +ROM_START(bmf_itb) + ROM_REGION(0x10000, "maincpu", 0) + ROM_LOAD("bmcpu_italy.c5", 0x0000, 0x10000, CRC(adab3152) SHA1(d99124f4199988e50933f8fb9de2677e5327e139)) + ROM_REGION16_BE(0x100000, "decodmd3", 0) + ROM_LOAD16_BYTE("bmf_dmd0i.bin", 0x000001, 0x80000, CRC(78e15b14) SHA1(67fba0efcd94e2210ea3532e6a3a8f4a6d5891b0)) + ROM_LOAD16_BYTE("bmf_dmd3i.bin", 0x000000, 0x80000, CRC(759f676b) SHA1(622c105fa30d44b244ef9eeecfdd6f753031fc4d)) + ROM_REGION(0x010000, "decobsmt:soundcpu", 0) + ROM_LOAD("batforesndu7_92f0_7-16-95.bin", 0x0000, 0x10000, CRC(9d8b2477) SHA1(9e5087e3c84b440e26bb7a6952e6f0c9db734de3)) + ROM_REGION(0x1000000, "decobsmt:bsmt", 0) + ROM_LOAD("batforesndu17_1587_6-14-95.u17", 0x000000, 0x80000, CRC(edcd5c10) SHA1(561f22fb7817f64e09ef6adda646f58f31b80bf4)) + ROM_LOAD("batforesndu21_6fa1_6-14-95.u21", 0x080000, 0x80000, CRC(e41a516d) SHA1(9c41803a01046e57f8bd8759fe5e62ad6abaa80c)) +ROM_END + ROM_START(bmf_sp) ROM_REGION(0x10000, "maincpu", 0) ROM_LOAD("batnova.401", 0x0000, 0x10000, CRC(4e62df4e) SHA1(6c3be65fc8825f47cd08755b58fdcf3652ede702)) @@ -2105,119 +2117,120 @@ ROM_START(detest) ROM_REGION(0x1000000, "decobsmt:bsmt", ROMREGION_ERASE00) ROM_END -} // Anonymous namespace - - -GAME(1993, rab_320, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Adventures of Rocky and Bullwinkle and Friends (USA 3.20, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // ROCKY+BULLWINKLE AUGUST 12, 1993 USA CPU 3.20. DISPLAY VERSION- BULLWINKLE A3.00 5/24/1993 -GAME(1993, rab_130, rab_320, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Adventures of Rocky and Bullwinkle and Friends (USA 1.30, display A1.30)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // ROCKY+BULLWINKLE APRIL 1, 1993 USA CPU 1.30. DISPLAY VERSION- BULLWINKLE A1.30 4/1/1993 -GAME(1993, rab_103s, rab_320, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Adventures of Rocky and Bullwinkle and Friends (USA 1.03, display S1.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // ROCKY+BULLWINKLE FEBRUARY 3, 1993 USA CPU 1.03. DISPLAY VERSION- BULLWINKLE S1.03 2/2/1993 -GAME(1992, aar_101, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Aaron Spelling (1.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // AARON SPELLING V1.01 12/23/92 -GAME(1991, btmn_106, 0, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Batman (USA 1.06, display A1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // BATMAN USA 1.06. DISP VER: BATMAN A1.02 -GAME(1991, btmn_103, btmn_106, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Batman (USA 1.03, display A1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // BATMAN USA 1.03. DISP VER: BATMAN A1.02 -GAME(1991, btmn_103f, btmn_106, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Batman (France 1.03, display F1.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // BATMAN FRANCE 1.03. DISP VER: BATMAN F1.03 -GAME(1991, btmn_103g, btmn_106, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Batman (Germany 1.03, display G1.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // BATMAN GERMANY 1.03. DISP VER: BATMAN G1.04 -GAME(1991, btmn_101, btmn_106, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Batman (USA 1.01, display A1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // BATMAN USA 1.01 -GAME(1991, ckpt_a17, 0, de_3_dmdo, de3, de_3_state, empty_init, ROT0, "Data East", "Checkpoint (1.7)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // CP80 3/6/91 -GAME(1994, gnr_300, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Guns N Roses (USA 3.00, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // GUNS-N-ROSES AUGUST 21, 1994 USA CPU 3.00. DISPLAY VERSION- GNR A3.00 AUGUST 16, 1994 -GAME(1994, gnr_300f, gnr_300, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Guns N Roses (French 3.00, display F3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // GUNS-N-ROSES AUGUST 21, 1994 FRENCH CPU 3.00. DISPLAY VERSION- GNR F3.00 AUGUST 16, 1994 -GAME(1994, gnr_300d, gnr_300, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Guns N Roses (Dutch 3.00, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // GUNS-N-ROSES AUGUST 21, 1994 DUTCH CPU 3.00. DISPLAY VERSION- GNR A3.00 AUGUST 16, 1994 -GAME(1994, gnr_200, gnr_300, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Guns N Roses (USA 2.00, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // GUNS-N-ROSES JULY 5, 1994 USA CPU 2.00 -GAME(1992, hook_408, 0, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (USA 4.08, display A4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK USA 4.08. DISPLAY: HOOK A4.01 -GAME(1992, hook_404, hook_408, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (USA 4.04, display A4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK USA 4.04 -GAME(1992, hook_401, hook_408, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (USA 4.01, display A4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK USA 4.01 -GAME(1992, hook_401_p, hook_408, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (USA 4.01 with prototype sound, display A4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK USA 4.01 -GAME(1992, hook_f401, hook_408, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (USA 4.01, display F4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK USA 4.01 DISPLAY: HOOK F4.01 -GAME(1992, hook_400, hook_408, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (USA 4.01, display A4.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK USA 4.01 DISPLAY: HOOK A4.00 -GAME(1992, hook_e406, hook_408, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (UK 4.06, display A4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK U.K. 4.06 -GAME(1993, jupk_513, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Jurassic Park (USA 5.13, display A5.10)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // JURASSIC PARK SEP. 28, 1993 USA CPU 5.13. DISPLAY VERSION- JURASSIC A5.10 8/24/1993 -GAME(1993, jupk_501, jupk_513, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Jurassic Park (USA 5.01, display A5.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // JURASSIC PARK JUNE 28, 1993 USA CPU 5.01. DISPLAY VERSION- JURASSIC A5.01 6/24/1993 -GAME(1993, jupk_501g, jupk_513, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Jurassic Park (USA 5.01, display G5.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // JURASSIC PARK JUNE 28, 1993 USA CPU 5.01. DISPLAY VERSION- JURASSIC G5.01 6/24/1993 -GAME(1993, jupk_307, jupk_513, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Jurassic Park (USA 3.07, display A4.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // JURASSIC PARK. MAY 25, 1993. USA CPU 3.05 -GAME(1993, jupk_305, jupk_513, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Jurassic Park (USA 3.05, display A4.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // JURASSIC PARK. MAY 25, 1993. USA CPU 3.05 -GAME(1993, lah_112, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (USA 1.12, display A1.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO NOV. 10, 1993 USA CPU 1.12. DISPLAY VERSION- ACTION HERO A1.06 11/11/1993 -GAME(1993, lah_110, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (USA 1.10, display A1.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO OCT. 18, 1993 USA CPU 1.10 -GAME(1993, lah_xxx_s105, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (unknown CPU, display L1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // DISPLAY VERSION- ACTION HERO L1.05 11/11/1993 -GAME(1993, lah_108s, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (USA 1.08, display L1.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO SEPT. 28, 1993 USA CPU 1.08. DISPLAY VERSION- ACTION HERO L1.04 9/5/1993 -GAME(1993, lah_107, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (USA 1.07, display A1.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO SEPT. 22, 1993 USA CPU 1.07 -GAME(1993, lah_106c, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (Canada 1.06, display A1.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO SEPT. 20, 1993 CANADA CPU 1.06. DISPLAY VERSION- ACTION HERO A1.04 9/5/1993 -GAME(1993, lah_104f, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (USA 1.04, display F1.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO SEPT. 1, 1993 USA CPU 1.04. DISPLAY VERSION- ACTION HERO F1.01 8/18/1993 -GAME(1993, lah_104s, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (USA 1.04, display L1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO SEPT. 1, 1993 USA CPU 1.04. DISPLAY VERSION- ACTION HERO L1.02 8/30/1993 -GAME(1992, lw3_208, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (USA 2.08, display A2.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 11/17/92 USA CPU 2.08. DISPLAY VERSION- LETHAL WEAPON A2.06 9/29/1992 -GAME(1992, lw3_207, lw3_208, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (USA 2.07, display A2.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 AUG 31, 1992 USA CPU 2.07 -GAME(1992, lw3_207c, lw3_208, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (Canada 2.07, display A2.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 AUG 31, 1992 CANADA CPU 2.07 -GAME(1992, lw3_205, lw3_208, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (USA 2.05, display A2.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 JULY 30, 1992 USA CPU 2.05. DISPLAY VERSION- LETHAL WEAPON A2.05 8/14/1992 -GAME(1992, lw3_204e, lw3_208, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (England 2.04, display A2.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 JULY 30. 1992 ENGLAND CPU 2.04. DISPLAY VERSION LETHAL WEAPON A2.02 7/17/1992 -GAME(1992, lw3_203, lw3_208, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (USA 2.03, display A2.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 JULY 17, 1992 USA CPU 2.03. DISPLAY VERSION- LETHAL WEAPON A2.04 7/29/1992 -GAME(1992, lw3_200, lw3_208, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (USA 2.00, display A2.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 JUNE 16, 1992 USA CPU 2.00. DISPLAY VERSION- LETHAL WEAPON A2.04 7/29/1992 -GAME(1992, mj_130, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Michael Jordan (1.30, display A1.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // MICHAEL JORDAN V 1.30 11/4/92. DISPLAY VERSION- JORDAN A1.03 8/13/1993 -GAME(1992, trek_201, 0, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Star Trek 25th Anniversary (USA 2.01, display A1.09)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STARTREK 4/30/92 USA VER. 2.01. DISPLAY: STARTREK A1.09 -GAME(1992, trek_200, trek_201, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Star Trek 25th Anniversary (USA 2.00, display A1.09)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STARTREK 4/16/92 USA VER. 2.00 -GAME(1992, trek_120, trek_201, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Star Trek 25th Anniversary (USA 1.20, display A1.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR TREK 1/10 USA VER. 1.20. DISPLAY: STARTREK A1.06 -GAME(1992, trek_117, trek_201, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Star Trek 25th Anniversary (USA 1.17, display A1.09)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR TREK 12/9 USA VER. 1.17 -GAME(1992, trek_110, trek_201, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Star Trek 25th Anniversary (USA 1.10, display A1.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR TREK 11/14 USA VER. 1.10. DISPLAY: STARTREK A1.06 -GAME(1992, trek_110_a027, trek_201, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Star Trek 25th Anniversary (USA 1.10, display A0.27)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR TREK 11/14 USA VER. 1.10. DISPLAY: STARTREK A0.27 -GAME(1992, stwr_106, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (Unofficial 1.06, display A1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS 2016 UNOFFICIAL 1.06. DISPLAY VERSION- STAR WARS A1.05 12/4/1992 -GAME(1992, stwr_106_s105, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (Unofficial 1.06, display S1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // DISPLAY VERSION- STAR WARS S1.05 12/4/1992 -GAME(1992, stwr_106_a046, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (Unofficial 1.06, display A0.46)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // DISPLAY VERSION- STAR WARS A0.46 10/9/1992 -GAME(1992, stwr_104, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (USA 1.04, display A1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS USA CPU 1.04 -GAME(1992, stwr_103, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (USA 1.03, display A1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS USA CPU 1.03 -GAME(1992, stwr_103_a104, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (USA 1.03, display A1.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS USA CPU 1.03. DISPLAY VERSION- STAR WARS A1.04 11/20/1992 -GAME(1992, stwr_102, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (USA 1.02, display A1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS USA CPU 1.02 -GAME(1992, stwr_102e, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (England 1.02, display A1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS ENGLAND CPU 1.02 -GAME(1992, stwr_101, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (USA 1.01, display A1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS USA CPU 1.01. DISPLAY VERSION- STAR WARS A1.02 10/29/1992 -GAME(1992, stwr_101g, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (German 1.01, display G1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS GERMAN CPU 1.01. DISPLAY VERSION- STAR WARS G1.02 29/10/1992 -GAME(1993, tftc_303, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Tales From the Crypt (USA 3.03, display A3.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TFTC FEBRUARY 22,1994 USA CPU 3.03. DISPLAY VERSION- CRYPT A3.01 12/28/1993 -GAME(1993, tftc_302, tftc_303, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Tales From the Crypt (Dutch 3.02, display A3.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TFTC JANUARY 06, 1994 DUTCH CPU 3.02 -GAME(1993, tftc_300, tftc_303, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Tales From the Crypt (USA 3.00, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TFTC DECEMBER 15, 1993 USA CPU 3.00. DISPLAY VERSION- CRYPT A3.00 12/16/1993 -GAME(1993, tftc_200, tftc_303, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Tales From the Crypt (USA 2.00, display A2.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TFTC DECEMBER 03, 1993 USA CPU 2.00. DISPLAY VERSION- CRYPT A2.00 12/3/1993 -GAME(1993, tftc_104s, tftc_303, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Tales From the Crypt (USA 1.04, display L1.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TFTC NOVEMBER 19, 1993 USA CPU 1.04. DISPLAY VERSION- CRYPT L1.03 11/11/1993 -GAME(1991, tmnt_104, 0, de_3_dmdo, de3, de_3_state, empty_init, ROT0, "Data East", "Teenage Mutant Ninja Turtles (USA 1.04, display A1.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // T.M.N.T. USA 1.04. DISPLAY VER: TMNT A1.04 -GAME(1991, tmnt_104g, tmnt_104, de_3_dmdo, de3, de_3_state, empty_init, ROT0, "Data East", "Teenage Mutant Ninja Turtles (Germany 1.04, display A1.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // T.M.N.T. GERMANY 1.04. -GAME(1991, tmnt_103, tmnt_104, de_3_dmdo, de3, de_3_state, empty_init, ROT0, "Data East", "Teenage Mutant Ninja Turtles (1.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // T.M.N.T. A 1.03 -GAME(1991, tmnt_101, tmnt_104, de_3_dmdo, de3, de_3_state, empty_init, ROT0, "Data East", "Teenage Mutant Ninja Turtles (1.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // T.M.N.T. A 1.01 -GAME(1991, tmnt_a07, tmnt_104, de_3_dmdo, de3, de_3_state, empty_init, ROT0, "Data East", "Teenage Mutant Ninja Turtles (A 0.7 VUK prototype)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // T.M.N.T. A 0.7 VUK -GAME(1994, tomy_400, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "The Who's Tommy Pinball Wizard (USA 4.00, display A4.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TOMMY APRIL 6, 1994 USA CPU 4.00. DISPLAY VERSION- TOMMY A4.00 MAY 5, 1994 -GAME(1994, tomy_301g, tomy_400, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "The Who's Tommy Pinball Wizard (German 3.01, display G3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TOMMY MARCH 22, 1994 GERMAN CPU 3.01. DISPLAY VERSION- TOMMY G3.00 FEBRUARY 16, 1994 -GAME(1994, tomy_300h, tomy_400, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "The Who's Tommy Pinball Wizard (Dutch 3.00, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TOMMY FEBRUARY 16, 1994 DUTCH CPU 3.00. DISPLAY VERSION- TOMMY A3.00 FEBRUARY 15, 1994 -GAME(1994, tomy_201h, tomy_400, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "The Who's Tommy Pinball Wizard (Dutch 2.01, display A2.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TOMMY FEBRUARY 16, 1994 DUTCH CPU 3.00. DISPLAY VERSION- TOMMY A3.00 FEBRUARY 15, 1994 -GAME(1994, tomy_102, tomy_400, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "The Who's Tommy Pinball Wizard (USA 1.02, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TOMMY FEBRUARY 11, 1994 DUTCH CPU 2.01. DISPLAY VERSION- TOMMY A2.00 FEBRUARY 1, 1994 -GAME(1994, tomy_102be, tomy_400, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "The Who's Tommy Pinball Wizard (Belgium 1.02, display A1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TOMMY JANUARY 26, 1994 BELGIUM CPU 1.02. DISPLAY VERSION- TOMMY A1.02 JANUARY 25, 1994 -GAME(1994, wwfr_106, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "WWF Royal Rumble (USA 1.06, display A1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // RUMBLIN' AN' A TUMBLIN' WWF WRESTLING AUG. 01, 1994 USA CPU 1.06. DISPLAY VERSION- WWF A1.02 JUNE 29, 1994 -GAME(1994, wwfr_103, wwfr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "WWF Royal Rumble (USA 1.03, display A1.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // RUMBLIN' AN' A TUMBLIN' WWF WRESTLING APR. 28, 1994 USA CPU 1.03. DISPLAY VERSION- WWF A1.01 APRIL 14, 1994 -GAME(1994, wwfr_103f, wwfr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "WWF Royal Rumble (French 1.03, display F1.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // RUMBLIN' AN' A TUMBLIN' WWF WRESTLING APR. 28, 1994 FRENCH CPU 1.03. DISPLAY VERSION- WWF F1.01 APRIL 14, 1994 -GAME(1995, batmanf, 0, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (4.0)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, batmanf3, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (3.0)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, batmanf2, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (2.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, batmanf1, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_uk, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (English)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_cn, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Canadian)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_no, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Norwegian)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_sv, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Swedish)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_at, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Austrian)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_ch, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Swiss)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_de, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (German)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_be, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Belgian)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_fr, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (French)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_nl, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Dutch, 4.0)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_nl302, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Dutch, 3.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_it, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Italian, 4.0, Nov. 1 1995, Display Rev. 4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_ita, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Italian, 4.0, Sept. 26 1995, Display Rev. 4.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_sp, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Spanish)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_jp, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Japanese)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_time, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Timed Play)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, baywatch, 0, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Baywatch", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bay_d300, baywatch, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Baywatch (3.00 Dutch)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bay_g300, baywatch, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Baywatch (3.00 German)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bay_d400, baywatch, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Baywatch (4.00 English)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bay_e400, baywatch, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Baywatch (4.00 Dutch)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bay_f201, baywatch, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Baywatch (2.01 French)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1994, frankst, 0, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Mary Shelley's Frankenstein", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, frankstg, frankst, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Mary Shelley's Frankenstein (Germany)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, franksti, frankst, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Mary Shelley's Frankenstein (Italy)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1994, mav_402, 0, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Maverick, The Movie (4.04, Display Rev. 4.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1994, mav_401, mav_402, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Maverick, The Movie (4.02, Display Rev. 4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1994, mav_400, mav_402, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Maverick, The Movie (Display Rev. 4.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1994, mav_200, mav_402, de_3b, de3, de_3_state, empty_init, ROT0, "Data East", "Maverick, The Movie (2.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1994, mav_100, mav_402, de_3b, de3, de_3_state, empty_init, ROT0, "Data East", "Maverick, The Movie (1.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1998, detest, 0, detest, de3, de_3_state, empty_init, ROT0, "Data East", "Data East Test Chip", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1996, ctcheese, 0, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Cut The Cheese (Redemption)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +} // anonymous namespace + + +GAME(1993, rab_320, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Adventures of Rocky and Bullwinkle and Friends (USA 3.20, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // ROCKY+BULLWINKLE AUGUST 12, 1993 USA CPU 3.20. DISPLAY VERSION- BULLWINKLE A3.00 5/24/1993 +GAME(1993, rab_130, rab_320, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Adventures of Rocky and Bullwinkle and Friends (USA 1.30, display A1.30)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // ROCKY+BULLWINKLE APRIL 1, 1993 USA CPU 1.30. DISPLAY VERSION- BULLWINKLE A1.30 4/1/1993 +GAME(1993, rab_103s, rab_320, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Adventures of Rocky and Bullwinkle and Friends (USA 1.03, display S1.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // ROCKY+BULLWINKLE FEBRUARY 3, 1993 USA CPU 1.03. DISPLAY VERSION- BULLWINKLE S1.03 2/2/1993 +GAME(1992, aar_101, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Aaron Spelling (1.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // AARON SPELLING V1.01 12/23/92 +GAME(1991, btmn_106, 0, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Batman (USA 1.06, display A1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // BATMAN USA 1.06. DISP VER: BATMAN A1.02 +GAME(1991, btmn_103, btmn_106, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Batman (USA 1.03, display A1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // BATMAN USA 1.03. DISP VER: BATMAN A1.02 +GAME(1991, btmn_103f, btmn_106, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Batman (France 1.03, display F1.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // BATMAN FRANCE 1.03. DISP VER: BATMAN F1.03 +GAME(1991, btmn_103g, btmn_106, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Batman (Germany 1.03, display G1.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // BATMAN GERMANY 1.03. DISP VER: BATMAN G1.04 +GAME(1991, btmn_101, btmn_106, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Batman (USA 1.01, display A1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // BATMAN USA 1.01 +GAME(1991, ckpt_a17, 0, de_3_dmdo, de3, de_3_state, empty_init, ROT0, "Data East", "Checkpoint (1.7)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // CP80 3/6/91 +GAME(1994, gnr_300, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Guns N Roses (USA 3.00, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // GUNS-N-ROSES AUGUST 21, 1994 USA CPU 3.00. DISPLAY VERSION- GNR A3.00 AUGUST 16, 1994 +GAME(1994, gnr_300f, gnr_300, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Guns N Roses (French 3.00, display F3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // GUNS-N-ROSES AUGUST 21, 1994 FRENCH CPU 3.00. DISPLAY VERSION- GNR F3.00 AUGUST 16, 1994 +GAME(1994, gnr_300d, gnr_300, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Guns N Roses (Dutch 3.00, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // GUNS-N-ROSES AUGUST 21, 1994 DUTCH CPU 3.00. DISPLAY VERSION- GNR A3.00 AUGUST 16, 1994 +GAME(1994, gnr_200, gnr_300, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Guns N Roses (USA 2.00, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // GUNS-N-ROSES JULY 5, 1994 USA CPU 2.00 +GAME(1992, hook_408, 0, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (USA 4.08, display A4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK USA 4.08. DISPLAY: HOOK A4.01 +GAME(1992, hook_404, hook_408, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (USA 4.04, display A4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK USA 4.04 +GAME(1992, hook_401, hook_408, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (USA 4.01, display A4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK USA 4.01 +GAME(1992, hook_401_p, hook_408, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (USA 4.01 with prototype sound, display A4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK USA 4.01 +GAME(1992, hook_f401, hook_408, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (USA 4.01, display F4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK USA 4.01 DISPLAY: HOOK F4.01 +GAME(1992, hook_400, hook_408, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (USA 4.01, display A4.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK USA 4.01 DISPLAY: HOOK A4.00 +GAME(1992, hook_e406, hook_408, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Hook (UK 4.06, display A4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // HOOK U.K. 4.06 +GAME(1993, jupk_513, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Jurassic Park (USA 5.13, display A5.10)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // JURASSIC PARK SEP. 28, 1993 USA CPU 5.13. DISPLAY VERSION- JURASSIC A5.10 8/24/1993 +GAME(1993, jupk_501, jupk_513, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Jurassic Park (USA 5.01, display A5.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // JURASSIC PARK JUNE 28, 1993 USA CPU 5.01. DISPLAY VERSION- JURASSIC A5.01 6/24/1993 +GAME(1993, jupk_501g, jupk_513, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Jurassic Park (USA 5.01, display G5.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // JURASSIC PARK JUNE 28, 1993 USA CPU 5.01. DISPLAY VERSION- JURASSIC G5.01 6/24/1993 +GAME(1993, jupk_307, jupk_513, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Jurassic Park (USA 3.07, display A4.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // JURASSIC PARK. MAY 25, 1993. USA CPU 3.05 +GAME(1993, jupk_305, jupk_513, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Jurassic Park (USA 3.05, display A4.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // JURASSIC PARK. MAY 25, 1993. USA CPU 3.05 +GAME(1993, lah_112, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (USA 1.12, display A1.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO NOV. 10, 1993 USA CPU 1.12. DISPLAY VERSION- ACTION HERO A1.06 11/11/1993 +GAME(1993, lah_110, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (USA 1.10, display A1.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO OCT. 18, 1993 USA CPU 1.10 +GAME(1993, lah_xxx_s105, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (unknown CPU, display L1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // DISPLAY VERSION- ACTION HERO L1.05 11/11/1993 +GAME(1993, lah_108s, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (USA 1.08, display L1.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO SEPT. 28, 1993 USA CPU 1.08. DISPLAY VERSION- ACTION HERO L1.04 9/5/1993 +GAME(1993, lah_107, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (USA 1.07, display A1.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO SEPT. 22, 1993 USA CPU 1.07 +GAME(1993, lah_106c, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (Canada 1.06, display A1.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO SEPT. 20, 1993 CANADA CPU 1.06. DISPLAY VERSION- ACTION HERO A1.04 9/5/1993 +GAME(1993, lah_104f, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (USA 1.04, display F1.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO SEPT. 1, 1993 USA CPU 1.04. DISPLAY VERSION- ACTION HERO F1.01 8/18/1993 +GAME(1993, lah_104s, lah_112, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Last Action Hero (USA 1.04, display L1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LAST ACTION HERO SEPT. 1, 1993 USA CPU 1.04. DISPLAY VERSION- ACTION HERO L1.02 8/30/1993 +GAME(1992, lw3_208, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (USA 2.08, display A2.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 11/17/92 USA CPU 2.08. DISPLAY VERSION- LETHAL WEAPON A2.06 9/29/1992 +GAME(1992, lw3_207, lw3_208, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (USA 2.07, display A2.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 AUG 31, 1992 USA CPU 2.07 +GAME(1992, lw3_207c, lw3_208, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (Canada 2.07, display A2.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 AUG 31, 1992 CANADA CPU 2.07 +GAME(1992, lw3_205, lw3_208, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (USA 2.05, display A2.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 JULY 30, 1992 USA CPU 2.05. DISPLAY VERSION- LETHAL WEAPON A2.05 8/14/1992 +GAME(1992, lw3_204e, lw3_208, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (England 2.04, display A2.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 JULY 30. 1992 ENGLAND CPU 2.04. DISPLAY VERSION LETHAL WEAPON A2.02 7/17/1992 +GAME(1992, lw3_203, lw3_208, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (USA 2.03, display A2.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 JULY 17, 1992 USA CPU 2.03. DISPLAY VERSION- LETHAL WEAPON A2.04 7/29/1992 +GAME(1992, lw3_200, lw3_208, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Lethal Weapon 3 (USA 2.00, display A2.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // LW3 JUNE 16, 1992 USA CPU 2.00. DISPLAY VERSION- LETHAL WEAPON A2.04 7/29/1992 +GAME(1992, mj_130, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Michael Jordan (1.30, display A1.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // MICHAEL JORDAN V 1.30 11/4/92. DISPLAY VERSION- JORDAN A1.03 8/13/1993 +GAME(1992, trek_201, 0, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Star Trek 25th Anniversary (USA 2.01, display A1.09)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STARTREK 4/30/92 USA VER. 2.01. DISPLAY: STARTREK A1.09 +GAME(1992, trek_200, trek_201, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Star Trek 25th Anniversary (USA 2.00, display A1.09)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STARTREK 4/16/92 USA VER. 2.00 +GAME(1992, trek_120, trek_201, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Star Trek 25th Anniversary (USA 1.20, display A1.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR TREK 1/10 USA VER. 1.20. DISPLAY: STARTREK A1.06 +GAME(1992, trek_117, trek_201, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Star Trek 25th Anniversary (USA 1.17, display A1.09)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR TREK 12/9 USA VER. 1.17 +GAME(1992, trek_110, trek_201, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Star Trek 25th Anniversary (USA 1.10, display A1.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR TREK 11/14 USA VER. 1.10. DISPLAY: STARTREK A1.06 +GAME(1992, trek_110_a027, trek_201, de_3_dmd1, de3, de_3_state, empty_init, ROT0, "Data East", "Star Trek 25th Anniversary (USA 1.10, display A0.27)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR TREK 11/14 USA VER. 1.10. DISPLAY: STARTREK A0.27 +GAME(1992, stwr_106, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (Unofficial 1.06, display A1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS 2016 UNOFFICIAL 1.06. DISPLAY VERSION- STAR WARS A1.05 12/4/1992 +GAME(1992, stwr_106_s105, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (Unofficial 1.06, display S1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // DISPLAY VERSION- STAR WARS S1.05 12/4/1992 +GAME(1992, stwr_106_a046, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (Unofficial 1.06, display A0.46)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // DISPLAY VERSION- STAR WARS A0.46 10/9/1992 +GAME(1992, stwr_104, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (USA 1.04, display A1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS USA CPU 1.04 +GAME(1992, stwr_103, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (USA 1.03, display A1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS USA CPU 1.03 +GAME(1992, stwr_103_a104, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (USA 1.03, display A1.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS USA CPU 1.03. DISPLAY VERSION- STAR WARS A1.04 11/20/1992 +GAME(1992, stwr_102, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (USA 1.02, display A1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS USA CPU 1.02 +GAME(1992, stwr_102e, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (England 1.02, display A1.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS ENGLAND CPU 1.02 +GAME(1992, stwr_101, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (USA 1.01, display A1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS USA CPU 1.01. DISPLAY VERSION- STAR WARS A1.02 10/29/1992 +GAME(1992, stwr_101g, stwr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (German 1.01, display G1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // STAR WARS GERMAN CPU 1.01. DISPLAY VERSION- STAR WARS G1.02 29/10/1992 +GAME(1993, tftc_303, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Tales From the Crypt (USA 3.03, display A3.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TFTC FEBRUARY 22,1994 USA CPU 3.03. DISPLAY VERSION- CRYPT A3.01 12/28/1993 +GAME(1993, tftc_302, tftc_303, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Tales From the Crypt (Dutch 3.02, display A3.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TFTC JANUARY 06, 1994 DUTCH CPU 3.02 +GAME(1993, tftc_300, tftc_303, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Tales From the Crypt (USA 3.00, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TFTC DECEMBER 15, 1993 USA CPU 3.00. DISPLAY VERSION- CRYPT A3.00 12/16/1993 +GAME(1993, tftc_200, tftc_303, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Tales From the Crypt (USA 2.00, display A2.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TFTC DECEMBER 03, 1993 USA CPU 2.00. DISPLAY VERSION- CRYPT A2.00 12/3/1993 +GAME(1993, tftc_104s, tftc_303, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "Tales From the Crypt (USA 1.04, display L1.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TFTC NOVEMBER 19, 1993 USA CPU 1.04. DISPLAY VERSION- CRYPT L1.03 11/11/1993 +GAME(1991, tmnt_104, 0, de_3_dmdo, de3, de_3_state, empty_init, ROT0, "Data East", "Teenage Mutant Ninja Turtles (USA 1.04, display A1.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // T.M.N.T. USA 1.04. DISPLAY VER: TMNT A1.04 +GAME(1991, tmnt_104g, tmnt_104, de_3_dmdo, de3, de_3_state, empty_init, ROT0, "Data East", "Teenage Mutant Ninja Turtles (Germany 1.04, display A1.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // T.M.N.T. GERMANY 1.04. +GAME(1991, tmnt_103, tmnt_104, de_3_dmdo, de3, de_3_state, empty_init, ROT0, "Data East", "Teenage Mutant Ninja Turtles (1.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // T.M.N.T. A 1.03 +GAME(1991, tmnt_101, tmnt_104, de_3_dmdo, de3, de_3_state, empty_init, ROT0, "Data East", "Teenage Mutant Ninja Turtles (1.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // T.M.N.T. A 1.01 +GAME(1991, tmnt_a07, tmnt_104, de_3_dmdo, de3, de_3_state, empty_init, ROT0, "Data East", "Teenage Mutant Ninja Turtles (A 0.7 VUK prototype)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // T.M.N.T. A 0.7 VUK +GAME(1994, tomy_400, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "The Who's Tommy Pinball Wizard (USA 4.00, display A4.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TOMMY APRIL 6, 1994 USA CPU 4.00. DISPLAY VERSION- TOMMY A4.00 MAY 5, 1994 +GAME(1994, tomy_301g, tomy_400, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "The Who's Tommy Pinball Wizard (German 3.01, display G3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TOMMY MARCH 22, 1994 GERMAN CPU 3.01. DISPLAY VERSION- TOMMY G3.00 FEBRUARY 16, 1994 +GAME(1994, tomy_300h, tomy_400, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "The Who's Tommy Pinball Wizard (Dutch 3.00, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TOMMY FEBRUARY 16, 1994 DUTCH CPU 3.00. DISPLAY VERSION- TOMMY A3.00 FEBRUARY 15, 1994 +GAME(1994, tomy_201h, tomy_400, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "The Who's Tommy Pinball Wizard (Dutch 2.01, display A2.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TOMMY FEBRUARY 16, 1994 DUTCH CPU 3.00. DISPLAY VERSION- TOMMY A3.00 FEBRUARY 15, 1994 +GAME(1994, tomy_102, tomy_400, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "The Who's Tommy Pinball Wizard (USA 1.02, display A3.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TOMMY FEBRUARY 11, 1994 DUTCH CPU 2.01. DISPLAY VERSION- TOMMY A2.00 FEBRUARY 1, 1994 +GAME(1994, tomy_102be, tomy_400, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "The Who's Tommy Pinball Wizard (Belgium 1.02, display A1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // TOMMY JANUARY 26, 1994 BELGIUM CPU 1.02. DISPLAY VERSION- TOMMY A1.02 JANUARY 25, 1994 +GAME(1994, wwfr_106, 0, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "WWF Royal Rumble (USA 1.06, display A1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // RUMBLIN' AN' A TUMBLIN' WWF WRESTLING AUG. 01, 1994 USA CPU 1.06. DISPLAY VERSION- WWF A1.02 JUNE 29, 1994 +GAME(1994, wwfr_103, wwfr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "WWF Royal Rumble (USA 1.03, display A1.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // RUMBLIN' AN' A TUMBLIN' WWF WRESTLING APR. 28, 1994 USA CPU 1.03. DISPLAY VERSION- WWF A1.01 APRIL 14, 1994 +GAME(1994, wwfr_103f, wwfr_106, de_3_dmd2, de3, de_3_state, empty_init, ROT0, "Data East", "WWF Royal Rumble (French 1.03, display F1.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) // RUMBLIN' AN' A TUMBLIN' WWF WRESTLING APR. 28, 1994 FRENCH CPU 1.03. DISPLAY VERSION- WWF F1.01 APRIL 14, 1994 +GAME(1995, batmanf, 0, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (4.0)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, batmanf3, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (3.0)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, batmanf2, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (2.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, batmanf1, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_uk, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (English)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_cn, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Canadian)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_no, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Norwegian)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_sv, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Swedish)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_at, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Austrian)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_ch, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Swiss)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_de, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (German)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_be, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Belgian)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_fr, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (French)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_nl, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Dutch, 4.0)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_nl302, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Dutch, 3.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_it, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Italian, 4.0, Nov. 1 1995, Display Rev. 4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_ita, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Italian, 4.0, Sept. 26 1995, Display Rev. 4.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_itb, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Italian, 4.0, Sept. 26 1995, Display Rev. 4.00, earlier sound ROM)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_sp, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Spanish)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_jp, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Japanese)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_time, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Timed Play)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, baywatch, 0, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Baywatch", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bay_d300, baywatch, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Baywatch (3.00 Dutch)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bay_g300, baywatch, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Baywatch (3.00 German)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bay_d400, baywatch, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Baywatch (4.00 English)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bay_e400, baywatch, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Baywatch (4.00 Dutch)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bay_f201, baywatch, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Baywatch (2.01 French)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1994, frankst, 0, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Mary Shelley's Frankenstein", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, frankstg, frankst, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Mary Shelley's Frankenstein (Germany)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, franksti, frankst, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Mary Shelley's Frankenstein (Italy)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1994, mav_402, 0, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Maverick, The Movie (4.04, Display Rev. 4.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1994, mav_401, mav_402, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Maverick, The Movie (4.02, Display Rev. 4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1994, mav_400, mav_402, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Maverick, The Movie (Display Rev. 4.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1994, mav_200, mav_402, de_3b, de3, de_3_state, empty_init, ROT0, "Data East", "Maverick, The Movie (2.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1994, mav_100, mav_402, de_3b, de3, de_3_state, empty_init, ROT0, "Data East", "Maverick, The Movie (1.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1998, detest, 0, detest, de3, de_3_state, empty_init, ROT0, "Data East", "Data East Test Chip", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1996, ctcheese, 0, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Cut The Cheese (Redemption)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/pinball/micropin.cpp b/src/mame/pinball/micropin.cpp index f60433ccce76e..445e2c4c77f95 100644 --- a/src/mame/pinball/micropin.cpp +++ b/src/mame/pinball/micropin.cpp @@ -556,8 +556,17 @@ ROM_START(pentacupt) ROM_LOAD("microt_4.bin", 0x1800, 0x0800, CRC(6f691929) SHA1(a18352312706e0f0af14a33fac31c3f5f7156ba8)) ROM_END +ROM_START(pentacups) + ROM_REGION(0x10000, "v2cpu", 0) + ROM_LOAD("micros_1.bin", 0x0000, 0x0800, CRC(c563c419) SHA1(b4e6711125c8222f4b299e23ee12edfe1c92b52f)) + ROM_LOAD("micros_2.bin", 0x0800, 0x0800, CRC(46ffd9bf) SHA1(4feae6e8fe6929481d89b00d743fca02e40fb7b8)) + ROM_LOAD("microt_3.bin", 0x1000, 0x0800, CRC(cefb0966) SHA1(836491745417fc0d5f88c01a9c69a5c322d194be)) // same as for rev. T + ROM_LOAD("micros_4.bin", 0x1800, 0x0800, CRC(c7fcb6d8) SHA1(2f6f7aa5705e938a9fedfa4e357e720a1f743a26)) +ROM_END + } // anonymous namespace GAME(1978, pentacup, 0, pent6800, pent6800, pent6800_state, empty_init, ROT0, "Micropin", "Pentacup (rev. 1)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) GAME(1980, pentacup2, pentacup, pent8085, pent8085, pent8085_state, empty_init, ROT0, "Micropin", "Pentacup (rev. 2)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) GAME(1980, pentacupt, pentacup, pent8085, pent8085, pent8085_state, empty_init, ROT0, "Micropin", "Pentacup (rev. T)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1980, pentacups, pentacup, pent8085, pent8085, pent8085_state, empty_init, ROT0, "Micropin", "Pentacup (rev. S)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) From 7140d7d92f3b406a495e11a449abcef86900a22a Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 18 Jan 2025 11:40:01 +0100 Subject: [PATCH 60/80] galaxold: remove no_cocktail flag for most games [Robbbert] --- src/mame/galaxian/galaxold.cpp | 26 +++++++++++++------------- src/mame/galaxian/galaxold.h | 2 +- src/mame/galaxian/galaxold_m.cpp | 8 ++++---- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/mame/galaxian/galaxold.cpp b/src/mame/galaxian/galaxold.cpp index 32ebed4a744ea..c5f2085cf4b43 100644 --- a/src/mame/galaxian/galaxold.cpp +++ b/src/mame/galaxian/galaxold.cpp @@ -370,8 +370,8 @@ void galaxold_state::dkongjrmc_map(address_map &map) { map(0x0000, 0x5fff).rom(); map(0x6000, 0x6fff).ram(); - map(0x7000, 0x70ff).ram().w(FUNC(galaxold_state::galaxold_attributesram_w)).share("attributesram"); - map(0x7100, 0x71ff).ram().share("spriteram"); + map(0x7000, 0x70ff).w(FUNC(galaxold_state::galaxold_attributesram_w)).share("attributesram"); + map(0x7100, 0x71ff).writeonly().share("spriteram"); map(0x7400, 0x77ff).ram().w(FUNC(galaxold_state::galaxold_videoram_w)).share("videoram"); map(0x7800, 0x7800).portr("DSW"); map(0x7801, 0x7801).w(FUNC(galaxold_state::galaxold_nmi_enable_w)); @@ -965,7 +965,7 @@ int galaxold_state::_4in1_fake_port_r() { static const char *const portnames[] = { "FAKE1", "FAKE2", "FAKE3", "FAKE4" }; - return (ioport(portnames[m__4in1_bank])->read() & Mask) ? 1 : 0; + return (ioport(portnames[m_4in1_bank])->read() & Mask) ? 1 : 0; } static INPUT_PORTS_START( 4in1 ) @@ -2625,18 +2625,18 @@ ROM_END // Z80 games // YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY, FULLNAME, FLAGS -GAME( 1981, vpool, hustler, mooncrst, vpool, galaxold_state, empty_init, ROT90, "bootleg", "Video Pool (bootleg on Moon Cresta hardware)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1981, scramblb, scramble, scramblb, scramblb, galaxold_state, empty_init, ROT90, "bootleg", "Scramble (bootleg on Galaxian hardware)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1981, scramb2, scramble, scramb2, scramb2, galaxold_state, empty_init, ROT90, "bootleg", "Scramble (bootleg, set 1)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1981, scramb3, scramble, scramb3, scramb2, galaxold_state, empty_init, ROT90, "bootleg", "Scramble (bootleg, set 2)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1981, scrambler, scramble, scrambler, scrambler, galaxold_state, empty_init, ROT90, "bootleg (Reben S.A.)", "Scramble (Reben S.A. Spanish bootleg)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1981, scrambleo, scramble, scrambleo, scrambleo, galaxold_state, empty_init, ROT90, "bootleg (Okapi)", "Scramble (Okapi bootleg)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1981, scrabbleo, scramble, scrambler, scrambler, galaxold_state, empty_init, ROT90, "bootleg (Okapi?)", "Scrabble (Spanish bootleg of Scramble)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1981, vpool, hustler, mooncrst, vpool, galaxold_state, empty_init, ROT90, "bootleg", "Video Pool (bootleg on Moon Cresta hardware)", MACHINE_SUPPORTS_SAVE ) +GAME( 1981, scramblb, scramble, scramblb, scramblb, galaxold_state, empty_init, ROT90, "bootleg", "Scramble (bootleg on Galaxian hardware)", MACHINE_SUPPORTS_SAVE ) +GAME( 1981, scramb2, scramble, scramb2, scramb2, galaxold_state, empty_init, ROT90, "bootleg", "Scramble (bootleg, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1981, scramb3, scramble, scramb3, scramb2, galaxold_state, empty_init, ROT90, "bootleg", "Scramble (bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1981, scrambler, scramble, scrambler, scrambler, galaxold_state, empty_init, ROT90, "bootleg (Reben S.A.)", "Scramble (Reben S.A. Spanish bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 1981, scrambleo, scramble, scrambleo, scrambleo, galaxold_state, empty_init, ROT90, "bootleg (Okapi)", "Scramble (Okapi bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 1981, scrabbleo, scramble, scrambler, scrambler, galaxold_state, empty_init, ROT90, "bootleg (Okapi?)", "Scrabble (Spanish bootleg of Scramble)", MACHINE_SUPPORTS_SAVE ) GAME( 1981, 4in1, 0, _4in1, 4in1, galaxold_state, init_4in1, ROT90, "Armenia / Food and Fun", "4 Fun in 1", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1982, dkongjrm, dkongjr, dkongjrm, dkongjrm, galaxold_state, empty_init, ROT90, "bootleg", "Donkey Kong Jr. (bootleg on Moon Cresta hardware, set 1)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1982, dkongjrm, dkongjr, dkongjrm, dkongjrm, galaxold_state, empty_init, ROT90, "bootleg", "Donkey Kong Jr. (bootleg on Moon Cresta hardware, set 1)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1982, dkongjrmc, dkongjr, dkongjrmc, dkongjrmc, galaxold_state, empty_init, ROT90, "bootleg (Centromatic)", "Donkey Kong Jr. (bootleg on Moon Cresta hardware, set 2)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // sprites leave artifacts -GAME( 1982, tazzmang, tazmania, tazzmang, tazzmang, galaxold_state, empty_init, ROT90, "bootleg", "Tazz-Mania (bootleg on Galaxian hardware)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1982, tazzmang2, tazmania, tazzmang, tazzmang, galaxold_state, empty_init, ROT90, "bootleg", "Tazz-Mania (bootleg on Galaxian hardware with Starfield)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1982, tazzmang, tazmania, tazzmang, tazzmang, galaxold_state, empty_init, ROT90, "bootleg", "Tazz-Mania (bootleg on Galaxian hardware)", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, tazzmang2, tazmania, tazzmang, tazzmang, galaxold_state, empty_init, ROT90, "bootleg", "Tazz-Mania (bootleg on Galaxian hardware with Starfield)", MACHINE_SUPPORTS_SAVE ) // Videotron cartridge system GAME( 1981, hustlerb3, hustler, videotron, hustlerb3, galaxold_state, empty_init, ROT90, "bootleg (Videotron)", "Video Pool (bootleg of Video Hustler)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/galaxian/galaxold.h b/src/mame/galaxian/galaxold.h index eecc90956bd45..7a17ca82b99fe 100644 --- a/src/mame/galaxian/galaxold.h +++ b/src/mame/galaxian/galaxold.h @@ -70,7 +70,7 @@ class galaxold_state : public driver_device output_finder<2> m_leds; int m_irq_line = 0; - uint8_t m__4in1_bank = 0U; + uint8_t m_4in1_bank = 0U; tilemap_t *m_bg_tilemap = nullptr; int m_spriteram2_present = 0; uint8_t m_gfxbank[5]{}; diff --git a/src/mame/galaxian/galaxold_m.cpp b/src/mame/galaxian/galaxold_m.cpp index 3f82e738c4798..b4d609bc66fe7 100644 --- a/src/mame/galaxian/galaxold_m.cpp +++ b/src/mame/galaxian/galaxold_m.cpp @@ -132,9 +132,9 @@ uint8_t galaxold_state::scramblb_protection_2_r() void galaxold_state::_4in1_bank_w(uint8_t data) { - m__4in1_bank = data & 0x03; - galaxold_gfxbank_w(0, m__4in1_bank); - membank("bank1")->set_entry(m__4in1_bank); + m_4in1_bank = data & 0x03; + galaxold_gfxbank_w(0, m_4in1_bank); + membank("bank1")->set_entry(m_4in1_bank); } void galaxold_state::init_4in1() @@ -153,7 +153,7 @@ void galaxold_state::init_4in1() _4in1_bank_w(0); /* set the initial CPU bank */ - save_item(NAME(m__4in1_bank)); + save_item(NAME(m_4in1_bank)); } void galaxold_state::init_bullsdrtg() From e79f7c804f660fda399c9ef7c94f51390d96df18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A4rt=20P=C3=B5der?= Date: Sat, 18 Jan 2025 17:03:55 +0200 Subject: [PATCH 61/80] ussr/juku.cpp: Use a memory view for switching memory mapping, added mouse and fixed timer. (#13205) ussr/jukumouse.cpp: Emulated Juku mouse interface. --- src/mame/ussr/juku.cpp | 110 +++++++++++++++------------------ src/mame/ussr/jukumouse.cpp | 118 ++++++++++++++++++++++++++++++++++++ src/mame/ussr/jukumouse.h | 35 +++++++++++ 3 files changed, 201 insertions(+), 62 deletions(-) create mode 100644 src/mame/ussr/jukumouse.cpp create mode 100644 src/mame/ussr/jukumouse.h diff --git a/src/mame/ussr/juku.cpp b/src/mame/ussr/juku.cpp index 31f24760ac3d0..12981bc284e5f 100644 --- a/src/mame/ussr/juku.cpp +++ b/src/mame/ussr/juku.cpp @@ -21,22 +21,24 @@ and T to boot from tape/disk/network TODO: + - E5103 (Juss) and IBM AT keyboard layouts? - Work out how the floppy interface really works? - Tape? (split up to E5101 batch as tape only?) + - Separate FDC 1791, 1792 and 1793 versions - И41 (=Multibus-1) compatibility? - Network? - Ramdisk? - Memory extensions? - - Mouse! ***************************************************************************/ #include "emu.h" +#include "jukumouse.h" + #include "cpu/i8085/i8085.h" #include "imagedev/floppy.h" #include "machine/74148.h" -#include "machine/bankdev.h" #include "machine/i8251.h" #include "machine/i8255.h" #include "machine/pic8259.h" @@ -80,7 +82,11 @@ class juku_state : public driver_device juku_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_bank(*this, "bank"), + m_rom(*this, "maincpu"), + m_exp(*this, "expcart"), + m_ram(*this, "ram"), + m_ext(*this, "ext%u", 0U, 0x8000U, ENDIANNESS_LITTLE), + m_mode(*this, "mode"), m_pic(*this, "pic"), m_pit(*this, "pit%u", 0U), m_pio(*this, "pio%u", 0U), @@ -91,7 +97,8 @@ class juku_state : public driver_device m_keys(*this, "COL.%u", 0U), m_key_special(*this, "SPECIAL"), m_screen(*this, "screen"), - m_speaker(*this, "speaker") + m_speaker(*this, "speaker"), + m_mouse(*this, "mouse") { } void juku(machine_config &config); @@ -102,7 +109,11 @@ class juku_state : public driver_device private: required_device m_maincpu; - required_device m_bank; + required_region_ptr m_rom; + optional_region_ptr m_exp; + required_shared_ptr m_ram; + memory_share_array_creator m_ext; + memory_view m_mode; required_device m_pic; required_device_array m_pit; required_device_array m_pio; @@ -114,6 +125,7 @@ class juku_state : public driver_device required_ioport m_key_special; required_device m_screen; required_device m_speaker; + optional_device m_mouse; int32_t m_width, m_height, m_hbporch, m_vbporch; @@ -126,10 +138,7 @@ class juku_state : public driver_device uint8_t m_fdc_cur_cmd; - std::unique_ptr m_ram; - void mem_map(address_map &map) ATTR_COLD; - void bank_map(address_map &map) ATTR_COLD; void io_map(address_map &map) ATTR_COLD; void pio0_porta_w(uint8_t data); @@ -163,25 +172,16 @@ class juku_state : public driver_device void juku_state::mem_map(address_map &map) { - map(0x0000, 0xffff).m(m_bank, FUNC(address_map_bank_device::amap8)); -} - -void juku_state::bank_map(address_map &map) -{ - // memory mode 0 - map(0x00000, 0x03fff).rom().region("maincpu", 0); - map(0x00000, 0x03fff).bankw("ram_0000"); - map(0x04000, 0x0ffff).bankrw("ram_4000"); - // memory mode 1 - map(0x10000, 0x1ffff).bankrw("ram_0000"); - map(0x1d800, 0x1ffff).bankr("rom_d800"); - // memory mode 2 - map(0x20000, 0x23fff).bankrw("ram_0000"); - map(0x24000, 0x2bfff).rom().region("extension", 0); - map(0x2c000, 0x2ffff).bankrw("ram_c000"); - map(0x2d800, 0x2ffff).bankr("rom_d800"); - // memory mode 3 - map(0x30000, 0x3ffff).bankrw("ram_0000"); + map(0x0000, 0xffff).ram().share(m_ram); + map(0x0000, 0xffff).view(m_mode); + m_mode[0](0x0000, 0x3fff).rom().region("maincpu", 0x0000); + m_mode[1](0xd800, 0xffff).rom().region("maincpu", 0x1800); + // optional BASIC expansion cartridge + m_mode[2](0x4000, 0xbfff).rom().region("expcart", 0x0000); + // no info on programs actually using extra 32kb "memory window" + //m_mode[2](0x4000, 0xbfff).ram().share(m_ext[0]); + m_mode[2](0xd800, 0xffff).rom().region("maincpu", 0x1800); + m_mode[3]; // let everything fall through to RAM } void juku_state::io_map(address_map &map) @@ -206,6 +206,7 @@ void juku_state::io_map(address_map &map) map(0x1f, 0x1f).rw(FUNC(juku_state::fdc_data_r), FUNC(juku_state::fdc_data_w)); // mapping for cassette version (E5101?) // map(0x1c, 0x1d).rw(m_sio[1], FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x80, 0x80).r(m_mouse, FUNC(juku_mouse_device::mouse_port_r)); // TODO: turn this into a Multibus expansion } @@ -645,19 +646,11 @@ void juku_state::pio0_portc_w(uint8_t data) floppy->ss_w(BIT(data, 6)); } - m_bank->set_bank(data & 0x03); + m_mode.select(data & 0b11); } void juku_state::machine_start() { - m_ram = std::make_unique(0x10000); - - membank("rom_d800")->set_base(memregion("maincpu")->base() + 0x1800); - - membank("ram_0000")->set_base(&m_ram[0x0000]); - membank("ram_4000")->set_base(&m_ram[0x4000]); - membank("ram_c000")->set_base(&m_ram[0xc000]); - // register for save states save_item(NAME(m_width)); save_item(NAME(m_height)); @@ -671,12 +664,11 @@ void juku_state::machine_start() save_item(NAME(m_beep_state)); save_item(NAME(m_beep_level)); save_item(NAME(m_fdc_cur_cmd)); - save_pointer(NAME(m_ram), 0x10000); } void juku_state::machine_reset() { - m_bank->set_bank(0); + m_mode.select(0); m_key_encoder->enable_input_w(0); m_beep_state = 0; m_beep_level = 0; @@ -701,13 +693,7 @@ void juku_state::juku(machine_config &config) I8080A(config, m_maincpu, 20_MHz_XTAL/10); m_maincpu->set_addrmap(AS_PROGRAM, &juku_state::mem_map); m_maincpu->set_addrmap(AS_IO, &juku_state::io_map); - m_maincpu->in_inta_func().set("pic", FUNC(pic8259_device::acknowledge)); - - ADDRESS_MAP_BANK(config, m_bank); - m_bank->set_map(&juku_state::bank_map); - m_bank->set_data_width(8); - m_bank->set_addr_width(18); - m_bank->set_stride(0x10000); + m_maincpu->in_inta_func().set(m_pic, FUNC(pic8259_device::acknowledge)); // КР580ВН59 PIC8259(config, m_pic, 0); @@ -721,30 +707,26 @@ void juku_state::juku(machine_config &config) m_pit[0]->out_handler<0>().set(m_pit[1], FUNC(pit8253_device::write_clk0)); m_pit[0]->out_handler<0>().append(m_pit[0], FUNC(pit8253_device::write_gate1)); m_pit[0]->out_handler<0>().append(m_pit[0], FUNC(pit8253_device::write_gate2)); - //m_pit[0]->out_handler<1>().set(, ); // HOR RTR - //m_pit[0]->out_handler<1>().append(, ); // HOR RTR + //m_pit[0]->out_handler<1>().set(?, ?); // HOR RTR // КР580ВИ53 #2 PIT8253(config, m_pit[1], 0); - m_pit[0]->out_handler<2>().set(m_pit[1], FUNC(pit8253_device::write_clk1)); // H SYNC DSL + m_pit[0]->out_handler<2>().set(m_pit[1], FUNC(pit8253_device::write_clk1)); // HOR SYNC DSL m_pit[0]->out_handler<2>().append(m_pit[1], FUNC(pit8253_device::write_clk2)); m_pit[1]->out_handler<0>().append(m_pit[1], FUNC(pit8253_device::write_gate1)); m_pit[1]->out_handler<0>().append(m_pit[1], FUNC(pit8253_device::write_gate2)); m_pit[1]->out_handler<1>().set(m_pic, FUNC(pic8259_device::ir5_w)); // VER RTR / FRAME INT - - //m_pit[1]->out_handler<2>().append(m_pit[1], FUNC(pit8253_device::write_clk1)); // VERT SYNC DSL + //m_pit[1]->out_handler<2>().set(m_pit[1], FUNC(pit8253_device::write_clk1)); // VERT SYNC DSL //m_pit[1]->out_handler<2>().append(m_pit[1], FUNC(pit8253_device::write_clk2)); // КР580ВИ53 #3 PIT8253(config, m_pit[2], 0); - m_pit[2]->set_clk<0>(16_MHz_XTAL/13); // 1.23 MHz m_pit[2]->set_clk<1>(16_MHz_XTAL/8); // 2 MHz - m_pit[2]->set_clk<2>(16_MHz_XTAL/13); // 1.23 MHz - - //m_pit[1]->out_handler<0>().append(...); // BAUD RATE + m_pit[1]->out_handler<1>().append(m_pit[2], FUNC(pit8253_device::write_clk2)); // ~49.92 Hz + //m_pit[2]->out_handler<0>().set(?, ?); // BAUD RATE m_pit[2]->out_handler<1>().append(FUNC(juku_state::speaker_w)); // SOUND - //m_pit[1]->out_handler<2>().append(...); // SYNC BAUD RATE + //m_pit[2]->out_handler<2>().set(?, ?); // SYNC BAUD RATE // КР580ВВ55A #1 (=КР580ИК55) I8255A(config, m_pio[0]); @@ -757,13 +739,13 @@ void juku_state::juku(machine_config &config) // КР580ВВ51A I8251(config, m_sio[0], 0); - m_sio[0]->rxrdy_handler().set("pic", FUNC(pic8259_device::ir2_w)); - m_sio[0]->txrdy_handler().set("pic", FUNC(pic8259_device::ir3_w)); + m_sio[0]->rxrdy_handler().set(m_pic, FUNC(pic8259_device::ir2_w)); + m_sio[0]->txrdy_handler().set(m_pic, FUNC(pic8259_device::ir3_w)); // КР580ВВ51A (instead of FDC?) I8251(config, m_sio[1], 0); - m_sio[1]->rxrdy_handler().set("pic", FUNC(pic8259_device::ir0_w)); - m_sio[1]->txrdy_handler().set("pic", FUNC(pic8259_device::ir1_w)); + m_sio[1]->rxrdy_handler().set(m_pic, FUNC(pic8259_device::ir0_w)); + m_sio[1]->txrdy_handler().set(m_pic, FUNC(pic8259_device::ir1_w)); // Электроника МС 6105.1 "Колокольчик" (DEC VR201 analog) SCREEN(config, m_screen, SCREEN_TYPE_RASTER); @@ -778,6 +760,10 @@ void juku_state::juku(machine_config &config) // К155ИВ1 TTL74148(config, m_key_encoder, 0); + // E4701 (joystick like mouse device) + JUKU_MOUSE(config, m_mouse); + m_mouse->int_handler().set(m_pic, FUNC(pic8259_device::ir6_w)); + // КР1818ВГ93 (for E6502 disk drive) KR1818VG93(config, m_fdc, 16_MHz_XTAL/16); m_fdc->drq_wr_callback().set(FUNC(juku_state::fdc_drq_w)); @@ -796,8 +782,8 @@ ROM_START( juku ) ROM_DEFAULT_BIOS("3.43m_37") ROM_REGION(0x4000, "maincpu", 0) - // Monitor 3.3 with Bootstrap 3.3, FDC 1791 from early 1985 prototype - // Does not seem to be compatible with JBASIC extension cartridge + // Monitor 3.3 with Bootstrap 3.3, FDC 1791 from early prototypes + // Does not seem to be compatible with JBASIC expansion cartridge ROM_SYSTEM_BIOS(0, "jmon3.3", "Monitor/Bootstrap 3.3 \\w JBASIC") ROMX_LOAD("jmon33.bin", 0x0000, 0x4000, CRC(ed22c287) SHA1(76407d99bf83035ef526d980c9468cb04972608c), ROM_BIOS(0)) @@ -826,7 +812,7 @@ ROM_START( juku ) ROM_SYSTEM_BIOS(5, "2.43m_43", "Tape/Disk \\w AT keyb (2.43m #0043)") ROMX_LOAD("ekta43.bin", 0x0000, 0x4000, CRC(05678f9f) SHA1(a7419bfd8249871cc7dbf5c6ea85022d6963fc9a), ROM_BIOS(5)) - ROM_REGION(0x8000, "extension", 0) + ROM_REGION(0x8000, "expcart", 0) // EKTA JBASIC cartridge (buggy) seems similar to v1.1 from 14.09.1987. // There is also a version with additional HEX$ directive for EKDOS. diff --git a/src/mame/ussr/jukumouse.cpp b/src/mame/ussr/jukumouse.cpp new file mode 100644 index 0000000000000..441849d790085 --- /dev/null +++ b/src/mame/ussr/jukumouse.cpp @@ -0,0 +1,118 @@ +// license:BSD-3-Clause +// copyright-holders:Märt Põder + +#include "emu.h" +#include "jukumouse.h" + +//#define VERBOSE 1 +//#define LOG_OUTPUT_FUNC osd_printf_info + +#include "logmacro.h" + +// measured avg in heavy use 442-520, max ~1400Hz +static constexpr int MOUSE_RATE_HZ = 600; + +DEFINE_DEVICE_TYPE(JUKU_MOUSE, juku_mouse_device, "juku_mouse", "Juku E510x mouse") + +juku_mouse_device::juku_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, JUKU_MOUSE, tag, owner, clock), + m_mouse_x(*this, "MOUSE_X"), + m_mouse_y(*this, "MOUSE_Y"), + m_mouse_b(*this, "BUTTONS"), + m_int_handler(*this) +{ +} + +void juku_mouse_device::device_start() +{ + save_item(NAME(m_prev_mouse_y)); + save_item(NAME(m_prev_mouse_x)); + save_item(NAME(m_prev_byte)); + m_mouse_timer = timer_alloc(FUNC(juku_mouse_device::poll_delta), this); +} + +void juku_mouse_device::device_reset() +{ + m_prev_mouse_y = 0; + m_prev_mouse_x = 0; + m_prev_byte = 0; + m_mouse_timer->adjust(attotime::zero, 0, attotime::from_hz(MOUSE_RATE_HZ)); +} + +/* + * Calculate positive/negative delta from old and new relative value + */ +inline int delta(int o, int n) +{ + if (o > n) { + if (o-n < 128) return n - o; + else return n + 255 - o; + } + if (o < n) { + if (n-o < 128) return n - o; + else return n - 255 - o; + } + + return 0; +} + +TIMER_CALLBACK_MEMBER( juku_mouse_device::poll_delta ) +{ + uint8_t buttons = m_mouse_b->read(); + int x = m_mouse_x->read(), y = m_mouse_y->read(); + int dx = delta(m_prev_mouse_x, x); + int dy = delta(m_prev_mouse_y, y); + + if (dx != 0 || dy != 0 || (m_prev_byte & 0b11) != buttons) { + m_int_handler(CLEAR_LINE); + m_int_handler(ASSERT_LINE); + } +} + +static INPUT_PORTS_START( juku_mouse ) + PORT_START("MOUSE_X") + PORT_BIT(0xff, 0x00, IPT_MOUSE_X) PORT_CODE(MOUSECODE_X) PORT_SENSITIVITY(23) + + PORT_START("MOUSE_Y") + PORT_BIT(0xff, 0x00, IPT_MOUSE_Y) PORT_CODE(MOUSECODE_Y) PORT_SENSITIVITY(23) + + PORT_START("BUTTONS") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_CODE(MOUSECODE_BUTTON1) PORT_NAME("Left Button") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_CODE(MOUSECODE_BUTTON2) PORT_NAME("Right Button") +INPUT_PORTS_END + +uint8_t juku_mouse_device::mouse_port_r() +{ + // 7------- always 1 + // -6------ always 0 + // --5----- vertical active + // ---4---- vertical direction + // ----3--- horizontal active + // -----2-- horizontal direction + // ------1- left button + // -------0 right button + + uint8_t data = 0b10000000 | m_mouse_b->read(); + int x = m_mouse_x->read(), y = m_mouse_y->read(); + int dx = delta(m_prev_mouse_x, x); + int dy = delta(m_prev_mouse_y, y); + + if (dx != 0) { + data |= (dx > 0) ? 0b00001000 : 0b00001100; + m_prev_mouse_x = x; + } + + if (dy != 0) { + data |= (dy > 0) ? 0b00110000 : 0b00100000; + m_prev_mouse_y = y; + } + + m_prev_byte = data; + + return data; +} + +ioport_constructor juku_mouse_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( juku_mouse ); +} diff --git a/src/mame/ussr/jukumouse.h b/src/mame/ussr/jukumouse.h new file mode 100644 index 0000000000000..47dfa219adf3e --- /dev/null +++ b/src/mame/ussr/jukumouse.h @@ -0,0 +1,35 @@ +// license: BSD-3-Clause +// copyright-holders:Märt Põder + +#ifndef MAME_USSR_JUKUMOUSE_H +#define MAME_USSR_JUKUMOUSE_H + +#pragma once + +class juku_mouse_device : public device_t +{ +public: + juku_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + auto int_handler() { return m_int_handler.bind(); } + + uint8_t mouse_port_r(); + +protected: + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + + TIMER_CALLBACK_MEMBER( poll_delta ); + +private: + required_ioport m_mouse_x, m_mouse_y, m_mouse_b; + uint8_t m_prev_mouse_x, m_prev_mouse_y; + uint8_t m_prev_byte; + devcb_write_line m_int_handler; + emu_timer *m_mouse_timer; +}; + +DECLARE_DEVICE_TYPE(JUKU_MOUSE, juku_mouse_device) + +#endif // MAME_USSR_JUKUMOUSE_H From 87a6e9bcb05ed4921ba86ec15b4d8f6a0a5f25ec Mon Sep 17 00:00:00 2001 From: David 'Foxhack' Silva <71686027+FoxhackDN@users.noreply.github.com> Date: Sat, 18 Jan 2025 07:16:28 -0800 Subject: [PATCH 62/80] pc6001_cart.xml: Added two versions of Turpin (#13149) New working software list items (pc6001_cart.xml) ------------------------------ Turpin (1982-10-12) [Mike Stedman] Turpin (1983-01-29) [bsittler] --- hash/pc6001_cart.xml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/hash/pc6001_cart.xml b/hash/pc6001_cart.xml index 891141c39ab2f..b89796cf93208 100644 --- a/hash/pc6001_cart.xml +++ b/hash/pc6001_cart.xml @@ -31,6 +31,34 @@ license:CC0-1.0 + + + Turpin (1982-10-12) + 1982 + Konami + + + + + + + + + + + + Turpin (1983-01-29) + 1983 + Konami + + + + + + + + + Tutankham From c8926410d50b48e06c7c1c7c0725468dfc38ca92 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 19 Jan 2025 00:24:39 +0900 Subject: [PATCH 63/80] gottlieb/gottlieb.cpp: Moved sytems with LaserDisc players to a derived state class and cleaned up code. (#13211) Suppress side effects for debugger reads, use more appropriate integer types, made come variables const. reduced preprocessor macros. --- src/mame/gottlieb/gottlieb.cpp | 393 ++++++++++++++++++--------------- 1 file changed, 218 insertions(+), 175 deletions(-) diff --git a/src/mame/gottlieb/gottlieb.cpp b/src/mame/gottlieb/gottlieb.cpp index d321e44683451..6d224abf72836 100644 --- a/src/mame/gottlieb/gottlieb.cpp +++ b/src/mame/gottlieb/gottlieb.cpp @@ -84,7 +84,7 @@ Main processor (8088 minimum mode) memory mapped ports: read: -7000 Dip switch +7000 DIP switch 7001 Inputs 10-17 7002 trackball H 7003 trackball V @@ -217,18 +217,6 @@ VBlank duration: 1/VSYNC * (16/256) = 1017.6 us #define LOG_AUDIO_DECODE (0) -#define SYSTEM_CLOCK XTAL(20'000'000) -#define CPU_CLOCK XTAL(15'000'000) -#define NTSC_CLOCK XTAL(14'318'181) -#define LASERDISC_CLOCK PERIOD_OF_555_ASTABLE(16000, 10000, 0.001e-6) - -#define AUDIORAM_SIZE 0x400 - -#define GOTTLIEB_VIDEO_HCOUNT 318 -#define GOTTLIEB_VIDEO_HBLANK 256 -#define GOTTLIEB_VIDEO_VCOUNT 256 -#define GOTTLIEB_VIDEO_VBLANK 240 - namespace { class gottlieb_state : public driver_device @@ -237,7 +225,6 @@ class gottlieb_state : public driver_device gottlieb_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") - , m_laserdisc(*this, "laserdisc") , m_r1_sound(*this, "r1sound") , m_r2_sound(*this, "r2sound") , m_knocker_sample(*this, "knocker_sam") @@ -254,38 +241,42 @@ class gottlieb_state : public driver_device , m_knockers(*this, "knocker%d", 0U) { } - void gottlieb_core(machine_config &config); - void cobram3(machine_config &config); - void screwloo(machine_config &config); - void gottlieb2(machine_config &config); - void gottlieb2_ram_rom(machine_config &config); - void reactor(machine_config &config); - void g2laser(machine_config &config); - void qbert_old(machine_config &config); - void qbert(machine_config &config); - void qbert_knocker(machine_config &config); - void gottlieb1(machine_config &config); - void gottlieb1_rom(machine_config &config); - void gottlieb1_votrax_old(machine_config &config); - void gottlieb1_votrax(machine_config &config); - - void init_romtiles(); - void init_screwloo(); - void init_vidvince(); - void init_ramtiles(); - void init_stooges(); - void init_qbert(); - void init_qbertqub(); + void gottlieb_core(machine_config &config) ATTR_COLD; + void screwloo(machine_config &config) ATTR_COLD; + void gottlieb2(machine_config &config) ATTR_COLD; + void gottlieb2_ram_rom(machine_config &config) ATTR_COLD; + void reactor(machine_config &config) ATTR_COLD; + void qbert_old(machine_config &config) ATTR_COLD; + void qbert(machine_config &config) ATTR_COLD; + void qbert_knocker(machine_config &config) ATTR_COLD; + void gottlieb1(machine_config &config) ATTR_COLD; + void gottlieb1_rom(machine_config &config) ATTR_COLD; + void gottlieb1_votrax_old(machine_config &config) ATTR_COLD; + void gottlieb1_votrax(machine_config &config) ATTR_COLD; + + void init_romtiles() ATTR_COLD; + void init_screwloo() ATTR_COLD; + void init_vidvince() ATTR_COLD; + void init_ramtiles() ATTR_COLD; + void init_stooges() ATTR_COLD; + void init_qbert() ATTR_COLD; + void init_qbertqub() ATTR_COLD; template ioport_value track_delta_r(); ioport_value stooges_joystick_r(); protected: + static inline constexpr size_t AUDIORAM_SIZE = 0x400; + + static inline constexpr unsigned GOTTLIEB_VIDEO_HCOUNT = 318; + static inline constexpr unsigned GOTTLIEB_VIDEO_HBLANK = 256; + static inline constexpr unsigned GOTTLIEB_VIDEO_VCOUNT = 256; + static inline constexpr unsigned GOTTLIEB_VIDEO_VBLANK = 240; + virtual void machine_start() override ATTR_COLD; virtual void machine_reset() override ATTR_COLD; virtual void video_start() override ATTR_COLD; -private: void analog_reset_w(u8 data); void general_output_w(u8 data); void reactor_output_w(u8 data); @@ -293,28 +284,16 @@ class gottlieb_state : public driver_device void qbertqub_output_w(u8 data); void qbert_output_w(u8 data); void qbert_knocker(u8 knock); - u8 laserdisc_status_r(offs_t offset); - void laserdisc_select_w(u8 data); - void laserdisc_command_w(u8 data); void sound_w(u8 data); void palette_w(offs_t offset, u8 data); void video_control_w(u8 data); - void laserdisc_video_control_w(u8 data); void videoram_w(offs_t offset, u8 data); void charram_w(offs_t offset, u8 data); TILE_GET_INFO_MEMBER(get_bg_tile_info); TILE_GET_INFO_MEMBER(get_screwloo_bg_tile_info); DECLARE_VIDEO_START(screwloo); - uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - TIMER_CALLBACK_MEMBER(laserdisc_philips_callback); - TIMER_CALLBACK_MEMBER(laserdisc_bit_off_callback); - TIMER_CALLBACK_MEMBER(laserdisc_bit_callback); - void laserdisc_vblank(int state); + u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect); - inline void audio_end_state(); - void audio_process_clock(bool logit); - void audio_handle_zero_crossing(const attotime &zerotime, bool logit); - void laserdisc_audio_process(int samplerate, int samples, const int16_t *ch0, const int16_t *ch1); void gottlieb_base_map(address_map &map) ATTR_COLD; void gottlieb_ram_map(address_map &map) ATTR_COLD; @@ -324,7 +303,6 @@ class gottlieb_state : public driver_device // devices required_device m_maincpu; - optional_device m_laserdisc; optional_device m_r1_sound; optional_device m_r2_sound; optional_device m_knocker_sample; @@ -346,27 +324,66 @@ class gottlieb_state : public driver_device u8 m_knocker_prev = 0U; u8 m_joystick_select = 0U; u8 m_track[2]{}; + u8 m_gfxcharlo = 0U; + u8 m_gfxcharhi = 0U; + u8 m_background_priority = 0U; + u8 m_spritebank = 0U; + u8 m_transparent0 = 0U; + tilemap_t *m_bg_tilemap = nullptr; + double m_weights[4]{}; +}; + +class gottlieb_ld_state : public gottlieb_state +{ +public: + gottlieb_ld_state(const machine_config &mconfig, device_type type, const char *tag) + : gottlieb_state(mconfig, type, tag) + , m_laserdisc(*this, "laserdisc") + { } + + void cobram3(machine_config &config) ATTR_COLD; + void g2laser(machine_config &config) ATTR_COLD; + +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + +private: + static inline constexpr attotime LASERDISC_CLOCK = PERIOD_OF_555_ASTABLE(16000, 10000, 0.001e-6); + + void laserdisc_output_w(u8 data); + u8 laserdisc_status_r(offs_t offset); + void laserdisc_select_w(u8 data); + void laserdisc_command_w(u8 data); + void laserdisc_video_control_w(u8 data); + TIMER_CALLBACK_MEMBER(laserdisc_philips_callback); + TIMER_CALLBACK_MEMBER(laserdisc_bit_off_callback); + TIMER_CALLBACK_MEMBER(laserdisc_bit_callback); + void laserdisc_vblank(int state); + inline void audio_end_state(); + void audio_process_clock(bool logit); + void audio_handle_zero_crossing(const attotime &zerotime, bool logit); + void laserdisc_audio_process(int samplerate, int samples, const s16 *ch0, const s16 *ch1); + + void gottlieb_ld_ram_map(address_map &map) ATTR_COLD; + + // devices + required_device m_laserdisc; + emu_timer *m_laserdisc_bit_timer = nullptr; emu_timer *m_laserdisc_bit_off_timer = nullptr; emu_timer *m_laserdisc_philips_timer = nullptr; u8 m_laserdisc_select = 0U; u8 m_laserdisc_status = 0U; - uint16_t m_laserdisc_philips_code = 0U; + u16 m_laserdisc_philips_code = 0U; std::unique_ptr m_laserdisc_audio_buffer; - uint16_t m_laserdisc_audio_address = 0U; - int16_t m_laserdisc_last_samples[2]{}; + u16 m_laserdisc_audio_address = 0U; + s16 m_laserdisc_last_samples[2]{}; attotime m_laserdisc_last_time; attotime m_laserdisc_last_clock; u8 m_laserdisc_zero_seen = 0U; u8 m_laserdisc_audio_bits = 0U; u8 m_laserdisc_audio_bit_count = 0U; - u8 m_gfxcharlo = 0U; - u8 m_gfxcharhi = 0U; - u8 m_background_priority = 0U; - u8 m_spritebank = 0U; - u8 m_transparent0 = 0U; - tilemap_t *m_bg_tilemap = nullptr; - double m_weights[4]{}; }; @@ -389,52 +406,54 @@ void gottlieb_state::machine_start() save_item(NAME(m_gfxcharlo)); save_item(NAME(m_gfxcharhi)); save_item(NAME(m_weights)); +} - /* see if we have a laserdisc */ - if (m_laserdisc != nullptr) - { - /* attach to the I/O ports */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x05805, 0x05807, 0, 0x07f8, 0, read8sm_delegate(*this, FUNC(gottlieb_state::laserdisc_status_r))); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x05805, 0x05805, 0, 0x07f8, 0, write8smo_delegate(*this, FUNC(gottlieb_state::laserdisc_command_w))); /* command for the player */ - m_maincpu->space(AS_PROGRAM).install_write_handler(0x05806, 0x05806, 0, 0x07f8, 0, write8smo_delegate(*this, FUNC(gottlieb_state::laserdisc_select_w))); - - /* allocate a timer for serial transmission, and one for philips code processing */ - m_laserdisc_bit_timer = timer_alloc(FUNC(gottlieb_state::laserdisc_bit_callback), this); - m_laserdisc_bit_off_timer = timer_alloc(FUNC(gottlieb_state::laserdisc_bit_off_callback), this); - m_laserdisc_philips_timer = timer_alloc(FUNC(gottlieb_state::laserdisc_philips_callback), this); - - /* create some audio RAM */ - m_laserdisc_audio_buffer = std::make_unique(AUDIORAM_SIZE); - m_laserdisc_status = 0x38; - - /* more save state registration */ - save_item(NAME(m_laserdisc_select)); - save_item(NAME(m_laserdisc_status)); - save_item(NAME(m_laserdisc_philips_code)); - - save_pointer(NAME(m_laserdisc_audio_buffer), AUDIORAM_SIZE); - save_item(NAME(m_laserdisc_audio_address)); - save_item(NAME(m_laserdisc_last_samples)); - save_item(NAME(m_laserdisc_last_time)); - save_item(NAME(m_laserdisc_last_clock)); - save_item(NAME(m_laserdisc_zero_seen)); - save_item(NAME(m_laserdisc_audio_bits)); - save_item(NAME(m_laserdisc_audio_bit_count)); - } + +void gottlieb_ld_state::machine_start() +{ + gottlieb_state::machine_start(); + + /* allocate a timer for serial transmission, and one for philips code processing */ + m_laserdisc_bit_timer = timer_alloc(FUNC(gottlieb_ld_state::laserdisc_bit_callback), this); + m_laserdisc_bit_off_timer = timer_alloc(FUNC(gottlieb_ld_state::laserdisc_bit_off_callback), this); + m_laserdisc_philips_timer = timer_alloc(FUNC(gottlieb_ld_state::laserdisc_philips_callback), this); + + /* create some audio RAM */ + m_laserdisc_audio_buffer = std::make_unique(AUDIORAM_SIZE); + m_laserdisc_status = 0x38; + + /* more save state registration */ + save_item(NAME(m_laserdisc_select)); + save_item(NAME(m_laserdisc_status)); + save_item(NAME(m_laserdisc_philips_code)); + + save_pointer(NAME(m_laserdisc_audio_buffer), AUDIORAM_SIZE); + save_item(NAME(m_laserdisc_audio_address)); + save_item(NAME(m_laserdisc_last_samples)); + save_item(NAME(m_laserdisc_last_time)); + save_item(NAME(m_laserdisc_last_clock)); + save_item(NAME(m_laserdisc_zero_seen)); + save_item(NAME(m_laserdisc_audio_bits)); + save_item(NAME(m_laserdisc_audio_bit_count)); } void gottlieb_state::machine_reset() { - // if we have a laserdisc, reset our philips code callback for the next line 17 - if (m_laserdisc != nullptr) - m_laserdisc_philips_timer->adjust(m_screen->time_until_pos(17), 17); - // HACK: prevent NMI immediately after soft reset m_maincpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero); } +void gottlieb_ld_state::machine_reset() +{ + // if we have a laserdisc, reset our philips code callback for the next line 17 + m_laserdisc_philips_timer->adjust(m_screen->time_until_pos(17), 17); + + gottlieb_state::machine_reset(); +} + + void gottlieb_state::video_start() { static const int resistances[4] = { 2000, 1000, 470, 240 }; @@ -531,7 +550,7 @@ void gottlieb_state::video_control_w(u8 data) } -void gottlieb_state::laserdisc_video_control_w(u8 data) +void gottlieb_ld_state::laserdisc_video_control_w(u8 data) { /* bit 0 works like the other games */ video_control_w(BIT(data, 0)); @@ -576,7 +595,7 @@ void gottlieb_state::charram_w(offs_t offset, u8 data) TILE_GET_INFO_MEMBER(gottlieb_state::get_bg_tile_info) { - int code = m_videoram[tile_index]; + int const code = m_videoram[tile_index]; if ((code & 0x80) == 0) tileinfo.set(m_gfxcharlo, code, 0, 0); else @@ -585,7 +604,7 @@ TILE_GET_INFO_MEMBER(gottlieb_state::get_bg_tile_info) TILE_GET_INFO_MEMBER(gottlieb_state::get_screwloo_bg_tile_info) { - int code = m_videoram[tile_index]; + int const code = m_videoram[tile_index]; if ((code & 0xc0) == 0) tileinfo.set(m_gfxcharlo, code, 0, 0); else @@ -614,7 +633,7 @@ void gottlieb_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprec /* of level animation. */ int sx = (m_spriteram[offs + 1]) - 4; int sy = (m_spriteram[offs]) - 13; - int code = (255 ^ m_spriteram[offs + 2]) + 256 * m_spritebank; + int const code = (255 ^ m_spriteram[offs + 2]) + 256 * m_spritebank; if (flip_screen_x()) sx = 233 - sx; if (flip_screen_y()) sy = 228 - sy; @@ -634,7 +653,7 @@ void gottlieb_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprec * *************************************/ -uint32_t gottlieb_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 gottlieb_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { /* if the background has lower priority, render it first, else clear the screen */ if (!m_background_priority) @@ -692,13 +711,23 @@ ioport_value gottlieb_state::stooges_joystick_r() void gottlieb_state::general_output_w(u8 data) { /* bits 0-3 control video features, and are different for laserdisc games */ - if (m_laserdisc == nullptr) - video_control_w(data); - else - laserdisc_video_control_w(data); + video_control_w(data); + + /* bit 4 normally controls the coin meter */ + machine().bookkeeping().coin_counter_w(0, BIT(data, 4)); + + /* bit 5 doesn't have a generic function */ + /* bit 6 controls "COIN1"; it appears that no games used this */ + /* bit 7 controls the optional coin lockout; it appears that no games used this */ +} + +void gottlieb_ld_state::laserdisc_output_w(u8 data) +{ + /* bits 0-3 control video features, and are different for laserdisc games */ + laserdisc_video_control_w(data); /* bit 4 normally controls the coin meter */ - machine().bookkeeping().coin_counter_w(0, data & 0x10); + machine().bookkeeping().coin_counter_w(0, BIT(data, 4)); /* bit 5 doesn't have a generic function */ /* bit 6 controls "COIN1"; it appears that no games used this */ @@ -729,7 +758,7 @@ void gottlieb_state::qbertqub_output_w(u8 data) general_output_w((data >> 1 & 0x10) | (data & ~0x30)); // bit 4 controls the sprite bank - m_spritebank = (data & 0x10) >> 4; + m_spritebank = BIT(data, 4); } void gottlieb_state::stooges_output_w(u8 data) @@ -748,7 +777,7 @@ void gottlieb_state::stooges_output_w(u8 data) * *************************************/ -uint8_t gottlieb_state::laserdisc_status_r(offs_t offset) +u8 gottlieb_ld_state::laserdisc_status_r(offs_t offset) { /* IP5 reads low 8 bits of Philips code */ if (offset == 0) @@ -771,21 +800,22 @@ uint8_t gottlieb_state::laserdisc_status_r(offs_t offset) } else { - u8 result = m_laserdisc_audio_buffer[m_laserdisc_audio_address++]; - m_laserdisc_audio_address %= AUDIORAM_SIZE; + u8 const result = m_laserdisc_audio_buffer[m_laserdisc_audio_address]; + if (!machine().side_effects_disabled()) + m_laserdisc_audio_address = (m_laserdisc_audio_address + 1) % AUDIORAM_SIZE; return result; } } -void gottlieb_state::laserdisc_select_w(u8 data) +void gottlieb_ld_state::laserdisc_select_w(u8 data) { /* selects between reading audio data and reading status */ - m_laserdisc_select = data & 1; + m_laserdisc_select = BIT(data, 0); } -void gottlieb_state::laserdisc_command_w(u8 data) +void gottlieb_ld_state::laserdisc_command_w(u8 data) { /* a write here latches data into a 8-bit register and starts a sequence of events that sends serial data to the player */ @@ -805,9 +835,9 @@ void gottlieb_state::laserdisc_command_w(u8 data) * *************************************/ -TIMER_CALLBACK_MEMBER(gottlieb_state::laserdisc_philips_callback) +TIMER_CALLBACK_MEMBER(gottlieb_ld_state::laserdisc_philips_callback) { - uint32_t newcode = m_laserdisc->get_field_code((param == 17) ? LASERDISC_CODE_LINE17 : LASERDISC_CODE_LINE18, true); + u32 const newcode = m_laserdisc->get_field_code((param == 17) ? LASERDISC_CODE_LINE17 : LASERDISC_CODE_LINE18, true); /* the PR8210 sends line 17/18 data on each frame; the laserdisc interface board receives notification and latches the most recent frame number */ @@ -825,14 +855,14 @@ TIMER_CALLBACK_MEMBER(gottlieb_state::laserdisc_philips_callback) } -TIMER_CALLBACK_MEMBER(gottlieb_state::laserdisc_bit_off_callback) +TIMER_CALLBACK_MEMBER(gottlieb_ld_state::laserdisc_bit_off_callback) { /* deassert the control line */ m_laserdisc->control_w(CLEAR_LINE); } -TIMER_CALLBACK_MEMBER(gottlieb_state::laserdisc_bit_callback) +TIMER_CALLBACK_MEMBER(gottlieb_ld_state::laserdisc_bit_callback) { u8 bitsleft = param >> 16; u8 data = param; @@ -847,7 +877,7 @@ TIMER_CALLBACK_MEMBER(gottlieb_state::laserdisc_bit_callback) 555 runs at 40083Hz, is divided by 10, and then is divided by 4 for a 0 bit or 8 for a 1 bit. This gives 998usec per 0 pulse or 1996usec per 1 pulse. */ - duration = LASERDISC_CLOCK * (10 * ((data & 0x80) ? 8 : 4)); + duration = LASERDISC_CLOCK * (10 * (BIT(data, 7) ? 8 : 4)); data <<= 1; /* if we're not out of bits, set a timer for the next one; else set the ready bit */ @@ -858,7 +888,7 @@ TIMER_CALLBACK_MEMBER(gottlieb_state::laserdisc_bit_callback) } -void gottlieb_state::laserdisc_vblank(int state) +void gottlieb_ld_state::laserdisc_vblank(int state) { if (!state) return; @@ -878,7 +908,7 @@ void gottlieb_state::laserdisc_vblank(int state) * *************************************/ -inline void gottlieb_state::audio_end_state() +inline void gottlieb_ld_state::audio_end_state() { /* this occurs either when the "break in transmission" condition is hit (no zero crossings for 400usec) or when the entire audio buffer is full */ @@ -890,7 +920,7 @@ inline void gottlieb_state::audio_end_state() } -void gottlieb_state::audio_process_clock(bool logit) +void gottlieb_ld_state::audio_process_clock(bool logit) { /* clock the bit through the shift register */ m_laserdisc_audio_bits >>= 1; @@ -931,7 +961,7 @@ void gottlieb_state::audio_process_clock(bool logit) } -void gottlieb_state::audio_handle_zero_crossing(const attotime &zerotime, bool logit) +void gottlieb_ld_state::audio_handle_zero_crossing(const attotime &zerotime, bool logit) { /* compute time from last clock */ attotime deltaclock = zerotime - m_laserdisc_last_clock; @@ -978,12 +1008,11 @@ void gottlieb_state::audio_handle_zero_crossing(const attotime &zerotime, bool l } -void gottlieb_state::laserdisc_audio_process(int samplerate, int samples, const int16_t *ch0, const int16_t *ch1) +void gottlieb_ld_state::laserdisc_audio_process(int samplerate, int samples, const s16 *ch0, const s16 *ch1) { - bool logit = LOG_AUDIO_DECODE && machine().input().code_pressed(KEYCODE_L); + bool const logit = LOG_AUDIO_DECODE && machine().input().code_pressed(KEYCODE_L); attotime time_per_sample = attotime::from_hz(samplerate); attotime curtime = m_laserdisc_last_time; - int cursamp; if (logit) logerror("--------------\n"); @@ -996,9 +1025,9 @@ void gottlieb_state::laserdisc_audio_process(int samplerate, int samples, const } /* iterate over samples */ - for (cursamp = 0; cursamp < samples; cursamp++) + for (int cursamp = 0; cursamp < samples; cursamp++) { - int16_t sample = ch1[cursamp]; + s16 const sample = ch1[cursamp]; /* start by logging the current sample and time */ if (logit) @@ -1098,11 +1127,11 @@ void gottlieb_state::reactor_map(address_map &map) { map.global_mask(0xffff); map(0x0000, 0x1fff).ram(); - map(0x2000, 0x20ff).mirror(0x0f00).writeonly().share("spriteram"); /* FRSEL */ - map(0x3000, 0x33ff).mirror(0x0c00).ram().w(FUNC(gottlieb_state::videoram_w)).share("videoram"); /* BRSEL */ - map(0x4000, 0x4fff).ram().w(FUNC(gottlieb_state::charram_w)).share("charram"); /* BOJRSEL1 */ + map(0x2000, 0x20ff).mirror(0x0f00).writeonly().share(m_spriteram); /* FRSEL */ + map(0x3000, 0x33ff).mirror(0x0c00).ram().w(FUNC(gottlieb_state::videoram_w)).share(m_videoram); /* BRSEL */ + map(0x4000, 0x4fff).ram().w(FUNC(gottlieb_state::charram_w)).share(m_charram); /* BOJRSEL1 */ // map(0x5000, 0x5fff).w(FUNC(gottlieb_state::)); /* BOJRSEL2 */ - map(0x6000, 0x601f).mirror(0x0fe0).w(FUNC(gottlieb_state::palette_w)).share("paletteram"); /* COLSEL */ + map(0x6000, 0x601f).mirror(0x0fe0).w(FUNC(gottlieb_state::palette_w)).share(m_paletteram); /* COLSEL */ map(0x7000, 0x7000).mirror(0x0ff8).w("watchdog", FUNC(watchdog_timer_device::reset_w)); map(0x7001, 0x7001).mirror(0x0ff8).w(FUNC(gottlieb_state::analog_reset_w)); /* A1J2 interface */ map(0x7002, 0x7002).mirror(0x0ff8).w(FUNC(gottlieb_state::sound_w)); /* trackball H */ @@ -1120,10 +1149,10 @@ void gottlieb_state::gottlieb_base_map(address_map &map) { map.global_mask(0xffff); map(0x0000, 0x0fff).ram().share("nvram"); - map(0x3000, 0x30ff).mirror(0x0700).writeonly().share("spriteram"); /* FRSEL */ - map(0x3800, 0x3bff).mirror(0x0400).ram().w(FUNC(gottlieb_state::videoram_w)).share("videoram"); /* BRSEL */ - map(0x4000, 0x4fff).ram().w(FUNC(gottlieb_state::charram_w)).share("charram"); /* BOJRSEL1 */ - map(0x5000, 0x501f).mirror(0x07e0).w(FUNC(gottlieb_state::palette_w)).share("paletteram"); /* COLSEL */ + map(0x3000, 0x30ff).mirror(0x0700).writeonly().share(m_spriteram); /* FRSEL */ + map(0x3800, 0x3bff).mirror(0x0400).ram().w(FUNC(gottlieb_state::videoram_w)).share(m_videoram); /* BRSEL */ + map(0x4000, 0x4fff).ram().w(FUNC(gottlieb_state::charram_w)).share(m_charram); /* BOJRSEL1 */ + map(0x5000, 0x501f).mirror(0x07e0).w(FUNC(gottlieb_state::palette_w)).share(m_paletteram); /* COLSEL */ map(0x5800, 0x5800).mirror(0x07f8).w("watchdog", FUNC(watchdog_timer_device::reset_w)); map(0x5801, 0x5801).mirror(0x07f8).w(FUNC(gottlieb_state::analog_reset_w)); /* A1J2 interface */ map(0x5802, 0x5802).mirror(0x07f8).w(FUNC(gottlieb_state::sound_w)); /* OP20-27 */ @@ -1145,6 +1174,16 @@ void gottlieb_state::gottlieb_ram_map(address_map &map) map(0x1000, 0x2fff).ram(); } +void gottlieb_ld_state::gottlieb_ld_ram_map(address_map &map) +{ + gottlieb_ram_map(map); + + map(0x5803, 0x5803).mirror(0x07f8).w(FUNC(gottlieb_ld_state::laserdisc_output_w)); + map(0x5805, 0x5807).mirror(0x07f8).r(FUNC(gottlieb_ld_state::laserdisc_status_r)); + map(0x5805, 0x5805).mirror(0x07f8).w(FUNC(gottlieb_ld_state::laserdisc_command_w)); /* command for the player */ + map(0x5806, 0x5806).mirror(0x07f8).w(FUNC(gottlieb_ld_state::laserdisc_select_w)); +} + void gottlieb_state::gottlieb_ram_rom_map(address_map &map) { @@ -2088,7 +2127,7 @@ INPUT_PORTS_END /* the games can store char gfx data in either a 4k RAM area (128 chars), or */ /* a 8k ROM area (256 chars). */ -static const gfx_layout fg_layout = +static const gfx_layout spr_layout = { 16,16, RGN_FRAC(1,4), @@ -2102,7 +2141,7 @@ static const gfx_layout fg_layout = static GFXDECODE_START( gfxdecode ) GFXDECODE_RAM( "charram", 0, gfx_8x8x4_packed_msb, 0, 1 ) /* the game dynamically modifies this */ GFXDECODE_ENTRY( "bgtiles", 0, gfx_8x8x4_packed_msb, 0, 1 ) - GFXDECODE_ENTRY( "sprites", 0, fg_layout, 0, 1 ) + GFXDECODE_ENTRY( "sprites", 0, spr_layout, 0, 1 ) GFXDECODE_END @@ -2116,7 +2155,7 @@ GFXDECODE_END void gottlieb_state::gottlieb_core(machine_config &config) { /* basic machine hardware */ - I8088(config, m_maincpu, CPU_CLOCK/3); + I8088(config, m_maincpu, XTAL(15'000'000) / 3); m_maincpu->set_addrmap(AS_PROGRAM, &gottlieb_state::gottlieb_ram_map); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); @@ -2125,7 +2164,7 @@ void gottlieb_state::gottlieb_core(machine_config &config) /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_raw(SYSTEM_CLOCK/4, GOTTLIEB_VIDEO_HCOUNT, 0, GOTTLIEB_VIDEO_HBLANK, GOTTLIEB_VIDEO_VCOUNT, 0, GOTTLIEB_VIDEO_VBLANK); + m_screen->set_raw(XTAL(20'000'000) / 4, GOTTLIEB_VIDEO_HCOUNT, 0, GOTTLIEB_VIDEO_HBLANK, GOTTLIEB_VIDEO_VCOUNT, 0, GOTTLIEB_VIDEO_VBLANK); m_screen->set_screen_update(FUNC(gottlieb_state::screen_update)); m_screen->screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI); @@ -2172,14 +2211,16 @@ void gottlieb_state::gottlieb2_ram_rom(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &gottlieb_state::gottlieb_ram_rom_map); } -void gottlieb_state::g2laser(machine_config &config) +void gottlieb_ld_state::g2laser(machine_config &config) { gottlieb_core(config); + m_maincpu->set_addrmap(AS_PROGRAM, &gottlieb_ld_state::gottlieb_ld_ram_map); + GOTTLIEB_SOUND_REV2(config, m_r2_sound).add_route(ALL_OUTPUTS, "speaker", 1.0); PIONEER_PR8210(config, m_laserdisc, 0); - m_laserdisc->set_audio(FUNC(gottlieb_state::laserdisc_audio_process)); - m_laserdisc->set_overlay(GOTTLIEB_VIDEO_HCOUNT, GOTTLIEB_VIDEO_VCOUNT, FUNC(gottlieb_state::screen_update)); + m_laserdisc->set_audio(FUNC(gottlieb_ld_state::laserdisc_audio_process)); + m_laserdisc->set_overlay(GOTTLIEB_VIDEO_HCOUNT, GOTTLIEB_VIDEO_VCOUNT, FUNC(gottlieb_ld_state::screen_update)); m_laserdisc->set_overlay_clip(0, GOTTLIEB_VIDEO_HBLANK-1, 0, GOTTLIEB_VIDEO_VBLANK-8); m_laserdisc->add_route(0, "speaker", 1.0); m_laserdisc->set_screen(m_screen); @@ -2190,7 +2231,7 @@ void gottlieb_state::g2laser(machine_config &config) m_screen->set_raw(XTAL(14'318'181)*2, 910, 0, 704, 525, 44, 524); m_screen->set_screen_update("laserdisc", FUNC(laserdisc_device::screen_update)); m_screen->screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI); - m_screen->screen_vblank().append(FUNC(gottlieb_state::laserdisc_vblank)); + m_screen->screen_vblank().append(FUNC(gottlieb_ld_state::laserdisc_vblank)); } @@ -2234,15 +2275,17 @@ void gottlieb_state::screwloo(machine_config &config) MCFG_VIDEO_START_OVERRIDE(gottlieb_state,screwloo) } -void gottlieb_state::cobram3(machine_config &config) +void gottlieb_ld_state::cobram3(machine_config &config) { gottlieb_core(config); + m_maincpu->set_addrmap(AS_PROGRAM, &gottlieb_ld_state::gottlieb_ld_ram_map); + GOTTLIEB_SOUND_REV2(config, m_r2_sound).add_route(ALL_OUTPUTS, "speaker", 1.0); m_r2_sound->enable_cobram3_mods(); PIONEER_PR8210(config, m_laserdisc, 0); - m_laserdisc->set_audio(FUNC(gottlieb_state::laserdisc_audio_process)); - m_laserdisc->set_overlay(GOTTLIEB_VIDEO_HCOUNT, GOTTLIEB_VIDEO_VCOUNT, FUNC(gottlieb_state::screen_update)); + m_laserdisc->set_audio(FUNC(gottlieb_ld_state::laserdisc_audio_process)); + m_laserdisc->set_overlay(GOTTLIEB_VIDEO_HCOUNT, GOTTLIEB_VIDEO_VCOUNT, FUNC(gottlieb_ld_state::screen_update)); m_laserdisc->set_overlay_clip(0, GOTTLIEB_VIDEO_HBLANK-1, 0, GOTTLIEB_VIDEO_VBLANK-8); m_laserdisc->add_route(0, "speaker", 1.0); m_laserdisc->set_screen(m_screen); @@ -2253,7 +2296,7 @@ void gottlieb_state::cobram3(machine_config &config) m_screen->set_raw(XTAL(14'318'181)*2, 910, 0, 704, 525, 44, 524); m_screen->set_screen_update("laserdisc", FUNC(laserdisc_device::screen_update)); m_screen->screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI); - m_screen->screen_vblank().append(FUNC(gottlieb_state::laserdisc_vblank)); + m_screen->screen_vblank().append(FUNC(gottlieb_ld_state::laserdisc_vblank)); /* sound hardware */ subdevice("r2sound:dac")->reset_routes(); @@ -3023,33 +3066,33 @@ void gottlieb_state::init_vidvince() *************************************/ /* games using rev 1 sound board */ -GAME( 1982, reactor, 0, reactor, reactor, gottlieb_state, init_ramtiles, ROT0, "Gottlieb", "Reactor", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1982, qbert, 0, qbert, qbert, gottlieb_state, init_qbert, ROT270, "Gottlieb", "Q*bert (US set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1982, qberta, qbert, qbert, qbert, gottlieb_state, init_qbert, ROT270, "Gottlieb", "Q*bert (US set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1982, qbertj, qbert, qbert, qbert, gottlieb_state, init_qbert, ROT270, "Gottlieb (Konami license)", "Q*bert (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1982, myqbert, qbert, qbert, qbert, gottlieb_state, init_qbert, ROT270, "Gottlieb", "Mello Yello Q*bert", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1982, qberttst, qbert, qbert_old, qbert, gottlieb_state, init_qbert, ROT270, "Gottlieb", "Q*bert (early test version)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1982, qbtrktst, qbert, qbert, qbert, gottlieb_state, init_qbert, ROT270, "Gottlieb", "Q*bert Board Input Test Rom", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1982, insector, 0, gottlieb1, insector, gottlieb_state, init_romtiles, ROT0, "Gottlieb", "Insector (prototype)", MACHINE_SUPPORTS_SAVE ) -GAME( 1982, tylz, 0, gottlieb1_votrax, tylz, gottlieb_state, init_romtiles, ROT0, "Mylstar", "Tylz (prototype)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // modified sound hw? -GAME( 1984, argusg, 0, gottlieb1_rom, argusg, gottlieb_state, init_ramtiles, ROT0, "Gottlieb", "Argus (Gottlieb, prototype)" , MACHINE_SUPPORTS_SAVE ) // aka Guardian / Protector? -GAME( 1983, mplanets, 0, gottlieb1, mplanets, gottlieb_state, init_romtiles, ROT270, "Gottlieb", "Mad Planets", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, mplanetsuk, mplanets, gottlieb1, mplanets, gottlieb_state, init_romtiles, ROT270, "Gottlieb (Taitel license)", "Mad Planets (UK)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, krull, 0, gottlieb1_rom, krull, gottlieb_state, init_ramtiles, ROT270, "Gottlieb", "Krull", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, kngtmare, 0, gottlieb1, kngtmare, gottlieb_state, init_romtiles, ROT0, "Gottlieb", "Knightmare (prototype)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // Missing sound ROMs -GAME( 1983, sqbert, 0, qbert, qbert, gottlieb_state, init_qbert, ROT270, "Mylstar", "Faster, Harder, More Challenging Q*bert (prototype)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1983, qbertqub, 0, qbert, qbertqub, gottlieb_state, init_qbertqub, ROT270, "Mylstar", "Q*bert's Qubes", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1984, curvebal, 0, gottlieb1, curvebal, gottlieb_state, init_romtiles, ROT270, "Mylstar", "Curve Ball", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, reactor, 0, reactor, reactor, gottlieb_state, init_ramtiles, ROT0, "Gottlieb", "Reactor", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1982, qbert, 0, qbert, qbert, gottlieb_state, init_qbert, ROT270, "Gottlieb", "Q*bert (US set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1982, qberta, qbert, qbert, qbert, gottlieb_state, init_qbert, ROT270, "Gottlieb", "Q*bert (US set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1982, qbertj, qbert, qbert, qbert, gottlieb_state, init_qbert, ROT270, "Gottlieb (Konami license)", "Q*bert (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1982, myqbert, qbert, qbert, qbert, gottlieb_state, init_qbert, ROT270, "Gottlieb", "Mello Yello Q*bert", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1982, qberttst, qbert, qbert_old, qbert, gottlieb_state, init_qbert, ROT270, "Gottlieb", "Q*bert (early test version)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1982, qbtrktst, qbert, qbert, qbert, gottlieb_state, init_qbert, ROT270, "Gottlieb", "Q*bert Board Input Test Rom", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1982, insector, 0, gottlieb1, insector, gottlieb_state, init_romtiles, ROT0, "Gottlieb", "Insector (prototype)", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, tylz, 0, gottlieb1_votrax, tylz, gottlieb_state, init_romtiles, ROT0, "Mylstar", "Tylz (prototype)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // modified sound hw? +GAME( 1984, argusg, 0, gottlieb1_rom, argusg, gottlieb_state, init_ramtiles, ROT0, "Gottlieb", "Argus (Gottlieb, prototype)" , MACHINE_SUPPORTS_SAVE ) // aka Guardian / Protector? +GAME( 1983, mplanets, 0, gottlieb1, mplanets, gottlieb_state, init_romtiles, ROT270, "Gottlieb", "Mad Planets", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, mplanetsuk, mplanets, gottlieb1, mplanets, gottlieb_state, init_romtiles, ROT270, "Gottlieb (Taitel license)", "Mad Planets (UK)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, krull, 0, gottlieb1_rom, krull, gottlieb_state, init_ramtiles, ROT270, "Gottlieb", "Krull", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, kngtmare, 0, gottlieb1, kngtmare, gottlieb_state, init_romtiles, ROT0, "Gottlieb", "Knightmare (prototype)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // Missing sound ROMs +GAME( 1983, sqbert, 0, qbert, qbert, gottlieb_state, init_qbert, ROT270, "Mylstar", "Faster, Harder, More Challenging Q*bert (prototype)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1983, qbertqub, 0, qbert, qbertqub, gottlieb_state, init_qbertqub, ROT270, "Mylstar", "Q*bert's Qubes", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1984, curvebal, 0, gottlieb1, curvebal, gottlieb_state, init_romtiles, ROT270, "Mylstar", "Curve Ball", MACHINE_SUPPORTS_SAVE ) /* games using rev 2 sound board */ -GAME( 1983, screwloo, 0, screwloo, screwloo, gottlieb_state, init_screwloo, ROT0, "Mylstar", "Screw Loose (prototype)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, mach3, 0, g2laser, mach3, gottlieb_state, init_romtiles, ROT0, "Mylstar", "M.A.C.H. 3 (set 1)", 0 ) -GAME( 1983, mach3a, mach3, g2laser, mach3, gottlieb_state, init_romtiles, ROT0, "Mylstar", "M.A.C.H. 3 (set 2)", 0 ) -GAME( 1983, mach3b, mach3, g2laser, mach3, gottlieb_state, init_romtiles, ROT0, "Mylstar", "M.A.C.H. 3 (set 3)", 0 ) -GAME( 1984, cobram3, cobra, cobram3, cobram3, gottlieb_state, init_romtiles, ROT0, "Data East", "Cobra Command (M.A.C.H. 3 hardware, set 1)", 0 ) -GAME( 1984, cobram3a, cobra, cobram3, cobram3, gottlieb_state, init_romtiles, ROT0, "Data East", "Cobra Command (M.A.C.H. 3 hardware, set 2)", 0 ) -GAME( 1984, usvsthem, 0, g2laser, usvsthem, gottlieb_state, init_romtiles, ROT0, "Mylstar", "Us vs. Them", 0 ) -GAME( 1984, 3stooges, 0, gottlieb2_ram_rom, 3stooges, gottlieb_state, init_stooges, ROT0, "Mylstar", "The Three Stooges In Brides Is Brides (set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, 3stoogesa, 3stooges, gottlieb2_ram_rom, 3stooges, gottlieb_state, init_stooges, ROT0, "Mylstar", "The Three Stooges In Brides Is Brides (set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, vidvince, 0, gottlieb2_ram_rom, vidvince, gottlieb_state, init_vidvince, ROT0, "Mylstar", "Video Vince and the Game Factory (prototype)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // sprite wrapping issues -GAME( 1984, wizwarz, 0, gottlieb2, wizwarz, gottlieb_state, init_romtiles, ROT0, "Mylstar", "Wiz Warz (prototype)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, screwloo, 0, screwloo, screwloo, gottlieb_state, init_screwloo, ROT0, "Mylstar", "Screw Loose (prototype)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, mach3, 0, g2laser, mach3, gottlieb_ld_state, init_romtiles, ROT0, "Mylstar", "M.A.C.H. 3 (set 1)", 0 ) +GAME( 1983, mach3a, mach3, g2laser, mach3, gottlieb_ld_state, init_romtiles, ROT0, "Mylstar", "M.A.C.H. 3 (set 2)", 0 ) +GAME( 1983, mach3b, mach3, g2laser, mach3, gottlieb_ld_state, init_romtiles, ROT0, "Mylstar", "M.A.C.H. 3 (set 3)", 0 ) +GAME( 1984, cobram3, cobra, cobram3, cobram3, gottlieb_ld_state, init_romtiles, ROT0, "Data East", "Cobra Command (M.A.C.H. 3 hardware, set 1)", 0 ) +GAME( 1984, cobram3a, cobra, cobram3, cobram3, gottlieb_ld_state, init_romtiles, ROT0, "Data East", "Cobra Command (M.A.C.H. 3 hardware, set 2)", 0 ) +GAME( 1984, usvsthem, 0, g2laser, usvsthem, gottlieb_ld_state, init_romtiles, ROT0, "Mylstar", "Us vs. Them", 0 ) +GAME( 1984, 3stooges, 0, gottlieb2_ram_rom, 3stooges, gottlieb_state, init_stooges, ROT0, "Mylstar", "The Three Stooges In Brides Is Brides (set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, 3stoogesa, 3stooges, gottlieb2_ram_rom, 3stooges, gottlieb_state, init_stooges, ROT0, "Mylstar", "The Three Stooges In Brides Is Brides (set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, vidvince, 0, gottlieb2_ram_rom, vidvince, gottlieb_state, init_vidvince, ROT0, "Mylstar", "Video Vince and the Game Factory (prototype)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // sprite wrapping issues +GAME( 1984, wizwarz, 0, gottlieb2, wizwarz, gottlieb_state, init_romtiles, ROT0, "Mylstar", "Wiz Warz (prototype)", MACHINE_SUPPORTS_SAVE ) From c5c18833c896afedb52ab9e79a85dfe1dad1a99b Mon Sep 17 00:00:00 2001 From: Vincent-Halver Date: Sat, 18 Jan 2025 08:24:07 -0800 Subject: [PATCH 64/80] philips/mcd212.cpp: Fixed CD-i DYUV color format decoding. (#13127) * The DYUV format incorrectly was too dark by 16/256. This corrects a previously incorrect attempt to fix that issue. * The DYUV format does not allow Mosaic features. * The Transparency flag was left-shifted incorrectly. --- src/mame/philips/mcd212.cpp | 58 +++++++++---------------------------- src/mame/philips/mcd212.h | 4 +-- 2 files changed, 15 insertions(+), 47 deletions(-) diff --git a/src/mame/philips/mcd212.cpp b/src/mame/philips/mcd212.cpp index 441d4a39f2004..29f041e7a5a58 100644 --- a/src/mame/philips/mcd212.cpp +++ b/src/mame/philips/mcd212.cpp @@ -661,9 +661,9 @@ void mcd212_device::process_vsr(uint32_t *pixels, bool *transparent) const uint8_t mosaic_factor = get_mosaic_factor(); const uint32_t dyuv_abs_start = m_dyuv_abs_start[Channel]; - const uint8_t start_y = (dyuv_abs_start >> 16) & 0x000000ff; - const uint8_t start_u = (dyuv_abs_start >> 8) & 0x000000ff; - const uint8_t start_v = (dyuv_abs_start >> 0) & 0x000000ff; + uint8_t y = (dyuv_abs_start >> 16) & 0x000000ff; + uint8_t u = (dyuv_abs_start >> 8) & 0x000000ff; + uint8_t v = (dyuv_abs_start >> 0) & 0x000000ff; const uint32_t transparent_color = m_transparent_color[Channel]; const uint8_t transp_ctrl_masked = transp_ctrl & 0x07; @@ -707,9 +707,6 @@ void mcd212_device::process_vsr(uint32_t *pixels, bool *transparent) use_color_key = false; LOGMASKED(LOG_VSR, "Scanline %d: Chan %d: DYUV\n", screen().vpos(), Channel); - uint8_t y = start_y; - uint8_t u = start_u; - uint8_t v = start_v; for (; x < width; x++) { const uint8_t byte1 = data[(vsr++ & 0x0007ffff) ^ 1]; @@ -719,49 +716,24 @@ void mcd212_device::process_vsr(uint32_t *pixels, bool *transparent) const uint8_t v1 = v + m_delta_uv_lut[byte1]; const uint8_t y1 = y0 + m_delta_y_lut[byte1]; - const uint8_t u0 = (u + u1) >> 1; - const uint8_t v0 = (v + v1) >> 1; + // Midpoint Interpolation prevents rollover, against spec. + const uint8_t u0 = (u >> 1) + (u1 >> 1) + (u & u1 & 1); + const uint8_t v0 = (v >> 1) + (v1 >> 1) + (v & v1 & 1); - uint32_t *limit_r = m_dyuv_limit_r_lut + y0 + 0xff; - uint32_t *limit_g = m_dyuv_limit_g_lut + y0 + 0xff; - uint32_t *limit_b = m_dyuv_limit_b_lut + y0 + 0xff; + uint32_t* limit_rgb = m_dyuv_limit_rgb_lut + y0 + 0x100; - uint32_t entry = limit_r[m_dyuv_v_to_r[v0]] | limit_g[m_dyuv_u_to_g[u0] + m_dyuv_v_to_g[v0]] | limit_b[m_dyuv_u_to_b[u0]]; + uint32_t entry = (limit_rgb[m_dyuv_v_to_r[v0]] << 16) | (limit_rgb[m_dyuv_u_to_g[u0] + m_dyuv_v_to_g[v0]] << 8) | limit_rgb[m_dyuv_u_to_b[u0]]; pixels[x] = entry; transparent[x] = (transp_always || (use_region_flag && region_flags[x << 1])) != invert_transp_condition; - if (mosaic_enable) - { - for (int mosaic_index = 1; mosaic_index < mosaic_factor && (x + mosaic_index) < width; mosaic_index++) - { - pixels[x + mosaic_index] = pixels[x]; - transparent[x + mosaic_index] = transparent[x << 1]; - } - x += mosaic_factor; - } - else - { - x++; - } + x++; - limit_r = m_dyuv_limit_r_lut + y1 + 0xff; - limit_g = m_dyuv_limit_g_lut + y1 + 0xff; - limit_b = m_dyuv_limit_b_lut + y1 + 0xff; + limit_rgb = m_dyuv_limit_rgb_lut + y1 + 0x100; - entry = limit_r[m_dyuv_v_to_r[v1]] | limit_g[m_dyuv_u_to_g[u1] + m_dyuv_v_to_g[v1]] | limit_b[m_dyuv_u_to_b[u1]]; + entry = (limit_rgb[m_dyuv_v_to_r[v1]] << 16) | (limit_rgb[m_dyuv_u_to_g[u1] + m_dyuv_v_to_g[v1]] << 8) | limit_rgb[m_dyuv_u_to_b[u1]]; pixels[x] = entry; transparent[x] = (transp_always || (use_region_flag && region_flags[x << 1])) != invert_transp_condition; - if (mosaic_enable) - { - for (int mosaic_index = 1; mosaic_index < mosaic_factor && (x + mosaic_index) < width; mosaic_index++) - { - pixels[x + mosaic_index] = pixels[x]; - transparent[x + mosaic_index] = transparent[x]; - } - x += mosaic_factor - 1; - } - byte = data[(vsr++ & 0x0007ffff) ^ 1]; y = y1; @@ -1434,12 +1406,10 @@ void mcd212_device::device_start() m_delta_uv_lut[d] = s_dyuv_deltas[d >> 4]; } - for (uint16_t w = 0; w < 3 * 0xff; w++) + for (uint16_t w = 0; w < 0x300; w++) { - const uint8_t limit = (w < 0xff + 16) ? 0 : w <= 16 + 2 * 0xff ? w - 0x10f : 0xff; - m_dyuv_limit_r_lut[w] = limit << 16; - m_dyuv_limit_g_lut[w] = limit << 8; - m_dyuv_limit_b_lut[w] = limit; + const uint8_t limit = (w < 0x100) ? 0 : (w < 0x200) ? (w - 0x100) : 0xff; + m_dyuv_limit_rgb_lut[w] = limit; } for (int16_t sw = 0; sw < 0x100; sw++) diff --git a/src/mame/philips/mcd212.h b/src/mame/philips/mcd212.h index fbb385cb0cc61..2b2a5047bef25 100644 --- a/src/mame/philips/mcd212.h +++ b/src/mame/philips/mcd212.h @@ -202,9 +202,7 @@ class mcd212_device : public device_t, uint8_t m_weight_factor[2][768]{}; // DYUV color limit arrays. - uint32_t m_dyuv_limit_r_lut[3 * 0xff]; - uint32_t m_dyuv_limit_g_lut[3 * 0xff]; - uint32_t m_dyuv_limit_b_lut[3 * 0xff]; + uint32_t m_dyuv_limit_rgb_lut[0x300]; // DYUV delta-Y decoding array uint8_t m_delta_y_lut[0x100]; From 819cbbf5993449cac5d56a25d45e1703259d344f Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 19 Jan 2025 01:30:45 +0900 Subject: [PATCH 65/80] cpu/mcs51/mcs51.cpp: Implemented PES bit for DS5002FP. (#13224) PES bit is peripheral enable select on bytewide bus. --- src/devices/cpu/mcs51/mcs51.cpp | 14 +++++++++++--- src/devices/cpu/mcs51/mcs51.h | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/devices/cpu/mcs51/mcs51.cpp b/src/devices/cpu/mcs51/mcs51.cpp index ef6703c3db160..7a9b94efea7d0 100644 --- a/src/devices/cpu/mcs51/mcs51.cpp +++ b/src/devices/cpu/mcs51/mcs51.cpp @@ -296,7 +296,7 @@ mcs51_cpu_device::mcs51_cpu_device(const machine_config &mconfig, device_type ty : cpu_device(mconfig, type, tag, owner, clock) , m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0, program_map) , m_data_config("data", ENDIANNESS_LITTLE, 8, 9, 0, data_map) - , m_io_config("io", ENDIANNESS_LITTLE, 8, (features & FEATURE_DS5002FP) ? 17 : 16, 0) + , m_io_config("io", ENDIANNESS_LITTLE, 8, (features & FEATURE_DS5002FP) ? 18 : 16, 0) , m_pc(0) , m_features(features) , m_rom_size(program_width > 0 ? 1 << program_width : 0) @@ -871,12 +871,18 @@ uint8_t mcs51_cpu_device::r_psw() { return SFR_A(ADDR_PSW); } In order to simplify memory mapping to the data address bus, the following address map is assumed for partitioned mode: + PES = 0: 0x00000-0x0ffff -> data memory on the expanded bus 0x10000-0x1ffff -> data memory on the byte-wide bus + PES = 1: + 0x20000-0x2ffff -> memory-mapped peripherals on the byte-wide bus For non-partitioned mode the following memory map is assumed: - 0x0000-0xffff -> data memory (the bus used to access it does not matter) + PES = 0: + 0x00000-0x0ffff -> data memory (the bus used to access it does not matter) + PES = 1: + 0x20000-0x2ffff -> memory-mapped peripherals on the byte-wide bus */ offs_t mcs51_cpu_device::external_ram_iaddr(offs_t offset, offs_t mem_mask) @@ -891,7 +897,9 @@ offs_t mcs51_cpu_device::external_ram_iaddr(offs_t offset, offs_t mem_mask) /* if partition mode is set, adjust offset based on the bus */ if (m_features & FEATURE_DS5002FP) { - if (!GET_PM) { + if (GET_PES) { + offset += 0x20000; + } else if (!GET_PM) { if (!GET_EXBS) { if ((offset >= ds5002fp_partitions[GET_PA]) && (offset <= ds5002fp_ranges[m_ds5002fp.range])) { offset += 0x10000; diff --git a/src/devices/cpu/mcs51/mcs51.h b/src/devices/cpu/mcs51/mcs51.h index 62db45e4a3807..7d52a11dce4f6 100644 --- a/src/devices/cpu/mcs51/mcs51.h +++ b/src/devices/cpu/mcs51/mcs51.h @@ -153,7 +153,7 @@ class mcs51_cpu_device : public cpu_device // Memory spaces memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_program; memory_access< 9, 0, 0, ENDIANNESS_LITTLE>::specific m_data; - memory_access<17, 0, 0, ENDIANNESS_LITTLE>::specific m_io; + memory_access<18, 0, 0, ENDIANNESS_LITTLE>::specific m_io; devcb_read8::array<4> m_port_in_cb; devcb_write8::array<4> m_port_out_cb; From 4b5a54fb4beb20b64c3be817d2e1f124aab9eab2 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 18 Jan 2025 18:11:10 +0100 Subject: [PATCH 66/80] micro3d: correct mcu type, re-add underclock hack, it was still crashing, just not specifically at the last stage, mcs51: add some todo notes --- src/devices/cpu/mcs51/mcs51.cpp | 11 +++--- src/mame/misc/micro3d.cpp | 2 +- src/mame/misc/micro3d.h | 2 +- src/mame/misc/micro3d_m.cpp | 59 ++++++++++++++++----------------- 4 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/devices/cpu/mcs51/mcs51.cpp b/src/devices/cpu/mcs51/mcs51.cpp index 7a9b94efea7d0..ee5420330594e 100644 --- a/src/devices/cpu/mcs51/mcs51.cpp +++ b/src/devices/cpu/mcs51/mcs51.cpp @@ -300,7 +300,7 @@ mcs51_cpu_device::mcs51_cpu_device(const machine_config &mconfig, device_type ty , m_pc(0) , m_features(features) , m_rom_size(program_width > 0 ? 1 << program_width : 0) - , m_ram_mask( (data_width == 8) ? 0xFF : 0x7F ) + , m_ram_mask( (data_width == 8) ? 0xff : 0x7f ) , m_num_interrupts(5) , m_sfr_ram(*this, "sfr_ram") , m_scratchpad(*this, "scratchpad") @@ -1296,7 +1296,7 @@ void mcs51_cpu_device::update_timer_t0(int cycles) if ( count & 0xffffe000 ) /* Check for overflow */ SET_TF0(1); TH0 = (count>>5) & 0xff; - TL0 = count & 0x1f ; + TL0 = count & 0x1f; break; case 1: /* 16 Bit Timer Mode */ count = ((TH0<<8) | TL0); @@ -1385,7 +1385,7 @@ void mcs51_cpu_device::update_timer_t1(int cycles) count += delta; overflow = count & 0xffffe000; /* Check for overflow */ TH1 = (count>>5) & 0xff; - TL1 = count & 0x1f ; + TL1 = count & 0x1f; break; case 1: /* 16 Bit Timer Mode */ count = ((TH1<<8) | TL1); @@ -1429,7 +1429,7 @@ void mcs51_cpu_device::update_timer_t1(int cycles) count += delta; overflow = count & 0xffffe000; /* Check for overflow */ TH1 = (count>>5) & 0xff; - TL1 = count & 0x1f ; + TL1 = count & 0x1f; break; case 1: /* 16 Bit Timer Mode */ count = ((TH1<<8) | TL1); @@ -2043,6 +2043,7 @@ void mcs51_cpu_device::check_irqs() void mcs51_cpu_device::burn_cycles(int cycles) { + // TODO: adjust icount one by one here, to get more accurate serial timing? /* Update Timer (if any timers are running) */ update_timers(cycles); @@ -2209,6 +2210,7 @@ void mcs51_cpu_device::execute_run() if ((m_features & FEATURE_CMOS) && GET_PD) return; + // TODO: readjust icount/redo burn_cycles for check_irqs incrementing m_inst_cycles burn_cycles(m_inst_cycles); /* decrement the timed access window */ @@ -2603,7 +2605,6 @@ uint8_t i80c52_device::sfr_read(size_t offset) * DS5002FP Section ****************************************************************************/ - #define DS5_LOGW(a, d) LOG("write to " # a " register at 0x%04x, data=%x\n", PC, d) #define DS5_LOGR(a, d) LOG("read from " # a " register at 0x%04x\n", PC) diff --git a/src/mame/misc/micro3d.cpp b/src/mame/misc/micro3d.cpp index 08ffc24b49b9f..5759ca49830c2 100644 --- a/src/mame/misc/micro3d.cpp +++ b/src/mame/misc/micro3d.cpp @@ -330,7 +330,7 @@ void micro3d_state::micro3d(machine_config &config) scc8530_device &scc(SCC8530(config, "scc", 32_MHz_XTAL / 2 / 2)); scc.out_txdb_callback().set("monitor_drmath", FUNC(rs232_port_device::write_txd)); - I8051(config, m_audiocpu, 11.0592_MHz_XTAL); + I80C31(config, m_audiocpu, 11.0592_MHz_XTAL); m_audiocpu->set_addrmap(AS_PROGRAM, µ3d_state::soundmem_prg); m_audiocpu->set_addrmap(AS_IO, µ3d_state::soundmem_io); m_audiocpu->port_in_cb<1>().set(FUNC(micro3d_state::sound_p1_r)); diff --git a/src/mame/misc/micro3d.h b/src/mame/misc/micro3d.h index 1e32da2e09cad..b4fdaf4cecde1 100644 --- a/src/mame/misc/micro3d.h +++ b/src/mame/misc/micro3d.h @@ -85,7 +85,7 @@ class micro3d_state : public driver_device }; required_device m_maincpu; - required_device m_audiocpu; + required_device m_audiocpu; required_device m_upd7759; required_device m_drmath; required_device m_vgb; diff --git a/src/mame/misc/micro3d_m.cpp b/src/mame/misc/micro3d_m.cpp index e97fa8fcb9d7e..51a38743f362e 100644 --- a/src/mame/misc/micro3d_m.cpp +++ b/src/mame/misc/micro3d_m.cpp @@ -54,7 +54,7 @@ uint8_t micro3d_state::duart_input_r() } /* - * 5: /I8051 reset + * 5: /I80C31 reset * 7: Status LED */ void micro3d_state::duart_output_w(uint8_t data) @@ -94,6 +94,27 @@ void micro3d_state::vgb_uart_w(offs_t offset, uint8_t data) * *************************************/ +void micro3d_state::shared_w(offs_t offset, uint32_t data) +{ + m_shared_ram[offset * 2 + 1] = data & 0xffff; + m_shared_ram[offset * 2 + 0] = data >> 16; +} + +uint32_t micro3d_state::shared_r(offs_t offset) +{ + return (m_shared_ram[offset * 2] << 16) | m_shared_ram[offset * 2 + 1]; +} + +void micro3d_state::drmath_int_w(uint32_t data) +{ + m_maincpu->set_input_line(5, HOLD_LINE); +} + +void micro3d_state::drmath_intr2_ack(uint32_t data) +{ + m_drmath->set_input_line(AM29000_INTR2, CLEAR_LINE); +} + inline constexpr int64_t micro3d_state::micro3d_vtx::dot_product(micro3d_vtx const &that) const { return @@ -351,6 +372,7 @@ uint16_t micro3d_state::botss_180000_r() return 0xffff; } + /************************************* * * CPU control @@ -371,37 +393,9 @@ void micro3d_state::host_drmath_int_w(uint16_t data) } -/************************************* - * - * - * - *************************************/ - -void micro3d_state::shared_w(offs_t offset, uint32_t data) -{ - m_shared_ram[offset * 2 + 1] = data & 0xffff; - m_shared_ram[offset * 2 + 0] = data >> 16; -} - -uint32_t micro3d_state::shared_r(offs_t offset) -{ - return (m_shared_ram[offset * 2] << 16) | m_shared_ram[offset * 2 + 1]; -} - -void micro3d_state::drmath_int_w(uint32_t data) -{ - m_maincpu->set_input_line(5, HOLD_LINE); -} - -void micro3d_state::drmath_intr2_ack(uint32_t data) -{ - m_drmath->set_input_line(AM29000_INTR2, CLEAR_LINE); -} - - /*************************************************************************** - 8051 port mappings: + 80C31 port mappings: Port 1 Port 3 ======= ====== @@ -475,6 +469,11 @@ void micro3d_state::init_micro3d() /* The Am29000 program seems to rely on RAM from 0x00470000 onwards being non-zero on a reset, otherwise the 3D object data doesn't get uploaded! */ space.write_dword(0x00470000, 0xa5a5a5a5); + + /* TODO? BOTSS sometimes crashes when starting a stage because the 68000 + overwrites memory in use by the Am29000. Slowing down the 68000 slightly + avoids this. */ + m_maincpu->set_clock_scale(0.945f); } void micro3d_state::init_botss() From 713f9064785386c9da112e7d42caf4253e318a16 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Sat, 18 Jan 2025 19:29:22 +0100 Subject: [PATCH 67/80] ICP-1 Roulette: Added instructions for setting the password and booting the game with it. --- src/mame/misc/goldnpkr.cpp | 39 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/mame/misc/goldnpkr.cpp b/src/mame/misc/goldnpkr.cpp index f94285de416e5..73d71869428df 100644 --- a/src/mame/misc/goldnpkr.cpp +++ b/src/mame/misc/goldnpkr.cpp @@ -559,6 +559,45 @@ The game needs ~25 seconds to check all the things to start. + * Roulette (ICP-1 PCB) + + This game runs on ICP-1 platform, consisting of a 6502 CPU, two 6821 PIAs for I/O, + a 6845 CRTC for video, and discrete electronics for sound. The game features robust + protection through NVRAM registers and a password-like input sequence, which can be + configured and is requested upon each reboot. The password consists of 5 inputs, + with repetitions allowed. The password length is fixed. + + Password Configuration and Booting Instructions... + + - How to Set the Password: + + 1) Press and hold the PROGRAM key (key 9) while turning on or resetting the machine. + (The word 'TESTING' will be displayed on the screen) + 2) Enter the first desired input of the password, then press DOWN to confirm the choice. + 3) Enter the second desired input of the password, then press DOWN to confirm the choice. + 4) Enter the third desired input of the password, then press DOWN to confirm the choice. + 5) Enter the fourth desired input of the password, then press DOWN to confirm the choice. + 6) Enter the fifth desired input of the password, then press DOWN to confirm the choice. + + Note: Each input entered will be displayed on the screen. + + + - How to Boot with Password: + + 1) Press the CREDITS key (key 5) once. + 2) Enter the first input of the password, then press DOWN to confirm the choice. + 3) Enter the second input of the password, then press DOWN to confirm the choice. + 4) Enter the third input of the password, then press DOWN to confirm the choice. + 5) Enter the fourth input of the password, then press DOWN to confirm the choice. + 6) Enter the fifth input of the password, then press DOWN to confirm the choice. + + + The default NVRAM has a pre-set password (all BUTTON1). To boot the game with the + default password, enter the following sequence: + + 5 -> CTRL -> DOWN -> CTRL -> DOWN -> CTRL -> DOWN -> CTRL -> DOWN -> CTRL -> DOWN + + ************************************************************************************ From 1bac2c13f2dd17b8d84ba7715fc2a0264d271073 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 18 Jan 2025 19:37:40 +0100 Subject: [PATCH 68/80] dec8: make number of rombanks power-of-2 --- src/mame/dataeast/dec8.cpp | 384 ++++++++++++++++++++++--------------- src/mame/dataeast/dec8.h | 3 +- 2 files changed, 229 insertions(+), 158 deletions(-) diff --git a/src/mame/dataeast/dec8.cpp b/src/mame/dataeast/dec8.cpp index 22109ebfb1d1a..7c383f1804a86 100644 --- a/src/mame/dataeast/dec8.cpp +++ b/src/mame/dataeast/dec8.cpp @@ -165,7 +165,7 @@ void ghostb_state::gondo_i8751_hi_w(u8 data) void oscar_state::bank_w(u8 data) { - m_mainbank->set_entry(data & 0x0f); + m_mainbank->set_entry(data & m_bank_mask); } // Used by Ghostbusters, Meikyuu Hunter G & Gondomania @@ -177,7 +177,7 @@ void ghostb_state::ghostb_bank_w(u8 data) Bit 3: Screen flip Bits 4-7: Bank switch */ - m_mainbank->set_entry(data >> 4); + m_mainbank->set_entry(data >> 4 & m_bank_mask); m_secclr = BIT(data, 0); if (!m_secclr) @@ -205,7 +205,7 @@ void csilver_state::control_w(u8 data) Bit 0x40 - Unused. Bit 0x80 - Hold subcpu reset line high if clear, else low? (Not needed anyway) */ - m_mainbank->set_entry(data & 0x0f); + m_mainbank->set_entry(data & m_bank_mask); } void ghostb_state::sound_w(u8 data) @@ -1873,9 +1873,10 @@ void lastmisn_state::shackled_coin_irq(int state) void dec8_state_base::machine_start() { - u8 *ROM = memregion("maincpu")->base(); - u32 max_bank = (memregion("maincpu")->bytes() - 0x10000) / 0x4000; - m_mainbank->configure_entries(0, max_bank, &ROM[0x10000], 0x4000); + u8 *ROM = memregion("mainbank")->base(); + u8 max_bank = memregion("mainbank")->bytes() / 0x4000; + m_mainbank->configure_entries(0, max_bank, &ROM[0], 0x4000); + m_bank_mask = (max_bank - 1) & 0xf; save_item(NAME(m_coin_state)); save_item(NAME(m_scroll)); @@ -2513,123 +2514,131 @@ void oscar_state::cobracom(machine_config &config) /******************************************************************************/ ROM_START( lastmisn ) - ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "last_mission_dl03-8.13h", 0x08000, 0x08000, CRC(a4f8d54b) SHA1(4525826fa5d12c22e0f3bc1c3a9673b86a34aad1) ) // Rev 8 roms - ROM_LOAD( "last_mission_dl04-5.7h", 0x10000, 0x10000, CRC(7dea1552) SHA1(920684413e2ba4313111e79821c5714977b26b1a) ) + + ROM_REGION( 0x10000, "mainbank", 0 ) + ROM_LOAD( "last_mission_dl04-5.7h", 0x00000, 0x10000, CRC(7dea1552) SHA1(920684413e2ba4313111e79821c5714977b26b1a) ) ROM_REGION( 0x10000, "sub", 0 ) // CPU 2, 1st 16k is empty ROM_LOAD( "last_mission_dl02-5.18h", 0x0000, 0x10000, CRC(ec9b5daf) SHA1(86d47bad123676abc82dd7c92943878c54c33075) ) ROM_REGION( 0x10000, "audiocpu", 0 ) - ROM_LOAD( "last_mission_dl05-.5h", 0x8000, 0x8000, CRC(1a5df8c0) SHA1(83d36b1d5fb87f50c44f3110804d6bbdbbc0da99) ) + ROM_LOAD( "last_mission_dl05-.5h", 0x8000, 0x8000, CRC(1a5df8c0) SHA1(83d36b1d5fb87f50c44f3110804d6bbdbbc0da99) ) ROM_REGION( 0x1000, "mcu", 0 ) // i8751 microcontroller ROM_LOAD( "last_mission_dl00-e.18a", 0x0000, 0x1000, CRC(e97481c6) SHA1(5c6b0e3585712c03b1b657c814c502c396ffa333) BAD_DUMP ) // not verified to be the same data as the "A" MCU dump ROM_REGION( 0x08000, "char", 0 ) - ROM_LOAD( "last_mission_dl01-.2a", 0x00000, 0x2000, CRC(f3787a5d) SHA1(3701df42cb2aca951963703e72c6c7b272eed82b) ) - ROM_CONTINUE( 0x06000, 0x2000 ) - ROM_CONTINUE( 0x04000, 0x2000 ) - ROM_CONTINUE( 0x02000, 0x2000 ) + ROM_LOAD( "last_mission_dl01-.2a", 0x00000, 0x2000, CRC(f3787a5d) SHA1(3701df42cb2aca951963703e72c6c7b272eed82b) ) + ROM_CONTINUE( 0x06000, 0x2000 ) + ROM_CONTINUE( 0x04000, 0x2000 ) + ROM_CONTINUE( 0x02000, 0x2000 ) ROM_REGION( 0x80000, "sprites", 0 ) - ROM_LOAD( "last_mission_dl11-.13f", 0x00000, 0x08000, CRC(36579d3b) SHA1(8edf952dafcd5bc66e08074687f0bec809fd4c2f) ) - ROM_LOAD( "last_mission_dl12-.9f", 0x20000, 0x08000, CRC(2ba6737e) SHA1(c5e4c27726bf14e9cd60d62e2f17ea5be8093c37) ) - ROM_LOAD( "last_mission_dl13-.8f", 0x40000, 0x08000, CRC(39a7dc93) SHA1(3b7968fd06ac0379525c1d3e73f8bbe18ea36439) ) - ROM_LOAD( "last_mission_dl10-.16f", 0x60000, 0x08000, CRC(fe275ea8) SHA1(2f089f96583235f1f5226ef2a64b430d84efbeee) ) + ROM_LOAD( "last_mission_dl11-.13f", 0x00000, 0x08000, CRC(36579d3b) SHA1(8edf952dafcd5bc66e08074687f0bec809fd4c2f) ) + ROM_LOAD( "last_mission_dl12-.9f", 0x20000, 0x08000, CRC(2ba6737e) SHA1(c5e4c27726bf14e9cd60d62e2f17ea5be8093c37) ) + ROM_LOAD( "last_mission_dl13-.8f", 0x40000, 0x08000, CRC(39a7dc93) SHA1(3b7968fd06ac0379525c1d3e73f8bbe18ea36439) ) + ROM_LOAD( "last_mission_dl10-.16f", 0x60000, 0x08000, CRC(fe275ea8) SHA1(2f089f96583235f1f5226ef2a64b430d84efbeee) ) ROM_REGION( 0x80000, "tiles1", 0 ) - ROM_LOAD( "last_mission_dl09-.12k", 0x00000, 0x10000, CRC(6a5a0c5d) SHA1(0106cf693c284be5faf96e56b651fab92a410915) ) - ROM_LOAD( "last_mission_dl08-.14k", 0x20000, 0x10000, CRC(3b38cfce) SHA1(d6829bed6916fb301c08031bd466ee4dcc05b275) ) - ROM_LOAD( "last_mission_dl07-.15k", 0x40000, 0x10000, CRC(1b60604d) SHA1(1ee15cfdac87f7eeb92050766293b894cfad1466) ) - ROM_LOAD( "last_mission_dl06-.17k", 0x60000, 0x10000, CRC(c43c26a7) SHA1(896e278935b100edc12cd970469f2e8293eb96cc) ) + ROM_LOAD( "last_mission_dl09-.12k", 0x00000, 0x10000, CRC(6a5a0c5d) SHA1(0106cf693c284be5faf96e56b651fab92a410915) ) + ROM_LOAD( "last_mission_dl08-.14k", 0x20000, 0x10000, CRC(3b38cfce) SHA1(d6829bed6916fb301c08031bd466ee4dcc05b275) ) + ROM_LOAD( "last_mission_dl07-.15k", 0x40000, 0x10000, CRC(1b60604d) SHA1(1ee15cfdac87f7eeb92050766293b894cfad1466) ) + ROM_LOAD( "last_mission_dl06-.17k", 0x60000, 0x10000, CRC(c43c26a7) SHA1(896e278935b100edc12cd970469f2e8293eb96cc) ) ROM_REGION( 0x0100, "proms", 0 ) ROM_LOAD( "dl-14.9c", 0x0000, 0x0100, CRC(2e55aa12) SHA1(c0f2b9649467eb9d2c1e47589b5990f5c5e8cc93) ) // Priority (Not yet used) ROM_END ROM_START( lastmisnu6 ) - ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "last_mission_dl03-6.13h", 0x08000, 0x08000, CRC(47751a5e) SHA1(190970a6eb849781e8853f2bed7b34ac44e569ca) ) // Rev 6 roms - ROM_LOAD( "last_mission_dl04-5.7h", 0x10000, 0x10000, CRC(7dea1552) SHA1(920684413e2ba4313111e79821c5714977b26b1a) ) + + ROM_REGION( 0x10000, "mainbank", 0 ) + ROM_LOAD( "last_mission_dl04-5.7h", 0x00000, 0x10000, CRC(7dea1552) SHA1(920684413e2ba4313111e79821c5714977b26b1a) ) ROM_REGION( 0x10000, "sub", 0 ) // CPU 2, 1st 16k is empty ROM_LOAD( "last_mission_dl02-5.18h", 0x0000, 0x10000, CRC(ec9b5daf) SHA1(86d47bad123676abc82dd7c92943878c54c33075) ) ROM_REGION( 0x10000, "audiocpu", 0 ) - ROM_LOAD( "last_mission_dl05-.5h", 0x8000, 0x8000, CRC(1a5df8c0) SHA1(83d36b1d5fb87f50c44f3110804d6bbdbbc0da99) ) + ROM_LOAD( "last_mission_dl05-.5h", 0x8000, 0x8000, CRC(1a5df8c0) SHA1(83d36b1d5fb87f50c44f3110804d6bbdbbc0da99) ) ROM_REGION( 0x1000, "mcu", 0 ) // i8751 microcontroller ROM_LOAD( "last_mission_dl00-a.18a", 0x0000, 0x1000, CRC(e97481c6) SHA1(5c6b0e3585712c03b1b657c814c502c396ffa333) ) // Hand written "A", some MCUs are known to be labeled DL00-7, it's not verified to be the same data ROM_REGION( 0x08000, "char", 0 ) - ROM_LOAD( "last_mission_dl01-.2a", 0x00000, 0x2000, CRC(f3787a5d) SHA1(3701df42cb2aca951963703e72c6c7b272eed82b) ) - ROM_CONTINUE( 0x06000, 0x2000 ) - ROM_CONTINUE( 0x04000, 0x2000 ) - ROM_CONTINUE( 0x02000, 0x2000 ) + ROM_LOAD( "last_mission_dl01-.2a", 0x00000, 0x2000, CRC(f3787a5d) SHA1(3701df42cb2aca951963703e72c6c7b272eed82b) ) + ROM_CONTINUE( 0x06000, 0x2000 ) + ROM_CONTINUE( 0x04000, 0x2000 ) + ROM_CONTINUE( 0x02000, 0x2000 ) ROM_REGION( 0x80000, "sprites", 0 ) - ROM_LOAD( "last_mission_dl11-.13f", 0x00000, 0x08000, CRC(36579d3b) SHA1(8edf952dafcd5bc66e08074687f0bec809fd4c2f) ) - ROM_LOAD( "last_mission_dl12-.9f", 0x20000, 0x08000, CRC(2ba6737e) SHA1(c5e4c27726bf14e9cd60d62e2f17ea5be8093c37) ) - ROM_LOAD( "last_mission_dl13-.8f", 0x40000, 0x08000, CRC(39a7dc93) SHA1(3b7968fd06ac0379525c1d3e73f8bbe18ea36439) ) - ROM_LOAD( "last_mission_dl10-.16f", 0x60000, 0x08000, CRC(fe275ea8) SHA1(2f089f96583235f1f5226ef2a64b430d84efbeee) ) + ROM_LOAD( "last_mission_dl11-.13f", 0x00000, 0x08000, CRC(36579d3b) SHA1(8edf952dafcd5bc66e08074687f0bec809fd4c2f) ) + ROM_LOAD( "last_mission_dl12-.9f", 0x20000, 0x08000, CRC(2ba6737e) SHA1(c5e4c27726bf14e9cd60d62e2f17ea5be8093c37) ) + ROM_LOAD( "last_mission_dl13-.8f", 0x40000, 0x08000, CRC(39a7dc93) SHA1(3b7968fd06ac0379525c1d3e73f8bbe18ea36439) ) + ROM_LOAD( "last_mission_dl10-.16f", 0x60000, 0x08000, CRC(fe275ea8) SHA1(2f089f96583235f1f5226ef2a64b430d84efbeee) ) ROM_REGION( 0x80000, "tiles1", 0 ) - ROM_LOAD( "last_mission_dl09-.12k", 0x00000, 0x10000, CRC(6a5a0c5d) SHA1(0106cf693c284be5faf96e56b651fab92a410915) ) - ROM_LOAD( "last_mission_dl08-.14k", 0x20000, 0x10000, CRC(3b38cfce) SHA1(d6829bed6916fb301c08031bd466ee4dcc05b275) ) - ROM_LOAD( "last_mission_dl07-.15k", 0x40000, 0x10000, CRC(1b60604d) SHA1(1ee15cfdac87f7eeb92050766293b894cfad1466) ) - ROM_LOAD( "last_mission_dl06-.17k", 0x60000, 0x10000, CRC(c43c26a7) SHA1(896e278935b100edc12cd970469f2e8293eb96cc) ) + ROM_LOAD( "last_mission_dl09-.12k", 0x00000, 0x10000, CRC(6a5a0c5d) SHA1(0106cf693c284be5faf96e56b651fab92a410915) ) + ROM_LOAD( "last_mission_dl08-.14k", 0x20000, 0x10000, CRC(3b38cfce) SHA1(d6829bed6916fb301c08031bd466ee4dcc05b275) ) + ROM_LOAD( "last_mission_dl07-.15k", 0x40000, 0x10000, CRC(1b60604d) SHA1(1ee15cfdac87f7eeb92050766293b894cfad1466) ) + ROM_LOAD( "last_mission_dl06-.17k", 0x60000, 0x10000, CRC(c43c26a7) SHA1(896e278935b100edc12cd970469f2e8293eb96cc) ) ROM_REGION( 0x0100, "proms", 0 ) ROM_LOAD( "dl-14.9c", 0x0000, 0x0100, CRC(2e55aa12) SHA1(c0f2b9649467eb9d2c1e47589b5990f5c5e8cc93) ) // Priority (Not yet used) ROM_END ROM_START( lastmisnu5 ) - ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "last_mission_dl03-5.13h", 0x08000, 0x08000, CRC(357f5f6b) SHA1(a114aac50db62a6bcb943681e517ad7c88ec47f4) ) // Rev 5 roms - ROM_LOAD( "last_mission_dl04-5.7h", 0x10000, 0x10000, CRC(7dea1552) SHA1(920684413e2ba4313111e79821c5714977b26b1a) ) + + ROM_REGION( 0x10000, "mainbank", 0 ) + ROM_LOAD( "last_mission_dl04-5.7h", 0x00000, 0x10000, CRC(7dea1552) SHA1(920684413e2ba4313111e79821c5714977b26b1a) ) ROM_REGION( 0x10000, "sub", 0 ) // CPU 2, 1st 16k is empty ROM_LOAD( "last_mission_dl02-5.18h", 0x0000, 0x10000, CRC(ec9b5daf) SHA1(86d47bad123676abc82dd7c92943878c54c33075) ) ROM_REGION( 0x10000, "audiocpu", 0 ) - ROM_LOAD( "last_mission_dl05-.5h", 0x8000, 0x8000, CRC(1a5df8c0) SHA1(83d36b1d5fb87f50c44f3110804d6bbdbbc0da99) ) + ROM_LOAD( "last_mission_dl05-.5h", 0x8000, 0x8000, CRC(1a5df8c0) SHA1(83d36b1d5fb87f50c44f3110804d6bbdbbc0da99) ) ROM_REGION( 0x1000, "mcu", 0 ) // i8751 microcontroller ROM_LOAD( "last_mission_dl00-a.18a", 0x0000, 0x1000, CRC(e97481c6) SHA1(5c6b0e3585712c03b1b657c814c502c396ffa333) ) // Hand written "A", some MCUs are known to be labeled DL00-7, it's not verified to be the same data ROM_REGION( 0x08000, "char", 0 ) - ROM_LOAD( "last_mission_dl01-.2a", 0x00000, 0x2000, CRC(f3787a5d) SHA1(3701df42cb2aca951963703e72c6c7b272eed82b) ) - ROM_CONTINUE( 0x06000, 0x2000 ) - ROM_CONTINUE( 0x04000, 0x2000 ) - ROM_CONTINUE( 0x02000, 0x2000 ) + ROM_LOAD( "last_mission_dl01-.2a", 0x00000, 0x2000, CRC(f3787a5d) SHA1(3701df42cb2aca951963703e72c6c7b272eed82b) ) + ROM_CONTINUE( 0x06000, 0x2000 ) + ROM_CONTINUE( 0x04000, 0x2000 ) + ROM_CONTINUE( 0x02000, 0x2000 ) ROM_REGION( 0x80000, "sprites", 0 ) - ROM_LOAD( "last_mission_dl11-.13f", 0x00000, 0x08000, CRC(36579d3b) SHA1(8edf952dafcd5bc66e08074687f0bec809fd4c2f) ) - ROM_LOAD( "last_mission_dl12-.9f", 0x20000, 0x08000, CRC(2ba6737e) SHA1(c5e4c27726bf14e9cd60d62e2f17ea5be8093c37) ) - ROM_LOAD( "last_mission_dl13-.8f", 0x40000, 0x08000, CRC(39a7dc93) SHA1(3b7968fd06ac0379525c1d3e73f8bbe18ea36439) ) - ROM_LOAD( "last_mission_dl10-.16f", 0x60000, 0x08000, CRC(fe275ea8) SHA1(2f089f96583235f1f5226ef2a64b430d84efbeee) ) + ROM_LOAD( "last_mission_dl11-.13f", 0x00000, 0x08000, CRC(36579d3b) SHA1(8edf952dafcd5bc66e08074687f0bec809fd4c2f) ) + ROM_LOAD( "last_mission_dl12-.9f", 0x20000, 0x08000, CRC(2ba6737e) SHA1(c5e4c27726bf14e9cd60d62e2f17ea5be8093c37) ) + ROM_LOAD( "last_mission_dl13-.8f", 0x40000, 0x08000, CRC(39a7dc93) SHA1(3b7968fd06ac0379525c1d3e73f8bbe18ea36439) ) + ROM_LOAD( "last_mission_dl10-.16f", 0x60000, 0x08000, CRC(fe275ea8) SHA1(2f089f96583235f1f5226ef2a64b430d84efbeee) ) ROM_REGION( 0x80000, "tiles1", 0 ) - ROM_LOAD( "last_mission_dl09-.12k", 0x00000, 0x10000, CRC(6a5a0c5d) SHA1(0106cf693c284be5faf96e56b651fab92a410915) ) - ROM_LOAD( "last_mission_dl08-.14k", 0x20000, 0x10000, CRC(3b38cfce) SHA1(d6829bed6916fb301c08031bd466ee4dcc05b275) ) - ROM_LOAD( "last_mission_dl07-.15k", 0x40000, 0x10000, CRC(1b60604d) SHA1(1ee15cfdac87f7eeb92050766293b894cfad1466) ) - ROM_LOAD( "last_mission_dl06-.17k", 0x60000, 0x10000, CRC(c43c26a7) SHA1(896e278935b100edc12cd970469f2e8293eb96cc) ) + ROM_LOAD( "last_mission_dl09-.12k", 0x00000, 0x10000, CRC(6a5a0c5d) SHA1(0106cf693c284be5faf96e56b651fab92a410915) ) + ROM_LOAD( "last_mission_dl08-.14k", 0x20000, 0x10000, CRC(3b38cfce) SHA1(d6829bed6916fb301c08031bd466ee4dcc05b275) ) + ROM_LOAD( "last_mission_dl07-.15k", 0x40000, 0x10000, CRC(1b60604d) SHA1(1ee15cfdac87f7eeb92050766293b894cfad1466) ) + ROM_LOAD( "last_mission_dl06-.17k", 0x60000, 0x10000, CRC(c43c26a7) SHA1(896e278935b100edc12cd970469f2e8293eb96cc) ) ROM_REGION( 0x0100, "proms", 0 ) ROM_LOAD( "dl-14.9c", 0x00000, 0x0100, CRC(2e55aa12) SHA1(c0f2b9649467eb9d2c1e47589b5990f5c5e8cc93) ) // Priority (Not yet used) ROM_END ROM_START( lastmisnj ) - ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dl03-.13h", 0x08000, 0x08000, CRC(4be5e7e1) SHA1(9f943658663da31947cebdcbcb5f4e2be0714c06) ) - ROM_LOAD( "dl04-.7h", 0x10000, 0x10000, CRC(f026adf9) SHA1(4ccd0e714a6eb7cee388c93beee2d5510407c961) ) + + ROM_REGION( 0x10000, "mainbank", 0 ) + ROM_LOAD( "dl04-.7h", 0x00000, 0x10000, CRC(f026adf9) SHA1(4ccd0e714a6eb7cee388c93beee2d5510407c961) ) ROM_REGION( 0x10000, "sub", 0 ) // CPU 2, 1st 16k is empty ROM_LOAD( "dl02-.18h", 0x0000, 0x10000, CRC(d0de2b5d) SHA1(e0bb34c2a2ef6fc6f05ab9a98bd23a39004c0c05) ) ROM_REGION( 0x10000, "audiocpu", 0 ) - ROM_LOAD( "last_mission_dl05-.5h", 0x8000, 0x8000, CRC(1a5df8c0) SHA1(83d36b1d5fb87f50c44f3110804d6bbdbbc0da99) ) + ROM_LOAD( "last_mission_dl05-.5h", 0x8000, 0x8000, CRC(1a5df8c0) SHA1(83d36b1d5fb87f50c44f3110804d6bbdbbc0da99) ) ROM_REGION( 0x1000, "mcu", 0 ) // created from dump of the US version ROM_LOAD( "last_mission_japan.18a", 0x0000, 0x1000, BAD_DUMP CRC(0d58c3a1) SHA1(184e75324b7ab2de8e6441f0c954046db80b2640) ) // correct ROM label when real MCU is dumped @@ -2657,13 +2666,15 @@ ROM_START( lastmisnj ) ROM_END ROM_START( shackled ) - ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dk-02.13h", 0x08000, 0x08000, CRC(87f8fa85) SHA1(1cb93a60eefdb453a3cc6ec9c5cc2e367fb8aeb0) ) - ROM_LOAD( "dk-06.7h", 0x10000, 0x10000, CRC(69ad62d1) SHA1(1aa23b12ab4f1908cddd25f091e1f9bd70a5113c) ) - ROM_LOAD( "dk-05.9h", 0x20000, 0x10000, CRC(598dd128) SHA1(10843c5352eef03c8675df6abaf23c9c9c795aa3) ) - ROM_LOAD( "dk-04.10h", 0x30000, 0x10000, CRC(36d305d4) SHA1(17586c316aff405cf20c1467d69c98fa2a3c2630) ) - ROM_LOAD( "dk-03.11h", 0x40000, 0x08000, CRC(6fd90fd1) SHA1(2f8db17e5545c82d243a7e23e7bda2c2a9101360) ) - ROM_RELOAD( 0x48000, 0x08000 ) + + ROM_REGION( 0x40000, "mainbank", 0 ) + ROM_LOAD( "dk-06.7h", 0x00000, 0x10000, CRC(69ad62d1) SHA1(1aa23b12ab4f1908cddd25f091e1f9bd70a5113c) ) + ROM_LOAD( "dk-05.9h", 0x10000, 0x10000, CRC(598dd128) SHA1(10843c5352eef03c8675df6abaf23c9c9c795aa3) ) + ROM_LOAD( "dk-04.10h", 0x20000, 0x10000, CRC(36d305d4) SHA1(17586c316aff405cf20c1467d69c98fa2a3c2630) ) + ROM_LOAD( "dk-03.11h", 0x30000, 0x08000, CRC(6fd90fd1) SHA1(2f8db17e5545c82d243a7e23e7bda2c2a9101360) ) + ROM_RELOAD( 0x38000, 0x08000 ) ROM_REGION( 0x10000, "sub", 0 ) // CPU 2, 1st 16k is empty ROM_LOAD( "dk-01.18h", 0x00000, 0x10000, CRC(71fe3bda) SHA1(959cce01362b2c670c2e15b03a78a1ff9cea4ee9) ) @@ -2698,13 +2709,15 @@ ROM_START( shackled ) ROM_END ROM_START( breywood ) - ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dj02-2.13h", 0x08000, 0x08000, CRC(c19856b9) SHA1(766994703bb59879c311675353d7231ad27c7c16) ) - ROM_LOAD( "dj06-2.7h", 0x10000, 0x10000, CRC(2860ea02) SHA1(7ac090c3ae9d71baa6227ec9555f1c9f2d25ea0d) ) - ROM_LOAD( "dj05-2.9h", 0x20000, 0x10000, CRC(0fdd915e) SHA1(262df956dfc727c710ade28af7f33fddaafd7ee2) ) - ROM_LOAD( "dj04-2.10h", 0x30000, 0x10000, CRC(71036579) SHA1(c58ff3222b5bcd75d58c5f282554e92103e80916) ) - ROM_LOAD( "dj03-2.11h", 0x40000, 0x08000, CRC(308f4893) SHA1(539c138ff01c5718cc8a982482b989468d532699) ) - ROM_RELOAD( 0x48000, 0x08000 ) + + ROM_REGION( 0x40000, "mainbank", 0 ) + ROM_LOAD( "dj06-2.7h", 0x00000, 0x10000, CRC(2860ea02) SHA1(7ac090c3ae9d71baa6227ec9555f1c9f2d25ea0d) ) + ROM_LOAD( "dj05-2.9h", 0x10000, 0x10000, CRC(0fdd915e) SHA1(262df956dfc727c710ade28af7f33fddaafd7ee2) ) + ROM_LOAD( "dj04-2.10h", 0x20000, 0x10000, CRC(71036579) SHA1(c58ff3222b5bcd75d58c5f282554e92103e80916) ) + ROM_LOAD( "dj03-2.11h", 0x30000, 0x08000, CRC(308f4893) SHA1(539c138ff01c5718cc8a982482b989468d532699) ) + ROM_RELOAD( 0x38000, 0x08000 ) ROM_REGION( 0x10000, "sub", 0 ) // CPU 2, 1st 16k is empty ROM_LOAD( "dj1-2y.18h", 0x0000, 0x10000, CRC(3d9fb623) SHA1(6e5eaad9bb0a432e2da5da5b18a2ed36617bdde2) ) @@ -2739,11 +2752,14 @@ ROM_START( breywood ) ROM_END ROM_START( gondo ) - ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dt00-e.f3", 0x08000, 0x08000, CRC(912a7eee) SHA1(15af89babf166dadaa77640e1973d7ebb4c078db) ) // Verified only DT00-E & DT03-E have the "-E" extention - ROM_LOAD( "dt01.f5", 0x10000, 0x10000, CRC(c39bb877) SHA1(9beb59ba19f38417c5d4d36e8f3c41f2b017d2d6) ) - ROM_LOAD( "dt02.f6", 0x20000, 0x10000, CRC(925307a4) SHA1(1e8b8eb21df1a11b14c981b343b34c6cc3676517) ) // same label as the US version, but content identical to Japanese version - ROM_LOAD( "dt03-e.f7", 0x30000, 0x10000, CRC(ee7475eb) SHA1(8c68198ea1c3e89c9c2c4ba0e5d3f47afb8eecd4) ) + + ROM_REGION( 0x40000, "mainbank", 0 ) + ROM_LOAD( "dt01.f5", 0x00000, 0x10000, CRC(c39bb877) SHA1(9beb59ba19f38417c5d4d36e8f3c41f2b017d2d6) ) + ROM_LOAD( "dt02.f6", 0x10000, 0x10000, CRC(925307a4) SHA1(1e8b8eb21df1a11b14c981b343b34c6cc3676517) ) // same label as the US version, but content identical to Japanese version + ROM_LOAD( "dt03-e.f7", 0x20000, 0x10000, CRC(ee7475eb) SHA1(8c68198ea1c3e89c9c2c4ba0e5d3f47afb8eecd4) ) + ROM_FILL( 0x30000, 0x10000, 0xff) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "dt05-e.h5", 0x8000, 0x8000, CRC(ec08aa29) SHA1(ce83974ae095d9518d1ebf9f7e712f0cbc2c1b42) ) @@ -2783,11 +2799,14 @@ ROM_START( gondo ) ROM_END ROM_START( gondou ) - ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dt00.f3", 0x08000, 0x08000, CRC(a8cf9118) SHA1(865744c9866957d686a31608d356e279fe58934e) ) - ROM_LOAD( "dt01.f5", 0x10000, 0x10000, CRC(c39bb877) SHA1(9beb59ba19f38417c5d4d36e8f3c41f2b017d2d6) ) - ROM_LOAD( "dt02.f6", 0x20000, 0x10000, CRC(bb5e674b) SHA1(8057dc7464a8b6987536f248d607957923b223cf) ) - ROM_LOAD( "dt03.f7", 0x30000, 0x10000, CRC(99c32b13) SHA1(3d79f48e7d198cb2e519d592a89eda505044bce5) ) + + ROM_REGION( 0x40000, "mainbank", 0 ) + ROM_LOAD( "dt01.f5", 0x00000, 0x10000, CRC(c39bb877) SHA1(9beb59ba19f38417c5d4d36e8f3c41f2b017d2d6) ) + ROM_LOAD( "dt02.f6", 0x10000, 0x10000, CRC(bb5e674b) SHA1(8057dc7464a8b6987536f248d607957923b223cf) ) + ROM_LOAD( "dt03.f7", 0x20000, 0x10000, CRC(99c32b13) SHA1(3d79f48e7d198cb2e519d592a89eda505044bce5) ) + ROM_FILL( 0x30000, 0x10000, 0xff) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "dt05.h5", 0x8000, 0x8000, CRC(ec08aa29) SHA1(ce83974ae095d9518d1ebf9f7e712f0cbc2c1b42) ) // == dt05-e.h5 @@ -2827,11 +2846,14 @@ ROM_START( gondou ) ROM_END ROM_START( makyosen ) - ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "ds00.f3", 0x08000, 0x08000, CRC(33bb16fe) SHA1(5d3873b66e0d08b35d56a8b508c774b27368a100) ) - ROM_LOAD( "ds01.f5", 0x10000, 0x10000, CRC(c39bb877) SHA1(9beb59ba19f38417c5d4d36e8f3c41f2b017d2d6) ) - ROM_LOAD( "ds02.f6", 0x20000, 0x10000, CRC(925307a4) SHA1(1e8b8eb21df1a11b14c981b343b34c6cc3676517) ) - ROM_LOAD( "ds03.f7", 0x30000, 0x10000, CRC(9c0fcbf6) SHA1(bfe42b5277fea111840a9f59b2cb8dfe44444029) ) + + ROM_REGION( 0x40000, "mainbank", 0 ) + ROM_LOAD( "ds01.f5", 0x00000, 0x10000, CRC(c39bb877) SHA1(9beb59ba19f38417c5d4d36e8f3c41f2b017d2d6) ) + ROM_LOAD( "ds02.f6", 0x10000, 0x10000, CRC(925307a4) SHA1(1e8b8eb21df1a11b14c981b343b34c6cc3676517) ) + ROM_LOAD( "ds03.f7", 0x20000, 0x10000, CRC(9c0fcbf6) SHA1(bfe42b5277fea111840a9f59b2cb8dfe44444029) ) + ROM_FILL( 0x30000, 0x10000, 0xff) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "ds05.h5", 0x8000, 0x8000, CRC(e6e28ca9) SHA1(3b1f8219331db1910bfb428f8964f8fc1063df6f) ) // == dt05-e.h5 @@ -2876,12 +2898,14 @@ ROM_START( makyosen ) ROM_END ROM_START( garyoret ) - ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dv00", 0x08000, 0x08000, CRC(cceaaf05) SHA1(b8f54638feab77d023e01ced947e1269f0d19fd8) ) - ROM_LOAD( "dv01", 0x10000, 0x10000, CRC(c33fc18a) SHA1(0d9594b0e6c39aea5b9f15f6aa364b31604f1066) ) - ROM_LOAD( "dv02", 0x20000, 0x10000, CRC(f9e26ce7) SHA1(8589594ebc7ae16942739382273a222dfa30b3b7) ) - ROM_LOAD( "dv03", 0x30000, 0x10000, CRC(55d8d699) SHA1(da1519cd54d27cc406420ce0845e43f7228cfd4e) ) - ROM_LOAD( "dv04", 0x40000, 0x10000, CRC(ed3d00ee) SHA1(6daa2ee509235ad03d3012a00382820279add620) ) + + ROM_REGION( 0x40000, "mainbank", 0 ) + ROM_LOAD( "dv01", 0x00000, 0x10000, CRC(c33fc18a) SHA1(0d9594b0e6c39aea5b9f15f6aa364b31604f1066) ) + ROM_LOAD( "dv02", 0x10000, 0x10000, CRC(f9e26ce7) SHA1(8589594ebc7ae16942739382273a222dfa30b3b7) ) + ROM_LOAD( "dv03", 0x20000, 0x10000, CRC(55d8d699) SHA1(da1519cd54d27cc406420ce0845e43f7228cfd4e) ) + ROM_LOAD( "dv04", 0x30000, 0x10000, CRC(ed3d00ee) SHA1(6daa2ee509235ad03d3012a00382820279add620) ) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "dv05", 0x08000, 0x08000, CRC(c97c347f) SHA1(a1b22733dc15d524af97db3e608a82503a49b182) ) @@ -2925,12 +2949,14 @@ ROM_START( garyoret ) ROM_END ROM_START( ghostb ) - ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dz01-22.1d", 0x08000, 0x08000, CRC(fc65fdf2) SHA1(b6ffe2043d5dbff061a9806631646428eed95dd3) ) - ROM_LOAD( "dz02.3d", 0x10000, 0x10000, CRC(8e117541) SHA1(7dfa6eabb29f39a615f3e5123bddcc7197ab82d0) ) - ROM_LOAD( "dz03.4d", 0x20000, 0x10000, CRC(5606a8f4) SHA1(e46e887f13f648fe2162cb853b3c20fa60e3d215) ) - ROM_LOAD( "dz04-21.6d", 0x30000, 0x10000, CRC(7d46582f) SHA1(22e70675d76e2a93a732370fa42cc4b79381f4b0) ) - ROM_LOAD( "dz05-21.7d", 0x40000, 0x10000, CRC(23e1c758) SHA1(c6432682e1d4429d0cfa8de6a05ca0152611b5b1) ) + + ROM_REGION( 0x40000, "mainbank", 0 ) + ROM_LOAD( "dz02.3d", 0x00000, 0x10000, CRC(8e117541) SHA1(7dfa6eabb29f39a615f3e5123bddcc7197ab82d0) ) + ROM_LOAD( "dz03.4d", 0x10000, 0x10000, CRC(5606a8f4) SHA1(e46e887f13f648fe2162cb853b3c20fa60e3d215) ) + ROM_LOAD( "dz04-21.6d", 0x20000, 0x10000, CRC(7d46582f) SHA1(22e70675d76e2a93a732370fa42cc4b79381f4b0) ) + ROM_LOAD( "dz05-21.7d", 0x30000, 0x10000, CRC(23e1c758) SHA1(c6432682e1d4429d0cfa8de6a05ca0152611b5b1) ) ROM_REGION( 2*0x10000, "audiocpu", 0 ) // 64K for sound CPU + 64k for decrypted opcodes ROM_LOAD( "dz06.5f", 0x8000, 0x8000, CRC(798f56df) SHA1(aee33cd0c102015114e17f6cb98945e7cc806f55) ) @@ -2963,12 +2989,14 @@ ROM_START( ghostb ) ROM_END ROM_START( ghostb2a ) - ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dz01.1d", 0x08000, 0x08000, CRC(7c5bb4b1) SHA1(75865102c9bfbf9bd341b8ea54f49904c727f474) ) - ROM_LOAD( "dz02.3d", 0x10000, 0x10000, CRC(8e117541) SHA1(7dfa6eabb29f39a615f3e5123bddcc7197ab82d0) ) - ROM_LOAD( "dz03.4d", 0x20000, 0x10000, CRC(5606a8f4) SHA1(e46e887f13f648fe2162cb853b3c20fa60e3d215) ) - ROM_LOAD( "dz04.6d", 0x30000, 0x10000, CRC(d09bad99) SHA1(bde8e4316cedf1d292f0aed8627b0dc6794c6e07) ) - ROM_LOAD( "dz05.7d", 0x40000, 0x10000, CRC(0315f691) SHA1(3bfad18b9f230e64c608a22af20c3b00dca3e6da) ) + + ROM_REGION( 0x40000, "mainbank", 0 ) + ROM_LOAD( "dz02.3d", 0x00000, 0x10000, CRC(8e117541) SHA1(7dfa6eabb29f39a615f3e5123bddcc7197ab82d0) ) + ROM_LOAD( "dz03.4d", 0x10000, 0x10000, CRC(5606a8f4) SHA1(e46e887f13f648fe2162cb853b3c20fa60e3d215) ) + ROM_LOAD( "dz04.6d", 0x20000, 0x10000, CRC(d09bad99) SHA1(bde8e4316cedf1d292f0aed8627b0dc6794c6e07) ) + ROM_LOAD( "dz05.7d", 0x30000, 0x10000, CRC(0315f691) SHA1(3bfad18b9f230e64c608a22af20c3b00dca3e6da) ) ROM_REGION( 2*0x10000, "audiocpu", 0 ) // 64K for sound CPU + 64k for decrypted opcodes ROM_LOAD( "dz06.5f", 0x8000, 0x8000, CRC(798f56df) SHA1(aee33cd0c102015114e17f6cb98945e7cc806f55) ) @@ -3001,12 +3029,14 @@ ROM_START( ghostb2a ) ROM_END ROM_START( ghostb3 ) - ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dz01-3b.1d", 0x08000, 0x08000, CRC(c8cc862a) SHA1(e736107beb11a12cdf413655c6874df28d5a9c70) ) - ROM_LOAD( "dz02.3d", 0x10000, 0x10000, CRC(8e117541) SHA1(7dfa6eabb29f39a615f3e5123bddcc7197ab82d0) ) - ROM_LOAD( "dz03.4d", 0x20000, 0x10000, CRC(5606a8f4) SHA1(e46e887f13f648fe2162cb853b3c20fa60e3d215) ) - ROM_LOAD( "dz04-1.6d", 0x30000, 0x10000, CRC(3c3eb09f) SHA1(ae4975992698fa97c68a857a25b470a05539160a) ) - ROM_LOAD( "dz05-1.7d", 0x40000, 0x10000, CRC(b4971d33) SHA1(25e052c4b414c7bd7b6e3ae9c211873902afb5f7) ) + + ROM_REGION( 0x40000, "mainbank", 0 ) + ROM_LOAD( "dz02.3d", 0x00000, 0x10000, CRC(8e117541) SHA1(7dfa6eabb29f39a615f3e5123bddcc7197ab82d0) ) + ROM_LOAD( "dz03.4d", 0x10000, 0x10000, CRC(5606a8f4) SHA1(e46e887f13f648fe2162cb853b3c20fa60e3d215) ) + ROM_LOAD( "dz04-1.6d", 0x20000, 0x10000, CRC(3c3eb09f) SHA1(ae4975992698fa97c68a857a25b470a05539160a) ) + ROM_LOAD( "dz05-1.7d", 0x30000, 0x10000, CRC(b4971d33) SHA1(25e052c4b414c7bd7b6e3ae9c211873902afb5f7) ) ROM_REGION( 2*0x10000, "audiocpu", 0 ) // 64K for sound CPU + 64k for decrypted opcodes ROM_LOAD( "dz06.5f", 0x8000, 0x8000, CRC(798f56df) SHA1(aee33cd0c102015114e17f6cb98945e7cc806f55) ) @@ -3040,12 +3070,14 @@ ROM_END // DZ-1 is the verified correct MCU code for the ghostb3a set below, both DZ01-2 & DZ04- ROMs have been verified correct from multiple sources ROM_START( ghostb3a ) - ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dz01-2.1d", 0x08000, 0x08000, CRC(1b16890e) SHA1(eebd253d616b6286937b72cfb64612877f383932) ) - ROM_LOAD( "dz02-.3d", 0x10000, 0x10000, CRC(8e117541) SHA1(7dfa6eabb29f39a615f3e5123bddcc7197ab82d0) ) // == dz02.3d (ghostb3) - ROM_LOAD( "dz03-.4d", 0x20000, 0x10000, CRC(5606a8f4) SHA1(e46e887f13f648fe2162cb853b3c20fa60e3d215) ) // == dz03.4d (ghostb3) - ROM_LOAD( "dz04-.6d", 0x30000, 0x10000, CRC(490b4525) SHA1(3066b76f8fe99c8f9f1cdf943209883a199a4184) ) - ROM_LOAD( "dz05-.7d", 0x40000, 0x10000, CRC(b4971d33) SHA1(25e052c4b414c7bd7b6e3ae9c211873902afb5f7) ) // == dz05-1.7d (ghostb3) + + ROM_REGION( 0x40000, "mainbank", 0 ) + ROM_LOAD( "dz02-.3d", 0x00000, 0x10000, CRC(8e117541) SHA1(7dfa6eabb29f39a615f3e5123bddcc7197ab82d0) ) // == dz02.3d (ghostb3) + ROM_LOAD( "dz03-.4d", 0x10000, 0x10000, CRC(5606a8f4) SHA1(e46e887f13f648fe2162cb853b3c20fa60e3d215) ) // == dz03.4d (ghostb3) + ROM_LOAD( "dz04-.6d", 0x20000, 0x10000, CRC(490b4525) SHA1(3066b76f8fe99c8f9f1cdf943209883a199a4184) ) + ROM_LOAD( "dz05-.7d", 0x30000, 0x10000, CRC(b4971d33) SHA1(25e052c4b414c7bd7b6e3ae9c211873902afb5f7) ) // == dz05-1.7d (ghostb3) ROM_REGION( 2*0x10000, "audiocpu", 0 ) // 64K for sound CPU + 64k for decrypted opcodes ROM_LOAD( "dz06.5f", 0x8000, 0x8000, CRC(798f56df) SHA1(aee33cd0c102015114e17f6cb98945e7cc806f55) ) @@ -3164,11 +3196,14 @@ DE-0259-1 */ ROM_START( meikyuh ) - ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dw01-5.1d", 0x08000, 0x08000, CRC(87610c39) SHA1(47b83e7decd18f117d00a9f55c42da93b337c04a) ) - ROM_LOAD( "dw02.3d", 0x10000, 0x10000, CRC(40c9b0b8) SHA1(81deb25e00eb4d4c5133ea42cda279c318ee771c) ) - ROM_LOAD( "dw03.4d", 0x20000, 0x10000, CRC(5606a8f4) SHA1(e46e887f13f648fe2162cb853b3c20fa60e3d215) ) - ROM_LOAD( "dw04.6d", 0x30000, 0x10000, CRC(235c0c36) SHA1(f0635f8348459cb8a56eb6184f1bc31c3a82de6a) ) + + ROM_REGION( 0x40000, "mainbank", 0 ) + ROM_LOAD( "dw02.3d", 0x00000, 0x10000, CRC(40c9b0b8) SHA1(81deb25e00eb4d4c5133ea42cda279c318ee771c) ) + ROM_LOAD( "dw03.4d", 0x10000, 0x10000, CRC(5606a8f4) SHA1(e46e887f13f648fe2162cb853b3c20fa60e3d215) ) + ROM_LOAD( "dw04.6d", 0x20000, 0x10000, CRC(235c0c36) SHA1(f0635f8348459cb8a56eb6184f1bc31c3a82de6a) ) + ROM_FILL( 0x30000, 0x10000, 0xff) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "dw05.5f", 0x8000, 0x8000, CRC(c28c4d82) SHA1(ad88506bcbc9763e39d6e6bb25ef2bd6aa929f30) ) @@ -3257,11 +3292,14 @@ ALL MEMORIES ARE MASK ROMS! */ ROM_START( meikyuhbl ) - ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "27256.1d", 0x08000, 0x08000, CRC(d5b5e8a2) SHA1(0155d1d0ddbd764b960148c3c9ef34223e101659) ) // dw-01-5.1d matched 6.552124% - ROM_LOAD( "24512.3d", 0x10000, 0x10000, CRC(40c9b0b8) SHA1(81deb25e00eb4d4c5133ea42cda279c318ee771c) ) - ROM_LOAD( "24512.4d", 0x20000, 0x10000, CRC(5606a8f4) SHA1(e46e887f13f648fe2162cb853b3c20fa60e3d215) ) - ROM_LOAD( "27512.6d", 0x30000, 0x10000, CRC(8ca6055d) SHA1(37dc5d3b158dc5d7c9677fc4f82e10804181619f) ) // dw-04.6d matched 99.995422% (verified on 2 different PCBs, so almost certainly good) + + ROM_REGION( 0x40000, "mainbank", 0 ) + ROM_LOAD( "24512.3d", 0x00000, 0x10000, CRC(40c9b0b8) SHA1(81deb25e00eb4d4c5133ea42cda279c318ee771c) ) + ROM_LOAD( "24512.4d", 0x10000, 0x10000, CRC(5606a8f4) SHA1(e46e887f13f648fe2162cb853b3c20fa60e3d215) ) + ROM_LOAD( "27512.6d", 0x20000, 0x10000, CRC(8ca6055d) SHA1(37dc5d3b158dc5d7c9677fc4f82e10804181619f) ) // dw-04.6d matched 99.995422% (verified on 2 different PCBs, so almost certainly good) + ROM_FILL( 0x30000, 0x10000, 0xff) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "27256.5f", 0x8000, 0x8000, CRC(c28c4d82) SHA1(ad88506bcbc9763e39d6e6bb25ef2bd6aa929f30) ) @@ -3350,10 +3388,12 @@ Lower board (DATA EAST DE-0251-2): */ ROM_START( csilver ) - ROM_REGION( 0x48000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dx03-12.18d", 0x08000, 0x08000, CRC(2d926e7c) SHA1(cf38e92904edb1870b0a4965f9049d67efe8cf6a) ) - ROM_LOAD( "dx01.12d", 0x10000, 0x10000, CRC(570fb50c) SHA1(3002f53182834a060fc282be1bc5767906e19ba2) ) - ROM_LOAD( "dx02.13d", 0x20000, 0x10000, CRC(58625890) SHA1(503a969085f6dcb16687217c48136ea22d07c89f) ) + + ROM_REGION( 0x20000, "mainbank", 0 ) + ROM_LOAD( "dx01.12d", 0x00000, 0x10000, CRC(570fb50c) SHA1(3002f53182834a060fc282be1bc5767906e19ba2) ) + ROM_LOAD( "dx02.13d", 0x10000, 0x10000, CRC(58625890) SHA1(503a969085f6dcb16687217c48136ea22d07c89f) ) ROM_REGION( 0x10000, "sub", 0 ) // CPU 2, 1st 16k is empty ROM_LOAD( "dx04-1.19d", 0x0000, 0x10000, CRC(29432691) SHA1(a76ecd27d217c66a0e43f93e29efe83c657925c3) ) @@ -3391,10 +3431,12 @@ ROM_END // There is known to exist an identical ROM set with different PCB locations designated for an alternate ROM board (noted on the right of the ROM definition) ROM_START( csilverj ) - ROM_REGION( 0x48000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dx03-2.18d", 0x08000, 0x08000, CRC(02dd8cfc) SHA1(f29c0d9dd03e8c52672c0f3dbee44a93c5b4261d) ) // dx03-3.a4 (Different ROM label but identical to dx03-2.18d) - ROM_LOAD( "dx01.12d", 0x10000, 0x10000, CRC(570fb50c) SHA1(3002f53182834a060fc282be1bc5767906e19ba2) ) // dx01.a2 - ROM_LOAD( "dx02.13d", 0x20000, 0x10000, CRC(58625890) SHA1(503a969085f6dcb16687217c48136ea22d07c89f) ) // dx01.a3 + + ROM_REGION( 0x20000, "mainbank", 0 ) + ROM_LOAD( "dx01.12d", 0x00000, 0x10000, CRC(570fb50c) SHA1(3002f53182834a060fc282be1bc5767906e19ba2) ) // dx01.a2 + ROM_LOAD( "dx02.13d", 0x10000, 0x10000, CRC(58625890) SHA1(503a969085f6dcb16687217c48136ea22d07c89f) ) // dx01.a3 ROM_REGION( 0x10000, "sub", 0 ) // CPU 2, 1st 16k is empty ROM_LOAD( "dx04-1.19d", 0x0000, 0x10000, CRC(29432691) SHA1(a76ecd27d217c66a0e43f93e29efe83c657925c3) ) // dx04-1.a5 @@ -3431,10 +3473,12 @@ ROM_START( csilverj ) ROM_END ROM_START( csilverja ) // DE-0250-3 + DE-0251-2 - ROM_REGION( 0x48000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dx03-1.18d", 0x08000, 0x08000, CRC(d42905be) SHA1(5a406466aa9bb2b2591d02fc87289cb93f7358c6) ) - ROM_LOAD( "dx01.12d", 0x10000, 0x10000, CRC(570fb50c) SHA1(3002f53182834a060fc282be1bc5767906e19ba2) ) - ROM_LOAD( "dx02.13d", 0x20000, 0x10000, CRC(58625890) SHA1(503a969085f6dcb16687217c48136ea22d07c89f) ) + + ROM_REGION( 0x20000, "mainbank", 0 ) + ROM_LOAD( "dx01.12d", 0x00000, 0x10000, CRC(570fb50c) SHA1(3002f53182834a060fc282be1bc5767906e19ba2) ) + ROM_LOAD( "dx02.13d", 0x10000, 0x10000, CRC(58625890) SHA1(503a969085f6dcb16687217c48136ea22d07c89f) ) ROM_REGION( 0x10000, "sub", 0 ) // CPU 2, 1st 16k is empty ROM_LOAD( "dx04-1.19d", 0x0000, 0x10000, CRC(29432691) SHA1(a76ecd27d217c66a0e43f93e29efe83c657925c3) ) @@ -3471,9 +3515,11 @@ ROM_START( csilverja ) // DE-0250-3 + DE-0251-2 ROM_END ROM_START( oscar ) - ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "du10", 0x08000, 0x08000, CRC(120040d8) SHA1(22d5f84f3ca724cbf39dfc4790f2175ba4945aaf) ) // This label is probably incorrect. The correct label is needed - ROM_LOAD( "ed09", 0x10000, 0x10000, CRC(e2d4bba9) SHA1(99f0310debe51f4bcd00b5fdaedc1caf2eeccdeb) ) // for the world set because DU is the code for the Japanese version + + ROM_REGION( 0x10000, "mainbank", 0 ) + ROM_LOAD( "ed09", 0x00000, 0x10000, CRC(e2d4bba9) SHA1(99f0310debe51f4bcd00b5fdaedc1caf2eeccdeb) ) // for the world set because DU is the code for the Japanese version ROM_REGION( 0x10000, "sub", 0 ) // CPU 2, 1st 16k is empty ROM_LOAD( "du11", 0x0000, 0x10000, CRC(ff45c440) SHA1(4769944bcfebcdcba7ed7d5133d4d9f98890d75c) ) @@ -3498,9 +3544,11 @@ ROM_START( oscar ) ROM_END ROM_START( oscarbl ) // very similar to the original, main difference it's it uses a standard M6502 for sound with predecrypted opcodes. - ROM_REGION( 0x20000, "maincpu", 0 ) // same as the original + ROM_REGION( 0x10000, "maincpu", 0 ) // same as the original ROM_LOAD( "m27c256.3", 0x08000, 0x08000, CRC(120040d8) SHA1(22d5f84f3ca724cbf39dfc4790f2175ba4945aaf) ) - ROM_LOAD( "at27c512.2", 0x10000, 0x10000, CRC(e2d4bba9) SHA1(99f0310debe51f4bcd00b5fdaedc1caf2eeccdeb) ) + + ROM_REGION( 0x10000, "mainbank", 0 ) + ROM_LOAD( "at27c512.2", 0x00000, 0x10000, CRC(e2d4bba9) SHA1(99f0310debe51f4bcd00b5fdaedc1caf2eeccdeb) ) ROM_REGION( 0x10000, "sub", 0 ) ROM_LOAD( "at27c512.4", 0x00000, 0x10000, CRC(2ad9ef5d) SHA1(19db4446a6a5f75c7ddb2807b69d7c40d8b2d55a) ) @@ -3525,9 +3573,11 @@ ROM_START( oscarbl ) // very similar to the original, main difference it's it us ROM_END ROM_START( oscaru ) - ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "ed10", 0x08000, 0x08000, CRC(f9b0d4d4) SHA1(dc2aba978ba96f365027c7be5714728d5d7fb802) ) - ROM_LOAD( "ed09", 0x10000, 0x10000, CRC(e2d4bba9) SHA1(99f0310debe51f4bcd00b5fdaedc1caf2eeccdeb) ) + + ROM_REGION( 0x10000, "mainbank", 0 ) + ROM_LOAD( "ed09", 0x00000, 0x10000, CRC(e2d4bba9) SHA1(99f0310debe51f4bcd00b5fdaedc1caf2eeccdeb) ) ROM_REGION( 0x10000, "sub", 0 ) // CPU 2, 1st 16k is empty ROM_LOAD( "ed11", 0x0000, 0x10000, CRC(10e5d919) SHA1(13bc3497cb4aaa6dd272853819212ad63656f8a7) ) @@ -3555,9 +3605,11 @@ ROM_START( oscaru ) ROM_END ROM_START( oscarj1 ) - ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "du10-1", 0x08000, 0x08000, CRC(4ebc9f7a) SHA1(df8fdc4b4b203dc1bdd048f069fb6b723bdea0d2) ) - ROM_LOAD( "ed09", 0x10000, 0x10000, CRC(e2d4bba9) SHA1(99f0310debe51f4bcd00b5fdaedc1caf2eeccdeb) ) + + ROM_REGION( 0x10000, "mainbank", 0 ) + ROM_LOAD( "ed09", 0x00000, 0x10000, CRC(e2d4bba9) SHA1(99f0310debe51f4bcd00b5fdaedc1caf2eeccdeb) ) ROM_REGION( 0x10000, "sub", 0 ) // CPU 2, 1st 16k is empty ROM_LOAD( "du11", 0x0000, 0x10000, CRC(ff45c440) SHA1(4769944bcfebcdcba7ed7d5133d4d9f98890d75c) ) @@ -3661,9 +3713,11 @@ OSCAR 7891-1077 (sticker) ***************************************************************************/ ROM_START( oscarj2 ) - ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "du10-2.h12", 0x08000, 0x08000, CRC(114e898d) SHA1(1072ccabe6d53c50cdfa1e27d5d848ecdd6559cc) ) - ROM_LOAD( "du09.h10", 0x10000, 0x10000, CRC(e2d4bba9) SHA1(99f0310debe51f4bcd00b5fdaedc1caf2eeccdeb) ) + + ROM_REGION( 0x10000, "mainbank", 0 ) + ROM_LOAD( "du09.h10", 0x00000, 0x10000, CRC(e2d4bba9) SHA1(99f0310debe51f4bcd00b5fdaedc1caf2eeccdeb) ) ROM_REGION( 0x10000, "sub", 0 ) // CPU 2, 1st 16k is empty ROM_LOAD( "du11.h16", 0x0000, 0x10000, CRC(ff45c440) SHA1(4769944bcfebcdcba7ed7d5133d4d9f98890d75c) ) @@ -3691,10 +3745,12 @@ ROM_START( oscarj2 ) ROM_END ROM_START( srdarwin ) - ROM_REGION( 0x28000, "maincpu", 0 ) - ROM_LOAD( "dy_01-e.b14", 0x20000, 0x08000, CRC(176e9299) SHA1(20cd44ab610e384ab4f0172054c9adc432b12e9c) ) - ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_LOAD( "dy_00.b16", 0x10000, 0x10000, CRC(2bf6b461) SHA1(435d922c7b9df7f2b2f774346caed81d330be8a0) ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "dy_01-e.b14", 0x00000, 0x10000, CRC(176e9299) SHA1(20cd44ab610e384ab4f0172054c9adc432b12e9c) ) + + ROM_REGION( 0x20000, "mainbank", 0 ) + ROM_LOAD( "dy_00.b16", 0x00000, 0x10000, CRC(2bf6b461) SHA1(435d922c7b9df7f2b2f774346caed81d330be8a0) ) + ROM_LOAD( "dy_01-e.b14", 0x10000, 0x10000, CRC(176e9299) SHA1(20cd44ab610e384ab4f0172054c9adc432b12e9c) ) ROM_REGION( 2*0x10000, "audiocpu", 0 ) // 64K for sound CPU + 64k for decrypted opcodes ROM_LOAD( "dy_04.d7", 0x8000, 0x8000, CRC(2ae3591c) SHA1(f21b06d84e2c3d3895be0812024641fd006e45cf) ) @@ -3729,10 +3785,12 @@ ROM_START( srdarwin ) ROM_END ROM_START( srdarwinj ) - ROM_REGION( 0x28000, "maincpu", 0 ) - ROM_LOAD( "dy_01.b14", 0x20000, 0x08000, CRC(1eeee4ff) SHA1(89a70de8bd61c671582b11773ce69b2edcd9c2f8) ) - ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_LOAD( "dy_00.b16", 0x10000, 0x10000, CRC(2bf6b461) SHA1(435d922c7b9df7f2b2f774346caed81d330be8a0) ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "dy_01.b14", 0x00000, 0x10000, CRC(1eeee4ff) SHA1(89a70de8bd61c671582b11773ce69b2edcd9c2f8) ) + + ROM_REGION( 0x20000, "mainbank", 0 ) + ROM_LOAD( "dy_00.b16", 0x00000, 0x10000, CRC(2bf6b461) SHA1(435d922c7b9df7f2b2f774346caed81d330be8a0) ) + ROM_LOAD( "dy_01.b14", 0x10000, 0x10000, CRC(1eeee4ff) SHA1(89a70de8bd61c671582b11773ce69b2edcd9c2f8) ) ROM_REGION( 2*0x10000, "audiocpu", 0 ) // 64K for sound CPU + 64k for decrypted opcodes ROM_LOAD( "dy_04.d7", 0x8000, 0x8000, CRC(2ae3591c) SHA1(f21b06d84e2c3d3895be0812024641fd006e45cf) ) @@ -3766,10 +3824,12 @@ ROM_START( srdarwinj ) ROM_END ROM_START( srdarwinb ) - ROM_REGION( 0x28000, "maincpu", 0 ) - ROM_LOAD( "3.bin", 0x20000, 0x08000, CRC(7942b43f) SHA1(15de0c02d45d06c145fba48ef05baae793a1cb46) ) - ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_LOAD( "4.bin", 0x10000, 0x10000, CRC(2bf6b461) SHA1(435d922c7b9df7f2b2f774346caed81d330be8a0) ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "3.bin", 0x00000, 0x10000, CRC(7942b43f) SHA1(15de0c02d45d06c145fba48ef05baae793a1cb46) ) + + ROM_REGION( 0x20000, "mainbank", 0 ) + ROM_LOAD( "4.bin", 0x00000, 0x10000, CRC(2bf6b461) SHA1(435d922c7b9df7f2b2f774346caed81d330be8a0) ) + ROM_LOAD( "3.bin", 0x10000, 0x10000, CRC(7942b43f) SHA1(15de0c02d45d06c145fba48ef05baae793a1cb46) ) ROM_REGION( 2*0x10000, "audiocpu", 0 ) // 64K for sound CPU + 64k for decrypted opcodes ROM_LOAD( "5.bin", 0x8000, 0x8000, CRC(2ae3591c) SHA1(f21b06d84e2c3d3895be0812024641fd006e45cf) ) @@ -3802,10 +3862,12 @@ ROM_END ROM_START( cobracom ) - ROM_REGION( 0x30000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "el11-5.5j", 0x08000, 0x08000, CRC(af0a8b05) SHA1(096e4e7f2785a20bfaec14277413ce4e20e90214) ) - ROM_LOAD( "el12-4.7j", 0x10000, 0x10000, CRC(7a44ef38) SHA1(d7dc277dce08f9d073290e100be4a7ca2e2b82cb) ) - ROM_LOAD( "el13.9j", 0x20000, 0x10000, CRC(04505acb) SHA1(2220efb277884588859375dab9960f04f07273a7) ) + + ROM_REGION( 0x20000, "mainbank", 0 ) + ROM_LOAD( "el12-4.7j", 0x00000, 0x10000, CRC(7a44ef38) SHA1(d7dc277dce08f9d073290e100be4a7ca2e2b82cb) ) + ROM_LOAD( "el13.9j", 0x10000, 0x10000, CRC(04505acb) SHA1(2220efb277884588859375dab9960f04f07273a7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "el10-4.1f", 0x8000, 0x8000, CRC(edfad118) SHA1(10de8805472346fead62460a3fdc09ae26a4e0d5) ) @@ -3839,10 +3901,12 @@ ROM_START( cobracom ) ROM_END ROM_START( cobracoma ) - ROM_REGION( 0x30000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "el11-4.5j", 0x08000, 0x08000, CRC(6dca6734) SHA1(1d165845680df2f1febd2b7d2f3163d68523496e) ) - ROM_LOAD( "el12-4.7j", 0x10000, 0x10000, CRC(7a44ef38) SHA1(d7dc277dce08f9d073290e100be4a7ca2e2b82cb) ) - ROM_LOAD( "el13.9j", 0x20000, 0x10000, CRC(04505acb) SHA1(2220efb277884588859375dab9960f04f07273a7) ) + + ROM_REGION( 0x20000, "mainbank", 0 ) + ROM_LOAD( "el12-4.7j", 0x00000, 0x10000, CRC(7a44ef38) SHA1(d7dc277dce08f9d073290e100be4a7ca2e2b82cb) ) + ROM_LOAD( "el13.9j", 0x10000, 0x10000, CRC(04505acb) SHA1(2220efb277884588859375dab9960f04f07273a7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "el10-4.1f", 0x8000, 0x8000, CRC(edfad118) SHA1(10de8805472346fead62460a3fdc09ae26a4e0d5) ) @@ -3876,10 +3940,12 @@ ROM_START( cobracoma ) ROM_END ROM_START( cobracomb ) - ROM_REGION( 0x30000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "el11.5j", 0x08000, 0x08000, CRC(c6a102e3) SHA1(51d9781d13a8a98c9bbdf34fa79ebfd8a152567e) ) // "zero" revision - IE: Original version - ROM_LOAD( "el12.7j", 0x10000, 0x10000, CRC(72b2dab4) SHA1(ff84a04cfe920a0d8105fbbd1f44ee86822cf0d3) ) // "zero" revision - IE: Original version - ROM_LOAD( "el13.9j", 0x20000, 0x10000, CRC(04505acb) SHA1(2220efb277884588859375dab9960f04f07273a7) ) + + ROM_REGION( 0x20000, "mainbank", 0 ) + ROM_LOAD( "el12.7j", 0x00000, 0x10000, CRC(72b2dab4) SHA1(ff84a04cfe920a0d8105fbbd1f44ee86822cf0d3) ) // "zero" revision - IE: Original version + ROM_LOAD( "el13.9j", 0x10000, 0x10000, CRC(04505acb) SHA1(2220efb277884588859375dab9960f04f07273a7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "el10.1f", 0x8000, 0x8000, CRC(62ca5e89) SHA1(b04acaccc58846e0d277868a873a440b7f8071b0) ) @@ -3913,10 +3979,12 @@ ROM_START( cobracomb ) ROM_END ROM_START( cobracomj ) - ROM_REGION( 0x30000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "eh11.5j", 0x08000, 0x08000, CRC(868637e1) SHA1(8b1e3e045e341bb94b1f6c7d89198b22e6c19de7) ) - ROM_LOAD( "eh12.7j", 0x10000, 0x10000, CRC(7c878a83) SHA1(9b2a3083c6dae69626fdab16d97517d30eaa1859) ) - ROM_LOAD( "el13.9j", 0x20000, 0x10000, CRC(04505acb) SHA1(2220efb277884588859375dab9960f04f07273a7) ) + + ROM_REGION( 0x20000, "mainbank", 0 ) + ROM_LOAD( "eh12.7j", 0x00000, 0x10000, CRC(7c878a83) SHA1(9b2a3083c6dae69626fdab16d97517d30eaa1859) ) + ROM_LOAD( "el13.9j", 0x10000, 0x10000, CRC(04505acb) SHA1(2220efb277884588859375dab9960f04f07273a7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "eh10.1f", 0x8000, 0x8000, CRC(62ca5e89) SHA1(b04acaccc58846e0d277868a873a440b7f8071b0) ) @@ -3953,10 +4021,12 @@ ROM_END // main PCB is marked: "LC" on component side ("LC" is the Italian for "Lato Componenti" which translates to "Components Side") // main PCB is marked: "LS" on solder side ("LS" is the Italian for "Lato Saldature" which translates to "Solders Side") ROM_START( cobracomjb ) - ROM_REGION( 0x30000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "cobra4.bin", 0x08000, 0x08000, CRC(868637e1) SHA1(8b1e3e045e341bb94b1f6c7d89198b22e6c19de7) ) - ROM_LOAD( "cobra3.bin", 0x10000, 0x10000, CRC(7c878a83) SHA1(9b2a3083c6dae69626fdab16d97517d30eaa1859) ) - ROM_LOAD( "cobra2.bin", 0x20000, 0x10000, CRC(04505acb) SHA1(2220efb277884588859375dab9960f04f07273a7) ) + + ROM_REGION( 0x20000, "mainbank", 0 ) + ROM_LOAD( "cobra3.bin", 0x00000, 0x10000, CRC(7c878a83) SHA1(9b2a3083c6dae69626fdab16d97517d30eaa1859) ) + ROM_LOAD( "cobra2.bin", 0x10000, 0x10000, CRC(04505acb) SHA1(2220efb277884588859375dab9960f04f07273a7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "cobra5.bin", 0x8000, 0x8000, CRC(62ca5e89) SHA1(b04acaccc58846e0d277868a873a440b7f8071b0) ) diff --git a/src/mame/dataeast/dec8.h b/src/mame/dataeast/dec8.h index 143738d7f1709..a71dba2d363a2 100644 --- a/src/mame/dataeast/dec8.h +++ b/src/mame/dataeast/dec8.h @@ -79,7 +79,7 @@ class dec8_state_base : public driver_device required_shared_ptr m_videoram; optional_shared_ptr m_bg_ram; - std::unique_ptr m_buffered_spriteram16; // for the mxc06 sprite chip emulation (oscar, cobra) + std::unique_ptr m_buffered_spriteram16; // for the mxc06 sprite chip emulation (oscar, cobra) // video-related tilemap_t *m_bg_tilemap = nullptr; @@ -89,6 +89,7 @@ class dec8_state_base : public driver_device // misc bool m_coin_state = false; + u8 m_bank_mask = 0; }; // with I8751 MCU From 534bccf6acb0d5b94251e9ecc6fd00bc241b65ea Mon Sep 17 00:00:00 2001 From: Mike Swanson Date: Sat, 18 Jan 2025 20:50:39 -0800 Subject: [PATCH 69/80] ibm5170_cdrom: NT 3.x floppies, SDKs, resource kits, service packs (#13230) * ibm5170_cdrom: NT 3.x floppies, SDKs, resource kits, service packs Found clean floppy disk images from MSDN sets, so build 528 of NT 3.1 now has a 5.25" floppy disk for CD-ROM based installs. Most translated versions have their floppy disks for CD-ROM based installs added, too. MSDN often contained whatever the latest service pack was at the time a set was made, those discs are here now too. Microsoft was cost-conscious of printing many CDs, so these are often combined with other software. A sole independent Windows NT 3.51 SP4 disc has been found and included here. Were other 3.x service pack CD-ROMs made? Most likely SP5 was, but I have not located one. Were 3.x service packs released on independent CD-ROMs from the MSDN sets? If so, they should replace the entries here. The resource kit CD-ROMs for 3.1, 3.5, 3.51, and 4.0 are all included here. These contain companion software to the "Windows NT Resource Kit" book that was published. Even without the book, many of the utilities prove useful for the operating system. Windows NT 4.0 Service Pack 6 has been replaced by a properly prepared/shipped disc from Microsoft with an autorun installer. New working software list items (ibm5170_cdrom.xml) --------------------------------------------------- Win32 Software Development Kit (version 3.51) [chungy] Win32 Software Development Kit and Device Driver Kit (version 3.1) [chungy] Windows NT 3.1 Service Pack 2 [chungy] Windows NT 3.1 Service Pack 3 [chungy] Windows NT 3.5 Service Pack 2 [chungy] Windows NT 3.51 Service Pack 1 [chungy] Windows NT 3.51 Service Pack 3 [chungy] Windows NT 3.51 Service Pack 4 [chungy] Windows NT Resource Kit (version 3.1) [chungy] Windows NT Resource Kit (version 3.5) [chungy] Windows NT Resource Kit (version 3.51) [chungy] Windows NT Server Resource Kit (version 4.0) [chungy] Windows NT Workstation Resource Kit (version 4.0) [chungy] * hash/ibm5170_cdrom: add NT Option Pack New working software list items (ibm5170_cdrom).xml --------------------------------------------------- Windows NT 4.0 Option Pack [chungy] --- hash/ibm5170_cdrom.xml | 319 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 316 insertions(+), 3 deletions(-) diff --git a/hash/ibm5170_cdrom.xml b/hash/ibm5170_cdrom.xml index a47b713254f2a..0e05daaacade0 100644 --- a/hash/ibm5170_cdrom.xml +++ b/hash/ibm5170_cdrom.xml @@ -7972,11 +7972,16 @@ Installation and Open Circulation CDs are bootable. - + + + + + + @@ -7989,11 +7994,16 @@ Installation and Open Circulation CDs are bootable. - + + + + + + @@ -8079,6 +8089,16 @@ Installation and Open Circulation CDs are bootable. + + + + + + + + + + @@ -8091,6 +8111,16 @@ Installation and Open Circulation CDs are bootable. + + + + + + + + + + @@ -8115,6 +8145,16 @@ Installation and Open Circulation CDs are bootable. + + + + + + + + + + @@ -8127,6 +8167,16 @@ Installation and Open Circulation CDs are bootable. + + + + + + + + + + @@ -8139,6 +8189,16 @@ Installation and Open Circulation CDs are bootable. + + + + + + + + + + @@ -8163,6 +8223,16 @@ Installation and Open Circulation CDs are bootable. + + + + + + + + + + @@ -8175,6 +8245,66 @@ Installation and Open Circulation CDs are bootable. + + + + + + + + + + + + + + + + Windows NT 3.1 Service Pack 2 + 1994 + Microsoft + + + + + + + + + + + + + + + + + + + Windows NT 3.1 Service Pack 3 + 1994 + Microsoft + + + + + + + + + + + + + + @@ -8282,6 +8412,42 @@ Installation and Open Circulation CDs are bootable. + + + + Windows NT 3.5 Service Pack 2 + 1995 + Microsoft + + + + + + + + + + + + + + + + + + + + + + + + + + + + Windows NT Workstation 3.51 (3.51.1057.1) 1995 @@ -8340,6 +8506,48 @@ Installation and Open Circulation CDs are bootable. + + + Windows NT 3.51 Service Pack 1 + 1995 + Microsoft + + + + + + + + + + + + Windows NT 3.51 Service Pack 3 + 1995 + Microsoft + + + + + + + + + + + + Windows NT 3.51 Service Pack 4 + 1996 + Microsoft + + + + + + + + + Windows NT Workstation 4.0 with Service Pack 1 (4.0.1381.2) 1996 @@ -8583,7 +8791,21 @@ Installation and Open Circulation CDs are bootable. - + + + + + + + + Windows NT 4.0 Option Pack + 1998 + Microsoft + + + + + @@ -9657,4 +9879,95 @@ Wave Studio v3.12 + + Win32 Software Development Kit (version 3.51) + 1995 + Microsoft + + + + + + + + + + + + Windows NT Resource Kit (version 3.1) + 1993 + Microsoft + + + + + + + + + + + Win32 Software Development Kit and Device Driver Kit (version 3.1) + 1994 + Microsoft + + + + + + + + + + + Windows NT Resource Kit (version 3.5) + 1994 + Microsoft + + + + + + + + + + + Windows NT Resource Kit (version 3.51) + 1995 + Microsoft + + + + + + + + + + + Windows NT Workstation Resource Kit (version 4.0) + 1996 + Microsoft + + + + + + + + + + + Windows NT Server Resource Kit (version 3.1) + 1996 + Microsoft + + + + + + + + From e7b2c3818eb36e9fb48622df5f9f00828f682326 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Sun, 19 Jan 2025 07:38:45 +0100 Subject: [PATCH 70/80] New working clones ------------------ Egg Venture (Release 4) [Brian Troha, The Dumping Union] - seta/macs.cpp: dumped motherboard PAL [buffi] --- src/mame/ice/lethalj.cpp | 26 +++++++++++++++++++++++++- src/mame/mame.lst | 1 + src/mame/seta/macs.cpp | 17 +++++++++-------- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/mame/ice/lethalj.cpp b/src/mame/ice/lethalj.cpp index 3195cb2d2d57f..9d367fa442b0d 100644 --- a/src/mame/ice/lethalj.cpp +++ b/src/mame/ice/lethalj.cpp @@ -901,7 +901,30 @@ ROM_START( eggventr7 ) ROM_LOAD( "eu18.u18", 0x00000, 0x80000, CRC(cca5dba0) SHA1(9c750256f0cc0ed8847db85df061be3b000b0b25) ) ROM_END -// There is an undumped release 3 when GR5 & GR6 was updated to the .3 versions +// It's not known when GR5 & GR6 were updated to the .3 version, but release 4 still had GR5.2 & GR6.2 ROMs + +ROM_START( eggventr4 ) // Comes from a PCB with an early serial number EV00151, program ROMSs are 27C040 with required data at 0x7ffe0 in each ROM + ROM_REGION16_LE( 0x100000, "maincpu", 0 ) // 34010 code + ROM_LOAD16_BYTE( "ev_vc8.4.vc8", 0x000000, 0x080000, CRC(3348aabb) SHA1(959c6a20e67e7fe0d4505f8af6433bf7207f3656) ) // Labeled as EV VC8.4 + ROM_LOAD16_BYTE( "ev_vc9.4.vc9", 0x000001, 0x080000, CRC(c699178f) SHA1(192b770966db5e534eccb60b4632d392dbba3721) ) // Labeled as EV VC9.4 + + ROM_REGION16_LE( 0x600000, "gfx", 0 ) // graphics data + ROM_LOAD16_BYTE( "egr1.gr1", 0x000000, 0x100000, CRC(f73f80d9) SHA1(6278b45579a256b9576ba6d4f5a15fab26797c3d) ) + ROM_LOAD16_BYTE( "egr2.gr2", 0x000001, 0x100000, CRC(3a9ba910) SHA1(465aa3119af103aa65b25042b3572fdcb9c1887a) ) + ROM_LOAD16_BYTE( "egr4.gr4", 0x200000, 0x100000, CRC(4ea5900e) SHA1(20341337ee3c6c22580c52312156b818f4187693) ) + ROM_LOAD16_BYTE( "egr3.gr3", 0x200001, 0x100000, CRC(3f8dfc73) SHA1(83a168069f896ea7e67a97c6d591d09b19d5f486) ) + ROM_LOAD16_BYTE( "ev_gr6.2.gr6", 0x400000, 0x100000, CRC(a4d9d126) SHA1(d5f2bc4bfa7c0462865907dbc39fc0479340e1c8) ) // Labeled as EV GR6.2 - verified correct for release 4 + ROM_LOAD16_BYTE( "ev_gr5.2.gr5", 0x400001, 0x100000, CRC(b5162234) SHA1(3f05c7eb5b00805eb7fc1e3634dea29b1ce3af62) ) // Labeled as EV GR5.2 - verified correct for release 4 + + ROM_REGION( 0x80000, "oki1", 0 ) // sound data + ROM_LOAD( "eu20.u20", 0x00000, 0x80000, CRC(cca5dba0) SHA1(9c750256f0cc0ed8847db85df061be3b000b0b25) ) + + ROM_REGION( 0x80000, "oki2", 0 ) // sound data + ROM_LOAD( "eu21.u21", 0x00000, 0x80000, CRC(cca5dba0) SHA1(9c750256f0cc0ed8847db85df061be3b000b0b25) ) + + ROM_REGION( 0x80000, "oki3", 0 ) // sound data + ROM_LOAD( "eu18.u18", 0x00000, 0x80000, CRC(cca5dba0) SHA1(9c750256f0cc0ed8847db85df061be3b000b0b25) ) +ROM_END ROM_START( eggventr2 ) // Comes from a PCB with an early serial number EV00123, program roms are 27C040 with required data at 0x7ffe0 in each rom ROM_REGION16_LE( 0x100000, "maincpu", 0 ) // 34010 code @@ -1218,6 +1241,7 @@ GAME( 1996, franticfa, franticf, franticf, franticfa, lethalj_state, empty_init, GAME( 1997, eggventr, 0, gameroom, eggventr, lethalj_state, empty_init, ROT0, "ICE / The Game Room", "Egg Venture (Release 10)", 0 ) GAME( 1997, eggventr8, eggventr, gameroom, eggventr, lethalj_state, empty_init, ROT0, "ICE / The Game Room", "Egg Venture (Release 8)", 0 ) GAME( 1997, eggventr7, eggventr, gameroom, eggventr, lethalj_state, empty_init, ROT0, "ICE / The Game Room", "Egg Venture (Release 7)", 0 ) +GAME( 1997, eggventr4, eggventr, gameroom, eggventr2, lethalj_state, empty_init, ROT0, "ICE / The Game Room", "Egg Venture (Release 4)", 0 ) GAME( 1997, eggventr2, eggventr, gameroom, eggventr2, lethalj_state, empty_init, ROT0, "ICE / The Game Room", "Egg Venture (Release 2)", 0 ) GAME( 1997, eggventr1, eggventr, gameroom, eggventr, lethalj_state, empty_init, ROT0, "Kyle Hodgetts / The Game Room", "Egg Venture (Release 1)", 0 ) GAME( 1997, eggventra, eggventr, gameroom, eggventr, lethalj_state, empty_init, ROT0, "The Game Room (A.L. Australia license)", "Egg Venture (A.L. Release)", 0 ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 4e5376744bc06..7e40f62d5608e 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -20119,6 +20119,7 @@ cfarm // (c) 1999 LAI Games eggventr // (c) 1997 The Game Room eggventr1 // (c) 1997 The Game Room eggventr2 // (c) 1997 The Game Room +eggventr4 // (c) 1997 The Game Room eggventr7 // (c) 1997 The Game Room eggventr8 // (c) 1997 The Game Room eggventra // (c) 1997 The Game Room (Allied Leisure license) diff --git a/src/mame/seta/macs.cpp b/src/mame/seta/macs.cpp index 990bd5ea9c4d4..bac528e5da0b9 100644 --- a/src/mame/seta/macs.cpp +++ b/src/mame/seta/macs.cpp @@ -499,7 +499,7 @@ uint8_t macs_state::dma_offset() void macs_state::macs(machine_config &config) { /* basic machine hardware */ - ST0016_CPU(config, m_maincpu, 8000000); // 8 MHz ? + ST0016_CPU(config, m_maincpu, 42.954545_MHz_XTAL / 6); // divider not verified m_maincpu->set_memory_map(&macs_state::macs_mem); m_maincpu->set_io_map(&macs_state::macs_io); m_maincpu->set_dma_offs_callback(FUNC(macs_state::dma_offset)); @@ -522,19 +522,20 @@ void macs_state::macs(machine_config &config) slot_b.set_default_option("rom"); slot_b.set_user_loadable(false); - // TODO: Mono? - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); + // confirmed mono + SPEAKER(config, "speaker").front_center(); - m_maincpu->add_route(0, "lspeaker", 1.0); - m_maincpu->add_route(1, "rspeaker", 1.0); + m_maincpu->add_route(0, "speaker", 1.0); } #define MACS_BIOS \ ROM_REGION( 0x1000000, "bios", 0 ) \ - ROM_LOAD16_BYTE( "macsos_l.u43", 0x00000, 0x80000, CRC(0b5aed5e) SHA1(042e705017ee34656e2c6af45825bb2dd3447747) ) \ - ROM_LOAD16_BYTE( "macsos_h.u44", 0x00001, 0x80000, CRC(538b68e4) SHA1(a0534147791e94e726f49451d0e95671ae0a87d5) ) + ROM_LOAD16_BYTE( "am_macs_os_low.u43", 0x00000, 0x80000, CRC(0b5aed5e) SHA1(042e705017ee34656e2c6af45825bb2dd3447747) ) \ + ROM_LOAD16_BYTE( "am_macs_os_hi.u44", 0x00001, 0x80000, CRC(538b68e4) SHA1(a0534147791e94e726f49451d0e95671ae0a87d5) ) \ +\ + ROM_REGION( 0x157, "pld", 0 ) \ + ROM_LOAD( "sx011-01.bin", 0x000, 0x157, CRC(669096c1) SHA1(36f55a2e4865bdf0506746a4df51bfb1944f905e) ) // GAL20V8B #define MACS2_BIOS \ ROM_REGION( 0x1000000, "bios", 0 ) \ From 9aa85a7cb9ce1daad2ef5727ae331158c25c78c6 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Sun, 19 Jan 2025 07:51:24 +0100 Subject: [PATCH 71/80] philips/cdi.cpp: removed quizardi_10 set, as the 1.0 CD doesn't support Italian language --- src/mame/mame.lst | 1 - src/mame/philips/cdi.cpp | 7 ------- 2 files changed, 8 deletions(-) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 7e40f62d5608e..434c639c2d100 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -36593,7 +36593,6 @@ quizard_10 // (c) TAB Austria 1996 quizard_12 // (c) TAB Austria 1996 quizard_17 // (c) TAB Austria 1996 quizardi // (c) TAB Austria 199? -quizardi_10 // (c) TAB Austria 1996 quizardi_12 // (c) TAB Austria 1996 quizardi_17 // (c) TAB Austria 1996 quizard2 // (c) TAB Austria 1995 diff --git a/src/mame/philips/cdi.cpp b/src/mame/philips/cdi.cpp index 1bf25ae6ca603..84b8d34065439 100644 --- a/src/mame/philips/cdi.cpp +++ b/src/mame/philips/cdi.cpp @@ -780,12 +780,6 @@ ROM_START( quizardi_12 ) QUIZARD1_MCU_IT ROM_END -ROM_START( quizardi_10 ) - QUIZARD_BIOS_ROM - QUIZARD1_CHD_10 - QUIZARD1_MCU_IT -ROM_END - //******************************************************** // Quizard 2 //******************************************************** @@ -924,7 +918,6 @@ GAME( 1995, quizard_10, quizard, quizard, quizard, quizard_state, empty GAME( 1995, quizardi, quizard, quizard, quizard, quizard_state, empty_init, ROT0, "TAB Austria", "Quizard (v1.8, Italian, i8751 IT 11 I2)", MACHINE_IMPERFECT_SOUND ) GAME( 1995, quizardi_17, quizard, quizard, quizard, quizard_state, empty_init, ROT0, "TAB Austria", "Quizard (v1.7, Italian, i8751 IT 11 I2)", MACHINE_IMPERFECT_SOUND ) GAME( 1995, quizardi_12, quizard, quizard, quizard, quizard_state, empty_init, ROT0, "TAB Austria", "Quizard (v1.2, Italian, i8751 IT 11 I2)", MACHINE_IMPERFECT_SOUND ) -GAME( 1995, quizardi_10, quizard, quizard, quizard, quizard_state, empty_init, ROT0, "TAB Austria", "Quizard (v1.0, Italian, i8751 IT 11 I2)", MACHINE_IMPERFECT_SOUND ) GAME( 1995, quizard2, cdibios, quizard, quizard, quizard_state, empty_init, ROT0, "TAB Austria", "Quizard 2 (v2.3, German, i8751 DN 122 D3)", MACHINE_IMPERFECT_SOUND ) GAME( 1995, quizard2_22, quizard2, quizard, quizard, quizard_state, empty_init, ROT0, "TAB Austria", "Quizard 2 (v2.2, German, i8751 DN 122 D3)", MACHINE_IMPERFECT_SOUND ) From cf1d2eef0ae109c7c648eabbbf5fc460bf9fa8ae Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Sun, 19 Jan 2025 10:12:28 +0100 Subject: [PATCH 72/80] konami/zr107.cpp and some related devices: initialized some variables --- src/mame/konami/k001005.cpp | 19 +++++++++++++++++ src/mame/konami/k054156_k054157_k056832.cpp | 2 +- src/mame/konami/konppc.cpp | 3 +++ src/mame/konami/zr107.cpp | 23 ++++++++++++--------- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/mame/konami/k001005.cpp b/src/mame/konami/k001005.cpp index 46e61427fd885..552ededb3e671 100644 --- a/src/mame/konami/k001005.cpp +++ b/src/mame/konami/k001005.cpp @@ -36,6 +36,25 @@ k001005_renderer::k001005_renderer(device_t &parent, screen_device &screen, devi m_3dfifo = std::make_unique(0x10000); m_3dfifo_ptr = 0; m_fb_page = 0; + m_light_r = 0; + m_light_g = 0; + m_light_b = 0; + m_ambient_r = 0; + m_ambient_g = 0; + m_ambient_b = 0; + m_fog_r = 0; + m_fog_g = 0; + m_fog_b = 0; + m_far_z = 0; + m_fog_start_z = 0; + m_fog_end_z = 0; + m_reg_fog_start = 0; + m_viewport_min_x = 0; + m_viewport_max_x = 0; + m_viewport_min_y = 0; + m_viewport_max_y = 0; + m_viewport_center_x = 0; + m_viewport_center_y = 0; m_cliprect = rectangle(0, width-1, 0, height-1); diff --git a/src/mame/konami/k054156_k054157_k056832.cpp b/src/mame/konami/k054156_k054157_k056832.cpp index 0b70695b9de33..dfa835f4ec22a 100644 --- a/src/mame/konami/k054156_k054157_k056832.cpp +++ b/src/mame/konami/k054156_k054157_k056832.cpp @@ -211,7 +211,6 @@ k056832_device::k056832_device(const machine_config &mconfig, const char *tag, d //m_line_dirty[K056832_PAGE_COUNT][8], //m_all_lines_dirty[K056832_PAGE_COUNT], //m_page_tile_mode[K056832_PAGE_COUNT], - //m_last_colorbase[K056832_PAGE_COUNT], //m_layer_tile_mode[8], m_default_layer_association(0), m_layer_association(0), @@ -224,6 +223,7 @@ k056832_device::k056832_device(const machine_config &mconfig, const char *tag, d m_cur_tile_bank(0), m_k055555(*this, finder_base::DUMMY_TAG) { + std::fill(std::begin(m_last_colorbase), std::end(m_last_colorbase), 0); } void k056832_device::create_tilemaps() diff --git a/src/mame/konami/konppc.cpp b/src/mame/konami/konppc.cpp index c372c29e856a1..331be121e5fa0 100644 --- a/src/mame/konami/konppc.cpp +++ b/src/mame/konami/konppc.cpp @@ -33,6 +33,9 @@ void konppc_device::device_start() for (i=0; i < num_cgboards; i++) { dsp_comm_ppc[i][0] = 0x00; + dsp_comm_ppc[i][1] = 0x00; + dsp_comm_sharc[i][0] = 0x00; + dsp_comm_sharc[i][1] = 0x00; dsp_shared_ram[i] = std::make_unique(DSP_BANK_SIZE * 2/4); dsp_shared_ram_bank[i] = 0; diff --git a/src/mame/konami/zr107.cpp b/src/mame/konami/zr107.cpp index 607b0e50ec672..037c26f75076c 100644 --- a/src/mame/konami/zr107.cpp +++ b/src/mame/konami/zr107.cpp @@ -169,21 +169,24 @@ Check drivers/gticlub.cpp for details on the bottom board. */ #include "emu.h" + +#include "k001005.h" +#include "k001006.h" +#include "k001604.h" +#include "k054156_k054157_k056832.h" +#include "konami_helper.h" +#include "konppc.h" + #include "cpu/m68000/m68000.h" #include "cpu/powerpc/ppc.h" #include "cpu/sharc/sharc.h" #include "machine/adc083x.h" #include "machine/eepromser.h" #include "machine/k056230.h" -#include "konppc.h" #include "machine/watchdog.h" #include "sound/k054539.h" #include "sound/k056800.h" -#include "k001005.h" -#include "k001006.h" -#include "k001604.h" -#include "k054156_k054157_k056832.h" -#include "konami_helper.h" + #include "emupal.h" #include "speaker.h" @@ -238,10 +241,10 @@ class zr107_state : public driver_device required_shared_ptr m_sharc_dataram; required_device m_konppc; - int m_ccu_vcth; - int m_ccu_vctl; - uint8_t m_sound_ctrl; - uint8_t m_sound_intck; + int m_ccu_vcth = 0; + int m_ccu_vctl = 0; + uint8_t m_sound_ctrl = 0; + uint8_t m_sound_intck = 0; uint8_t sysreg_r(offs_t offset); void sysreg_w(offs_t offset, uint8_t data); From 5dd883a3bd67e556fb8b5668e0435079240fce89 Mon Sep 17 00:00:00 2001 From: Vincent-Halver Date: Sun, 19 Jan 2025 01:31:49 -0800 Subject: [PATCH 73/80] CD-i: Fix RLE (#13243) This change: 1. Fixes RLE encoding which was short by 50% 2. Simplifies code, reducing by >100 lines. 3. Renames Channel to Path to match the Green Book spec. 4. Adds TODO for QHY DYUV images. This image type can't be tested without 625 scanline resolution which is currently blocked. So this will remain a known gap until several other features are added. --- src/mame/philips/mcd212.cpp | 512 ++++++++++++++---------------------- src/mame/philips/mcd212.h | 32 +-- 2 files changed, 208 insertions(+), 336 deletions(-) diff --git a/src/mame/philips/mcd212.cpp b/src/mame/philips/mcd212.cpp index 29f041e7a5a58..edebc8145bb22 100644 --- a/src/mame/philips/mcd212.cpp +++ b/src/mame/philips/mcd212.cpp @@ -17,7 +17,7 @@ TODO: -- Unknown yet. +- QHY DYUV Image Decoder *******************************************************************************/ @@ -213,7 +213,7 @@ void mcd212_device::update_region_arrays() } } -template +template void mcd212_device::set_register(uint8_t reg, uint32_t value) { switch (reg) @@ -227,96 +227,96 @@ void mcd212_device::set_register(uint8_t reg, uint32_t value) case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7: case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf: { - const uint8_t clut_index = m_clut_bank[Channel] * 0x40 + (reg - 0x80); - LOGMASKED(LOG_CLUT, "%s: Channel %d: CLUT[%d] = %08x\n", machine().describe_context(), Channel, clut_index, value); + const uint8_t clut_index = m_clut_bank[Path] * 0x40 + (reg - 0x80); + LOGMASKED(LOG_CLUT, "%s: Path %d: CLUT[%d] = %08x\n", machine().describe_context(), Path, clut_index, value); m_clut[clut_index] = value & 0x00fcfcfc; } break; case 0xc0: // Image Coding Method - if (Channel == 0) + if (Path == 0) { - LOGMASKED(LOG_REGISTERS, "%s: Channel 0: Image Coding Method = %08x\n", machine().describe_context(), value); + LOGMASKED(LOG_REGISTERS, "%s: Path 0: Image Coding Method = %08x\n", machine().describe_context(), value); m_image_coding_method = value; } break; case 0xc1: // Transparency Control - if (Channel == 0) + if (Path == 0) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 0: Transparency Control = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 0: Transparency Control = %08x\n", machine().describe_context(), screen().vpos(), value); m_transparency_control = value; } break; case 0xc2: // Plane Order - if (Channel == 0) + if (Path == 0) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 0: Plane Order = %08x\n", machine().describe_context(), screen().vpos(), value & 7); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 0: Plane Order = %08x\n", machine().describe_context(), screen().vpos(), value & 7); m_plane_order = value & 0x00000007; } break; case 0xc3: // CLUT Bank Register - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel %d: CLUT Bank Register = %08x\n", machine().describe_context(), screen().vpos(), Channel, value & 3); - m_clut_bank[Channel] = Channel ? (2 | (value & 0x00000001)) : (value & 0x00000003); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path %d: CLUT Bank Register = %08x\n", machine().describe_context(), screen().vpos(), Path, value & 3); + m_clut_bank[Path] = Path ? (2 | (value & 0x00000001)) : (value & 0x00000003); break; case 0xc4: // Transparent Color A - if (Channel == 0) + if (Path == 0) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 0: Transparent Color A = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 0: Transparent Color A = %08x\n", machine().describe_context(), screen().vpos(), value); m_transparent_color[0] = value & 0x00fcfcfc; } break; case 0xc6: // Transparent Color B - if (Channel == 1) + if (Path == 1) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 1: Transparent Color B = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 1: Transparent Color B = %08x\n", machine().describe_context(), screen().vpos(), value); m_transparent_color[1] = value & 0x00fcfcfc; } break; case 0xc7: // Mask Color A - if (Channel == 0) + if (Path == 0) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 0: Mask Color A = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 0: Mask Color A = %08x\n", machine().describe_context(), screen().vpos(), value); m_mask_color[0] = value & 0x00fcfcfc; } break; case 0xc9: // Mask Color B - if (Channel == 1) + if (Path == 1) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 1: Mask Color B = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 1: Mask Color B = %08x\n", machine().describe_context(), screen().vpos(), value); m_mask_color[1] = value & 0x00fcfcfc; } break; case 0xca: // Delta YUV Absolute Start Value A - if (Channel == 0) + if (Path == 0) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 0: Delta YUV Absolute Start Value A = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 0: Delta YUV Absolute Start Value A = %08x\n", machine().describe_context(), screen().vpos(), value); m_dyuv_abs_start[0] = value; } break; case 0xcb: // Delta YUV Absolute Start Value B - if (Channel == 1) + if (Path == 1) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 1: Delta YUV Absolute Start Value B = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 1: Delta YUV Absolute Start Value B = %08x\n", machine().describe_context(), screen().vpos(), value); m_dyuv_abs_start[1] = value; } break; case 0xcd: // Cursor Position - if (Channel == 0) + if (Path == 0) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 0: Cursor Position = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 0: Cursor Position = %08x\n", machine().describe_context(), screen().vpos(), value); m_cursor_position = value; } break; case 0xce: // Cursor Control - if (Channel == 0) + if (Path == 0) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 0: Cursor Control = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 0: Cursor Control = %08x\n", machine().describe_context(), screen().vpos(), value); m_cursor_control = value; } break; case 0xcf: // Cursor Pattern - if (Channel == 0) + if (Path == 0) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 0: Cursor Pattern[%d] = %04x\n", machine().describe_context(), screen().vpos(), (value >> 16) & 0x000f, value & 0x0000ffff); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 0: Cursor Pattern[%d] = %04x\n", machine().describe_context(), screen().vpos(), (value >> 16) & 0x000f, value & 0x0000ffff); m_cursor_pattern[(value >> 16) & 0x000f] = value & 0x0000ffff; } break; @@ -328,43 +328,43 @@ void mcd212_device::set_register(uint8_t reg, uint32_t value) case 0xd5: case 0xd6: case 0xd7: - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel %d: Region Control %d = %08x\n", machine().describe_context(), screen().vpos(), Channel, reg & 7, value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path %d: Region Control %d = %08x\n", machine().describe_context(), screen().vpos(), Path, reg & 7, value); m_region_control[reg & 7] = value; update_region_arrays(); break; case 0xd8: // Backdrop Color - if (Channel == 0) + if (Path == 0) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 0: Backdrop Color = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 0: Backdrop Color = %08x\n", machine().describe_context(), screen().vpos(), value); m_backdrop_color = value; } break; case 0xd9: // Mosaic Pixel Hold Factor A - if (Channel == 0) + if (Path == 0) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 0: Mosaic Pixel Hold Factor A = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 0: Mosaic Pixel Hold Factor A = %08x\n", machine().describe_context(), screen().vpos(), value); m_mosaic_hold[0] = value; } break; case 0xda: // Mosaic Pixel Hold Factor B - if (Channel == 1) + if (Path == 1) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 1: Mosaic Pixel Hold Factor B = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 1: Mosaic Pixel Hold Factor B = %08x\n", machine().describe_context(), screen().vpos(), value); m_mosaic_hold[1] = value; } break; case 0xdb: // Weight Factor A - if (Channel == 0) + if (Path == 0) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 0: Weight Factor A = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 0: Weight Factor A = %08x\n", machine().describe_context(), screen().vpos(), value); m_weight_factor[0][0] = (uint8_t)value; update_region_arrays(); } break; case 0xdc: // Weight Factor B - if (Channel == 1) + if (Path == 1) { - LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Channel 1: Weight Factor B = %08x\n", machine().describe_context(), screen().vpos(), value); + LOGMASKED(LOG_REGISTERS, "%s: Scanline %d, Path 1: Weight Factor B = %08x\n", machine().describe_context(), screen().vpos(), value); m_weight_factor[1][0] = (uint8_t)value; update_region_arrays(); } @@ -372,41 +372,41 @@ void mcd212_device::set_register(uint8_t reg, uint32_t value) } } -template +template inline ATTR_FORCE_INLINE uint32_t mcd212_device::get_vsr() { - return ((m_dcr[Channel] & 0x3f) << 16) | m_vsr[Channel]; + return ((m_dcr[Path] & 0x3f) << 16) | m_vsr[Path]; } -template +template inline ATTR_FORCE_INLINE void mcd212_device::set_vsr(uint32_t value) { - m_vsr[Channel] = value & 0x0000ffff; - m_dcr[Channel] &= 0xffc0; - m_dcr[Channel] |= (value >> 16) & 0x003f; + m_vsr[Path] = value & 0x0000ffff; + m_dcr[Path] &= 0xffc0; + m_dcr[Path] |= (value >> 16) & 0x003f; } -template +template inline ATTR_FORCE_INLINE void mcd212_device::set_dcp(uint32_t value) { - m_dcp[Channel] = value & 0x0000ffff; - m_ddr[Channel] &= 0xffc0; - m_ddr[Channel] |= (value >> 16) & 0x003f; + m_dcp[Path] = value & 0x0000ffff; + m_ddr[Path] &= 0xffc0; + m_ddr[Path] |= (value >> 16) & 0x003f; } -template +template inline ATTR_FORCE_INLINE uint32_t mcd212_device::get_dcp() { - return ((m_ddr[Channel] & 0x3f) << 16) | m_dcp[Channel]; + return ((m_ddr[Path] & 0x3f) << 16) | m_dcp[Path]; } -template +template inline ATTR_FORCE_INLINE void mcd212_device::set_display_parameters(uint8_t value) { - m_ddr[Channel] &= 0xf0ff; - m_ddr[Channel] |= (value & 0x0f) << 8; - m_dcr[Channel] &= 0xf7ff; - m_dcr[Channel] |= (value & 0x10) << 7; + m_ddr[Path] &= 0xf0ff; + m_ddr[Path] |= (value & 0x0f) << 8; + m_dcr[Path] &= 0xf7ff; + m_dcr[Path] |= (value & 0x10) << 7; } int mcd212_device::get_screen_width() @@ -425,10 +425,10 @@ int mcd212_device::get_border_width() return width; } -template +template void mcd212_device::process_ica() { - uint16_t *ica = Channel ? m_planeb.target() : m_planea.target(); + uint16_t *ica = Path ? m_planeb.target() : m_planea.target(); uint32_t addr = 0x200; uint32_t cmd = 0; @@ -441,63 +441,63 @@ void mcd212_device::process_ica() { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: // STOP case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: STOP\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel ); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: STOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); return; case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: // NOP case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: NOP\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel ); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: NOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); break; case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: // RELOAD DCP case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD DCP: %06x\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel, cmd & 0x001fffff ); - set_dcp(cmd & 0x003ffffc); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD DCP: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff ); + set_dcp(cmd & 0x003ffffc); break; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: // RELOAD DCP and STOP case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD DCP and STOP: %06x\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel, cmd & 0x001fffff ); - set_dcp(cmd & 0x003ffffc); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD DCP and STOP: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff ); + set_dcp(cmd & 0x003ffffc); return; case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: // RELOAD VSR (ICA) case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: case 0x4e: case 0x4f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD VSR: %06x\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel, cmd & 0x001fffff ); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD VSR: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff ); addr = (cmd & 0x0007ffff) / 2; break; case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: // RELOAD VSR and STOP case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD VSR and STOP: VSR = %05x\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel, cmd & 0x001fffff ); - set_vsr(cmd & 0x003fffff); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD VSR and STOP: VSR = %05x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff ); + set_vsr(cmd & 0x003fffff); return; case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: // INTERRUPT case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: INTERRUPT\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel ); - m_csrr[1] |= 1 << (2 - Channel); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: INTERRUPT\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + m_csrr[1] |= 1 << (2 - Path); if (m_csrr[1] & (CSR2R_IT1 | CSR2R_IT2)) m_int_callback(ASSERT_LINE); break; case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: // RELOAD DISPLAY PARAMETERS - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD DISPLAY PARAMETERS\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel ); - set_display_parameters(cmd & 0x1f); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD DISPLAY PARAMETERS\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + set_display_parameters(cmd & 0x1f); break; default: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: SET REGISTER %02x = %06x\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel, cmd >> 24, cmd & 0x00ffffff ); - set_register(cmd >> 24, cmd & 0x00ffffff); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: SET REGISTER %02x = %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd >> 24, cmd & 0x00ffffff ); + set_register(cmd >> 24, cmd & 0x00ffffff); break; } } } -template +template void mcd212_device::process_dca() { - uint16_t *dca = Channel ? m_planeb.target() : m_planea.target(); - uint32_t addr = (m_dca[Channel] & 0x0007ffff) / 2; + uint16_t *dca = Path ? m_planeb.target() : m_planea.target(); + uint32_t addr = (m_dca[Path] & 0x0007ffff) / 2; uint32_t cmd = 0; uint32_t count = 0; uint32_t max = 64; bool addr_changed = false; bool processing = true; - LOGMASKED(LOG_DCA, "Scanline %d: Processing DCA %d\n", screen().vpos(), Channel ); + LOGMASKED(LOG_DCA, "Scanline %d: Processing DCA %d\n", screen().vpos(), Path ); while (processing && count < max) { @@ -508,47 +508,47 @@ void mcd212_device::process_dca() { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: // STOP case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: STOP\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel ); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: STOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); processing = false; break; case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: // NOP case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: NOP\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel ); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: NOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); break; case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: // RELOAD DCP case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD DCP (NOP)\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel ); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD DCP (NOP)\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); break; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: // RELOAD DCP and STOP case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD DCP and STOP\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel ); - set_dcp(cmd & 0x003ffffc); - m_dca[Channel] = cmd & 0x0007fffc; + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD DCP and STOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + set_dcp(cmd & 0x003ffffc); + m_dca[Path] = cmd & 0x0007fffc; return; case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: // RELOAD VSR case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: case 0x4e: case 0x4f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD VSR: %06x\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel, cmd & 0x001fffff ); - set_vsr(cmd & 0x003fffff); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD VSR: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff ); + set_vsr(cmd & 0x003fffff); break; case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: // RELOAD VSR and STOP case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD VSR and STOP: %06x\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel, cmd & 0x001fffff ); - set_vsr(cmd & 0x003fffff); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD VSR and STOP: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff ); + set_vsr(cmd & 0x003fffff); processing = false; break; case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: // INTERRUPT case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: INTERRUPT\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel ); - m_csrr[1] |= 1 << (2 - Channel); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: INTERRUPT\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + m_csrr[1] |= 1 << (2 - Path); if (m_csrr[1] & (CSR2R_IT1 | CSR2R_IT2)) m_int_callback(ASSERT_LINE); break; case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: // RELOAD DISPLAY PARAMETERS - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD DISPLAY PARAMETERS\n", (addr - 2) * 2 + Channel * 0x200000, cmd, Channel ); - set_display_parameters(cmd & 0x1f); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD DISPLAY PARAMETERS\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + set_display_parameters(cmd & 0x1f); break; default: - set_register(cmd >> 24, cmd & 0x00ffffff); + set_register(cmd >> 24, cmd & 0x00ffffff); break; } } @@ -558,10 +558,10 @@ void mcd212_device::process_dca() addr += (max - count) >> 1; } - m_dca[Channel] = addr * 2; + m_dca[Path] = addr * 2; } -template +template static inline uint8_t BYTE_TO_CLUT(int icm, uint8_t byte) { switch (icm) @@ -569,7 +569,7 @@ static inline uint8_t BYTE_TO_CLUT(int icm, uint8_t byte) case 1: return byte; case 3: - if (Channel == 1) + if (Path == 1) { return 0x80 + (byte & 0x7f); } @@ -578,13 +578,13 @@ static inline uint8_t BYTE_TO_CLUT(int icm, uint8_t byte) return byte & 0x7f; } case 4: - if (Channel == 0) + if (Path == 0) { return byte & 0x7f; } break; case 11: - if (Channel == 1) + if (Path == 1) { return 0x80 + (byte & 0x0f); } @@ -598,275 +598,147 @@ static inline uint8_t BYTE_TO_CLUT(int icm, uint8_t byte) return 0; } -template +template inline ATTR_FORCE_INLINE uint8_t mcd212_device::get_transparency_control() { - return (m_transparency_control >> (Channel ? 8 : 0)) & 0x0f; + return (m_transparency_control >> (Path ? 8 : 0)) & 0x0f; } -template +template inline ATTR_FORCE_INLINE uint8_t mcd212_device::get_icm() { - const uint32_t mask = Channel ? ICM_MODE2 : ICM_MODE1; - const uint32_t shift = Channel ? ICM_MODE2_SHIFT : ICM_MODE1_SHIFT; + const uint32_t mask = Path ? ICM_MODE2 : ICM_MODE1; + const uint32_t shift = Path ? ICM_MODE2_SHIFT : ICM_MODE1_SHIFT; return (m_image_coding_method & mask) >> shift; } -template +template inline ATTR_FORCE_INLINE bool mcd212_device::get_mosaic_enable() { - return (m_ddr[Channel] & DDR_FT) == DDR_FT_MOSAIC; + return (m_ddr[Path] & DDR_FT) == DDR_FT_MOSAIC; } -template +template inline ATTR_FORCE_INLINE uint8_t mcd212_device::get_mosaic_factor() { - return 1 << (((m_ddr[Channel] & DDR_MT) >> DDR_MT_SHIFT) + 1); + return 1 << (((m_ddr[Path] & DDR_MT) >> DDR_MT_SHIFT) + 1); } -template +template int mcd212_device::get_plane_width() { const int width = get_screen_width(); - const uint8_t icm = get_icm(); + const uint8_t icm = get_icm(); if (icm == ICM_CLUT4) return width; return width >> 1; } -template -void mcd212_device::process_vsr(uint32_t *pixels, bool *transparent) +template +void mcd212_device::process_vsr(uint32_t* pixels, bool* transparent) { - const uint8_t *data = reinterpret_cast(Channel ? m_planeb.target() : m_planea.target()); - const uint8_t icm = get_icm(); - const uint8_t transp_ctrl = get_transparency_control(); - const int width = get_plane_width(); + const uint8_t* data = reinterpret_cast(Path ? m_planeb.target() : m_planea.target()); + const uint8_t icm = get_icm(); + const uint8_t transp_ctrl = get_transparency_control(); + const int width = get_screen_width(); - uint32_t vsr = get_vsr(); + uint32_t vsr = get_vsr(); - if (transp_ctrl == TCR_COND_1) + if (transp_ctrl == TCR_COND_1 || !icm || !vsr) { - std::fill_n(pixels, get_screen_width(), 0x00101010); + std::fill_n(pixels, get_screen_width(), s_4bpp_color[0]); std::fill_n(transparent, get_screen_width(), true); return; } - if (!icm || !vsr) - { - std::fill_n(pixels, get_screen_width(), 0x00101010); - return; - } + const uint32_t decodingMode = m_ddr[Path] & DDR_FT; - const uint8_t mosaic_enable = get_mosaic_enable(); - const uint8_t mosaic_factor = get_mosaic_factor(); + const uint8_t mosaic_enable = get_mosaic_enable(); + const uint8_t mosaic_factor = get_mosaic_factor(); - const uint32_t dyuv_abs_start = m_dyuv_abs_start[Channel]; + const uint32_t dyuv_abs_start = m_dyuv_abs_start[Path]; uint8_t y = (dyuv_abs_start >> 16) & 0x000000ff; - uint8_t u = (dyuv_abs_start >> 8) & 0x000000ff; - uint8_t v = (dyuv_abs_start >> 0) & 0x000000ff; + uint8_t u = (dyuv_abs_start >> 8) & 0x000000ff; + uint8_t v = (dyuv_abs_start >> 0) & 0x000000ff; - const uint32_t transparent_color = m_transparent_color[Channel]; + const uint32_t mask_bits = (~m_mask_color[Path]) & 0x00fcfcfc; + const uint32_t transp_match = m_transparent_color[Path] & mask_bits; const uint8_t transp_ctrl_masked = transp_ctrl & 0x07; const bool transp_always = (transp_ctrl_masked == TCR_COND_1); const bool invert_transp_condition = BIT(transp_ctrl, 3); const int region_flag_index = 1 - (transp_ctrl_masked & 1); - const bool *region_flags = m_region_flag[region_flag_index]; + const bool* region_flags = m_region_flag[region_flag_index]; const bool use_region_flag = (transp_ctrl_masked >= TCR_COND_RF0_1 && transp_ctrl_masked <= TCR_COND_RF1KEY_1); bool use_color_key = (transp_ctrl_masked == TCR_COND_KEY_1 || transp_ctrl_masked == TCR_COND_RF0KEY_1 || transp_ctrl_masked == TCR_COND_RF1KEY_1); - bool done = false; - int x = 0; - - LOGMASKED(LOG_VSR, "Scanline %d: VSR Channel %d, ICM (%02x), VSR (%08x)\n", screen().vpos(), Channel, icm, vsr); + LOGMASKED(LOG_VSR, "Scanline %d: VSR Path %d, ICM (%02x), VSR (%08x)\n", screen().vpos(), Path, icm, vsr); - while (!done) + for (uint32_t x = 0; x < width; ) { - uint8_t byte = data[(vsr & 0x0007ffff) ^ 1]; - LOGMASKED(LOG_VSR, "Scanline %d: Chan %d: VSR[%05x] = %02x\n", screen().vpos(), Channel, (vsr & 0x0007ffff), byte); - vsr++; - switch (m_ddr[Channel] & DDR_FT) + const uint8_t byte = data[(vsr++ & 0x0007ffff) ^ 1]; + uint32_t color0 = 0; + uint32_t color1 = 0; + if (icm == ICM_DYUV) { - case DDR_FT_BMP: - case DDR_FT_BMP2: - case DDR_FT_MOSAIC: - if ((m_ddr[Channel] & DDR_FT) == DDR_FT_BMP) - { - LOGMASKED(LOG_VSR, "Scanline %d: Chan %d: BMP\n", screen().vpos(), Channel); - } - else if ((m_ddr[Channel] & DDR_FT) == DDR_FT_BMP2) - { - LOGMASKED(LOG_VSR, "Scanline %d: Chan %d: BMP2\n", screen().vpos(), Channel); - } - else if ((m_ddr[Channel] & DDR_FT) == DDR_FT_MOSAIC) - { - LOGMASKED(LOG_VSR, "Scanline %d: Chan %d: MOSAIC\n", screen().vpos(), Channel); - } - - if (icm == ICM_DYUV) - { - use_color_key = false; - - LOGMASKED(LOG_VSR, "Scanline %d: Chan %d: DYUV\n", screen().vpos(), Channel); - for (; x < width; x++) - { - const uint8_t byte1 = data[(vsr++ & 0x0007ffff) ^ 1]; - const uint8_t u1 = u + m_delta_uv_lut[byte]; - const uint8_t y0 = y + m_delta_y_lut[byte]; - - const uint8_t v1 = v + m_delta_uv_lut[byte1]; - const uint8_t y1 = y0 + m_delta_y_lut[byte1]; - - // Midpoint Interpolation prevents rollover, against spec. - const uint8_t u0 = (u >> 1) + (u1 >> 1) + (u & u1 & 1); - const uint8_t v0 = (v >> 1) + (v1 >> 1) + (v & v1 & 1); - - uint32_t* limit_rgb = m_dyuv_limit_rgb_lut + y0 + 0x100; - - uint32_t entry = (limit_rgb[m_dyuv_v_to_r[v0]] << 16) | (limit_rgb[m_dyuv_u_to_g[u0] + m_dyuv_v_to_g[v0]] << 8) | limit_rgb[m_dyuv_u_to_b[u0]]; - pixels[x] = entry; - transparent[x] = (transp_always || (use_region_flag && region_flags[x << 1])) != invert_transp_condition; - - x++; - - limit_rgb = m_dyuv_limit_rgb_lut + y1 + 0x100; - - entry = (limit_rgb[m_dyuv_v_to_r[v1]] << 16) | (limit_rgb[m_dyuv_u_to_g[u1] + m_dyuv_v_to_g[v1]] << 8) | limit_rgb[m_dyuv_u_to_b[u1]]; - pixels[x] = entry; - transparent[x] = (transp_always || (use_region_flag && region_flags[x << 1])) != invert_transp_condition; - - byte = data[(vsr++ & 0x0007ffff) ^ 1]; - - y = y1; - u = u1; - v = v1; - } - set_vsr(vsr - 1); - } - else if (icm == ICM_CLUT8 || icm == ICM_CLUT7 || icm == ICM_CLUT77) - { - for (; x < width; x++) - { - uint32_t entry = m_clut[BYTE_TO_CLUT(icm, byte)]; - pixels[x] = entry; - transparent[x] = (transp_always || (use_color_key && (entry == transparent_color)) || (use_region_flag && region_flags[x << 1])) != invert_transp_condition; - if (mosaic_enable) - { - for (int mosaic_index = 1; mosaic_index < mosaic_factor && (x + mosaic_index) < width; mosaic_index++) - { - pixels[x + mosaic_index] = pixels[x]; - transparent[x + mosaic_index] = transparent[x]; - } - x += mosaic_factor - 1; - } - byte = data[(vsr & 0x0007ffff) ^ 1]; - vsr++; - } - set_vsr(vsr - 1); - } - else if (icm == ICM_CLUT4) - { - for (; x < width - 1; x += 2) - { - const uint32_t even_entry = m_clut[BYTE_TO_CLUT(icm, byte >> 4)]; - const uint32_t odd_entry = m_clut[BYTE_TO_CLUT(icm, byte)]; - const bool even_pre_transparent = transp_always || (use_color_key && (even_entry == transparent_color)); - const bool odd_pre_transparent = transp_always || (use_color_key && (odd_entry == transparent_color)); - if (mosaic_enable) - { - for (int mosaic_index = 0; mosaic_index < mosaic_factor && (x + mosaic_index) < (width - 1); mosaic_index += 2) - { - pixels[x + mosaic_index] = even_entry; - transparent[x + mosaic_index] = (even_pre_transparent || (use_region_flag && region_flags[x + mosaic_index])) != invert_transp_condition; - pixels[x + mosaic_index + 1] = odd_entry; - transparent[x + mosaic_index + 1] = (odd_pre_transparent || (use_region_flag && region_flags[x + mosaic_index + 1])) != invert_transp_condition; - } - x += mosaic_factor - 2; - } - else - { - pixels[x] = even_entry; - transparent[x] = (even_pre_transparent || (use_region_flag && region_flags[x])) != invert_transp_condition; - - pixels[x + 1] = odd_entry; - transparent[x + 1] = (odd_pre_transparent || (use_region_flag && region_flags[x + 1])) != invert_transp_condition; - } - byte = data[(vsr & 0x0007ffff) ^ 1]; - vsr++; - } - set_vsr(vsr - 1); - } - else - { - std::fill_n(pixels + x, width - x, 0x00101010); - std::fill_n(transparent + x, width - x, true); - } - done = true; - break; - case DDR_FT_RLE: - LOGMASKED(LOG_VSR, "Scanline %d: Chan %d: RLE\n", screen().vpos(), Channel); - if (byte & 0x80) - { - // Run length - uint8_t length = data[((vsr++) & 0x0007ffff) ^ 1]; - LOGMASKED(LOG_VSR, "Byte %02x w/ run length %02x at %d\n", byte, length, x); - const uint32_t entry = m_clut[BYTE_TO_CLUT(icm, byte & 0x7f)]; - const bool pre_transparent = (transp_always || (use_color_key && entry == transparent_color)); - if (!length) - { - // Go to the end of the line - std::fill_n(pixels + x, width - x, entry); - for (int transp_index = x; transp_index < width; transp_index++) - { - transparent[transp_index] = (pre_transparent || (use_region_flag && region_flags[transp_index << 1])) != invert_transp_condition; - } - done = true; - set_vsr(vsr); - } - else - { - int end = std::min(width, x + length); - std::fill_n(pixels + x, end - x, entry); - for (int transp_index = x; transp_index < end; transp_index++) - { - transparent[transp_index] = (pre_transparent || (use_region_flag && region_flags[transp_index << 1])) != invert_transp_condition; - } - x = end; - if (x >= width) - { - done = true; - set_vsr(vsr); - } - } - } - else - { - LOGMASKED(LOG_VSR, "Byte %02x, single at %d\n", byte, x); - // Single pixel - const uint32_t entry = m_clut[BYTE_TO_CLUT(icm, byte)]; - const bool pre_transparent = (transp_always || (use_color_key && entry == transparent_color)); - - pixels[x] = entry; - transparent[x] = (pre_transparent || (use_region_flag && region_flags[x << 1])) != invert_transp_condition; - x++; + const uint8_t byte1 = data[(vsr++ & 0x0007ffff) ^ 1]; + const uint8_t y2 = y + m_delta_y_lut[byte]; + const uint8_t y4 = y2 + m_delta_y_lut[byte1]; + + const uint8_t u4 = u + m_delta_uv_lut[byte]; + const uint8_t v4 = v + m_delta_uv_lut[byte1]; + const uint8_t u2 = (u >> 1) + (u4 >> 1) + (u & u4 & 1); + const uint8_t v2 = (v >> 1) + (v4 >> 1) + (v & v4 & 1); + + uint32_t* limit_rgb = m_dyuv_limit_lut + y2 + 0x100; + color0 = (limit_rgb[m_dyuv_v_to_r[v2]] << 16) | (limit_rgb[m_dyuv_u_to_g[u2] + m_dyuv_v_to_g[v2]] << 8) | limit_rgb[m_dyuv_u_to_b[u2]]; + limit_rgb = m_dyuv_limit_lut + y4 + 0x100; + color1 = (limit_rgb[m_dyuv_v_to_r[v4]] << 16) | (limit_rgb[m_dyuv_u_to_g[u4] + m_dyuv_v_to_g[v4]] << 8) | limit_rgb[m_dyuv_u_to_b[u4]]; + + y = y4; + u = u4; + v = v4; + // TODO: Does not support QHY + pixels[x] = color0; + pixels[x + 1] = color0; + pixels[x + 2] = color1; + pixels[x + 3] = color1; + transparent[x] = (transp_always || (use_region_flag && region_flags[x])) != invert_transp_condition; + transparent[x + 1] = (transp_always || (use_region_flag && region_flags[x + 1])) != invert_transp_condition; + transparent[x + 2] = (transp_always || (use_region_flag && region_flags[x + 2])) != invert_transp_condition; + transparent[x + 3] = (transp_always || (use_region_flag && region_flags[x + 3])) != invert_transp_condition; + x += 4; + continue; + } + else if (icm == ICM_CLUT4) + { + const uint8_t mask = (decodingMode == DDR_FT_RLE) ? 0x7 : 0xf; + color0 = m_clut[BYTE_TO_CLUT(icm, mask & (byte >> 4))]; + color1 = m_clut[BYTE_TO_CLUT(icm, mask & byte)]; + } + else { + color1 = color0 = m_clut[BYTE_TO_CLUT(icm, byte)]; + } - if (x >= width) - { - done = true; - set_vsr(vsr); - } - } - break; + int m_length = mosaic_enable ? mosaic_factor * 2 : 2; + if (decodingMode == DDR_FT_RLE) + { + const uint16_t length = (byte & 0x80) ? data[((vsr++) & 0x0007ffff) ^ 1] : 1; + m_length = length ? length * 2 : width; } - } - if (icm != ICM_CLUT4) - { - for (int i = width - 1; i >= 0; i--) + const bool color_match0 = (mask_bits & color0) == transp_match; + const bool color_match1 = (mask_bits & color1) == transp_match; + const int end = std::min(width, (int)x + m_length); + for (int rl_index = x; rl_index < end; rl_index += 2) { - pixels[i * 2] = pixels[i * 2 + 1] = pixels[i]; - transparent[i * 2] = transparent[i * 2 + 1] = transparent[i]; + pixels[rl_index] = color0; + transparent[rl_index] = (transp_always || (use_color_key && color_match0) || (use_region_flag && region_flags[rl_index])) != invert_transp_condition; + pixels[rl_index + 1] = color1; + transparent[rl_index + 1] = (transp_always || (use_color_key && color_match1) || (use_region_flag && region_flags[rl_index + 1])) != invert_transp_condition; } + x = end; } + set_vsr(vsr); } const uint32_t mcd212_device::s_4bpp_color[16] = @@ -1297,7 +1169,7 @@ uint32_t mcd212_device::screen_update(screen_device &screen, bitmap_rgb32 &bitma template int mcd212_device::ram_dtack_cycle_count<0>(); template int mcd212_device::ram_dtack_cycle_count<1>(); -template +template int mcd212_device::ram_dtack_cycle_count() { // Per MCD-212 documentation, it takes 4 CLKs (2 SCC68070 clocks) for a VRAM access during the System timing slot. @@ -1306,8 +1178,8 @@ int mcd212_device::ram_dtack_cycle_count() if (!BIT(m_dcr[0], DCR_DE_BIT)) return 2; - // No contending for Ch.1/Ch.2 timing slots if a relevant channel is disabled - if (!BIT(m_dcr[Channel], DCR_ICA_BIT)) + // No contending for Ch.1/Ch.2 timing slots if a relevant Path is disabled + if (!BIT(m_dcr[Path], DCR_ICA_BIT)) return 2; const int x = screen().hpos(); @@ -1323,7 +1195,7 @@ int mcd212_device::ram_dtack_cycle_count() return 2; // No contending for Ch.1/Ch.2 timing slots during the free-run area of DCA lines if DCA is disabled - if (!BIT(m_dcr[Channel], DCR_DCA_BIT) && x_outside_active_display) + if (!BIT(m_dcr[Path], DCR_DCA_BIT) && x_outside_active_display) return 2; // System access is restricted to the last 5 out of every 16 CLKs. @@ -1409,7 +1281,7 @@ void mcd212_device::device_start() for (uint16_t w = 0; w < 0x300; w++) { const uint8_t limit = (w < 0x100) ? 0 : (w < 0x200) ? (w - 0x100) : 0xff; - m_dyuv_limit_rgb_lut[w] = limit; + m_dyuv_limit_lut[w] = limit; } for (int16_t sw = 0; sw < 0x100; sw++) diff --git a/src/mame/philips/mcd212.h b/src/mame/philips/mcd212.h index 2b2a5047bef25..7856cdc7f75b8 100644 --- a/src/mame/philips/mcd212.h +++ b/src/mame/philips/mcd212.h @@ -51,7 +51,7 @@ class mcd212_device : public device_t, void map(address_map &map) ATTR_COLD; - template int ram_dtack_cycle_count(); + template int ram_dtack_cycle_count(); int rom_dtack_cycle_count(); protected: @@ -202,7 +202,7 @@ class mcd212_device : public device_t, uint8_t m_weight_factor[2][768]{}; // DYUV color limit arrays. - uint32_t m_dyuv_limit_rgb_lut[0x300]; + uint32_t m_dyuv_limit_lut[0x300]; // DYUV delta-Y decoding array uint8_t m_delta_y_lut[0x100]; @@ -243,26 +243,26 @@ class mcd212_device : public device_t, int get_screen_width(); int get_border_width(); - template int get_plane_width(); + template int get_plane_width(); - template void set_vsr(uint32_t value); - template uint32_t get_vsr(); + template void set_vsr(uint32_t value); + template uint32_t get_vsr(); - template void set_dcp(uint32_t value); - template uint32_t get_dcp(); + template void set_dcp(uint32_t value); + template uint32_t get_dcp(); - template void set_display_parameters(uint8_t value); + template void set_display_parameters(uint8_t value); - template void process_ica(); - template void process_dca(); + template void process_ica(); + template void process_dca(); - template uint8_t get_transparency_control(); - template uint8_t get_icm(); - template bool get_mosaic_enable(); - template uint8_t get_mosaic_factor(); - template void process_vsr(uint32_t *pixels, bool *transparent); + template uint8_t get_transparency_control(); + template uint8_t get_icm(); + template bool get_mosaic_enable(); + template uint8_t get_mosaic_factor(); + template void process_vsr(uint32_t *pixels, bool *transparent); - template void set_register(uint8_t reg, uint32_t value); + template void set_register(uint8_t reg, uint32_t value); template void mix_lines(uint32_t *plane_a, bool *transparent_a, uint32_t *plane_b, bool *transparent_b, uint32_t *out); From 59194f15a195a0eed335ba3b606a6f4169e1d443 Mon Sep 17 00:00:00 2001 From: angelosa Date: Sun, 19 Jan 2025 11:37:50 +0100 Subject: [PATCH 74/80] New working software list items ------------------------------- cdi: Validation Disc [redump.org] --- hash/cdi.xml | 30 ++++++++++++++++++++++++++++++ src/mame/nintendo/n64_v.cpp | 4 ++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/hash/cdi.xml b/hash/cdi.xml index 918ce7eff9b70..4252165134cb6 100644 --- a/hash/cdi.xml +++ b/hash/cdi.xml @@ -10317,6 +10317,36 @@ license:CC0-1.0 + + + Validation Disc (Version 1.0) + + 1990 + Philips / Sony + + + + + + + + + + + + + + + - Brutal Football - Deluxe Edition (Europe) + Brutal Sports Series: Football - Deluxe Edition (Europe) 1993 @@ -654,6 +654,8 @@ Corrupt tiles if you switch languages in language select menu Not extensively tested Gameplay is too fast ]]> + + diff --git a/hash/amigaocs_flop.xml b/hash/amigaocs_flop.xml index 7c47c4b32a25b..01802e070c6a2 100644 --- a/hash/amigaocs_flop.xml +++ b/hash/amigaocs_flop.xml @@ -98,7 +98,6 @@ license:CC0-1.0 - Hostile Breed (Europe, prototype) 199? @@ -691,7 +690,7 @@ ATK test: OK - + Abandoned Places - A Time for Heroes (Europe) @@ -699,7 +698,7 @@ ATK test: OK 1992 Electronic Zoo @@ -1269,7 +1268,6 @@ ATK test: OK 1989 Tomahawk @@ -1329,7 +1327,7 @@ ATK test: failed 1989 Dinamic @@ -1681,7 +1679,7 @@ ATK test: C:0 H:U Bad - + Alien Breed (Europe) @@ -1690,8 +1688,7 @@ ATK test: C:0 H:U Bad Team 17 8" after credits display (worked around) -Motor keeps spinning badly on disk swap screen(s) (verify) -Glitchy [Copper] on bottom part of screen, may use SKIP +Player HP bars slightly corrupted, [Sprite] DMA triggers ATK test: OK ]]> @@ -5234,7 +5231,7 @@ Fatal errors in ipf_decode::generate_timings type 4 - + Battle Isle (Europe) @@ -5242,6 +5239,7 @@ Fatal errors in ipf_decode::generate_timings type 4 1991 Blue Byte @@ -5396,6 +5394,7 @@ ATK test: OK 1989 Hewson @@ -5542,7 +5541,7 @@ ATK test: OK - + B.C. Kid (Europe) @@ -5550,6 +5549,8 @@ ATK test: OK 1992 Ubi Soft @@ -6422,7 +6423,7 @@ ATK test: failed - + Bio Challenge (Europe) @@ -6447,6 +6448,7 @@ ATK test: C:79 H:U 1 Sector Bad 1989 Delphine @@ -6858,6 +6860,7 @@ ATK test: C:0 H:U Bad 1993 Core Design @@ -7031,6 +7034,7 @@ ATK test: OK 1989 Psygnosis @@ -7277,7 +7281,7 @@ fatalerrors when trying to mount "Incompatible image format or corrupted data" - + BMX Simulator (Europe) @@ -7335,7 +7339,7 @@ ATK test: OK - + Body Blows (Europe, v2) @@ -7343,6 +7347,8 @@ ATK test: OK 1993 Team 17 @@ -7541,6 +7547,7 @@ ATK test: OK 1992 Thalamus @@ -7622,6 +7629,8 @@ ATK test: OK 1991 Silmarils @@ -7939,7 +7948,7 @@ ATK test: OK - + Brutal - Paws of Fury (Europe) @@ -7947,6 +7956,7 @@ ATK test: OK 1995 GameTek @@ -7965,7 +7975,7 @@ ATK test: OK - Brutal Football (Europe) + Brutal Sports Series: Football (Europe) 1993 @@ -7973,6 +7983,8 @@ ATK test: OK + + @@ -8147,6 +8159,7 @@ ATK test: C:0 H:U Bad 1988 Accolade @@ -12084,6 +12097,7 @@ ATK test: OK + Crazy Cars II (Europe) @@ -12142,6 +12156,7 @@ ATK test: C:79 H:U 1 Sector Bad + Crazy Sue... Goes On (Europe) @@ -12150,10 +12165,13 @@ ATK test: C:79 H:U 1 Sector Bad 1992 <coverdisk> + + @@ -21482,7 +21500,7 @@ ATK test: C:79 Bad - + Ghouls 'n' Ghosts & Venus the Flytrap (Europe, Chart Attack) @@ -21490,7 +21508,7 @@ ATK test: C:79 Bad 1991 Gremlin Graphics 8" then fatalerrors after DSKDAT access +gng: throws "amiga_fdc_device::live_run - cur_live.bit_counter > 8" then fatalerrors after DSKDAT access (fixed) venus: asks to swap disk with incorrect pitch GFX then throws DSKDAT R and hangs (fixed) venus: [Denise] offset bitplanes (game area, weapon bar, bonus stages) ATK test: OK @@ -30385,7 +30403,6 @@ fatalerrors when trying to mount "Incompatible image format or corrupted data" Ocean 1991 Mindscape @@ -30622,7 +30639,7 @@ ATK test: OK @@ -30933,6 +30950,7 @@ ATK test: OK 1990 Audiogenic @@ -30944,7 +30962,9 @@ ATK test: C:0 H:U Bad - Lord of the Rings Vol. I (Europe) + + + The Lord of the Rings Vol. I (Europe) 1991 @@ -30974,7 +30994,7 @@ ATK test: OK - Lord of the Rings Vol. I (France) + The Lord of the Rings Vol. I (France) 1991 @@ -31004,7 +31024,7 @@ ATK test: OK - Lord of the Rings Vol. I (Germany) + The Lord of the Rings Vol. I (Germany) 1991 @@ -31128,7 +31148,7 @@ ATK test: C:0 H:U 1 Sector Bad - + Lost Patrol (Europe) @@ -31136,9 +31156,8 @@ ATK test: C:0 H:U 1 Sector Bad 1990 Ocean @@ -31155,7 +31174,7 @@ ATK test: C:0 H:U Bad - + Lost Patrol (USA) @@ -31163,7 +31182,6 @@ ATK test: C:0 H:U Bad 1990 Ocean @@ -31312,7 +31330,7 @@ ATK test: OK 1990 Gremlin Graphics @@ -31330,6 +31348,7 @@ ATK test: failed 1990 Gremlin Graphics @@ -31347,6 +31366,7 @@ ATK test: OK 1990 Gremlin Graphics @@ -31364,9 +31384,9 @@ ATK test: failed 1992 Gremlin Graphics + @@ -31389,7 +31409,7 @@ ATK test: failed 1991 Gremlin Graphics @@ -41607,7 +41627,7 @@ ATK test: failed - + Road Rash (Europe) @@ -41616,7 +41636,9 @@ ATK test: failed Electronic Arts @@ -42064,7 +42086,7 @@ ATK test: OK Storm @@ -49341,7 +49363,7 @@ ATK test: OK @@ -49652,8 +49674,7 @@ ATK test: OK Discovery Brutal Sports Series: Football 1994 Millennium - + + diff --git a/hash/jaguar.xml b/hash/jaguar.xml index ed9b2f1e8df0d..3568fc6585f4b 100644 --- a/hash/jaguar.xml +++ b/hash/jaguar.xml @@ -292,14 +292,15 @@ No sound, hardlocks then eventually throws an exception after the Dyna Cam logo - Brutal Sports Football + Brutal Sports Series: Football 1994 Telegames - + + diff --git a/src/mame/amiga/agnus_copper.cpp b/src/mame/amiga/agnus_copper.cpp index 6de9b35b2c61d..852aed154b02c 100644 --- a/src/mame/amiga/agnus_copper.cpp +++ b/src/mame/amiga/agnus_copper.cpp @@ -244,7 +244,7 @@ void agnus_copper_device::vblank_sync() void agnus_copper_device::suspend_offset(int xpos, int hblank_width) { m_xpos_state = (xpos == 511) ? 0 : xpos - hblank_width; -// std::assert(m_xpos_state > 0); +// assert(m_xpos_state > 0); } // restore at start From 60caa3036040b197354547f59f1b5da137126e99 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 19 Jan 2025 15:48:51 +0100 Subject: [PATCH 78/80] mcs51: max opcode cycles is 4 --- src/devices/cpu/mcs51/mcs51.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/cpu/mcs51/mcs51.h b/src/devices/cpu/mcs51/mcs51.h index 32c956ef342f8..40397cf81ad66 100644 --- a/src/devices/cpu/mcs51/mcs51.h +++ b/src/devices/cpu/mcs51/mcs51.h @@ -81,7 +81,7 @@ class mcs51_cpu_device : public cpu_device virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const noexcept override { return (clocks + 12 - 1) / 12; } virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const noexcept override { return (cycles * 12); } virtual uint32_t execute_min_cycles() const noexcept override { return 1; } - virtual uint32_t execute_max_cycles() const noexcept override { return 2+2; } + virtual uint32_t execute_max_cycles() const noexcept override { return 4+2; } // max opcode cycles + irq virtual void execute_run() override; virtual void execute_set_input(int inputnum, int state) override; From 98e21bb678eccd92c5da241828de09eb13f14a52 Mon Sep 17 00:00:00 2001 From: cam900 Date: Mon, 20 Jan 2025 00:11:07 +0900 Subject: [PATCH 79/80] excellent/excellent_spr.cpp: Fix sprite delay and cleaned up code: (#13213) * Implemented sprite RAM DMA triggered by vertical blanking. * Use internal graphics decoding layout. * Removed unused variables, reduced duplication and corrected comments. * excellent/gcpinbal.cpp: Fixed background tilemap bank switching, simplified ROM loading, cleaned up code. * excellent/aquarium.cpp: Cleaned up code. --- src/mame/excellent/aquarium.cpp | 3 +- src/mame/excellent/excellent_spr.cpp | 139 +++++++++++++++------------ src/mame/excellent/excellent_spr.h | 14 ++- src/mame/excellent/gcpinbal.cpp | 57 +++++------ 4 files changed, 119 insertions(+), 94 deletions(-) diff --git a/src/mame/excellent/aquarium.cpp b/src/mame/excellent/aquarium.cpp index f87e8f1979c47..b1de277ca8823 100644 --- a/src/mame/excellent/aquarium.cpp +++ b/src/mame/excellent/aquarium.cpp @@ -243,7 +243,7 @@ uint32_t aquarium_state::screen_update(screen_device &screen, bitmap_ind16 &bitm m_txt_tilemap->draw(screen, bitmap, cliprect, 1, 4); m_bak_tilemap->draw(screen, bitmap, cliprect, 1, 8); - m_sprgen->aquarium_draw_sprites(screen, bitmap, cliprect, 16); + m_sprgen->aquarium_draw_sprites(screen, bitmap, cliprect); m_mid_tilemap->draw(screen, bitmap, cliprect, 1, 0); m_txt_tilemap->draw(screen, bitmap, cliprect, 0, 0); @@ -432,6 +432,7 @@ void aquarium_state::aquarium(machine_config &config) m_screen->set_size(64*8, 64*8); m_screen->set_visarea(2*8, 42*8-1, 2*8, 34*8-1); m_screen->set_screen_update(FUNC(aquarium_state::screen_update)); + m_screen->screen_vblank().set(m_sprgen, FUNC(excellent_spr_device::vblank)); m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_aquarium); diff --git a/src/mame/excellent/excellent_spr.cpp b/src/mame/excellent/excellent_spr.cpp index 1577adc2c314f..7a68ab34d0f98 100644 --- a/src/mame/excellent/excellent_spr.cpp +++ b/src/mame/excellent/excellent_spr.cpp @@ -19,15 +19,33 @@ #include "excellent_spr.h" #include "screen.h" +#include + + +// 16x16x4 +static gfx_layout layout_16x16x4 = +{ + 16,16, // 16*16 sprites + RGN_FRAC(1,1), + 4, // 4 bits per pixel +// { 16, 48, 0, 32 }, + { 48, 16, 32, 0 }, + { STEP16(0,1) }, + { STEP16(0,16*4) }, + 16*16*4 // every sprite takes 128 consecutive bytes +}; + +GFXDECODE_MEMBER(excellent_spr_device::gfxinfo) + GFXDECODE_DEVICE(DEVICE_SELF, 0, layout_16x16x4, 0, 16) +GFXDECODE_END DEFINE_DEVICE_TYPE(EXCELLENT_SPRITE, excellent_spr_device, "excellent_spr", "Excellent 8-bit Sprite") excellent_spr_device::excellent_spr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, EXCELLENT_SPRITE, tag, owner, clock) - , device_gfx_interface(mconfig, *this, nullptr) + , device_gfx_interface(mconfig, *this) , device_video_interface(mconfig, *this) , m_colpri_cb(*this) - , m_gfx_region(*this, DEVICE_SELF) , m_colbase(0) { } @@ -35,26 +53,15 @@ excellent_spr_device::excellent_spr_device(const machine_config &mconfig, const void excellent_spr_device::device_start() { - /* 16x16x4 */ - gfx_layout layout_16x16x4 = - { - 16,16, /* 16*16 sprites */ - 0, - 4, /* 4 bits per pixel */ -// { 16, 48, 0, 32 }, - { 48, 16, 32, 0 }, - { STEP16(0,1) }, - { STEP16(0,16*4) }, - 16*16*4 /* every sprite takes 128 consecutive bytes */ - }; - layout_16x16x4.total = m_gfx_region->bytes() / ((16*16*4) / 8); + decode_gfx(gfxinfo); + gfx(0)->set_colorbase(m_colbase); m_colpri_cb.resolve(); m_ram = make_unique_clear(0x1000); + m_ram_buffered = make_unique_clear(0x1000); save_pointer(NAME(m_ram), 0x1000); - - set_gfx(0, std::make_unique(&palette(), layout_16x16x4, m_gfx_region->base(), 0, 0x10, m_colbase)); + save_pointer(NAME(m_ram_buffered), 0x1000); } @@ -72,29 +79,35 @@ void excellent_spr_device::device_reset() { } +void excellent_spr_device::vblank(int state) +{ + if (state) + std::copy_n(&m_ram[0], 0x1000, &m_ram_buffered[0]); +} /**************************************************************** SPRITE DRAW ROUTINE (8-bit) - Word | Bit(s) | Use - -----+-----------------+----------------- - 0 | xxxxxxxx| X lo - 1 | xxxxxxxx| X hi - 2 | xxxxxxxx| Y lo - 3 | xxxxxxxx| Y hi - 4 | x.......| Disable - 4 | ...x....| Flip Y - 4 | ....x...| 1 = Y chain, 0 = X chain - 4 | .....xxx| Chain size - 5 | ??xxxxxx| Tile (low) - 6 | xxxxxxxx| Tile (high) - 7 | ....xxxx| Color Bank + Word | Bit(s) | Use + -----+----------+--------------------------- + 0 | xxxxxxxx | X lo + 1 | xxxxxxxx | X hi + 2 | xxxxxxxx | Y lo + 3 | xxxxxxxx | Y hi + 4 | x....... | Disable + 4 | ..x..... | Flip X (aquarium) + 4 | ...x.... | Flip Y + 4 | ....x... | 1 = Y chain, 0 = X chain + 4 | .....xxx | Chain size + 5 | ??xxxxxx | Tile (low) + 6 | xxxxxxxx | Tile (high) + 7 | ....xxxx | Color Bank ****************************************************************/ -void excellent_spr_device::aquarium_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs) +void excellent_spr_device::aquarium_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { const bool priority = !m_colpri_cb.isnull(); @@ -104,33 +117,34 @@ void excellent_spr_device::aquarium_draw_sprites(screen_device &screen, bitmap_i for (int offs = start; offs != end; offs += inc) { - u32 code = ((m_ram[offs + 5]) & 0xff) + (((m_ram[offs + 6]) & 0xff) << 8); - code &= 0x3fff; - - if (!(m_ram[offs + 4] & 0x80)) /* active sprite ? */ + if (BIT(~m_ram_buffered[offs + 4], 7)) /* active sprite ? */ { - int x = ((m_ram[offs + 0]) & 0xff) + (((m_ram[offs + 1]) & 0xff) << 8); - int y = ((m_ram[offs + 2]) & 0xff) + (((m_ram[offs + 3]) & 0xff) << 8); + u32 code = ((m_ram_buffered[offs + 5]) & 0xff) + (((m_ram_buffered[offs + 6]) & 0xff) << 8); + code &= 0x3fff; + + int x = ((m_ram_buffered[offs + 0]) & 0xff) + (((m_ram_buffered[offs + 1]) & 0xff) << 8); + int y = ((m_ram_buffered[offs + 2]) & 0xff) + (((m_ram_buffered[offs + 3]) & 0xff) << 8); /* Treat coords as signed */ if (x & 0x8000) x -= 0x10000; if (y & 0x8000) y -= 0x10000; u32 pri_mask = 0; - u32 colour = ((m_ram[offs + 7]) & 0x0f); - const u8 chain = (m_ram[offs + 4]) & 0x07; - const bool flipy = (m_ram[offs + 4]) & 0x10; - const bool flipx = (m_ram[offs + 4]) & 0x20; + u32 colour = ((m_ram_buffered[offs + 7]) & 0x0f); + const u8 chain = (m_ram_buffered[offs + 4]) & 0x07; + const bool chaindir = BIT(m_ram_buffered[offs + 4], 3); + const bool flipy = BIT(m_ram_buffered[offs + 4], 4); + const bool flipx = BIT(m_ram_buffered[offs + 4], 5); if (priority) m_colpri_cb(colour, pri_mask); int curx = x; int cury = y; - if (((m_ram[offs + 4]) & 0x08) && flipy) + if (chaindir && flipy) cury += (chain * 16); - if (!(((m_ram[offs + 4]) & 0x08)) && flipx) + if ((!chaindir) && flipx) curx += (chain * 16); for (int chain_pos = chain; chain_pos >= 0; chain_pos--) @@ -158,19 +172,21 @@ void excellent_spr_device::aquarium_draw_sprites(screen_device &screen, bitmap_i code, colour, flipx, flipy, - curx,cury,0); + curx,cury, + 0); /* wrap around y */ gfx(0)->transpen(bitmap,cliprect, code, colour, flipx, flipy, - curx,cury + 256,0); + curx,cury + 256, + 0); } code++; - if ((m_ram[offs + 4]) & 0x08) /* Y chain */ + if (chaindir) /* Y chain */ { if (flipy) cury -= 16; @@ -189,7 +205,7 @@ void excellent_spr_device::aquarium_draw_sprites(screen_device &screen, bitmap_i } } -void excellent_spr_device::gcpinbal_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs) +void excellent_spr_device::gcpinbal_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { const bool priority = !m_colpri_cb.isnull(); @@ -199,22 +215,23 @@ void excellent_spr_device::gcpinbal_draw_sprites(screen_device &screen, bitmap_i for (int offs = start; offs != end; offs += inc) { - u32 code = ((m_ram[offs + 5]) & 0xff) + (((m_ram[offs + 6]) & 0xff) << 8); - code &= 0x3fff; - - if (!(m_ram[offs + 4] & 0x80)) /* active sprite ? */ + if (BIT(~m_ram_buffered[offs + 4], 7)) /* active sprite ? */ { - int x = ((m_ram[offs + 0]) & 0xff) + (((m_ram[offs + 1]) & 0xff) << 8); - int y = ((m_ram[offs + 2]) & 0xff) + (((m_ram[offs + 3]) & 0xff) << 8); + u32 code = ((m_ram_buffered[offs + 5]) & 0xff) + (((m_ram_buffered[offs + 6]) & 0xff) << 8); + code &= 0x3fff; + + int x = ((m_ram_buffered[offs + 0]) & 0xff) + (((m_ram_buffered[offs + 1]) & 0xff) << 8); + int y = ((m_ram_buffered[offs + 2]) & 0xff) + (((m_ram_buffered[offs + 3]) & 0xff) << 8); /* Treat coords as signed */ if (x & 0x8000) x -= 0x10000; if (y & 0x8000) y -= 0x10000; u32 pri_mask = 0; - u32 colour = ((m_ram[offs + 7]) & 0x0f); - const u8 chain = (m_ram[offs + 4]) & 0x07; - const bool flipy = (m_ram[offs + 4]) & 0x10; + u32 colour = ((m_ram_buffered[offs + 7]) & 0x0f); + const u8 chain = (m_ram_buffered[offs + 4]) & 0x07; + const bool chaindir = BIT(m_ram_buffered[offs + 4], 3); + const bool flipy = BIT(m_ram_buffered[offs + 4], 4); const bool flipx = 0; if (priority) m_colpri_cb(colour, pri_mask); @@ -222,7 +239,7 @@ void excellent_spr_device::gcpinbal_draw_sprites(screen_device &screen, bitmap_i int curx = x; int cury = y; - if (((m_ram[offs + 4]) & 0x08) && flipy) + if (chaindir && flipy) cury += (chain * 16); for (int chain_pos = chain; chain_pos >= 0; chain_pos--) @@ -248,10 +265,12 @@ void excellent_spr_device::gcpinbal_draw_sprites(screen_device &screen, bitmap_i code++; - if ((m_ram[offs + 4]) & 0x08) /* Y chain */ + if (chaindir) /* Y chain */ { - if (flipy) cury -= 16; - else cury += 16; + if (flipy) + cury -= 16; + else + cury += 16; } else /* X chain */ { diff --git a/src/mame/excellent/excellent_spr.h b/src/mame/excellent/excellent_spr.h index 8485e8da04fdd..9417c25898d83 100644 --- a/src/mame/excellent/excellent_spr.h +++ b/src/mame/excellent/excellent_spr.h @@ -18,19 +18,23 @@ class excellent_spr_device : public device_t, public device_gfx_interface, publi u8 read(offs_t offset); void write(offs_t offset, u8 data); - void aquarium_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs); - void gcpinbal_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs); + void aquarium_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void gcpinbal_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void vblank(int state); protected: - std::unique_ptr m_ram; - virtual void device_start() override ATTR_COLD; virtual void device_reset() override ATTR_COLD; private: colpri_cb_delegate m_colpri_cb; - required_memory_region m_gfx_region; u16 m_colbase; + + std::unique_ptr m_ram; + std::unique_ptr m_ram_buffered; + + // decoding info + DECLARE_GFXDECODE_MEMBER(gfxinfo); }; DECLARE_DEVICE_TYPE(EXCELLENT_SPRITE, excellent_spr_device) diff --git a/src/mame/excellent/gcpinbal.cpp b/src/mame/excellent/gcpinbal.cpp index d688d9bd89648..6394b29d51d37 100644 --- a/src/mame/excellent/gcpinbal.cpp +++ b/src/mame/excellent/gcpinbal.cpp @@ -116,9 +116,6 @@ class gcpinbal_state : public driver_device public: gcpinbal_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) - , m_tilemapram(*this, "tilemapram") - , m_d80010_ram(*this, "d80010") - , m_d80060_ram(*this, "d80060") , m_maincpu(*this, "maincpu") , m_eeprom(*this, "eeprom") , m_watchdog(*this, "watchdog") @@ -128,6 +125,9 @@ class gcpinbal_state : public driver_device , m_screen(*this, "screen") , m_gfxdecode(*this, "gfxdecode") , m_palette(*this, "palette") + , m_tilemapram(*this, "tilemapram") + , m_d80010_ram(*this, "d80010") + , m_d80060_ram(*this, "d80060") { } void gcpinbal(machine_config &config); @@ -138,6 +138,17 @@ class gcpinbal_state : public driver_device virtual void video_start() override ATTR_COLD; private: + // devices + required_device m_maincpu; + required_device m_eeprom; + required_device m_watchdog; + required_device m_oki; + required_device m_essnd; + required_device m_sprgen; + required_device m_screen; + required_device m_gfxdecode; + required_device m_palette; + // memory pointers required_shared_ptr m_tilemapram; required_shared_ptr m_d80010_ram; @@ -155,17 +166,6 @@ class gcpinbal_state : public driver_device // sound-related u8 m_msm_bank = 0U; - // devices - required_device m_maincpu; - required_device m_eeprom; - required_device m_watchdog; - required_device m_oki; - required_device m_essnd; - required_device m_sprgen; - required_device m_screen; - required_device m_gfxdecode; - required_device m_palette; - void d80010_w(offs_t offset, u16 data, u16 mem_mask = ~0); void d80040_w(offs_t offset, u8 data); void d80060_w(offs_t offset, u16 data, u16 mem_mask = ~0); @@ -326,7 +326,7 @@ uint32_t gcpinbal_state::screen_update(screen_device &screen, bitmap_ind16 &bitm #endif m_tilemap[layer[2]]->draw(screen, bitmap, cliprect, 0, 4); - m_sprgen->gcpinbal_draw_sprites(screen, bitmap, cliprect, 16); + m_sprgen->gcpinbal_draw_sprites(screen, bitmap, cliprect); return 0; } @@ -373,34 +373,34 @@ void gcpinbal_state::d80060_w(offs_t offset, u16 data, u16 mem_mask) void gcpinbal_state::bank_w(u8 data) { // MSM6585 bank, coin LEDs, maybe others? - if (m_msm_bank != ((data & 0x10) >> 4)) + if (m_msm_bank != BIT(data, 4)) { - m_msm_bank = ((data & 0x10) >> 4); + m_msm_bank = BIT(data, 4); m_essnd->set_rom_bank(m_msm_bank); LOGESBANKSW("Bankswitching ES8712 ROM %02x\n", m_msm_bank); } - m_oki->set_rom_bank((data & 0x20) >> 5); + m_oki->set_rom_bank(BIT(data, 5)); u32 old = m_bg_gfxset[0]; - u32 newbank = (data & 0x04) ? 0x1000 : 0; + u32 newbank = BIT(data, 2) ? 0x1000 : 0; if (old != newbank) { - m_bg_gfxset[0] = (data & 0x04) ? 0x1000 : 0; + m_bg_gfxset[0] = BIT(data, 2) ? 0x1000 : 0; m_tilemap[0]->mark_all_dirty(); } old = m_bg_gfxset[1]; - newbank = (data & 0x08) ? 0x1000 : 0; + newbank = BIT(data, 3) ? 0x1000 : 0; if (old != newbank) { - m_bg_gfxset[1] = (data & 0x04) ? 0x1000 : 0; + m_bg_gfxset[1] = BIT(data, 3) ? 0x1000 : 0; m_tilemap[1]->mark_all_dirty(); } m_watchdog->write_line_ck(BIT(data, 7)); -// machine().bookkeeping().coin_lockout_w(0, ~data & 0x01); -// machine().bookkeeping().coin_lockout_w(1, ~data & 0x02); +// machine().bookkeeping().coin_lockout_w(0, BIT(~data, 0)); +// machine().bookkeeping().coin_lockout_w(1, BIT(~data, 1)); } void gcpinbal_state::eeprom_w(u8 data) @@ -589,6 +589,7 @@ void gcpinbal_state::gcpinbal(machine_config &config) m_screen->set_size(40*8, 32*8); m_screen->set_visarea(0*8, 40*8-1, 2*8, 30*8-1); m_screen->set_screen_update(FUNC(gcpinbal_state::screen_update)); + m_screen->screen_vblank().set(m_sprgen, FUNC(excellent_spr_device::vblank)); m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_gcpinbal); @@ -622,9 +623,9 @@ void gcpinbal_state::gcpinbal(machine_config &config) ***************************************************************************/ ROM_START( pwrflip ) // Updated version of Grand Cross Pinball or semi-sequel? - ROM_REGION( 0x200000, "maincpu", 0 ) // 68000 + ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 ) // 68000 ROM_LOAD16_WORD_SWAP( "p.f_1.33.u43", 0x000000, 0x80000, CRC(d760c987) SHA1(9200604377542193afc866c84733f2d3b5aa1c80) ) // hand written labels on genuine EXCELLENT labels - ROM_FILL ( 0x80000, 0x080000, 0x00 ) // unpopulated 27C4096 socket at U44 + // unpopulated 27C4096 socket at U44 ROM_LOAD16_WORD_SWAP( "p.f.u45", 0x100000, 0x80000, CRC(6ad1a457) SHA1(8746c38efa05e3318e9b1a371470d149803fb6bb) ) ROM_LOAD16_WORD_SWAP( "p.f.u46", 0x180000, 0x80000, CRC(e0f3a1b4) SHA1(761dddf374a92c1a1e4a211ead215d5be461a082) ) @@ -650,9 +651,9 @@ ROM_START( pwrflip ) // Updated version of Grand Cross Pinball or semi-sequel? ROM_END ROM_START( gcpinbal ) - ROM_REGION( 0x200000, "maincpu", 0 ) // 68000 + ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 ) // 68000 ROM_LOAD16_WORD_SWAP( "2_excellent.u43", 0x000000, 0x80000, CRC(d174bd7f) SHA1(0e6c17265e1400de941e3e2ca3be835aaaff6695) ) // Red line across label - ROM_FILL ( 0x80000, 0x080000, 0x00 ) // unpopulated 27C4096 socket at U44 + // unpopulated 27C4096 socket at U44 ROM_LOAD16_WORD_SWAP( "3_excellent.u45", 0x100000, 0x80000, CRC(0511ad56) SHA1(e0602ece514126ce719ebc9de6649ebe907be904) ) ROM_LOAD16_WORD_SWAP( "4_excellent.u46", 0x180000, 0x80000, CRC(e0f3a1b4) SHA1(761dddf374a92c1a1e4a211ead215d5be461a082) ) From 9359d54aeee92d09fb589071e7993cd5277f7f95 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Mon, 20 Jan 2025 02:21:15 +1100 Subject: [PATCH 80/80] Tidied up some stuff. --- src/devices/cpu/drcbearm64.cpp | 6 +- src/devices/cpu/olms66k/nx8dasm.cpp | 150 +++++++++++++++------------- src/devices/cpu/olms66k/nx8dasm.h | 8 -- src/mame/alba/albazg.cpp | 9 +- src/mame/apple/dfac.cpp | 18 ++-- src/mame/apple/omega.cpp | 22 ++-- src/mame/irem/m58.cpp | 14 ++- src/mame/misc/chance32.cpp | 31 +++--- src/mame/philips/mcd212.cpp | 105 +++++++++---------- src/mame/taito/taitotz.cpp | 58 +++++------ 10 files changed, 210 insertions(+), 211 deletions(-) diff --git a/src/devices/cpu/drcbearm64.cpp b/src/devices/cpu/drcbearm64.cpp index 195a0bda9a820..2f5c9eec02bbd 100644 --- a/src/devices/cpu/drcbearm64.cpp +++ b/src/devices/cpu/drcbearm64.cpp @@ -281,7 +281,7 @@ arm::Mem get_mem_absolute(a64::Assembler &a, const void *ptr) const uint64_t pagebase = codeoffs & ~make_bitmask(12); const int64_t pagerel = (int64_t)ptr - pagebase; - if (is_valid_immediate_signed(pagerel, 33)) + if (is_valid_immediate_signed(pagerel, 21 + 12)) { const uint64_t targetpage = (uint64_t)ptr & ~make_bitmask(12); const uint64_t pageoffs = (uint64_t)ptr & util::make_bitmask(12); @@ -494,7 +494,7 @@ void drcbe_arm64::get_imm_relative(a64::Assembler &a, const a64::Gp ®, const const uint64_t pagebase = codeoffs & ~make_bitmask(12); const int64_t pagerel = (int64_t)val - pagebase; - if (is_valid_immediate_signed(pagerel, 33)) + if (is_valid_immediate_signed(pagerel, 21 + 12)) { const uint64_t targetpage = val & ~make_bitmask(12); const uint64_t pageoffs = val & util::make_bitmask(12); @@ -588,7 +588,7 @@ void drcbe_arm64::emit_ldr_str_base_mem(a64::Assembler &a, a64::Inst::Id opcode, const uint64_t pagebase = codeoffs & ~make_bitmask(12); const int64_t pagerel = (int64_t)ptr - pagebase; - if (is_valid_immediate_signed(pagerel, 33)) + if (is_valid_immediate_signed(pagerel, 21 + 12)) { const uint64_t targetpage = (uint64_t)ptr & ~make_bitmask(12); const uint64_t pageoffs = (uint64_t)ptr & util::make_bitmask(12); diff --git a/src/devices/cpu/olms66k/nx8dasm.cpp b/src/devices/cpu/olms66k/nx8dasm.cpp index bca54820c01ea..2b56815369dcd 100644 --- a/src/devices/cpu/olms66k/nx8dasm.cpp +++ b/src/devices/cpu/olms66k/nx8dasm.cpp @@ -16,42 +16,19 @@ #include -static const u16 s_dummy_psw = 0; +namespace { -nx8_500s_disassembler::nx8_500s_disassembler() - : nx8_500s_disassembler(s_dummy_psw) -{ -} - -nx8_500s_disassembler::nx8_500s_disassembler(const u16 &psw) - : m_psw(psw) -{ -} - -offs_t nx8_500s_disassembler::opcode_alignment() const -{ - return 1; -} +const u16 f_dummy_psw = 0; -u32 nx8_500s_disassembler::interface_flags() const -{ - return PAGED; -} -u32 nx8_500s_disassembler::page_address_bits() const -{ - return 16; -} - - -static const char *const s_reg_names[3][4] = +const char *const f_reg_names[3][4] = { { "ER0", "ER1", "ER2", "ER3" }, { "X1", "X2", "DP", "USP" }, { "SSP", "LRB", "PSW", "A" } }; -static const char *const s_pr_indirect[4] = +const char *const f_pr_indirect[4] = { "[X1]", "[DP-]", @@ -59,7 +36,7 @@ static const char *const s_pr_indirect[4] = "[DP+]" }; -static const char *const s_bit_ops[4] = +const char *const f_bit_ops[4] = { "SB", "RB", @@ -67,13 +44,13 @@ static const char *const s_bit_ops[4] = "JBR" }; -static const char *const s_alu_ops[2][8] = +const char *const f_alu_ops[2][8] = { { "SUBB", "CMPB", "ADDB", "ANDB", "ORB", "XORB", "SBCB", "ADCB" }, { "SUB", "CMP", "ADD", "AND", "OR", "XOR", "SBC", "ADC" } }; -static const char *const s_jconds[8] = +const char *const f_jconds[8] = { "JGT", "JEQ", // alias JZ @@ -85,7 +62,7 @@ static const char *const s_jconds[8] = "JLE" }; -static const char *const s_signed_jconds[4] = +const char *const f_signed_jconds[4] = { "JLTS", "JLES", @@ -94,7 +71,7 @@ static const char *const s_signed_jconds[4] = }; // FIXME: these lists combine MSM66573 and MSM66577 SFRs, including a few existing only on one or the other -static const char *const s_msm6657x_byte_sfr_names[256] = +const char *const f_msm6657x_byte_sfr_names[256] = { nullptr, nullptr, "LRBL", "LRBH", "PSWL", "PSWH", "ACCL", "ACCH", "TSR", "DSR", nullptr, "ROMWIN", "ROMRDY", "RAMRDY", "STPACP", "SBYCON", @@ -130,7 +107,7 @@ static const char *const s_msm6657x_byte_sfr_names[256] = nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; -static const char *const s_msm6657x_word_sfr_names[128] = +const char *const f_msm6657x_word_sfr_names[128] = { "SSP", "LRB", "PSW", "ACC", "DSTSR", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, @@ -150,45 +127,46 @@ static const char *const s_msm6657x_word_sfr_names[128] = nullptr, "FLAADRS", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; -void nx8_500s_disassembler::format_n8(std::ostream &stream, u8 n8) + +void format_n8(std::ostream &stream, u8 n8) { if (n8 >= 0xa0) stream << '0'; util::stream_format(stream, "%02XH", n8); } -void nx8_500s_disassembler::format_n16(std::ostream &stream, u16 n16) +void format_n16(std::ostream &stream, u16 n16) { if (n16 >= 0xa000) stream << '0'; util::stream_format(stream, "%04XH", n16); } -void nx8_500s_disassembler::format_fix8(std::ostream &stream, u8 n8) +void format_fix8(std::ostream &stream, u8 n8) { format_n16(stream, 0x0200 + n8); } -void nx8_500s_disassembler::format_off8(std::ostream &stream, u8 n8) +void format_off8(std::ostream &stream, u8 n8) { stream << '\\'; format_n8(stream, n8); } -void nx8_500s_disassembler::format_dir16(std::ostream &stream, u16 n16) +void format_dir16(std::ostream &stream, u16 n16) { if ((n16 & 0xff00) == 0 || (n16 & 0xff00) == 0x0200) stream << "dir "; format_n16(stream, n16); } -void nx8_500s_disassembler::format_sfr8(std::ostream &stream, u8 n8, bool word) +void format_sfr8(std::ostream &stream, u8 n8, bool word) { const char *name = nullptr; if (word && !BIT(n8, 0)) - name = s_msm6657x_word_sfr_names[n8 >> 1]; + name = f_msm6657x_word_sfr_names[n8 >> 1]; else if (!word) - name = s_msm6657x_byte_sfr_names[n8]; + name = f_msm6657x_byte_sfr_names[n8]; if (name != nullptr) stream << name; else @@ -198,6 +176,36 @@ void nx8_500s_disassembler::format_sfr8(std::ostream &stream, u8 n8, bool word) } } +} // anonymous namespace + + + +nx8_500s_disassembler::nx8_500s_disassembler() + : nx8_500s_disassembler(f_dummy_psw) +{ +} + +nx8_500s_disassembler::nx8_500s_disassembler(const u16 &psw) + : m_psw(psw) +{ +} + +offs_t nx8_500s_disassembler::opcode_alignment() const +{ + return 1; +} + +u32 nx8_500s_disassembler::interface_flags() const +{ + return PAGED; +} + +u32 nx8_500s_disassembler::page_address_bits() const +{ + return 16; +} + + offs_t nx8_500s_disassembler::dasm_composite(std::ostream &stream, offs_t pc, offs_t prefix, const nx8_500s_disassembler::data_buffer &opcodes, std::string obj, bool word) const { const u8 code = opcodes.r8(pc + prefix); @@ -205,7 +213,7 @@ offs_t nx8_500s_disassembler::dasm_composite(std::ostream &stream, offs_t pc, of { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: - util::stream_format(stream, "%-8s%s.%d", s_bit_ops[BIT(~code, 3)], obj, code & 0x07); + util::stream_format(stream, "%-8s%s.%d", f_bit_ops[BIT(~code, 3)], obj, code & 0x07); return (prefix + 1) | SUPPORTED; case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: @@ -220,7 +228,7 @@ offs_t nx8_500s_disassembler::dasm_composite(std::ostream &stream, offs_t pc, of case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: - util::stream_format(stream, "%-8s%s.%d,", s_bit_ops[2 + BIT(~code, 3)], obj, code & 0x07); + util::stream_format(stream, "%-8s%s.%d,", f_bit_ops[2 + BIT(~code, 3)], obj, code & 0x07); format_n16(stream, pc + prefix + 2 + s8(opcodes.r8(pc + prefix + 1))); return (prefix + 2) | STEP_COND | SUPPORTED; @@ -246,28 +254,28 @@ offs_t nx8_500s_disassembler::dasm_composite(std::ostream &stream, offs_t pc, of case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: if (word) - util::stream_format(stream, "%-8s%s,%s", "MOV", s_reg_names[BIT(code, 2)][code & 0x03], obj); + util::stream_format(stream, "%-8s%s,%s", "MOV", f_reg_names[BIT(code, 2)][code & 0x03], obj); else util::stream_format(stream, "%-8sR%d,%s", "MOVB", code & 0x07, obj); return (prefix + 1) | SUPPORTED; case 0x80: case 0x90: case 0xa0: case 0xb0: case 0xc0: case 0xd0: case 0xe0: case 0xf0: - util::stream_format(stream, "%-8s%s,", s_alu_ops[word][(code >> 4) & 0x07], obj); + util::stream_format(stream, "%-8s%s,", f_alu_ops[word][(code >> 4) & 0x07], obj); format_fix8(stream, opcodes.r8(pc + prefix + 1)); return (prefix + 2) | SUPPORTED; case 0x81: case 0x91: case 0xa1: case 0xb1: case 0xc1: case 0xd1: case 0xe1: case 0xf1: - util::stream_format(stream, "%-8s%s,", s_alu_ops[word][(code >> 4) & 0x07], obj); + util::stream_format(stream, "%-8s%s,", f_alu_ops[word][(code >> 4) & 0x07], obj); format_off8(stream, opcodes.r8(pc + prefix + 1)); return (prefix + 2) | SUPPORTED; case 0x82: case 0x92: case 0xa2: case 0xb2: case 0xc2: case 0xd2: case 0xe2: case 0xf2: - util::stream_format(stream, "%-8s%s,", s_alu_ops[word][(code >> 4) & 0x07], obj); + util::stream_format(stream, "%-8s%s,", f_alu_ops[word][(code >> 4) & 0x07], obj); format_sfr8(stream, opcodes.r8(pc + prefix + 1), word); return (prefix + 2) | SUPPORTED; case 0x83: case 0x93: case 0xa3: case 0xb3: case 0xc3: case 0xd3: case 0xe3: case 0xf3: - util::stream_format(stream, "%-8s%s,#", s_alu_ops[word][(code >> 4) & 0x07], obj); + util::stream_format(stream, "%-8s%s,#", f_alu_ops[word][(code >> 4) & 0x07], obj); if (word) { format_n16(stream, opcodes.r16(pc + prefix + 1)); @@ -280,11 +288,11 @@ offs_t nx8_500s_disassembler::dasm_composite(std::ostream &stream, offs_t pc, of } case 0x84: case 0x94: case 0xa4: case 0xb4: case 0xc4: case 0xd4: case 0xe4: case 0xf4: - util::stream_format(stream, "%-8s%s,A", s_alu_ops[word][(code >> 4) & 0x07], obj); + util::stream_format(stream, "%-8s%s,A", f_alu_ops[word][(code >> 4) & 0x07], obj); return (prefix + 1) | SUPPORTED; case 0x85: case 0x95: case 0xa5: case 0xb5: case 0xc5: case 0xd5: case 0xe5: case 0xf5: - util::stream_format(stream, "%-8sA,%s", s_alu_ops[word][(code >> 4) & 0x07], obj); + util::stream_format(stream, "%-8sA,%s", f_alu_ops[word][(code >> 4) & 0x07], obj); return (prefix + 1) | SUPPORTED; case 0x86: @@ -300,7 +308,7 @@ offs_t nx8_500s_disassembler::dasm_composite(std::ostream &stream, offs_t pc, of return (prefix + 2) | SUPPORTED; case 0x88: case 0x89: case 0x8a: case 0x8b: - util::stream_format(stream, "%-8s%s,%s", word ? "MOV" : "MOVB", s_pr_indirect[code & 0x03], obj); + util::stream_format(stream, "%-8s%s,%s", word ? "MOV" : "MOVB", f_pr_indirect[code & 0x03], obj); return (prefix + 1) | SUPPORTED; case 0x8c: case 0x8d: case 0x8e: case 0x8f: @@ -320,7 +328,7 @@ offs_t nx8_500s_disassembler::dasm_composite(std::ostream &stream, offs_t pc, of case 0x98: case 0x99: util::stream_format(stream, "%-8s", word ? "MOV" : "MOVB"); format_n16(stream, opcodes.r16(pc + prefix + 1)); - util::stream_format(stream, "[%s],%s", s_reg_names[1][code & 0x01], obj); + util::stream_format(stream, "[%s],%s", f_reg_names[1][code & 0x01], obj); return (prefix + 3) | SUPPORTED; case 0x9a: @@ -492,7 +500,7 @@ offs_t nx8_500s_disassembler::dasm_composite(std::ostream &stream, offs_t pc, of return (prefix + 1) | SUPPORTED; case 0xfc: case 0xfd: case 0xfe: case 0xff: // dummy prefix - util::stream_format(stream, "%-8s", s_signed_jconds[code & 0x03]); + util::stream_format(stream, "%-8s", f_signed_jconds[code & 0x03]); format_n16(stream, pc + prefix + 2 + s8(opcodes.r8(pc + prefix + 1))); return (prefix + 2) | STEP_COND | SUPPORTED; @@ -580,7 +588,7 @@ offs_t nx8_500s_disassembler::disassemble(std::ostream &stream, offs_t pc, const { if ((byte2 & ((1 << n) - 1)) != 0) stream << ','; - stream << s_reg_names[(byte2 & 0x30) >> 4][n]; + stream << f_reg_names[(byte2 & 0x30) >> 4][n]; } } break; @@ -604,9 +612,9 @@ offs_t nx8_500s_disassembler::disassemble(std::ostream &stream, offs_t pc, const case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: - util::stream_format(stream, "%-8sA,", s_alu_ops[BIT(m_psw, 12)][byte1 >> 4]); + util::stream_format(stream, "%-8sA,", f_alu_ops[BIT(m_psw, 12)][byte1 >> 4]); if (BIT(m_psw, 12)) - stream << s_reg_names[BIT(byte1, 2)][byte1 & 0x03]; + stream << f_reg_names[BIT(byte1, 2)][byte1 & 0x03]; else util::stream_format(stream, "R%d", byte1 & 0x07); return 1 | SUPPORTED; @@ -617,12 +625,12 @@ offs_t nx8_500s_disassembler::disassemble(std::ostream &stream, offs_t pc, const return 2 | SUPPORTED; case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: - util::stream_format(stream, "%-8s%s,#", "MOV", s_reg_names[BIT(~byte1, 2)][byte1 & 0x03]); + util::stream_format(stream, "%-8s%s,#", "MOV", f_reg_names[BIT(~byte1, 2)][byte1 & 0x03]); format_n16(stream, opcodes.r16(pc + 1)); return 3 | SUPPORTED; case 0x30: case 0x31: case 0x32: case 0x33: - util::stream_format(stream, "%-8sA,%s", BIT(m_psw, 12) ? "ST" : "STB", s_pr_indirect[byte1 & 0x03]); + util::stream_format(stream, "%-8sA,%s", BIT(m_psw, 12) ? "ST" : "STB", f_pr_indirect[byte1 & 0x03]); return 1 | SUPPORTED; case 0x34: @@ -647,13 +655,13 @@ offs_t nx8_500s_disassembler::disassemble(std::ostream &stream, offs_t pc, const case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f: if (BIT(m_psw, 12)) - util::stream_format(stream, "%-8sA,%s", "ST", s_reg_names[BIT(byte1, 2)][byte1 & 0x03]); + util::stream_format(stream, "%-8sA,%s", "ST", f_reg_names[BIT(byte1, 2)][byte1 & 0x03]); else util::stream_format(stream, "%-8sA,R%d", "STB", byte1 & 0x07); return 1 | SUPPORTED; case 0x40: case 0x41: case 0x42: case 0x43: - util::stream_format(stream, "%-8s%s", "INC", s_reg_names[1][byte1 & 0x03]); + util::stream_format(stream, "%-8s%s", "INC", f_reg_names[1][byte1 & 0x03]); return 1 | SUPPORTED; case 0x44: case 0x45: case 0x46: case 0x47: case 0x54: case 0x55: case 0x56: case 0x57: @@ -665,7 +673,7 @@ offs_t nx8_500s_disassembler::disassemble(std::ostream &stream, offs_t pc, const case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: { const u8 byte2 = opcodes.r8(pc + 1); - util::stream_format(stream, "%-8s", s_bit_ops[byte2 >> 6]); + util::stream_format(stream, "%-8s", f_bit_ops[byte2 >> 6]); if (BIT(byte1, 4)) format_fix8(stream, 0xc0 | byte2); else @@ -682,17 +690,17 @@ offs_t nx8_500s_disassembler::disassemble(std::ostream &stream, offs_t pc, const } case 0x50: case 0x51: case 0x52: case 0x53: - util::stream_format(stream, "%-8s%s", "DEC", s_reg_names[1][byte1 & 0x03]); + util::stream_format(stream, "%-8s%s", "DEC", f_reg_names[1][byte1 & 0x03]); return 1 | SUPPORTED; case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: - return dasm_composite(stream, pc, 1, opcodes, s_reg_names[BIT(~byte1, 2)][byte1 & 0x03], true); + return dasm_composite(stream, pc, 1, opcodes, f_reg_names[BIT(~byte1, 2)][byte1 & 0x03], true); case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f: return dasm_composite(stream, pc, 1, opcodes, util::string_format("R%d", byte1 & 0x07), false); case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: - util::stream_format(stream, "%-8sA,%s", "L", s_reg_names[BIT(~byte1, 2)][byte1 & 0x03]); + util::stream_format(stream, "%-8sA,%s", "L", f_reg_names[BIT(~byte1, 2)][byte1 & 0x03]); return 1 | SUPPORTED; case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: @@ -701,7 +709,7 @@ offs_t nx8_500s_disassembler::disassemble(std::ostream &stream, offs_t pc, const case 0x80: case 0x81: case 0x82: case 0x83: case 0x90: case 0x91: case 0x92: case 0x93: - util::stream_format(stream, "%-8sA,%s", BIT(byte1, 4) ? "LB" : "L", s_pr_indirect[byte1 & 0x03]); + util::stream_format(stream, "%-8sA,%s", BIT(byte1, 4) ? "LB" : "L", f_pr_indirect[byte1 & 0x03]); return 1 | SUPPORTED; case 0x84: case 0x94: @@ -752,17 +760,17 @@ offs_t nx8_500s_disassembler::disassemble(std::ostream &stream, offs_t pc, const } case 0x8c: case 0x9c: case 0xac: - util::stream_format(stream, "%-8sA,", s_alu_ops[BIT(m_psw, 12)][(byte1 >> 4) & 0x07]); + util::stream_format(stream, "%-8sA,", f_alu_ops[BIT(m_psw, 12)][(byte1 >> 4) & 0x07]); format_fix8(stream, opcodes.r8(pc + 1)); return 2 | SUPPORTED; case 0x8d: case 0x9d: case 0xad: case 0xbd: case 0xcd: case 0xdd: - util::stream_format(stream, "%-8sA,", s_alu_ops[BIT(m_psw, 12)][(byte1 >> 4) & 0x07]); + util::stream_format(stream, "%-8sA,", f_alu_ops[BIT(m_psw, 12)][(byte1 >> 4) & 0x07]); format_off8(stream, opcodes.r8(pc + 1)); return 2 | SUPPORTED; case 0x8e: case 0x9e: case 0xae: case 0xbe: case 0xce: case 0xde: - util::stream_format(stream, "%-8sA,#", s_alu_ops[BIT(m_psw, 12)][(byte1 >> 4) & 0x07]); + util::stream_format(stream, "%-8sA,#", f_alu_ops[BIT(m_psw, 12)][(byte1 >> 4) & 0x07]); if (BIT(m_psw, 12)) { format_n16(stream, opcodes.r16(pc + 1)); @@ -784,7 +792,7 @@ offs_t nx8_500s_disassembler::disassemble(std::ostream &stream, offs_t pc, const case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xb0: case 0xb1: case 0xb2: case 0xb3: - return dasm_composite(stream, pc, 1, opcodes, s_pr_indirect[byte1 & 0x03], !BIT(byte1, 4)); + return dasm_composite(stream, pc, 1, opcodes, f_pr_indirect[byte1 & 0x03], !BIT(byte1, 4)); case 0xa4: case 0xb4: { @@ -818,7 +826,7 @@ offs_t nx8_500s_disassembler::disassemble(std::ostream &stream, offs_t pc, const { std::ostringstream string; format_n16(string, opcodes.r16(pc + 1)); - util::stream_format(string, "[%s]", s_reg_names[1][byte1 & 0x01]); + util::stream_format(string, "[%s]", f_reg_names[1][byte1 & 0x01]); return dasm_composite(stream, pc, 3, opcodes, string.str(), !BIT(byte1, 4)); } @@ -968,7 +976,7 @@ offs_t nx8_500s_disassembler::disassemble(std::ostream &stream, offs_t pc, const return 1 | STEP_OVER | SUPPORTED; case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: - util::stream_format(stream, "%-8s", s_jconds[byte1 & 0x07]); + util::stream_format(stream, "%-8s", f_jconds[byte1 & 0x07]); format_n16(stream, pc + 2 + s8(opcodes.r8(pc + 1))); return 2 | STEP_COND | SUPPORTED; diff --git a/src/devices/cpu/olms66k/nx8dasm.h b/src/devices/cpu/olms66k/nx8dasm.h index 6f50a34ff1868..2d3a4fba02e82 100644 --- a/src/devices/cpu/olms66k/nx8dasm.h +++ b/src/devices/cpu/olms66k/nx8dasm.h @@ -20,14 +20,6 @@ class nx8_500s_disassembler : public util::disasm_interface virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; private: - // formatting helpers - static void format_n8(std::ostream &stream, u8 n8); - static void format_n16(std::ostream &stream, u16 n16); - static void format_fix8(std::ostream &stream, u8 n8); - static void format_off8(std::ostream &stream, u8 n8); - static void format_dir16(std::ostream &stream, u16 n16); - static void format_sfr8(std::ostream &stream, u8 n8, bool word); - offs_t dasm_composite(std::ostream &stream, offs_t pc, offs_t prefix, const data_buffer &opcodes, std::string obj, bool word) const; const u16 &m_psw; diff --git a/src/mame/alba/albazg.cpp b/src/mame/alba/albazg.cpp index e5d7896efad12..a952ea13a2cf6 100644 --- a/src/mame/alba/albazg.cpp +++ b/src/mame/alba/albazg.cpp @@ -118,11 +118,10 @@ TILE_GET_INFO_MEMBER(albazg_state::get_tile_info) const u16 code = m_video_ram[tile_index] | ((attr & 0xf8) << 3); tileinfo.set( - 0, - code, - attr & 0x7, - 0 - ); + 0, + code, + attr & 0x7, + 0); } diff --git a/src/mame/apple/dfac.cpp b/src/mame/apple/dfac.cpp index dcb20dfb904b3..38e0c89335001 100644 --- a/src/mame/apple/dfac.cpp +++ b/src/mame/apple/dfac.cpp @@ -100,15 +100,15 @@ static constexpr double atten_table[8] = 1.0 // No attenuation }; -dfac_device::dfac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, APPLE_DFAC, tag, owner, clock), - device_sound_interface(mconfig, *this), - m_stream(nullptr), - m_data(false), - m_clock(false), - m_dfaclatch(false), - m_settings_byte(0), - m_latch_byte(0) +dfac_device::dfac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, APPLE_DFAC, tag, owner, clock), + device_sound_interface(mconfig, *this), + m_stream(nullptr), + m_data(false), + m_clock(false), + m_dfaclatch(false), + m_settings_byte(0), + m_latch_byte(0) { } diff --git a/src/mame/apple/omega.cpp b/src/mame/apple/omega.cpp index cc6f2334ae889..d7e3fdd42362c 100644 --- a/src/mame/apple/omega.cpp +++ b/src/mame/apple/omega.cpp @@ -64,17 +64,17 @@ DEFINE_DEVICE_TYPE(APPLE_OMEGA, omega_device, "aplomega", "Apple Omega PLL Clock Synthesizer") -omega_device::omega_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, APPLE_OMEGA, tag, owner, clock), - m_write_pclock(*this), - m_data(false), - m_clock(false), - m_latch(false), - m_latch_byte(0), - m_N(0), - m_D(0), - m_P(0), - m_bit(0) +omega_device::omega_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, APPLE_OMEGA, tag, owner, clock), + m_write_pclock(*this), + m_data(false), + m_clock(false), + m_latch(false), + m_latch_byte(0), + m_N(0), + m_D(0), + m_P(0), + m_bit(0) { } diff --git a/src/mame/irem/m58.cpp b/src/mame/irem/m58.cpp index 48ce3238f6c63..c1046bc347ea1 100644 --- a/src/mame/irem/m58.cpp +++ b/src/mame/irem/m58.cpp @@ -312,15 +312,13 @@ void m58_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) } m_gfxdecode->gfx(1)->transmask(bitmap, cliprect, - code1 + 256 * bank, color, - flipx, flipy, sx, visarea.min_y + sy1, - m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 512) - ); + code1 + 256 * bank, color, + flipx, flipy, sx, visarea.min_y + sy1, + m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 512)); m_gfxdecode->gfx(1)->transmask(bitmap, cliprect, - code2 + 256 * bank, color, - flipx, flipy, sx, visarea.min_y + sy2, - m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 512) - ); + code2 + 256 * bank, color, + flipx, flipy, sx, visarea.min_y + sy2, + m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 512)); } } diff --git a/src/mame/misc/chance32.cpp b/src/mame/misc/chance32.cpp index 80e9fee5702ae..4857c23515650 100644 --- a/src/mame/misc/chance32.cpp +++ b/src/mame/misc/chance32.cpp @@ -24,6 +24,7 @@ Osaka, Japan. **************************************************************************************************/ #include "emu.h" + #include "cpu/z80/z80.h" #include "sound/okim6295.h" #include "video/mc6845.h" @@ -45,8 +46,9 @@ class chance32_state : public driver_device , m_maincpu(*this, "maincpu") , m_vram(*this, "vram%u", 0U) , m_gfxdecode(*this, "gfxdecode") + , m_key_matrix(*this, "IN%u", 0U) , m_lamps(*this, "lamp%u", 0U) - { } + { } void chance32(machine_config &config); @@ -79,6 +81,7 @@ class chance32_state : public driver_device required_shared_ptr_array m_vram; required_device m_gfxdecode; + required_ioport_array<4> m_key_matrix; output_finder<13> m_lamps; }; @@ -86,13 +89,12 @@ class chance32_state : public driver_device template TILE_GET_INFO_MEMBER(chance32_state::get_tile_info) { const u16 code = (m_vram[N][tile_index * 2 + 1] << 8) | m_vram[N][tile_index * 2]; - const u8 flip = (~code >> 12) & 1; + const u8 flip = BIT(~code, 12); tileinfo.set( - N, - code & 0x0fff, - code >> 13, - TILE_FLIPYX(flip << 1 | flip) - ); + N, + code & 0x0fff, + code >> 13, + TILE_FLIPYX(flip << 1 | flip)); } void chance32_state::video_start() @@ -123,14 +125,11 @@ void chance32_state::key_matrix_w(uint8_t data) uint8_t chance32_state::key_matrix_r() { - uint8_t res,i; - const char *const portnames[4] = { "IN0", "IN1", "IN2", "IN3" }; - res = 0; - - for(i = 0; i < 4; i++) + uint8_t res = 0; + for (unsigned i = 0; i < 4; i++) { - if(BIT(m_port_select, i)) - res |= ioport(portnames[i])->read(); + if (BIT(m_port_select, i)) + res |= m_key_matrix[i]->read(); } return res; @@ -203,8 +202,8 @@ void chance32_state::main_map(address_map &map) map(0x0000, 0xcfff).rom(); map(0xd800, 0xdfff).ram(); map(0xe000, 0xefff).ram().w("palette", FUNC(palette_device::write8)).share("palette"); - map(0xf000, 0xf7ff).ram().w(FUNC(chance32_state::vram_w<1>)).share("vram1"); - map(0xf800, 0xffff).ram().w(FUNC(chance32_state::vram_w<0>)).share("vram0"); + map(0xf000, 0xf7ff).ram().w(FUNC(chance32_state::vram_w<1>)).share(m_vram[1]); + map(0xf800, 0xffff).ram().w(FUNC(chance32_state::vram_w<0>)).share(m_vram[0]); } void chance32_state::main_io(address_map &map) diff --git a/src/mame/philips/mcd212.cpp b/src/mame/philips/mcd212.cpp index edebc8145bb22..686a0aaf1ee85 100644 --- a/src/mame/philips/mcd212.cpp +++ b/src/mame/philips/mcd212.cpp @@ -54,7 +54,7 @@ inline ATTR_FORCE_INLINE uint8_t mcd212_device::get_region_op(const uint32_t reg void mcd212_device::update_region_arrays() { - bool latched_rf[2] { false, false }; + bool latched_rf[2]{ false, false }; uint8_t latched_wfa = m_weight_factor[0][0]; uint8_t latched_wfb = m_weight_factor[1][0]; const int width = get_screen_width(); @@ -441,45 +441,45 @@ void mcd212_device::process_ica() { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: // STOP case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: STOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: STOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path); return; case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: // NOP case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: NOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: NOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path); break; case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: // RELOAD DCP case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD DCP: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff ); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD DCP: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff); set_dcp(cmd & 0x003ffffc); break; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: // RELOAD DCP and STOP case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD DCP and STOP: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff ); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD DCP and STOP: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff); set_dcp(cmd & 0x003ffffc); return; case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: // RELOAD VSR (ICA) case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: case 0x4e: case 0x4f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD VSR: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff ); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD VSR: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff); addr = (cmd & 0x0007ffff) / 2; break; case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: // RELOAD VSR and STOP case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD VSR and STOP: VSR = %05x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff ); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD VSR and STOP: VSR = %05x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff); set_vsr(cmd & 0x003fffff); return; case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: // INTERRUPT case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: INTERRUPT\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: INTERRUPT\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path); m_csrr[1] |= 1 << (2 - Path); if (m_csrr[1] & (CSR2R_IT1 | CSR2R_IT2)) m_int_callback(ASSERT_LINE); break; case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: // RELOAD DISPLAY PARAMETERS - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD DISPLAY PARAMETERS\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: RELOAD DISPLAY PARAMETERS\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path); set_display_parameters(cmd & 0x1f); break; default: - LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: SET REGISTER %02x = %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd >> 24, cmd & 0x00ffffff ); + LOGMASKED(LOG_ICA, "%08x: %08x: ICA %d: SET REGISTER %02x = %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd >> 24, cmd & 0x00ffffff); set_register(cmd >> 24, cmd & 0x00ffffff); break; } @@ -497,7 +497,7 @@ void mcd212_device::process_dca() bool addr_changed = false; bool processing = true; - LOGMASKED(LOG_DCA, "Scanline %d: Processing DCA %d\n", screen().vpos(), Path ); + LOGMASKED(LOG_DCA, "Scanline %d: Processing DCA %d\n", screen().vpos(), Path); while (processing && count < max) { @@ -508,43 +508,43 @@ void mcd212_device::process_dca() { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: // STOP case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: STOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: STOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path); processing = false; break; case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: // NOP case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: NOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: NOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path); break; case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: // RELOAD DCP case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD DCP (NOP)\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD DCP (NOP)\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path); break; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: // RELOAD DCP and STOP case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD DCP and STOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD DCP and STOP\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path); set_dcp(cmd & 0x003ffffc); m_dca[Path] = cmd & 0x0007fffc; return; case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: // RELOAD VSR case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: case 0x4e: case 0x4f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD VSR: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff ); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD VSR: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff); set_vsr(cmd & 0x003fffff); break; case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: // RELOAD VSR and STOP case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD VSR and STOP: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff ); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD VSR and STOP: %06x\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path, cmd & 0x001fffff); set_vsr(cmd & 0x003fffff); processing = false; break; case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: // INTERRUPT case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f: - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: INTERRUPT\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: INTERRUPT\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path); m_csrr[1] |= 1 << (2 - Path); if (m_csrr[1] & (CSR2R_IT1 | CSR2R_IT2)) m_int_callback(ASSERT_LINE); break; case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: // RELOAD DISPLAY PARAMETERS - LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD DISPLAY PARAMETERS\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path ); + LOGMASKED(LOG_DCA, "%08x: %08x: DCA %d: RELOAD DISPLAY PARAMETERS\n", (addr - 2) * 2 + Path * 0x200000, cmd, Path); set_display_parameters(cmd & 0x1f); break; default: @@ -635,9 +635,9 @@ int mcd212_device::get_plane_width() } template -void mcd212_device::process_vsr(uint32_t* pixels, bool* transparent) +void mcd212_device::process_vsr(uint32_t *pixels, bool *transparent) { - const uint8_t* data = reinterpret_cast(Path ? m_planeb.target() : m_planea.target()); + const uint8_t *data = reinterpret_cast(Path ? m_planeb.target() : m_planea.target()); const uint8_t icm = get_icm(); const uint8_t transp_ctrl = get_transparency_control(); const int width = get_screen_width(); @@ -658,8 +658,8 @@ void mcd212_device::process_vsr(uint32_t* pixels, bool* transparent) const uint32_t dyuv_abs_start = m_dyuv_abs_start[Path]; uint8_t y = (dyuv_abs_start >> 16) & 0x000000ff; - uint8_t u = (dyuv_abs_start >> 8) & 0x000000ff; - uint8_t v = (dyuv_abs_start >> 0) & 0x000000ff; + uint8_t u = (dyuv_abs_start >> 8) & 0x000000ff; + uint8_t v = (dyuv_abs_start >> 0) & 0x000000ff; const uint32_t mask_bits = (~m_mask_color[Path]) & 0x00fcfcfc; const uint32_t transp_match = m_transparent_color[Path] & mask_bits; @@ -667,7 +667,7 @@ void mcd212_device::process_vsr(uint32_t* pixels, bool* transparent) const bool transp_always = (transp_ctrl_masked == TCR_COND_1); const bool invert_transp_condition = BIT(transp_ctrl, 3); const int region_flag_index = 1 - (transp_ctrl_masked & 1); - const bool* region_flags = m_region_flag[region_flag_index]; + const bool *region_flags = m_region_flag[region_flag_index]; const bool use_region_flag = (transp_ctrl_masked >= TCR_COND_RF0_1 && transp_ctrl_masked <= TCR_COND_RF1KEY_1); bool use_color_key = (transp_ctrl_masked == TCR_COND_KEY_1 || transp_ctrl_masked == TCR_COND_RF0KEY_1 || transp_ctrl_masked == TCR_COND_RF1KEY_1); @@ -689,7 +689,7 @@ void mcd212_device::process_vsr(uint32_t* pixels, bool* transparent) const uint8_t u2 = (u >> 1) + (u4 >> 1) + (u & u4 & 1); const uint8_t v2 = (v >> 1) + (v4 >> 1) + (v & v4 & 1); - uint32_t* limit_rgb = m_dyuv_limit_lut + y2 + 0x100; + uint32_t *limit_rgb = m_dyuv_limit_lut + y2 + 0x100; color0 = (limit_rgb[m_dyuv_v_to_r[v2]] << 16) | (limit_rgb[m_dyuv_u_to_g[u2] + m_dyuv_v_to_g[v2]] << 8) | limit_rgb[m_dyuv_u_to_b[u2]]; limit_rgb = m_dyuv_limit_lut + y4 + 0x100; color1 = (limit_rgb[m_dyuv_v_to_r[v4]] << 16) | (limit_rgb[m_dyuv_u_to_g[u4] + m_dyuv_v_to_g[v4]] << 8) | limit_rgb[m_dyuv_u_to_b[u4]]; @@ -707,36 +707,39 @@ void mcd212_device::process_vsr(uint32_t* pixels, bool* transparent) transparent[x + 2] = (transp_always || (use_region_flag && region_flags[x + 2])) != invert_transp_condition; transparent[x + 3] = (transp_always || (use_region_flag && region_flags[x + 3])) != invert_transp_condition; x += 4; - continue; } - else if (icm == ICM_CLUT4) + else { - const uint8_t mask = (decodingMode == DDR_FT_RLE) ? 0x7 : 0xf; - color0 = m_clut[BYTE_TO_CLUT(icm, mask & (byte >> 4))]; - color1 = m_clut[BYTE_TO_CLUT(icm, mask & byte)]; - } - else { - color1 = color0 = m_clut[BYTE_TO_CLUT(icm, byte)]; - } + if (icm == ICM_CLUT4) + { + const uint8_t mask = (decodingMode == DDR_FT_RLE) ? 0x7 : 0xf; + color0 = m_clut[BYTE_TO_CLUT(icm, mask & (byte >> 4))]; + color1 = m_clut[BYTE_TO_CLUT(icm, mask & byte)]; + } + else + { + color1 = color0 = m_clut[BYTE_TO_CLUT(icm, byte)]; + } - int m_length = mosaic_enable ? mosaic_factor * 2 : 2; - if (decodingMode == DDR_FT_RLE) - { - const uint16_t length = (byte & 0x80) ? data[((vsr++) & 0x0007ffff) ^ 1] : 1; - m_length = length ? length * 2 : width; - } + int length_m = mosaic_enable ? (mosaic_factor * 2) : 2; + if (decodingMode == DDR_FT_RLE) + { + const uint16_t length = (byte & 0x80) ? data[((vsr++) & 0x0007ffff) ^ 1] : 1; + length_m = length ? (length * 2) : width; + } - const bool color_match0 = (mask_bits & color0) == transp_match; - const bool color_match1 = (mask_bits & color1) == transp_match; - const int end = std::min(width, (int)x + m_length); - for (int rl_index = x; rl_index < end; rl_index += 2) - { - pixels[rl_index] = color0; - transparent[rl_index] = (transp_always || (use_color_key && color_match0) || (use_region_flag && region_flags[rl_index])) != invert_transp_condition; - pixels[rl_index + 1] = color1; - transparent[rl_index + 1] = (transp_always || (use_color_key && color_match1) || (use_region_flag && region_flags[rl_index + 1])) != invert_transp_condition; + const bool color_match0 = (mask_bits & color0) == transp_match; + const bool color_match1 = (mask_bits & color1) == transp_match; + const int end = std::min(width, x + length_m); + for (int rl_index = x; rl_index < end; rl_index += 2) + { + pixels[rl_index] = color0; + transparent[rl_index] = (transp_always || (use_color_key && color_match0) || (use_region_flag && region_flags[rl_index])) != invert_transp_condition; + pixels[rl_index + 1] = color1; + transparent[rl_index + 1] = (transp_always || (use_color_key && color_match1) || (use_region_flag && region_flags[rl_index + 1])) != invert_transp_condition; + } + x = end; } - x = end; } set_vsr(vsr); } @@ -1199,7 +1202,7 @@ int mcd212_device::ram_dtack_cycle_count() return 2; // System access is restricted to the last 5 out of every 16 CLKs. - const int slot_cycle = (int)(machine().time().as_ticks(clock()) & 0xf); + const int slot_cycle = int(machine().time().as_ticks(clock()) & 0xf); if (slot_cycle >= 11) return 2; diff --git a/src/mame/taito/taitotz.cpp b/src/mame/taito/taitotz.cpp index 4cec9e9b8bc20..cf8794ca1dd26 100644 --- a/src/mame/taito/taitotz.cpp +++ b/src/mame/taito/taitotz.cpp @@ -180,22 +180,22 @@ RIZINGPINGPONG M43J0775A (Sticker) #include "video/poly.h" #include "screen.h" -#define LOG_PPC_TO_TLCS_COMMANDS (1U << 1) -#define LOG_TLCS_TO_PPC_COMMANDS (1U << 2) -#define LOG_VIDEO_REG_1_RD (1U << 3) -#define LOG_VIDEO_REG_2_RD (1U << 4) -#define LOG_VIDEO_REG_UNK_RD (1U << 5) -#define LOG_VIDEO_REG_1_WR (1U << 6) -#define LOG_VIDEO_REG_2_WR (1U << 7) -#define LOG_VIDEO_REG_UNK_WR (1U << 8) -#define LOG_VIDEO_CHIP_UNK_RD (1U << 9) -#define LOG_VIDEO_CHIP_UNK_WR (1U << 10) -#define LOG_DIRECT_FIFO (1U << 11) -#define LOG_TNL_FIFO (1U << 12) -#define LOG_RTC_UNK_RD (1U << 13) -#define LOG_RTC_UNK_WR (1U << 14) -#define LOG_VIDEO_MEM_UNK_RD (1U << 15) -#define LOG_VIDEO_MEM_UNK_WR (1U << 16) +#define LOG_PPC_TO_TLCS_COMMANDS (1U << 1) +#define LOG_TLCS_TO_PPC_COMMANDS (1U << 2) +#define LOG_VIDEO_REG_1_RD (1U << 3) +#define LOG_VIDEO_REG_2_RD (1U << 4) +#define LOG_VIDEO_REG_UNK_RD (1U << 5) +#define LOG_VIDEO_REG_1_WR (1U << 6) +#define LOG_VIDEO_REG_2_WR (1U << 7) +#define LOG_VIDEO_REG_UNK_WR (1U << 8) +#define LOG_VIDEO_CHIP_UNK_RD (1U << 9) +#define LOG_VIDEO_CHIP_UNK_WR (1U << 10) +#define LOG_DIRECT_FIFO (1U << 11) +#define LOG_TNL_FIFO (1U << 12) +#define LOG_RTC_UNK_RD (1U << 13) +#define LOG_RTC_UNK_WR (1U << 14) +#define LOG_VIDEO_MEM_UNK_RD (1U << 15) +#define LOG_VIDEO_MEM_UNK_WR (1U << 16) #define VERBOSE (0) @@ -561,19 +561,19 @@ class taitotz_state : public driver_device { } - void taitotz(machine_config &config); - void landhigh(machine_config &config); - - void init_batlgr2a(); - void init_batlgr2(); - void init_pwrshovl(); - void init_batlgear(); - void init_dendego3(); - void init_landhigh(); - void init_landhigha(); - void init_raizpin(); - void init_raizpinj(); - void init_styphp(); + void taitotz(machine_config &config) ATTR_COLD; + void landhigh(machine_config &config) ATTR_COLD; + + void init_batlgr2a() ATTR_COLD; + void init_batlgr2() ATTR_COLD; + void init_pwrshovl() ATTR_COLD; + void init_batlgear() ATTR_COLD; + void init_dendego3() ATTR_COLD; + void init_landhigh() ATTR_COLD; + void init_landhigha() ATTR_COLD; + void init_raizpin() ATTR_COLD; + void init_raizpinj() ATTR_COLD; + void init_styphp() ATTR_COLD; required_device m_screen;