summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2014-04-30 10:19:06 +0000
committer Curt Coder <curtcoder@mail.com>2014-04-30 10:19:06 +0000
commit9966d6e8e5a8ba53153cdeb296c0307fdecae93b (patch)
treed25591f7b2dbc07065fc44a461323c64017d969f /src
parentbbfd445e15fa203dc85700223023e6bd5da2632a (diff)
i8275: Replaced with new implementation. (nw)
Diffstat (limited to 'src')
-rw-r--r--src/emu/video/i8275.c899
-rw-r--r--src/emu/video/i8275.h272
-rw-r--r--src/emu/video/i8275x.c573
-rw-r--r--src/emu/video/i8275x.h222
-rw-r--r--src/emu/video/video.mak4
-rw-r--r--src/mess/drivers/apogee.c8
-rw-r--r--src/mess/drivers/ipds.c24
-rw-r--r--src/mess/drivers/mikromik.c2
-rw-r--r--src/mess/drivers/mikrosha.c8
-rw-r--r--src/mess/drivers/partner.c8
-rw-r--r--src/mess/drivers/radio86.c18
-rw-r--r--src/mess/drivers/rt1715.c18
-rw-r--r--src/mess/drivers/sm1800.c23
-rw-r--r--src/mess/drivers/tim100.c23
-rw-r--r--src/mess/drivers/unior.c10
-rw-r--r--src/mess/drivers/wicat.c10
-rw-r--r--src/mess/drivers/zorba.c10
-rw-r--r--src/mess/includes/mikromik.h4
-rw-r--r--src/mess/includes/radio86.h2
-rw-r--r--src/mess/video/mikromik.c2
20 files changed, 707 insertions, 1433 deletions
diff --git a/src/emu/video/i8275.c b/src/emu/video/i8275.c
index 0b636f62cb8..ef9b7fc0a59 100644
--- a/src/emu/video/i8275.c
+++ b/src/emu/video/i8275.c
@@ -1,534 +1,573 @@
-/***************************************************************************
+// 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.
-***************************************************************************/
+**********************************************************************/
+
+/*
+
+ TODO:
+
+ - character attributes
+ - double spaced rows
+
+*/
-#include "emu.h"
#include "i8275.h"
-#define I8275_COMMAND_RESET 0
-#define I8275_COMMAND_START_DISPLAY 1
-#define I8275_COMMAND_STOP_DISPLAY 2
-#define I8275_COMMAND_READ_LIGHT_PEN 3
-#define I8275_COMMAND_LOAD_CURSOR 4
-#define I8275_COMMAND_ENABLE_INTERRUPT 5
-#define I8275_COMMAND_DISABLE_INTERRUPT 6
-#define I8275_COMMAND_PRESET_COUNTERS 7
-#define I8275_PARAM_RESET 4
-#define I8275_PARAM_READ_LIGHT_PEN 2
-#define I8275_PARAM_LOAD_CURSOR 2
-#define I8275_PARAM_NONE 0
-#define I8275_PARAM_READ 1
-#define I8275_PARAM_WRITE 2
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
-#define I8275_STATUS_FIFO_OVERRUN 0x01
-#define I8275_STATUS_DMA_UNDERRUN 0x02
-#define I8275_STATUS_VIDEO_ENABLE 0x04
-#define I8275_STATUS_IMPROPER_COMMAND 0x08
-#define I8275_STATUS_LIGHT_PEN 0x10
-#define I8275_STATUS_INTERRUPT_REQUEST 0x20
-#define I8275_STATUS_INTERRUPT_ENABLE 0x40
+#define LOG 0
-#define I8275_ROW_TYPE_NORMAL 0
-#define I8275_ROW_TYPE_SPACED 1
-#define I8275_LINE_COUNTER_MODE_0 0
-#define I8275_LINE_COUNTER_MODE_1 1
+const int DMA_BURST_SPACING[] = { 0, 7, 15, 23, 31, 39, 47, 55 };
-#define I8275_FIELD_ATTRIBUTE_TRANSPARENT 0
-#define I8275_FIELD_ATTRIBUTE_NONTRANSPARENT 1
-#define I8275_CURSOR_BLINK_REVERSED 0
-#define I8275_CURSOR_BLINK_UNDERLINE 1
-#define I8275_CURSOR_NONBLINK_REVERSED 2
-#define I8275_CURSOR_NONBLINK_UNDERLINE 3
+#define DOUBLE_SPACED_ROWS \
+ BIT(m_param[REG_SCN1], 7)
+#define CHARACTERS_PER_ROW \
+ ((m_param[REG_SCN1] & 0x7f) + 1)
-#define VERBOSE 1
+#define VRTC_ROW_COUNT \
+ ((m_param[REG_SCN2] >> 5) + 1)
-#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
+#define CHARACTER_ROWS_PER_FRAME \
+ ((m_param[REG_SCN2] & 0x3f) + 1)
+#define UNDERLINE \
+ (m_param[REG_SCN3] >> 4)
-struct i8275_t
-{
-};
+#define SCANLINES_PER_ROW \
+ ((m_param[REG_SCN3] & 0x0f) + 1)
-/* Register Access */
-UINT8 i8275_device::get_parameter_light_pen(offs_t offset)
-{
- UINT8 val = 0;
-
- switch(offset) {
- case 0 :
- val = m_light_pen_col;
- break;
- case 1 :
- val = m_light_pen_row;
- break;
- }
- return val;
-}
+#define OFFSET_LINE_COUNTER \
+ BIT(m_param[REG_SCN4], 7)
-READ8_MEMBER( i8275_device::read )
-{
- UINT8 val;
+#define VISIBLE_FIELD_ATTRIBUTE \
+ BIT(m_param[REG_SCN4], 6)
- if (offset & 0x01)
- {
- /* Status register */
- val = m_status_reg;
- /* status reset after read */
- m_status_reg &= ~I8275_STATUS_FIFO_OVERRUN;
- m_status_reg &= ~I8275_STATUS_DMA_UNDERRUN;
- m_status_reg &= ~I8275_STATUS_IMPROPER_COMMAND;
- m_status_reg &= ~I8275_STATUS_LIGHT_PEN;
- m_status_reg &= ~I8275_STATUS_INTERRUPT_REQUEST;
- }
- else
- {
- /* Parameter register */
- val = 0x00;
- if (m_param_type==I8275_PARAM_READ) {
- if (m_num_of_params > 0) {
- val = get_parameter_light_pen(2 - m_num_of_params);
- m_num_of_params--;
- } else {
- m_status_reg |= I8275_STATUS_IMPROPER_COMMAND;
- }
- } else {
- LOG(("i8275 : ERROR reading parameter\n"));
- m_status_reg |= I8275_STATUS_IMPROPER_COMMAND;
- }
- }
- return val;
-}
+#define CURSOR_FORMAT \
+ ((m_param[REG_SCN4] >> 4) & 0x03)
-void i8275_device::recompute_parameters()
-{
- int horiz_pix_total = 0;
- int vert_pix_total = 0;
- rectangle visarea;
+#define HRTC_COUNT \
+ (((m_param[REG_SCN4] & 0x0f) + 1) * 2)
- horiz_pix_total = (m_chars_per_row + 1) * m_width;
- vert_pix_total = (m_lines_per_row + 1) * (m_rows_per_frame + 1);
- if (m_rows_type==1) {
- vert_pix_total *= 2; // Use of spaced rows
- }
+#define DMA_BURST_COUNT \
+ (1 << (m_param[REG_DMA] & 0x03))
- visarea.set(0, horiz_pix_total - 1, 0, vert_pix_total - 1);
+#define DMA_BURST_SPACE \
+ DMA_BURST_SPACING[(m_param[REG_DMA] >> 2) & 0x07]
- m_screen->configure(horiz_pix_total, vert_pix_total, visarea,
- m_screen->frame_period().attoseconds);
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+// device type definition
+const device_type I8275 = &device_creator<i8275_device>;
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// i8275_device - constructor
+//-------------------------------------------------
+
+i8275_device::i8275_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, I8275, "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)
+{
}
-void i8275_device::set_parameter_reset(offs_t offset, UINT8 data)
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void i8275_device::device_start()
{
- switch(offset) {
- case 0 :
- m_rows_type = (data >> 7) & 1;
- m_chars_per_row = data & 0x7f;
- break;
- case 1 :
- m_vert_retrace_rows = (data >> 6) & 3;
- m_rows_per_frame = data & 0x3f;
- break;
- case 2 :
- m_undeline_line_num = (data >> 4) & 0x0f;
- m_lines_per_row = data & 0x0f;
- break;
- case 3 :
- m_line_counter_mode = (data >> 7) & 1;
- m_field_attribute_mode = (data >> 6) & 1;
- m_cursor_format = (data >> 4) & 3;
- m_hor_retrace_count = data & 0x0f;
- break;
- }
+ // 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));
}
-void i8275_device::set_parameter_cursor(offs_t offset, UINT8 data)
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void i8275_device::device_reset()
{
- switch(offset) {
- case 0 :
- m_cursor_col = data;
- break;
- case 1 :
- m_cursor_row = data;
- break;
- }
+ memset(m_buffer, 0, sizeof(m_buffer));
+
+ m_status &= ~ST_IE;
+
+ m_write_irq(CLEAR_LINE);
}
-WRITE8_MEMBER( i8275_device::write )
+//-------------------------------------------------
+// device_timer - handle timer events
+//-------------------------------------------------
+
+void i8275_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
- if (offset & 0x01)
+ //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)
{
- /* Command register */
- if (m_num_of_params != 0) {
- m_status_reg |= I8275_STATUS_IMPROPER_COMMAND;
- return;
- }
- m_current_command = (data >> 5) & 7;
- m_num_of_params = I8275_PARAM_NONE;
- m_param_type = I8275_PARAM_NONE;
- switch(m_current_command) {
- case I8275_COMMAND_RESET :
- m_num_of_params = I8275_PARAM_RESET;
- m_param_type = I8275_PARAM_WRITE;
- /* set status register */
- m_status_reg &= ~I8275_STATUS_INTERRUPT_ENABLE;
- m_status_reg &= ~I8275_STATUS_VIDEO_ENABLE;
- break;
- case I8275_COMMAND_START_DISPLAY:
- m_burst_space_code = (data >> 2) & 7;
- m_burst_count_code = data & 3;
- /* set status register */
- m_status_reg |= I8275_STATUS_VIDEO_ENABLE;
- m_status_reg |= I8275_STATUS_INTERRUPT_ENABLE;
- recompute_parameters();
- break;
- case I8275_COMMAND_STOP_DISPLAY :
- /* set status register */
- m_status_reg &= ~I8275_STATUS_VIDEO_ENABLE;
- break;
- case I8275_COMMAND_READ_LIGHT_PEN:
- m_num_of_params = I8275_PARAM_READ_LIGHT_PEN;
- m_param_type = I8275_PARAM_READ;
- break;
- case I8275_COMMAND_LOAD_CURSOR :
- m_num_of_params = I8275_PARAM_LOAD_CURSOR;
- m_param_type = I8275_PARAM_WRITE;
- break;
- case I8275_COMMAND_ENABLE_INTERRUPT :
- /* set status register */
- m_status_reg |= I8275_STATUS_INTERRUPT_ENABLE;
- break;
- case I8275_COMMAND_DISABLE_INTERRUPT:
- /* set status register */
- m_status_reg &= ~I8275_STATUS_INTERRUPT_ENABLE;
- break;
- case I8275_COMMAND_PRESET_COUNTERS :
- break;
+ 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
- {
- /* Parameter register */
- if (m_param_type==I8275_PARAM_WRITE) {
- if (m_num_of_params > 0) {
- if (m_current_command == I8275_COMMAND_RESET) {
- set_parameter_reset(4 - m_num_of_params ,data);
- } else {
- set_parameter_cursor(2 - m_num_of_params, data);
- }
- m_num_of_params--;
- } else {
- m_status_reg |= I8275_STATUS_IMPROPER_COMMAND;
+ 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 {
- LOG(("i8275 : ERROR writing parameter\n"));
- m_status_reg |= I8275_STATUS_IMPROPER_COMMAND;
}
- }
-}
+ 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;
-void i8275_device::draw_char_line()
-{
- int xpos = 0;
- int line = 0;
- UINT8 lc = 0;
- UINT8 vsp = 0;
- UINT8 lten = 0;
- UINT8 fifo_read = 0;
-
- for(line=0;line<=m_lines_per_row;line++) {
- // If line counter is 1 then select right values
- lc = (m_line_counter_mode==1) ? (line - 1) % m_lines_per_row : line;
- fifo_read = 0;
- for(xpos=0;xpos<=m_chars_per_row;xpos++) {
- UINT8 chr = (m_buffer_used==0) ? m_row_buffer_2[xpos] : m_row_buffer_1[xpos];
- if (m_undeline_line_num & 0x08) {
- vsp = (line==0 || line==m_lines_per_row) ? 1 : 0;
- }
+ m_du = false;
- if ((chr & 0x80)==0x80) {
- if ((chr & 0xc0)==0xc0) {
- // character attribute code
- m_lineattr = 0;
- } else {
- // field attribute code
- m_hlgt = chr & 1;
- m_blink = (chr >> 1) & 1;
- m_gpa = (chr >> 2) & 3;
- m_rvv = (chr >> 4) & 1;
- m_underline = (chr >> 5) & 1;
- }
+ m_cursor_blink++;
+ m_cursor_blink &= 0x1f;
- if (m_field_attribute_mode==0) {
- chr = (m_buffer_used==0) ? m_fifo_buffer_2[fifo_read] : m_fifo_buffer_1[fifo_read];
- fifo_read = (fifo_read + 1 ) % 16;
- } else {
- vsp = 1;
- }
+ 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);
}
- if (vsp==0 && m_blink) {
- vsp = (m_char_blink_cnt < 32) ? 1: 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_current_row == m_cursor_row) && (xpos == m_cursor_col - m_char_delay)) {
- int vis = 1;
- if ((m_cursor_format & 2)==0) {
- vis = (m_cursor_blink_cnt<16) ? 1 : 0;
+ }
+
+ 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 ((m_cursor_format & 1)==1) {
- lten = (line == m_undeline_line_num) ? vis : 0; //underline
- } else {
- lten = vis; // block cursor
+
+ if (!vsp && m_vsp)
+ {
+ vsp = (m_char_blink < 32) ? 1 : 0;
}
- } else {
- lten = 0;
- }
- m_display_pixels_func(this, m_bitmap,
- xpos * m_width, // x position on screen of starting point
- m_ypos, // y position on screen
- lc, // current line of char
- (chr & 0x7f), // char code to be displayed
- m_lineattr, // line attribute code
- lten | m_underline, // light enable signal
- m_rvv, // reverse video signal
- vsp, // video suppression
- m_gpa, // general purpose attribute code
- m_hlgt // highlight
- );
- vsp = 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_ypos++;
+
+ m_scanline++;
+ m_scanline %= ((CHARACTER_ROWS_PER_FRAME + VRTC_ROW_COUNT) * SCANLINES_PER_ROW);
+ break;
}
- m_current_row++;
}
-WRITE8_MEMBER( i8275_device::dack_w )
+
+//-------------------------------------------------
+// read -
+//-------------------------------------------------
+
+READ8_MEMBER( i8275_device::read )
{
- if (m_next_in_fifo == 1)
+ UINT8 data = 0;
+
+ if (offset & 0x01)
{
- m_next_in_fifo = 0;
+ data = m_status;
- if(m_buffer_used == 0)
- {
- m_fifo_buffer_1[m_fifo_write] = data & 0x7f;
- }
- else
+ if (m_status & ST_IR)
{
- m_fifo_buffer_2[m_fifo_write] = data & 0x7f;
+ //if (LOG) logerror("I8275 '%s' IRQ 0\n", tag());
+ m_write_irq(CLEAR_LINE);
}
- m_fifo_write = (m_fifo_write + 1) % 16;
- if (m_last_data == 0xf1) {
- m_row_pos = m_chars_per_row + 1;
- }
+ m_status &= ~(ST_IR | ST_LP | ST_IC | ST_DU | ST_FO);
}
else
{
- if(m_buffer_used == 0)
- {
- m_row_buffer_1[m_row_pos++] = data;
- }
- else
+ data = m_param[m_param_idx];
+ m_param_idx++;
+
+ if (m_param_idx > m_param_end)
{
- m_row_buffer_2[m_row_pos++] = data;
+ m_status |= ST_IC;
}
- if (m_field_attribute_mode==0)
+ }
+
+ return data;
+}
+
+
+//-------------------------------------------------
+// write -
+//-------------------------------------------------
+
+WRITE8_MEMBER( i8275_device::write )
+{
+ if (offset & 0x01)
+ {
+ if (LOG) logerror("I8275 '%s' Command %02x\n", tag(), data);
+
+ switch (data >> 5)
{
- if ((data & 0x80)==0x80)
+ 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_last_data = data;
- m_next_in_fifo = 1;
+ 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;
}
}
-
- if ((m_row_pos - 1)==m_chars_per_row )
- {
- m_buffer_used = (m_buffer_used==0) ? 1 : 0;
- m_row_pos = 0;
- m_fifo_write = 0;
- draw_char_line();
- }
- if (m_current_row == (m_rows_per_frame + 1))
+ else
{
- m_ypos = 0;
- m_current_row = 0;
+ 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_out_drq_func(0);
+ m_param_idx++;
}
}
-/* Screen Update */
-UINT32 i8275_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+
+//-------------------------------------------------
+// dack_w -
+//-------------------------------------------------
+
+WRITE8_MEMBER( i8275_device::dack_w )
{
- m_ypos = 0;
- m_lineattr = 0;
- m_rvv = 0;
- m_gpa = 0;
- m_hlgt = 0;
- m_underline = 0;
- m_blink = 0;
- m_row_pos = 0;
- m_fifo_write = 0;
-
- if ((m_status_reg & I8275_STATUS_VIDEO_ENABLE)==0) {
- bitmap.fill(rgb_t(0x00,0x00,0x00), cliprect);
- } else {
- // if value < 16 it is visible otherwise not
- m_cursor_blink_cnt++;
- if(m_cursor_blink_cnt==32) m_cursor_blink_cnt = 0;
- // if value < 32 it is visible otherwise not
- m_char_blink_cnt++;
- if(m_char_blink_cnt==64) m_char_blink_cnt = 0;
-
- m_out_drq_func(1);
- }
- if (m_status_reg & I8275_STATUS_INTERRUPT_ENABLE) {
- m_status_reg |= I8275_STATUS_INTERRUPT_REQUEST;
- }
+ //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);
- copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
+ m_write_drq(0);
- return 0;
-}
+ if (m_fifo_next)
+ {
+ if (m_fifo_idx == 16)
+ {
+ m_fifo_idx = 0;
+ m_status |= ST_FO;
+ }
-/* Device Interface */
+ m_fifo[m_buffer_dma][m_fifo_idx++] = data;
-const device_type I8275 = &device_creator<i8275_device>;
+ m_fifo_next = false;
+ }
+ else
+ {
+ m_buffer[m_buffer_dma][m_buffer_idx++] = data;
-i8275_device::i8275_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, I8275, "Intel 8275", tag, owner, clock, "i8275", __FILE__),
- device_video_interface(mconfig, *this)
-{
+ 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);
+ }
+ }
}
//-------------------------------------------------
-// device_config_complete - perform any
-// operations now that the configuration is
-// complete
+// lpen_w -
//-------------------------------------------------
-void i8275_device::device_config_complete()
+WRITE_LINE_MEMBER( i8275_device::lpen_w )
{
- // inherit a copy of the static data
- const i8275_interface *intf = reinterpret_cast<const i8275_interface *>(static_config());
- if (intf != NULL)
- *static_cast<i8275_interface *>(this) = *intf;
-
- // or initialize to defaults if none provided
- else
+ if (!m_lpen && state)
{
- memset(&m_out_drq_cb, 0, sizeof(m_out_drq_cb));
- memset(&m_out_irq_cb, 0, sizeof(m_out_irq_cb));
- memset(&m_out_hrtc_cb, 0, sizeof(m_out_hrtc_cb));
- memset(&m_out_vrtc_cb, 0, sizeof(m_out_vrtc_cb));
+ 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;
}
//-------------------------------------------------
-// device_start - device-specific startup
+// screen_update -
//-------------------------------------------------
-void i8275_device::device_start()
+UINT32 i8275_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- /* get the screen device */
- m_screen->register_screen_bitmap(m_bitmap);
+ if (!(m_status & ST_VE))
+ {
+ m_bitmap.fill(rgb_t::black);
+ }
- /* resolve callbacks */
- m_out_drq_func.resolve(m_out_drq_cb, *this);
- m_out_irq_func.resolve(m_out_irq_cb, *this);
- m_out_hrtc_func.resolve(m_out_hrtc_cb, *this);
- m_out_vrtc_func.resolve(m_out_vrtc_cb, *this);
-
- /* register for state saving */
- save_item(NAME(m_status_reg));
- save_item(NAME(m_num_of_params));
- save_item(NAME(m_current_command));
- save_item(NAME(m_param_type));
-
- save_item(NAME(m_cursor_col));
- save_item(NAME(m_cursor_row));
-
- save_item(NAME(m_light_pen_col));
- save_item(NAME(m_light_pen_row));
-
- save_item(NAME(m_rows_type));
- save_item(NAME(m_chars_per_row));
- save_item(NAME(m_vert_retrace_rows));
- save_item(NAME(m_rows_per_frame));
- save_item(NAME(m_undeline_line_num));
- save_item(NAME(m_lines_per_row));
- save_item(NAME(m_line_counter_mode));
- save_item(NAME(m_field_attribute_mode));
- save_item(NAME(m_cursor_format));
- save_item(NAME(m_hor_retrace_count));
-
- save_item(NAME(m_burst_space_code));
- save_item(NAME(m_burst_count_code));
+ copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
+
+ return 0;
}
+
//-------------------------------------------------
-// device_reset - device-specific reset
+// recompute_parameters -
//-------------------------------------------------
-void i8275_device::device_reset()
+void i8275_device::recompute_parameters()
{
- m_status_reg = 0;
- m_num_of_params = 0;
- m_current_command = 0;
- m_param_type = 0;
-
- m_cursor_col = 0;
- m_cursor_row = 0;
-
- m_light_pen_col = 0;
- m_light_pen_row = 0;
-
- m_rows_type = 0;
- m_chars_per_row = 0;
- m_vert_retrace_rows = 0;
- m_rows_per_frame = 0;
- m_undeline_line_num = 0;
- m_lines_per_row = 0;
- m_line_counter_mode = 0;
- m_field_attribute_mode = 0;
- m_cursor_format = 0;
- m_hor_retrace_count = 0;
-
- m_burst_space_code = 0;
- m_burst_count_code = 0;
-
- m_row_pos = 0;
- m_buffer_used = 0;
-
- m_fifo_write = 0;
-
- m_ypos = 0;
- m_current_row = 0;
-
- m_cursor_blink_cnt = 0;
- m_char_blink_cnt = 0;
- m_next_in_fifo = 0;
-
- m_lineattr = 0;
- m_rvv = 0;
- m_gpa = 0;
- m_hlgt = 0;
- m_underline = 0;
- m_blink = 0;
+ 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());
}
diff --git a/src/emu/video/i8275.h b/src/emu/video/i8275.h
index c343632ebd6..cc22abf07ee 100644
--- a/src/emu/video/i8275.h
+++ b/src/emu/video/i8275.h
@@ -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.
-***************************************************************************/
-
-#ifndef __I8275_VIDEO__
-#define __I8275_VIDEO__
+**********************************************************************
+ _____ _____
+ 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"
@@ -20,139 +45,178 @@
// 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);
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
+#define MCFG_I8275_IRQ_CALLBACK(_write) \
+ devcb = &i8275_device::set_irq_wr_callback(*device, DEVCB2_##_write);
-class i8275_device;
+#define MCFG_I8275_HRTC_CALLBACK(_write) \
+ devcb = &i8275_device::set_hrtc_wr_callback(*device, DEVCB2_##_write);
-// ======================> i8275_display_pixels_func
+#define MCFG_I8275_VRTC_CALLBACK(_write) \
+ devcb = &i8275_device::set_vrtc_wr_callback(*device, DEVCB2_##_write);
-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)
-// ======================> i8275_interface
-
-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;
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
- devcb_write_line m_out_hrtc_cb;
- devcb_write_line m_out_vrtc_cb;
+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_display_pixels_func m_display_pixels_func;
-};
+// ======================> i8275_device
-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_cursor_col; /* current cursor column */
- UINT8 m_cursor_row; /* current cursor row */
-
- UINT8 m_light_pen_col; /* current light pen column */
- UINT8 m_light_pen_row; /* current light pen row */
-
- /* 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;
-
- /* values for start display command */
- UINT8 m_burst_space_code;
- UINT8 m_burst_count_code;
-
- /* buffers */
- UINT8 m_row_buffer_1[80];
- UINT8 m_row_buffer_2[80];
- UINT8 m_row_pos;
- UINT8 m_buffer_used;
-
- 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;
+ 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 ATTR_DEPRECATED const device_type I8275;
+extern const device_type I8275;
+
#endif
diff --git a/src/emu/video/i8275x.c b/src/emu/video/i8275x.c
deleted file mode 100644
index cc694fb25ed..00000000000
--- a/src/emu/video/i8275x.c
+++ /dev/null
@@ -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());
-}
diff --git a/src/emu/video/i8275x.h b/src/emu/video/i8275x.h
deleted file mode 100644
index 332731cc49e..00000000000
--- a/src/emu/video/i8275x.h
+++ /dev/null
@@ -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
diff --git a/src/emu/video/video.mak b/src/emu/video/video.mak
index 5313c3a1f3b..967fbc92bb4 100644
--- a/src/emu/video/video.mak
+++ b/src/emu/video/video.mak
@@ -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
#-------------------------------------------------
diff --git a/src/mess/drivers/apogee.c b/src/mess/drivers/apogee.c
index 8f137fba182..48ec99d3318 100644
--- a/src/mess/drivers/apogee.c
+++ b/src/mess/drivers/apogee.c
@@ -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 )
diff --git a/src/mess/drivers/ipds.c b/src/mess/drivers/ipds.c
index 76821fd5895..105315cad95 100644
--- a/src/mess/drivers/ipds.c
+++ b/src/mess/drivers/ipds.c
@@ -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
diff --git a/src/mess/drivers/mikromik.c b/src/mess/drivers/mikromik.c
index 1b710d87294..516af22581f 100644
--- a/src/mess/drivers/mikromik.c
+++ b/src/mess/drivers/mikromik.c
@@ -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))
diff --git a/src/mess/drivers/mikrosha.c b/src/mess/drivers/mikrosha.c
index 2114fc43dd4..030059bfe00 100644
--- a/src/mess/drivers/mikrosha.c
+++ b/src/mess/drivers/mikrosha.c
@@ -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 )
diff --git a/src/mess/drivers/partner.c b/src/mess/drivers/partner.c
index 736b433da68..33babf13680 100644
--- a/src/mess/drivers/partner.c
+++ b/src/mess/drivers/partner.c
@@ -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 )
diff --git a/src/mess/drivers/radio86.c b/src/mess/drivers/radio86.c
index c03439d47ab..9520a402091 100644
--- a/src/mess/drivers/radio86.c
+++ b/src/mess/drivers/radio86.c
@@ -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 )
diff --git a/src/mess/drivers/rt1715.c b/src/mess/drivers/rt1715.c
index 226e47f1cca..fdf27fac0a4 100644
--- a/src/mess/drivers/rt1715.c
+++ b/src/mess/drivers/rt1715.c
@@ -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 /* ? */)
diff --git a/src/mess/drivers/sm1800.c b/src/mess/drivers/sm1800.c
index 2d6ce18ce8f..2f5f87b4070 100644
--- a/src/mess/drivers/sm1800.c
+++ b/src/mess/drivers/sm1800.c
@@ -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
diff --git a/src/mess/drivers/tim100.c b/src/mess/drivers/tim100.c
index f0be9195a9e..649a7bd11cd 100644
--- a/src/mess/drivers/tim100.c
+++ b/src/mess/drivers/tim100.c
@@ -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)
diff --git a/src/mess/drivers/unior.c b/src/mess/drivers/unior.c
index bab80fa62a2..ac8e52ca53f 100644
--- a/src/mess/drivers/unior.c
+++ b/src/mess/drivers/unior.c
@@ -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))
diff --git a/src/mess/drivers/wicat.c b/src/mess/drivers/wicat.c
index 4bf8af623ee..5ad058ab915 100644
--- a/src/mess/drivers/wicat.c
+++ b/src/mess/drivers/wicat.c
@@ -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))
diff --git a/src/mess/drivers/zorba.c b/src/mess/drivers/zorba.c
index 7a09c44640b..c3d02bb71fc 100644
--- a/src/mess/drivers/zorba.c
+++ b/src/mess/drivers/zorba.c
@@ -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))
diff --git a/src/mess/includes/mikromik.h b/src/mess/includes/mikromik.h
index 2bfa322e649..1194651a498 100644
--- a/src/mess/includes/mikromik.h
+++ b/src/mess/includes/mikromik.h
@@ -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;
diff --git a/src/mess/includes/radio86.h b/src/mess/includes/radio86.h
index 5105351e802..23d92a04a0c 100644
--- a/src/mess/includes/radio86.h
+++ b/src/mess/includes/radio86.h
@@ -9,7 +9,7 @@
#include "machine/i8255.h"
#include "machine/i8257.h"
-#include "video/i8275x.h"
+#include "video/i8275.h"
#include "imagedev/cassette.h"
diff --git a/src/mess/video/mikromik.c b/src/mess/video/mikromik.c
index b26cce5b773..a23fd13083b 100644
--- a/src/mess/video/mikromik.c
+++ b/src/mess/video/mikromik.c
@@ -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))