Save states should not be break when changing output. Also get rid of a few dozen output().set_value(...) calls in favour of output finders. (nw)

This has the detrimental effect that outputs used in layouts will get the default value from the last element in the last view that uses them _after_ devices are started.  If drivers/devices set initial output values on start rather than reset this could cause a problem.
This commit is contained in:
Vas Crabb 2019-12-13 20:08:31 +11:00
parent a02617900c
commit 6f5d2ad326
9 changed files with 181 additions and 125 deletions

View File

@ -249,8 +249,6 @@ void running_machine::start()
m_debugger = std::make_unique<debugger_manager>(*this);
}
m_render->resolve_tags();
manager().create_custom(*this);
// resolve objects that are created by memory maps
@ -267,6 +265,8 @@ void running_machine::start()
// save outputs created before start time
output().register_save();
m_render->resolve_tags();
// load cheat files
manager().load_cheatfiles(*this);

View File

@ -15,7 +15,7 @@
#include <algorithm>
#define OUTPUT_VERBOSE 0
#define OUTPUT_VERBOSE 0
@ -107,6 +107,9 @@ void output_manager::register_save()
// register the reserved space for saving
machine().save().save_pointer(nullptr, "output", nullptr, 0, NAME(m_save_data), m_itemtable.size());
if (OUTPUT_VERBOSE)
osd_printf_verbose("Registered %u outputs for save states\n", m_itemtable.size());
}
@ -114,7 +117,7 @@ void output_manager::register_save()
find_item - find an item based on a string
-------------------------------------------------*/
output_manager::output_item* output_manager::find_item(const char *string)
output_manager::output_item *output_manager::find_item(char const *string)
{
auto item = m_itemtable.find(std::string(string));
if (item != m_itemtable.end())
@ -128,8 +131,11 @@ output_manager::output_item* output_manager::find_item(const char *string)
create_new_item - create a new item
-------------------------------------------------*/
output_manager::output_item &output_manager::create_new_item(const char *outname, s32 value)
output_manager::output_item &output_manager::create_new_item(char const *outname, s32 value)
{
if (OUTPUT_VERBOSE)
osd_printf_verbose("Creating output %s = %d%s\n", outname, value, m_save_data ? " (will not be saved)" : "");
auto const ins(m_itemtable.emplace(
std::piecewise_construct,
std::forward_as_tuple(outname),
@ -138,7 +144,7 @@ output_manager::output_item &output_manager::create_new_item(const char *outname
return ins.first->second;
}
output_manager::output_item &output_manager::find_or_create_item(const char *outname, s32 value)
output_manager::output_item &output_manager::find_or_create_item(char const *outname, s32 value)
{
output_item *const item = find_item(outname);
return item ? *item : create_new_item(outname, value);
@ -186,7 +192,7 @@ void output_manager::postload()
output_set_value - set the value of an output
-------------------------------------------------*/
void output_manager::set_value(const char *outname, s32 value)
void output_manager::set_value(char const *outname, s32 value)
{
output_item *const item = find_item(outname);
@ -203,7 +209,7 @@ void output_manager::set_value(const char *outname, s32 value)
output
-------------------------------------------------*/
s32 output_manager::get_value(const char *outname)
s32 output_manager::get_value(char const *outname)
{
output_item const *const item = find_item(outname);
@ -218,7 +224,7 @@ s32 output_manager::get_value(const char *outname)
if nullptr is specified
-------------------------------------------------*/
void output_manager::set_notifier(const char *outname, notifier_func callback, void *param)
void output_manager::set_notifier(char const *outname, notifier_func callback, void *param)
{
// if an item is specified, find/create it
if (outname)
@ -238,7 +244,7 @@ void output_manager::set_notifier(const char *outname, notifier_func callback, v
a given name
-------------------------------------------------*/
u32 output_manager::name_to_id(const char *outname)
u32 output_manager::name_to_id(char const *outname)
{
// if no item, ID is 0
output_item const *const item = find_item(outname);
@ -251,12 +257,12 @@ u32 output_manager::name_to_id(const char *outname)
to a given unique ID
-------------------------------------------------*/
const char *output_manager::id_to_name(u32 id)
char const *output_manager::id_to_name(u32 id)
{
for (auto &item : m_itemtable)
if (item.second.id() == id)
return item.second.name().c_str();
/* nothing found, return nullptr */
// nothing found, return nullptr
return nullptr;
}

View File

@ -3315,18 +3315,12 @@ layout_view::item::item(
, m_color(render_color_multiply(env.parse_color(itemnode.get_child("color")), color))
, m_blend_mode(get_blend_mode(env, itemnode))
{
// outputs need resolving
if (m_have_output)
m_output.resolve();
// fetch common data
int index = env.get_attribute_int(itemnode, "index", -1);
if (index != -1)
m_screen = screen_device_iterator(env.machine().root_device()).byindex(index);
for (u32 mask = m_input_mask; (mask != 0) && (~mask & 1); mask >>= 1)
m_input_shift++;
if (m_have_output && m_element)
m_output = m_element->default_state();
// sanity checks
if (strcmp(itemnode.get_name(), "screen") == 0)
@ -3411,6 +3405,13 @@ int layout_view::item::state() const
void layout_view::item::resolve_tags()
{
if (m_have_output)
{
m_output.resolve();
if (m_element)
m_output = m_element->default_state();
}
if (!m_input_tag.empty())
{
m_input_port = m_element->machine().root_device().ioport(m_input_tag.c_str());

View File

@ -80,13 +80,18 @@ public:
m_fdc(*this, "fdc"),
m_floppy(*this, "fdc:0"),
m_palette(*this, "palette"),
m_sound_buffer(0), m_sound_latch(false)
m_leds(*this, "led_%u", 0U),
m_sound_buffer(0),
m_sound_latch(false)
{ }
void guab(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
protected:
virtual void machine_start() override;
private:
EF9369_COLOR_UPDATE(ef9369_color_update);
DECLARE_WRITE16_MEMBER(tms34061_w);
@ -110,9 +115,6 @@ private:
void guab_map(address_map &map);
virtual void machine_start() override;
required_device<cpu_device> m_maincpu;
required_device<tms34061_device> m_tms34061;
required_device<sn76489_device> m_sn;
@ -120,6 +122,8 @@ private:
required_device<floppy_connector> m_floppy;
required_device<palette_device> m_palette;
output_finder<48> m_leds;
uint8_t m_sound_buffer;
bool m_sound_latch;
};
@ -304,6 +308,8 @@ uint32_t guab_state::screen_update_guab(screen_device &screen, bitmap_ind16 &bit
void guab_state::machine_start()
{
m_leds.resolve();
m_fdc->set_floppy(m_floppy->get_device());
}
@ -359,74 +365,74 @@ INPUT_CHANGED_MEMBER( guab_state::coin_inserted )
WRITE8_MEMBER( guab_state::output1_w )
{
output().set_value("led_0", BIT(data, 0)); // cash in (ten up: cash in)
output().set_value("led_1", BIT(data, 1)); // cash out (ten up: cash out)
output().set_value("led_2", BIT(data, 2));
output().set_value("led_3", BIT(data, 3));
output().set_value("led_4", BIT(data, 4));
output().set_value("led_5", BIT(data, 5));
output().set_value("led_6", BIT(data, 6)); // (ten up: 10p/100p drive)
output().set_value("led_7", BIT(data, 7));
m_leds[0] = BIT(data, 0); // cash in (ten up: cash in)
m_leds[1] = BIT(data, 1); // cash out (ten up: cash out)
m_leds[2] = BIT(data, 2);
m_leds[3] = BIT(data, 3);
m_leds[4] = BIT(data, 4);
m_leds[5] = BIT(data, 5);
m_leds[6] = BIT(data, 6); // (ten up: 10p/100p drive)
m_leds[7] = BIT(data, 7);
}
WRITE8_MEMBER( guab_state::output2_w )
{
output().set_value("led_8", BIT(data, 0));
output().set_value("led_9", BIT(data, 1));
output().set_value("led_10", BIT(data, 2)); // start (ten up: start)
output().set_value("led_11", BIT(data, 3)); // (ten up: feature 6)
output().set_value("led_12", BIT(data, 4)); // (ten up: feature 11)
output().set_value("led_13", BIT(data, 5)); // (ten up: feature 13)
output().set_value("led_14", BIT(data, 6)); // lamp a (ten up: feature 12)
output().set_value("led_15", BIT(data, 7)); // lamp b (ten up: pass)
m_leds[8] = BIT(data, 0);
m_leds[9] = BIT(data, 1);
m_leds[10] = BIT(data, 2); // start (ten up: start)
m_leds[11] = BIT(data, 3); // (ten up: feature 6)
m_leds[12] = BIT(data, 4); // (ten up: feature 11)
m_leds[13] = BIT(data, 5); // (ten up: feature 13)
m_leds[14] = BIT(data, 6); // lamp a (ten up: feature 12)
m_leds[15] = BIT(data, 7); // lamp b (ten up: pass)
}
WRITE8_MEMBER( guab_state::output3_w )
{
output().set_value("led_16", BIT(data, 0)); // select (ten up: collect)
output().set_value("led_17", BIT(data, 1)); // (ten up: feature 14)
output().set_value("led_18", BIT(data, 2)); // (ten up: feature 9)
output().set_value("led_19", BIT(data, 3)); // (ten up: lamp a)
output().set_value("led_20", BIT(data, 4)); // lamp c (ten up: lamp b)
output().set_value("led_21", BIT(data, 5)); // lamp d (ten up: lamp c)
output().set_value("led_22", BIT(data, 6));
output().set_value("led_23", BIT(data, 7));
m_leds[16] = BIT(data, 0); // select (ten up: collect)
m_leds[17] = BIT(data, 1); // (ten up: feature 14)
m_leds[18] = BIT(data, 2); // (ten up: feature 9)
m_leds[19] = BIT(data, 3); // (ten up: lamp a)
m_leds[20] = BIT(data, 4); // lamp c (ten up: lamp b)
m_leds[21] = BIT(data, 5); // lamp d (ten up: lamp c)
m_leds[22] = BIT(data, 6);
m_leds[23] = BIT(data, 7);
}
WRITE8_MEMBER( guab_state::output4_w )
{
output().set_value("led_24", BIT(data, 0)); // feature 1 (ten up: feature 1)
output().set_value("led_25", BIT(data, 1)); // feature 2 (ten up: feature 10)
output().set_value("led_26", BIT(data, 2)); // feature 3 (ten up: feature 7)
output().set_value("led_27", BIT(data, 3)); // feature 4 (ten up: feature 2)
output().set_value("led_28", BIT(data, 4)); // feature 5 (ten up: feature 8)
output().set_value("led_29", BIT(data, 5)); // feature 6 (ten up: feature 3)
output().set_value("led_30", BIT(data, 6)); // feature 7 (ten up: feature 4)
output().set_value("led_31", BIT(data, 7)); // feature 8 (ten up: feature 5)
m_leds[24] = BIT(data, 0); // feature 1 (ten up: feature 1)
m_leds[25] = BIT(data, 1); // feature 2 (ten up: feature 10)
m_leds[26] = BIT(data, 2); // feature 3 (ten up: feature 7)
m_leds[27] = BIT(data, 3); // feature 4 (ten up: feature 2)
m_leds[28] = BIT(data, 4); // feature 5 (ten up: feature 8)
m_leds[29] = BIT(data, 5); // feature 6 (ten up: feature 3)
m_leds[30] = BIT(data, 6); // feature 7 (ten up: feature 4)
m_leds[31] = BIT(data, 7); // feature 8 (ten up: feature 5)
}
WRITE8_MEMBER( guab_state::output5_w )
{
output().set_value("led_32", BIT(data, 0));
output().set_value("led_33", BIT(data, 1));
output().set_value("led_34", BIT(data, 2));
output().set_value("led_35", BIT(data, 3));
output().set_value("led_36", BIT(data, 4));
output().set_value("led_37", BIT(data, 5));
output().set_value("led_38", BIT(data, 6));
output().set_value("led_39", BIT(data, 7)); // mech lamp (ten up: mech lamp)
m_leds[32] = BIT(data, 0);
m_leds[33] = BIT(data, 1);
m_leds[34] = BIT(data, 2);
m_leds[35] = BIT(data, 3);
m_leds[36] = BIT(data, 4);
m_leds[37] = BIT(data, 5);
m_leds[38] = BIT(data, 6);
m_leds[39] = BIT(data, 7); // mech lamp (ten up: mech lamp)
}
WRITE8_MEMBER( guab_state::output6_w )
{
output().set_value("led_40", BIT(data, 0));
output().set_value("led_41", BIT(data, 1));
output().set_value("led_42", BIT(data, 2));
output().set_value("led_43", BIT(data, 3));
output().set_value("led_44", BIT(data, 4)); // 50p drive (ten up: 10p drive)
output().set_value("led_45", BIT(data, 5)); // 100p drive (ten up: 100p drive)
output().set_value("led_46", BIT(data, 6));
output().set_value("led_47", BIT(data, 7));
m_leds[40] = BIT(data, 0);
m_leds[41] = BIT(data, 1);
m_leds[42] = BIT(data, 2);
m_leds[43] = BIT(data, 3);
m_leds[44] = BIT(data, 4); // 50p drive (ten up: 10p drive)
m_leds[45] = BIT(data, 5); // 100p drive (ten up: 100p drive)
m_leds[46] = BIT(data, 6);
m_leds[47] = BIT(data, 7);
}
static DEVICE_INPUT_DEFAULTS_START( acia_1_rs232_defaults )

View File

@ -121,6 +121,11 @@ protected:
, m_led_active_bank(*this, "led_active_bank_%u", 0U)
, m_led_execution(*this, "led_execution_x%u_%u", 2U, 0U)
, m_led_last_ptr(*this, "led_last_ptr_x%u_%u", 2U, 0U)
, m_led_status_ptr_valid(*this, "led_status_ptr_valid")
, m_led_status_search(*this, "led_status_search")
, m_led_mode_mon(*this, "led_mode_mon")
, m_led_mode_ram(*this, "led_mode_ram")
, m_led_mode_prom(*this, "led_mode_prom")
{
}
@ -199,6 +204,11 @@ private:
output_finder<4> m_led_active_bank;
output_finder<2, 4> m_led_execution;
output_finder<2, 4> m_led_last_ptr;
output_finder<> m_led_status_ptr_valid;
output_finder<> m_led_status_search;
output_finder<> m_led_mode_mon;
output_finder<> m_led_mode_ram;
output_finder<> m_led_mode_prom;
emu_timer *m_reset_timer = nullptr;
@ -339,7 +349,7 @@ void intellec4_state::bus_cycle(mcs40_cpu_device_base::phase step, u8 sync, u8 d
break;
case mcs40_cpu_device_base::phase::X3:
if (m_search_complete != m_adr_cmp_latch)
machine().output().set_value("led_status_search", m_search_complete = m_adr_cmp_latch);
m_led_status_search = m_search_complete = m_adr_cmp_latch;
if (!m_search_complete && !m_cma_enable)
{
display_execution(data, 0x0fU);
@ -347,7 +357,7 @@ void intellec4_state::bus_cycle(mcs40_cpu_device_base::phase step, u8 sync, u8 d
{
display_pointer(data, 0x0fU);
if (!m_panel_reset && !m_pointer_valid)
machine().output().set_value("led_status_ptr_valid", m_pointer_valid = true);
m_led_status_ptr_valid = m_pointer_valid = true;
}
}
if (!m_panel_reset && !m_adr_cmp_latch)
@ -355,7 +365,7 @@ void intellec4_state::bus_cycle(mcs40_cpu_device_base::phase step, u8 sync, u8 d
if (!m_search_complete && !m_panel_reset && !m_cma_enable && !m_sw_run && (m_latched_addr == m_display_addr))
m_pass_counter = (m_pass_counter + 1U) & 0x0fU;
if (m_adr_cmp_latch && !m_next_inst && !m_search_complete)
machine().output().set_value("led_status_search", m_search_complete = true);
m_led_status_search = m_search_complete = true;
if (!m_cpu_reset && !m_cma_enable && !m_sw_run)
m_panel_reset = false;
break;
@ -525,10 +535,11 @@ INPUT_CHANGED_MEMBER(intellec4_state::sw_reset_mode)
template <unsigned N> INPUT_CHANGED_MEMBER(intellec4_state::sw_prg_mode)
{
static constexpr char const *const mode_leds[3] = { "led_mode_mon", "led_mode_ram", "led_mode_prom" };
static constexpr int prg_banks[3] = { BANK_PRG_MON, BANK_PRG_RAM, BANK_PRG_PROM };
static constexpr int io_banks[3] = { BANK_IO_MON, BANK_IO_NEITHER, BANK_IO_PROM };
std::tuple<output_finder<> &, output_finder<> &, output_finder<> &> mode_leds(m_led_mode_mon, m_led_mode_ram, m_led_mode_prom);
if (oldval && !newval)
{
if (((0U == N) || !m_sw_prg_mode[0]) && ((1U == N) || !m_sw_prg_mode[1]) && ((2U == N) || !m_sw_prg_mode[2]))
@ -537,7 +548,7 @@ template <unsigned N> INPUT_CHANGED_MEMBER(intellec4_state::sw_prg_mode)
{
m_program_banks->set_bank(prg_banks[N]);
m_rom_port_banks->set_bank(io_banks[N]);
machine().output().set_value(mode_leds[N], m_ff_prg_mode[N] = true);
std::get<N>(mode_leds) = m_ff_prg_mode[N] = true;
}
trigger_reset();
}
@ -547,11 +558,11 @@ template <unsigned N> INPUT_CHANGED_MEMBER(intellec4_state::sw_prg_mode)
m_rom_port_banks->set_bank(BANK_IO_NEITHER);
}
if ((0U != N) && m_ff_prg_mode[0])
machine().output().set_value(mode_leds[0], m_ff_prg_mode[0] = false);
std::get<0>(mode_leds) = m_ff_prg_mode[0] = false;
if ((1U != N) && m_ff_prg_mode[1])
machine().output().set_value(mode_leds[1], m_ff_prg_mode[1] = false);
std::get<1>(mode_leds) = m_ff_prg_mode[1] = false;
if ((2U != N) && m_ff_prg_mode[2])
machine().output().set_value(mode_leds[2], m_ff_prg_mode[2] = false);
std::get<2>(mode_leds) = m_ff_prg_mode[2] = false;
}
m_sw_prg_mode[N] = !bool(newval);
}
@ -635,6 +646,11 @@ void intellec4_state::driver_start()
m_led_active_bank.resolve();
m_led_execution.resolve();
m_led_last_ptr.resolve();
m_led_status_ptr_valid.resolve();
m_led_status_search.resolve();
m_led_mode_mon.resolve();
m_led_mode_ram.resolve();
m_led_mode_prom.resolve();
save_item(NAME(m_ram_page));
save_item(NAME(m_ram_data));
@ -714,11 +730,11 @@ void intellec4_state::driver_reset()
m_prom_programmer->prgm_prom_pwr(BIT(sw_prom_prgm, BIT_SW_PRGM_PWR));
// set front panel LEDs
machine().output().set_value("led_status_ptr_valid", m_pointer_valid);
machine().output().set_value("led_status_search", m_search_complete);
machine().output().set_value("led_mode_mon", m_ff_prg_mode[0]);
machine().output().set_value("led_mode_ram", m_ff_prg_mode[1]);
machine().output().set_value("led_mode_prom", m_ff_prg_mode[2]);
m_led_status_ptr_valid = m_pointer_valid;
m_led_status_search = m_search_complete;
m_led_mode_mon = m_ff_prg_mode[0];
m_led_mode_ram = m_ff_prg_mode[1];
m_led_mode_prom = m_ff_prg_mode[2];
}
@ -1001,9 +1017,9 @@ void intellec4_state::reset_panel()
m_panel_reset = true;
m_adr_cmp_latch = false;
if (m_search_complete && !m_next_inst)
machine().output().set_value("led_status_search", m_search_complete = false);
m_led_status_search = m_search_complete = false;
if (m_pointer_valid)
machine().output().set_value("led_status_ptr_valid", m_pointer_valid = false);
m_led_status_ptr_valid = m_pointer_valid = false;
}
}
@ -1018,6 +1034,7 @@ class mod4_state : public intellec4_state
public:
mod4_state(machine_config const &mconfig, device_type type, char const *tag)
: intellec4_state(mconfig, type, tag)
, m_led_status_cpu(*this, "led_status_cpu")
{
}
@ -1043,6 +1060,8 @@ private:
TIMER_CALLBACK_MEMBER(one_shot_expired);
output_finder<> m_led_status_cpu;
emu_timer *m_one_shot_timer = nullptr;
// control board state
@ -1150,6 +1169,8 @@ void mod4_state::driver_start()
{
intellec4_state::driver_start();
m_led_status_cpu.resolve();
m_one_shot_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mod4_state::one_shot_expired), this));
save_item(NAME(m_one_shot));
@ -1176,7 +1197,7 @@ void mod4_state::driver_reset()
m_bus->test_in((m_one_shot || m_sw_hold) ? 0 : 1);
// set front panel LEDs
machine().output().set_value("led_status_cpu", true); // actually driven by clock phase 2 - let's assume it's always running
m_led_status_cpu = true; // actually driven by clock phase 2 - let's assume it's always running
}

View File

@ -113,7 +113,6 @@ ________________________________________________________________
**************************************************************************/
#include "emu.h"
#include "includes/midtunit.h"
#include "includes/midxunit.h"
#include "audio/dcs.h"

View File

@ -91,12 +91,17 @@ public:
, m_cass(*this, "cassette")
, m_uart(*this, "uart")
, m_digits(*this, "digit%u", 0U)
{ }
, m_p(*this, "p%u_%u", 0U, 0U)
{ }
void mmd1(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(reset_button);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
DECLARE_WRITE8_MEMBER(port00_w);
DECLARE_WRITE8_MEMBER(port01_w);
@ -107,54 +112,56 @@ private:
DECLARE_WRITE_LINE_MEMBER(so);
TIMER_DEVICE_CALLBACK_MEMBER(kansas_r);
DECLARE_WRITE_LINE_MEMBER(kansas_w);
u8 m_cass_data[4];
bool m_cassinbit, m_cassoutbit, m_cassold;
void io_map(address_map &map);
void mem_map(address_map &map);
virtual void machine_reset() override;
u8 m_cass_data[4];
bool m_cassinbit, m_cassoutbit, m_cassold;
uint8_t m_return_code;
virtual void machine_start() override { m_digits.resolve(); }
required_device<i8080_cpu_device> m_maincpu;
required_device<cassette_image_device> m_cass;
required_device<ay31015_device> m_uart;
output_finder<9> m_digits;
output_finder<3, 8> m_p;
};
WRITE8_MEMBER( mmd1_state::port00_w )
{
output().set_value("p0_7", BIT(data,7) ? 0 : 1);
output().set_value("p0_6", BIT(data,6) ? 0 : 1);
output().set_value("p0_5", BIT(data,5) ? 0 : 1);
output().set_value("p0_4", BIT(data,4) ? 0 : 1);
output().set_value("p0_3", BIT(data,3) ? 0 : 1);
output().set_value("p0_2", BIT(data,2) ? 0 : 1);
output().set_value("p0_1", BIT(data,1) ? 0 : 1);
output().set_value("p0_0", BIT(data,0) ? 0 : 1);
m_p[0][7] = BIT(data,7) ? 0 : 1;
m_p[0][6] = BIT(data,6) ? 0 : 1;
m_p[0][5] = BIT(data,5) ? 0 : 1;
m_p[0][4] = BIT(data,4) ? 0 : 1;
m_p[0][3] = BIT(data,3) ? 0 : 1;
m_p[0][2] = BIT(data,2) ? 0 : 1;
m_p[0][1] = BIT(data,1) ? 0 : 1;
m_p[0][0] = BIT(data,0) ? 0 : 1;
}
WRITE8_MEMBER( mmd1_state::port01_w )
{
output().set_value("p1_7", BIT(data,7) ? 0 : 1);
output().set_value("p1_6", BIT(data,6) ? 0 : 1);
output().set_value("p1_5", BIT(data,5) ? 0 : 1);
output().set_value("p1_4", BIT(data,4) ? 0 : 1);
output().set_value("p1_3", BIT(data,3) ? 0 : 1);
output().set_value("p1_2", BIT(data,2) ? 0 : 1);
output().set_value("p1_1", BIT(data,1) ? 0 : 1);
output().set_value("p1_0", BIT(data,0) ? 0 : 1);
m_p[1][7] = BIT(data,7) ? 0 : 1;
m_p[1][6] = BIT(data,6) ? 0 : 1;
m_p[1][5] = BIT(data,5) ? 0 : 1;
m_p[1][4] = BIT(data,4) ? 0 : 1;
m_p[1][3] = BIT(data,3) ? 0 : 1;
m_p[1][2] = BIT(data,2) ? 0 : 1;
m_p[1][1] = BIT(data,1) ? 0 : 1;
m_p[1][0] = BIT(data,0) ? 0 : 1;
}
WRITE8_MEMBER( mmd1_state::port02_w )
{
output().set_value("p2_7", BIT(data,7) ? 0 : 1);
output().set_value("p2_6", BIT(data,6) ? 0 : 1);
output().set_value("p2_5", BIT(data,5) ? 0 : 1);
output().set_value("p2_4", BIT(data,4) ? 0 : 1);
output().set_value("p2_3", BIT(data,3) ? 0 : 1);
output().set_value("p2_2", BIT(data,2) ? 0 : 1);
output().set_value("p2_1", BIT(data,1) ? 0 : 1);
output().set_value("p2_0", BIT(data,0) ? 0 : 1);
m_p[2][7] = BIT(data,7) ? 0 : 1;
m_p[2][6] = BIT(data,6) ? 0 : 1;
m_p[2][5] = BIT(data,5) ? 0 : 1;
m_p[2][4] = BIT(data,4) ? 0 : 1;
m_p[2][3] = BIT(data,3) ? 0 : 1;
m_p[2][2] = BIT(data,2) ? 0 : 1;
m_p[2][1] = BIT(data,1) ? 0 : 1;
m_p[2][0] = BIT(data,0) ? 0 : 1;
}
// keyboard has a keydown and a keyup code. Keyup = last keydown + bit 7 set
@ -306,6 +313,12 @@ INPUT_CHANGED_MEMBER(mmd1_state::reset_button)
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
void mmd1_state::machine_start()
{
m_digits.resolve();
m_p.resolve();
}
void mmd1_state::machine_reset()
{
m_return_code = 0xff;

View File

@ -10,8 +10,10 @@
#pragma once
#include "midtunit.h"
#include "machine/midwayic.h"
class midxunit_state : public midtunit_state
{
public:
@ -19,6 +21,8 @@ public:
: midtunit_state(mconfig, type, tag)
, m_nvram(*this, "nvram")
, m_midway_serial_pic(*this, "serial_pic")
, m_gun_recoil(*this, "Player%u_Gun_Recoil", 1U)
, m_gun_led(*this, "Player%u_Gun_LED", 1U)
{ }
void midxunit(machine_config &config);
@ -48,6 +52,8 @@ private:
required_shared_ptr<uint16_t> m_nvram;
required_device<midway_serial_pic_device> m_midway_serial_pic;
output_finder<3> m_gun_recoil;
output_finder<3> m_gun_led;
uint8_t m_cmos_write_enable;
uint16_t m_iodata[8];

View File

@ -22,6 +22,7 @@
#define VERBOSE (0)
#include "logmacro.h"
/*************************************
*
* CMOS reads/writes
@ -62,15 +63,15 @@ WRITE16_MEMBER(midxunit_state::midxunit_io_w)
break;
default:
/* Gun Outputs for RevX */
/* Note: The Gun for the Coin slot you use is supposed to rumble when you insert coins, and it doesn't for P3. */
/* Perhaps an Input is hooked up wrong. */
output().set_value("Player1_Gun_Recoil", data & 0x1 );
output().set_value("Player2_Gun_Recoil", (data & 0x2) >> 1 );
output().set_value("Player3_Gun_Recoil", (data & 0x4) >> 2 );
output().set_value("Player1_Gun_LED", (~data & 0x10) >> 4 );
output().set_value("Player2_Gun_LED", (~data & 0x20) >> 5 );
output().set_value("Player3_Gun_LED", (~data & 0x40) >> 6 );
// Gun Outputs for RevX
// Note: The Gun for the Coin slot you use is supposed to rumble when you insert coins, and it doesn't for P3.
// Perhaps an Input is hooked up wrong.
m_gun_recoil[0] = BIT(data, 0);
m_gun_recoil[1] = BIT(data, 1);
m_gun_recoil[2] = BIT(data, 2);
m_gun_led[0] = BIT(~data, 4);
m_gun_led[1] = BIT(~data, 5);
m_gun_led[2] = BIT(~data, 6);
LOGMASKED(LOG_IO, "%s: I/O write to %d = %04X\n", machine().describe_context(), offset, data);
break;
@ -249,6 +250,9 @@ WRITE16_MEMBER(midxunit_state::midxunit_uart_w)
void midxunit_state::machine_start()
{
m_gun_recoil.resolve();
m_gun_led.resolve();
save_item(NAME(m_cmos_write_enable));
save_item(NAME(m_iodata));
save_item(NAME(m_ioshuffle));