(nw) output finder for marywu,mekd2,mk1,mk14,pmi80,pro80,ravens,savia84,selz80,tec1,vcs80,zapcomp

This commit is contained in:
Robbbert 2018-03-28 23:36:47 +11:00
parent 50c373be6f
commit 0ec48c3f40
13 changed files with 114 additions and 60 deletions

View File

@ -29,6 +29,7 @@ class marywu_state : public driver_device
public:
marywu_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_digits(*this, "digit%u", 0U)
{ }
DECLARE_WRITE8_MEMBER(display_7seg_data_w);
@ -43,6 +44,8 @@ public:
void program_map(address_map &map);
private:
uint8_t m_selected_7seg_module;
virtual void machine_start() override;
output_finder<32> m_digits;
};
static INPUT_PORTS_START( marywu )
@ -153,8 +156,8 @@ WRITE8_MEMBER( marywu_state::display_7seg_data_w )
{
static const uint8_t patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0, 0, 0, 0, 0, 0 }; // HEF4511BP (7 seg display driver)
output().set_digit_value(2 * m_selected_7seg_module + 0, patterns[data & 0x0F]);
output().set_digit_value(2 * m_selected_7seg_module + 1, patterns[(data >> 4) & 0x0F]);
m_digits[2 * m_selected_7seg_module + 0] = patterns[data & 0x0F];
m_digits[2 * m_selected_7seg_module + 1] = patterns[data >> 4];
}
void marywu_state::program_map(address_map &map)
@ -173,6 +176,11 @@ void marywu_state::io_map(address_map &map)
map(0xf000, 0xf000).noprw(); /* TODO: Investigate this. There's something going on at this address range. */
}
void marywu_state::machine_start()
{
m_digits.resolve();
}
MACHINE_CONFIG_START(marywu_state::marywu)
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I80C31, XTAL(10'738'635)) //actual CPU is a Winbond w78c31b-24

View File

@ -102,6 +102,7 @@ public:
, m_pia_u(*this, "pia_u")
, m_acia(*this, "acia")
, m_cass(*this, "cassette")
, m_digits(*this, "digit%u", 0U)
{ }
DECLARE_READ_LINE_MEMBER(mekd2_key40_r);
@ -124,11 +125,13 @@ private:
uint8_t m_keydata;
bool m_cass_state;
bool m_cassold;
virtual void machine_start() override;
required_device<cpu_device> m_maincpu;
required_device<pia6821_device> m_pia_s;
required_device<pia6821_device> m_pia_u;
required_device<acia6850_device> m_acia;
required_device<cassette_image_device> m_cass;
output_finder<6> m_digits;
};
@ -285,7 +288,7 @@ WRITE8_MEMBER( mekd2_state::mekd2_digit_w )
for (i = 0; i < 6; i++)
{
if (BIT(data, i))
output().set_digit_value(i, ~m_segment & 0x7f);
m_digits[i] = ~m_segment & 0x7f;
}
}
m_digit = data;
@ -359,6 +362,11 @@ TIMER_DEVICE_CALLBACK_MEMBER(mekd2_state::mekd2_p)
}
}
void mekd2_state::machine_start()
{
m_digits.resolve();
}
/***********************************************************
Machine

View File

@ -52,20 +52,24 @@ class mk1_state : public driver_device
{
public:
mk1_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag) ,
m_maincpu(*this, "maincpu") { }
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_digits(*this, "digit%u", 0U)
{ }
DECLARE_READ8_MEMBER(mk1_f8_r);
DECLARE_WRITE8_MEMBER(mk1_f8_w);
uint8_t m_f8[2];
uint8_t m_led[4];
virtual void machine_start() override;
TIMER_DEVICE_CALLBACK_MEMBER(mk1_update_leds);
F3853_INTERRUPT_REQ_CB(mk1_interrupt);
required_device<cpu_device> m_maincpu;
void mk1(machine_config &config);
void mk1_io(address_map &map);
void mk1_mem(address_map &map);
private:
uint8_t m_f8[2];
uint8_t m_led[4];
virtual void machine_start() override;
required_device<cpu_device> m_maincpu;
output_finder<4> m_digits;
};
@ -162,7 +166,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(mk1_state::mk1_update_leds)
{
for (int i = 0; i < 4; i++)
{
output().set_digit_value(i, m_led[i] >> 1);
m_digits[i] = m_led[i] >> 1;
output().set_led_value(i, m_led[i] & 0x01);
m_led[i] = 0;
}
@ -171,6 +175,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(mk1_state::mk1_update_leds)
void mk1_state::machine_start()
{
m_digits.resolve();
}

View File

@ -54,6 +54,7 @@ public:
, m_keyboard(*this, "X.%u", 0)
, m_cass(*this, "cassette")
, m_dac(*this, "dac")
, m_digits(*this, "digit%u", 0U)
{ }
DECLARE_READ8_MEMBER(keyboard_r);
@ -65,10 +66,12 @@ public:
void mem_map(address_map &map);
private:
virtual void machine_reset() override;
virtual void machine_start() override;
required_device<cpu_device> m_maincpu;
required_ioport_array<8> m_keyboard;
required_device<cassette_image_device> m_cass;
required_device<dac_bit_interface> m_dac;
output_finder<8> m_digits;
};
/*
@ -100,7 +103,7 @@ READ8_MEMBER( mk14_state::keyboard_r )
WRITE8_MEMBER( mk14_state::display_w )
{
if (offset < 8 )
output().set_digit_value(offset, data);
m_digits[offset] = data;
else
{
//logerror("write %02x to %02x\n",data,offset);
@ -191,6 +194,11 @@ void mk14_state::machine_reset()
{
}
void mk14_state::machine_start()
{
m_digits.resolve();
}
MACHINE_CONFIG_START(mk14_state::mk14)
/* basic machine hardware */
// IC1 1SP-8A/600 (8060) SC/MP Microprocessor

View File

@ -44,6 +44,7 @@ public:
: driver_device(mconfig, type, tag)
, m_ledready(0)
, m_maincpu(*this, "maincpu")
, m_digits(*this, "digit%u", 0U)
{ }
DECLARE_READ8_MEMBER(keyboard_r);
@ -56,7 +57,9 @@ private:
uint8_t m_keyrow;
bool m_ledready;
virtual void machine_reset() override;
virtual void machine_start() override;
required_device<cpu_device> m_maincpu;
output_finder<10> m_digits;
};
@ -78,7 +81,8 @@ WRITE8_MEMBER( pmi80_state::leds_w )
if (m_ledready)
{
m_ledready = false;
output().set_digit_value(m_keyrow^0xff, data^0xff);
if (m_keyrow > 0xF5) // to be sure to be sure
m_digits[m_keyrow^0xff] = data^0xff;
}
}
@ -156,6 +160,11 @@ void pmi80_state::machine_reset()
{
}
void pmi80_state::machine_start()
{
m_digits.resolve();
}
MACHINE_CONFIG_START(pmi80_state::pmi80)
/* basic machine hardware */

View File

@ -38,6 +38,7 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_cass(*this, "cassette")
, m_digits(*this, "digit%u", 0U)
{ }
DECLARE_WRITE8_MEMBER(digit_w);
@ -53,8 +54,10 @@ private:
uint8_t m_cass_in;
uint16_t m_cass_data[4];
void machine_reset() override;
virtual void machine_start() override { m_digits.resolve(); }
required_device<cpu_device> m_maincpu;
required_device<cassette_image_device> m_cass;
output_finder<6> m_digits;
};
// This can read the first few bytes correctly, but after that bit slippage occurs.
@ -87,12 +90,12 @@ WRITE8_MEMBER( pro80_state::segment_w )
{
if (m_digit_sel)
{
if (!BIT(m_digit_sel, 0)) output().set_digit_value(0, data);
if (!BIT(m_digit_sel, 1)) output().set_digit_value(1, data);
if (!BIT(m_digit_sel, 2)) output().set_digit_value(2, data);
if (!BIT(m_digit_sel, 3)) output().set_digit_value(3, data);
if (!BIT(m_digit_sel, 4)) output().set_digit_value(4, data);
if (!BIT(m_digit_sel, 5)) output().set_digit_value(5, data);
if (!BIT(m_digit_sel, 0)) m_digits[0] = data;
if (!BIT(m_digit_sel, 1)) m_digits[1] = data;
if (!BIT(m_digit_sel, 2)) m_digits[2] = data;
if (!BIT(m_digit_sel, 3)) m_digits[3] = data;
if (!BIT(m_digit_sel, 4)) m_digits[4] = data;
if (!BIT(m_digit_sel, 5)) m_digits[5] = data;
m_digit_sel = 0;
}

View File

@ -89,6 +89,7 @@ public:
, m_maincpu(*this, "maincpu")
, m_terminal(*this, "terminal")
, m_cass(*this, "cassette")
, m_digits(*this, "digit%u", 0U)
{ }
DECLARE_READ8_MEMBER(port07_r);
@ -111,9 +112,11 @@ public:
private:
uint8_t m_term_char;
uint8_t m_term_data;
virtual void machine_start() override { m_digits.resolve(); }
required_device<cpu_device> m_maincpu;
optional_device<generic_terminal_device> m_terminal;
required_device<cassette_image_device> m_cass;
output_finder<7> m_digits;
};
WRITE_LINE_MEMBER( ravens_state::cass_w )
@ -128,7 +131,7 @@ READ_LINE_MEMBER( ravens_state::cass_r )
WRITE8_MEMBER( ravens_state::display_w )
{
output().set_digit_value(offset, data);
m_digits[offset] = data;
}
WRITE8_MEMBER( ravens_state::leds_w )
@ -202,7 +205,7 @@ WRITE8_MEMBER( ravens_state::port1c_w )
MACHINE_RESET_MEMBER( ravens_state, ravens2 )
{
m_term_data = 0x80;
output().set_digit_value(6, 0);
m_digits[6] = 0;
}

View File

@ -41,6 +41,7 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_ppi8255(*this, "ppi8255")
, m_digits(*this, "digit%u", 0U)
{ }
DECLARE_READ8_MEMBER(savia84_8255_portc_r);
@ -57,8 +58,10 @@ private:
uint8_t m_digit;
uint8_t m_digit_last;
virtual void machine_reset() override;
virtual void machine_start() override { m_digits.resolve(); }
required_device<cpu_device> m_maincpu;
required_device<i8255_device> m_ppi8255;
output_finder<9> m_digits;
};
void savia84_state::mem_map(address_map &map)
@ -138,7 +141,8 @@ void savia84_state::machine_reset()
WRITE8_MEMBER( savia84_state::savia84_8255_porta_w ) // OUT F8 - output segments on the selected digit
{
m_segment = ~data & 0x7f;
if (m_digit && (m_digit != m_digit_last)) output().set_digit_value(m_digit, m_segment);
if (m_digit && (m_digit != m_digit_last))
m_digits[m_digit] = m_segment;
m_digit_last = m_digit;
}

View File

@ -47,6 +47,7 @@ public:
, m_p_ram(*this, "ram")
, m_keyboard(*this, "X%u", 0)
, m_clock(*this, "uart_clock")
, m_digits(*this, "digit%u", 0U)
{ }
DECLARE_WRITE8_MEMBER(scanlines_w);
@ -67,6 +68,8 @@ private:
optional_shared_ptr<uint8_t> m_p_ram;
required_ioport_array<4> m_keyboard;
required_device<clock_device> m_clock;
output_finder<8> m_digits;
virtual void machine_start() override;
};
void selz80_state::dagz80_mem(address_map &map)
@ -193,7 +196,7 @@ WRITE8_MEMBER( selz80_state::scanlines_w )
WRITE8_MEMBER( selz80_state::digit_w )
{
output().set_digit_value(m_digit, bitswap<8>(data, 3, 2, 1, 0, 7, 6, 5, 4));
m_digits[m_digit] = bitswap<8>(data, 3, 2, 1, 0, 7, 6, 5, 4);
}
READ8_MEMBER( selz80_state::kbd_r )
@ -206,6 +209,11 @@ READ8_MEMBER( selz80_state::kbd_r )
return data;
}
void selz80_state::machine_start()
{
m_digits.resolve();
}
MACHINE_CONFIG_START(selz80_state::selz80)
/* basic machine hardware */
MCFG_CPU_ADD("maincpu",Z80, XTAL(4'000'000)) // it's actually a 5MHz XTAL with a NEC uPD780C-1 cpu

View File

@ -85,17 +85,18 @@ class tec1_state : public driver_device
{
public:
tec1_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_speaker(*this, "speaker"),
m_cass(*this, "cassette"),
m_wave(*this, WAVE_TAG),
m_key_pressed(0),
m_io_line0(*this, "LINE0"),
m_io_line1(*this, "LINE1"),
m_io_line2(*this, "LINE2"),
m_io_line3(*this, "LINE3"),
m_io_shift(*this, "SHIFT")
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_speaker(*this, "speaker")
, m_cass(*this, "cassette")
, m_wave(*this, WAVE_TAG)
, m_key_pressed(0)
, m_io_line0(*this, "LINE0")
, m_io_line1(*this, "LINE1")
, m_io_line2(*this, "LINE2")
, m_io_line3(*this, "LINE3")
, m_io_shift(*this, "SHIFT")
, m_digits(*this, "digit%u", 0U)
{ }
required_device<cpu_device> m_maincpu;
@ -108,6 +109,7 @@ public:
required_ioport m_io_line2;
required_ioport m_io_line3;
required_ioport m_io_shift;
output_finder<6> m_digits;
emu_timer *m_kbd_timer;
DECLARE_READ8_MEMBER( tec1_kbd_r );
DECLARE_READ8_MEMBER( latch_r );
@ -241,12 +243,12 @@ TIMER_CALLBACK_MEMBER(tec1_state::tec1_kbd_callback)
if (BIT(m_digit, i))
{
m_refresh[i] = 1;
output().set_digit_value(i, m_segment);
m_digits[i] = m_segment;
}
else
if (m_refresh[i] == 0x80)
{
output().set_digit_value(i, 0);
m_digits[i] = 0;
m_refresh[i] = 0;
}
else
@ -310,6 +312,7 @@ TIMER_CALLBACK_MEMBER(tec1_state::tec1_kbd_callback)
void tec1_state::machine_start()
{
m_digits.resolve();
m_kbd_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tec1_state::tec1_kbd_callback),this));
m_kbd_timer->adjust( attotime::zero, 0, attotime::from_hz(500) );
}

View File

@ -181,13 +181,12 @@ WRITE8_MEMBER( vcs80_state::pio_pb_w )
*/
uint8_t led_data = bitswap<8>(data & 0x7f, 7, 5, 6, 4, 3, 2, 1, 0);
int digit = m_keylatch;
/* skip middle digit */
if (digit > 3) digit++;
output().set_digit_value(8 - digit, led_data);
m_digits[8 - digit] = bitswap<8>(data & 0x7f, 7, 5, 6, 4, 3, 2, 1, 0);
}
/* Z80 Daisy Chain */
@ -202,6 +201,8 @@ static const z80_daisy_config vcs80_daisy_chain[] =
void vcs80_state::machine_start()
{
m_digits.resolve();
m_pio->strobe_a(1);
m_pio->strobe_b(1);

View File

@ -37,6 +37,7 @@ public:
zapcomp_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_digits(*this, "digit%u", 0U)
{ }
DECLARE_READ8_MEMBER(keyboard_r);
@ -49,6 +50,7 @@ private:
uint8_t decode7seg(uint8_t data);
virtual void machine_start() override;
required_device<cpu_device> m_maincpu;
output_finder<6> m_digits;
};
uint8_t zapcomp_state::decode7seg(uint8_t data)
@ -71,22 +73,11 @@ uint8_t zapcomp_state::decode7seg(uint8_t data)
WRITE8_MEMBER( zapcomp_state::display_7seg_w )
{
switch (offset){
case 0: //Port 0x05 : address HI
output().set_digit_value(0, decode7seg(data >> 4));
output().set_digit_value(1, decode7seg(data));
break;
case 1: //Port 0x06 : address LOW
output().set_digit_value(2, decode7seg(data >> 4));
output().set_digit_value(3, decode7seg(data));
break;
case 2: //Port 0x07 : data
output().set_digit_value(4, decode7seg(data >> 4));
output().set_digit_value(5, decode7seg(data));
break;
default:
break;
}
//Port 0x05 : address HI
//Port 0x06 : address LOW
//Port 0x07 : data
m_digits[offset*2] = decode7seg(data >> 4);
m_digits[offset*2+1] = decode7seg(data);
}
READ8_MEMBER( zapcomp_state::keyboard_r )
@ -159,6 +150,7 @@ INPUT_PORTS_END
void zapcomp_state::machine_start()
{
m_digits.resolve();
}
MACHINE_CONFIG_START(zapcomp_state::zapcomp)

View File

@ -21,13 +21,14 @@ class vcs80_state : public driver_device
{
public:
vcs80_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, Z80_TAG),
m_pio(*this, Z80PIO_TAG),
m_y0(*this, "Y0"),
m_y1(*this, "Y1"),
m_y2(*this, "Y2"),
m_bdmem(*this, "bdmem")
: driver_device(mconfig, type, tag)
, m_maincpu(*this, Z80_TAG)
, m_pio(*this, Z80PIO_TAG)
, m_y0(*this, "Y0")
, m_y1(*this, "Y1")
, m_y2(*this, "Y2")
, m_bdmem(*this, "bdmem")
, m_digits(*this, "digit%u", 0U)
{ }
required_device<cpu_device> m_maincpu;
@ -36,6 +37,7 @@ public:
required_ioport m_y1;
required_ioport m_y2;
required_device<address_map_bank_device> m_bdmem;
output_finder<9> m_digits;
virtual void machine_start() override;