i8275: Replaced with new implementation. (nw)

This commit is contained in:
Curt Coder 2014-04-30 10:19:06 +00:00
parent bbfd445e15
commit 9966d6e8e5
21 changed files with 756 additions and 1484 deletions

2
.gitattributes vendored
View File

@ -3242,8 +3242,6 @@ src/emu/video/i8244.c svneol=native#text/plain
src/emu/video/i8244.h svneol=native#text/plain
src/emu/video/i8275.c svneol=native#text/plain
src/emu/video/i8275.h svneol=native#text/plain
src/emu/video/i8275x.c svneol=native#text/plain
src/emu/video/i8275x.h svneol=native#text/plain
src/emu/video/m50458.c svneol=native#text/plain
src/emu/video/m50458.h svneol=native#text/plain
src/emu/video/mb90082.c svneol=native#text/plain

File diff suppressed because it is too large Load Diff

View File

@ -1,16 +1,41 @@
/***************************************************************************
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************
INTEL 8275 Programmable CRT Controller implementation
Intel 8275 Programmable CRT Controller emulation
25-05-2008 Initial implementation [Miodrag Milanovic]
Copyright MESS team.
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
***************************************************************************/
**********************************************************************
_____ _____
LC3 1 |* \_/ | 40 Vcc
LC2 2 | | 39 LA0
LC1 3 | | 38 LA1
LC0 4 | | 37 LTEN
DRQ 5 | | 36 RVV
_DACK 6 | | 35 VSP
HRTC 7 | | 34 GPA1
VRTC 8 | | 33 GPA0
_RD 9 | | 32 HLGT
_WR 10 | 8275 | 31 IRQ
LPEN 11 | | 30 CCLK
DB0 12 | | 29 CC6
DB1 13 | | 28 CC5
DB2 14 | | 27 CC4
DB3 15 | | 26 CC3
DB4 16 | | 25 CC2
DB5 17 | | 24 CC1
DB6 18 | | 23 CC0
DB7 19 | | 22 _CS
GND 20 |_____________| 21 A0
#ifndef __I8275_VIDEO__
#define __I8275_VIDEO__
**********************************************************************/
#pragma once
#ifndef __I8275x__
#define __I8275x__
#include "emu.h"
@ -20,13 +45,26 @@
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_I8275_ADD(_tag, _intrf) \
MCFG_DEVICE_ADD(_tag, I8275, 0) \
MCFG_DEVICE_CONFIG(_intrf)
#define I8275_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int x, int y, UINT8 linecount, UINT8 charcode, UINT8 lineattr, UINT8 lten, UINT8 rvv, UINT8 vsp, UINT8 gpa, UINT8 hlgt)
#define I8275_INTERFACE(name) \
const i8275_interface (name) =
#define MCFG_I8275_CHARACTER_WIDTH(_value) \
i8275_device::static_set_character_width(*device, _value);
#define MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(_class, _method) \
i8275_device::static_set_display_callback(*device, i8275_draw_character_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
#define MCFG_I8275_DRQ_CALLBACK(_write) \
devcb = &i8275_device::set_drq_wr_callback(*device, DEVCB2_##_write);
#define MCFG_I8275_IRQ_CALLBACK(_write) \
devcb = &i8275_device::set_irq_wr_callback(*device, DEVCB2_##_write);
#define MCFG_I8275_HRTC_CALLBACK(_write) \
devcb = &i8275_device::set_hrtc_wr_callback(*device, DEVCB2_##_write);
#define MCFG_I8275_VRTC_CALLBACK(_write) \
devcb = &i8275_device::set_vrtc_wr_callback(*device, DEVCB2_##_write);
@ -34,125 +72,151 @@
// TYPE DEFINITIONS
//**************************************************************************
class i8275_device;
// ======================> i8275_display_pixels_func
typedef void (*i8275_display_pixels_func)(i8275_device *device, bitmap_rgb32 &bitmap, int x, int y, UINT8 linecount, UINT8 charcode, UINT8 lineattr, UINT8 lten, UINT8 rvv, UINT8 vsp, UINT8 gpa, UINT8 hlgt);
#define I8275_DISPLAY_PIXELS(name) void name(i8275_device *device, bitmap_rgb32 &bitmap, int x, int y, UINT8 linecount, UINT8 charcode, UINT8 lineattr, UINT8 lten, UINT8 rvv, UINT8 vsp, UINT8 gpa, UINT8 hlgt)
typedef device_delegate<void (bitmap_rgb32 &bitmap, int x, int y, UINT8 linecount, UINT8 charcode, UINT8 lineattr, UINT8 lten, UINT8 rvv, UINT8 vsp, UINT8 gpa, UINT8 hlgt)> i8275_draw_character_delegate;
// ======================> i8275_interface
// ======================> i8275_device
struct i8275_interface
{
int m_width; /* char width in pixels */
int m_char_delay; /* delay of display char */
devcb_write_line m_out_drq_cb;
devcb_write_line m_out_irq_cb;
devcb_write_line m_out_hrtc_cb;
devcb_write_line m_out_vrtc_cb;
i8275_display_pixels_func m_display_pixels_func;
};
class i8275_device : public device_t,
public device_video_interface,
public i8275_interface
class i8275_device : public device_t,
public device_video_interface
{
public:
// construction/destruction
i8275_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
static void static_set_character_width(device_t &device, int value) { downcast<i8275_device &>(device).m_hpixels_per_column = value; }
static void static_set_display_callback(device_t &device, i8275_draw_character_delegate callback) { downcast<i8275_device &>(device).m_display_cb = callback; }
template<class _Object> static devcb2_base &set_drq_wr_callback(device_t &device, _Object object) { return downcast<i8275_device &>(device).m_write_drq.set_callback(object); }
template<class _Object> static devcb2_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast<i8275_device &>(device).m_write_irq.set_callback(object); }
template<class _Object> static devcb2_base &set_hrtc_wr_callback(device_t &device, _Object object) { return downcast<i8275_device &>(device).m_write_hrtc.set_callback(object); }
template<class _Object> static devcb2_base &set_vrtc_wr_callback(device_t &device, _Object object) { return downcast<i8275_device &>(device).m_write_vrtc.set_callback(object); }
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
DECLARE_WRITE8_MEMBER( dack_w );
DECLARE_WRITE_LINE_MEMBER( lpen_w );
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
protected:
// device-level overrides
virtual void device_config_complete();
virtual void device_start();
virtual void device_reset();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
UINT8 get_parameter_light_pen(offs_t offset);
void recompute_parameters();
void set_parameter_reset(offs_t offset, UINT8 data);
void set_parameter_cursor(offs_t offset, UINT8 data);
void draw_char_line();
devcb_resolved_write_line m_out_drq_func;
devcb_resolved_write_line m_out_irq_func;
devcb_resolved_write_line m_out_hrtc_func;
devcb_resolved_write_line m_out_vrtc_func;
enum
{
TIMER_HRTC_ON,
TIMER_DRQ_ON,
TIMER_SCANLINE
};
enum
{
ST_IE = 0x40,
ST_IR = 0x20,
ST_LP = 0x10,
ST_IC = 0x08,
ST_VE = 0x04,
ST_DU = 0x02,
ST_FO = 0x01
};
enum
{
CMD_RESET = 0,
CMD_START_DISPLAY,
CMD_STOP_DISPLAY,
CMD_READ_LIGHT_PEN,
CMD_LOAD_CURSOR,
CMD_ENABLE_INTERRUPT,
CMD_DISABLE_INTERRUPT,
CMD_PRESET_COUNTERS
};
enum
{
REG_SCN1 = 0,
REG_SCN2,
REG_SCN3,
REG_SCN4,
REG_CUR_COL,
REG_CUR_ROW,
REG_LPEN_COL,
REG_LPEN_ROW,
REG_DMA
};
enum
{
CA_H = 0x01,
CA_B = 0x02,
CA_CCCC = 0x3c
};
enum
{
FAC_H = 0x01,
FAC_B = 0x02,
FAC_GG = 0x0c,
FAC_R = 0x10,
FAC_U = 0x20
};
devcb2_write_line m_write_irq;
devcb2_write_line m_write_drq;
devcb2_write_line m_write_hrtc;
devcb2_write_line m_write_vrtc;
i8275_draw_character_delegate m_display_cb;
int m_hpixels_per_column;
bitmap_rgb32 m_bitmap;
UINT8 m_status_reg; /* value of status reggister */
UINT8 m_num_of_params; /* expected number of parameters */
UINT8 m_current_command; /* command currently executing */
UINT8 m_param_type; /* parameter type */
UINT8 m_status;
UINT8 m_param[REG_DMA + 1];
int m_param_idx;
int m_param_end;
UINT8 m_cursor_col; /* current cursor column */
UINT8 m_cursor_row; /* current cursor row */
UINT8 m_buffer[2][80];
UINT8 m_fifo[2][16];
int m_buffer_idx;
int m_fifo_idx;
bool m_fifo_next;
int m_buffer_dma;
UINT8 m_light_pen_col; /* current light pen column */
UINT8 m_light_pen_row; /* current light pen row */
int m_lpen;
/* reset command parameter values*/
/* parameter 0 */
UINT8 m_rows_type;
UINT8 m_chars_per_row;
/* parameter 1 */
UINT8 m_vert_retrace_rows;
UINT8 m_rows_per_frame;
/* parameter 2 */
UINT8 m_undeline_line_num;
UINT8 m_lines_per_row;
/* parameter 3 */
UINT8 m_line_counter_mode;
UINT8 m_field_attribute_mode;
UINT8 m_cursor_format;
UINT8 m_hor_retrace_count;
int m_hlgt;
int m_vsp;
int m_gpa;
int m_rvv;
int m_lten;
/* values for start display command */
UINT8 m_burst_space_code;
UINT8 m_burst_count_code;
int m_scanline;
int m_irq_scanline;
int m_vrtc_scanline;
int m_vrtc_drq_scanline;
bool m_du;
/* buffers */
UINT8 m_row_buffer_1[80];
UINT8 m_row_buffer_2[80];
UINT8 m_row_pos;
UINT8 m_buffer_used;
int m_cursor_blink;
int m_char_blink;
UINT8 m_fifo_buffer_1[16];
UINT8 m_fifo_buffer_2[16];
UINT8 m_fifo_write;
int m_ypos;
int m_current_row;
UINT8 m_cursor_blink_cnt;
UINT8 m_char_blink_cnt;
UINT8 m_next_in_fifo;
UINT8 m_lineattr;
UINT8 m_rvv;
UINT8 m_gpa;
UINT8 m_hlgt;
UINT8 m_underline;
UINT8 m_blink;
UINT8 m_last_data;
// timers
emu_timer *m_hrtc_on_timer;
emu_timer *m_drq_on_timer;
emu_timer *m_scanline_timer;
};
// device type definition
extern ATTR_DEPRECATED const device_type I8275;
extern const device_type I8275;
#endif

View File

@ -1,573 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************
Intel 8275 Programmable CRT Controller emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
/*
TODO:
- character attributes
- double spaced rows
*/
#include "i8275x.h"
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
#define LOG 0
const int DMA_BURST_SPACING[] = { 0, 7, 15, 23, 31, 39, 47, 55 };
#define DOUBLE_SPACED_ROWS \
BIT(m_param[REG_SCN1], 7)
#define CHARACTERS_PER_ROW \
((m_param[REG_SCN1] & 0x7f) + 1)
#define VRTC_ROW_COUNT \
((m_param[REG_SCN2] >> 5) + 1)
#define CHARACTER_ROWS_PER_FRAME \
((m_param[REG_SCN2] & 0x3f) + 1)
#define UNDERLINE \
(m_param[REG_SCN3] >> 4)
#define SCANLINES_PER_ROW \
((m_param[REG_SCN3] & 0x0f) + 1)
#define OFFSET_LINE_COUNTER \
BIT(m_param[REG_SCN4], 7)
#define VISIBLE_FIELD_ATTRIBUTE \
BIT(m_param[REG_SCN4], 6)
#define CURSOR_FORMAT \
((m_param[REG_SCN4] >> 4) & 0x03)
#define HRTC_COUNT \
(((m_param[REG_SCN4] & 0x0f) + 1) * 2)
#define DMA_BURST_COUNT \
(1 << (m_param[REG_DMA] & 0x03))
#define DMA_BURST_SPACE \
DMA_BURST_SPACING[(m_param[REG_DMA] >> 2) & 0x07]
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
// device type definition
const device_type I8275x = &device_creator<i8275x_device>;
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// i8275x_device - constructor
//-------------------------------------------------
i8275x_device::i8275x_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, I8275x, "I8275", tag, owner, clock, "i8275x", __FILE__),
device_video_interface(mconfig, *this),
m_write_irq(*this),
m_write_drq(*this),
m_write_hrtc(*this),
m_write_vrtc(*this),
m_status(0),
m_param_idx(0),
m_param_end(0),
m_buffer_idx(0),
m_fifo_next(false),
m_buffer_dma(0),
m_lpen(0),
m_hlgt(0),
m_vsp(0),
m_gpa(0),
m_rvv(0),
m_lten(0),
m_scanline(0),
m_du(false),
m_cursor_blink(0),
m_char_blink(0)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void i8275x_device::device_start()
{
// get the screen device
m_screen->register_screen_bitmap(m_bitmap);
// resolve callbacks
m_display_cb.bind_relative_to(*owner());
m_write_drq.resolve_safe();
m_write_irq.resolve_safe();
m_write_hrtc.resolve_safe();
m_write_vrtc.resolve_safe();
// allocate timers
m_hrtc_on_timer = timer_alloc(TIMER_HRTC_ON);
m_drq_on_timer = timer_alloc(TIMER_DRQ_ON);
m_scanline_timer = timer_alloc(TIMER_SCANLINE);
// state saving
save_item(NAME(m_status));
save_item(NAME(m_param));
save_item(NAME(m_param_idx));
save_item(NAME(m_param_end));
save_item(NAME(m_buffer[0]));
save_item(NAME(m_buffer[1]));
save_item(NAME(m_buffer_idx));
save_item(NAME(m_fifo_idx));
save_item(NAME(m_fifo_next));
save_item(NAME(m_buffer_dma));
save_item(NAME(m_lpen));
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void i8275x_device::device_reset()
{
memset(m_buffer, 0, sizeof(m_buffer));
m_status &= ~ST_IE;
m_write_irq(CLEAR_LINE);
}
//-------------------------------------------------
// device_timer - handle timer events
//-------------------------------------------------
void i8275x_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
//int y = m_screen->vpos();
//int x = m_screen->hpos();
int rc = m_scanline / SCANLINES_PER_ROW;
int lc = m_scanline % SCANLINES_PER_ROW;
switch (id)
{
case TIMER_HRTC_ON:
//if (LOG) logerror("I8275 '%s' y %u x %u HRTC 1\n", tag(), y, x);
m_write_hrtc(1);
break;
case TIMER_DRQ_ON:
//if (LOG) logerror("I8275 '%s' y %u x %u DRQ 1\n", tag(), y, x);
m_write_drq(1);
break;
case TIMER_SCANLINE:
if (!(m_status & ST_VE)) break;
//if (LOG) logerror("I8275 '%s' y %u x %u HRTC 0\n", tag(), y, x);
m_write_hrtc(0);
if (m_scanline == 0)
{
//if (LOG) logerror("I8275 '%s' y %u x %u VRTC 0\n", tag(), y, x);
m_write_vrtc(0);
}
else if (m_scanline == m_irq_scanline)
{
if (m_status & ST_IE)
{
//if (LOG) logerror("I8275 '%s' y %u x %u IRQ 1\n", tag(), y, x);
m_status |= ST_IR;
m_write_irq(ASSERT_LINE);
}
}
else if (m_scanline == m_vrtc_scanline)
{
//if (LOG) logerror("I8275 '%s' y %u x %u VRTC 1\n", tag(), y, x);
m_write_vrtc(1);
// reset field attributes
m_hlgt = 0;
m_vsp = 0;
m_gpa = 0;
m_rvv = 0,
m_lten = 0;
m_du = false;
m_cursor_blink++;
m_cursor_blink &= 0x1f;
m_char_blink++;
m_char_blink &= 0x3f;
}
if (lc == 0)
{
if ((m_scanline < m_vrtc_scanline - SCANLINES_PER_ROW) && (m_buffer_idx < CHARACTERS_PER_ROW) && !m_du)
{
m_status |= ST_DU;
m_du = true;
//if (LOG) logerror("I8275 '%s' y %u x %u DMA Underrun\n", tag(), y, x);
m_write_drq(0);
}
// swap line buffers
m_buffer_dma = !m_buffer_dma;
m_buffer_idx = 0;
m_fifo_idx = 0;
if ((!m_du && (m_scanline < m_vrtc_scanline - SCANLINES_PER_ROW)) || (m_scanline == m_vrtc_drq_scanline))
{
// start DMA burst
m_drq_on_timer->adjust(clocks_to_attotime(DMA_BURST_SPACE));
}
}
if (m_scanline < m_vrtc_scanline)
{
int line_counter = OFFSET_LINE_COUNTER ? ((lc - 1) % SCANLINES_PER_ROW) : lc;
for (int sx = 0; sx < CHARACTERS_PER_ROW; sx++)
{
int m_lineattr = 0;
int lten = 0;
int vsp = 0;
UINT8 data = m_buffer[!m_buffer_dma][sx];
if (data & 0x80)
{
if ((data & 0xc0) == 0x80)
{
// field attribute code
m_hlgt = (data & FAC_H) ? 1 : 0;
m_vsp = (data & FAC_B) ? 1 : 0;
m_gpa = (data & FAC_GG) >> 2;
m_rvv = (data & FAC_R) ? 1 : 0;
m_lten = (data & FAC_U) ? 1 : 0;
if (!VISIBLE_FIELD_ATTRIBUTE)
{
int fifo_idx = 0;
data = m_fifo[!m_buffer_dma][fifo_idx];
fifo_idx++;
fifo_idx &= 0xf;
}
else
{
vsp = 1;
}
}
else
{
// character attribute code
}
}
if (!vsp && m_vsp)
{
vsp = (m_char_blink < 32) ? 1 : 0;
}
if ((rc == m_param[REG_CUR_ROW]) && (sx == m_param[REG_CUR_COL]))
{
int vis = 1;
if (!(CURSOR_FORMAT & 0x02))
{
vis = (m_cursor_blink < 16) ? 1 : 0;
}
if (CURSOR_FORMAT & 0x01)
{
lten = (lc == UNDERLINE) ? vis : 0;
}
else
{
lten = vis;
}
}
if (!m_display_cb.isnull())
m_display_cb(m_bitmap,
sx * m_hpixels_per_column, // x position on screen of starting point
m_scanline, // y position on screen
line_counter, // current line of char
(data & 0x7f), // char code to be displayed
m_lineattr, // line attribute code
lten | m_lten, // light enable signal
m_rvv, // reverse video signal
vsp, // video suppression
m_gpa, // general purpose attribute code
m_hlgt // highlight
);
}
}
m_scanline++;
m_scanline %= ((CHARACTER_ROWS_PER_FRAME + VRTC_ROW_COUNT) * SCANLINES_PER_ROW);
break;
}
}
//-------------------------------------------------
// read -
//-------------------------------------------------
READ8_MEMBER( i8275x_device::read )
{
UINT8 data = 0;
if (offset & 0x01)
{
data = m_status;
if (m_status & ST_IR)
{
//if (LOG) logerror("I8275 '%s' IRQ 0\n", tag());
m_write_irq(CLEAR_LINE);
}
m_status &= ~(ST_IR | ST_LP | ST_IC | ST_DU | ST_FO);
}
else
{
data = m_param[m_param_idx];
m_param_idx++;
if (m_param_idx > m_param_end)
{
m_status |= ST_IC;
}
}
return data;
}
//-------------------------------------------------
// write -
//-------------------------------------------------
WRITE8_MEMBER( i8275x_device::write )
{
if (offset & 0x01)
{
if (LOG) logerror("I8275 '%s' Command %02x\n", tag(), data);
switch (data >> 5)
{
case CMD_RESET:
if (LOG) logerror("I8275 '%s' Reset\n", tag());
m_status &= ~ST_IE;
if (LOG) logerror("I8275 '%s' IRQ 0\n", tag());
m_write_irq(CLEAR_LINE);
m_write_drq(0);
m_param_idx = REG_SCN1;
m_param_end = REG_SCN4;
break;
case CMD_START_DISPLAY:
{
m_param[REG_DMA] = data;
if (LOG) logerror("I8275 '%s' Start Display %u %u\n", tag(), DMA_BURST_COUNT, DMA_BURST_SPACE);
m_status |= (ST_IE | ST_VE);
}
break;
case CMD_STOP_DISPLAY:
if (LOG) logerror("I8275 '%s' Stop Display\n", tag());
m_status &= ~ST_VE;
break;
case CMD_READ_LIGHT_PEN:
if (LOG) logerror("I8275 '%s' Read Light Pen\n", tag());
m_param_idx = REG_LPEN_COL;
m_param_end = REG_LPEN_ROW;
break;
case CMD_LOAD_CURSOR:
if (LOG) logerror("I8275 '%s' Load Cursor\n", tag());
m_param_idx = REG_CUR_COL;
m_param_end = REG_CUR_ROW;
break;
case CMD_ENABLE_INTERRUPT:
if (LOG) logerror("I8275 '%s' Enable Interrupt\n", tag());
m_status |= ST_IE;
break;
case CMD_DISABLE_INTERRUPT:
if (LOG) logerror("I8275 '%s' Disable Interrupt\n", tag());
m_status &= ~ST_IE;
break;
case CMD_PRESET_COUNTERS:
if (LOG) logerror("I8275 '%s' Preset Counters\n", tag());
m_scanline = 0;
break;
}
}
else
{
if (LOG) logerror("I8275 '%s' Parameter %02x\n", tag(), data);
m_param[m_param_idx] = data;
if (m_param_idx == REG_SCN4)
{
recompute_parameters();
}
m_param_idx++;
}
}
//-------------------------------------------------
// dack_w -
//-------------------------------------------------
WRITE8_MEMBER( i8275x_device::dack_w )
{
//int y = m_screen->vpos();
//int x = m_screen->hpos();
//if (LOG) logerror("I8275 '%s' y %u x %u DACK %04x:%02x %u\n", tag(), y, x, offset, data, m_buffer_idx);
m_write_drq(0);
if (m_fifo_next)
{
if (m_fifo_idx == 16)
{
m_fifo_idx = 0;
m_status |= ST_FO;
}
m_fifo[m_buffer_dma][m_fifo_idx++] = data;
m_fifo_next = false;
}
else
{
m_buffer[m_buffer_dma][m_buffer_idx++] = data;
if (!VISIBLE_FIELD_ATTRIBUTE && ((data & 0xc0) == 0x80))
{
m_fifo_next = true;
}
if (m_buffer_idx == CHARACTERS_PER_ROW)
{
// stop DMA
}
else if (!(m_buffer_idx % DMA_BURST_COUNT))
{
m_drq_on_timer->adjust(clocks_to_attotime(DMA_BURST_SPACE));
}
else
{
m_drq_on_timer->adjust(attotime::zero);
}
}
}
//-------------------------------------------------
// lpen_w -
//-------------------------------------------------
WRITE_LINE_MEMBER( i8275x_device::lpen_w )
{
if (!m_lpen && state)
{
m_param[REG_LPEN_COL] = m_screen->hpos() / m_hpixels_per_column;
m_param[REG_LPEN_ROW] = m_screen->vpos() / SCANLINES_PER_ROW;
m_status |= ST_LP;
}
m_lpen = state;
}
//-------------------------------------------------
// screen_update -
//-------------------------------------------------
UINT32 i8275x_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
if (!(m_status & ST_VE))
{
m_bitmap.fill(rgb_t::black);
}
copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
return 0;
}
//-------------------------------------------------
// recompute_parameters -
//-------------------------------------------------
void i8275x_device::recompute_parameters()
{
int y = m_screen->vpos();
int horiz_pix_total = (CHARACTERS_PER_ROW + HRTC_COUNT) * m_hpixels_per_column;
int vert_pix_total = (CHARACTER_ROWS_PER_FRAME + VRTC_ROW_COUNT) * SCANLINES_PER_ROW;
attoseconds_t refresh = m_screen->frame_period().attoseconds;
int max_visible_x = (CHARACTERS_PER_ROW * m_hpixels_per_column) - 1;
int max_visible_y = (CHARACTER_ROWS_PER_FRAME * SCANLINES_PER_ROW) - 1;
if (LOG) logerror("width %u height %u max_x %u max_y %u refresh %f\n", horiz_pix_total, vert_pix_total, max_visible_x, max_visible_y, 1 / ATTOSECONDS_TO_DOUBLE(refresh));
rectangle visarea;
visarea.set(0, max_visible_x, 0, max_visible_y);
m_screen->configure(horiz_pix_total, vert_pix_total, visarea, refresh);
int hrtc_on_pos = CHARACTERS_PER_ROW * m_hpixels_per_column;
m_hrtc_on_timer->adjust(m_screen->time_until_pos(y, hrtc_on_pos), 0, m_screen->scan_period());
m_irq_scanline = (CHARACTER_ROWS_PER_FRAME - 1) * SCANLINES_PER_ROW;
m_vrtc_scanline = CHARACTER_ROWS_PER_FRAME * SCANLINES_PER_ROW;
m_vrtc_drq_scanline = vert_pix_total - SCANLINES_PER_ROW;
if (LOG) logerror("irq_y %u vrtc_y %u drq_y %u\n", m_irq_scanline, m_vrtc_scanline, m_vrtc_drq_scanline);
m_scanline_timer->adjust(m_screen->time_until_pos(0, 0), 0, m_screen->scan_period());
}

View File

@ -1,222 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************
Intel 8275 Programmable CRT Controller emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************
_____ _____
LC3 1 |* \_/ | 40 Vcc
LC2 2 | | 39 LA0
LC1 3 | | 38 LA1
LC0 4 | | 37 LTEN
DRQ 5 | | 36 RVV
_DACK 6 | | 35 VSP
HRTC 7 | | 34 GPA1
VRTC 8 | | 33 GPA0
_RD 9 | | 32 HLGT
_WR 10 | 8275 | 31 IRQ
LPEN 11 | | 30 CCLK
DB0 12 | | 29 CC6
DB1 13 | | 28 CC5
DB2 14 | | 27 CC4
DB3 15 | | 26 CC3
DB4 16 | | 25 CC2
DB5 17 | | 24 CC1
DB6 18 | | 23 CC0
DB7 19 | | 22 _CS
GND 20 |_____________| 21 A0
**********************************************************************/
#pragma once
#ifndef __I8275x__
#define __I8275x__
#include "emu.h"
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define I8275_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int x, int y, UINT8 linecount, UINT8 charcode, UINT8 lineattr, UINT8 lten, UINT8 rvv, UINT8 vsp, UINT8 gpa, UINT8 hlgt)
#define MCFG_I8275_CHARACTER_WIDTH(_value) \
i8275x_device::static_set_character_width(*device, _value);
#define MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(_class, _method) \
i8275x_device::static_set_display_callback(*device, i8275_draw_character_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
#define MCFG_I8275_DRQ_CALLBACK(_write) \
devcb = &i8275x_device::set_drq_wr_callback(*device, DEVCB2_##_write);
#define MCFG_I8275_IRQ_CALLBACK(_write) \
devcb = &i8275x_device::set_irq_wr_callback(*device, DEVCB2_##_write);
#define MCFG_I8275_HRTC_CALLBACK(_write) \
devcb = &i8275x_device::set_hrtc_wr_callback(*device, DEVCB2_##_write);
#define MCFG_I8275_VRTC_CALLBACK(_write) \
devcb = &i8275x_device::set_vrtc_wr_callback(*device, DEVCB2_##_write);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
typedef device_delegate<void (bitmap_rgb32 &bitmap, int x, int y, UINT8 linecount, UINT8 charcode, UINT8 lineattr, UINT8 lten, UINT8 rvv, UINT8 vsp, UINT8 gpa, UINT8 hlgt)> i8275_draw_character_delegate;
// ======================> i8275x_device
class i8275x_device : public device_t,
public device_video_interface
{
public:
// construction/destruction
i8275x_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
static void static_set_character_width(device_t &device, int value) { downcast<i8275x_device &>(device).m_hpixels_per_column = value; }
static void static_set_display_callback(device_t &device, i8275_draw_character_delegate callback) { downcast<i8275x_device &>(device).m_display_cb = callback; }
template<class _Object> static devcb2_base &set_drq_wr_callback(device_t &device, _Object object) { return downcast<i8275x_device &>(device).m_write_drq.set_callback(object); }
template<class _Object> static devcb2_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast<i8275x_device &>(device).m_write_irq.set_callback(object); }
template<class _Object> static devcb2_base &set_hrtc_wr_callback(device_t &device, _Object object) { return downcast<i8275x_device &>(device).m_write_hrtc.set_callback(object); }
template<class _Object> static devcb2_base &set_vrtc_wr_callback(device_t &device, _Object object) { return downcast<i8275x_device &>(device).m_write_vrtc.set_callback(object); }
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
DECLARE_WRITE8_MEMBER( dack_w );
DECLARE_WRITE_LINE_MEMBER( lpen_w );
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
void recompute_parameters();
enum
{
TIMER_HRTC_ON,
TIMER_DRQ_ON,
TIMER_SCANLINE
};
enum
{
ST_IE = 0x40,
ST_IR = 0x20,
ST_LP = 0x10,
ST_IC = 0x08,
ST_VE = 0x04,
ST_DU = 0x02,
ST_FO = 0x01
};
enum
{
CMD_RESET = 0,
CMD_START_DISPLAY,
CMD_STOP_DISPLAY,
CMD_READ_LIGHT_PEN,
CMD_LOAD_CURSOR,
CMD_ENABLE_INTERRUPT,
CMD_DISABLE_INTERRUPT,
CMD_PRESET_COUNTERS
};
enum
{
REG_SCN1 = 0,
REG_SCN2,
REG_SCN3,
REG_SCN4,
REG_CUR_COL,
REG_CUR_ROW,
REG_LPEN_COL,
REG_LPEN_ROW,
REG_DMA
};
enum
{
CA_H = 0x01,
CA_B = 0x02,
CA_CCCC = 0x3c
};
enum
{
FAC_H = 0x01,
FAC_B = 0x02,
FAC_GG = 0x0c,
FAC_R = 0x10,
FAC_U = 0x20
};
devcb2_write_line m_write_irq;
devcb2_write_line m_write_drq;
devcb2_write_line m_write_hrtc;
devcb2_write_line m_write_vrtc;
i8275_draw_character_delegate m_display_cb;
int m_hpixels_per_column;
bitmap_rgb32 m_bitmap;
UINT8 m_status;
UINT8 m_param[REG_DMA + 1];
int m_param_idx;
int m_param_end;
UINT8 m_buffer[2][80];
UINT8 m_fifo[2][16];
int m_buffer_idx;
int m_fifo_idx;
bool m_fifo_next;
int m_buffer_dma;
int m_lpen;
int m_hlgt;
int m_vsp;
int m_gpa;
int m_rvv;
int m_lten;
int m_scanline;
int m_irq_scanline;
int m_vrtc_scanline;
int m_vrtc_drq_scanline;
bool m_du;
int m_cursor_blink;
int m_char_blink;
// timers
emu_timer *m_hrtc_on_timer;
emu_timer *m_drq_on_timer;
emu_timer *m_scanline_timer;
};
// device type definition
extern const device_type I8275x;
#endif

View File

@ -292,12 +292,10 @@ endif
#-------------------------------------------------
#
#@src/emu/video/i8275.h,VIDEOS += I8275
#@src/emu/video/i8275x.h,VIDEOS += I8275
#-------------------------------------------------
ifneq ($(filter I8275,$(VIDEOS)),)
VIDEOOBJS+= $(VIDEOOBJ)/i8275.o \
$(VIDEOOBJ)/i8275x.o
VIDEOOBJS+= $(VIDEOOBJ)/i8275.o
endif
#-------------------------------------------------

View File

@ -44,7 +44,7 @@ static ADDRESS_MAP_START(apogee_mem, AS_PROGRAM, 8, apogee_state )
AM_RANGE( 0xec00, 0xec03 ) AM_DEVREADWRITE("pit8253", pit8253_device, read, write) AM_MIRROR(0x00fc)
AM_RANGE( 0xed00, 0xed03 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x00fc)
//AM_RANGE( 0xee00, 0xee03 ) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) AM_MIRROR(0x00fc)
AM_RANGE( 0xef00, 0xef01 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x00fe) // video
AM_RANGE( 0xef00, 0xef01 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x00fe) // video
AM_RANGE( 0xf000, 0xf0ff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf000, 0xffff ) AM_ROM // System ROM
ADDRESS_MAP_END
@ -241,14 +241,14 @@ static MACHINE_CONFIG_START( apogee, apogee_state )
//MCFG_DEVICE_ADD("ppi8255_2", I8255, 0)
MCFG_DEVICE_ADD("i8275", I8275x, XTAL_16MHz / 12)
MCFG_DEVICE_ADD("i8275", I8275, XTAL_16MHz / 12)
MCFG_I8275_CHARACTER_WIDTH(6)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(apogee_state, display_pixels)
MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma8257",i8257n_device, dreq2_w))
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275x_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275_device, screen_update)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_SIZE(78*6, 30*10)
MCFG_SCREEN_VISIBLE_AREA(0, 78*6-1, 0, 30*10-1)
@ -268,7 +268,7 @@ static MACHINE_CONFIG_START( apogee, apogee_state )
MCFG_I8257_OUT_HRQ_CB(WRITELINE(radio86_state, hrq_w))
MCFG_I8257_IN_MEMR_CB(READ8(radio86_state, memory_read_byte))
MCFG_I8257_OUT_MEMW_CB(WRITE8(radio86_state, memory_write_byte))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275x_device, dack_w))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275_device, dack_w))
MCFG_I8257_REVERSE_RW_MODE(1)
MCFG_CASSETTE_ADD( "cassette", apogee_cassette_interface )

View File

@ -32,6 +32,7 @@ public:
DECLARE_READ8_MEMBER(ipds_c0_r);
DECLARE_WRITE8_MEMBER(ipds_b1_w);
DECLARE_WRITE8_MEMBER(kbd_put);
I8275_DRAW_CHARACTER_MEMBER( crtc_display_pixels );
UINT8 m_term_data;
virtual void machine_reset();
};
@ -79,12 +80,11 @@ void ipds_state::machine_reset()
{
}
static I8275_DISPLAY_PIXELS(ipds_display_pixels)
I8275_DRAW_CHARACTER_MEMBER( ipds_state::crtc_display_pixels )
{
int i;
ipds_state *state = device->machine().driver_data<ipds_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
UINT8 *charmap = state->memregion("chargen")->base();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 *charmap = memregion("chargen")->base();
UINT8 pixels = charmap[(linecount & 7) + (charcode << 3)] ^ 0xff;
if (vsp)
@ -100,17 +100,6 @@ static I8275_DISPLAY_PIXELS(ipds_display_pixels)
bitmap.pix32(y, x + i) = palette[(pixels >> (5-i)) & 1 ? (hlgt ? 2 : 1) : 0];
}
const i8275_interface ipds_i8275_interface =
{
6,
0,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
ipds_display_pixels
};
/* F4 Character Displayer */
static const gfx_layout ipds_charlayout =
{
@ -151,7 +140,10 @@ static MACHINE_CONFIG_START( ipds, ipds_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", ipds)
MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
MCFG_I8275_ADD ( "i8275", ipds_i8275_interface)
MCFG_DEVICE_ADD("i8275", I8275, XTAL_19_6608MHz / 4)
MCFG_I8275_CHARACTER_WIDTH(6)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(ipds_state, crtc_display_pixels)
MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0)
MCFG_GENERIC_KEYBOARD_CB(WRITE8(ipds_state, kbd_put))
MACHINE_CONFIG_END

View File

@ -474,7 +474,7 @@ static MACHINE_CONFIG_START( mm1, mm1_state )
MCFG_I8237_OUT_MEMW_CB(WRITE8(mm1_state, write))
MCFG_I8237_IN_IOR_2_CB(READ8(mm1_state, mpsc_dack_r))
MCFG_I8237_IN_IOR_3_CB(DEVREAD8(UPD765_TAG, upd765_family_device, mdma_r))
MCFG_I8237_OUT_IOW_0_CB(DEVWRITE8(I8275_TAG, i8275x_device, dack_w))
MCFG_I8237_OUT_IOW_0_CB(DEVWRITE8(I8275_TAG, i8275_device, dack_w))
MCFG_I8237_OUT_IOW_1_CB(WRITE8(mm1_state, mpsc_dack_w))
MCFG_I8237_OUT_IOW_3_CB(DEVWRITE8(UPD765_TAG, upd765_family_device, mdma_w))
MCFG_I8237_OUT_DACK_3_CB(WRITELINE(mm1_state, dack3_w))

View File

@ -34,7 +34,7 @@ static ADDRESS_MAP_START(mikrosha_mem, AS_PROGRAM, 8, mikrosha_state )
AM_RANGE( 0x8000, 0xbfff ) AM_READ(radio_cpu_state_r) // Not connected
AM_RANGE( 0xc000, 0xc003 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x07fc)
AM_RANGE( 0xc800, 0xc803 ) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) AM_MIRROR(0x07fc)
AM_RANGE( 0xd000, 0xd001 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x07fe) // video
AM_RANGE( 0xd000, 0xd001 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x07fe) // video
AM_RANGE( 0xd800, 0xd803 ) AM_DEVREADWRITE("pit8253", pit8253_device, read, write) AM_MIRROR(0x07fc) // Timer
AM_RANGE( 0xe000, 0xf7ff ) AM_READ(radio_cpu_state_r) // Not connected
AM_RANGE( 0xf800, 0xffff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
@ -211,7 +211,7 @@ static MACHINE_CONFIG_START( mikrosha, mikrosha_state )
MCFG_DEVICE_ADD("ppi8255_2", I8255, 0)
MCFG_I8255_OUT_PORTB_CB(WRITE8(radio86_state, mikrosha_8255_font_page_w))
MCFG_DEVICE_ADD("i8275", I8275x, XTAL_16MHz / 12)
MCFG_DEVICE_ADD("i8275", I8275, XTAL_16MHz / 12)
MCFG_I8275_CHARACTER_WIDTH(6)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(mikrosha_state, display_pixels)
MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma8257",i8257n_device, dreq2_w))
@ -224,7 +224,7 @@ static MACHINE_CONFIG_START( mikrosha, mikrosha_state )
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275x_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275_device, screen_update)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_SIZE(78*6, 30*10)
MCFG_SCREEN_VISIBLE_AREA(0, 78*6-1, 0, 30*10-1)
@ -241,7 +241,7 @@ static MACHINE_CONFIG_START( mikrosha, mikrosha_state )
MCFG_I8257_OUT_HRQ_CB(WRITELINE(radio86_state, hrq_w))
MCFG_I8257_IN_MEMR_CB(READ8(radio86_state, memory_read_byte))
MCFG_I8257_OUT_MEMW_CB(WRITE8(radio86_state, memory_write_byte))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275x_device, dack_w))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275_device, dack_w))
MCFG_I8257_REVERSE_RW_MODE(1)
MCFG_CASSETTE_ADD( "cassette", mikrosha_cassette_interface )

View File

@ -30,7 +30,7 @@ static ADDRESS_MAP_START(partner_mem, AS_PROGRAM, 8, partner_state )
AM_RANGE( 0xc000, 0xc7ff ) AM_RAMBANK("bank8")
AM_RANGE( 0xc800, 0xcfff ) AM_RAMBANK("bank9")
AM_RANGE( 0xd000, 0xd7ff ) AM_RAMBANK("bank10")
AM_RANGE( 0xd800, 0xd8ff ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) // video
AM_RANGE( 0xd800, 0xd8ff ) AM_DEVREADWRITE("i8275", i8275_device, read, write) // video
AM_RANGE( 0xd900, 0xd9ff ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write)
AM_RANGE( 0xda00, 0xdaff ) AM_WRITE(partner_mem_page_w)
AM_RANGE( 0xdb00, 0xdbff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
@ -183,14 +183,14 @@ static MACHINE_CONFIG_START( partner, partner_state )
MCFG_I8255_IN_PORTC_CB(READ8(radio86_state, radio86_8255_portc_r2))
MCFG_I8255_OUT_PORTC_CB(WRITE8(radio86_state, radio86_8255_portc_w2))
MCFG_DEVICE_ADD("i8275", I8275x, XTAL_16MHz / 12)
MCFG_DEVICE_ADD("i8275", I8275, XTAL_16MHz / 12)
MCFG_I8275_CHARACTER_WIDTH(6)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(partner_state, display_pixels)
MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma8257",i8257n_device, dreq2_w))
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275x_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275_device, screen_update)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_SIZE(78*6, 30*10)
MCFG_SCREEN_VISIBLE_AREA(0, 78*6-1, 0, 30*10-1)
@ -209,7 +209,7 @@ static MACHINE_CONFIG_START( partner, partner_state )
MCFG_I8257_OUT_MEMW_CB(WRITE8(radio86_state, memory_write_byte))
MCFG_I8257_IN_IOR_0_CB(DEVREAD8("wd1793", fd1793_t, data_r))
MCFG_I8257_OUT_IOW_0_CB(DEVWRITE8("wd1793", fd1793_t, data_w))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275x_device, dack_w))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275_device, dack_w))
MCFG_I8257_REVERSE_RW_MODE(1)
MCFG_CASSETTE_ADD( "cassette", partner_cassette_interface )

View File

@ -22,7 +22,7 @@ static ADDRESS_MAP_START(radio86_mem, AS_PROGRAM, 8, radio86_state )
AM_RANGE( 0x1000, 0x7fff ) AM_RAM // RAM
AM_RANGE( 0x8000, 0x8003 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x1ffc)
//AM_RANGE( 0xa000, 0xa003 ) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) AM_MIRROR(0x1ffc)
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xe000, 0xffff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf000, 0xffff ) AM_ROM // System ROM
ADDRESS_MAP_END
@ -42,7 +42,7 @@ static ADDRESS_MAP_START(radio86rom_mem, AS_PROGRAM, 8, radio86_state )
AM_RANGE( 0x1000, 0x7fff ) AM_RAM // RAM
AM_RANGE( 0x8000, 0x8003 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x1ffc)
AM_RANGE( 0xa000, 0xa003 ) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) AM_MIRROR(0x1ffc)
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xe000, 0xffff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf000, 0xffff ) AM_ROM // System ROM
ADDRESS_MAP_END
@ -53,7 +53,7 @@ static ADDRESS_MAP_START(radio86ram_mem, AS_PROGRAM, 8, radio86_state )
AM_RANGE( 0xe000, 0xe7ff ) AM_ROM // System ROM page 2
AM_RANGE( 0xe800, 0xf5ff ) AM_RAM // RAM
AM_RANGE( 0xf700, 0xf703 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write)
AM_RANGE( 0xf780, 0xf7bf ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) // video
AM_RANGE( 0xf780, 0xf7bf ) AM_DEVREADWRITE("i8275", i8275_device, read, write) // video
AM_RANGE( 0xf684, 0xf687 ) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write)
AM_RANGE( 0xf688, 0xf688 ) AM_WRITE(radio86_pagesel )
AM_RANGE( 0xf800, 0xffff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
@ -67,7 +67,7 @@ static ADDRESS_MAP_START(radio86_16_mem, AS_PROGRAM, 8, radio86_state )
AM_RANGE( 0x4000, 0x7fff ) AM_READ(radio_cpu_state_r)
AM_RANGE( 0x8000, 0x8003 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x1ffc)
//AM_RANGE( 0xa000, 0xa003 ) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) AM_MIRROR(0x1ffc)
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xe000, 0xffff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf000, 0xffff ) AM_ROM // System ROM
ADDRESS_MAP_END
@ -78,7 +78,7 @@ static ADDRESS_MAP_START(mikron2_mem, AS_PROGRAM, 8, radio86_state )
AM_RANGE( 0x1000, 0x7fff ) AM_RAM // RAM
AM_RANGE( 0xc000, 0xc003 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x00fc)
//AM_RANGE( 0xc100, 0xc103 ) AM_DEVREADWRITE_LEGACY("ppi8255_2", i8255a_r, i8255a_w) AM_MIRROR(0x00fc)
AM_RANGE( 0xc200, 0xc201 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x00fe) // video
AM_RANGE( 0xc200, 0xc201 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x00fe) // video
AM_RANGE( 0xc300, 0xc3ff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf000, 0xffff ) AM_ROM // System ROM
ADDRESS_MAP_END
@ -88,7 +88,7 @@ static ADDRESS_MAP_START(impuls03_mem, AS_PROGRAM, 8, radio86_state )
AM_RANGE( 0x1000, 0x7fff ) AM_RAM // RAM
AM_RANGE( 0x8000, 0x8003 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x1ffc)
AM_RANGE( 0xa000, 0xbfff ) AM_ROM // Basic ROM
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xe000, 0xffff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf000, 0xffff ) AM_ROM // System ROM
ADDRESS_MAP_END
@ -358,14 +358,14 @@ static MACHINE_CONFIG_START( radio86, radio86_state )
MCFG_I8255_IN_PORTC_CB(READ8(radio86_state, radio86_8255_portc_r2))
MCFG_I8255_OUT_PORTC_CB(WRITE8(radio86_state, radio86_8255_portc_w2))
MCFG_DEVICE_ADD("i8275", I8275x, XTAL_16MHz / 12)
MCFG_DEVICE_ADD("i8275", I8275, XTAL_16MHz / 12)
MCFG_I8275_CHARACTER_WIDTH(6)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(radio86_state, display_pixels)
MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma8257",i8257n_device, dreq2_w))
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275x_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275_device, screen_update)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_SIZE(78*6, 30*10)
MCFG_SCREEN_VISIBLE_AREA(0, 78*6-1, 0, 30*10-1)
@ -381,7 +381,7 @@ static MACHINE_CONFIG_START( radio86, radio86_state )
MCFG_I8257_OUT_HRQ_CB(WRITELINE(radio86_state, hrq_w))
MCFG_I8257_IN_MEMR_CB(READ8(radio86_state, memory_read_byte))
MCFG_I8257_OUT_MEMW_CB(WRITE8(radio86_state, memory_write_byte))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275x_device, dack_w))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275_device, dack_w))
MCFG_I8257_REVERSE_RW_MODE(1)
MCFG_CASSETTE_ADD( "cassette", radio86_cassette_interface )

View File

@ -41,6 +41,7 @@ public:
virtual void machine_start();
virtual void machine_reset();
DECLARE_PALETTE_INIT(rt1715);
I8275_DRAW_CHARACTER_MEMBER( crtc_display_pixels );
required_device<cpu_device> m_maincpu;
required_device<ram_device> m_ram;
};
@ -133,7 +134,7 @@ WRITE8_MEMBER(rt1715_state::rt1715_rom_disable)
VIDEO EMULATION
***************************************************************************/
static I8275_DISPLAY_PIXELS( rt1715_display_pixels )
I8275_DRAW_CHARACTER_MEMBER( rt1715_state::crtc_display_pixels )
{
}
@ -156,17 +157,6 @@ static GFXDECODE_START( rt1715 )
GFXDECODE_ENTRY("gfx", 0x0800, rt1715_charlayout, 0, 1)
GFXDECODE_END
static const i8275_interface rt1715_i8275_intf =
{
8,
0,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
rt1715_display_pixels
};
/***************************************************************************
PALETTE
@ -298,7 +288,9 @@ static MACHINE_CONFIG_START( rt1715, rt1715_state )
MCFG_PALETTE_ADD("palette", 3)
MCFG_PALETTE_INIT_OWNER(rt1715_state, rt1715)
MCFG_I8275_ADD("a26", rt1715_i8275_intf)
MCFG_DEVICE_ADD("a26", I8275, XTAL_2_4576MHz)
MCFG_I8275_CHARACTER_WIDTH(8)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(rt1715_state, crtc_display_pixels)
MCFG_DEVICE_ADD("a30", Z80CTC, XTAL_10MHz/4 /* ? */)

View File

@ -46,6 +46,7 @@ public:
DECLARE_PALETTE_INIT(sm1800);
INTERRUPT_GEN_MEMBER(sm1800_vblank_interrupt);
IRQ_CALLBACK_MEMBER(sm1800_irq_callback);
I8275_DRAW_CHARACTER_MEMBER( crtc_display_pixels );
};
static ADDRESS_MAP_START(sm1800_mem, AS_PROGRAM, 8, sm1800_state)
@ -85,12 +86,11 @@ INTERRUPT_GEN_MEMBER(sm1800_state::sm1800_vblank_interrupt)
m_irq_state ^= 1;
}
static I8275_DISPLAY_PIXELS(sm1800_display_pixels)
I8275_DRAW_CHARACTER_MEMBER( sm1800_state::crtc_display_pixels )
{
int i;
sm1800_state *state = device->machine().driver_data<sm1800_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
UINT8 *charmap = state->memregion("chargen")->base();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 *charmap = memregion("chargen")->base();
UINT8 pixels = charmap[(linecount & 7) + (charcode << 3)] ^ 0xff;
if (vsp)
pixels = 0;
@ -105,17 +105,6 @@ static I8275_DISPLAY_PIXELS(sm1800_display_pixels)
bitmap.pix32(y, x + i) = palette[(pixels >> (7-i)) & 1 ? (hlgt ? 2 : 1) : 0];
}
const i8275_interface sm1800_i8275_interface = {
8,
0,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
sm1800_display_pixels
};
WRITE8_MEMBER( sm1800_state::sm1800_8255_portb_w )
{
}
@ -188,7 +177,9 @@ static MACHINE_CONFIG_START( sm1800, sm1800_state )
MCFG_I8255_IN_PORTC_CB(READ8(sm1800_state, sm1800_8255_portc_r))
MCFG_I8255_OUT_PORTC_CB(WRITE8(sm1800_state, sm1800_8255_portc_w))
MCFG_I8275_ADD ("i8275", sm1800_i8275_interface)
MCFG_DEVICE_ADD("i8275", I8275, 2000000)
MCFG_I8275_CHARACTER_WIDTH(8)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(sm1800_state, crtc_display_pixels)
MCFG_DEVICE_ADD("i8251", I8251, 0)
MACHINE_CONFIG_END

View File

@ -24,6 +24,7 @@ public:
required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
virtual void machine_reset();
I8275_DRAW_CHARACTER_MEMBER( crtc_display_pixels );
};
static ADDRESS_MAP_START(tim100_mem, AS_PROGRAM, 8, tim100_state)
@ -80,12 +81,11 @@ GFXDECODE_END
// this gets called via a (i8275_dack_w), so does nothing currently
// once fixed, pixel count needs adjusting
static I8275_DISPLAY_PIXELS(tim100_display_pixels)
I8275_DRAW_CHARACTER_MEMBER( tim100_state::crtc_display_pixels )
{
tim100_state *state = device->machine().driver_data<tim100_state>();
int i;
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
UINT8 *charmap = state->memregion("chargen")->base();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 *charmap = memregion("chargen")->base();
UINT8 pixels = charmap[(linecount & 15) + (charcode << 4)];
if (vsp)
{
@ -108,16 +108,6 @@ static I8275_DISPLAY_PIXELS(tim100_display_pixels)
}
}
static const i8275_interface tim100_i8276_interface = {
16, //12
0,
DEVCB_CPU_INPUT_LINE("maincpu", I8085_RST65_LINE),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
tim100_display_pixels
};
static MACHINE_CONFIG_START( tim100, tim100_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu",I8085A, XTAL_4_9152MHz) // divider unknown
@ -134,7 +124,10 @@ static MACHINE_CONFIG_START( tim100, tim100_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", tim100 )
MCFG_I8275_ADD ( "i8276", tim100_i8276_interface)
MCFG_DEVICE_ADD("i8276", I8275, XTAL_4_9152MHz)
MCFG_I8275_CHARACTER_WIDTH(16)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(tim100_state, crtc_display_pixels)
MCFG_I8275_IRQ_CALLBACK(INPUTLINE("maincpu", I8085_RST65_LINE))
MCFG_PALETTE_ADD("palette", 3)

View File

@ -42,7 +42,7 @@ ToDo:
#include "machine/pit8253.h"
#include "machine/i8255.h"
#include "machine/i8257.h"
#include "video/i8275x.h"
#include "video/i8275.h"
#include "sound/speaker.h"
@ -102,7 +102,7 @@ static ADDRESS_MAP_START( unior_io, AS_IO, 8, unior_state )
AM_RANGE(0x3c, 0x3f) AM_DEVREADWRITE("ppi0", i8255_device, read, write) // cassette player control
AM_RANGE(0x4c, 0x4f) AM_DEVREADWRITE("ppi1", i8255_device, read, write)
AM_RANGE(0x50, 0x50) AM_WRITE(scroll_w)
AM_RANGE(0x60, 0x61) AM_DEVREADWRITE("crtc", i8275x_device, read, write)
AM_RANGE(0x60, 0x61) AM_DEVREADWRITE("crtc", i8275_device, read, write)
AM_RANGE(0xdc, 0xdf) AM_DEVREADWRITE("pit", pit8253_device, read, write )
AM_RANGE(0xec, 0xec) AM_DEVREADWRITE("uart",i8251_device, data_r, data_w)
AM_RANGE(0xed, 0xed) AM_DEVREADWRITE("uart", i8251_device, status_r, control_w)
@ -398,7 +398,7 @@ static MACHINE_CONFIG_START( unior, unior_state )
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_SIZE(640, 200)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275x_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275_device, screen_update)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", unior)
MCFG_PALETTE_ADD("palette", 3)
MCFG_PALETTE_INIT_OWNER(unior_state,unior)
@ -435,9 +435,9 @@ static MACHINE_CONFIG_START( unior, unior_state )
MCFG_DEVICE_ADD("dma", I8257N, XTAL_20MHz / 9)
MCFG_I8257_OUT_HRQ_CB(WRITELINE(unior_state, hrq_w))
MCFG_I8257_IN_MEMR_CB(READ8(unior_state, dma_r))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("crtc", i8275x_device, dack_w))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("crtc", i8275_device, dack_w))
MCFG_DEVICE_ADD("crtc", I8275x, XTAL_20MHz / 12)
MCFG_DEVICE_ADD("crtc", I8275, XTAL_20MHz / 12)
MCFG_I8275_CHARACTER_WIDTH(6)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(unior_state, display_pixels)
MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma",i8257n_device, dreq2_w))

View File

@ -16,7 +16,7 @@ Wicat - various systems.
#include "machine/mm58274c.h"
#include "machine/mc2661.h"
#include "machine/im6402.h"
#include "video/i8275x.h"
#include "video/i8275.h"
#include "machine/am9517a.h"
#include "machine/x2212.h"
#include "machine/wd_fdc.h"
@ -101,7 +101,7 @@ public:
required_device<mc2661_device> m_uart5;
required_device<mc2661_device> m_uart6;
required_device<cpu_device> m_videocpu;
required_device<i8275x_device> m_videoctrl;
required_device<i8275_device> m_videoctrl;
required_device<am9517a_device> m_videodma;
required_device<mc2661_device> m_videouart0;
required_device<mc2661_device> m_videouart1;
@ -848,7 +848,7 @@ static MACHINE_CONFIG_START( wicat, wicat_state )
MCFG_AM9517A_OUT_EOP_CB(WRITELINE(wicat_state, dma_nmi_cb))
MCFG_AM9517A_IN_MEMR_CB(READ8(wicat_state, vram_r))
MCFG_AM9517A_OUT_MEMW_CB(WRITE8(wicat_state, vram_w))
MCFG_AM9517A_OUT_IOW_0_CB(DEVWRITE8("video", i8275x_device, dack_w))
MCFG_AM9517A_OUT_IOW_0_CB(DEVWRITE8("video", i8275_device, dack_w))
MCFG_IM6402_ADD("videouart", 0, 0)
MCFG_IM6402_DR_CALLBACK(WRITELINE(wicat_state, kb_data_ready))
@ -870,11 +870,11 @@ static MACHINE_CONFIG_START( wicat, wicat_state )
MCFG_SCREEN_SIZE(720,300)
MCFG_SCREEN_VISIBLE_AREA(0,720-1,0,300-1)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_UPDATE_DEVICE("video",i8275x_device,screen_update)
MCFG_SCREEN_UPDATE_DEVICE("video",i8275_device,screen_update)
MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
MCFG_DEVICE_ADD("video", I8275x, XTAL_19_6608MHz/8)
MCFG_DEVICE_ADD("video", I8275, XTAL_19_6608MHz/8)
MCFG_I8275_CHARACTER_WIDTH(9)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(wicat_state, wicat_display_pixels)
MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("videodma",am9517a_device, dreq0_w))

View File

@ -33,7 +33,7 @@ ToDo:
#include "machine/6821pia.h"
#include "machine/z80dma.h"
#include "machine/pit8253.h"
#include "video/i8275x.h"
#include "video/i8275.h"
#include "sound/beep.h"
#include "machine/keyboard.h"
#include "machine/wd_fdc.h"
@ -91,7 +91,7 @@ private:
required_device<i8251_device> m_u2;
required_device<pia6821_device> m_pia0;
required_device<pia6821_device> m_pia1;
required_device<i8275x_device> m_crtc;
required_device<i8275_device> m_crtc;
required_device<fd1793_t> m_fdc;
required_device<floppy_connector> m_floppy0;
required_device<floppy_connector> m_floppy1;
@ -113,7 +113,7 @@ static ADDRESS_MAP_START( zorba_io, AS_IO, 8, zorba_state )
AM_RANGE(0x00, 0x03) AM_DEVREADWRITE("pit", pit8254_device, read, write)
AM_RANGE(0x04, 0x04) AM_READWRITE(rom_r,rom_w)
AM_RANGE(0x05, 0x05) AM_READWRITE(ram_r,ram_w)
AM_RANGE(0x10, 0x11) AM_DEVREADWRITE("crtc", i8275x_device, read, write)
AM_RANGE(0x10, 0x11) AM_DEVREADWRITE("crtc", i8275_device, read, write)
AM_RANGE(0x20, 0x20) AM_DEVREADWRITE("uart0", i8251_device, data_r, data_w)
AM_RANGE(0x21, 0x21) AM_DEVREADWRITE("uart0", i8251_device, status_r, control_w)
AM_RANGE(0x22, 0x22) AM_DEVREADWRITE("uart1", i8251_device, data_r, data_w)
@ -320,7 +320,7 @@ static MACHINE_CONFIG_START( zorba, zorba_state )
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275x_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275_device, screen_update)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", zorba)
MCFG_PALETTE_ADD("palette", 3)
MCFG_PALETTE_INIT_OWNER(zorba_state, zorba)
@ -363,7 +363,7 @@ static MACHINE_CONFIG_START( zorba, zorba_state )
MCFG_PIT8253_CLK1(XTAL_24MHz / 3) /* Timer 1: ? */
MCFG_PIT8253_CLK2(XTAL_24MHz / 3) /* Timer 2: ? */
MCFG_DEVICE_ADD("crtc", I8275x, XTAL_14_31818MHz/7)
MCFG_DEVICE_ADD("crtc", I8275, XTAL_14_31818MHz/7)
MCFG_I8275_CHARACTER_WIDTH(8)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(zorba_state, zorba_update_chr)
MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma", z80dma_device, rdy_w))

View File

@ -15,7 +15,7 @@
#include "machine/ram.h"
#include "machine/z80dart.h"
#include "machine/upd765.h"
#include "video/i8275x.h"
#include "video/i8275.h"
#include "video/upd7220.h"
#define SCREEN_TAG "screen"
@ -67,7 +67,7 @@ public:
required_device<i8212_device> m_iop;
required_device<am9517a_device> m_dmac;
required_device<pit8253_device> m_pit;
required_device<i8275x_device> m_crtc;
required_device<i8275_device> m_crtc;
required_device<upd765a_device> m_fdc;
required_device<upd7201_device> m_mpsc;
required_device<upd7220_device> m_hgdc;

View File

@ -9,7 +9,7 @@
#include "machine/i8255.h"
#include "machine/i8257.h"
#include "video/i8275x.h"
#include "video/i8275.h"
#include "imagedev/cassette.h"

View File

@ -112,7 +112,7 @@ MACHINE_CONFIG_FRAGMENT( mm1m6_video )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", mm1)
MCFG_PALETTE_ADD_MONOCHROME_GREEN_HIGHLIGHT("palette")
MCFG_DEVICE_ADD(I8275_TAG, I8275x, XTAL_18_720MHz/8)
MCFG_DEVICE_ADD(I8275_TAG, I8275, XTAL_18_720MHz/8)
MCFG_I8275_CHARACTER_WIDTH(8)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(mm1_state, crtc_display_pixels)
MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE(I8237_TAG, am9517a_device, dreq0_w))