mey8088.cpp: output_finder (nw)

This commit is contained in:
Ivan Vangelista 2018-05-12 09:14:17 +02:00
parent ff3481e806
commit eaffd4b5a4

View File

@ -44,14 +44,23 @@ public:
m_maincpu(*this,"maincpu"),
m_vram(*this, "vram"),
m_heartbeat(*this, "heartbeat"),
m_switches(*this, {"C0", "C1", "C2", "C3"})
m_switches(*this, {"C0", "C1", "C2", "C3"}),
m_lamps(*this, "lamp%u", 0U)
{ }
void meyc8088(machine_config &config);
protected:
virtual void machine_start() override;
private:
required_device<cpu_device> m_maincpu;
required_shared_ptr<uint8_t> m_vram;
required_device<timer_device> m_heartbeat;
optional_ioport_array<4> m_switches;
required_ioport_array<4> m_switches;
output_finder<16> m_lamps;
uint8_t m_status;
uint8_t m_common;
@ -61,17 +70,16 @@ public:
DECLARE_READ8_MEMBER(video5_flip_r);
DECLARE_WRITE8_MEMBER(screen_flip_w);
DECLARE_READ8_MEMBER(screen_flip_r);
DECLARE_READ8_MEMBER(meyc8088_input_r);
DECLARE_READ8_MEMBER(meyc8088_status_r);
DECLARE_WRITE8_MEMBER(meyc8088_lights1_w);
DECLARE_WRITE8_MEMBER(meyc8088_lights2_w);
DECLARE_WRITE8_MEMBER(meyc8088_common_w);
DECLARE_READ8_MEMBER(input_r);
DECLARE_READ8_MEMBER(status_r);
DECLARE_WRITE8_MEMBER(lights1_w);
DECLARE_WRITE8_MEMBER(lights2_w);
DECLARE_WRITE8_MEMBER(common_w);
DECLARE_PALETTE_INIT(meyc8088);
uint32_t screen_update_meyc8088(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank_meyc8088);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank);
TIMER_DEVICE_CALLBACK_MEMBER(heartbeat_callback);
void meyc8088(machine_config &config);
void meyc8088_map(address_map &map);
};
@ -131,7 +139,7 @@ PALETTE_INIT_MEMBER(meyc8088_state, meyc8088)
palette.set_pen_colors(0, rgb);
}
uint32_t meyc8088_state::screen_update_meyc8088(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
uint32_t meyc8088_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t v[5];
v[4] = m_status << 2 & 0x10; // video5: color prom d4
@ -160,7 +168,7 @@ uint32_t meyc8088_state::screen_update_meyc8088(screen_device &screen, bitmap_in
return 0;
}
WRITE_LINE_MEMBER(meyc8088_state::screen_vblank_meyc8088)
WRITE_LINE_MEMBER(meyc8088_state::screen_vblank)
{
// LC255(200ns pulse) rising edge asserts INTR at start and end of vblank
// INTA wired back to INTR to clear it, vector is hardwired to $20
@ -231,7 +239,7 @@ void meyc8088_state::meyc8088_map(address_map &map)
}
READ8_MEMBER(meyc8088_state::meyc8088_input_r)
READ8_MEMBER(meyc8088_state::input_r)
{
uint8_t ret = 0xff;
@ -244,7 +252,7 @@ READ8_MEMBER(meyc8088_state::meyc8088_input_r)
return ret;
}
READ8_MEMBER(meyc8088_state::meyc8088_status_r)
READ8_MEMBER(meyc8088_state::status_r)
{
// d0: /CR2
// d1: screen on
@ -256,21 +264,21 @@ READ8_MEMBER(meyc8088_state::meyc8088_status_r)
}
WRITE8_MEMBER(meyc8088_state::meyc8088_lights1_w)
WRITE8_MEMBER(meyc8088_state::lights1_w)
{
// lite 1-8
for (int i = 0; i < 8; i++)
output().set_lamp_value(i, ~data >> i & 1);
m_lamps[i] = BIT(~data, i);
}
WRITE8_MEMBER(meyc8088_state::meyc8088_lights2_w)
WRITE8_MEMBER(meyc8088_state::lights2_w)
{
// lite 9-16
for (int i = 0; i < 8; i++)
output().set_lamp_value(i + 8, ~data >> i & 1);
m_lamps[i + 8] = BIT(~data, i);
}
WRITE8_MEMBER(meyc8088_state::meyc8088_common_w)
WRITE8_MEMBER(meyc8088_state::common_w)
{
// d0: /CR2
m_status = (m_status & ~1) | (data & 1);
@ -282,6 +290,14 @@ WRITE8_MEMBER(meyc8088_state::meyc8088_common_w)
m_common = data >> 2 & 0xf;
}
void meyc8088_state::machine_start()
{
m_lamps.resolve();
save_item(NAME(m_status));
save_item(NAME(m_common));
}
/***************************************************************************
@ -350,21 +366,21 @@ INPUT_PORTS_END
MACHINE_CONFIG_START(meyc8088_state::meyc8088)
/* basic machine hardware */
MCFG_DEVICE_ADD("maincpu", I8088, (XTAL(15'000'000) / 3) * 0.95) // NOTE: underclocked to prevent errors on diagnostics, MAME i8088 cycle timing is probably inaccurate
MCFG_DEVICE_ADD(m_maincpu, I8088, (XTAL(15'000'000) / 3) * 0.95) // NOTE: underclocked to prevent errors on diagnostics, MAME i8088 cycle timing is probably inaccurate
MCFG_DEVICE_PROGRAM_MAP(meyc8088_map)
MCFG_DEVICE_ADD("i8155_1", I8155, XTAL(15'000'000) / (3*1))
// all ports set to input
MCFG_I8155_IN_PORTA_CB(READ8(*this, meyc8088_state, meyc8088_input_r))
MCFG_I8155_IN_PORTA_CB(READ8(*this, meyc8088_state, input_r))
MCFG_I8155_IN_PORTB_CB(IOPORT("SW"))
MCFG_I8155_IN_PORTC_CB(READ8(*this, meyc8088_state, meyc8088_status_r))
MCFG_I8155_IN_PORTC_CB(READ8(*this, meyc8088_state, status_r))
// i8251A trigger txc/rxc (debug related, unpopulated on sold boards)
MCFG_DEVICE_ADD("i8155_2", I8155, XTAL(15'000'000) / (3*32))
// all ports set to output
MCFG_I8155_OUT_PORTA_CB(WRITE8(*this, meyc8088_state, meyc8088_lights2_w))
MCFG_I8155_OUT_PORTB_CB(WRITE8(*this, meyc8088_state, meyc8088_lights1_w))
MCFG_I8155_OUT_PORTC_CB(WRITE8(*this, meyc8088_state, meyc8088_common_w))
MCFG_I8155_OUT_PORTA_CB(WRITE8(*this, meyc8088_state, lights2_w))
MCFG_I8155_OUT_PORTB_CB(WRITE8(*this, meyc8088_state, lights1_w))
MCFG_I8155_OUT_PORTC_CB(WRITE8(*this, meyc8088_state, common_w))
MCFG_I8155_OUT_TIMEROUT_CB(WRITELINE("dac", dac_bit_interface, write))
MCFG_NVRAM_ADD_0FILL("nvram")
@ -374,8 +390,8 @@ MACHINE_CONFIG_START(meyc8088_state::meyc8088)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL(15'000'000)/3, 320, 0, 256, 261, 0, 224)
MCFG_SCREEN_UPDATE_DRIVER(meyc8088_state, screen_update_meyc8088)
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, meyc8088_state, screen_vblank_meyc8088))
MCFG_SCREEN_UPDATE_DRIVER(meyc8088_state, screen_update)
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, meyc8088_state, screen_vblank))
MCFG_SCREEN_PALETTE("palette")
MCFG_PALETTE_ADD("palette", 32)
@ -401,4 +417,4 @@ ROM_START( gldarrow )
ROM_END
GAMEL(1984, gldarrow, 0, meyc8088, gldarrow, meyc8088_state, 0, ROT0, "Meyco Games, Inc.", "Golden Arrow (Standard G8-03)", 0, layout_gldarrow )
GAMEL(1984, gldarrow, 0, meyc8088, gldarrow, meyc8088_state, 0, ROT0, "Meyco Games, Inc.", "Golden Arrow (Standard G8-03)", MACHINE_SUPPORTS_SAVE, layout_gldarrow )