Numerous drivers: Modernization and runtime tag lookup elimination

* Substitute output finders for output().set_value
* Use more array finders, particularly for keyboard ports
This commit is contained in:
AJR 2020-10-18 15:36:37 -04:00
parent 911515af31
commit 5add317669
53 changed files with 943 additions and 593 deletions

View File

@ -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

View File

@ -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();

View File

@ -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));
}

View File

@ -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()

View File

@ -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));

View File

@ -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));

View File

@ -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;

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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)

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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));

View File

@ -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);

View File

@ -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();

View File

@ -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;

View File

@ -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();

View File

@ -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");

View File

@ -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));

View File

@ -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;
}

View File

@ -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)

View File

@ -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 */

View File

@ -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);

View File

@ -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));

View File

@ -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;
}

View File

@ -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);
}
/*

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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();

View File

@ -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)

View File

@ -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)
{

View File

@ -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();

View File

@ -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));

View File

@ -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;
}

View File

@ -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;

View File

@ -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);

View File

@ -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)) );

View File

@ -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;

View File

@ -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();

View File

@ -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;
}

View File

@ -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?

View File

@ -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));

View File

@ -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;

View File

@ -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)
{

View File

@ -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));