From 17c5c96c6dd1a418389f56b2c6d68be3350b4db1 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Sat, 11 May 2019 03:09:14 +1000 Subject: (nw) eti660 : cleanup --- src/devices/sound/cdp1864.cpp | 5 +- src/mame/drivers/eti660.cpp | 111 ++++++++++++++++++------------------------ src/mame/includes/eti660.h | 4 +- 3 files changed, 50 insertions(+), 70 deletions(-) diff --git a/src/devices/sound/cdp1864.cpp b/src/devices/sound/cdp1864.cpp index de39b3390c8..97df1a0aad2 100644 --- a/src/devices/sound/cdp1864.cpp +++ b/src/devices/sound/cdp1864.cpp @@ -391,10 +391,7 @@ WRITE8_MEMBER( cdp1864_device::dma_w ) WRITE_LINE_MEMBER( cdp1864_device::con_w ) { - if (!state) - { - m_con = 0; - } + m_con = state; } diff --git a/src/mame/drivers/eti660.cpp b/src/mame/drivers/eti660.cpp index 0aae8a216db..4d5f9cafeeb 100644 --- a/src/mame/drivers/eti660.cpp +++ b/src/mame/drivers/eti660.cpp @@ -27,12 +27,11 @@ TODO: - sometimes there's no sound when started. You may need to hard reset until it beeps. - - don't know why, but the expected behaviour of our 6821 pia isn't what this machine - expects, so had to add a couple of hacks. - doesn't run programs for other chip-8 computers (this might be normal?) - we support BIN files, but have none to test with. - - in Invaders, can't shoot them - - in Maze, the result is rubbish (works in Emma02 emulator) + - probable CPU bugs: + - in Invaders, can't shoot them + - in Maze, the result is rubbish (these work in Emma02 emulator) **************************************************************************************************/ @@ -43,30 +42,30 @@ /* Read/Write Handlers */ - +// Schematic is wrong, PCB layout is correct: D0-7 swapped around on PIA. +// There's still a bug in the PIA: if ca2 is instructed to go low, nothing happens. READ8_MEMBER( eti660_state::pia_r ) { uint8_t pia_offset = m_maincpu->get_memory_address() & 0x03; - return m_pia->read(pia_offset); + return bitswap<8>(m_pia->read(pia_offset), 0,1,2,3,4,5,6,7); } WRITE8_MEMBER( eti660_state::pia_w ) { uint8_t pia_offset = m_maincpu->get_memory_address() & 0x03; + data = bitswap<8>(data,0,1,2,3,4,5,6,7); + m_pia->write(pia_offset, data); - // Some PIA hacks here, as mentioned in the ToDo. - if (pia_offset == 1) - { - // switch color on when requested (test with Wipeout game) - if (data == 0x2c) - m_color_on = 1; - // enable keyboard - if (data == 0x20) - data = 0x24; - } + // handle bug in PIA + if ((pia_offset == 1) && ((data & 0x30) == 0x30)) + ca2_w(BIT(data, 3)); +} - m_pia->write(pia_offset, data); +WRITE_LINE_MEMBER( eti660_state::ca2_w ) // test with Wipeout game - it should start up in colour +{ + m_color_on = !state; + m_cti->con_w(state); } WRITE8_MEMBER( eti660_state::colorram_w ) @@ -101,55 +100,38 @@ void eti660_state::io_map(address_map &map) /* Input Ports */ static INPUT_PORTS_START( eti660 ) PORT_START("KEY.0") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("KEY.1") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("KEY.2") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("KEY.3") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("SPECIAL") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("RESET") PORT_CODE(KEYCODE_R) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("STEP") PORT_CODE(KEYCODE_S) INPUT_PORTS_END -/* Video */ - -READ_LINE_MEMBER( eti660_state::rdata_r ) -{ - return BIT(m_color, 0); -} - -READ_LINE_MEMBER( eti660_state::bdata_r ) -{ - return BIT(m_color, 1); -} - -READ_LINE_MEMBER( eti660_state::gdata_r ) -{ - return BIT(m_color, 2); -} - /* CDP1802 Interface */ READ_LINE_MEMBER( eti660_state::clear_r ) @@ -158,7 +140,7 @@ READ_LINE_MEMBER( eti660_state::clear_r ) // boot, like the real one does. if (m_resetcnt < 0xffff) m_resetcnt++; - if (m_resetcnt == 0xff00) + if (m_resetcnt == 0xf000) return 0; return BIT(m_special->read(), 0); // R key } @@ -201,7 +183,6 @@ WRITE8_MEMBER( eti660_state::dma_w ) else m_color = m_p_videoram[offset] ? 7 : 0; - m_cti->con_w(0); // HACK m_cti->dma_w(space, offset, data); } @@ -250,16 +231,15 @@ WRITE8_MEMBER( eti660_state::pia_pa_w ) */ - m_keylatch = data ^ 0xff; + m_keylatch = bitswap<8>(data,0,1,2,3,4,5,6,7) ^ 0xff; } void eti660_state::machine_reset() { m_resetcnt = 0; m_color_on = 0; - // fix for F3 soft reboot - m_maincpu->set_state_int(cosmac_device::COSMAC_R0, 0); // set R0 to start of rom - m_maincpu->set_state_int(cosmac_device::COSMAC_P, 0); // set R0 as the PC register + m_cti->con_w(0); + m_maincpu->reset(); // needed } void eti660_state::machine_start() @@ -267,6 +247,10 @@ void eti660_state::machine_start() m_leds.resolve(); save_item(NAME(m_color_ram)); + save_item(NAME(m_color)); + save_item(NAME(m_color_on)); + save_item(NAME(m_keylatch)); + save_item(NAME(m_resetcnt)); } QUICKLOAD_LOAD_MEMBER( eti660_state, eti660 ) @@ -329,9 +313,9 @@ MACHINE_CONFIG_START(eti660_state::eti660) m_cti->int_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT); m_cti->dma_out_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_DMAOUT); m_cti->efx_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_EF1); - m_cti->rdata_cb().set(FUNC(eti660_state::rdata_r)); - m_cti->bdata_cb().set(FUNC(eti660_state::bdata_r)); - m_cti->gdata_cb().set(FUNC(eti660_state::gdata_r)); + m_cti->rdata_cb().set([this] () { return BIT(m_color, 0); }); + m_cti->bdata_cb().set([this] () { return BIT(m_color, 1); }); + m_cti->gdata_cb().set([this] () { return BIT(m_color, 2); }); m_cti->set_chrominance(RES_K(2.2), RES_K(1), RES_K(4.7), RES_K(4.7)); // R7, R5, R6, R4 m_cti->add_route(ALL_OUTPUTS, "mono", 0.25); @@ -339,6 +323,7 @@ MACHINE_CONFIG_START(eti660_state::eti660) PIA6821(config, m_pia, 0); m_pia->readpa_handler().set(FUNC(eti660_state::pia_pa_r)); m_pia->writepa_handler().set(FUNC(eti660_state::pia_pa_w)); + m_pia->ca2_handler().set(FUNC(eti660_state::ca2_w)); // not working, bug in pia m_pia->irqa_handler().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT).invert(); // FIXME: use an input merger for these lines m_pia->irqb_handler().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT).invert(); diff --git a/src/mame/includes/eti660.h b/src/mame/includes/eti660.h index 8453837e35d..c2040fbe500 100644 --- a/src/mame/includes/eti660.h +++ b/src/mame/includes/eti660.h @@ -45,13 +45,11 @@ private: DECLARE_READ8_MEMBER( pia_r ); DECLARE_WRITE8_MEMBER( pia_w ); DECLARE_WRITE8_MEMBER( colorram_w ); - DECLARE_READ_LINE_MEMBER( rdata_r ); - DECLARE_READ_LINE_MEMBER( bdata_r ); - DECLARE_READ_LINE_MEMBER( gdata_r ); DECLARE_READ_LINE_MEMBER( clear_r ); DECLARE_READ_LINE_MEMBER( ef2_r ); DECLARE_READ_LINE_MEMBER( ef4_r ); DECLARE_WRITE_LINE_MEMBER( q_w ); + DECLARE_WRITE_LINE_MEMBER( ca2_w ); DECLARE_WRITE8_MEMBER( dma_w ); DECLARE_READ8_MEMBER( pia_pa_r ); DECLARE_WRITE8_MEMBER( pia_pa_w ); -- cgit v1.2.3