From 9966d6e8e5a8ba53153cdeb296c0307fdecae93b Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Wed, 30 Apr 2014 10:19:06 +0000 Subject: [PATCH] i8275: Replaced with new implementation. (nw) --- .gitattributes | 2 - src/emu/video/i8275.c | 1007 ++++++++++++++++++---------------- src/emu/video/i8275.h | 262 +++++---- src/emu/video/i8275x.c | 573 ------------------- src/emu/video/i8275x.h | 222 -------- src/emu/video/video.mak | 4 +- src/mess/drivers/apogee.c | 8 +- src/mess/drivers/ipds.c | 24 +- src/mess/drivers/mikromik.c | 2 +- src/mess/drivers/mikrosha.c | 8 +- src/mess/drivers/partner.c | 8 +- src/mess/drivers/radio86.c | 18 +- src/mess/drivers/rt1715.c | 18 +- src/mess/drivers/sm1800.c | 23 +- src/mess/drivers/tim100.c | 23 +- src/mess/drivers/unior.c | 10 +- src/mess/drivers/wicat.c | 10 +- src/mess/drivers/zorba.c | 10 +- src/mess/includes/mikromik.h | 4 +- src/mess/includes/radio86.h | 2 +- src/mess/video/mikromik.c | 2 +- 21 files changed, 756 insertions(+), 1484 deletions(-) delete mode 100644 src/emu/video/i8275x.c delete mode 100644 src/emu/video/i8275x.h diff --git a/.gitattributes b/.gitattributes index 059e893bf4c..f8ae35003f7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 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,442 +1,116 @@ -/*************************************************************************** +// 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 - -#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 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 - -#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 VERBOSE 1 +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** -#define LOG(x) do { if (VERBOSE) logerror x; } while (0) +#define LOG 0 -struct i8275_t -{ -}; - -/* 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; -} - -READ8_MEMBER( i8275_device::read ) -{ - UINT8 val; - - 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; -} - -void i8275_device::recompute_parameters() -{ - int horiz_pix_total = 0; - int vert_pix_total = 0; - rectangle visarea; - - 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 - } - - visarea.set(0, horiz_pix_total - 1, 0, vert_pix_total - 1); - - m_screen->configure(horiz_pix_total, vert_pix_total, visarea, - m_screen->frame_period().attoseconds); -} - -void i8275_device::set_parameter_reset(offs_t offset, UINT8 data) -{ - 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; - } -} - -void i8275_device::set_parameter_cursor(offs_t offset, UINT8 data) -{ - switch(offset) { - case 0 : - m_cursor_col = data; - break; - case 1 : - m_cursor_row = data; - break; - } -} +const int DMA_BURST_SPACING[] = { 0, 7, 15, 23, 31, 39, 47, 55 }; -WRITE8_MEMBER( i8275_device::write ) -{ - if (offset & 0x01) - { - /* 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; - } - } - 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 { - LOG(("i8275 : ERROR writing parameter\n")); - m_status_reg |= I8275_STATUS_IMPROPER_COMMAND; - } - } -} +#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] -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; - } - - 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; - } - - 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; - } - } - if (vsp==0 && m_blink) { - vsp = (m_char_blink_cnt < 32) ? 1: 0; - } - 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_cursor_format & 1)==1) { - lten = (line == m_undeline_line_num) ? vis : 0; //underline - } else { - lten = vis; // block cursor - } - } 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; - } - m_ypos++; - } - m_current_row++; -} - -WRITE8_MEMBER( i8275_device::dack_w ) -{ - if (m_next_in_fifo == 1) - { - m_next_in_fifo = 0; - - if(m_buffer_used == 0) - { - m_fifo_buffer_1[m_fifo_write] = data & 0x7f; - } - else - { - m_fifo_buffer_2[m_fifo_write] = data & 0x7f; - } - m_fifo_write = (m_fifo_write + 1) % 16; - - if (m_last_data == 0xf1) { - m_row_pos = m_chars_per_row + 1; - } - } - else - { - if(m_buffer_used == 0) - { - m_row_buffer_1[m_row_pos++] = data; - } - else - { - m_row_buffer_2[m_row_pos++] = data; - } - if (m_field_attribute_mode==0) - { - if ((data & 0x80)==0x80) - { - m_last_data = data; - m_next_in_fifo = 1; - } - } - } - - 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)) - { - m_ypos = 0; - m_current_row = 0; - - m_out_drq_func(0); - } -} - -/* Screen Update */ -UINT32 i8275_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - 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; - } - - copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect); - - return 0; -} - -/* Device Interface */ +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** +// device type definition const device_type I8275 = &device_creator; -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) -{ -} +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + //------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete +// i8275_device - constructor //------------------------------------------------- -void i8275_device::device_config_complete() +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) { - // inherit a copy of the static data - const i8275_interface *intf = reinterpret_cast(static_config()); - if (intf != NULL) - *static_cast(this) = *intf; - - // or initialize to defaults if none provided - else - { - 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)); - } } @@ -446,89 +120,454 @@ void i8275_device::device_config_complete() void i8275_device::device_start() { - /* get the screen device */ + // get the screen device m_screen->register_screen_bitmap(m_bitmap); - /* 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); + // 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(); - /* 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)); + // 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); - 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)); + // 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 i8275_device::device_reset() { - m_status_reg = 0; - m_num_of_params = 0; - m_current_command = 0; - m_param_type = 0; + memset(m_buffer, 0, sizeof(m_buffer)); - m_cursor_col = 0; - m_cursor_row = 0; + m_status &= ~ST_IE; - 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; + m_write_irq(CLEAR_LINE); +} + + +//------------------------------------------------- +// device_timer - handle timer events +//------------------------------------------------- + +void i8275_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( i8275_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( i8275_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( i8275_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( i8275_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 i8275_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 i8275_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/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. -***************************************************************************/ +********************************************************************** + _____ _____ + 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 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(device).m_hpixels_per_column = value; } + static void static_set_display_callback(device_t &device, i8275_draw_character_delegate callback) { downcast(device).m_display_cb = callback; } + + template static devcb2_base &set_drq_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_drq.set_callback(object); } + template static devcb2_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_irq.set_callback(object); } + template static devcb2_base &set_hrtc_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_hrtc.set_callback(object); } + template static devcb2_base &set_vrtc_wr_callback(device_t &device, _Object object) { return downcast(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 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; - - - -//************************************************************************** -// 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 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(device).m_hpixels_per_column = value; } - static void static_set_display_callback(device_t &device, i8275_draw_character_delegate callback) { downcast(device).m_display_cb = callback; } - - template static devcb2_base &set_drq_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_drq.set_callback(object); } - template static devcb2_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_irq.set_callback(object); } - template static devcb2_base &set_hrtc_wr_callback(device_t &device, _Object object) { return downcast(device).m_write_hrtc.set_callback(object); } - template static devcb2_base &set_vrtc_wr_callback(device_t &device, _Object object) { return downcast(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(); - 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 m_maincpu; required_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(); - 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 m_maincpu; required_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(); 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 m_uart5; required_device m_uart6; required_device m_videocpu; - required_device m_videoctrl; + required_device m_videoctrl; required_device m_videodma; required_device m_videouart0; required_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 m_u2; required_device m_pia0; required_device m_pia1; - required_device m_crtc; + required_device m_crtc; required_device m_fdc; required_device m_floppy0; required_device 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 m_iop; required_device m_dmac; required_device m_pit; - required_device m_crtc; + required_device m_crtc; required_device m_fdc; required_device m_mpsc; required_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))