From fb6ea70527283043eed238293fabe5db3878aa6a Mon Sep 17 00:00:00 2001 From: AJR Date: Wed, 11 Jul 2018 20:56:45 -0400 Subject: swyft: Add HCT259 latch; add interrupt; use logmacro.h; misc. cleanup (nw) --- src/mame/drivers/swyft.cpp | 151 ++++++++++++++++++++++----------------------- 1 file changed, 75 insertions(+), 76 deletions(-) diff --git a/src/mame/drivers/swyft.cpp b/src/mame/drivers/swyft.cpp index 50a790ad4f3..cb0a0dc1fb5 100644 --- a/src/mame/drivers/swyft.cpp +++ b/src/mame/drivers/swyft.cpp @@ -257,9 +257,11 @@ ToDo: #include "emu.h" #include "bus/centronics/ctronics.h" #include "cpu/m68000/m68000.h" +#include "machine/74259.h" #include "machine/6522via.h" #include "machine/6850acia.h" #include "machine/clock.h" +#include "machine/input_merger.h" #include "sound/spkrdev.h" #include "emupal.h" #include "screen.h" @@ -292,8 +294,11 @@ ToDo: #undef DEBUG_TEST_W -#define DEBUG_SWYFT_VIA0 1 -#define DEBUG_SWYFT_VIA1 1 +#define LOG_VIA0 (1 << 1U) +#define LOG_VIA1 (1 << 2U) + +//#define VERBOSE (LOG_VIA0 | LOG_VIA1) +#include "logmacro.h" class swyft_state : public driver_device @@ -305,8 +310,8 @@ public: m_ctx(*this, "ctx"), m_ctx_data_out(*this, "ctx_data_out"), m_acia6850(*this, "acia6850"), - m_via0(*this, "via6522_0"), - m_via1(*this, "via6522_1"), + m_via(*this, "via6522_%u", 0U), + m_bitlatch(*this, "bitlatch"), m_speaker(*this, "speaker"), m_p_swyft_videoram(*this, "p_swyft_vram") /*m_y0(*this, "Y0"), @@ -325,9 +330,9 @@ private: required_device m_maincpu; optional_device m_ctx; optional_device m_ctx_data_out; - required_device m_acia6850; // only swyft uses this - required_device m_via0; // only swyft uses this - required_device m_via1; // only swyft uses this + required_device m_acia6850; + required_device_array m_via; + required_device m_bitlatch; optional_device m_speaker; required_shared_ptr m_p_swyft_videoram; /*optional_ioport m_y0; @@ -345,7 +350,8 @@ private: uint32_t screen_update_swyft(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - DECLARE_READ8_MEMBER(swyft_d0000); + DECLARE_READ8_MEMBER(bitlatch_r); + template DECLARE_WRITE_LINE_MEMBER(bitlatch_q_w); DECLARE_READ8_MEMBER(swyft_via0_r); DECLARE_WRITE8_MEMBER(swyft_via0_w); @@ -356,7 +362,6 @@ private: DECLARE_WRITE8_MEMBER(via0_pb_w); DECLARE_WRITE_LINE_MEMBER(via0_cb1_w); DECLARE_WRITE_LINE_MEMBER(via0_cb2_w); - DECLARE_WRITE_LINE_MEMBER(via0_int_w); DECLARE_READ8_MEMBER(swyft_via1_r); DECLARE_WRITE8_MEMBER(swyft_via1_w); @@ -367,7 +372,6 @@ private: DECLARE_WRITE8_MEMBER(via1_pb_w); DECLARE_WRITE_LINE_MEMBER(via1_cb1_w); DECLARE_WRITE_LINE_MEMBER(via1_cb2_w); - DECLARE_WRITE_LINE_MEMBER(via1_int_w); DECLARE_WRITE_LINE_MEMBER(write_acia_clock); @@ -567,23 +571,21 @@ void swyft_state::swyft_mem(address_map &map) map.global_mask(0xfffff); map(0x000000, 0x00ffff).rom(); // 64 KB ROM map(0x040000, 0x07ffff).ram().share("p_swyft_vram"); // 256 KB RAM - map(0x0d0000, 0x0d000f).r(FUNC(swyft_state::swyft_d0000)); // status of something? reads from d0000, d0004, d0008, d000a, d000e - map(0x0e1000, 0x0e1000).w(m_acia6850, FUNC(acia6850_device::control_w)); // 6850 ACIA lives here + map(0x0d0000, 0x0d000f).r(FUNC(swyft_state::bitlatch_r)).w("bitlatch", FUNC(hct259_device::write_a0)); + map(0x0e1000, 0x0e1001).rw(m_acia6850, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); map(0x0e2000, 0x0e2fff).rw(FUNC(swyft_state::swyft_via0_r), FUNC(swyft_state::swyft_via0_w)); // io area with selector on a9 a8 a7 a6? map(0x0e4000, 0x0e4fff).rw(FUNC(swyft_state::swyft_via1_r), FUNC(swyft_state::swyft_via1_w)); } MACHINE_START_MEMBER(swyft_state,swyft) { - m_via0->write_ca1(1); - m_via0->write_ca2(1); - m_via0->write_cb1(1); - m_via0->write_cb2(1); - - m_via1->write_ca1(1); - m_via1->write_ca2(1); - m_via1->write_cb1(1); - m_via1->write_cb2(1); + for (auto &via : m_via) + { + via->write_ca1(1); + via->write_ca2(1); + via->write_cb1(1); + via->write_cb2(1); + } } MACHINE_RESET_MEMBER(swyft_state,swyft) @@ -615,12 +617,17 @@ uint32_t swyft_state::screen_update_swyft(screen_device &screen, bitmap_ind16 &b return 0; } -READ8_MEMBER( swyft_state::swyft_d0000 ) +template +WRITE_LINE_MEMBER(swyft_state::bitlatch_q_w) +{ + logerror("74HCT259: Q%d %s\n", B, state ? "on" : "off"); +} + +READ8_MEMBER(swyft_state::bitlatch_r) { - // wtf is this supposed to be? - uint8_t byte = 0xFF; // ? - logerror("mystery device: read from 0x%5X, returning %02X\n", offset+0xD0000, byte); - return byte; + if (!machine().side_effects_disabled()) + m_bitlatch->write_bit(offset >> 1, BIT(offset, 0)); + return 0xff; } @@ -634,126 +641,108 @@ static const char *const swyft_via_regnames[] = { "0: ORB/IRB", "1: ORA/IRA", "2 READ8_MEMBER( swyft_state::swyft_via0_r ) { - if (offset&0x000C3F) fprintf(stderr,"VIA0: read from invalid offset in 68k space: %06X!\n", offset); - uint8_t data = m_via0->read(space, (offset>>6)&0xF); -#ifdef DEBUG_SWYFT_VIA0 - logerror("VIA0 register %s read by cpu: returning %02x\n", swyft_via_regnames[(offset>>5)&0xF], data); -#endif + if (offset&0x000C3F) logerror("VIA0: read from invalid offset in 68k space: %06X!\n", offset); + uint8_t data = m_via[0]->read(space, (offset>>6)&0xF); + LOGMASKED(LOG_VIA0, "VIA0 register %s read by cpu: returning %02x\n", swyft_via_regnames[(offset>>5)&0xF], data); return data; } WRITE8_MEMBER( swyft_state::swyft_via0_w ) { -#ifdef DEBUG_SWYFT_VIA0 - logerror("VIA0 register %s written by cpu with data %02x\n", swyft_via_regnames[(offset>>5)&0xF], data); -#endif - if (offset&0x000C3F) fprintf(stderr,"VIA0: write to invalid offset in 68k space: %06X, data: %02X!\n", offset, data); - m_via1->write(space, (offset>>6)&0xF, data); + LOGMASKED(LOG_VIA0, "VIA0 register %s written by cpu with data %02x\n", swyft_via_regnames[(offset>>5)&0xF], data); + if (offset&0x000C3F) logerror("VIA0: write to invalid offset in 68k space: %06X, data: %02X!\n", offset, data); + m_via[1]->write(space, (offset>>6)&0xF, data); } READ8_MEMBER( swyft_state::swyft_via1_r ) { - if (offset&0x000C3F) fprintf(stderr," VIA1: read from invalid offset in 68k space: %06X!\n", offset); - uint8_t data = m_via1->read(space, (offset>>6)&0xF); -#ifdef DEBUG_SWYFT_VIA1 - logerror(" VIA1 register %s read by cpu: returning %02x\n", swyft_via_regnames[(offset>>5)&0xF], data); -#endif + if (offset&0x000C3F) logerror("VIA1: read from invalid offset in 68k space: %06X!\n", offset); + uint8_t data = m_via[1]->read(space, (offset>>6)&0xF); + LOGMASKED(LOG_VIA1, "VIA1 register %s read by cpu: returning %02x\n", swyft_via_regnames[(offset>>5)&0xF], data); return data; } WRITE8_MEMBER( swyft_state::swyft_via1_w ) { -#ifdef DEBUG_SWYFT_VIA1 - logerror(" VIA1 register %s written by cpu with data %02x\n", swyft_via_regnames[(offset>>5)&0xF], data); -#endif - if (offset&0x000C3F) fprintf(stderr," VIA1: write to invalid offset in 68k space: %06X, data: %02X!\n", offset, data); - m_via0->write(space, (offset>>6)&0xF, data); + LOGMASKED(LOG_VIA1, "VIA1 register %s written by cpu with data %02x\n", swyft_via_regnames[(offset>>5)&0xF], data); + if (offset&0x000C3F) logerror("VIA1: write to invalid offset in 68k space: %06X, data: %02X!\n", offset, data); + m_via[0]->write(space, (offset>>6)&0xF, data); } // first via READ8_MEMBER( swyft_state::via0_pa_r ) { - logerror("VIA0: Port A read!\n"); + LOGMASKED(LOG_VIA0, "VIA0: Port A read!\n"); return 0xFF; } WRITE8_MEMBER( swyft_state::via0_pa_w ) { - logerror("VIA0: Port A written with data of 0x%02x!\n", data); + LOGMASKED(LOG_VIA0, "VIA0: Port A written with data of 0x%02x!\n", data); } WRITE_LINE_MEMBER ( swyft_state::via0_ca2_w ) { - logerror("VIA0: CA2 written with %d!\n", state); + LOGMASKED(LOG_VIA0, "VIA0: CA2 written with %d!\n", state); } READ8_MEMBER( swyft_state::via0_pb_r ) { - logerror("VIA0: Port B read!\n"); + LOGMASKED(LOG_VIA0, "VIA0: Port B read!\n"); return 0xFF; } WRITE8_MEMBER( swyft_state::via0_pb_w ) { - logerror("VIA0: Port B written with data of 0x%02x!\n", data); + LOGMASKED(LOG_VIA0, "VIA0: Port B written with data of 0x%02x!\n", data); } WRITE_LINE_MEMBER ( swyft_state::via0_cb1_w ) { - logerror("VIA0: CB1 written with %d!\n", state); + LOGMASKED(LOG_VIA0, "VIA0: CB1 written with %d!\n", state); } WRITE_LINE_MEMBER ( swyft_state::via0_cb2_w ) { - logerror("VIA0: CB2 written with %d!\n", state); -} - -WRITE_LINE_MEMBER ( swyft_state::via0_int_w ) -{ - logerror("VIA0: INT output set to %d!\n", state); + LOGMASKED(LOG_VIA0, "VIA0: CB2 written with %d!\n", state); } // second via READ8_MEMBER( swyft_state::via1_pa_r ) { - logerror(" VIA1: Port A read!\n"); + LOGMASKED(LOG_VIA1, "VIA1: Port A read!\n"); return 0xFF; } WRITE8_MEMBER( swyft_state::via1_pa_w ) { - logerror(" VIA1: Port A written with data of 0x%02x!\n", data); + LOGMASKED(LOG_VIA1, "VIA1: Port A written with data of 0x%02x!\n", data); } WRITE_LINE_MEMBER ( swyft_state::via1_ca2_w ) { - logerror(" VIA1: CA2 written with %d!\n", state); + LOGMASKED(LOG_VIA1, "VIA1: CA2 written with %d!\n", state); } READ8_MEMBER( swyft_state::via1_pb_r ) { - logerror(" VIA1: Port B read!\n"); + LOGMASKED(LOG_VIA1, "VIA1: Port B read!\n"); return 0xFF; } WRITE8_MEMBER( swyft_state::via1_pb_w ) { - logerror(" VIA1: Port B written with data of 0x%02x!\n", data); + LOGMASKED(LOG_VIA1, "VIA1: Port B written with data of 0x%02x!\n", data); } WRITE_LINE_MEMBER ( swyft_state::via1_cb1_w ) { - logerror(" VIA1: CB1 written with %d!\n", state); + LOGMASKED(LOG_VIA1, "VIA1: CB1 written with %d!\n", state); } WRITE_LINE_MEMBER ( swyft_state::via1_cb2_w ) { - logerror(" VIA1: CB2 written with %d!\n", state); -} - -WRITE_LINE_MEMBER ( swyft_state::via1_int_w ) -{ - logerror(" VIA1: INT output set to %d!\n", state); + LOGMASKED(LOG_VIA1, "VIA1: CB2 written with %d!\n", state); } WRITE_LINE_MEMBER( swyft_state::write_acia_clock ) @@ -773,10 +762,7 @@ MACHINE_CONFIG_START(swyft_state::swyft) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_SIZE(320, 242) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 242-1) + MCFG_SCREEN_RAW_PARAMS(15.8976_MHz_XTAL / 2, 500, 0, 320, 265, 0, 242) // total guess MCFG_SCREEN_UPDATE_DRIVER(swyft_state, screen_update_swyft) MCFG_SCREEN_PALETTE("palette") @@ -797,7 +783,7 @@ MACHINE_CONFIG_START(swyft_state::swyft) MCFG_VIA6522_CB1_HANDLER(WRITELINE(*this, swyft_state, via0_cb1_w)) MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, swyft_state, via0_ca2_w)) MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, swyft_state, via0_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, swyft_state, via0_int_w)) + MCFG_VIA6522_IRQ_HANDLER(WRITELINE("viairq", input_merger_device, in_w<0>)) MCFG_DEVICE_ADD("via6522_1", VIA6522, (XTAL(15'897'600)/2)/5) // out e clock from 68008 MCFG_VIA6522_READPA_HANDLER(READ8(*this, swyft_state, via1_pa_r)) @@ -807,7 +793,20 @@ MACHINE_CONFIG_START(swyft_state::swyft) MCFG_VIA6522_CB1_HANDLER(WRITELINE(*this, swyft_state, via1_cb1_w)) MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, swyft_state, via1_ca2_w)) MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, swyft_state, via1_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, swyft_state, via1_int_w)) + MCFG_VIA6522_IRQ_HANDLER(WRITELINE("viairq", input_merger_device, in_w<1>)) + + input_merger_device &viairq(INPUT_MERGER_ANY_HIGH(config, "viairq")); + viairq.output_handler().set_inputline("maincpu", M68K_IRQ_2); + + HCT259(config, m_bitlatch); + m_bitlatch->q_out_cb<0>().set(FUNC(swyft_state::bitlatch_q_w<0>)); + m_bitlatch->q_out_cb<1>().set(FUNC(swyft_state::bitlatch_q_w<1>)); + m_bitlatch->q_out_cb<2>().set(FUNC(swyft_state::bitlatch_q_w<2>)); + m_bitlatch->q_out_cb<3>().set(FUNC(swyft_state::bitlatch_q_w<3>)); + m_bitlatch->q_out_cb<4>().set(FUNC(swyft_state::bitlatch_q_w<4>)); + m_bitlatch->q_out_cb<5>().set(FUNC(swyft_state::bitlatch_q_w<5>)); + m_bitlatch->q_out_cb<6>().set(FUNC(swyft_state::bitlatch_q_w<6>)); + m_bitlatch->q_out_cb<7>().set(FUNC(swyft_state::bitlatch_q_w<7>)); MACHINE_CONFIG_END /* ROM definition */ -- cgit v1.2.3