(MESS) tandy2k: WIP. (nw)

This commit is contained in:
Curt Coder 2014-04-04 12:23:42 +00:00
parent 830a12117f
commit 92e566a955
8 changed files with 487 additions and 450 deletions

View File

@ -38,15 +38,20 @@
#include "crt9007.h"
// device type definition
const device_type CRT9007 = &device_creator<crt9007_device>;
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type CRT9007 = &device_creator<crt9007_t>;
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
#define LOG 0
#define LOG 1
#define HAS_VALID_PARAMETERS \
(m_reg[0x00] && m_reg[0x01] && m_reg[0x07] && m_reg[0x08] && m_reg[0x09])
@ -217,7 +222,7 @@ const int STATUS_LIGHT_PEN_UPDATE = 0x20;
//**************************************************************************
// default address map
static ADDRESS_MAP_START( crt9007, AS_0, 8, crt9007_device )
static ADDRESS_MAP_START( crt9007, AS_0, 8, crt9007_t )
AM_RANGE(0x0000, 0x3fff) AM_RAM
ADDRESS_MAP_END
@ -231,7 +236,7 @@ ADDRESS_MAP_END
// readbyte - read a byte at the given address
//-------------------------------------------------
inline UINT8 crt9007_device::readbyte(offs_t address)
inline UINT8 crt9007_t::readbyte(offs_t address)
{
return space().read_byte(address);
}
@ -241,7 +246,7 @@ inline UINT8 crt9007_device::readbyte(offs_t address)
// trigger_interrupt -
//-------------------------------------------------
inline void crt9007_device::trigger_interrupt(int line)
inline void crt9007_t::trigger_interrupt(int line)
{
if (INTERRUPT_ENABLE & line)
{
@ -252,7 +257,7 @@ inline void crt9007_device::trigger_interrupt(int line)
if (!(status & STATUS_INTERRUPT_PENDING))
{
if (LOG) logerror("CRT9007 '%s' INT 1\n", tag());
m_out_int_func(ASSERT_LINE);
m_write_int(ASSERT_LINE);
}
}
}
@ -262,7 +267,7 @@ inline void crt9007_device::trigger_interrupt(int line)
// update_cblank_line -
//-------------------------------------------------
inline void crt9007_device::update_cblank_line()
inline void crt9007_t::update_cblank_line()
{
int x = m_screen->hpos();
int y = m_screen->vpos();
@ -276,7 +281,7 @@ inline void crt9007_device::update_cblank_line()
if (LOG) logerror("CRT9007 '%s' y %03u x %04u : CBLANK %u\n", tag(), y, x, m_cblank);
m_out_cblank_func(m_cblank);
m_write_cblank(m_cblank);
}
}
@ -285,7 +290,7 @@ inline void crt9007_device::update_cblank_line()
// update_hsync_timer -
//-------------------------------------------------
inline void crt9007_device::update_hsync_timer(int state)
inline void crt9007_t::update_hsync_timer(int state)
{
int y = m_screen->vpos();
@ -302,7 +307,7 @@ inline void crt9007_device::update_hsync_timer(int state)
// update_vsync_timer -
//-------------------------------------------------
inline void crt9007_device::update_vsync_timer(int state)
inline void crt9007_t::update_vsync_timer(int state)
{
int next_y = state ? m_vsync_start : m_vsync_end;
@ -316,7 +321,7 @@ inline void crt9007_device::update_vsync_timer(int state)
// update_vlt_timer -
//-------------------------------------------------
inline void crt9007_device::update_vlt_timer(int state)
inline void crt9007_t::update_vlt_timer(int state)
{
// this signal is active during all visible scan lines and during the horizontal trace at vertical retrace
int y = m_screen->vpos();
@ -334,7 +339,7 @@ inline void crt9007_device::update_vlt_timer(int state)
// update_curs_timer -
//-------------------------------------------------
inline void crt9007_device::update_curs_timer(int state)
inline void crt9007_t::update_curs_timer(int state)
{
// this signal is active for 1 character time for all scanlines within the data row
// TODO
@ -345,7 +350,7 @@ inline void crt9007_device::update_curs_timer(int state)
// update_drb_timer -
//-------------------------------------------------
inline void crt9007_device::update_drb_timer(int state)
inline void crt9007_t::update_drb_timer(int state)
{
// this signal is active for 1 full scan line (VLT edge to edge) at the top scan line of each new row
// there is 1 extra DRB signal during the 1st scanline of the vertical retrace interval
@ -381,7 +386,7 @@ inline void crt9007_device::update_drb_timer(int state)
// update_dma_timer -
//-------------------------------------------------
inline void crt9007_device::update_dma_timer()
inline void crt9007_t::update_dma_timer()
{
// TODO
}
@ -391,7 +396,7 @@ inline void crt9007_device::update_dma_timer()
// recompute_parameters -
//-------------------------------------------------
inline void crt9007_device::recompute_parameters()
inline void crt9007_t::recompute_parameters()
{
// check that necessary registers have been loaded
if (!HAS_VALID_PARAMETERS) return;
@ -444,55 +449,35 @@ inline void crt9007_device::recompute_parameters()
//**************************************************************************
//-------------------------------------------------
// crt9007_device - constructor
// crt9007_t - constructor
//-------------------------------------------------
crt9007_device::crt9007_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, CRT9007, "SMC CRT9007", tag, owner, clock, "crt9007", __FILE__),
device_memory_interface(mconfig, *this),
device_video_interface(mconfig, *this),
m_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, NULL, *ADDRESS_MAP_NAME(crt9007))
crt9007_t::crt9007_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, CRT9007, "SMC CRT9007", tag, owner, clock, "crt9007", __FILE__),
device_memory_interface(mconfig, *this),
device_video_interface(mconfig, *this),
m_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, NULL, *ADDRESS_MAP_NAME(crt9007)),
m_write_int(*this),
m_write_dmar(*this),
m_write_hs(*this),
m_write_vs(*this),
m_write_vlt(*this),
m_write_curs(*this),
m_write_drb(*this),
m_write_cblank(*this),
m_write_slg(*this),
m_write_sld(*this)
{
for (int i = 0; i < 0x3d; i++)
m_reg[i] = 0;
}
//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
//-------------------------------------------------
void crt9007_device::device_config_complete()
{
// inherit a copy of the static data
const crt9007_interface *intf = reinterpret_cast<const crt9007_interface *>(static_config());
if (intf != NULL)
*static_cast<crt9007_interface *>(this) = *intf;
// or initialize to defaults if none provided
else
{
memset(&m_out_int_cb, 0, sizeof(m_out_int_cb));
memset(&m_out_dmar_cb, 0, sizeof(m_out_dmar_cb));
memset(&m_out_vs_cb, 0, sizeof(m_out_vs_cb));
memset(&m_out_hs_cb, 0, sizeof(m_out_hs_cb));
memset(&m_out_vlt_cb, 0, sizeof(m_out_vlt_cb));
memset(&m_out_curs_cb, 0, sizeof(m_out_curs_cb));
memset(&m_out_drb_cb, 0, sizeof(m_out_drb_cb));
memset(&m_out_cblank_cb, 0, sizeof(m_out_cblank_cb));
memset(&m_out_slg_cb, 0, sizeof(m_out_slg_cb));
memset(&m_out_sld_cb, 0, sizeof(m_out_sld_cb));
}
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void crt9007_device::device_start()
void crt9007_t::device_start()
{
// allocate timers
m_hsync_timer = timer_alloc(TIMER_HSYNC);
@ -503,22 +488,16 @@ void crt9007_device::device_start()
m_dma_timer = timer_alloc(TIMER_DMA);
// resolve callbacks
m_out_int_func.resolve(m_out_int_cb, *this);
m_out_dmar_func.resolve(m_out_dmar_cb, *this);
m_out_hs_func.resolve(m_out_hs_cb, *this);
m_out_vs_func.resolve(m_out_vs_cb, *this);
m_out_vlt_func.resolve(m_out_vlt_cb, *this);
m_out_curs_func.resolve(m_out_curs_cb, *this);
m_out_drb_func.resolve(m_out_drb_cb, *this);
m_out_cblank_func.resolve(m_out_cblank_cb, *this);
m_out_slg_func.resolve(m_out_slg_cb, *this);
m_out_sld_func.resolve(m_out_sld_cb, *this);
// set horizontal pixels per column
m_hpixels_per_column = hpixels_per_column;
// register for state saving
// state_save_register_device_item(this, 0, );
m_write_int.resolve_safe();
m_write_dmar.resolve_safe();
m_write_hs.resolve_safe();
m_write_vs.resolve_safe();
m_write_vlt.resolve_safe();
m_write_curs.resolve_safe();
m_write_drb.resolve_safe();
m_write_cblank.resolve_safe();
m_write_slg.resolve_safe();
m_write_sld.resolve_safe();
}
@ -526,43 +505,43 @@ void crt9007_device::device_start()
// device_reset - device-specific reset
//-------------------------------------------------
void crt9007_device::device_reset()
void crt9007_t::device_reset()
{
m_disp = 0;
m_vs = 0;
m_cblank = 0;
// HS = 1
m_out_hs_func(1);
m_write_hs(1);
// VS = 1
m_out_vs_func(1);
m_write_vs(1);
// CBLANK = 1
m_out_cblank_func(0);
m_write_cblank(0);
// CURS = 0
m_out_curs_func(0);
m_write_curs(0);
// VLT = 0
m_out_vlt_func(0);
m_write_vlt(0);
// DRB = 1
m_out_drb_func(1);
m_write_drb(1);
// INT = 0
m_out_int_func(CLEAR_LINE);
m_write_int(CLEAR_LINE);
// 28 (DMAR) = 0
m_out_dmar_func(CLEAR_LINE);
m_write_dmar(CLEAR_LINE);
// 29 (WBEN) = 0
// 30 (SLG) = 0
m_out_slg_func(0);
m_write_slg(0);
// 31 (SLD) = 0
m_out_sld_func(0);
m_write_sld(0);
// 32 (LPSTB) = 0
}
@ -572,7 +551,7 @@ void crt9007_device::device_reset()
// device_clock_changed - handle clock change
//-------------------------------------------------
void crt9007_device::device_clock_changed()
void crt9007_t::device_clock_changed()
{
recompute_parameters();
}
@ -582,7 +561,7 @@ void crt9007_device::device_clock_changed()
// device_timer - handle timer events
//-------------------------------------------------
void crt9007_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
void crt9007_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
int x = m_screen->hpos();
int y = m_screen->vpos();
@ -594,7 +573,7 @@ void crt9007_device::device_timer(emu_timer &timer, device_timer_id id, int para
if (LOG) logerror("CRT9007 '%s' y %03u x %04u : HS %u\n", tag(), y, x, m_hs);
m_out_hs_func(m_hs);
m_write_hs(m_hs);
update_cblank_line();
@ -606,7 +585,7 @@ void crt9007_device::device_timer(emu_timer &timer, device_timer_id id, int para
if (LOG) logerror("CRT9007 '%s' y %03u x %04u : VS %u\n", tag(), y, x, m_vs);
m_out_vs_func(param);
m_write_vs(param);
if (m_vs)
{
@ -628,7 +607,7 @@ void crt9007_device::device_timer(emu_timer &timer, device_timer_id id, int para
if (LOG) logerror("CRT9007 '%s' y %03u x %04u : VLT %u\n", tag(), y, x, m_vlt);
m_out_vlt_func(param);
m_write_vlt(param);
update_vlt_timer(param);
break;
@ -636,7 +615,7 @@ void crt9007_device::device_timer(emu_timer &timer, device_timer_id id, int para
case TIMER_CURS:
if (LOG) logerror("CRT9007 '%s' y %03u x %04u : CURS %u\n", tag(), y, x, param);
m_out_curs_func(param);
m_write_curs(param);
update_curs_timer(param);
break;
@ -646,7 +625,7 @@ void crt9007_device::device_timer(emu_timer &timer, device_timer_id id, int para
if (LOG) logerror("CRT9007 '%s' y %03u x %04u : DRB %u\n", tag(), y, x, m_drb);
m_out_drb_func(param);
m_write_drb(param);
if (!m_drb && !DMA_DISABLE)
{
@ -657,7 +636,7 @@ void crt9007_device::device_timer(emu_timer &timer, device_timer_id id, int para
m_dmar = 1;
if (LOG) logerror("CRT9007 '%s' DMAR 1\n", tag());
m_out_dmar_func(ASSERT_LINE);
m_write_dmar(ASSERT_LINE);
}
update_drb_timer(param);
@ -677,7 +656,7 @@ void crt9007_device::device_timer(emu_timer &timer, device_timer_id id, int para
// any address spaces owned by this device
//-------------------------------------------------
const address_space_config *crt9007_device::memory_space_config(address_spacenum spacenum) const
const address_space_config *crt9007_t::memory_space_config(address_spacenum spacenum) const
{
return (spacenum == AS_0) ? &m_space_config : NULL;
}
@ -687,7 +666,7 @@ const address_space_config *crt9007_device::memory_space_config(address_spacenum
// read - register read
//-------------------------------------------------
READ8_MEMBER( crt9007_device::read )
READ8_MEMBER( crt9007_t::read )
{
UINT8 data = 0;
@ -717,7 +696,7 @@ READ8_MEMBER( crt9007_device::read )
// reset interrupt pending bit
m_status &= ~STATUS_INTERRUPT_PENDING;
if (LOG) logerror("CRT9007 '%s' INT 0\n", tag());
m_out_int_func(CLEAR_LINE);
m_write_int(CLEAR_LINE);
break;
case 0x3b:
@ -743,7 +722,7 @@ READ8_MEMBER( crt9007_device::read )
// write - register write
//-------------------------------------------------
WRITE8_MEMBER( crt9007_device::write )
WRITE8_MEMBER( crt9007_t::write )
{
m_reg[offset] = data;
@ -913,7 +892,7 @@ WRITE8_MEMBER( crt9007_device::write )
// ack_w - DMA acknowledge
//-------------------------------------------------
WRITE_LINE_MEMBER( crt9007_device::ack_w )
WRITE_LINE_MEMBER( crt9007_t::ack_w )
{
if (LOG) logerror("CRT9007 '%s' ACK: %u\n", tag(), state);
@ -931,7 +910,7 @@ WRITE_LINE_MEMBER( crt9007_device::ack_w )
// lpstb_w - light pen strobe
//-------------------------------------------------
WRITE_LINE_MEMBER( crt9007_device::lpstb_w )
WRITE_LINE_MEMBER( crt9007_t::lpstb_w )
{
if (LOG) logerror("CRT9007 '%s' LPSTB: %u\n", tag(), state);
@ -945,31 +924,12 @@ WRITE_LINE_MEMBER( crt9007_device::lpstb_w )
//-------------------------------------------------
// vlt_r -
// set_character_width -
//-------------------------------------------------
READ_LINE_MEMBER( crt9007_device::vlt_r )
void crt9007_t::set_character_width(int value)
{
return m_vlt;
}
m_hpixels_per_column = value;
//-------------------------------------------------
// wben_r -
//-------------------------------------------------
READ_LINE_MEMBER( crt9007_device::wben_r )
{
return m_wben;
}
//-------------------------------------------------
// set_hpixels_per_column -
//-------------------------------------------------
void crt9007_device::set_hpixels_per_column(int hpixels_per_column)
{
m_hpixels_per_column = hpixels_per_column;
recompute_parameters();
}

View File

@ -52,14 +52,38 @@
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_CRT9007_ADD(_tag, _clock, _config, _map) \
MCFG_DEVICE_ADD(_tag, CRT9007, _clock) \
MCFG_DEVICE_CONFIG(_config) \
MCFG_DEVICE_ADDRESS_MAP(AS_0, _map)
#define MCFG_CRT9007_CHARACTER_WIDTH(_value) \
crt9007_t::static_set_character_width(*device, _value);
#define MCFG_CRT9007_INT_CALLBACK(_write) \
devcb = &crt9007_t::set_int_wr_callback(*device, DEVCB2_##_write);
#define CRT9007_INTERFACE(name) \
const crt9007_interface (name) =
#define MCFG_CRT9007_DMAR_CALLBACK(_write) \
devcb = &crt9007_t::set_dmar_wr_callback(*device, DEVCB2_##_write);
#define MCFG_CRT9007_VS_CALLBACK(_write) \
devcb = &crt9007_t::set_vs_wr_callback(*device, DEVCB2_##_write);
#define MCFG_CRT9007_HS_CALLBACK(_write) \
devcb = &crt9007_t::set_hs_wr_callback(*device, DEVCB2_##_write);
#define MCFG_CRT9007_VLT_CALLBACK(_write) \
devcb = &crt9007_t::set_vlt_wr_callback(*device, DEVCB2_##_write);
#define MCFG_CRT9007_CURS_CALLBACK(_write) \
devcb = &crt9007_t::set_curs_wr_callback(*device, DEVCB2_##_write);
#define MCFG_CRT9007_DRB_CALLBACK(_write) \
devcb = &crt9007_t::set_drb_wr_callback(*device, DEVCB2_##_write);
#define MCFG_CRT9007_CBLANK_CALLBACK(_write) \
devcb = &crt9007_t::set_cblank_wr_callback(*device, DEVCB2_##_write);
#define MCFG_CRT9007_SLG_CALLBACK(_write) \
devcb = &crt9007_t::set_slg_wr_callback(*device, DEVCB2_##_write);
#define MCFG_CRT9007_SLD_CALLBACK(_write) \
devcb = &crt9007_t::set_sld_wr_callback(*device, DEVCB2_##_write);
@ -67,53 +91,38 @@
// TYPE DEFINITIONS
//**************************************************************************
// ======================> crt9007_t
// ======================> crt9007_interface
struct crt9007_interface
{
int hpixels_per_column; /* number of pixels per video memory address */
devcb_write_line m_out_int_cb;
devcb_write_line m_out_dmar_cb;
devcb_write_line m_out_vs_cb;
devcb_write_line m_out_hs_cb;
devcb_write_line m_out_vlt_cb;
devcb_write_line m_out_curs_cb;
devcb_write_line m_out_drb_cb;
devcb_write_line m_out_cblank_cb;
devcb_write_line m_out_slg_cb;
devcb_write_line m_out_sld_cb;
};
// ======================> crt9007_device
class crt9007_device : public device_t,
public device_memory_interface,
public device_video_interface,
public crt9007_interface
class crt9007_t : public device_t,
public device_memory_interface,
public device_video_interface
{
public:
// construction/destruction
crt9007_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
crt9007_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
static void static_set_character_width(device_t &device, int value) { downcast<crt9007_t &>(device).m_hpixels_per_column = value; }
template<class _Object> static devcb2_base &set_int_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_int.set_callback(object); }
template<class _Object> static devcb2_base &set_dmar_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_dmar.set_callback(object); }
template<class _Object> static devcb2_base &set_vs_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_vs.set_callback(object); }
template<class _Object> static devcb2_base &set_hs_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_hs.set_callback(object); }
template<class _Object> static devcb2_base &set_vlt_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_vlt.set_callback(object); }
template<class _Object> static devcb2_base &set_curs_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_curs.set_callback(object); }
template<class _Object> static devcb2_base &set_drb_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_drb.set_callback(object); }
template<class _Object> static devcb2_base &set_cblank_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_cblank.set_callback(object); }
template<class _Object> static devcb2_base &set_slg_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_slg.set_callback(object); }
template<class _Object> static devcb2_base &set_sld_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_sld.set_callback(object); }
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
DECLARE_WRITE_LINE_MEMBER( ack_w );
DECLARE_WRITE_LINE_MEMBER( lpstb_w );
DECLARE_READ_LINE_MEMBER( vlt_r );
DECLARE_READ_LINE_MEMBER( wben_r );
void set_hpixels_per_column(int hpixels_per_column);
void set_character_width(int value);
protected:
// device-level overrides
virtual void device_config_complete();
virtual void device_start();
virtual void device_reset();
virtual void device_clock_changed();
@ -123,12 +132,15 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const;
private:
static const device_timer_id TIMER_HSYNC = 0;
static const device_timer_id TIMER_VSYNC = 1;
static const device_timer_id TIMER_VLT = 2;
static const device_timer_id TIMER_CURS = 3;
static const device_timer_id TIMER_DRB = 4;
static const device_timer_id TIMER_DMA = 5;
enum
{
TIMER_HSYNC,
TIMER_VSYNC,
TIMER_VLT,
TIMER_CURS,
TIMER_DRB,
TIMER_DMA
};
inline UINT8 readbyte(offs_t address);
@ -143,16 +155,19 @@ private:
inline void recompute_parameters();
devcb_resolved_write_line m_out_int_func;
devcb_resolved_write_line m_out_dmar_func;
devcb_resolved_write_line m_out_hs_func;
devcb_resolved_write_line m_out_vs_func;
devcb_resolved_write_line m_out_vlt_func;
devcb_resolved_write_line m_out_curs_func;
devcb_resolved_write_line m_out_drb_func;
devcb_resolved_write_line m_out_cblank_func;
devcb_resolved_write_line m_out_slg_func;
devcb_resolved_write_line m_out_sld_func;
// address space configurations
const address_space_config m_space_config;
devcb2_write_line m_write_int;
devcb2_write_line m_write_dmar;
devcb2_write_line m_write_hs;
devcb2_write_line m_write_vs;
devcb2_write_line m_write_vlt;
devcb2_write_line m_write_curs;
devcb2_write_line m_write_drb;
devcb2_write_line m_write_cblank;
devcb2_write_line m_write_slg;
devcb2_write_line m_write_sld;
// registers
UINT8 m_reg[0x3d];
@ -175,7 +190,7 @@ private:
int m_cblank;
int m_vlt;
int m_drb;
int m_wben;
//int m_wben;
//int m_slg;
//int m_sld;
int m_lpstb;
@ -194,9 +209,6 @@ private:
emu_timer *m_curs_timer;
emu_timer *m_drb_timer;
emu_timer *m_dma_timer;
// address space configurations
const address_space_config m_space_config;
};

View File

@ -14,8 +14,6 @@
TODO:
- attributes
- reverse video
- character blank
- character blink
- underline
- full/half intensity
@ -26,7 +24,6 @@
- character mode w/underline
- double height characters
- double width characters
- parallel scan line
- serial scan line
- cursor
- underline
@ -35,16 +32,19 @@
- blinking reverse video
- programmable character blink rate (75/25 duty)
- programmable cursor blink rate (50/50 duty)
- data/attribute latches
- attribute latches
*/
#include "emu.h"
#include "crt9021.h"
// device type definition
const device_type CRT9021 = &device_creator<crt9021_device>;
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type CRT9021 = &device_creator<crt9021_t>;
//**************************************************************************
@ -54,41 +54,40 @@ const device_type CRT9021 = &device_creator<crt9021_device>;
#define LOG 0
// attributes
enum
{
ATTRIBUTE_REVID = 0x80,
ATTRIBUTE_INT = 0x40,
ATTRIBUTE_BLINK = 0x20,
ATTRIBUTE_MS1 = 0x10,
ATTRIBUTE_MS0 = 0x08,
ATTRIBUTE_CHABL = 0x04,
ATTRIBUTE_BKC = 0x02,
ATTRIBUTE_BLC = 0x01
};
//**************************************************************************
// INLINE HELPERS
//**************************************************************************
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// crt9021_device - constructor
// crt9021_t - constructor
//-------------------------------------------------
crt9021_device::crt9021_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, CRT9021, "SMC CRT9021", tag, owner, clock, "crt9021", __FILE__),
device_video_interface(mconfig, *this),
m_in_data_cb(*this),
m_in_attr_cb(*this),
m_in_atten_cb(*this)
crt9021_t::crt9021_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, CRT9021, "SMC CRT9021", tag, owner, clock, "crt9021", __FILE__),
device_video_interface(mconfig, *this),
m_data(0),
m_ms0(0),
m_ms1(0),
m_revid(0),
m_chabl(0),
m_blink(0),
m_intin(0),
m_atten(0),
m_cursor(0),
m_retbl(0),
m_ld_sh(1),
m_sld(1),
m_slg(0),
m_blc(0),
m_bkc(0),
m_sl0(0),
m_sl1(0),
m_sl2(0),
m_sl3(0),
m_vsync(0),
m_sr(0),
m_intout(0)
{
}
@ -97,21 +96,43 @@ crt9021_device::crt9021_device(const machine_config &mconfig, const char *tag, d
// device_start - device-specific startup
//-------------------------------------------------
void crt9021_device::device_start()
void crt9021_t::device_start()
{
// allocate timers
m_vdc_timer = timer_alloc();
// resolve callbacks
m_in_data_cb.resolve_safe(0);
m_in_attr_cb.resolve_safe(0);
m_in_atten_cb.resolve_safe(0);
if (!m_display_cb.isnull())
{
m_vdc_timer->adjust(clocks_to_attotime(8), 0, clocks_to_attotime(8));
}
// register for state saving
save_item(NAME(m_slg));
save_item(NAME(m_sld));
// register bitmap
m_screen->register_screen_bitmap(m_bitmap);
// state saving
save_item(NAME(m_data));
save_item(NAME(m_ms0));
save_item(NAME(m_ms1));
save_item(NAME(m_revid));
save_item(NAME(m_chabl));
save_item(NAME(m_blink));
save_item(NAME(m_intin));
save_item(NAME(m_atten));
save_item(NAME(m_cursor));
save_item(NAME(m_retbl));
save_item(NAME(m_ld_sh));
save_item(NAME(m_sld));
save_item(NAME(m_slg));
save_item(NAME(m_blc));
save_item(NAME(m_bkc));
save_item(NAME(m_sl0));
save_item(NAME(m_sl1));
save_item(NAME(m_sl2));
save_item(NAME(m_sl3));
save_item(NAME(m_vsync));
save_item(NAME(m_sr));
save_item(NAME(m_intout));
save_item(NAME(m_sld));
}
@ -119,8 +140,12 @@ void crt9021_device::device_start()
// device_clock_changed - handle clock change
//-------------------------------------------------
void crt9021_device::device_clock_changed()
void crt9021_t::device_clock_changed()
{
if (!m_display_cb.isnull())
{
m_vdc_timer->adjust(clocks_to_attotime(8), 0, clocks_to_attotime(8));
}
}
@ -128,72 +153,57 @@ void crt9021_device::device_clock_changed()
// device_timer - handle timer events
//-------------------------------------------------
void crt9021_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
void crt9021_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
m_display_cb(m_bitmap, m_screen->vpos(), m_screen->hpos(), m_sr, m_intout);
}
//-------------------------------------------------
// slg_w - scan line gate
// ld_sh_w - load/shift
//-------------------------------------------------
WRITE_LINE_MEMBER( crt9021_device::slg_w )
WRITE_LINE_MEMBER( crt9021_t::ld_sh_w )
{
if (LOG) logerror("CRT9021 '%s' SLG: %u\n", tag(), state);
if (LOG) logerror("CRT9021 '%s' LD/SH: %u\n", tag(), state);
m_slg = state;
}
//-------------------------------------------------
// sld_w - scan line data
//-------------------------------------------------
WRITE_LINE_MEMBER( crt9021_device::sld_w )
{
if (LOG) logerror("CRT9021 '%s' SLG: %u\n", tag(), state);
if (!m_slg)
if (!m_ld_sh && state)
{
m_sld <<= 1;
m_sld |= state;
// shift in scanline data
if (!m_slg)
{
m_sl >>= 1;
m_sl |= m_sld << 3;
}
// latch data
if (m_retbl)
{
m_sr = 0;
}
else
{
m_sr = m_chabl ? 0 : m_data;
if (m_revid) m_sr ^= 0xff;
}
// latch attributes
if (m_atten)
{
// TODO
}
}
}
//-------------------------------------------------
// cursor_w - cursor
//-------------------------------------------------
WRITE_LINE_MEMBER( crt9021_device::cursor_w )
{
if (LOG) logerror("CRT9021 '%s' CURSOR: %u\n", tag(), state);
m_cursor = state;
}
//-------------------------------------------------
// retbl_w - retrace blank
//-------------------------------------------------
WRITE_LINE_MEMBER( crt9021_device::retbl_w )
{
if (LOG) logerror("CRT9021 '%s' RETBL: %u\n", tag(), state);
m_retbl = state;
}
//-------------------------------------------------
// vsync_w - vertical sync
//-------------------------------------------------
WRITE_LINE_MEMBER( crt9021_device::vsync_w )
WRITE_LINE_MEMBER( crt9021_t::vsync_w )
{
if (LOG) logerror("CRT9021 '%s' VSYNC: %u\n", tag(), state);
m_vsync = state;
}
@ -201,7 +211,9 @@ WRITE_LINE_MEMBER( crt9021_device::vsync_w )
// screen_update - update screen
//-------------------------------------------------
UINT32 crt9021_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
UINT32 crt9021_t::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
m_bitmap.fill(rgb_t::black, cliprect);
return 0;
}

View File

@ -35,47 +35,54 @@
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_CRT9021_IN_DATA_CB(_devcb) \
devcb = &crt9021_device::set_in_data_callback(*device, DEVCB2_##_devcb);
#define CRT9021_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int y, int x, UINT8 data, int intout)
#define MCFG_CRT9021_IN_ATTR_CB(_devcb) \
devcb = &crt9021_device::set_in_attr_callback(*device, DEVCB2_##_devcb);
#define MCFG_CRT9021_IN_ATTEN_CB(_devcb) \
devcb = &crt9021_device::set_in_atten_callback(*device, DEVCB2_##_devcb);
#define MCFG_CRT9021_DRAW_CHARACTER_CALLBACK_OWNER(_class, _method) \
crt9021_t::static_set_display_callback(*device, crt9021_draw_character_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> crt9021_device
typedef device_delegate<void (bitmap_rgb32 &bitmap, int y, int x, UINT8 data, int intout)> crt9021_draw_character_delegate;
class crt9021_device : public device_t,
public device_video_interface
// ======================> crt9021_t
class crt9021_t : public device_t,
public device_video_interface
{
public:
// construction/destruction
crt9021_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
crt9021_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
template<class _Object> static devcb2_base &set_in_data_callback(device_t &device, _Object object) { return downcast<crt9021_device &>(device).m_in_data_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_in_attr_callback(device_t &device, _Object object) { return downcast<crt9021_device &>(device).m_in_attr_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_in_atten_callback(device_t &device, _Object object) { return downcast<crt9021_device &>(device).m_in_atten_cb.set_callback(object); }
static void static_set_display_callback(device_t &device, crt9021_draw_character_delegate callback) { downcast<crt9021_t &>(device).m_display_cb = callback; }
DECLARE_WRITE_LINE_MEMBER( slg_w );
DECLARE_WRITE_LINE_MEMBER( sld_w );
DECLARE_WRITE_LINE_MEMBER( cursor_w );
DECLARE_WRITE_LINE_MEMBER( retbl_w );
DECLARE_WRITE8_MEMBER( write ) { m_data = data; }
DECLARE_WRITE_LINE_MEMBER( ms0_w ) { m_ms0 = state; }
DECLARE_WRITE_LINE_MEMBER( ms1_w ) { m_ms1 = state; }
DECLARE_WRITE_LINE_MEMBER( revid_w ) { m_revid = state; }
DECLARE_WRITE_LINE_MEMBER( chabl_w ) { m_chabl = state; }
DECLARE_WRITE_LINE_MEMBER( blink_w ) { m_blink = state; }
DECLARE_WRITE_LINE_MEMBER( intin_w ) { m_intin = state; }
DECLARE_WRITE_LINE_MEMBER( atten_w ) { m_atten = state; }
DECLARE_WRITE_LINE_MEMBER( cursor_w ) { m_cursor = state; }
DECLARE_WRITE_LINE_MEMBER( retbl_w ) { m_retbl = state; }
DECLARE_WRITE_LINE_MEMBER( ld_sh_w );
DECLARE_WRITE_LINE_MEMBER( sld_w ) { m_sld = state; }
DECLARE_WRITE_LINE_MEMBER( slg_w ) { m_slg = state; }
DECLARE_WRITE_LINE_MEMBER( blc_w ) { m_blc = state; }
DECLARE_WRITE_LINE_MEMBER( bkc_w ) { m_bkc = state; }
DECLARE_WRITE_LINE_MEMBER( sl0_w ) { m_sl0 = state; }
DECLARE_WRITE_LINE_MEMBER( sl1_w ) { m_sl1 = state; }
DECLARE_WRITE_LINE_MEMBER( sl2_w ) { m_sl2 = state; }
DECLARE_WRITE_LINE_MEMBER( sl3_w ) { m_sl3 = state; }
DECLARE_WRITE_LINE_MEMBER( vsync_w );
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@ -87,16 +94,47 @@ protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
devcb2_read8 m_in_data_cb;
devcb2_read8 m_in_attr_cb;
enum
{
MS_WIDE_GRAPHICS,
MS_CHARACTER,
MS_THIN_GRAPHICS,
MS_UNDERLINE
};
devcb2_read_line m_in_atten_cb;
crt9021_draw_character_delegate m_display_cb;
int m_slg;
int m_sld;
bitmap_rgb32 m_bitmap;
// inputs
UINT8 m_data;
int m_ms0;
int m_ms1;
int m_revid;
int m_chabl;
int m_blink;
int m_intin;
int m_atten;
int m_cursor;
int m_retbl;
int m_ld_sh;
int m_sld;
int m_slg;
int m_blc;
int m_bkc;
int m_sl0;
int m_sl1;
int m_sl2;
int m_sl3;
int m_vsync;
// outputs
UINT8 m_sr;
int m_intout;
int m_sl;
// timers
emu_timer *m_vdc_timer;
};

View File

@ -9,11 +9,26 @@
**********************************************************************/
#include "emu.h"
/*
TODO:
- RCLK and WCLK are clocked simultaneously since that's what tandy2k does and we have no other users
*/
#include "crt9212.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type CRT9212 = &device_creator<crt9212_t>;
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
@ -21,112 +36,94 @@
#define LOG 0
#define REN \
m_in_ren_cb()
#define WEN \
m_in_wen_cb()
#define WEN2 \
m_in_wen2_cb()
#define ROF(_state) \
m_out_rof_cb(_state);
#define WOF(_state) \
m_out_wof_cb(_state);
//**************************************************************************
// INLINE HELPERS
//**************************************************************************
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
// device type definition
const device_type CRT9212 = &device_creator<crt9212_device>;
//-------------------------------------------------
// crt9212_device - constructor
// crt9212_t - constructor
//-------------------------------------------------
crt9212_device::crt9212_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, CRT9212, "SMC CRT9212", tag, owner, clock, "crt9212", __FILE__),
m_out_rof_cb(*this),
m_out_wof_cb(*this),
m_in_ren_cb(*this),
m_in_wen_cb(*this),
m_in_wen2_cb(*this)
crt9212_t::crt9212_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, CRT9212, "SMC CRT9212", tag, owner, clock, "crt9212", __FILE__),
m_write_dout(*this),
m_write_rof(*this),
m_write_wof(*this),
m_data(0),
m_clrcnt(0),
m_tog(0),
m_ren(0),
m_wen1(1),
m_wen2(0),
m_oe(0),
m_rclk(0),
m_wclk(0),
m_buffer(0),
m_rac(0),
m_wac(0)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void crt9212_device::device_start()
void crt9212_t::device_start()
{
// resolve callbacks
m_out_rof_cb.resolve_safe();
m_out_wof_cb.resolve_safe();
m_in_ren_cb.resolve_safe(0);
m_in_wen_cb.resolve_safe(0);
m_in_wen2_cb.resolve_safe(0);
m_write_dout.resolve_safe();
m_write_rof.resolve_safe();
m_write_wof.resolve_safe();
// register for state saving
save_item(NAME(m_input));
save_item(NAME(m_output));
// allocate timers
m_rwclk_timer = timer_alloc();
if (clock())
{
m_rwclk_timer->adjust(attotime::from_hz(clock()), 0, attotime::from_hz(clock()));
}
// state saving
save_item(NAME(m_data));
save_item(NAME(m_clrcnt));
save_item(NAME(m_tog));
save_item(NAME(m_ren));
save_item(NAME(m_wen1));
save_item(NAME(m_wen2));
save_item(NAME(m_oe));
save_item(NAME(m_rclk));
save_item(NAME(m_wclk));
save_item(NAME(m_ram[0]));
save_item(NAME(m_ram[1]));
save_item(NAME(m_buffer));
save_item(NAME(m_rac));
save_item(NAME(m_wac));
save_item(NAME(m_tog));
save_item(NAME(m_clrcnt));
save_item(NAME(m_rclk));
save_item(NAME(m_wclk));
}
//-------------------------------------------------
// read - buffer read
// device_clock_changed - handle clock change
//-------------------------------------------------
READ8_MEMBER( crt9212_device::read )
void crt9212_t::device_clock_changed()
{
return m_output;
m_rwclk_timer->adjust(attotime::from_hz(clock()), 0, attotime::from_hz(clock()));
}
//-------------------------------------------------
// write - buffer write
// device_timer - handle timer events
//-------------------------------------------------
WRITE8_MEMBER( crt9212_device::write )
void crt9212_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
m_input = data;
}
rclk_w(1);
rclk_w(0);
//-------------------------------------------------
// clrcnt_w - clear address counters
//-------------------------------------------------
WRITE_LINE_MEMBER( crt9212_device::clrcnt_w )
{
m_clrcnt = state;
}
//-------------------------------------------------
// tog_w - toggle buffer
//-------------------------------------------------
WRITE_LINE_MEMBER( crt9212_device::tog_w )
{
m_tog = state;
wclk_w(1);
wclk_w(0);
}
@ -134,7 +131,7 @@ WRITE_LINE_MEMBER( crt9212_device::tog_w )
// rclk_w - read clock
//-------------------------------------------------
WRITE_LINE_MEMBER( crt9212_device::rclk_w )
WRITE_LINE_MEMBER( crt9212_t::rclk_w )
{
if (m_rclk && !state)
{
@ -147,21 +144,21 @@ WRITE_LINE_MEMBER( crt9212_device::rclk_w )
// clear write address counter
m_wac = 0;
WOF(0);
m_write_wof(0);
}
else
{
// clear read address counter
m_rac = 0;
ROF(0);
m_write_rof(0);
}
}
else
{
if (REN && (m_rac < CRT9212_RAM_SIZE))
if (m_ren && (m_rac < CRT9212_RAM_SIZE))
{
//
m_output = m_ram[m_rac][!m_buffer];
m_write_dout(m_ram[m_rac][!m_buffer]);
// increment read address counter
m_rac++;
@ -169,7 +166,7 @@ WRITE_LINE_MEMBER( crt9212_device::rclk_w )
if (m_rac == CRT9212_RAM_SIZE)
{
// set read overflow
ROF(1);
m_write_rof(1);
}
}
}
@ -183,14 +180,14 @@ WRITE_LINE_MEMBER( crt9212_device::rclk_w )
// wclk_w - write clock
//-------------------------------------------------
WRITE_LINE_MEMBER( crt9212_device::wclk_w )
WRITE_LINE_MEMBER( crt9212_t::wclk_w )
{
if (!m_rclk && state)
if (!m_wclk && state)
{
if (WEN && WEN2 && (m_wac < CRT9212_RAM_SIZE))
if (m_wen1 && m_wen2 && (m_wac < CRT9212_RAM_SIZE))
{
//
m_ram[m_rac][m_buffer] = m_input;
m_ram[m_rac][m_buffer] = m_data;
// increment read address counter
m_wac++;
@ -198,7 +195,7 @@ WRITE_LINE_MEMBER( crt9212_device::wclk_w )
if (m_wac == CRT9212_RAM_SIZE)
{
// set write overflow
WOF(1);
m_write_wof(1);
}
}
}

View File

@ -47,70 +47,73 @@ const int CRT9212_RAM_SIZE = 135;
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_CRT9212_OUT_ROF_CB(_devcb) \
devcb = &crt9212_device::set_out_rof_callback(*device, DEVCB2_##_devcb);
#define MCFG_CRT9212_DOUT_CALLBACK(_write) \
devcb = &crt9212_t::set_dout_wr_callback(*device, DEVCB2_##_write);
#define MCFG_CRT9212_OUT_WOF_CB(_devcb) \
devcb = &crt9212_device::set_out_wof_callback(*device, DEVCB2_##_devcb);
#define MCFG_CRT9212_IN_REN_CB(_devcb) \
devcb = &crt9212_device::set_in_ren_callback(*device, DEVCB2_##_devcb);
#define MCFG_CRT9212_ROF_CALLBACK(_write) \
devcb = &crt9212_t::set_rof_wr_callback(*device, DEVCB2_##_write);
#define MCFG_CRT9212_IN_WEN_CB(_devcb) \
devcb = &crt9212_device::set_in_wen_callback(*device, DEVCB2_##_devcb);
#define MCFG_CRT9212_WOF_CALLBACK(_write) \
devcb = &crt9212_t::set_wof_wr_callback(*device, DEVCB2_##_write);
#define MCFG_CRT9212_IN_WEN2_CB(_devcb) \
devcb = &crt9212_device::set_in_wen2_callback(*device, DEVCB2_##_devcb);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> crt9212_device
// ======================> crt9212_t
class crt9212_device : public device_t
class crt9212_t : public device_t
{
public:
// construction/destruction
crt9212_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
crt9212_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
template<class _Object> static devcb2_base &set_out_rof_callback(device_t &device, _Object object) { return downcast<crt9212_device &>(device).m_out_rof_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_out_wof_callback(device_t &device, _Object object) { return downcast<crt9212_device &>(device).m_out_wof_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_in_ren_callback(device_t &device, _Object object) { return downcast<crt9212_device &>(device).m_in_ren_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_in_wen_callback(device_t &device, _Object object) { return downcast<crt9212_device &>(device).m_in_wen_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_in_wen2_callback(device_t &device, _Object object) { return downcast<crt9212_device &>(device).m_in_wen2_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_dout_wr_callback(device_t &device, _Object object) { return downcast<crt9212_t &>(device).m_write_dout.set_callback(object); }
template<class _Object> static devcb2_base &set_rof_wr_callback(device_t &device, _Object object) { return downcast<crt9212_t &>(device).m_write_rof.set_callback(object); }
template<class _Object> static devcb2_base &set_wof_wr_callback(device_t &device, _Object object) { return downcast<crt9212_t &>(device).m_write_wof.set_callback(object); }
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
DECLARE_WRITE_LINE_MEMBER( clrcnt_w );
DECLARE_WRITE_LINE_MEMBER( tog_w );
DECLARE_WRITE8_MEMBER( write ) { m_data = data; }
DECLARE_WRITE_LINE_MEMBER( clrcnt_w ) { m_clrcnt = state; }
DECLARE_WRITE_LINE_MEMBER( tog_w ) { m_tog = state; }
DECLARE_WRITE_LINE_MEMBER( ren_w ) { m_ren = state; }
DECLARE_WRITE_LINE_MEMBER( wen1_w ) { m_wen1 = state; }
DECLARE_WRITE_LINE_MEMBER( wen2_w ) { m_wen2 = state; }
DECLARE_WRITE_LINE_MEMBER( oe_w ) { m_oe = state; }
DECLARE_WRITE_LINE_MEMBER( rclk_w );
DECLARE_WRITE_LINE_MEMBER( wclk_w );
protected:
// device-level overrides
virtual void device_start();
virtual void device_clock_changed();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
devcb2_write_line m_out_rof_cb;
devcb2_write_line m_out_wof_cb;
devcb2_read_line m_in_ren_cb;
devcb2_read_line m_in_wen_cb;
devcb2_read_line m_in_wen2_cb;
devcb2_write8 m_write_dout;
devcb2_write_line m_write_rof;
devcb2_write_line m_write_wof;
// inputs
UINT8 m_data;
int m_clrcnt;
int m_tog;
int m_ren;
int m_wen1;
int m_wen2;
int m_oe;
int m_rclk;
int m_wclk;
// internal state
UINT8 m_ram[CRT9212_RAM_SIZE][2];
UINT8 m_input;
UINT8 m_output;
int m_buffer;
int m_rac;
int m_wac;
int m_tog;
int m_clrcnt;
int m_rclk;
int m_wclk;
// timers
emu_timer *m_rwclk_timer;
};

View File

@ -235,7 +235,7 @@ WRITE8_MEMBER( tandy2k_state::addr_ctrl_w )
if (m_clkcnt != BIT(data, 6))
{
m_vpac->set_hpixels_per_column(character_width);
m_vpac->set_character_width(character_width);
m_clkcnt = BIT(data, 6);
}
@ -279,7 +279,7 @@ static ADDRESS_MAP_START( tandy2k_io, AS_IO, 16, tandy2k_state )
AM_RANGE(0x00060, 0x00063) AM_DEVREADWRITE8(I8259A_0_TAG, pic8259_device, read, write, 0x00ff)
AM_RANGE(0x00070, 0x00073) AM_DEVREADWRITE8(I8259A_1_TAG, pic8259_device, read, write, 0x00ff)
AM_RANGE(0x00080, 0x00081) AM_DEVREADWRITE8(I8272A_TAG, i8272a_device, mdma_r, mdma_w, 0x00ff)
// AM_RANGE(0x00100, 0x0017f) AM_DEVREADWRITE8(CRT9007_TAG, crt9007_device, read, write, 0x00ff) AM_WRITE8(addr_ctrl_w, 0xff00)
// AM_RANGE(0x00100, 0x0017f) AM_DEVREADWRITE8(CRT9007_TAG, crt9007_t, read, write, 0x00ff) AM_WRITE8(addr_ctrl_w, 0xff00)
AM_RANGE(0x00100, 0x0017f) AM_READWRITE(vpac_r, vpac_w)
// AM_RANGE(0x00180, 0x00180) AM_READ8(hires_status_r, 0x00ff)
// AM_RANGE(0x00180, 0x001bf) AM_WRITE(hires_palette_w)
@ -353,20 +353,30 @@ WRITE_LINE_MEMBER( tandy2k_state::vpac_drb_w )
m_drb1->tog_w(state);
}
static CRT9007_INTERFACE( vpac_intf )
WRITE8_MEMBER( tandy2k_state::drb_attr_w )
{
10,
DEVCB_DEVICE_LINE_MEMBER(I8259A_1_TAG, pic8259_device, ir1_w),
DEVCB_NULL, // DMAR 80186 HOLD
DEVCB_DEVICE_LINE_MEMBER(CRT9021B_TAG, crt9021_device, vsync_w), // VS
DEVCB_NULL, // HS
DEVCB_DRIVER_LINE_MEMBER(tandy2k_state, vpac_vlt_w), // VLT
DEVCB_DEVICE_LINE_MEMBER(CRT9021B_TAG, crt9021_device, cursor_w), // CURS
DEVCB_DRIVER_LINE_MEMBER(tandy2k_state, vpac_drb_w), // DRB
DEVCB_DEVICE_LINE_MEMBER(CRT9021B_TAG, crt9021_device, retbl_w), // CBLANK
DEVCB_DEVICE_LINE_MEMBER(CRT9021B_TAG, crt9021_device, slg_w), // SLG
DEVCB_DEVICE_LINE_MEMBER(CRT9021B_TAG, crt9021_device, sld_w) // SLD
};
/*
bit description
0 BLC -> DBLC
1 BKC -> DBKC
2 CHABL
3 MS0
4 MS1
5 BLINK
6 INT
7 REVID
*/
m_vac->chabl_w(BIT(data, 2));
m_vac->ms0_w(BIT(data, 3));
m_vac->ms1_w(BIT(data, 4));
m_vac->blink_w(BIT(data, 5));
m_vac->intin_w(BIT(data, 6));
m_vac->revid_w(BIT(data, 7));
}
// Intel 8251A Interface
@ -632,25 +642,29 @@ static MACHINE_CONFIG_START( tandy2k, tandy2k_state )
MCFG_SCREEN_SIZE(640, 480)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
MCFG_CRT9007_ADD(CRT9007_TAG, XTAL_16MHz*28/16, vpac_intf, vpac_mem)
MCFG_DEVICE_ADD(CRT9007_TAG, CRT9007, XTAL_16MHz*28/16)
MCFG_DEVICE_ADDRESS_MAP(AS_0, vpac_mem)
MCFG_CRT9007_CHARACTER_WIDTH(10)
MCFG_CRT9007_INT_CALLBACK(DEVWRITELINE(I8259A_1_TAG, pic8259_device, ir1_w))
//MCFG_CRT9007_DMAR_CALLBACK(80186 HOLD)
MCFG_CRT9007_VS_CALLBACK(DEVWRITELINE(CRT9021B_TAG, crt9021_t, vsync_w))
MCFG_CRT9007_VLT_CALLBACK(WRITELINE(tandy2k_state, vpac_vlt_w))
MCFG_CRT9007_CURS_CALLBACK(DEVWRITELINE(CRT9021B_TAG, crt9021_t, cursor_w))
MCFG_CRT9007_DRB_CALLBACK(WRITELINE(tandy2k_state, vpac_drb_w))
MCFG_CRT9007_CBLANK_CALLBACK(DEVWRITELINE(CRT9021B_TAG, crt9021_t, retbl_w))
MCFG_CRT9007_SLG_CALLBACK(DEVWRITELINE(CRT9021B_TAG, crt9021_t, slg_w))
MCFG_CRT9007_SLD_CALLBACK(DEVWRITELINE(CRT9021B_TAG, crt9021_t, sld_w))
MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
MCFG_DEVICE_ADD(CRT9212_0_TAG, CRT9212, 0)
// ROF
// WOF
MCFG_CRT9212_IN_REN_CB(DEVREADLINE(CRT9007_TAG, crt9007_device, vlt_r)) // REN
MCFG_CRT9212_IN_WEN_CB(DEVREADLINE(CRT9007_TAG, crt9007_device, wben_r)) // WEN
MCFG_CRT9212_IN_WEN2_CB(VCC) // WEN2
MCFG_DEVICE_ADD(CRT9212_1_TAG, CRT9212, 0)
// ROF
// WOF
MCFG_CRT9212_IN_REN_CB(DEVREADLINE(CRT9007_TAG, crt9007_device, vlt_r)) // REN
MCFG_CRT9212_IN_WEN_CB(DEVREADLINE(CRT9007_TAG, crt9007_device, wben_r)) // WEN
MCFG_CRT9212_IN_WEN2_CB(VCC) // WEN2
MCFG_DEVICE_ADD(CRT9212_0_TAG, CRT9212, XTAL_16MHz*28/16/8)
MCFG_CRT9212_DOUT_CALLBACK(DEVWRITE8(CRT9021B_TAG, crt9021_t, write))
MCFG_DEVICE_ADD(CRT9212_1_TAG, CRT9212, XTAL_16MHz*28/16/8)
MCFG_CRT9212_DOUT_CALLBACK(WRITE8(tandy2k_state, drb_attr_w))
MCFG_DEVICE_ADD(CRT9021B_TAG, CRT9021, XTAL_16MHz*28/16/8)
MCFG_CRT9021_IN_DATA_CB(DEVREAD8(CRT9212_0_TAG, crt9212_device, read)) // data
MCFG_CRT9021_IN_ATTR_CB(DEVREAD8(CRT9212_1_TAG, crt9212_device, read)) // attributes
MCFG_CRT9021_IN_ATTEN_CB(VCC)
MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
// sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")

View File

@ -41,8 +41,8 @@
class tandy2k_state : public driver_device
{
public:
tandy2k_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
tandy2k_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, I80186_TAG),
m_uart(*this, I8251A_TAG),
m_i8255a(*this, I8255A_TAG),
@ -73,10 +73,10 @@ public:
required_device<i8272a_device> m_fdc;
required_device<pic8259_device> m_pic0;
required_device<pic8259_device> m_pic1;
required_device<crt9007_device> m_vpac;
required_device<crt9212_device> m_drb0;
required_device<crt9212_device> m_drb1;
required_device<crt9021_device> m_vac;
required_device<crt9007_t> m_vpac;
required_device<crt9212_t> m_drb0;
required_device<crt9212_t> m_drb1;
required_device<crt9021_t> m_vac;
required_device<centronics_device> m_centronics;
required_device<speaker_sound_device> m_speaker;
required_device<ram_device> m_ram;
@ -115,6 +115,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( kbddat_w );
DECLARE_READ8_MEMBER( irq_callback );
DECLARE_WRITE_LINE_MEMBER( fdc_drq );
DECLARE_WRITE8_MEMBER( drb_attr_w );
/* DMA state */
UINT8 m_dma_mux;