mirror of
https://github.com/holub/mame
synced 2025-06-06 04:43:45 +03:00
Modernized the dl1416 device. (nw)
This commit is contained in:
parent
9a37cc628d
commit
617e1a3f63
@ -42,7 +42,6 @@
|
|||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "dl1416.h"
|
#include "dl1416.h"
|
||||||
#include "devlegcy.h"
|
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
@ -92,215 +91,21 @@ static const UINT16 dl1416t_segments[128] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
TYPE DEFINITIONS
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
struct dl1416_state
|
|
||||||
{
|
|
||||||
int write_enable;
|
|
||||||
int chip_enable;
|
|
||||||
int cursor_enable;
|
|
||||||
devcb_resolved_write16 update_func;
|
|
||||||
|
|
||||||
UINT16 digit_ram[4]; // holds the digit code for each position
|
|
||||||
UINT8 cursor_state[4]; // holds the cursor state for each position, 0=off, 1=on
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
INLINE FUNCTIONS
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
INLINE dl1416_state *get_safe_token(device_t *device)
|
|
||||||
{
|
|
||||||
assert(device != NULL);
|
|
||||||
assert(device->type() == DL1416B || device->type() == DL1416T);
|
|
||||||
|
|
||||||
return (dl1416_state *)downcast<dl1416_device *>(device)->token();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
DEVICE INTERFACE
|
DEVICE INTERFACE
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
static DEVICE_START( dl1416 )
|
|
||||||
{
|
|
||||||
dl1416_state *dl1416 = get_safe_token(device);
|
|
||||||
|
|
||||||
/* register for state saving */
|
|
||||||
state_save_register_item(device->machine(), "dl1416", device->tag(), 0, dl1416->chip_enable);
|
|
||||||
state_save_register_item(device->machine(), "dl1416", device->tag(), 0, dl1416->cursor_enable);
|
|
||||||
state_save_register_item(device->machine(), "dl1416", device->tag(), 0, dl1416->write_enable);
|
|
||||||
state_save_register_item_array(device->machine(), "dl1416", device->tag(), 0, dl1416->digit_ram);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static DEVICE_RESET( dl1416 )
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
UINT16 pattern;
|
|
||||||
dl1416_state *chip = get_safe_token(device);
|
|
||||||
const dl1416_interface *intf = (const dl1416_interface *)device->static_config();
|
|
||||||
/* disable all lines */
|
|
||||||
chip->chip_enable = FALSE;
|
|
||||||
chip->write_enable = FALSE;
|
|
||||||
chip->cursor_enable = FALSE;
|
|
||||||
|
|
||||||
chip->update_func.resolve(intf->update, *device);
|
|
||||||
|
|
||||||
/* randomize digit and cursor memory */
|
|
||||||
for (i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
chip->digit_ram[i] = device->machine().rand()&0x3F;
|
|
||||||
// TODO: only enable the following line if the device actually has a cursor (DL1416T and DL1416B), if DL1414 then cursor is always 0!
|
|
||||||
//chip->cursor_state[i] = ((device->machine().rand()&0xFF) >= 0x80) ? CURSOR_ON : CURSOR_OFF;
|
|
||||||
chip->cursor_state[i] = CURSOR_OFF;
|
|
||||||
pattern = dl1416t_segments[chip->digit_ram[i]];
|
|
||||||
|
|
||||||
/* If cursor for this digit position is enabled and segment is not */
|
|
||||||
/* undefined, replace digit with cursor */
|
|
||||||
if ((chip->cursor_state[i] == CURSOR_ON) && (pattern != SEG_UNDEF))
|
|
||||||
pattern = SEG_CURSOR;
|
|
||||||
|
|
||||||
/* Undefined characters are replaced by blanks */
|
|
||||||
if (pattern == SEG_UNDEF)
|
|
||||||
pattern = SEG_BLANK;
|
|
||||||
|
|
||||||
/* Call update function */
|
|
||||||
if (!chip->update_func.isnull())
|
|
||||||
chip->update_func(i, pattern);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
IMPLEMENTATION
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/* write enable, active low */
|
|
||||||
WRITE_LINE_DEVICE_HANDLER( dl1416_wr_w )
|
|
||||||
{
|
|
||||||
dl1416_state *chip = get_safe_token(device);
|
|
||||||
chip->write_enable = !state;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* chip enable, active low */
|
|
||||||
WRITE_LINE_DEVICE_HANDLER( dl1416_ce_w )
|
|
||||||
{
|
|
||||||
dl1416_state *chip = get_safe_token(device);
|
|
||||||
chip->chip_enable = !state;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* cursor enable, active low */
|
|
||||||
WRITE_LINE_DEVICE_HANDLER( dl1416_cu_w )
|
|
||||||
{
|
|
||||||
dl1416_state *chip = get_safe_token(device);
|
|
||||||
chip->cursor_enable = !state;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* data */
|
|
||||||
WRITE8_DEVICE_HANDLER( dl1416_data_w )
|
|
||||||
{
|
|
||||||
dl1416_state *chip = get_safe_token(device);
|
|
||||||
|
|
||||||
offset &= 0x03; /* A0-A1 */
|
|
||||||
data &= 0x7f; /* D0-D6 */
|
|
||||||
|
|
||||||
/* Only try to update the data if we are enabled and write is enabled */
|
|
||||||
if (chip->chip_enable && chip->write_enable)
|
|
||||||
{
|
|
||||||
/* fprintf(stderr,"DL1416 Write: Cursor: %d, Offset: %d, Data: %02X\n (%c)", chip->cursor_enable, offset, data, data); */
|
|
||||||
int i, pattern, previous_state;
|
|
||||||
|
|
||||||
if (chip->cursor_enable) /* cursor enable is set */
|
|
||||||
{
|
|
||||||
if (device->type() == DL1416B)
|
|
||||||
{
|
|
||||||
/* DL1416B uses offset to decide cursor pos to change and D0 to hold new state */
|
|
||||||
|
|
||||||
/* The cursor will be set if D0 is high and the original */
|
|
||||||
/* character restored otherwise */
|
|
||||||
previous_state = chip->cursor_state[offset];
|
|
||||||
chip->cursor_state[offset] = data & 1 ? CURSOR_ON : CURSOR_OFF;
|
|
||||||
|
|
||||||
if (previous_state != chip->cursor_state[offset])
|
|
||||||
{
|
|
||||||
pattern = dl1416t_segments[chip->digit_ram[offset]];
|
|
||||||
|
|
||||||
/* If cursor for this digit position is enabled and segment is not */
|
|
||||||
/* undefined, replace digit with cursor */
|
|
||||||
if ((chip->cursor_state[offset] == CURSOR_ON) && (pattern != SEG_UNDEF))
|
|
||||||
pattern = SEG_CURSOR;
|
|
||||||
|
|
||||||
/* Undefined characters are replaced by blanks */
|
|
||||||
if (pattern == SEG_UNDEF)
|
|
||||||
pattern = SEG_BLANK;
|
|
||||||
|
|
||||||
/* Call update function */
|
|
||||||
if (!chip->update_func.isnull())
|
|
||||||
chip->update_func(offset, pattern);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* DL1416T uses a bitmap of 4 data bits D0,D1,D2,D3 to decide cursor pos to change and new state */
|
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
/* The cursor will be set if D0-D3 is high and the original */
|
|
||||||
/* character at the appropriate position restored otherwise */
|
|
||||||
previous_state = chip->cursor_state[i];
|
|
||||||
chip->cursor_state[i] = data & (1<<i) ? CURSOR_ON : CURSOR_OFF;
|
|
||||||
|
|
||||||
if (previous_state != chip->cursor_state[i])
|
|
||||||
{
|
|
||||||
pattern = dl1416t_segments[chip->digit_ram[i]];
|
|
||||||
|
|
||||||
/* If cursor for this digit position is enabled and segment is not */
|
|
||||||
/* undefined, replace digit with cursor */
|
|
||||||
if ((chip->cursor_state[i] == CURSOR_ON) && (pattern != SEG_UNDEF))
|
|
||||||
pattern = SEG_CURSOR;
|
|
||||||
|
|
||||||
/* Undefined characters are replaced by blanks */
|
|
||||||
if (pattern == SEG_UNDEF)
|
|
||||||
pattern = SEG_BLANK;
|
|
||||||
|
|
||||||
/* Call update function */
|
|
||||||
if (!chip->update_func.isnull())
|
|
||||||
chip->update_func(i, pattern);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else /* cursor enable is not set, so standard write */
|
|
||||||
{
|
|
||||||
/* Save written value */
|
|
||||||
chip->digit_ram[offset] = data&0x3f;
|
|
||||||
|
|
||||||
/* Load segment pattern from ROM */
|
|
||||||
pattern = dl1416t_segments[data]; /** TODO: handle DL1416T vs DL1416B vs DL1414 here */
|
|
||||||
|
|
||||||
/* If cursor for this digit position is enabled and segment is not */
|
|
||||||
/* undefined, replace digit with cursor */
|
|
||||||
if ((chip->cursor_state[offset] == CURSOR_ON) && (pattern != SEG_UNDEF))
|
|
||||||
pattern = SEG_CURSOR;
|
|
||||||
|
|
||||||
/* Undefined characters are replaced by blanks */
|
|
||||||
if (pattern == SEG_UNDEF)
|
|
||||||
pattern = SEG_BLANK;
|
|
||||||
|
|
||||||
/* Call update function */
|
|
||||||
if (!chip->update_func.isnull())
|
|
||||||
chip->update_func(offset, pattern);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dl1416_device::dl1416_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
|
dl1416_device::dl1416_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
|
||||||
: device_t(mconfig, type, name, tag, owner, clock, shortname, source)
|
: device_t(mconfig, type, name, tag, owner, clock, shortname, source),
|
||||||
|
m_write_enable(FALSE),
|
||||||
|
m_chip_enable(FALSE),
|
||||||
|
m_cursor_enable(FALSE)
|
||||||
{
|
{
|
||||||
m_token = global_alloc_clear(dl1416_state);
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
m_digit_ram[i] = 0;
|
||||||
|
m_cursor_state[i] = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
@ -311,6 +116,16 @@ dl1416_device::dl1416_device(const machine_config &mconfig, device_type type, co
|
|||||||
|
|
||||||
void dl1416_device::device_config_complete()
|
void dl1416_device::device_config_complete()
|
||||||
{
|
{
|
||||||
|
// inherit a copy of the static data
|
||||||
|
const dl1416_interface *intf = reinterpret_cast<const dl1416_interface *>(static_config());
|
||||||
|
if (intf != NULL)
|
||||||
|
*static_cast<dl1416_interface *>(this) = *intf;
|
||||||
|
|
||||||
|
// or initialize to defaults if none provided
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memset(&m_update, 0, sizeof(m_update));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
@ -319,7 +134,13 @@ void dl1416_device::device_config_complete()
|
|||||||
|
|
||||||
void dl1416_device::device_start()
|
void dl1416_device::device_start()
|
||||||
{
|
{
|
||||||
DEVICE_START_NAME( dl1416 )(this);
|
/* register for state saving */
|
||||||
|
save_item(NAME(m_chip_enable));
|
||||||
|
save_item(NAME(m_cursor_enable));
|
||||||
|
save_item(NAME(m_write_enable));
|
||||||
|
save_item(NAME(m_digit_ram));
|
||||||
|
|
||||||
|
m_update_func.resolve(m_update, *this);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
@ -328,7 +149,37 @@ void dl1416_device::device_start()
|
|||||||
|
|
||||||
void dl1416_device::device_reset()
|
void dl1416_device::device_reset()
|
||||||
{
|
{
|
||||||
DEVICE_RESET_NAME( dl1416 )(this);
|
int i;
|
||||||
|
UINT16 pattern;
|
||||||
|
/* disable all lines */
|
||||||
|
m_chip_enable = FALSE;
|
||||||
|
m_write_enable = FALSE;
|
||||||
|
m_cursor_enable = FALSE;
|
||||||
|
|
||||||
|
m_update_func.resolve(m_update, *this);
|
||||||
|
|
||||||
|
/* randomize digit and cursor memory */
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
m_digit_ram[i] = machine().rand()&0x3F;
|
||||||
|
// TODO: only enable the following line if the device actually has a cursor (DL1416T and DL1416B), if DL1414 then cursor is always 0!
|
||||||
|
//m_cursor_state[i] = ((device->machine().rand()&0xFF) >= 0x80) ? CURSOR_ON : CURSOR_OFF;
|
||||||
|
m_cursor_state[i] = CURSOR_OFF;
|
||||||
|
pattern = dl1416t_segments[m_digit_ram[i]];
|
||||||
|
|
||||||
|
/* If cursor for this digit position is enabled and segment is not */
|
||||||
|
/* undefined, replace digit with cursor */
|
||||||
|
if ((m_cursor_state[i] == CURSOR_ON) && (pattern != SEG_UNDEF))
|
||||||
|
pattern = SEG_CURSOR;
|
||||||
|
|
||||||
|
/* Undefined characters are replaced by blanks */
|
||||||
|
if (pattern == SEG_UNDEF)
|
||||||
|
pattern = SEG_BLANK;
|
||||||
|
|
||||||
|
/* Call update function */
|
||||||
|
if (!m_update_func.isnull())
|
||||||
|
m_update_func(i, pattern);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -346,3 +197,121 @@ dl1416t_device::dl1416t_device(const machine_config &mconfig, const char *tag, d
|
|||||||
: dl1416_device(mconfig, DL1416T, "DL1416T", tag, owner, clock, "dl1416t", __FILE__)
|
: dl1416_device(mconfig, DL1416T, "DL1416T", tag, owner, clock, "dl1416t", __FILE__)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
IMPLEMENTATION
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/* write enable, active low */
|
||||||
|
WRITE_LINE_MEMBER( dl1416_device::wr_w )
|
||||||
|
{
|
||||||
|
m_write_enable = !state;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* chip enable, active low */
|
||||||
|
WRITE_LINE_MEMBER( dl1416_device::ce_w )
|
||||||
|
{
|
||||||
|
m_chip_enable = !state;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cursor enable, active low */
|
||||||
|
WRITE_LINE_MEMBER( dl1416_device::cu_w )
|
||||||
|
{
|
||||||
|
m_cursor_enable = !state;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* data */
|
||||||
|
WRITE8_MEMBER( dl1416_device::data_w )
|
||||||
|
{
|
||||||
|
offset &= 0x03; /* A0-A1 */
|
||||||
|
data &= 0x7f; /* D0-D6 */
|
||||||
|
|
||||||
|
/* Only try to update the data if we are enabled and write is enabled */
|
||||||
|
if (m_chip_enable && m_write_enable)
|
||||||
|
{
|
||||||
|
/* fprintf(stderr,"DL1416 Write: Cursor: %d, Offset: %d, Data: %02X\n (%c)", m_cursor_enable, offset, data, data); */
|
||||||
|
int i, pattern, previous_state;
|
||||||
|
|
||||||
|
if (m_cursor_enable) /* cursor enable is set */
|
||||||
|
{
|
||||||
|
if (type() == DL1416B)
|
||||||
|
{
|
||||||
|
/* DL1416B uses offset to decide cursor pos to change and D0 to hold new state */
|
||||||
|
|
||||||
|
/* The cursor will be set if D0 is high and the original */
|
||||||
|
/* character restored otherwise */
|
||||||
|
previous_state = m_cursor_state[offset];
|
||||||
|
m_cursor_state[offset] = data & 1 ? CURSOR_ON : CURSOR_OFF;
|
||||||
|
|
||||||
|
if (previous_state != m_cursor_state[offset])
|
||||||
|
{
|
||||||
|
pattern = dl1416t_segments[m_digit_ram[offset]];
|
||||||
|
|
||||||
|
/* If cursor for this digit position is enabled and segment is not */
|
||||||
|
/* undefined, replace digit with cursor */
|
||||||
|
if ((m_cursor_state[offset] == CURSOR_ON) && (pattern != SEG_UNDEF))
|
||||||
|
pattern = SEG_CURSOR;
|
||||||
|
|
||||||
|
/* Undefined characters are replaced by blanks */
|
||||||
|
if (pattern == SEG_UNDEF)
|
||||||
|
pattern = SEG_BLANK;
|
||||||
|
|
||||||
|
/* Call update function */
|
||||||
|
if (!m_update_func.isnull())
|
||||||
|
m_update_func(offset, pattern);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* DL1416T uses a bitmap of 4 data bits D0,D1,D2,D3 to decide cursor pos to change and new state */
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
/* The cursor will be set if D0-D3 is high and the original */
|
||||||
|
/* character at the appropriate position restored otherwise */
|
||||||
|
previous_state = m_cursor_state[i];
|
||||||
|
m_cursor_state[i] = data & (1<<i) ? CURSOR_ON : CURSOR_OFF;
|
||||||
|
|
||||||
|
if (previous_state != m_cursor_state[i])
|
||||||
|
{
|
||||||
|
pattern = dl1416t_segments[m_digit_ram[i]];
|
||||||
|
|
||||||
|
/* If cursor for this digit position is enabled and segment is not */
|
||||||
|
/* undefined, replace digit with cursor */
|
||||||
|
if ((m_cursor_state[i] == CURSOR_ON) && (pattern != SEG_UNDEF))
|
||||||
|
pattern = SEG_CURSOR;
|
||||||
|
|
||||||
|
/* Undefined characters are replaced by blanks */
|
||||||
|
if (pattern == SEG_UNDEF)
|
||||||
|
pattern = SEG_BLANK;
|
||||||
|
|
||||||
|
/* Call update function */
|
||||||
|
if (!m_update_func.isnull())
|
||||||
|
m_update_func(i, pattern);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* cursor enable is not set, so standard write */
|
||||||
|
{
|
||||||
|
/* Save written value */
|
||||||
|
m_digit_ram[offset] = data&0x3f;
|
||||||
|
|
||||||
|
/* Load segment pattern from ROM */
|
||||||
|
pattern = dl1416t_segments[data]; /** TODO: handle DL1416T vs DL1416B vs DL1414 here */
|
||||||
|
|
||||||
|
/* If cursor for this digit position is enabled and segment is not */
|
||||||
|
/* undefined, replace digit with cursor */
|
||||||
|
if ((m_cursor_state[offset] == CURSOR_ON) && (pattern != SEG_UNDEF))
|
||||||
|
pattern = SEG_CURSOR;
|
||||||
|
|
||||||
|
/* Undefined characters are replaced by blanks */
|
||||||
|
if (pattern == SEG_UNDEF)
|
||||||
|
pattern = SEG_BLANK;
|
||||||
|
|
||||||
|
/* Call update function */
|
||||||
|
if (!m_update_func.isnull())
|
||||||
|
m_update_func(offset, pattern);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
struct dl1416_interface
|
struct dl1416_interface
|
||||||
{
|
{
|
||||||
devcb_write16 update;
|
devcb_write16 m_update;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -42,29 +42,35 @@ struct dl1416_interface
|
|||||||
FUNCTION PROTOTYPES
|
FUNCTION PROTOTYPES
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
/* inputs */
|
|
||||||
WRITE_LINE_DEVICE_HANDLER( dl1416_wr_w ); /* write enable */
|
|
||||||
WRITE_LINE_DEVICE_HANDLER( dl1416_ce_w ); /* chip enable */
|
|
||||||
WRITE_LINE_DEVICE_HANDLER( dl1416_cu_w ); /* cursor enable */
|
|
||||||
DECLARE_WRITE8_DEVICE_HANDLER( dl1416_data_w );
|
|
||||||
|
|
||||||
/* device get info callback */
|
/* device get info callback */
|
||||||
class dl1416_device : public device_t
|
class dl1416_device : public device_t,
|
||||||
|
public dl1416_interface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
dl1416_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
dl1416_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||||
~dl1416_device() { global_free(m_token); }
|
~dl1416_device() {}
|
||||||
|
|
||||||
|
/* inputs */
|
||||||
|
DECLARE_WRITE_LINE_MEMBER( wr_w ); /* write enable */
|
||||||
|
DECLARE_WRITE_LINE_MEMBER( ce_w ); /* chip enable */
|
||||||
|
DECLARE_WRITE_LINE_MEMBER( cu_w ); /* cursor enable */
|
||||||
|
DECLARE_WRITE8_MEMBER( data_w );
|
||||||
|
|
||||||
// access to legacy token
|
|
||||||
void *token() const { assert(m_token != NULL); return m_token; }
|
|
||||||
protected:
|
protected:
|
||||||
// device-level overrides
|
// device-level overrides
|
||||||
virtual void device_config_complete();
|
virtual void device_config_complete();
|
||||||
virtual void device_start();
|
virtual void device_start();
|
||||||
virtual void device_reset();
|
virtual void device_reset();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// internal state
|
// internal state
|
||||||
void *m_token;
|
int m_write_enable;
|
||||||
|
int m_chip_enable;
|
||||||
|
int m_cursor_enable;
|
||||||
|
devcb_resolved_write16 m_update_func;
|
||||||
|
|
||||||
|
UINT16 m_digit_ram[4]; // holds the digit code for each position
|
||||||
|
UINT8 m_cursor_state[4]; // holds the cursor state for each position, 0=off, 1=on
|
||||||
};
|
};
|
||||||
|
|
||||||
class dl1416b_device : public dl1416_device
|
class dl1416b_device : public dl1416_device
|
||||||
|
@ -65,8 +65,8 @@ static ADDRESS_MAP_START( sitcom_io, AS_IO, 8, sitcom_state )
|
|||||||
ADDRESS_MAP_UNMAP_HIGH
|
ADDRESS_MAP_UNMAP_HIGH
|
||||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||||
// AM_RANGE(0x00, 0x1f) 8255 for expansion only
|
// AM_RANGE(0x00, 0x1f) 8255 for expansion only
|
||||||
AM_RANGE(0xc0, 0xc3) AM_DEVWRITE_LEGACY("ds0", dl1416_data_w) //left display
|
AM_RANGE(0xc0, 0xc3) AM_DEVWRITE("ds0", dl1416_device, data_w) //left display
|
||||||
AM_RANGE(0xe0, 0xe3) AM_DEVWRITE_LEGACY("ds1", dl1416_data_w) //right display
|
AM_RANGE(0xe0, 0xe3) AM_DEVWRITE("ds1", dl1416_device, data_w) //right display
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
/* Input ports */
|
/* Input ports */
|
||||||
@ -75,12 +75,12 @@ INPUT_PORTS_END
|
|||||||
|
|
||||||
void sitcom_state::machine_reset()
|
void sitcom_state::machine_reset()
|
||||||
{
|
{
|
||||||
dl1416_ce_w(m_ds0, 0); // enable
|
m_ds0->ce_w(0); // enable
|
||||||
dl1416_wr_w(m_ds0, 0);
|
m_ds0->wr_w(0);
|
||||||
dl1416_cu_w(m_ds0, 1); // no cursor
|
m_ds0->cu_w(1); // no cursor
|
||||||
dl1416_ce_w(m_ds1, 0);
|
m_ds1->ce_w(0);
|
||||||
dl1416_wr_w(m_ds1, 0);
|
m_ds1->wr_w(0);
|
||||||
dl1416_cu_w(m_ds1, 1);
|
m_ds1->cu_w(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(sitcom_state::sitcom_update_ds0)
|
WRITE16_MEMBER(sitcom_state::sitcom_update_ds0)
|
||||||
|
@ -38,7 +38,12 @@ public:
|
|||||||
m_maincpu(*this, "maincpu"),
|
m_maincpu(*this, "maincpu"),
|
||||||
m_cassette1(*this, "cassette"),
|
m_cassette1(*this, "cassette"),
|
||||||
m_cassette2(*this, "cassette2"),
|
m_cassette2(*this, "cassette2"),
|
||||||
m_ram(*this, RAM_TAG)
|
m_ram(*this, RAM_TAG),
|
||||||
|
m_ds1(*this, "ds1"),
|
||||||
|
m_ds2(*this, "ds2"),
|
||||||
|
m_ds3(*this, "ds3"),
|
||||||
|
m_ds4(*this, "ds4"),
|
||||||
|
m_ds5(*this, "ds5")
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
DECLARE_WRITE8_MEMBER(aim65_pia_a_w);
|
DECLARE_WRITE8_MEMBER(aim65_pia_a_w);
|
||||||
@ -58,6 +63,11 @@ public:
|
|||||||
required_device<cassette_image_device> m_cassette1;
|
required_device<cassette_image_device> m_cassette1;
|
||||||
required_device<cassette_image_device> m_cassette2;
|
required_device<cassette_image_device> m_cassette2;
|
||||||
required_device<ram_device> m_ram;
|
required_device<ram_device> m_ram;
|
||||||
|
required_device<dl1416_device> m_ds1;
|
||||||
|
required_device<dl1416_device> m_ds2;
|
||||||
|
required_device<dl1416_device> m_ds3;
|
||||||
|
required_device<dl1416_device> m_ds4;
|
||||||
|
required_device<dl1416_device> m_ds5;
|
||||||
virtual void machine_start();
|
virtual void machine_start();
|
||||||
TIMER_CALLBACK_MEMBER(aim65_printer_timer);
|
TIMER_CALLBACK_MEMBER(aim65_printer_timer);
|
||||||
void aim65_pia();
|
void aim65_pia();
|
||||||
@ -67,6 +77,8 @@ public:
|
|||||||
DECLARE_WRITE16_MEMBER(aim65_update_ds3);
|
DECLARE_WRITE16_MEMBER(aim65_update_ds3);
|
||||||
DECLARE_WRITE16_MEMBER(aim65_update_ds4);
|
DECLARE_WRITE16_MEMBER(aim65_update_ds4);
|
||||||
DECLARE_WRITE16_MEMBER(aim65_update_ds5);
|
DECLARE_WRITE16_MEMBER(aim65_update_ds5);
|
||||||
|
|
||||||
|
void dl1416_update(dl1416_device *device, int index);
|
||||||
|
|
||||||
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(aim65_cart);
|
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(aim65_cart);
|
||||||
};
|
};
|
||||||
|
@ -41,22 +41,21 @@
|
|||||||
* PB7: CU (Cursor)
|
* PB7: CU (Cursor)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void dl1416_update(device_t *device, int index)
|
void aim65_state::dl1416_update(dl1416_device *device, int index)
|
||||||
{
|
{
|
||||||
aim65_state *state = device->machine().driver_data<aim65_state>();
|
device->ce_w(m_pia_a & (0x04 << index));
|
||||||
dl1416_ce_w(device, state->m_pia_a & (0x04 << index));
|
device->wr_w(BIT(m_pia_a, 7));
|
||||||
dl1416_wr_w(device, BIT(state->m_pia_a, 7));
|
device->cu_w(BIT(m_pia_b, 7));
|
||||||
dl1416_cu_w(device, BIT(state->m_pia_b, 7));
|
device->data_w(generic_space(), m_pia_a & 0x03, m_pia_b & 0x7f);
|
||||||
dl1416_data_w(device, state->generic_space(), state->m_pia_a & 0x03, state->m_pia_b & 0x7f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void aim65_state::aim65_pia()
|
void aim65_state::aim65_pia()
|
||||||
{
|
{
|
||||||
dl1416_update(machine().device("ds1"), 0);
|
dl1416_update(m_ds1, 0);
|
||||||
dl1416_update(machine().device("ds2"), 1);
|
dl1416_update(m_ds2, 1);
|
||||||
dl1416_update(machine().device("ds3"), 2);
|
dl1416_update(m_ds3, 2);
|
||||||
dl1416_update(machine().device("ds4"), 3);
|
dl1416_update(m_ds4, 3);
|
||||||
dl1416_update(machine().device("ds5"), 4);
|
dl1416_update(m_ds5, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user