mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
swyft: Add HCT259 latch; add interrupt; use logmacro.h; misc. cleanup (nw)
This commit is contained in:
parent
01dd625ad2
commit
fb6ea70527
@ -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<cpu_device> m_maincpu;
|
||||
optional_device<centronics_device> m_ctx;
|
||||
optional_device<output_latch_device> m_ctx_data_out;
|
||||
required_device<acia6850_device> m_acia6850; // only swyft uses this
|
||||
required_device<via6522_device> m_via0; // only swyft uses this
|
||||
required_device<via6522_device> m_via1; // only swyft uses this
|
||||
required_device<acia6850_device> m_acia6850;
|
||||
required_device_array<via6522_device, 2> m_via;
|
||||
required_device<hct259_device> m_bitlatch;
|
||||
optional_device<speaker_sound_device> m_speaker;
|
||||
required_shared_ptr<uint8_t> 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<int B> 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<int B>
|
||||
WRITE_LINE_MEMBER(swyft_state::bitlatch_q_w)
|
||||
{
|
||||
// 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;
|
||||
logerror("74HCT259: Q%d %s\n", B, state ? "on" : "off");
|
||||
}
|
||||
|
||||
READ8_MEMBER(swyft_state::bitlatch_r)
|
||||
{
|
||||
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 */
|
||||
|
Loading…
Reference in New Issue
Block a user