diff options
53 files changed, 943 insertions, 593 deletions
diff --git a/src/mame/drivers/accomm.cpp b/src/mame/drivers/accomm.cpp index 6a1c050195e..34194c84a3f 100644 --- a/src/mame/drivers/accomm.cpp +++ b/src/mame/drivers/accomm.cpp @@ -56,6 +56,8 @@ public: m_vram(*this, "vram"), m_keybd1(*this, "LINE1.%u", 0), m_keybd2(*this, "LINE2.%u", 0), + m_shiftlock_led(*this, "shiftlock_led"), + m_capslock_led(*this, "capslock_led"), m_ch00rom_enabled(true) { } @@ -63,6 +65,12 @@ public: DECLARE_INPUT_CHANGED_MEMBER(trigger_reset); +protected: + // driver_device overrides + virtual void machine_reset() override; + virtual void machine_start() override; + virtual void video_start() override; + private: uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -77,8 +85,6 @@ private: void accomm_palette(palette_device &palette) const; INTERRUPT_GEN_MEMBER(vbl_int); - virtual void machine_reset() override; - virtual void machine_start() override; void main_map(address_map &map); // devices @@ -92,9 +98,8 @@ private: required_device<mc6854_device> m_adlc; required_shared_ptr<uint8_t> m_vram; required_ioport_array<14> m_keybd1, m_keybd2; - - // driver_device overrides - virtual void video_start() override; + output_finder<> m_shiftlock_led; + output_finder<> m_capslock_led; void interrupt_handler(int mode, int interrupt); inline uint8_t read_vram( uint16_t addr ); @@ -207,6 +212,9 @@ void accomm_state::machine_reset() void accomm_state::machine_start() { + m_shiftlock_led.resolve(); + m_capslock_led.resolve(); + m_ula.interrupt_status = 0x82; m_ula.interrupt_control = 0x00; } @@ -580,9 +588,9 @@ void accomm_state::sheila_w(offs_t offset, uint8_t data) m_ula.vram = (uint8_t *)m_vram.target() + m_ula.screen_base; logerror( "ULA: screen mode set to %d\n", m_ula.screen_mode ); m_ula.shiftlock_mode = !BIT(data, 6); - output().set_value("shiftlock_led", m_ula.shiftlock_mode); + m_shiftlock_led = m_ula.shiftlock_mode; m_ula.capslock_mode = BIT(data, 7); - output().set_value("capslock_led", m_ula.capslock_mode); + m_capslock_led = m_ula.capslock_mode; break; case 0x08: case 0x0A: case 0x0C: case 0x0E: // video_update diff --git a/src/mame/drivers/alesis.cpp b/src/mame/drivers/alesis.cpp index 1b02744e3bb..19a0809fb6d 100644 --- a/src/mame/drivers/alesis.cpp +++ b/src/mame/drivers/alesis.cpp @@ -27,18 +27,9 @@ uint8_t alesis_state::kb_r() { uint8_t data = 0xff; - if (!(m_kb_matrix & 0x01)) - data &= m_col1->read(); - if (!(m_kb_matrix & 0x02)) - data &= m_col2->read(); - if (!(m_kb_matrix & 0x04)) - data &= m_col3->read(); - if (!(m_kb_matrix & 0x08)) - data &= m_col4->read(); - if (!(m_kb_matrix & 0x10)) - data &= m_col5->read(); - if (!(m_kb_matrix & 0x20)) - data &= m_col6->read(); + for (int i = 0; i < 6; i++) + if (!BIT(m_kb_matrix, i)) + data &= m_col[i]->read(); return data; } @@ -338,6 +329,7 @@ void alesis_state::alesis_palette(palette_device &palette) const void alesis_state::machine_start() { m_digit.resolve(); + m_pattern.resolve(); m_track_led.resolve(); m_patt_led.resolve(); m_song_led.resolve(); diff --git a/src/mame/drivers/babbage.cpp b/src/mame/drivers/babbage.cpp index ffe18957e66..74d520744ac 100644 --- a/src/mame/drivers/babbage.cpp +++ b/src/mame/drivers/babbage.cpp @@ -37,15 +37,18 @@ public: babbage_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") - , m_pio_1(*this, "z80pio_1") - , m_pio_2(*this, "z80pio_2") + , m_pio(*this, "z80pio_%u", 1U) , m_ctc(*this, "z80ctc") , m_display(*this, "display") , m_io_keyboard(*this, "X%u", 0U) + , m_leds(*this, "led%u", 0U) { } void babbage(machine_config &config); +protected: + virtual void machine_start() override; + private: uint8_t pio2_a_r(); void pio1_b_w(uint8_t data); @@ -62,13 +65,13 @@ private: uint8_t m_key; uint8_t m_prev_key; bool m_step; - virtual void machine_start() override; + required_device<z80_device> m_maincpu; - required_device<z80pio_device> m_pio_1; - required_device<z80pio_device> m_pio_2; + required_device_array<z80pio_device, 2> m_pio; required_device<z80ctc_device> m_ctc; required_device<pwm_display_device> m_display; required_ioport_array<4> m_io_keyboard; + output_finder<8> m_leds; }; @@ -90,8 +93,8 @@ void babbage_state::babbage_io(address_map &map) { map.global_mask(0xff); map(0x00, 0x03).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write)); - map(0x10, 0x13).rw(m_pio_1, FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt)); - map(0x20, 0x23).rw(m_pio_2, FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt)); + map(0x10, 0x13).rw(m_pio[0], FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt)); + map(0x20, 0x23).rw(m_pio[1], FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt)); } @@ -153,17 +156,14 @@ WRITE_LINE_MEMBER( babbage_state::ctc_z2_w ) // bios never writes here - you need to set PIO for output yourself - see test program above void babbage_state::pio1_b_w(uint8_t data) { - char ledname[8]; for (int i = 0; i < 8; i++) - { - sprintf(ledname,"led%d",i); - output().set_value(ledname, BIT(data, i)); - } + m_leds[i] = BIT(data, i); } uint8_t babbage_state::pio2_a_r() { - m_maincpu->set_input_line(0, CLEAR_LINE); // release interrupt + if (!machine().side_effects_disabled()) + m_maincpu->set_input_line(0, CLEAR_LINE); // release interrupt return m_key; } @@ -212,14 +212,16 @@ TIMER_DEVICE_CALLBACK_MEMBER(babbage_state::keyboard_callback) if (data < 0xff) { m_key = data; - m_pio_2->strobe(0, 0); + m_pio[1]->strobe(0, 0); } else - m_pio_2->strobe(0, 1); + m_pio[1]->strobe(0, 1); } void babbage_state::machine_start() { + m_leds.resolve(); + save_item(NAME(m_seg)); save_item(NAME(m_key)); save_item(NAME(m_prev_key)); @@ -252,14 +254,14 @@ void babbage_state::babbage(machine_config &config) m_ctc->zc_callback<1>().set(FUNC(babbage_state::ctc_z1_w)); m_ctc->zc_callback<2>().set(FUNC(babbage_state::ctc_z2_w)); - Z80PIO(config, m_pio_1, MAIN_CLOCK); - m_pio_1->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); - m_pio_1->out_pb_callback().set(FUNC(babbage_state::pio1_b_w)); + Z80PIO(config, m_pio[0], MAIN_CLOCK); + m_pio[0]->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); + m_pio[0]->out_pb_callback().set(FUNC(babbage_state::pio1_b_w)); - Z80PIO(config, m_pio_2, MAIN_CLOCK); - m_pio_2->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); - m_pio_2->in_pa_callback().set(FUNC(babbage_state::pio2_a_r)); - m_pio_2->out_pb_callback().set(FUNC(babbage_state::pio2_b_w)); + Z80PIO(config, m_pio[1], MAIN_CLOCK); + m_pio[1]->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); + m_pio[1]->in_pa_callback().set(FUNC(babbage_state::pio2_a_r)); + m_pio[1]->out_pb_callback().set(FUNC(babbage_state::pio2_b_w)); TIMER(config, "keyboard_timer", 0).configure_periodic(FUNC(babbage_state::keyboard_callback), attotime::from_hz(30)); } diff --git a/src/mame/drivers/chessmst.cpp b/src/mame/drivers/chessmst.cpp index 18c7f4cfa85..f22f1d8999f 100644 --- a/src/mame/drivers/chessmst.cpp +++ b/src/mame/drivers/chessmst.cpp @@ -43,7 +43,9 @@ public: m_extra(*this, "EXTRA"), m_buttons(*this, "BUTTONS"), m_digits(*this, "digit%u", 0U), - m_leds(*this, "led_%c%u", unsigned('a'), 1U) + m_leds(*this, "led_%c%u", unsigned('a'), 1U), + m_monitor_led(*this, "monitor_led"), + m_playmode_led(*this, "playmode_led") { } DECLARE_INPUT_CHANGED_MEMBER(reset_button); @@ -82,6 +84,8 @@ private: required_ioport m_buttons; output_finder<4> m_digits; output_finder<10, 8> m_leds; + output_finder<> m_monitor_led; + output_finder<> m_playmode_led; uint16_t m_matrix; uint16_t m_led_sel; @@ -182,6 +186,8 @@ void chessmst_state::machine_start() { m_digits.resolve(); m_leds.resolve(); + m_monitor_led.resolve(); + m_playmode_led.resolve(); save_item(NAME(m_matrix)); save_item(NAME(m_led_sel)); @@ -248,8 +254,8 @@ void chessmst_state::pio1_port_b_dm_w(uint8_t data) m_beeper->set_state(BIT(data, 3)); - output().set_value("monitor_led", !BIT(data, 5)); - output().set_value("playmode_led", !BIT(data, 6)); + m_monitor_led = !BIT(data, 5); + m_playmode_led = !BIT(data, 6); } uint8_t chessmst_state::pio2_port_a_r() diff --git a/src/mame/drivers/cz101.cpp b/src/mame/drivers/cz101.cpp index 1e475f33125..122e0e86a0b 100644 --- a/src/mame/drivers/cz101.cpp +++ b/src/mame/drivers/cz101.cpp @@ -37,6 +37,7 @@ public: m_maincpu(*this, "maincpu"), m_hd44780(*this, "hd44780"), m_keys(*this, "kc%u", 0), + m_leds(*this, "led_%u", 0U), m_port_b(0), m_port_c(0) { } @@ -54,6 +55,7 @@ private: required_device<upd7810_device> m_maincpu; required_device<hd44780_device> m_hd44780; required_ioport_array<16> m_keys; + output_finder<32> m_leds; void maincpu_map(address_map &map); @@ -264,50 +266,50 @@ HD44780_PIXEL_UPDATE( cz101_state::lcd_pixel_update ) void cz101_state::led_4_w(uint8_t data) { - output().set_value("led_0", BIT(data, 7) ? 0 : 1); - output().set_value("led_1", BIT(data, 6) ? 0 : 1); - output().set_value("led_2", BIT(data, 5) ? 0 : 1); - output().set_value("led_3", BIT(data, 4) ? 0 : 1); - output().set_value("led_4", BIT(data, 3) ? 0 : 1); - output().set_value("led_5", BIT(data, 2) ? 0 : 1); - output().set_value("led_6", BIT(data, 1) ? 0 : 1); - output().set_value("led_7", BIT(data, 0) ? 0 : 1); + m_leds[0] = BIT(data, 7) ? 0 : 1; + m_leds[1] = BIT(data, 6) ? 0 : 1; + m_leds[2] = BIT(data, 5) ? 0 : 1; + m_leds[3] = BIT(data, 4) ? 0 : 1; + m_leds[4] = BIT(data, 3) ? 0 : 1; + m_leds[5] = BIT(data, 2) ? 0 : 1; + m_leds[6] = BIT(data, 1) ? 0 : 1; + m_leds[7] = BIT(data, 0) ? 0 : 1; } void cz101_state::led_3_w(uint8_t data) { - output().set_value("led_8", BIT(data, 7) ? 0 : 1); - output().set_value("led_9", BIT(data, 6) ? 0 : 1); - output().set_value("led_10", BIT(data, 5) ? 0 : 1); - output().set_value("led_11", BIT(data, 4) ? 0 : 1); - output().set_value("led_12", BIT(data, 3) ? 0 : 1); - output().set_value("led_13", BIT(data, 2) ? 0 : 1); - output().set_value("led_14", BIT(data, 1) ? 0 : 1); - output().set_value("led_15", BIT(data, 0) ? 0 : 1); + m_leds[8] = BIT(data, 7) ? 0 : 1; + m_leds[9] = BIT(data, 6) ? 0 : 1; + m_leds[10] = BIT(data, 5) ? 0 : 1; + m_leds[11] = BIT(data, 4) ? 0 : 1; + m_leds[12] = BIT(data, 3) ? 0 : 1; + m_leds[13] = BIT(data, 2) ? 0 : 1; + m_leds[14] = BIT(data, 1) ? 0 : 1; + m_leds[15] = BIT(data, 0) ? 0 : 1; } void cz101_state::led_2_w(uint8_t data) { - output().set_value("led_16", BIT(data, 7) ? 0 : 1); - output().set_value("led_17", BIT(data, 6) ? 0 : 1); - output().set_value("led_18", BIT(data, 5) ? 0 : 1); - output().set_value("led_19", BIT(data, 4) ? 0 : 1); - output().set_value("led_20", BIT(data, 3) ? 0 : 1); - output().set_value("led_21", BIT(data, 2) ? 0 : 1); - output().set_value("led_22", BIT(data, 1) ? 0 : 1); - output().set_value("led_23", BIT(data, 0) ? 0 : 1); + m_leds[16] = BIT(data, 7) ? 0 : 1; + m_leds[17] = BIT(data, 6) ? 0 : 1; + m_leds[18] = BIT(data, 5) ? 0 : 1; + m_leds[19] = BIT(data, 4) ? 0 : 1; + m_leds[20] = BIT(data, 3) ? 0 : 1; + m_leds[21] = BIT(data, 2) ? 0 : 1; + m_leds[22] = BIT(data, 1) ? 0 : 1; + m_leds[23] = BIT(data, 0) ? 0 : 1; } void cz101_state::led_1_w(uint8_t data) { - output().set_value("led_24", BIT(data, 7) ? 0 : 1); - output().set_value("led_25", BIT(data, 6) ? 0 : 1); - output().set_value("led_26", BIT(data, 5) ? 0 : 1); - output().set_value("led_27", BIT(data, 4) ? 0 : 1); - output().set_value("led_28", BIT(data, 3) ? 0 : 1); - output().set_value("led_29", BIT(data, 2) ? 0 : 1); - output().set_value("led_30", BIT(data, 1) ? 0 : 1); - output().set_value("led_31", BIT(data, 0) ? 0 : 1); + m_leds[24] = BIT(data, 7) ? 0 : 1; + m_leds[25] = BIT(data, 6) ? 0 : 1; + m_leds[26] = BIT(data, 5) ? 0 : 1; + m_leds[27] = BIT(data, 4) ? 0 : 1; + m_leds[28] = BIT(data, 3) ? 0 : 1; + m_leds[29] = BIT(data, 2) ? 0 : 1; + m_leds[30] = BIT(data, 1) ? 0 : 1; + m_leds[31] = BIT(data, 0) ? 0 : 1; } uint8_t cz101_state::keys_r() @@ -349,6 +351,8 @@ void cz101_state::port_c_w(uint8_t data) void cz101_state::machine_start() { + m_leds.resolve(); + // register for save states save_item(NAME(m_port_b)); save_item(NAME(m_port_c)); diff --git a/src/mame/drivers/dct11em.cpp b/src/mame/drivers/dct11em.cpp index c273b2b667a..27d2ad605b7 100644 --- a/src/mame/drivers/dct11em.cpp +++ b/src/mame/drivers/dct11em.cpp @@ -39,6 +39,7 @@ public: , m_terminal(*this, "terminal") , m_io_keyboard(*this, "X%u", 0U) , m_digits(*this, "digit%d", 0U) + , m_led(*this, "led0") { } void dct11em(machine_config &config); @@ -72,6 +73,7 @@ private: required_device<generic_terminal_device> m_terminal; required_ioport_array<5> m_io_keyboard; output_finder<12> m_digits; + output_finder<> m_led; }; void dct11em_state::mem_map(address_map &map) @@ -152,7 +154,7 @@ void dct11em_state::portc_w(u8 data) m_digits[data] = m_seg_lower; m_digits[data+6] = m_seg_upper; } - output().set_value("led0", (data!=9)); + m_led = (data!=9); } u8 dct11em_state::portc_r() @@ -201,6 +203,8 @@ void dct11em_state::machine_reset() void dct11em_state::machine_start() { m_digits.resolve(); + m_led.resolve(); + save_item(NAME(m_seg_lower)); save_item(NAME(m_seg_upper)); save_item(NAME(m_portc)); diff --git a/src/mame/drivers/digel804.cpp b/src/mame/drivers/digel804.cpp index 4fe6499cacf..573674cd8d8 100644 --- a/src/mame/drivers/digel804.cpp +++ b/src/mame/drivers/digel804.cpp @@ -79,7 +79,10 @@ public: m_vfd(*this, "vfd"), m_kb(*this, "74c923"), m_rambank(*this, "bankedram"), - m_func_leds(*this, "func_led%u", 0U) + m_func_leds(*this, "func_led%u", 0U), + m_input_led(*this, "input_led"), + m_busy_led(*this, "busy_led"), + m_error_led(*this, "error_led") { } @@ -129,6 +132,9 @@ private: required_memory_bank m_rambank; output_finder<16> m_func_leds; + output_finder<> m_input_led; + output_finder<> m_busy_led; + output_finder<> m_error_led; // current speaker state for port 45 uint8_t m_speaker_state; @@ -169,6 +175,9 @@ enum { MODE_OFF, MODE_KEY, MODE_REM, MODE_SIM }; void digel804_state::machine_start() { m_func_leds.resolve(); + m_input_led.resolve(); + m_busy_led.resolve(); + m_error_led.resolve(); save_item(NAME(m_speaker_state)); save_item(NAME(m_ram_bank)); @@ -377,9 +386,9 @@ void digel804_state::op46(uint8_t data) //popmessage("LEDS: %s %s %s Func: %s%d\n", (data&0x80)?"INPUT":"-----", (data&0x40)?"BUSY":"----", (data&0x20)?"ERROR":"-----", (data&0x10)?"None":"", (data&0x10)?-1:(~data&0xF)); //fprintf("LEDS: %s %s %s Func: %s%d\n", (data&0x80)?"INPUT":"-----", (data&0x40)?"BUSY":"----", (data&0x20)?"ERROR":"-----", (data&0x10)?"None":"", (data&0x10)?-1:(~data&0xF)); - output().set_value("input_led", BIT(data,7)); - output().set_value("busy_led", BIT(data,6)); - output().set_value("error_led", BIT(data,5)); + m_input_led = BIT(data,7); + m_busy_led = BIT(data,6); + m_error_led = BIT(data,5); for (int i = 0; i < 16; i++) m_func_leds[i] = (!(data & 0x10) && ((~data & 0x0f) == i)) ? 1 : 0; diff --git a/src/mame/drivers/eacc.cpp b/src/mame/drivers/eacc.cpp index bcaf5016d18..c3fbda5d051 100644 --- a/src/mame/drivers/eacc.cpp +++ b/src/mame/drivers/eacc.cpp @@ -63,11 +63,17 @@ public: , m_maincpu(*this, "maincpu") , m_pia(*this, "pia") , m_p_nvram(*this, "nvram") + , m_io_keyboard(*this, "X%u", 0U) , m_digits(*this, "digit%u", 0U) + , m_leds(*this, "led%u", 0U) { } void eacc(machine_config &config); +protected: + virtual void machine_reset() override; + virtual void machine_start() override; + private: DECLARE_READ_LINE_MEMBER( cb1_r ); DECLARE_READ_LINE_MEMBER( distance_r ); @@ -83,12 +89,13 @@ private: bool m_cb1; bool m_cb2; bool m_nmi; - virtual void machine_reset() override; - virtual void machine_start() override; + required_device<m6802_cpu_device> m_maincpu; required_device<pia6821_device> m_pia; required_shared_ptr<uint8_t> m_p_nvram; + required_ioport_array<4> m_io_keyboard; output_finder<7> m_digits; + output_finder<8> m_leds; }; @@ -147,6 +154,7 @@ void eacc_state::machine_reset() void eacc_state::machine_start() { m_digits.resolve(); + m_leds.resolve(); save_item(NAME(m_cb1)); save_item(NAME(m_cb2)); @@ -193,14 +201,9 @@ uint8_t eacc_state::keyboard_r() { uint8_t data = m_digit; - if (BIT(m_digit, 3)) - data |= ioport("X0")->read(); - if (BIT(m_digit, 4)) - data |= ioport("X1")->read(); - if (BIT(m_digit, 5)) - data |= ioport("X2")->read(); - if (BIT(m_digit, 6)) - data |= ioport("X3")->read(); + for (uint8_t i = 3; i < 7; i++) + if (BIT(m_digit, i)) + data |= m_io_keyboard[i - 3]->read(); return data; } @@ -218,21 +221,16 @@ void eacc_state::segment_w(uint8_t data) if (!m_nmi) { - uint8_t i; if (BIT(m_digit, 7)) { - char lednum[6]; data ^= 0xff; - for (i = 0; i < 8; i++) - { - sprintf(lednum,"led%d",i); - output().set_value(lednum, BIT(data, i)); - } + for (uint8_t i = 0; i < 8; i++) + m_leds[i] = BIT(data, i); } else { - for (i = 3; i < 7; i++) + for (uint8_t i = 3; i < 7; i++) if (BIT(m_digit, i)) m_digits[i] = bitswap<8>(data, 7, 0, 1, 4, 5, 6, 2, 3); } diff --git a/src/mame/drivers/einstein.cpp b/src/mame/drivers/einstein.cpp index b781ad3aa21..34d3543a652 100644 --- a/src/mame/drivers/einstein.cpp +++ b/src/mame/drivers/einstein.cpp @@ -90,6 +90,7 @@ public: m_porta_joy(*this, "PORTA_JOY"), m_portb_joy(*this, "PORTB_JOY"), m_dips(*this, "DIPS"), + m_alpha_lock_led(*this, "alpha_lock_led"), m_rom_enabled(0), m_keyboard_line(0), m_keyboard_data(0xff), m_centronics_ack(0), m_centronics_busy(0), m_centronics_perror(0), m_centronics_fault(0), m_strobe(-1), @@ -103,6 +104,10 @@ public: DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb); +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + private: TIMER_DEVICE_CALLBACK_MEMBER(keyboard_timer_callback); void keyboard_line_write(uint8_t data); @@ -140,9 +145,6 @@ private: void einstein_mem(address_map &map); void einst256_io(address_map &map); - virtual void machine_start() override; - virtual void machine_reset() override; - void einstein_scan_keyboard(); required_device<z80_device> m_maincpu; @@ -168,6 +170,7 @@ private: optional_ioport m_porta_joy; optional_ioport m_portb_joy; optional_ioport m_dips; + output_finder<> m_alpha_lock_led; int m_rom_enabled; @@ -181,7 +184,7 @@ private: int m_centronics_perror; int m_centronics_fault; int m_strobe; - int m_alpha_lock_led; + int m_alpha_lock; int m_int; }; @@ -453,6 +456,8 @@ void einstein_state::reset_w(uint8_t data) void einstein_state::machine_start() { + m_alpha_lock_led.resolve(); + // initialize memory mapping m_bank1->configure_entry(0, m_ram->pointer()); m_bank1->configure_entry(1, m_bios->base()); @@ -477,6 +482,7 @@ void einstein_state::machine_reset() m_strobe = -1; // enable Alpha Lock LED + m_alpha_lock = 1; m_alpha_lock_led = 1; } @@ -588,15 +594,18 @@ void einstein_state::pseudo_adc_w(uint8_t data) uint8_t einstein_state::alpha_lock_r() { - m_alpha_lock_led ^= 1; - output().set_value("alpha_lock_led", m_alpha_lock_led); + if (!machine().side_effects_disabled()) + { + m_alpha_lock ^= 1; + m_alpha_lock_led = m_alpha_lock; + } return 0xff; } void einstein_state::alpha_lock_w(uint8_t data) { - m_alpha_lock_led ^= 1; - output().set_value("alpha_lock_led", m_alpha_lock_led); + m_alpha_lock ^= 1; + m_alpha_lock_led = m_alpha_lock; } diff --git a/src/mame/drivers/emma2.cpp b/src/mame/drivers/emma2.cpp index 3de35f7633c..6d965780f3c 100644 --- a/src/mame/drivers/emma2.cpp +++ b/src/mame/drivers/emma2.cpp @@ -204,7 +204,7 @@ void emma2_state::emma2(machine_config &config) m_pia->writepa_handler().set(FUNC(emma2_state::segment_w)); m_pia->writepb_handler().set(FUNC(emma2_state::digit_w)); m_pia->readpb_handler().set(FUNC(emma2_state::keyboard_r)); - m_pia->ca2_handler().set([this] (bool state) { output().set_value("led0", state); }); + m_pia->ca2_handler().set_output("led0"); m_pia->irqa_handler().set_inputline(m_maincpu, m6502_device::IRQ_LINE); m_pia->irqb_handler().set_inputline(m_maincpu, m6502_device::IRQ_LINE); diff --git a/src/mame/drivers/h8.cpp b/src/mame/drivers/h8.cpp index bb2c3279643..cc095a80499 100644 --- a/src/mame/drivers/h8.cpp +++ b/src/mame/drivers/h8.cpp @@ -67,13 +67,22 @@ public: , m_uart(*this, "uart") , m_cass(*this, "cassette") , m_beep(*this, "beeper") + , m_io_keyboard(*this, "X%u", 0U) , m_digits(*this, "digit%u", 0U) + , m_mon_led(*this, "mon_led") + , m_pwr_led(*this, "pwr_led") + , m_ion_led(*this, "ion_led") + , m_run_led(*this, "run_led") { } void h8(machine_config &config); DECLARE_INPUT_CHANGED_MEMBER(button_0); +protected: + virtual void machine_reset() override; + virtual void machine_start() override; + private: u8 portf0_r(); void portf0_w(u8 data); @@ -94,13 +103,17 @@ private: u8 m_cass_data[4]; bool m_cassbit; bool m_cassold; - virtual void machine_reset() override; - virtual void machine_start() override; + required_device<i8080_cpu_device> m_maincpu; required_device<i8251_device> m_uart; required_device<cassette_image_device> m_cass; required_device<beep_device> m_beep; + required_ioport_array<2> m_io_keyboard; output_finder<16> m_digits; + output_finder<> m_mon_led; + output_finder<> m_pwr_led; + output_finder<> m_ion_led; + output_finder<> m_run_led; }; @@ -125,7 +138,7 @@ u8 h8_state::portf0_r() u8 i,keyin,data = 0xff; - keyin = ioport("X0")->read(); + keyin = m_io_keyboard[0]->read(); if (keyin != 0xff) { for (i = 1; i < 8; i++) @@ -134,7 +147,7 @@ u8 h8_state::portf0_r() data &= 0xfe; } - keyin = ioport("X1")->read(); + keyin = m_io_keyboard[1]->read(); if (keyin != 0xff) { for (i = 1; i < 8; i++) @@ -157,7 +170,7 @@ void h8_state::portf0_w(u8 data) m_digit = data & 15; if (m_digit) m_digits[m_digit] = m_segment; - output().set_value("mon_led", !BIT(data, 5)); + m_mon_led = !BIT(data, 5); m_beep->set_state(!BIT(data, 7)); m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); @@ -228,7 +241,7 @@ INPUT_CHANGED_MEMBER(h8_state::button_0) { if (newval) { - u8 data = ioport("X1")->read() ^ 0xff; + u8 data = m_io_keyboard[1]->read() ^ 0xff; if (BIT(data, 5)) m_maincpu->reset(); else @@ -239,7 +252,7 @@ INPUT_CHANGED_MEMBER(h8_state::button_0) void h8_state::machine_reset() { - output().set_value("pwr_led", 0); + m_pwr_led = 0; m_irq_ctl = 1; m_cassbit = 1; m_cass_data[0] = 0; @@ -254,6 +267,10 @@ void h8_state::machine_reset() void h8_state::machine_start() { m_digits.resolve(); + m_mon_led.resolve(); + m_pwr_led.resolve(); + m_ion_led.resolve(); + m_run_led.resolve(); save_item(NAME(m_digit)); save_item(NAME(m_segment)); @@ -266,8 +283,8 @@ void h8_state::machine_start() WRITE_LINE_MEMBER( h8_state::h8_inte_callback ) { - // operate the ION LED - output().set_value("ion_led", !state); + // operate the ION LED + m_ion_led = !state; m_irq_ctl &= 0x7f | ((state) ? 0 : 0x80); } @@ -298,8 +315,8 @@ But, all of this can only occur if bit 4 of port F0 is low. */ } - // operate the RUN LED - output().set_value("run_led", state); + // operate the RUN LED + m_run_led = state; } TIMER_DEVICE_CALLBACK_MEMBER(h8_state::kansas_w) diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp index 3219fa5234b..7d24a5e37ef 100644 --- a/src/mame/drivers/hh_tms1k.cpp +++ b/src/mame/drivers/hh_tms1k.cpp @@ -811,15 +811,35 @@ class bcheetah_state : public hh_tms1k_state { public: bcheetah_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) + hh_tms1k_state(mconfig, type, tag), + m_motor1(*this, "motor1"), + m_motor2_left(*this, "motor2_left"), + m_motor2_right(*this, "motor2_right") { } + void bcheetah(machine_config &config); + +protected: + virtual void machine_start() override; + +private: void write_r(u16 data); void write_o(u16 data); u8 read_k(); - void bcheetah(machine_config &config); + + output_finder<> m_motor1; + output_finder<> m_motor2_left; + output_finder<> m_motor2_right; }; +void bcheetah_state::machine_start() +{ + hh_tms1k_state::machine_start(); + m_motor1.resolve(); + m_motor2_left.resolve(); + m_motor2_right.resolve(); +} + // handlers void bcheetah_state::write_r(u16 data) @@ -835,9 +855,9 @@ void bcheetah_state::write_o(u16 data) // O0: front motor steer left // O2: front motor steer right // O3: GND, other: N/C - output().set_value("motor1", data >> 1 & 1); - output().set_value("motor2_left", data & 1); - output().set_value("motor2_right", data >> 2 & 1); + m_motor1 = data >> 1 & 1; + m_motor2_left = data & 1; + m_motor2_right = data >> 2 & 1; } u8 bcheetah_state::read_k() @@ -7315,9 +7335,20 @@ class bigtrak_state : public hh_tms1k_state { public: bigtrak_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) + hh_tms1k_state(mconfig, type, tag), + m_left_motor_forward(*this, "left_motor_forward"), + m_left_motor_reverse(*this, "left_motor_reverse"), + m_right_motor_forward(*this, "right_motor_forward"), + m_right_motor_reverse(*this, "right_motor_reverse"), + m_ext_out(*this, "ext_out") { } + void bigtrak(machine_config &config); + +protected: + virtual void machine_start() override; + +private: void write_r(u16 data); void write_o(u16 data); u8 read_k(); @@ -7325,16 +7356,24 @@ public: int m_gearbox_pos; bool sensor_state() { return m_gearbox_pos < 0 && m_display->element_on(0, 0); } TIMER_DEVICE_CALLBACK_MEMBER(gearbox_sim_tick); - void bigtrak(machine_config &config); -protected: - virtual void machine_start() override; + output_finder<> m_left_motor_forward; + output_finder<> m_left_motor_reverse; + output_finder<> m_right_motor_forward; + output_finder<> m_right_motor_reverse; + output_finder<> m_ext_out; }; void bigtrak_state::machine_start() { hh_tms1k_state::machine_start(); + m_left_motor_forward.resolve(); + m_left_motor_reverse.resolve(); + m_right_motor_forward.resolve(); + m_right_motor_reverse.resolve(); + m_ext_out.resolve(); + // zerofill/register for savestates m_gearbox_pos = 0; save_item(NAME(m_gearbox_pos)); @@ -7377,11 +7416,11 @@ void bigtrak_state::write_o(u16 data) // O4: right motor reverse // O5: ext out // O6: N/C - output().set_value("left_motor_forward", data >> 1 & 1); - output().set_value("left_motor_reverse", data >> 2 & 1); - output().set_value("right_motor_forward", data >> 3 & 1); - output().set_value("right_motor_reverse", data >> 4 & 1); - output().set_value("ext_out", data >> 5 & 1); + m_left_motor_forward = data >> 1 & 1; + m_left_motor_reverse = data >> 2 & 1; + m_right_motor_forward = data >> 3 & 1; + m_right_motor_reverse = data >> 4 & 1; + m_ext_out = data >> 5 & 1; // O0,O7(,R10)(tied together): speaker out m_speaker->level_w((data & 1) | (data >> 6 & 2) | (m_r >> 8 & 4)); @@ -7513,12 +7552,25 @@ class mbdtower_state : public hh_tms1k_state { public: mbdtower_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) + hh_tms1k_state(mconfig, type, tag), + m_motor_pos_out(*this, "motor_pos"), + m_card_pos_out(*this, "card_pos"), + m_motor_on_out(*this, "motor_on") { } + void mbdtower(machine_config &config); + +protected: + virtual void machine_start() override; + +private: void update_display(); bool sensor_led_on() { return m_display->element_on(0, 0); } + output_finder<> m_motor_pos_out; + output_finder<> m_card_pos_out; + output_finder<> m_motor_on_out; + int m_motor_pos; int m_motor_pos_prev; int m_motor_decay; @@ -7530,16 +7582,16 @@ public: void write_r(u16 data); void write_o(u16 data); u8 read_k(); - void mbdtower(machine_config &config); - -protected: - virtual void machine_start() override; }; void mbdtower_state::machine_start() { hh_tms1k_state::machine_start(); + m_motor_pos_out.resolve(); + m_card_pos_out.resolve(); + m_motor_on_out.resolve(); + // zerofill m_motor_pos = 0; m_motor_pos_prev = -1; @@ -7582,7 +7634,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(mbdtower_state::motor_sim_tick) // on change, output info if (m_motor_pos != m_motor_pos_prev) - output().set_value("motor_pos", 100 * (m_motor_pos / (float)0x80)); + m_motor_pos_out = 100 * (m_motor_pos / (float)0x80); /* 3 display cards per hole, like this: @@ -7594,7 +7646,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(mbdtower_state::motor_sim_tick) */ int card_pos = m_motor_pos >> 4 & 7; if (card_pos != (m_motor_pos_prev >> 4 & 7)) - output().set_value("card_pos", card_pos); + m_card_pos_out = card_pos; m_motor_pos_prev = m_motor_pos; } @@ -7625,7 +7677,7 @@ void mbdtower_state::write_r(u16 data) // R9: motor on if ((m_r ^ data) & 0x200) - output().set_value("motor_on", data >> 9 & 1); + m_motor_on_out = data >> 9 & 1; if (data & 0x200) m_motor_on = true; diff --git a/src/mame/drivers/hp9845.cpp b/src/mame/drivers/hp9845.cpp index 400aeb02133..935da2f459c 100644 --- a/src/mame/drivers/hp9845.cpp +++ b/src/mame/drivers/hp9845.cpp @@ -200,8 +200,8 @@ constexpr unsigned LP_XOFFSET = 5; // x-offset of LP (due to delay in hit recog class hp9845_state : public driver_device { public: - hp9845_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag) + hp9845_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) { } void hp9845a(machine_config &config); @@ -428,6 +428,9 @@ hp9845_base_state::hp9845_base_state(const machine_config &mconfig, device_type m_io_slot(*this, "slot%u", 0U), m_ram(*this, RAM_TAG), m_softkeys(*this, "Softkey%u", 0U), + m_shift_lock_led(*this, "shift_lock_led"), + m_prt_all_led(*this, "prt_all_led"), + m_auto_st_led(*this, "auto_st_led"), m_chargen(*this, "chargen") { } @@ -442,6 +445,10 @@ void hp9845_base_state::setup_ram_block(unsigned block , unsigned offset) void hp9845_base_state::machine_start() { m_softkeys.resolve(); + m_shift_lock_led.resolve(); + m_prt_all_led.resolve(); + m_auto_st_led.resolve(); + m_screen->register_screen_bitmap(m_bitmap); // setup RAM dynamically for -ramsize @@ -719,21 +726,21 @@ INPUT_CHANGED_MEMBER(hp9845_base_state::togglekey_changed) { bool state = m_io_shiftlock->read(); popmessage("SHIFT LOCK %s", state ? "ON" : "OFF"); - output().set_value("shift_lock_led" , state); + m_shift_lock_led = state; } break; case 1: // Prt all { bool state = BIT(m_io_key[0]->read(), 1); popmessage("PRT ALL %s", state ? "ON" : "OFF"); - output().set_value("prt_all_led" , state); + m_prt_all_led = state; } break; case 2: // Auto st { bool state = BIT(m_io_key[0]->read(), 17); popmessage("AUTO ST %s", state ? "ON" : "OFF"); - output().set_value("auto_st_led" , state); + m_auto_st_led = state; } break; } diff --git a/src/mame/drivers/ibm6580.cpp b/src/mame/drivers/ibm6580.cpp index 26ae14be877..b8912a37383 100644 --- a/src/mame/drivers/ibm6580.cpp +++ b/src/mame/drivers/ibm6580.cpp @@ -144,13 +144,19 @@ public: , m_screen(*this, "screen") , m_kbd(*this, "kbd") , m_fdc(*this, UPD765_TAG) - , m_flop0(*this, UPD765_TAG ":0") - , m_flop1(*this, UPD765_TAG ":1") + , m_flop(*this, UPD765_TAG ":%u", 0U) , m_p_chargen(*this, "chargen") + , m_io_dump(*this, "DUMP") + , m_leds(*this, "led%u", 5U) { } void ibm6580(machine_config &config); +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + virtual void video_start() override; + private: void pic_latch_w(uint16_t data); void unk_latch_w(uint16_t data); @@ -185,10 +191,6 @@ private: void ibm6580_io(address_map &map); void ibm6580_mem(address_map &map); - virtual void machine_start() override; - virtual void machine_reset() override; - virtual void video_start() override; - uint8_t m_p40, m_p50, m_e000, m_kb_data, m_ppi_c; bool m_kb_data_bit, m_kb_strobe; util::fifo<uint8_t, 4> m_kb_fifo; @@ -213,9 +215,10 @@ private: required_device<screen_device> m_screen; required_device<dw_keyboard_device> m_kbd; required_device<upd765a_device> m_fdc; - required_device<floppy_connector> m_flop0; - required_device<floppy_connector> m_flop1; + required_device_array<floppy_connector, 2> m_flop; required_region_ptr<u8> m_p_chargen; + required_ioport m_io_dump; + output_finder<4> m_leds; }; @@ -326,7 +329,7 @@ WRITE_LINE_MEMBER(ibm6580_state::vblank_w) // if (state) // m_pic8259->ir6_w(state); - if (ioport("DUMP")->read()) + if (m_io_dump->read()) m_p40 |= 4; } @@ -356,10 +359,8 @@ void ibm6580_state::unk_latch_w(uint16_t data) void ibm6580_state::led_w(uint8_t data) { - output().set_value("led5", BIT(data, 7)); - output().set_value("led6", BIT(data, 6)); - output().set_value("led7", BIT(data, 5)); - output().set_value("led8", BIT(data, 4)); + for (int i = 0; i < 4; i++) + m_leds[i] = BIT(data, 7 - i); if (data & 0xf) return; @@ -533,8 +534,8 @@ uint8_t ibm6580_state::floppy_mcu_command() // 1 byte -- get status? case 5: m_floppy_mcu_sr.enqueue(0x00); - if (m_flop0->get_device()->exists()) - m_floppy_mcu_sr.enqueue( m_flop0->get_device()->idx_r() ? 0x08 : 0); + if (m_flop[0]->get_device()->exists()) + m_floppy_mcu_sr.enqueue( m_flop[0]->get_device()->idx_r() ? 0x08 : 0); else m_floppy_mcu_sr.enqueue(0x08); break; @@ -564,10 +565,10 @@ uint8_t ibm6580_state::floppy_mcu_command() case 0xd: m_floppy_mcu_sr.enqueue(0x00); i = 0; - if (m_flop0->get_device()->exists()) - i |= m_flop0->get_device()->ready_r() ? 0 : 0x40; - if (m_flop1->get_device()->exists()) - i |= m_flop1->get_device()->ready_r() ? 0 : 0x80; + if (m_flop[0]->get_device()->exists()) + i |= m_flop[0]->get_device()->ready_r() ? 0 : 0x40; + if (m_flop[1]->get_device()->exists()) + i |= m_flop[1]->get_device()->ready_r() ? 0 : 0x80; m_floppy_mcu_sr.enqueue(i); break; @@ -577,9 +578,9 @@ uint8_t ibm6580_state::floppy_mcu_command() i = m_floppy_mcu_cr.dequeue(); #if 1 if (i & 1) - m_fdc->set_floppy(m_flop0->get_device()); + m_fdc->set_floppy(m_flop[0]->get_device()); else if (i & 2) - m_fdc->set_floppy(m_flop1->get_device()); + m_fdc->set_floppy(m_flop[1]->get_device()); #endif break; @@ -659,7 +660,7 @@ uint8_t ibm6580_state::floppy_r(offs_t offset) if (offset) LOG("Floppy %02x == %02x\n", 0x8150 + (offset << 1), data); else { - floppy_image_device *f = m_flop0->get_device(); + floppy_image_device *f = m_flop[0]->get_device(); if (f) LOG("Floppy %02x == %02x (empty %d hdl %d + idle %d irq %d drq %d + dskchg %d idx %d cyl %d)\n", @@ -832,6 +833,8 @@ void ibm6580_state::machine_start() membank("bank10")->set_base(m_ram->pointer()); m_fdc->set_rate(500000); // XXX workaround + + m_leds.resolve(); } void ibm6580_state::machine_reset() @@ -843,12 +846,12 @@ void ibm6580_state::machine_reset() m_pit8253->set_clockin(0, 0.0); - if (ioport("DUMP")->read()) + if (m_io_dump->read()) m_p40 |= 4; - m_flop0->get_device()->mon_w(!m_flop0->get_device()->exists()); - m_flop1->get_device()->mon_w(!m_flop1->get_device()->exists()); - m_fdc->set_floppy(m_flop0->get_device()); + m_flop[0]->get_device()->mon_w(!m_flop[0]->get_device()->exists()); + m_flop[1]->get_device()->mon_w(!m_flop[1]->get_device()->exists()); + m_fdc->set_floppy(m_flop[0]->get_device()); m_floppy_mcu_sr.clear(); m_floppy_mcu_cr.clear(); m_floppy_mcu_cr_fifo = 0; diff --git a/src/mame/drivers/instruct.cpp b/src/mame/drivers/instruct.cpp index 9d57c095809..b2cdf2686e5 100644 --- a/src/mame/drivers/instruct.cpp +++ b/src/mame/drivers/instruct.cpp @@ -2,7 +2,7 @@ // copyright-holders:Robbbert /*************************************************************************** -Signetics Intructor 50 +Signetics Instructor 50 2010-04-08 Skeleton driver. 2012-05-20 Connected digits, system boots. [Robbbert] @@ -69,12 +69,16 @@ public: , m_cass(*this, "cassette") , m_display(*this, "display") , m_io_keyboard(*this, "X%u", 0U) + , m_leds(*this, "led%u", 0U) { } void instruct(machine_config &config); -private: +protected: + virtual void machine_reset() override; + virtual void machine_start() override; +private: uint8_t port_r(); uint8_t portfc_r(); uint8_t portfd_r(); @@ -91,8 +95,6 @@ private: void io_map(address_map &map); void mem_map(address_map &map); - void machine_reset() override; - void machine_start() override; uint16_t m_lar; uint8_t m_digit; u8 m_seg; @@ -105,23 +107,20 @@ private: required_device<cassette_image_device> m_cass; required_device<pwm_display_device> m_display; required_ioport_array<6> m_io_keyboard; + output_finder<9> m_leds; }; // flag led WRITE_LINE_MEMBER( instruct_state::flag_w ) { - output().set_value("led8", !state); + m_leds[8] = !state; } // user port void instruct_state::port_w(uint8_t data) { - char ledname[8]; for (int i = 0; i < 8; i++) - { - sprintf(ledname,"led%d",i); - output().set_value(ledname, !BIT(data, i)); - } + m_leds[i] = !BIT(data, i); } // cassette port @@ -339,6 +338,8 @@ void instruct_state::machine_reset() void instruct_state::machine_start() { + m_leds.resolve(); + save_item(NAME(m_lar)); save_item(NAME(m_digit)); save_item(NAME(m_seg)); diff --git a/src/mame/drivers/kdt6.cpp b/src/mame/drivers/kdt6.cpp index 5cb6a5b28cb..0c041655103 100644 --- a/src/mame/drivers/kdt6.cpp +++ b/src/mame/drivers/kdt6.cpp @@ -54,14 +54,14 @@ public: m_gfx(*this, "gfx"), m_rtc(*this, "rtc"), m_fdc(*this, "fdc"), - m_floppy0(*this, "fdc:0"), - m_floppy1(*this, "fdc:1"), + m_floppy(*this, "fdc:%u", 0U), m_beeper(*this, "beeper"), m_beep_timer(*this, "beep_timer"), m_centronics(*this, "centronics"), m_dip_s2(*this, "S2"), m_keyboard(*this, "kbd"), m_rs232b(*this, "rs232b"), + m_drive_led(*this, "drive%u_led", 0U), m_sasi_dma(false), m_dma_map(0), m_status0(0), m_status1(0), m_status2(0), @@ -70,6 +70,10 @@ public: void psi98(machine_config &config); +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + private: DECLARE_WRITE_LINE_MEMBER(busreq_w); uint8_t memory_r(offs_t offset); @@ -113,9 +117,6 @@ private: void psi98_io(address_map &map); void psi98_mem(address_map &map); - virtual void machine_start() override; - virtual void machine_reset() override; - required_device<z80_device> m_cpu; required_device<z80dma_device> m_dma; required_device<z80sio_device> m_sio; @@ -126,14 +127,14 @@ private: required_region_ptr<u8> m_gfx; required_device<upd1990a_device> m_rtc; required_device<upd765a_device> m_fdc; - required_device<floppy_connector> m_floppy0; - required_device<floppy_connector> m_floppy1; + required_device_array<floppy_connector, 2> m_floppy; required_device<beep_device> m_beeper; required_device<timer_device> m_beep_timer; required_device<centronics_device> m_centronics; required_ioport m_dip_s2; required_device<psi_keyboard_bus_device> m_keyboard; required_device<rs232_port_device> m_rs232b; + output_finder<2> m_drive_led; std::unique_ptr<uint8_t[]> m_ram; std::unique_ptr<uint16_t[]> m_vram; // 10-bit @@ -244,12 +245,12 @@ WRITE_LINE_MEMBER( kdt6_state::fdc_drq_w ) void kdt6_state::drive0_led_cb(floppy_image_device *floppy, int state) { - machine().output().set_value("drive0_led", state); + m_drive_led[0] = state; } void kdt6_state::drive1_led_cb(floppy_image_device *floppy, int state) { - machine().output().set_value("drive1_led", state); + m_drive_led[1] = state; } @@ -498,10 +499,9 @@ void kdt6_state::status0_w(uint8_t data) m_beep_timer->adjust(attotime::from_msec(250)); // timing unknown } - if (m_floppy0->get_device()) - m_floppy0->get_device()->mon_w(BIT(data, 7) ? 0 : 1); - if (m_floppy1->get_device()) - m_floppy1->get_device()->mon_w(BIT(data, 7) ? 0 : 1); + for (auto &floppy : m_floppy) + if (floppy->get_device()) + floppy->get_device()->mon_w(BIT(data, 7) ? 0 : 1); m_status0 = data; } @@ -567,6 +567,8 @@ void kdt6_state::status2_w(uint8_t data) void kdt6_state::machine_start() { + m_drive_led.resolve(); + // 256 kb ram, 64 kb vram (and two dummy regions for invalid pages) m_ram = std::make_unique<uint8_t[]>(0x40000); m_vram = std::make_unique<uint16_t[]>(0x10000); @@ -579,10 +581,10 @@ void kdt6_state::machine_start() m_fdc->set_rate(250000); - if (m_floppy0->get_device()) - m_floppy0->get_device()->setup_led_cb(floppy_image_device::led_cb(&kdt6_state::drive0_led_cb, this)); - if (m_floppy1->get_device()) - m_floppy1->get_device()->setup_led_cb(floppy_image_device::led_cb(&kdt6_state::drive1_led_cb, this)); + if (m_floppy[0]->get_device()) + m_floppy[0]->get_device()->setup_led_cb(floppy_image_device::led_cb(&kdt6_state::drive0_led_cb, this)); + if (m_floppy[1]->get_device()) + m_floppy[1]->get_device()->setup_led_cb(floppy_image_device::led_cb(&kdt6_state::drive1_led_cb, this)); // register for save states save_pointer(NAME(m_ram), 0x40000); diff --git a/src/mame/drivers/ms0515.cpp b/src/mame/drivers/ms0515.cpp index 5adf16996ad..44cd5692db2 100644 --- a/src/mame/drivers/ms0515.cpp +++ b/src/mame/drivers/ms0515.cpp @@ -68,19 +68,23 @@ public: , m_maincpu(*this, "maincpu") , m_ram(*this, RAM_TAG) , m_fdc(*this, "vg93") - , m_floppy0(*this, "vg93:0:525qd") - , m_floppy1(*this, "vg93:1:525qd") + , m_floppies(*this, "vg93:%u", 0U) , m_i8251line(*this, "i8251line") , m_rs232(*this, "rs232") , m_i8251kbd(*this, "i8251kbd") , m_ms7004(*this, "ms7004") , m_pit8253(*this, "pit8253") , m_speaker(*this, "speaker") + , m_bank(*this, "bank%u", 0U) + , m_led9(*this, "led9") + , m_led16(*this, "led16") + , m_led17(*this, "led17") { } void ms0515(machine_config &config); protected: + virtual void machine_start() override; virtual void machine_reset() override; private: @@ -116,14 +120,17 @@ private: required_device<t11_device> m_maincpu; // actual CPU is T11 clone, KR1807VM1 required_device<ram_device> m_ram; required_device<kr1818vg93_device> m_fdc; - required_device<floppy_image_device> m_floppy0; - required_device<floppy_image_device> m_floppy1; + required_device_array<floppy_connector, 2> m_floppies; required_device<i8251_device> m_i8251line; required_device<rs232_port_device> m_rs232; required_device<i8251_device> m_i8251kbd; required_device<ms7004_device> m_ms7004; required_device<pit8253_device> m_pit8253; required_device<speaker_sound_device> m_speaker; + required_memory_bank_array<7> m_bank; + output_finder<> m_led9; + output_finder<> m_led16; + output_finder<> m_led17; uint8_t *m_video_ram; uint8_t m_sysrega, m_sysregc; @@ -199,30 +206,30 @@ void ms0515_state::ms0515_bank_w(uint16_t data) m_bankreg = data; - membank("bank0")->set_base(ram + 0000000 + BIT(data, 0) * 0160000); - membank("bank1")->set_base(ram + 0020000 + BIT(data, 1) * 0160000); - membank("bank2")->set_base(ram + 0040000 + BIT(data, 2) * 0160000); - membank("bank3")->set_base(ram + 0060000 + BIT(data, 3) * 0160000); - membank("bank4")->set_base(ram + 0100000 + BIT(data, 4) * 0160000); - membank("bank5")->set_base(ram + 0120000 + BIT(data, 5) * 0160000); - membank("bank6")->set_base(ram + 0140000 + BIT(data, 6) * 0160000); + m_bank[0]->set_base(ram + 0000000 + BIT(data, 0) * 0160000); + m_bank[1]->set_base(ram + 0020000 + BIT(data, 1) * 0160000); + m_bank[2]->set_base(ram + 0040000 + BIT(data, 2) * 0160000); + m_bank[3]->set_base(ram + 0060000 + BIT(data, 3) * 0160000); + m_bank[4]->set_base(ram + 0100000 + BIT(data, 4) * 0160000); + m_bank[5]->set_base(ram + 0120000 + BIT(data, 5) * 0160000); + m_bank[6]->set_base(ram + 0140000 + BIT(data, 6) * 0160000); if (BIT(data, 7)) { switch ((data >> 10) & 3) { case 0: // 000000 - 037777 - membank("bank0")->set_base(ram + 0000000 + 0340000); - membank("bank1")->set_base(ram + 0020000 + 0340000); + m_bank[0]->set_base(ram + 0000000 + 0340000); + m_bank[1]->set_base(ram + 0020000 + 0340000); break; case 1: // 040000 - 077777 - membank("bank2")->set_base(ram + 0000000 + 0340000); - membank("bank3")->set_base(ram + 0020000 + 0340000); + m_bank[2]->set_base(ram + 0000000 + 0340000); + m_bank[3]->set_base(ram + 0020000 + 0340000); break; case 2: case 3: // 100000 - 137777 - membank("bank4")->set_base(ram + 0000000 + 0340000); - membank("bank5")->set_base(ram + 0020000 + 0340000); + m_bank[4]->set_base(ram + 0000000 + 0340000); + m_bank[5]->set_base(ram + 0020000 + 0340000); break; } } @@ -258,17 +265,17 @@ void ms0515_state::ms0515_porta_w(uint8_t data) { LOGSYSREG("Sysreg A <- %02x\n", data); - output().set_value("led16", BIT(data, 5)); - output().set_value("led9", BIT(data, 4)); + m_led16 = BIT(data, 5); + m_led9 = BIT(data, 4); switch (data & 3) { case 0: - m_floppy = m_floppy0; + m_floppy = m_floppies[0]->get_device(); break; case 1: - m_floppy = m_floppy1; + m_floppy = m_floppies[1]->get_device(); break; default: @@ -284,8 +291,9 @@ void ms0515_state::ms0515_porta_w(uint8_t data) } else { - m_floppy0->mon_w(1); - m_floppy1->mon_w(1); + for (auto &floppy : m_floppies) + if (floppy->get_device() != nullptr) + floppy->get_device()->mon_w(1); } m_sysrega = data; @@ -330,7 +338,7 @@ void ms0515_state::ms0515_portc_w(uint8_t data) LOGSYSREG("Sysreg C <- %02x\n", data); m_pit8253->write_gate2(BIT(data, 7)); - output().set_value("led17", BIT(data, 4)); + m_led17 = BIT(data, 4); m_sysregc = data; } @@ -352,6 +360,13 @@ WRITE_LINE_MEMBER(ms0515_state::pit8253_out2_changed) m_speaker->level_w(state); } +void ms0515_state::machine_start() +{ + m_led9.resolve(); + m_led16.resolve(); + m_led17.resolve(); +} + void ms0515_state::machine_reset() { uint8_t *ram = m_ram->pointer(); diff --git a/src/mame/drivers/pc1500.cpp b/src/mame/drivers/pc1500.cpp index 09e63e71504..b30ddd2b5ed 100644 --- a/src/mame/drivers/pc1500.cpp +++ b/src/mame/drivers/pc1500.cpp @@ -32,12 +32,27 @@ public: , m_lcd_data(*this, "lcd_data") , m_keyboard(*this, "KEY.%u", 0) , m_io_on(*this, "ON") + , m_busy(*this, "BUSY") + , m_shift(*this, "SHIFT") + , m_sml(*this, "SML") + , m_small(*this, "SMALL") + , m_iii(*this, "III") + , m_ii(*this, "II") + , m_i(*this, "I") + , m_def(*this, "DEF") + , m_de(*this, "DE") + , m_g(*this, "G") + , m_rad(*this, "RAD") + , m_reserve(*this, "RESERVE") + , m_pro(*this, "PRO") + , m_run(*this, "RUN") { } void pc1500(machine_config &config); protected: + virtual void machine_start() override; virtual void machine_reset() override; private: @@ -48,6 +63,21 @@ private: required_ioport_array<8> m_keyboard; required_ioport m_io_on; + output_finder<> m_busy; + output_finder<> m_shift; + output_finder<> m_sml; + output_finder<> m_small; + output_finder<> m_iii; + output_finder<> m_ii; + output_finder<> m_i; + output_finder<> m_def; + output_finder<> m_de; + output_finder<> m_g; + output_finder<> m_rad; + output_finder<> m_reserve; + output_finder<> m_pro; + output_finder<> m_run; + uint8_t m_kb_matrix; uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -113,24 +143,42 @@ uint32_t pc1500_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap } } - output().set_value("BUSY", BIT(m_lcd_data[0x4e], 0)); - output().set_value("SHIFT", BIT(m_lcd_data[0x4e], 1)); - output().set_value("SML", BIT(m_lcd_data[0x4e], 2)); - output().set_value("SMALL", BIT(m_lcd_data[0x4e], 3)); - output().set_value("III", BIT(m_lcd_data[0x4e], 4)); - output().set_value("II", BIT(m_lcd_data[0x4e], 5)); - output().set_value("I", BIT(m_lcd_data[0x4e], 6)); - output().set_value("DEF", BIT(m_lcd_data[0x4e], 7)); - output().set_value("DE", BIT(m_lcd_data[0x4f], 0)); - output().set_value("G", BIT(m_lcd_data[0x4f], 1)); - output().set_value("RAD", BIT(m_lcd_data[0x4f], 2)); - output().set_value("RESERVE", BIT(m_lcd_data[0x4f], 4)); - output().set_value("PRO", BIT(m_lcd_data[0x4f], 5)); - output().set_value("RUN", BIT(m_lcd_data[0x4f], 6)); + m_busy = BIT(m_lcd_data[0x4e], 0); + m_shift = BIT(m_lcd_data[0x4e], 1); + m_sml = BIT(m_lcd_data[0x4e], 2); + m_small = BIT(m_lcd_data[0x4e], 3); + m_iii = BIT(m_lcd_data[0x4e], 4); + m_ii = BIT(m_lcd_data[0x4e], 5); + m_i = BIT(m_lcd_data[0x4e], 6); + m_def = BIT(m_lcd_data[0x4e], 7); + m_de = BIT(m_lcd_data[0x4f], 0); + m_g = BIT(m_lcd_data[0x4f], 1); + m_rad = BIT(m_lcd_data[0x4f], 2); + m_reserve = BIT(m_lcd_data[0x4f], 4); + m_pro = BIT(m_lcd_data[0x4f], 5); + m_run = BIT(m_lcd_data[0x4f], 6); return 0; } +void pc1500_state::machine_start() +{ + m_busy.resolve(); + m_shift.resolve(); + m_sml.resolve(); + m_small.resolve(); + m_iii.resolve(); + m_ii.resolve(); + m_i.resolve(); + m_def.resolve(); + m_de.resolve(); + m_g.resolve(); + m_rad.resolve(); + m_reserve.resolve(); + m_pro.resolve(); + m_run.resolve(); +} + void pc1500_state::machine_reset() { m_kb_matrix = 0xff; diff --git a/src/mame/drivers/pce220.cpp b/src/mame/drivers/pce220.cpp index fddfa2404ae..67a79f30730 100644 --- a/src/mame/drivers/pce220.cpp +++ b/src/mame/drivers/pce220.cpp @@ -52,6 +52,26 @@ public: , m_ram(*this, RAM_TAG) , m_beep(*this, "beeper") , m_serial(*this, PCE220SERIAL_TAG) + , m_keyboard(*this, "LINE%u", 0) + , m_io_on(*this, "ON") + , m_busy(*this, "BUSY") + , m_caps(*this, "CAPS") + , m_kana(*this, "KANA") + , m_syo(*this, "SYO") + , m_2ndf(*this, "2ndF") + , m_text(*this, "TEXT") + , m_casl(*this, "CASL") + , m_pro(*this, "PRO") + , m_run(*this, "RUN") + , m_batt(*this, "BATT") + , m_e(*this, "E") + , m_m(*this, "M") + , m_const(*this, "CONST") + , m_rad(*this, "RAD") + , m_g(*this, "G") + , m_de(*this, "DE") + , m_stat(*this, "STAT") + , m_print(*this, "PRINT") { } void pce220(machine_config &config); @@ -65,6 +85,28 @@ protected: required_device<beep_device> m_beep; required_device<pce220_serial_device> m_serial; + required_ioport_array<10> m_keyboard; + required_ioport m_io_on; + + output_finder<> m_busy; + output_finder<> m_caps; + output_finder<> m_kana; + output_finder<> m_syo; + output_finder<> m_2ndf; + output_finder<> m_text; + output_finder<> m_casl; + output_finder<> m_pro; + output_finder<> m_run; + output_finder<> m_batt; + output_finder<> m_e; + output_finder<> m_m; + output_finder<> m_const; + output_finder<> m_rad; + output_finder<> m_g; + output_finder<> m_de; + output_finder<> m_stat; + output_finder<> m_print; + // HD61202 LCD controller uint8_t m_lcd_index_row; uint8_t m_lcd_index_col; @@ -82,6 +124,7 @@ protected: uint8_t m_port15; uint8_t m_port18; + virtual void device_resolve_objects() override; virtual void machine_start() override; virtual void machine_reset() override; @@ -125,14 +168,16 @@ public: void pcg850v(machine_config &config); void pcg815(machine_config &config); +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + private: uint8_t m_g850v_bank_num; uint8_t m_lcd_effects; uint8_t m_lcd_contrast; uint8_t m_lcd_read_mode; - virtual void machine_start() override; - virtual void machine_reset() override; uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint8_t g850v_bank_r(); void g850v_bank_w(uint8_t data); @@ -184,24 +229,24 @@ uint32_t pce220_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap memset(lcd_symbols, 0, sizeof(lcd_symbols)); } - output().set_value("BUSY" , (lcd_symbols[0] & 0x01) ? 1 : 0); - output().set_value("CAPS" , (lcd_symbols[0] & 0x02) ? 1 : 0); - output().set_value("KANA" , (lcd_symbols[0] & 0x04) ? 1 : 0); - output().set_value("SYO" , (lcd_symbols[0] & 0x08) ? 1 : 0); - output().set_value("2ndF" , (lcd_symbols[0] & 0x10) ? 1 : 0); - output().set_value("TEXT" , (lcd_symbols[1] & 0x08) ? 1 : 0); - output().set_value("CASL" , (lcd_symbols[1] & 0x10) ? 1 : 0); - output().set_value("PRO" , (lcd_symbols[1] & 0x20) ? 1 : 0); - output().set_value("RUN" , (lcd_symbols[1] & 0x40) ? 1 : 0); - output().set_value("BATT" , (lcd_symbols[2] & 0x01) ? 1 : 0); - output().set_value("E" , (lcd_symbols[2] & 0x02) ? 1 : 0); - output().set_value("M" , (lcd_symbols[2] & 0x04) ? 1 : 0); - output().set_value("CONST", (lcd_symbols[2] & 0x08) ? 1 : 0); - output().set_value("RAD" , (lcd_symbols[2] & 0x10) ? 1 : 0); - output().set_value("G" , (lcd_symbols[2] & 0x20) ? 1 : 0); - output().set_value("DE" , (lcd_symbols[2] & 0x40) ? 1 : 0); - output().set_value("STAT" , (lcd_symbols[3] & 0x20) ? 1 : 0); - output().set_value("PRINT", (lcd_symbols[3] & 0x40) ? 1 : 0); + m_busy = (lcd_symbols[0] & 0x01) ? 1 : 0; + m_caps = (lcd_symbols[0] & 0x02) ? 1 : 0; + m_kana = (lcd_symbols[0] & 0x04) ? 1 : 0; + m_syo = (lcd_symbols[0] & 0x08) ? 1 : 0; + m_2ndf = (lcd_symbols[0] & 0x10) ? 1 : 0; + m_text = (lcd_symbols[1] & 0x08) ? 1 : 0; + m_casl = (lcd_symbols[1] & 0x10) ? 1 : 0; + m_pro = (lcd_symbols[1] & 0x20) ? 1 : 0; + m_run = (lcd_symbols[1] & 0x40) ? 1 : 0; + m_batt = (lcd_symbols[2] & 0x01) ? 1 : 0; + m_e = (lcd_symbols[2] & 0x02) ? 1 : 0; + m_m = (lcd_symbols[2] & 0x04) ? 1 : 0; + m_const= (lcd_symbols[2] & 0x08) ? 1 : 0; + m_rad = (lcd_symbols[2] & 0x10) ? 1 : 0; + m_g = (lcd_symbols[2] & 0x20) ? 1 : 0; + m_de = (lcd_symbols[2] & 0x40) ? 1 : 0; + m_stat = (lcd_symbols[3] & 0x20) ? 1 : 0; + m_print= (lcd_symbols[3] & 0x40) ? 1 : 0; return 0; } @@ -266,23 +311,23 @@ uint32_t pcg850v_state::screen_update(screen_device &screen, bitmap_ind16 &bitma memset(lcd_symbols, 0, sizeof(lcd_symbols)); } - output().set_value("RUN" , (lcd_symbols[0] & 0x02) ? 1 : 0); - output().set_value("PRO" , (lcd_symbols[0] & 0x08) ? 1 : 0); - output().set_value("TEXT" , (lcd_symbols[0] & 0x40) ? 1 : 0); - output().set_value("CASL" , (lcd_symbols[1] & 0x08) ? 1 : 0); - output().set_value("STAT" , (lcd_symbols[2] & 0x01) ? 1 : 0); - output().set_value("2ndF" , (lcd_symbols[2] & 0x20) ? 1 : 0); - output().set_value("M" , (lcd_symbols[2] & 0x80) ? 1 : 0); - output().set_value("CAPS" , (lcd_symbols[3] & 0x04) ? 1 : 0); - output().set_value("KANA" , (lcd_symbols[3] & 0x80) ? 1 : 0); - output().set_value("SYO" , (lcd_symbols[4] & 0x02) ? 1 : 0); - output().set_value("DE" , (lcd_symbols[4] & 0x10) ? 1 : 0); - output().set_value("G" , (lcd_symbols[4] & 0x40) ? 1 : 0); - output().set_value("RAD" , (lcd_symbols[5] & 0x01) ? 1 : 0); - output().set_value("CONST", (lcd_symbols[5] & 0x04) ? 1 : 0); - output().set_value("PRINT", (lcd_symbols[5] & 0x10) ? 1 : 0); - output().set_value("BUSY" , (lcd_symbols[5] & 0x40) ? 1 : 0); - output().set_value("BATT" , (lcd_symbols[5] & 0x80) ? 1 : 0); + m_run = (lcd_symbols[0] & 0x02) ? 1 : 0; + m_pro = (lcd_symbols[0] & 0x08) ? 1 : 0; + m_text = (lcd_symbols[0] & 0x40) ? 1 : 0; + m_casl = (lcd_symbols[1] & 0x08) ? 1 : 0; + m_stat = (lcd_symbols[2] & 0x01) ? 1 : 0; + m_2ndf = (lcd_symbols[2] & 0x20) ? 1 : 0; + m_m = (lcd_symbols[2] & 0x80) ? 1 : 0; + m_caps = (lcd_symbols[3] & 0x04) ? 1 : 0; + m_kana = (lcd_symbols[3] & 0x80) ? 1 : 0; + m_syo = (lcd_symbols[4] & 0x02) ? 1 : 0; + m_de = (lcd_symbols[4] & 0x10) ? 1 : 0; + m_g = (lcd_symbols[4] & 0x40) ? 1 : 0; + m_rad = (lcd_symbols[5] & 0x01) ? 1 : 0; + m_const= (lcd_symbols[5] & 0x04) ? 1 : 0; + m_print= (lcd_symbols[5] & 0x10) ? 1 : 0; + m_busy = (lcd_symbols[5] & 0x40) ? 1 : 0; + m_batt = (lcd_symbols[5] & 0x80) ? 1 : 0; return 0; } @@ -423,7 +468,7 @@ uint8_t pce220_state::port1f_r() data |= m_serial->in_ack()<<1; data |= m_serial->in_xin()<<2; - data |= ioport("ON")->read()<<7; + data |= m_io_on->read()<<7; return data; } @@ -445,26 +490,9 @@ uint8_t pce220_state::kb_r() { uint8_t data = 0x00; - if (m_kb_matrix & 0x01) - data |= ioport("LINE0")->read(); - if (m_kb_matrix & 0x02) - data |= ioport("LINE1")->read(); - if (m_kb_matrix & 0x04) - data |= ioport("LINE2")->read(); - if (m_kb_matrix & 0x08) - data |= ioport("LINE3")->read(); - if (m_kb_matrix & 0x10) - data |= ioport("LINE4")->read(); - if (m_kb_matrix & 0x20) - data |= ioport("LINE5")->read(); - if (m_kb_matrix & 0x40) - data |= ioport("LINE6")->read(); - if (m_kb_matrix & 0x80) - data |= ioport("LINE7")->read(); - if (m_kb_matrix & 0x100) - data |= ioport("LINE8")->read(); - if (m_kb_matrix & 0x200) - data |= ioport("LINE9")->read(); + for (int i = 0; i < 10; i++) + if (BIT(m_kb_matrix, i)) + data |= m_keyboard[i]->read(); return data; } @@ -867,6 +895,28 @@ static INPUT_PORTS_START( pcg850v ) PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_PGUP) PORT_NAME("ON") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, on_irq, 0 ) INPUT_PORTS_END +void pce220_state::device_resolve_objects() +{ + m_busy.resolve(); + m_caps.resolve(); + m_kana.resolve(); + m_syo.resolve(); + m_2ndf.resolve(); + m_text.resolve(); + m_casl.resolve(); + m_pro.resolve(); + m_run.resolve(); + m_batt.resolve(); + m_e.resolve(); + m_m.resolve(); + m_const.resolve(); + m_rad.resolve(); + m_g.resolve(); + m_de.resolve(); + m_stat.resolve(); + m_print.resolve(); +} + void pce220_state::machine_start() { uint8_t *rom = memregion("user1")->base(); diff --git a/src/mame/drivers/px4.cpp b/src/mame/drivers/px4.cpp index 2f539d2c1e6..92d9bc89c73 100644 --- a/src/mame/drivers/px4.cpp +++ b/src/mame/drivers/px4.cpp @@ -69,8 +69,10 @@ public: m_speaker(*this, "speaker"), m_sio(*this, "sio"), m_rs232(*this, "rs232"), - m_caps1(*this, "capsule1"), m_caps2(*this, "capsule2"), - m_caps1_rom(nullptr), m_caps2_rom(nullptr), + m_caps(*this, "capsule%u", 0U), + m_dips(*this, "dips"), + m_leds(*this, "led_%u", 0U), + m_caps_rom{nullptr, nullptr}, m_ctrl1(0), m_icrb(0), m_bankr(0), m_isr(0), m_ier(0), m_sior(0xbf), m_frc_value(0), m_frc_latch(0), @@ -188,7 +190,7 @@ protected: DECLARE_WRITE_LINE_MEMBER( serial_rx_w ); void txd_w(int data); - void install_rom_capsule(address_space &space, int size, memory_region *mem); + void install_rom_capsule(address_space &space, int size, uint8_t *mem); // internal devices required_device<cpu_device> m_z80; @@ -200,11 +202,11 @@ protected: required_device<speaker_sound_device> m_speaker; required_device<epson_sio_device> m_sio; required_device<rs232_port_device> m_rs232; - required_device<generic_slot_device> m_caps1; - required_device<generic_slot_device> m_caps2; + required_device_array<generic_slot_device, 2> m_caps; + required_ioport m_dips; + output_finder<3> m_leds; - memory_region *m_caps1_rom; - memory_region *m_caps2_rom; + uint8_t *m_caps_rom[2]; // gapnit register uint8_t m_ctrl1; @@ -504,18 +506,18 @@ uint8_t px4_state::str_r() } // helper function to map rom capsules -void px4_state::install_rom_capsule(address_space &space, int size, memory_region *mem) +void px4_state::install_rom_capsule(address_space &space, int size, uint8_t *mem) { // ram, part 1 space.install_ram(0x0000, 0xdfff - size, m_ram->pointer()); // actual rom data, part 1 if (mem) - space.install_rom(0xe000 - size, 0xffff, mem->base() + (size - 0x2000)); + space.install_rom(0xe000 - size, 0xffff, mem + (size - 0x2000)); // rom data, part 2 if (mem && size != 0x2000) - space.install_rom(0x10000 - size, 0xdfff, mem->base()); + space.install_rom(0x10000 - size, 0xdfff, mem); // ram, continued space.install_ram(0xe000, 0xffff, m_ram->pointer() + 0xe000); @@ -545,12 +547,12 @@ void px4_state::bankr_w(uint8_t data) space_program.install_ram(0x0000, 0xffff, m_ram->pointer()); break; - case 0x08: install_rom_capsule(space_program, 0x2000, m_caps1_rom); break; - case 0x09: install_rom_capsule(space_program, 0x4000, m_caps1_rom); break; - case 0x0a: install_rom_capsule(space_program, 0x8000, m_caps1_rom); break; - case 0x0c: install_rom_capsule(space_program, 0x2000, m_caps2_rom); break; - case 0x0d: install_rom_capsule(space_program, 0x4000, m_caps2_rom); break; - case 0x0e: install_rom_capsule(space_program, 0x8000, m_caps2_rom); break; + case 0x08: install_rom_capsule(space_program, 0x2000, m_caps_rom[0]); break; + case 0x09: install_rom_capsule(space_program, 0x4000, m_caps_rom[0]); break; + case 0x0a: install_rom_capsule(space_program, 0x8000, m_caps_rom[0]); break; + case 0x0c: install_rom_capsule(space_program, 0x2000, m_caps_rom[1]); break; + case 0x0d: install_rom_capsule(space_program, 0x4000, m_caps_rom[1]); break; + case 0x0e: install_rom_capsule(space_program, 0x8000, m_caps_rom[1]); break; default: if (VERBOSE) @@ -727,7 +729,7 @@ void px4_state::sior_w(uint8_t data) case 0x0a: if (VERBOSE) logerror("7508 cmd: DIP Switch Read\n"); - m_sior = ioport("dips")->read(); + m_sior = m_dips->read(); break; case 0x0b: if (VERBOSE) logerror("7508 cmd: Stop Key Interrupt disable\n"); break; @@ -1052,9 +1054,9 @@ void px4_state::ioctlr_w(uint8_t data) // bit 3, cartridge reset - output().set_value("led_0", BIT(data, 4)); // caps lock - output().set_value("led_1", BIT(data, 5)); // num lock - output().set_value("led_2", BIT(data, 6)); // "led 2" + m_leds[0] = BIT(data, 4); // caps lock + m_leds[1] = BIT(data, 5); // num lock + m_leds[2] = BIT(data, 6); // "led 2" m_speaker->level_w(BIT(data, 7)); } @@ -1234,9 +1236,10 @@ void px4p_state::init_px4p() void px4_state::machine_start() { - std::string region_tag; - m_caps1_rom = memregion(region_tag.assign(m_caps1->tag()).append(GENERIC_ROM_REGION_TAG).c_str()); - m_caps2_rom = memregion(region_tag.assign(m_caps2->tag()).append(GENERIC_ROM_REGION_TAG).c_str()); + m_leds.resolve(); + + for (int i = 0; i < 2; i++) + m_caps_rom[i] = m_caps[i]->get_rom_base(); m_nvram->set_base(m_ram->pointer(), 0x10000); @@ -1541,8 +1544,8 @@ void px4_state::px4(machine_config &config) m_rs232->cts_handler().set(FUNC(px4_state::rs232_cts_w)); // rom capsules - GENERIC_CARTSLOT(config, m_caps1, generic_plain_slot, "px4_cart"); - GENERIC_CARTSLOT(config, m_caps2, generic_plain_slot, "px4_cart"); + GENERIC_CARTSLOT(config, m_caps[0], generic_plain_slot, "px4_cart"); + GENERIC_CARTSLOT(config, m_caps[1], generic_plain_slot, "px4_cart"); // software list SOFTWARE_LIST(config, "cart_list").set_original("px4_cart"); diff --git a/src/mame/drivers/px8.cpp b/src/mame/drivers/px8.cpp index b33a203f1a2..a27d666d4ee 100644 --- a/src/mame/drivers/px8.cpp +++ b/src/mame/drivers/px8.cpp @@ -330,9 +330,8 @@ void px8_state::gah40m_w(offs_t offset, uint8_t data) */ - output().set_value("led_0", BIT(data, 0)); - output().set_value("led_1", BIT(data, 1)); - output().set_value("led_2", BIT(data, 2)); + for (int i = 0; i < 3; i++) + m_leds[i] = BIT(data, i); break; case GAH40M_IER: @@ -714,6 +713,8 @@ GFXDECODE_END void px8_state::machine_start() { + m_leds.resolve(); + /* register for state saving */ save_item(NAME(m_ier)); save_item(NAME(m_isr)); diff --git a/src/mame/drivers/rainbow.cpp b/src/mame/drivers/rainbow.cpp index 15889f0a18d..8db3fc465ac 100644 --- a/src/mame/drivers/rainbow.cpp +++ b/src/mame/drivers/rainbow.cpp @@ -497,7 +497,9 @@ public: m_palette2(*this, "palette2"), // GDC m_video_ram(*this, "vram"), - m_digits(*this, "digit%u", 0U) + m_digits(*this, "digit%u", 0U), + m_leds(*this, "led%u", 1U), + m_driveleds(*this, "driveled%u", 0U) { } @@ -652,6 +654,8 @@ protected: required_shared_ptr<uint16_t> m_video_ram; output_finder<2> m_digits; + output_finder<7> m_leds; + output_finder<4> m_driveleds; void raise_8088_irq(int ref); void lower_8088_irq(int ref); @@ -893,6 +897,8 @@ void rainbow_base_state::machine_start() switch_off_timer->adjust(attotime::from_msec(10)); m_digits.resolve(); + m_leds.resolve(); + m_driveleds.resolve(); m_screen_blank = false; @@ -1188,7 +1194,7 @@ void rainbow_base_state::machine_reset() hard_disk_file *local_hard_disk; local_hard_disk = rainbow_hdc_file(0); // one hard disk for now. - output().set_value("led1", 0); + m_leds[0] = 0; switch_off_timer->adjust(attotime::from_msec(500)); if (local_hard_disk) @@ -1196,7 +1202,7 @@ void rainbow_base_state::machine_reset() hard_disk_info *info; if ((info = hard_disk_get_info(local_hard_disk))) { - output().set_value("led1", 1); + m_leds[0] = 1; uint32_t max_sector = (info->cylinders) * (info->heads) * (info->sectors); popmessage("DEC %u (%3.2f) MB HARD DISK MOUNTED.\nGEOMETRY: %d HEADS (1..%d ARE OK).\n%d CYLINDERS (151 to %d ARE OK).\n%d SECTORS / TRACK (up to %d ARE OK). \n%d BYTES / SECTOR (128 to 1024 ARE OK).\n", @@ -1251,19 +1257,15 @@ void rainbow_base_state::machine_reset() m_irq_mask = 0; // RESET RED LEDs - output().set_value("led1", 1); - output().set_value("led2", 1); - output().set_value("led3", 1); - output().set_value("led4", 1); - output().set_value("led5", 1); - output().set_value("led6", 1); - output().set_value("led7", 1); + m_leds[0] = 1; + m_leds[1] = 1; + m_leds[2] = 1; + m_leds[3] = 1; + m_leds[4] = 1; + m_leds[5] = 1; + m_leds[6] = 1; - // GREEN KEYBOARD LEDs (1 = on, 0 = off): - output().set_value("led_wait", 0); // led8 - output().set_value("led_compose", 0); // led9 - output().set_value("led_lock", 0); // led10 - output().set_value("led_hold", 0); // led11 + // GREEN KEYBOARD LEDs (see machine/dec_lk201.cpp) } void rainbow_modela_state::machine_reset() @@ -1302,13 +1304,13 @@ void rainbow_base_state::device_timer(emu_timer &timer, device_timer_id tid, int switch_off_timer->adjust(attotime::never); - output().set_value("driveled0", 0); // DRIVE 0 (A) - output().set_value("driveled1", 0); // DRIVE 1 (B) - output().set_value("driveled2", 0); // DRIVE 2 (C) - output().set_value("driveled3", 0); // DRIVE 3 (D) + m_driveleds[0] = 0; // DRIVE 0 (A) + m_driveleds[1] = 0; // DRIVE 1 (B) + m_driveleds[2] = 0; // DRIVE 2 (C) + m_driveleds[3] = 0; // DRIVE 3 (D) - output().set_value("led1", 1); // 1 = OFF (One of the CPU LEDs as drive LED for DEC hard disk) - output().set_value("led2", 1); // 1 = OFF (One of the CPU LEDs as drive LED for Corvus HD) + m_leds[0] = 1; // 1 = OFF (One of the CPU LEDs as drive LED for DEC hard disk) + m_leds[1] = 1; // 1 = OFF (One of the CPU LEDs as drive LED for Corvus HD) break; // case 1 @@ -1637,7 +1639,7 @@ uint8_t rainbow_base_state::corvus_status_r() } else { - output().set_value("led2", 0); + m_leds[1] = 0; switch_off_timer->adjust(attotime::from_msec(500)); uint8_t status = m_corvus_hdc->status_r(); @@ -1747,7 +1749,7 @@ WRITE_LINE_MEMBER(rainbow_base_state::hdc_read_sector) if ((state == 0) && (last_state == 1) && (drv == 0)) { read_status = 2; // logerror("\nTRYING TO READ"); - output().set_value("led1", 0); + m_leds[0] = 0; switch_off_timer->adjust(attotime::from_msec(500)); int hi = (m_hdc->read(0x05)) & 0x07; @@ -1765,7 +1767,7 @@ WRITE_LINE_MEMBER(rainbow_base_state::hdc_read_sector) if ((info = hard_disk_get_info(local_hard_disk))) { read_status = 4; - output().set_value("led1", 1); + m_leds[0] = 1; // Pointer to info + C + H + S uint32_t lbasector = get_and_print_lbasector(this, info, cylinder, sdh & 0x07, sector_number); @@ -1816,7 +1818,7 @@ WRITE_LINE_MEMBER(rainbow_base_state::hdc_write_sector) if (state == 0 && wg_last == 1 && drv == 0) // Check correct state transition and DRIVE 0 .... { - output().set_value("led1", 0); // (1 = OFF ) =HARD DISK ACTIVITY = + m_leds[0] = 0; // (1 = OFF ) =HARD DISK ACTIVITY = switch_off_timer->adjust(attotime::from_msec(500)); if (rainbow_hdc_file(0) != nullptr) @@ -1853,7 +1855,7 @@ WRITE_LINE_MEMBER(rainbow_base_state::hdc_write_sector) int rainbow_base_state::do_write_sector() { int feedback = 0; // no error - output().set_value("led1", 0); // ON + m_leds[0] = 0; // ON switch_off_timer->adjust(attotime::from_msec(500)); hard_disk_file *local_hard_disk = rainbow_hdc_file(0); // one hard disk for now. @@ -1864,7 +1866,7 @@ int rainbow_base_state::do_write_sector() if (info) { feedback = 10; - output().set_value("led1", 1); // OFF + m_leds[0] = 1; // OFF uint8_t sdh = (m_hdc->read(0x06)); @@ -2007,7 +2009,7 @@ void rainbow_base_state::hd_status_68_w(uint8_t data) // 1 : see @ 088D after 'READ_SECTOR_OK' if (data & 0x01) { - output().set_value("led1", 0); // 1 = OFF (One of the CPU LEDs as DRIVE LED) = HARD DISK ACTIVITY = + m_leds[0] = 0; // 1 = OFF (One of the CPU LEDs as DRIVE LED) = HARD DISK ACTIVITY = switch_off_timer->adjust(attotime::from_msec(500)); m_hdc->buffer_ready(true); @@ -2075,7 +2077,7 @@ WRITE_LINE_MEMBER(rainbow_base_state::hdc_step) { m_hdc_step_latch = true; - output().set_value("led1", 0); // 1 = OFF (One of the CPU LEDs as DRIVE LED) = HARD DISK ACTIVITY = + m_leds[0] = 0; // 1 = OFF (One of the CPU LEDs as DRIVE LED) = HARD DISK ACTIVITY = switch_off_timer->adjust(attotime::from_msec(500)); } @@ -2240,10 +2242,10 @@ void rainbow_base_state::comm_control_w(uint8_t data) D6 -D5-D4-D3 <- INTERNAL LED NUMBER (DEC PDF) -4--5--6--7- <- NUMBERS EMBOSSED ON BACK OF PLASTIC HOUSING (see error chart) */ - output().set_value("led4", BIT(data, 5)); // LED "D6" - output().set_value("led5", BIT(data, 7)); // LED "D5" - output().set_value("led6", BIT(data, 6)); // LED "D4" - output().set_value("led7", BIT(data, 4)); // LED "D3" + m_leds[3] = BIT(data, 5); // LED "D6" + m_leds[4] = BIT(data, 7); // LED "D5" + m_leds[5] = BIT(data, 6); // LED "D4" + m_leds[6] = BIT(data, 4); // LED "D3" } // 8088 writes to port 0x00 (interrupts Z80) @@ -2307,9 +2309,9 @@ void rainbow_base_state::z80_diskdiag_write_w(uint8_t data) D11 D10 -D9 <- INTERNAL LED NUMBER (see PDF) -1 --2-- 3 <- NUMBERS EMBOSSED ON BACK OF PLASTIC HOUSING (see error chart) */ - output().set_value("led1", BIT(data, 4)); // LED "D11" - output().set_value("led2", BIT(data, 5)); // LED "D10" - output().set_value("led3", BIT(data, 6)); // LED "D9" + m_leds[0] = BIT(data, 4); // LED "D11" + m_leds[1] = BIT(data, 5); // LED "D10" + m_leds[2] = BIT(data, 6); // LED "D9" m_zflip = false; // "a write to 21H will reset ZFLIP" } @@ -2457,11 +2459,8 @@ void rainbow_base_state::z80_diskcontrol_w(uint8_t data) m_floppy = nullptr; } - output().set_value("driveled0", (selected_drive == 0) ? 1 : 0); - output().set_value("driveled1", (selected_drive == 1) ? 1 : 0); - - output().set_value("driveled2", (selected_drive == 2) ? 1 : 0); - output().set_value("driveled3", (selected_drive == 3) ? 1 : 0); + for (int i = 0; i < 4; i++) + m_driveleds[i] = (selected_drive == i) ? 1 : 0; switch_off_timer->adjust(attotime::from_msec(500)); if (m_floppy != nullptr) @@ -2483,14 +2482,14 @@ void rainbow_base_state::z80_diskcontrol_w(uint8_t data) m_fdc->set_force_ready(force_ready); // 1 : assert DRIVE READY on FDC (diagnostic override) if (selected_drive < 2) - { data |= 8; + { + data |= 8; enable_start = 0; disable_start = 2; } - else + else { data |= 16; - enable_start = 2; disable_start = 4; } diff --git a/src/mame/drivers/ravens.cpp b/src/mame/drivers/ravens.cpp index 91f123cefbf..c2d817ea7f2 100644 --- a/src/mame/drivers/ravens.cpp +++ b/src/mame/drivers/ravens.cpp @@ -103,18 +103,25 @@ class ravens_state : public ravens_base public: ravens_state(const machine_config &mconfig, device_type type, const char *tag) : ravens_base(mconfig, type, tag) + , m_io_keyboard(*this, "X%u", 0U) , m_digits(*this, "digit%u", 0U) + , m_leds(*this, "led%u", 0U) { } void ravens(machine_config &config); +protected: + virtual void machine_start() override; + private: - virtual void machine_start() override { m_digits.resolve(); } void io_map(address_map &map); u8 port17_r(); void display_w(offs_t offset, u8 data); void leds_w(u8 data); + + required_ioport_array<3> m_io_keyboard; output_finder<7> m_digits; + output_finder<8> m_leds; }; class ravens2_state : public ravens_base @@ -127,9 +134,11 @@ public: void ravens2(machine_config &config); -private: +protected: virtual void machine_reset() override; virtual void machine_start() override; + +private: void io_map(address_map &map); void kbd_put(u8 data); u8 port07_r(); @@ -150,6 +159,12 @@ READ_LINE_MEMBER( ravens_base::cass_r ) return (m_cass->input() > 0.03) ? 1 : 0; } +void ravens_state::machine_start() +{ + m_digits.resolve(); + m_leds.resolve(); +} + void ravens_state::display_w(offs_t offset, u8 data) { m_digits[offset] = data; @@ -157,18 +172,15 @@ void ravens_state::display_w(offs_t offset, u8 data) void ravens_state::leds_w(u8 data) { - char ledname[8]; for (int i = 0; i < 8; i++) - { - sprintf(ledname,"led%d",i); - output().set_value(ledname, !BIT(data, i)); - } + m_leds[i] = !BIT(data, i); } u8 ravens2_state::port07_r() { u8 ret = m_term_in; - m_term_in = 0x80; + if (!machine().side_effects_disabled()) + m_term_in = 0x80; return ret; } @@ -176,19 +188,19 @@ u8 ravens_state::port17_r() { u8 keyin, i; - keyin = ioport("X0")->read(); + keyin = m_io_keyboard[0]->read(); if (keyin != 0xff) for (i = 0; i < 8; i++) if (BIT(~keyin, i)) return i | 0x80; - keyin = ioport("X1")->read(); + keyin = m_io_keyboard[1]->read(); if (keyin != 0xff) for (i = 0; i < 8; i++) if (BIT(~keyin, i)) return i | 0x88; - keyin = ioport("X2")->read(); + keyin = m_io_keyboard[2]->read(); if (!BIT(keyin, 0)) m_maincpu->reset(); if (keyin != 0xff) diff --git a/src/mame/drivers/savia84.cpp b/src/mame/drivers/savia84.cpp index bd26fcf9631..e8668858fe0 100644 --- a/src/mame/drivers/savia84.cpp +++ b/src/mame/drivers/savia84.cpp @@ -42,26 +42,31 @@ public: , m_ppi8255(*this, "ppi8255") , m_display(*this, "display") , m_io_keyboard(*this, "X%u", 0U) + , m_leds(*this, "led%u", 0U) { } void savia84(machine_config &config); +protected: + virtual void machine_start() override; + private: - uint8_t savia84_8255_portc_r(); - void savia84_8255_porta_w(uint8_t data); - void savia84_8255_portb_w(uint8_t data); - void savia84_8255_portc_w(uint8_t data); + uint8_t ppi_portc_r(); + void ppi_porta_w(uint8_t data); + void ppi_portb_w(uint8_t data); + void ppi_portc_w(uint8_t data); void io_map(address_map &map); void mem_map(address_map &map); uint8_t m_digit; uint8_t m_seg; - virtual void machine_start() override; + required_device<cpu_device> m_maincpu; required_device<i8255_device> m_ppi8255; required_device<pwm_display_device> m_display; required_ioport_array<9> m_io_keyboard; + output_finder<3> m_leds; }; void savia84_state::mem_map(address_map &map) @@ -133,29 +138,25 @@ static INPUT_PORTS_START( savia84 ) INPUT_PORTS_END -void savia84_state::savia84_8255_porta_w(uint8_t data) // OUT F8 - output segments on the selected digit +void savia84_state::ppi_porta_w(uint8_t data) // OUT F8 - output segments on the selected digit { m_seg = ~data; m_display->matrix(1 << m_digit, m_seg); } -void savia84_state::savia84_8255_portb_w(uint8_t data) // OUT F9 - light the 8 leds down the left side +void savia84_state::ppi_portb_w(uint8_t data) // OUT F9 - light the 8 leds down the left side { - char ledname[8]; for (int i = 0; i < 8; i++) - { - sprintf(ledname,"led%d",i); - output().set_value(ledname, !BIT(data, i)); - } + m_leds[i] = !BIT(data, i); } -void savia84_state::savia84_8255_portc_w(uint8_t data) // OUT FA - set keyboard scanning row; set digit to display +void savia84_state::ppi_portc_w(uint8_t data) // OUT FA - set keyboard scanning row; set digit to display { m_digit = data & 15; m_display->matrix(1 << m_digit, m_seg); } -uint8_t savia84_state::savia84_8255_portc_r() // IN FA - read keyboard +uint8_t savia84_state::ppi_portc_r() // IN FA - read keyboard { if (m_digit < 9) return m_io_keyboard[m_digit]->read(); @@ -165,6 +166,8 @@ uint8_t savia84_state::savia84_8255_portc_r() // IN FA - read keyboard void savia84_state::machine_start() { + m_leds.resolve(); + save_item(NAME(m_digit)); save_item(NAME(m_seg)); } @@ -183,10 +186,10 @@ void savia84_state::savia84(machine_config &config) /* Devices */ I8255(config, m_ppi8255); - m_ppi8255->out_pa_callback().set(FUNC(savia84_state::savia84_8255_porta_w)); - m_ppi8255->out_pb_callback().set(FUNC(savia84_state::savia84_8255_portb_w)); - m_ppi8255->in_pc_callback().set(FUNC(savia84_state::savia84_8255_portc_r)); - m_ppi8255->out_pc_callback().set(FUNC(savia84_state::savia84_8255_portc_w)); + m_ppi8255->out_pa_callback().set(FUNC(savia84_state::ppi_porta_w)); + m_ppi8255->out_pb_callback().set(FUNC(savia84_state::ppi_portb_w)); + m_ppi8255->in_pc_callback().set(FUNC(savia84_state::ppi_portc_r)); + m_ppi8255->out_pc_callback().set(FUNC(savia84_state::ppi_portc_w)); } /* ROM definition */ diff --git a/src/mame/drivers/sitcom.cpp b/src/mame/drivers/sitcom.cpp index a5f2efee605..e1e7a85c03b 100644 --- a/src/mame/drivers/sitcom.cpp +++ b/src/mame/drivers/sitcom.cpp @@ -73,7 +73,6 @@ public: protected: template <unsigned D> void update_ds(offs_t offset, uint16_t data) { m_digits[(D << 2) | offset] = data; } DECLARE_WRITE_LINE_MEMBER(update_rxd) { m_rxd = bool(state); } - DECLARE_WRITE_LINE_MEMBER(sod_led) { output().set_value("sod_led", state); } DECLARE_READ_LINE_MEMBER(sid_line) { return m_rxd ? 1 : 0; } virtual void update_ppi_pa(uint8_t data); @@ -109,6 +108,7 @@ public: , m_speed(*this, "SPEED") , m_ppi(*this, "ppi") , m_ds2(*this, "ds2") + , m_test_led(*this, "test_led") , m_shutter_timer(nullptr) , m_shutter(false) , m_dac_cs(true) @@ -136,6 +136,7 @@ protected: required_ioport m_speed; required_device<i8255_device> m_ppi; required_device<dl1414_device> m_ds2; + output_finder<> m_test_led; emu_timer *m_shutter_timer; bool m_shutter; @@ -267,7 +268,7 @@ void sitcom_timer_state::update_ppi_pb(uint8_t data) m_ds2->wr_w(BIT(data, 2)); m_ds2->addr_w(bitswap<2>(data, 3, 4)); - output().set_value("test_led", BIT(data, 5)); + m_test_led = BIT(data, 5); } READ_LINE_MEMBER( sitcom_timer_state::shutter_r ) @@ -317,6 +318,8 @@ void sitcom_timer_state::machine_start() { sitcom_state::machine_start(); + m_test_led.resolve(); + m_shutter_timer = timer_alloc(TIMER_SHUTTER); save_item(NAME(m_shutter)); @@ -354,7 +357,7 @@ void sitcom_state::sitcom(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &sitcom_state::sitcom_mem); m_maincpu->set_addrmap(AS_IO, &sitcom_state::sitcom_io); m_maincpu->in_sid_func().set(FUNC(sitcom_state::sid_line)); - m_maincpu->out_sod_func().set(FUNC(sitcom_state::sod_led)); + m_maincpu->out_sod_func().set_output("sod_led"); ADDRESS_MAP_BANK(config, "bank").set_map(&sitcom_state::sitcom_bank).set_options(ENDIANNESS_LITTLE, 8, 16, 0x8000); diff --git a/src/mame/drivers/slc1.cpp b/src/mame/drivers/slc1.cpp index ea349baddfc..9ef26dc56fa 100644 --- a/src/mame/drivers/slc1.cpp +++ b/src/mame/drivers/slc1.cpp @@ -67,18 +67,22 @@ public: : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_speaker(*this, "speaker") + , m_chess_keyboard(*this, "X%u", 0U) + , m_trainer_keyboard(*this, "Y%u", 0U) , m_display(*this, "digit%u", 0U) + , m_busyled(*this, "busyled") { } void slc1(machine_config &config); +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + private: u8 io_r(offs_t offset); void io_w(offs_t offset, u8 data); - virtual void machine_start() override; - virtual void machine_reset() override; - void mem_map(address_map &map); void io_map(address_map &map); @@ -87,7 +91,10 @@ private: required_device<cpu_device> m_maincpu; required_device<speaker_sound_device> m_speaker; + required_ioport_array<3> m_chess_keyboard; + required_ioport_array<3> m_trainer_keyboard; output_finder<8> m_display; + output_finder<> m_busyled; }; @@ -126,7 +133,7 @@ void slc1_state::io_w(offs_t offset, u8 data) m_display[m_digit] = segdata; - output().set_value("busyled", busyled); + m_busyled = busyled; if (m_digit == 3) m_kbd_type = segdata; @@ -146,24 +153,24 @@ u8 slc1_state::io_r(offs_t offset) if (m_kbd_type) { // Trainer if (upper == 3) - data &= ioport("Y0")->read(); + data &= m_trainer_keyboard[0]->read(); else if (upper == 4) - data &= ioport("Y1")->read(); + data &= m_trainer_keyboard[1]->read(); else if (upper == 5) - data &= ioport("Y2")->read(); + data &= m_trainer_keyboard[2]->read(); } else { // Chess if (upper == 3) - data &= ioport("X0")->read(); + data &= m_chess_keyboard[0]->read(); else if (upper == 4) - data &= ioport("X1")->read(); + data &= m_chess_keyboard[1]->read(); else if (upper == 5) - data &= ioport("X2")->read(); + data &= m_chess_keyboard[2]->read(); } return data; @@ -180,6 +187,7 @@ u8 slc1_state::io_r(offs_t offset) void slc1_state::machine_start() { m_display.resolve(); + m_busyled.resolve(); save_item(NAME(m_digit)); save_item(NAME(m_kbd_type)); diff --git a/src/mame/drivers/svmu.cpp b/src/mame/drivers/svmu.cpp index 08e2ee7dd90..11bea861954 100644 --- a/src/mame/drivers/svmu.cpp +++ b/src/mame/drivers/svmu.cpp @@ -37,11 +37,17 @@ public: , m_flash(*this, "flash") , m_speaker(*this, "speaker") , m_bios(*this, "bios") + , m_battery(*this, "BATTERY") + , m_file_icon(*this, "file_icon") + , m_game_icon(*this, "game_icon") + , m_clock_icon(*this, "clock_icon") + , m_flash_icon(*this, "flash_icon") { } void svmu(machine_config &config); protected: + virtual void machine_start() override; virtual void machine_reset() override; private: @@ -62,6 +68,11 @@ private: required_device<intelfsh8_device> m_flash; required_device<speaker_sound_device> m_speaker; required_region_ptr<uint8_t> m_bios; + required_ioport m_battery; + output_finder<> m_file_icon; + output_finder<> m_game_icon; + output_finder<> m_clock_icon; + output_finder<> m_flash_icon; uint8_t m_page; }; @@ -126,7 +137,7 @@ void svmu_state::p1_w(uint8_t data) uint8_t svmu_state::p7_r() { - return (ioport("BATTERY")->read()<<1); + return (m_battery->read()<<1); } @@ -159,6 +170,14 @@ static INPUT_PORTS_START( svmu ) PORT_CONFSETTING( 0x00, "Poor" ) INPUT_PORTS_END +void svmu_state::machine_start() +{ + m_file_icon.resolve(); + m_game_icon.resolve(); + m_clock_icon.resolve(); + m_flash_icon.resolve(); +} + void svmu_state::machine_reset() { m_page = 0; @@ -188,10 +207,10 @@ LC8670_LCD_UPDATE(svmu_state::svmu_lcd_update) bitmap.fill(0, cliprect); } - machine().output().set_value("file_icon" , lcd_enabled ? BIT(vram[0xc1],6) : 0); - machine().output().set_value("game_icon" , lcd_enabled ? BIT(vram[0xc2],4) : 0); - machine().output().set_value("clock_icon", lcd_enabled ? BIT(vram[0xc3],2) : 0); - machine().output().set_value("flash_icon", lcd_enabled ? BIT(vram[0xc4],0) : 0); + m_file_icon = lcd_enabled ? BIT(vram[0xc1],6) : 0; + m_game_icon = lcd_enabled ? BIT(vram[0xc2],4) : 0; + m_clock_icon = lcd_enabled ? BIT(vram[0xc3],2) : 0; + m_flash_icon = lcd_enabled ? BIT(vram[0xc4],0) : 0; return 0; } diff --git a/src/mame/drivers/tm990189.cpp b/src/mame/drivers/tm990189.cpp index c5d4b5e01a3..f462a477a39 100644 --- a/src/mame/drivers/tm990189.cpp +++ b/src/mame/drivers/tm990189.cpp @@ -93,6 +93,7 @@ public: , m_tms9901_sys(*this, TMS9901_1_TAG) , m_tms9902(*this, "tms9902") , m_digits(*this, "digit%u", 0U) + , m_leds(*this, "led%u", 0U) { } void tm990_189_v(machine_config &config); @@ -165,6 +166,7 @@ private: required_device<tms9901_device> m_tms9901_sys; required_device<tms9902_device> m_tms9902; output_finder<10> m_digits; + output_finder<7> m_leds; int m_load_state; @@ -196,12 +198,14 @@ MACHINE_RESET_MEMBER(tm990189_state,tm990_189) MACHINE_START_MEMBER(tm990189_state,tm990_189) { m_digits.resolve(); + m_leds.resolve(); m_displayena_timer = machine().scheduler().timer_alloc(timer_expired_delegate()); } MACHINE_START_MEMBER(tm990189_state,tm990_189_v) { m_digits.resolve(); + m_leds.resolve(); m_displayena_timer = machine().scheduler().timer_alloc(timer_expired_delegate()); m_joy1x_timer = machine().scheduler().timer_alloc(timer_expired_delegate()); @@ -259,11 +263,9 @@ void tm990189_state::draw_digit() TIMER_DEVICE_CALLBACK_MEMBER(tm990189_state::display_callback) { - uint8_t i; - char ledname[8]; // since the segment data is cleared after being used, the old_segment is there // in case the segment data hasn't been refreshed yet. - for (i = 0; i < 10; i++) + for (uint8_t i = 0; i < 10; i++) { m_old_segment_state[i] |= m_segment_state[i]; m_digits[i] = m_old_segment_state[i]; @@ -271,11 +273,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(tm990189_state::display_callback) m_segment_state[i] = 0; } - for (i = 0; i < 7; i++) - { - sprintf(ledname,"led%d",i); - output().set_value(ledname, !BIT(m_LED_state, i)); - } + for (uint8_t i = 0; i < 7; i++) + m_leds[i] = !BIT(m_LED_state, i); } /* diff --git a/src/mame/drivers/vk100.cpp b/src/mame/drivers/vk100.cpp index cb3e4ee42db..7dff5700c6c 100644 --- a/src/mame/drivers/vk100.cpp +++ b/src/mame/drivers/vk100.cpp @@ -179,7 +179,14 @@ public: //m_sync_timer(nullptr), m_capsshift(*this, "CAPSSHIFT"), - m_dipsw(*this, "SWITCHES") + m_dipsw(*this, "SWITCHES"), + m_online_led(*this, "online_led"), + m_local_led(*this, "local_led"), + m_noscroll_led(*this, "noscroll_led"), + m_basic_led(*this, "basic_led"), + m_hardcopy_led(*this, "hardcopy_led"), + m_l1_led(*this, "l1_led"), + m_l2_led(*this, "l2_led") { } @@ -204,6 +211,14 @@ private: required_ioport m_capsshift; required_ioport m_dipsw; + output_finder<> m_online_led; + output_finder<> m_local_led; + output_finder<> m_noscroll_led; + output_finder<> m_basic_led; + output_finder<> m_hardcopy_led; + output_finder<> m_l1_led; + output_finder<> m_l2_led; + uint8_t* m_vram; uint8_t* m_trans; uint8_t* m_pattern; @@ -556,13 +571,13 @@ void vk100_state::vgEX(offs_t offset, uint8_t data) /* port 0x68: "KBDW" d7 is beeper, d6 is keyclick, d5-d0 are keyboard LEDS */ void vk100_state::KBDW(uint8_t data) { - output().set_value("online_led",BIT(data, 5) ? 1 : 0); - output().set_value("local_led", BIT(data, 5) ? 0 : 1); - output().set_value("noscroll_led",BIT(data, 4) ? 1 : 0); - output().set_value("basic_led", BIT(data, 3) ? 1 : 0); - output().set_value("hardcopy_led", BIT(data, 2) ? 1 : 0); - output().set_value("l1_led", BIT(data, 1) ? 1 : 0); - output().set_value("l2_led", BIT(data, 0) ? 1 : 0); + m_online_led = BIT(data, 5) ? 1 : 0; + m_local_led = BIT(data, 5) ? 0 : 1; + m_noscroll_led = BIT(data, 4) ? 1 : 0; + m_basic_led = BIT(data, 3) ? 1 : 0; + m_hardcopy_led = BIT(data, 2) ? 1 : 0; + m_l1_led = BIT(data, 1) ? 1 : 0; + m_l2_led = BIT(data, 0) ? 1 : 0; #ifdef LED_VERBOSE if (BIT(data, 6)) logerror("kb keyclick bit 6 set: not emulated yet (multivibrator)!\n"); #endif @@ -923,13 +938,21 @@ INPUT_PORTS_END void vk100_state::machine_start() { - output().set_value("online_led",1); - output().set_value("local_led", 0); - output().set_value("noscroll_led",1); - output().set_value("basic_led", 1); - output().set_value("hardcopy_led", 1); - output().set_value("l1_led", 1); - output().set_value("l2_led", 1); + m_online_led.resolve(); + m_local_led.resolve(); + m_noscroll_led.resolve(); + m_basic_led.resolve(); + m_hardcopy_led.resolve(); + m_l1_led.resolve(); + m_l2_led.resolve(); + + m_online_led = 1; + m_local_led = 0; + m_noscroll_led = 1; + m_basic_led = 1; + m_hardcopy_led = 1; + m_l1_led = 1; + m_l2_led = 1; m_vsync = 0; m_dir_a6 = 1; m_cout = 0; diff --git a/src/mame/drivers/x68k.cpp b/src/mame/drivers/x68k.cpp index a2eca47417d..7a93ea3db98 100644 --- a/src/mame/drivers/x68k.cpp +++ b/src/mame/drivers/x68k.cpp @@ -1501,13 +1501,6 @@ void x68k_state::machine_reset() //m_mfpdev->i7_w(1); // h-sync // reset output values - output().set_value("key_led_kana",1); - output().set_value("key_led_romaji",1); - output().set_value("key_led_code",1); - output().set_value("key_led_caps",1); - output().set_value("key_led_insert",1); - output().set_value("key_led_hiragana",1); - output().set_value("key_led_fullsize",1); std::fill(std::begin(m_eject_drv_out), std::end(m_eject_drv_out), 1); std::fill(std::begin(m_ctrl_drv_out), std::end(m_ctrl_drv_out), 1); std::fill(std::begin(m_access_drv_out), std::end(m_access_drv_out), 1); diff --git a/src/mame/includes/alesis.h b/src/mame/includes/alesis.h index b15a3c32ae8..9efc395235e 100644 --- a/src/mame/includes/alesis.h +++ b/src/mame/includes/alesis.h @@ -61,14 +61,10 @@ public: m_lcdc(*this, "hd44780"), m_cassette(*this, "cassette"), m_maincpu(*this, "maincpu"), - m_col1(*this, "COL1"), - m_col2(*this, "COL2"), - m_col3(*this, "COL3"), - m_col4(*this, "COL4"), - m_col5(*this, "COL5"), - m_col6(*this, "COL6"), + m_col(*this, "COL%u", 1U), m_select(*this, "SELECT"), m_digit(*this, "digit%u", 0U), + m_pattern(*this, "pattern"), m_track_led(*this, "track_led%u", 1U), m_patt_led(*this, "patt_led"), m_song_led(*this, "song_led"), @@ -168,14 +164,10 @@ private: optional_device<cassette_image_device> m_cassette; required_device<mcs51_cpu_device> m_maincpu; - required_ioport m_col1; - required_ioport m_col2; - required_ioport m_col3; - required_ioport m_col4; - required_ioport m_col5; - required_ioport m_col6; + required_ioport_array<6> m_col; optional_ioport m_select; output_finder<5> m_digit; + output_finder<> m_pattern; output_finder<8> m_track_led; output_finder<> m_patt_led; output_finder<> m_song_led; diff --git a/src/mame/includes/apollo.h b/src/mame/includes/apollo.h index 367a926baa5..47f9548b31f 100644 --- a/src/mame/includes/apollo.h +++ b/src/mame/includes/apollo.h @@ -135,9 +135,37 @@ public: m_node_id(*this, APOLLO_NI_TAG), m_isa(*this, APOLLO_ISA_TAG), m_graphics(*this, APOLLO_SCREEN_TAG), - m_keyboard(*this, APOLLO_KBD_TAG) + m_keyboard(*this, APOLLO_KBD_TAG), + m_internal_leds(*this, "internal_led_%u", 1U), + m_external_leds(*this, "external_led_%c", unsigned('a')) { } + void dn3500(machine_config &config); + void dn5500_19i(machine_config &config); + void dn3000(machine_config &config); + void dn3000_15i(machine_config &config); + void dn3000_19i(machine_config &config); + void dn3500_15i(machine_config &config); + void dsp3000(machine_config &config); + void dsp3500(machine_config &config); + void dsp5500(machine_config &config); + void dn5500(machine_config &config); + void dn5500_15i(machine_config &config); + void dn3500_19i(machine_config &config); + + void init_dsp3000(); + void init_dsp5500(); + void init_dn3500(); + void init_dn3000(); + void init_dsp3500(); + void init_dn5500(); + void init_apollo(); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: required_device<m68000_base_device> m_maincpu; required_device<ram_device> m_ram; required_shared_ptr<uint32_t> m_messram_ptr; @@ -154,6 +182,8 @@ public: required_device<isa16_device> m_isa; optional_device<apollo_graphics_15i> m_graphics; optional_device<apollo_kbd_device> m_keyboard; + output_finder<4> m_internal_leds; + output_finder<4> m_external_leds; void apollo_csr_status_register_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); uint16_t apollo_csr_status_register_r(offs_t offset, uint16_t mem_mask = ~0); @@ -202,16 +232,7 @@ public: uint8_t dn5500_11500_r(offs_t offset); void dn5500_io_protection_map_w(offs_t offset, uint8_t data); uint8_t dn5500_io_protection_map_r(offs_t offset); - void init_dsp3000(); - void init_dsp5500(); - void init_dn3500(); - void init_dn3000(); - void init_dsp3500(); - void init_dn5500(); - void init_apollo(); - virtual void machine_start() override; - virtual void machine_reset() override; DECLARE_MACHINE_RESET(apollo); DECLARE_MACHINE_START(apollo); @@ -264,25 +285,14 @@ public: void common(machine_config &config); void apollo(machine_config &config); void apollo_terminal(machine_config &config); - void dn3500(machine_config &config); - void dn5500_19i(machine_config &config); - void dn3000(machine_config &config); - void dn3000_15i(machine_config &config); - void dn3000_19i(machine_config &config); - void dn3500_15i(machine_config &config); - void dsp3000(machine_config &config); - void dsp3500(machine_config &config); - void dsp5500(machine_config &config); - void dn5500(machine_config &config); - void dn5500_15i(machine_config &config); - void dn3500_19i(machine_config &config); + void dn3000_map(address_map &map); void dn3500_map(address_map &map); void dn5500_map(address_map &map); void dsp3000_map(address_map &map); void dsp3500_map(address_map &map); void dsp5500_map(address_map &map); -private: + uint32_t ptm_counter; uint8_t sio_output_data; int m_dma_channel; diff --git a/src/mame/includes/hp48.h b/src/mame/includes/hp48.h index 6819d4a0b15..990592b5e9d 100644 --- a/src/mame/includes/hp48.h +++ b/src/mame/includes/hp48.h @@ -42,6 +42,12 @@ public: , m_palette(*this, "palette") , m_screen(*this, "screen") , m_port(*this, "port%u", 1U) + , m_lshift0(*this, "lshift0") + , m_rshift0(*this, "rshift0") + , m_alpha0(*this, "alpha0") + , m_alert0(*this, "alert0") + , m_busy0(*this, "busy0") + , m_transmit0(*this, "transmit0") { } @@ -150,6 +156,13 @@ private: */ optional_device_array<hp48_port_image_device, 2> m_port; + output_finder<> m_lshift0; + output_finder<> m_rshift0; + output_finder<> m_alpha0; + output_finder<> m_alert0; + output_finder<> m_busy0; + output_finder<> m_transmit0; + uint32_t m_bank_switch; uint32_t m_io_addr; uint16_t m_crc; diff --git a/src/mame/includes/hp9845.h b/src/mame/includes/hp9845.h index 62c2a2b6e42..30ffc7f2a46 100644 --- a/src/mame/includes/hp9845.h +++ b/src/mame/includes/hp9845.h @@ -63,6 +63,9 @@ protected: required_device_array<hp9845_io_slot_device, 4> m_io_slot; required_device<ram_device> m_ram; output_finder<8> m_softkeys; + output_finder<> m_shift_lock_led; + output_finder<> m_prt_all_led; + output_finder<> m_auto_st_led; void setup_ram_block(unsigned block , unsigned offset); diff --git a/src/mame/includes/kaypro.h b/src/mame/includes/kaypro.h index 97de596cfe4..2e66840954b 100644 --- a/src/mame/includes/kaypro.h +++ b/src/mame/includes/kaypro.h @@ -39,6 +39,7 @@ public: , m_bankw(*this, "bankw") , m_bank3(*this, "bank3") , m_floppy_timer(*this, "floppy_timer") + , m_leds(*this, "led%c", unsigned('A')) {} void omni2(machine_config &config); @@ -53,6 +54,10 @@ public: void init_kaypro(); +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + private: void kaypro484_io(address_map &map); void kaypro_map(address_map &map); @@ -75,8 +80,7 @@ private: DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); u8 kaypro_videoram_r(offs_t offset); void kaypro_videoram_w(offs_t offset, u8 data); - void machine_start() override; - void machine_reset() override; + void kaypro_palette(palette_device &palette) const; uint32_t screen_update_kayproii(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_kaypro484(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); @@ -115,6 +119,7 @@ private: required_memory_bank m_bankw; required_memory_bank m_bank3; required_device<timer_device> m_floppy_timer; + output_finder<2> m_leds; }; #endif // MAME_INCLUDES_KAYPRO_H diff --git a/src/mame/includes/px8.h b/src/mame/includes/px8.h index 81c6ccd6c9d..e7794dd6746 100644 --- a/src/mame/includes/px8.h +++ b/src/mame/includes/px8.h @@ -36,6 +36,7 @@ public: , m_cassette(*this, "cassette") , m_ram(*this, RAM_TAG) , m_video_ram(*this, "video_ram") + , m_leds(*this, "led_%u", 0U) { } void px8(machine_config &config); @@ -46,6 +47,7 @@ private: required_device<ram_device> m_ram; /* video state */ required_shared_ptr<uint8_t> m_video_ram; /* LCD video RAM */ + output_finder<3> m_leds; virtual void machine_start() override; virtual void machine_reset() override; diff --git a/src/mame/includes/thomson.h b/src/mame/includes/thomson.h index 430d6ea6f43..e61befe3009 100644 --- a/src/mame/includes/thomson.h +++ b/src/mame/includes/thomson.h @@ -150,7 +150,8 @@ public: m_to7qdd(*this, "to7qdd"), m_thmfc(*this, "thmfc"), m_floppy_led(*this, "floppy"), - m_floppy_image(*this, "floppy%u", 0U) + m_floppy_image(*this, "floppy%u", 0U), + m_caps_led(*this, "led0") { } @@ -434,6 +435,8 @@ private: output_finder<> m_floppy_led; required_device_array<legacy_floppy_image_device, 4> m_floppy_image; + output_finder<> m_caps_led; + /* bank logging and optimisations */ int m_old_cart_bank; int m_old_cart_bank_was_read_only; @@ -555,7 +558,6 @@ private: int mo5_get_cassette(); void mo5_set_cassette( int data ); void thom_irq_reset(); - void thom_set_caps_led( int led ); void to7_update_cart_bank(); void to7_set_init( int init ); void to7_modem_reset(); diff --git a/src/mame/machine/apollo.cpp b/src/mame/machine/apollo.cpp index b0097398432..348351f4dad 100644 --- a/src/mame/machine/apollo.cpp +++ b/src/mame/machine/apollo.cpp @@ -266,14 +266,10 @@ void apollo_state::apollo_csr_control_register_w(offs_t offset, uint16_t data, u COMBINE_DATA(&cpu_control_register); - output().set_value("internal_led_1", (cpu_control_register >> 15) & 1); - output().set_value("internal_led_2", (cpu_control_register >> 14) & 1); - output().set_value("internal_led_3", (cpu_control_register >> 13) & 1); - output().set_value("internal_led_4", (cpu_control_register >> 12) & 1); - output().set_value("external_led_a", (cpu_control_register >> 11) & 1); - output().set_value("external_led_b", (cpu_control_register >> 10) & 1); - output().set_value("external_led_c", (cpu_control_register >> 9) & 1); - output().set_value("external_led_d", (cpu_control_register >> 8) & 1); + for (int i = 0; i < 4; i++) + m_internal_leds[i] = BIT(cpu_control_register, 15 - i); + for (int i = 0; i < 4; i++) + m_external_leds[i] = BIT(cpu_control_register, 11 - i); leds = ((cpu_control_register >> 8) & 0xff) ^ 0xff; @@ -1203,6 +1199,9 @@ MACHINE_START_MEMBER(apollo_state,apollo) m_dma_channel = -1; m_cur_eop = false; + + m_internal_leds.resolve(); + m_external_leds.resolve(); } MACHINE_RESET_MEMBER(apollo_state,apollo) diff --git a/src/mame/machine/dec_lk201.cpp b/src/mame/machine/dec_lk201.cpp index aca879a7775..3230a3b1dda 100644 --- a/src/mame/machine/dec_lk201.cpp +++ b/src/mame/machine/dec_lk201.cpp @@ -508,24 +508,11 @@ lk201_device::lk201_device(const machine_config &mconfig, const char *tag, devic device_serial_interface(mconfig, *this), m_maincpu(*this, LK201_CPU_TAG), m_speaker(*this, LK201_SPK_TAG), - m_kbd0(*this, "KBD0"), - m_kbd1(*this, "KBD1"), - m_kbd2(*this, "KBD2"), - m_kbd3(*this, "KBD3"), - m_kbd4(*this, "KBD4"), - m_kbd5(*this, "KBD5"), - m_kbd6(*this, "KBD6"), - m_kbd7(*this, "KBD7"), - m_kbd8(*this, "KBD8"), - m_kbd9(*this, "KBD9"), - m_kbd10(*this, "KBD10"), - m_kbd11(*this, "KBD11"), - m_kbd12(*this, "KBD12"), - m_kbd13(*this, "KBD13"), - m_kbd14(*this, "KBD14"), - m_kbd15(*this, "KBD15"), - m_kbd16(*this, "KBD16"), - m_kbd17(*this, "KBD17"), + m_kbd(*this, "KBD%u", 0U), + m_led_wait(*this, "led_wait"), + m_led_compose(*this, "led_compose"), + m_led_lock(*this, "led_lock"), + m_led_hold(*this, "led_hold"), m_tx_handler(*this) { } @@ -540,6 +527,11 @@ void lk201_device::device_start() m_tx_handler.resolve_safe(); m_beeper = timer_alloc(2); + + m_led_wait.resolve(); + m_led_compose.resolve(); + m_led_lock.resolve(); + m_led_hold.resolve(); } @@ -572,6 +564,12 @@ void lk201_device::device_reset() transmit_register_reset(); receive_register_reset(); + + // GREEN KEYBOARD LEDs (1 = on, 0 = off): + m_led_wait = 0; // led8 + m_led_compose = 0; // led9 + m_led_lock = 0; // led10 + m_led_hold = 0; // led11 } void lk201_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) @@ -733,24 +731,24 @@ void lk201_device::send_port(uint8_t offset, uint8_t olddata) // Check for keyboard read strobe if (((portc & 0x40) == 0) && (olddata & 0x40)) { - if (porta & 0x1) kbd_data = m_kbd0->read(); - if (porta & 0x2) kbd_data = m_kbd1->read(); - if (porta & 0x4) kbd_data = m_kbd2->read(); - if (porta & 0x8) kbd_data = m_kbd3->read(); - if (porta & 0x10) kbd_data = m_kbd4->read(); - if (porta & 0x20) kbd_data = m_kbd5->read(); - if (porta & 0x40) kbd_data = m_kbd6->read(); - if (porta & 0x80) kbd_data = m_kbd7->read(); - if (portb & 0x1) kbd_data = m_kbd8->read(); - if (portb & 0x2) kbd_data = m_kbd9->read(); - if (portb & 0x4) kbd_data = m_kbd10->read(); - if (portb & 0x8) kbd_data = m_kbd11->read(); - if (portb & 0x10) kbd_data = m_kbd12->read(); - if (portb & 0x20) kbd_data = m_kbd13->read(); - if (portb & 0x40) kbd_data = m_kbd14->read(); - if (portb & 0x80) kbd_data = m_kbd15->read(); - if (portc & 0x1) kbd_data = m_kbd16->read(); - if (portc & 0x2) kbd_data = m_kbd17->read(); + if (porta & 0x1) kbd_data = m_kbd[0]->read(); + if (porta & 0x2) kbd_data = m_kbd[1]->read(); + if (porta & 0x4) kbd_data = m_kbd[2]->read(); + if (porta & 0x8) kbd_data = m_kbd[3]->read(); + if (porta & 0x10) kbd_data = m_kbd[4]->read(); + if (porta & 0x20) kbd_data = m_kbd[5]->read(); + if (porta & 0x40) kbd_data = m_kbd[6]->read(); + if (porta & 0x80) kbd_data = m_kbd[7]->read(); + if (portb & 0x1) kbd_data = m_kbd[8]->read(); + if (portb & 0x2) kbd_data = m_kbd[9]->read(); + if (portb & 0x4) kbd_data = m_kbd[10]->read(); + if (portb & 0x8) kbd_data = m_kbd[11]->read(); + if (portb & 0x10) kbd_data = m_kbd[12]->read(); + if (portb & 0x20) kbd_data = m_kbd[13]->read(); + if (portb & 0x40) kbd_data = m_kbd[14]->read(); + if (portb & 0x80) kbd_data = m_kbd[15]->read(); + if (portc & 0x1) kbd_data = m_kbd[16]->read(); + if (portc & 0x2) kbd_data = m_kbd[17]->read(); } // Check for LED update strobe @@ -758,10 +756,10 @@ void lk201_device::send_port(uint8_t offset, uint8_t olddata) { if(ddrs[2] != 0x00) { // Lower nibble contains the LED values (1 = on, 0 = off) - machine().output().set_value("led_wait" , (led_data & 0x1) == 1); - machine().output().set_value("led_compose", (led_data & 0x2) == 2); - machine().output().set_value("led_lock" , (led_data & 0x4) == 4); - machine().output().set_value("led_hold" , (led_data & 0x8) == 8); + m_led_wait = (led_data & 0x1) == 1; + m_led_compose= (led_data & 0x2) == 2; + m_led_lock = (led_data & 0x4) == 4; + m_led_hold = (led_data & 0x8) == 8; } if (led_data & 0xf0) { diff --git a/src/mame/machine/dec_lk201.h b/src/mame/machine/dec_lk201.h index 98da6c23d56..87a7e45a65d 100644 --- a/src/mame/machine/dec_lk201.h +++ b/src/mame/machine/dec_lk201.h @@ -44,7 +44,7 @@ class lk201_device : public device_t, public device_serial_interface { public: // construction/destruction - lk201_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + lk201_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); uint8_t ddr_r(offs_t offset); void ddr_w(offs_t offset, uint8_t data); @@ -109,24 +109,12 @@ private: required_device<cpu_device> m_maincpu; required_device<beep_device> m_speaker; - required_ioport m_kbd0; - required_ioport m_kbd1; - required_ioport m_kbd2; - required_ioport m_kbd3; - required_ioport m_kbd4; - required_ioport m_kbd5; - required_ioport m_kbd6; - required_ioport m_kbd7; - required_ioport m_kbd8; - required_ioport m_kbd9; - required_ioport m_kbd10; - required_ioport m_kbd11; - required_ioport m_kbd12; - required_ioport m_kbd13; - required_ioport m_kbd14; - required_ioport m_kbd15; - required_ioport m_kbd16; - required_ioport m_kbd17; + required_ioport_array<18> m_kbd; + + output_finder<> m_led_wait; + output_finder<> m_led_compose; + output_finder<> m_led_lock; + output_finder<> m_led_hold; void send_port(uint8_t offset, uint8_t data); void update_interrupts(); diff --git a/src/mame/machine/hp48.cpp b/src/mame/machine/hp48.cpp index 21c889a20ce..562bad1adf5 100644 --- a/src/mame/machine/hp48.cpp +++ b/src/mame/machine/hp48.cpp @@ -246,12 +246,12 @@ void hp48_state::update_annunciators() bit 7: master enable */ int markers = HP48_IO_8(0xb); - output().set_value( "lshift0", (markers & 0x81) == 0x81 ); - output().set_value( "rshift0", (markers & 0x82) == 0x82 ); - output().set_value( "alpha0", (markers & 0x84) == 0x84 ); - output().set_value( "alert0", (markers & 0x88) == 0x88 ); - output().set_value( "busy0", (markers & 0x90) == 0x90 ); - output().set_value( "transmit0", (markers & 0xb0) == 0xb0 ); + m_lshift0 = (markers & 0x81) == 0x81; + m_rshift0 = (markers & 0x82) == 0x82; + m_alpha0 = (markers & 0x84) == 0x84; + m_alert0 = (markers & 0x88) == 0x88; + m_busy0 = (markers & 0x90) == 0x90; + m_transmit0 = (markers & 0xb0) == 0xb0; } @@ -995,6 +995,13 @@ void hp48_state::base_machine_start(hp48_models model) m_kbd_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(hp48_state::kbd_cb), this)); m_kbd_timer->adjust(attotime::from_msec(1), 0, attotime::from_msec(1)); + m_lshift0.resolve(); + m_rshift0.resolve(); + m_alpha0.resolve(); + m_alert0.resolve(); + m_busy0.resolve(); + m_transmit0.resolve(); + /* save state */ save_item(NAME(m_out)); save_item(NAME(m_kdn)); diff --git a/src/mame/machine/kay_kbd.cpp b/src/mame/machine/kay_kbd.cpp index b147169115c..0958c84170e 100644 --- a/src/mame/machine/kay_kbd.cpp +++ b/src/mame/machine/kay_kbd.cpp @@ -338,6 +338,7 @@ kaypro_10_keyboard_device::kaypro_10_keyboard_device( , m_bell(*this, "bell") , m_matrix(*this, "ROW.%X", 0) , m_modifiers(*this, "MOD") + , m_led_caps_lock(*this, "led_caps_lock") , m_rxd_cb(*this) , m_txd(1U) , m_bus(0U) @@ -372,6 +373,7 @@ ioport_constructor kaypro_10_keyboard_device::device_input_ports() const void kaypro_10_keyboard_device::device_start() { m_rxd_cb.resolve_safe(); + m_led_caps_lock.resolve(); save_item(NAME(m_txd)); save_item(NAME(m_bus)); @@ -424,6 +426,6 @@ uint8_t kaypro_10_keyboard_device::bus_r() void kaypro_10_keyboard_device::bus_w(uint8_t data) { if (BIT(m_bus ^ data, 4)) - machine().output().set_value("led_caps_lock", BIT(data, 4)); + m_led_caps_lock = BIT(data, 4); m_bus = data; } diff --git a/src/mame/machine/kay_kbd.h b/src/mame/machine/kay_kbd.h index 0d1e53395c0..6ceea75dce4 100644 --- a/src/mame/machine/kay_kbd.h +++ b/src/mame/machine/kay_kbd.h @@ -39,6 +39,7 @@ private: required_device<speaker_sound_device> m_bell; required_ioport_array<16> m_matrix; required_ioport m_modifiers; + output_finder<> m_led_caps_lock; devcb_write_line m_rxd_cb; std::uint8_t m_txd; diff --git a/src/mame/machine/kaypro.cpp b/src/mame/machine/kaypro.cpp index dd6327e2341..7826f6fb85d 100644 --- a/src/mame/machine/kaypro.cpp +++ b/src/mame/machine/kaypro.cpp @@ -65,8 +65,8 @@ void kaypro_state::kayproii_pio_system_w(u8 data) m_floppy->ss_w(!BIT(data, 2)); // signal exists even though drives are single sided } - output().set_value("ledA", BIT(data, 0)); /* LEDs in artwork */ - output().set_value("ledB", BIT(data, 1)); + m_leds[0] = BIT(data, 0); // LEDs in artwork + m_leds[1] = BIT(data, 1); m_centronics->write_strobe(BIT(data, 4)); @@ -128,8 +128,8 @@ void kaypro_state::kaypro484_system_port_w(u8 data) m_floppy->ss_w(!BIT(data, 2)); } - output().set_value("ledA", BIT(data, 0)); /* LEDs in artwork */ - output().set_value("ledB", BIT(data, 1)); + m_leds[0] = BIT(data, 0); // LEDs in artwork + m_leds[1] = BIT(data, 1); m_centronics->write_strobe(BIT(data, 3)); @@ -223,6 +223,8 @@ void kaypro_state::machine_start() if (m_pio_s) m_pio_s->strobe_a(0); + m_leds.resolve(); + save_pointer(NAME(m_vram), 0x1000); save_pointer(NAME(m_ram), 0x4000); diff --git a/src/mame/machine/megacd.cpp b/src/mame/machine/megacd.cpp index 0fefc92c4b6..669326e95a3 100644 --- a/src/mame/machine/megacd.cpp +++ b/src/mame/machine/megacd.cpp @@ -336,6 +336,8 @@ sega_segacd_device::sega_segacd_device(const machine_config &mconfig, device_typ , m_prgram(*this, "prgram") , m_dataram(*this, "dataram") , m_font_bits(*this, "font_bits") + , m_red_led(*this, "red_led") + , m_green_led(*this, "green_led") { } @@ -1274,10 +1276,8 @@ void sega_segacd_device::segacd_sub_led_ready_w(offs_t offset, uint16_t data, ui segacd_redled = (data >> 8)&1; segacd_greenled = (data >> 9)&1; - machine().output().set_value("red_led",segacd_redled ^ 1); - machine().output().set_value("green_led",segacd_greenled ^ 1); - - //popmessage("%02x %02x",segacd_greenled,segacd_redled); + m_red_led = segacd_redled ^ 1; + m_green_led = segacd_greenled ^ 1; } } @@ -1731,6 +1731,9 @@ void sega_segacd_device::device_start() segacd_4meg_prgbank = 0; + m_red_led.resolve(); + m_green_led.resolve(); + space.unmap_readwrite (0x020000,0x3fffff); space.install_read_handler (0x0020000, 0x003ffff, read16sm_delegate(*this, FUNC(sega_segacd_device::scd_4m_prgbank_ram_r)) ); diff --git a/src/mame/machine/megacd.h b/src/mame/machine/megacd.h index f18411d82ef..1074c0405db 100644 --- a/src/mame/machine/megacd.h +++ b/src/mame/machine/megacd.h @@ -123,6 +123,9 @@ protected: required_shared_ptr<uint16_t> m_dataram; required_shared_ptr<uint16_t> m_font_bits; + output_finder<> m_red_led; + output_finder<> m_green_led; + // can't use a memshare because it's 8-bit RAM in a 16-bit address space std::vector<uint8_t> m_backupram; diff --git a/src/mame/machine/thomson.cpp b/src/mame/machine/thomson.cpp index cf8ca0fc56c..01a88fbef5e 100644 --- a/src/mame/machine/thomson.cpp +++ b/src/mame/machine/thomson.cpp @@ -245,15 +245,6 @@ void thomson_state::thom_irq_reset() -/* ------------ LED ------------ */ - - - -void thomson_state::thom_set_caps_led( int led ) -{ - output().set_value( "led0", led ); -} - /* ------------ 6850 defines ------------ */ #define ACIA_6850_RDRF 0x01 /* Receive data register full */ @@ -391,7 +382,7 @@ uint8_t thomson_state::to7_cartridge_r(offs_t offset) void thomson_state::to7_timer_port_out(uint8_t data) { thom_set_mode_point( data & 1 ); /* bit 0: video bank switch */ - thom_set_caps_led( (data & 8) ? 1 : 0 ) ; /* bit 3: keyboard led */ + m_caps_led = (data & 8) ? 1 : 0; /* bit 3: keyboard led */ thom_set_border_color( ((data & 0x10) ? 1 : 0) | /* bits 4-6: border color */ ((data & 0x20) ? 2 : 0) | ((data & 0x40) ? 4 : 0) ); @@ -1129,7 +1120,7 @@ void thomson_state::to770_sys_portb_out(uint8_t data) void thomson_state::to770_timer_port_out(uint8_t data) { thom_set_mode_point( data & 1 ); /* bit 0: video bank switch */ - thom_set_caps_led( (data & 8) ? 1 : 0 ) ; /* bit 3: keyboard led */ + m_caps_led = (data & 8) ? 1 : 0; /* bit 3: keyboard led */ thom_set_border_color( ((data & 0x10) ? 1 : 0) | /* 4-bit border color */ ((data & 0x20) ? 2 : 0) | ((data & 0x40) ? 4 : 0) | @@ -2176,7 +2167,7 @@ void thomson_state::to9_kbd_w(offs_t offset, uint8_t data) logerror( "$%04x %f to9_kbd_w: unknown kbd command %02X\n", m_maincpu->pc(), machine().time().as_double(), data ); } - thom_set_caps_led( !m_to9_kbd_caps ); + m_caps_led = !m_to9_kbd_caps; LOG(( "$%04x %f to9_kbd_w: kbd command %02X (caps=%i, pad=%i, periph=%i)\n", m_maincpu->pc(), machine().time().as_double(), data, @@ -2297,7 +2288,7 @@ int thomson_state::to9_kbd_get_key() m_to9_kbd_last_key = key; m_to9_kbd_caps = !m_to9_kbd_caps; - thom_set_caps_led( !m_to9_kbd_caps ); + m_caps_led = !m_to9_kbd_caps; return 0; } else @@ -2412,7 +2403,7 @@ void thomson_state::to9_kbd_reset() m_to9_kbd_periph = 0; m_to9_kbd_pad = 0; m_to9_kbd_byte_count = 0; - thom_set_caps_led( !m_to9_kbd_caps ); + m_caps_led = !m_to9_kbd_caps; m_to9_kbd_key_count = 0; m_to9_kbd_last_key = 0xff; to9_kbd_update_irq(); @@ -2679,7 +2670,7 @@ int thomson_state::to8_kbd_get_key() m_to8_kbd_caps = !m_to8_kbd_caps; if ( m_to8_kbd_caps ) key |= 0x080; /* auto-shift */ - thom_set_caps_led( !m_to8_kbd_caps ); + m_caps_led = !m_to8_kbd_caps; return key; } else if ( key == m_to8_kbd_last_key ) @@ -2827,7 +2818,7 @@ void thomson_state::to8_kbd_set_ack( int data ) m_to8_kbd_caps = 0; } } - thom_set_caps_led( !m_to8_kbd_caps ); + m_caps_led = !m_to8_kbd_caps; } else { @@ -2867,7 +2858,7 @@ void thomson_state::to8_kbd_reset() m_to8_kbd_data = 0; m_to8_kbd_ack = 1; m_to8_kbd_caps = 1; - thom_set_caps_led( !m_to8_kbd_caps ); + m_caps_led = !m_to8_kbd_caps; to8_kbd_timer_func(); } @@ -4141,7 +4132,7 @@ void thomson_state::mo6_sys_porta_out(uint8_t data) { thom_set_mode_point( data & 1 ); /* bit 0: video bank switch */ m_to7_game_mute = data & 4; /* bit 2: sound mute */ - thom_set_caps_led( (data & 16) ? 0 : 1 ) ; /* bit 4: keyboard led */ + m_caps_led = (data & 16) ? 0 : 1; /* bit 4: keyboard led */ mo5_set_cassette( (data & 0x40) ? 1 : 0 ); /* bit 6: cassette output */ mo6_update_cart_bank(); /* bit 5: rom bank */ to7_game_sound_update(); diff --git a/src/mame/machine/x68k_kbd.cpp b/src/mame/machine/x68k_kbd.cpp index aeec14124ca..6835e2e24b2 100644 --- a/src/mame/machine/x68k_kbd.cpp +++ b/src/mame/machine/x68k_kbd.cpp @@ -9,6 +9,13 @@ x68k_keyboard_device::x68k_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock) : buffered_rs232_device(mconfig, X68K_KEYBOARD, tag, owner, 0) , device_matrix_keyboard_interface(mconfig, *this, "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9", "LINEA", "LINEB", "LINEC", "LINED", "LINEE") + , m_led_kana(*this, "key_led_kana") + , m_led_romaji(*this, "key_led_romaji") + , m_led_code(*this, "key_led_code") + , m_led_caps(*this, "key_led_caps") + , m_led_insert(*this, "key_led_insert") + , m_led_hiragana(*this, "key_led_hiragana") + , m_led_fullsize(*this, "key_led_fullsize") { } @@ -49,13 +56,13 @@ void x68k_keyboard_device::received_byte(uint8_t data) if (data & 0x80) // LED status { - machine().output().set_value("key_led_kana", data & 0x01); - machine().output().set_value("key_led_romaji", data & 0x02); - machine().output().set_value("key_led_code", data & 0x04); - machine().output().set_value("key_led_caps", data & 0x08); - machine().output().set_value("key_led_insert", data & 0x10); - machine().output().set_value("key_led_hiragana", data & 0x20); - machine().output().set_value("key_led_fullsize", data & 0x40); + m_led_kana = BIT(data, 0); + m_led_romaji = BIT(data, 1); + m_led_code = BIT(data, 2); + m_led_caps = BIT(data, 3); + m_led_insert = BIT(data, 4); + m_led_hiragana = BIT(data, 5); + m_led_fullsize = BIT(data, 6); logerror("KB: LED status set to %02x\n", data & 0x7f); } @@ -266,6 +273,14 @@ void x68k_keyboard_device::device_start() { buffered_rs232_device::device_start(); + m_led_kana.resolve(); + m_led_romaji.resolve(); + m_led_code.resolve(); + m_led_caps.resolve(); + m_led_insert.resolve(); + m_led_hiragana.resolve(); + m_led_fullsize.resolve(); + save_item(NAME(m_delay)); save_item(NAME(m_repeat)); save_item(NAME(m_enabled)); @@ -293,6 +308,14 @@ void x68k_keyboard_device::device_reset() output_dsr(0); output_cts(0); output_rxd(1); + + m_led_kana = 1; + m_led_romaji = 1; + m_led_code = 1; + m_led_caps = 1; + m_led_insert = 1; + m_led_hiragana = 1; + m_led_fullsize = 1; } diff --git a/src/mame/machine/x68k_kbd.h b/src/mame/machine/x68k_kbd.h index e6fc09b3dbf..e0c610462c0 100644 --- a/src/mame/machine/x68k_kbd.h +++ b/src/mame/machine/x68k_kbd.h @@ -21,6 +21,14 @@ protected: private: virtual void received_byte(uint8_t data) override; + output_finder<> m_led_kana; + output_finder<> m_led_romaji; + output_finder<> m_led_code; + output_finder<> m_led_caps; + output_finder<> m_led_insert; + output_finder<> m_led_hiragana; + output_finder<> m_led_fullsize; + int m_delay; // keypress delay after initial press int m_repeat; // keypress repeat rate uint8_t m_enabled; // keyboard enabled? diff --git a/src/mame/machine/zorbakbd.cpp b/src/mame/machine/zorbakbd.cpp index b7b1d8fcead..5d965d10791 100644 --- a/src/mame/machine/zorbakbd.cpp +++ b/src/mame/machine/zorbakbd.cpp @@ -256,6 +256,8 @@ zorba_keyboard_device::zorba_keyboard_device( : device_t(mconfig, ZORBA_KEYBOARD, tag, owner, clock) , m_rows(*this, "ROW%u", 0) , m_beeper(*this, "beeper") + , m_led_key_caps_lock(*this, "led_key_caps_lock") + , m_led_key_shift_lock(*this, "led_key_shift_lock") , m_rxd_cb(*this) , m_txd_high(true) , m_row_select(0) @@ -286,8 +288,8 @@ void zorba_keyboard_device::mcu_pb_w(u8 data) // TODO: bits 2/3/4 do something; some photos show F17/F18/F19 with LED windows m_rxd_cb(BIT(data, 6) ? 0 : 1); m_beeper->set_state(BIT(data, 5) ? 0 : 1); - machine().output().set_value("led_key_caps_lock", BIT(data, 1) ? 0 : 1); - machine().output().set_value("led_key_shift_lock", BIT(data, 0) ? 0 : 1); + m_led_key_caps_lock = BIT(data, 1) ? 0 : 1; + m_led_key_shift_lock = BIT(data, 0) ? 0 : 1; } @@ -300,6 +302,8 @@ void zorba_keyboard_device::mcu_pc_w(u8 data) void zorba_keyboard_device::device_start() { m_rxd_cb.resolve_safe(); + m_led_key_caps_lock.resolve(); + m_led_key_shift_lock.resolve(); save_item(NAME(m_txd_high)); save_item(NAME(m_row_select)); diff --git a/src/mame/machine/zorbakbd.h b/src/mame/machine/zorbakbd.h index a92b0c81246..4a88735ae41 100644 --- a/src/mame/machine/zorbakbd.h +++ b/src/mame/machine/zorbakbd.h @@ -32,6 +32,8 @@ protected: required_ioport_array<16> m_rows; required_device<beep_device> m_beeper; + output_finder<> m_led_key_caps_lock; + output_finder<> m_led_key_shift_lock; devcb_write_line m_rxd_cb; bool m_txd_high; diff --git a/src/mame/video/alesis.cpp b/src/mame/video/alesis.cpp index 0e66435bf37..b5e00ccd797 100644 --- a/src/mame/video/alesis.cpp +++ b/src/mame/video/alesis.cpp @@ -47,7 +47,7 @@ void alesis_state::update_lcd_symbols(bitmap_ind16 &bitmap, uint8_t pos, uint8_t case 2: if (y == 0) { - output().set_value("pattern", state); + m_pattern = state; } else if (y < 8) { diff --git a/src/mame/video/thomson.cpp b/src/mame/video/thomson.cpp index 2af06012b67..cb1073549dd 100644 --- a/src/mame/video/thomson.cpp +++ b/src/mame/video/thomson.cpp @@ -1199,6 +1199,8 @@ VIDEO_START_MEMBER( thomson_state, thom ) save_item(NAME(m_thom_floppy_rcount)); m_floppy_led.resolve(); + m_caps_led.resolve(); + m_thom_video_timer = machine().scheduler().timer_alloc(timer_expired_delegate()); m_thom_scanline_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(thomson_state::thom_scanline_start),this)); |