summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/x68k.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/x68k.cpp')
-rw-r--r--src/mame/video/x68k.cpp663
1 files changed, 73 insertions, 590 deletions
diff --git a/src/mame/video/x68k.cpp b/src/mame/video/x68k.cpp
index 17fa4658543..17972c5203a 100644
--- a/src/mame/video/x68k.cpp
+++ b/src/mame/video/x68k.cpp
@@ -92,542 +92,25 @@ bitmap_rgb32* ::x68k_get_gfx_page(int pri,int type)
return nullptr; // should never reach here either.
}
*/
-void x68k_state::x68k_crtc_text_copy(int src, int dest, uint8_t planes)
-{
- // copys one raster in T-VRAM to another raster
- int src_ram = src * 256; // 128 bytes per scanline
- int dest_ram = dest * 256;
-
- // update RAM in each plane
- if(planes & 1)
- memcpy(&m_tvram[dest_ram],&m_tvram[src_ram],512);
- if(planes & 2)
- memcpy(&m_tvram[dest_ram+0x10000],&m_tvram[src_ram+0x10000],512);
- if(planes & 4)
- memcpy(&m_tvram[dest_ram+0x20000],&m_tvram[src_ram+0x20000],512);
- if(planes & 8)
- memcpy(&m_tvram[dest_ram+0x30000],&m_tvram[src_ram+0x30000],512);
-}
-
-TIMER_CALLBACK_MEMBER(x68k_state::x68k_crtc_operation_end)
-{
- int bit = param;
- m_crtc.operation &= ~bit;
-}
-
-void x68k_state::x68k_crtc_refresh_mode()
-{
-// rectangle rect;
-// double scantime;
- rectangle scr,visiblescr;
- int length;
-
- // Calculate data from register values
- m_crtc.vmultiple = 1;
- if((m_crtc.reg[20] & 0x10) != 0 && (m_crtc.reg[20] & 0x0c) == 0)
- m_crtc.vmultiple = 2; // 31.5kHz + 256 lines = doublescan
- if(m_crtc.interlace != 0)
- m_crtc.vmultiple = 0.5f; // 31.5kHz + 1024 lines or 15kHz + 512 lines = interlaced
- m_crtc.htotal = (m_crtc.reg[0] + 1) * 8;
- m_crtc.vtotal = (m_crtc.reg[4] + 1) / m_crtc.vmultiple; // default is 567 (568 scanlines)
- m_crtc.hbegin = (m_crtc.reg[2] * 8) + 1;
- m_crtc.hend = (m_crtc.reg[3] * 8);
- m_crtc.vbegin = (m_crtc.reg[6]) / m_crtc.vmultiple;
- m_crtc.vend = (m_crtc.reg[7] - 1) / m_crtc.vmultiple;
- if((m_crtc.vmultiple == 2) && !(m_crtc.reg[7] & 1)) // otherwise if the raster irq line == vblank line, the raster irq fires too late
- m_crtc.vend++;
- m_crtc.hsync_end = (m_crtc.reg[1]) * 8;
- m_crtc.vsync_end = (m_crtc.reg[5]) / m_crtc.vmultiple;
- m_crtc.hsyncadjust = m_crtc.reg[8];
- scr.set(0, m_crtc.htotal - 8, 0, m_crtc.vtotal);
- if(scr.max_y <= m_crtc.vend)
- scr.max_y = m_crtc.vend + 2;
- if(scr.max_x <= m_crtc.hend)
- scr.max_x = m_crtc.hend + 2;
- visiblescr.set(m_crtc.hbegin, m_crtc.hend, m_crtc.vbegin, m_crtc.vend);
-
- // expand visible area to the size indicated by CRTC reg 20
- length = m_crtc.hend - m_crtc.hbegin;
- if (length < m_crtc.width)
- {
- visiblescr.min_x = m_crtc.hbegin - ((m_crtc.width - length)/2);
- visiblescr.max_x = m_crtc.hend + ((m_crtc.width - length)/2);
- }
- length = m_crtc.vend - m_crtc.vbegin;
- if (length < m_crtc.height)
- {
- visiblescr.min_y = m_crtc.vbegin - ((m_crtc.height - length)/2);
- visiblescr.max_y = m_crtc.vend + ((m_crtc.height - length)/2);
- }
- // bounds check
- if(visiblescr.min_x < 0)
- visiblescr.min_x = 0;
- if(visiblescr.min_y < 0)
- visiblescr.min_y = 0;
- if(visiblescr.max_x >= scr.max_x)
- visiblescr.max_x = scr.max_x - 2;
- if(visiblescr.max_y >= scr.max_y - 1)
- visiblescr.max_y = scr.max_y - 2;
-
-// LOG("CRTC regs - %i %i %i %i - %i %i %i %i - %i - %i\n",m_crtc.reg[0],m_crtc.reg[1],m_crtc.reg[2],m_crtc.reg[3],
-// m_crtc.reg[4],m_crtc.reg[5],m_crtc.reg[6],m_crtc.reg[7],m_crtc.reg[8],m_crtc.reg[9]);
- unsigned div = (m_crtc.reg[20] & 0x03) == 0 ? 4 : 2;
- if ((m_crtc.reg[20] & 0x0c) == 0)
- div *= BIT(m_crtc.reg[20], 4) ? 3 : 2;
- attotime refresh = attotime::from_ticks(scr.max_x * scr.max_y, (BIT(m_crtc.reg[20], 4) ? 69.55199_MHz_XTAL : 38.86363_MHz_XTAL) / div);
- LOG("m_screen->configure(%i,%i,[%i,%i,%i,%i],%f)\n", scr.max_x, scr.max_y, visiblescr.min_x, visiblescr.min_y, visiblescr.max_x, visiblescr.max_y, ATTOSECONDS_TO_HZ(refresh.as_attoseconds()));
- m_screen->configure(scr.max_x, scr.max_y, visiblescr, refresh.as_attoseconds());
-}
-
-TIMER_CALLBACK_MEMBER(x68k_state::x68k_hsync)
-{
- int hstate = param;
- attotime hsync_time;
-
- m_crtc.hblank = hstate;
- m_mfpdev->i7_w(!m_crtc.hblank);
-
- if(m_crtc.operation & 8)
- x68k_crtc_text_copy((m_crtc.reg[22] & 0xff00) >> 8,(m_crtc.reg[22] & 0x00ff),(m_crtc.reg[21] & 0xf));
-
- if(m_crtc.vmultiple == 2) // 256-line (doublescan)
- {
- if(hstate == 1)
- {
- if(m_oddscanline == 1)
- {
- int scan = m_screen->vpos();
- if(scan > m_crtc.vend)
- scan = m_crtc.vbegin;
- hsync_time = m_screen->time_until_pos(scan,(m_crtc.htotal + m_crtc.hend) / 2);
- m_scanline_timer->adjust(hsync_time);
- if(scan != 0)
- {
- if((ioport("options")->read() & 0x04))
- {
- m_screen->update_partial(scan);
- }
- }
- }
- else
- {
- int scan = m_screen->vpos();
- if(scan > m_crtc.vend)
- scan = m_crtc.vbegin;
- hsync_time = m_screen->time_until_pos(scan,m_crtc.hend / 2);
- m_scanline_timer->adjust(hsync_time);
- if(scan != 0)
- {
- if((ioport("options")->read() & 0x04))
- {
- m_screen->update_partial(scan);
- }
- }
- }
- }
- if(hstate == 0)
- {
- if(m_oddscanline == 1)
- {
- int scan = m_screen->vpos();
- if(scan > m_crtc.vend)
- scan = m_crtc.vbegin;
- else
- scan++;
- hsync_time = m_screen->time_until_pos(scan,m_crtc.hbegin / 2);
- m_scanline_timer->adjust(hsync_time, 1);
- m_oddscanline = 0;
- }
- else
- {
- hsync_time = m_screen->time_until_pos(m_screen->vpos(),(m_crtc.htotal + m_crtc.hbegin) / 2);
- m_scanline_timer->adjust(hsync_time, 1);
- m_oddscanline = 1;
- }
- }
- }
- else // 512-line
- {
- if(hstate == 1)
- {
- int scan = m_screen->vpos();
- if(scan > m_crtc.vend)
- scan = 0;
- hsync_time = m_screen->time_until_pos(scan,m_crtc.hend);
- m_scanline_timer->adjust(hsync_time);
- if(scan != 0)
- {
- if((ioport("options")->read() & 0x04))
- {
- m_screen->update_partial(scan);
- }
- }
- }
- if(hstate == 0)
- {
- hsync_time = m_screen->time_until_pos(m_screen->vpos()+1,m_crtc.hbegin);
- m_scanline_timer->adjust(hsync_time, 1);
- }
- }
-}
-TIMER_CALLBACK_MEMBER(x68k_state::x68k_crtc_raster_end)
+READ16_MEMBER(x68k_state::tvram_read)
{
- m_mfpdev->i6_w(1);
-}
-
-TIMER_CALLBACK_MEMBER(x68k_state::x68k_crtc_raster_irq)
-{
- int scan = param;
- attotime irq_time;
- attotime end_time;
-
- if(scan <= m_crtc.vtotal)
- {
- m_mfpdev->i6_w(0);
- m_screen->update_partial(scan);
- irq_time = m_screen->time_until_pos(scan,m_crtc.hbegin);
- // end of HBlank period clears GPIP6 also?
- end_time = m_screen->time_until_pos(scan,m_crtc.hend);
- m_raster_irq->adjust(irq_time, scan);
- timer_set(end_time, TIMER_X68K_CRTC_RASTER_END);
- LOG("GPIP6: Raster triggered at line %i (%i)\n",scan,m_screen->vpos());
- }
-}
-
-TIMER_CALLBACK_MEMBER(x68k_state::x68k_crtc_vblank_irq)
-{
- int val = param;
- attotime irq_time;
- int vblank_line;
-
- if(val == 1) // V-DISP on
- {
- m_crtc.vblank = 1;
- vblank_line = m_crtc.vbegin;
- irq_time = m_screen->time_until_pos(vblank_line,2);
- m_vblank_irq->adjust(irq_time);
- LOG("CRTC: VBlank on\n");
- }
- if(val == 0) // V-DISP off
- {
- m_crtc.vblank = 0;
- vblank_line = m_crtc.vend;
- if(vblank_line > m_crtc.vtotal)
- vblank_line = m_crtc.vtotal;
- irq_time = m_screen->time_until_pos(vblank_line,2);
- m_vblank_irq->adjust(irq_time, 1);
- LOG("CRTC: VBlank off\n");
- }
-
- m_mfpdev->tai_w(!m_crtc.vblank);
- m_mfpdev->i4_w(!m_crtc.vblank);
-}
-
-
-// CRTC "VINAS 1+2 / VICON" at 0xe80000
-/* 0xe80000 - Registers (all are 16-bit):
- * 0 - Horizontal Total (in characters)
- * 1 - Horizontal Sync End
- * 2 - Horizontal Display Begin
- * 3 - Horizontal Display End
- * 4 - Vertical Total (in scanlines)
- * 5 - Vertical Sync End
- * 6 - Vertical Display Begin
- * 7 - Vertical Display End
- * 8 - Fine Horizontal Sync Adjustment
- * 9 - Raster Line (for Raster IRQ mapped to MFP GPIP6)
- * 10/11 - Text Layer X and Y Scroll
- * 12/13 - Graphic Layer 0 X and Y Scroll
- * 14/15 - Graphic Layer 1 X and Y Scroll
- * 16/17 - Graphic Layer 2 X and Y Scroll
- * 18/19 - Graphic Layer 3 X and Y Scroll
- * 20 - bit 12 - Text VRAM mode : 0 = display, 1 = buffer
- * bit 11 - Graphic VRAM mode : 0 = display, 1 = buffer
- * bit 10 - "Real" screen size : 0 = 512x512, 1 = 1024x1024
- * bits 8,9 - Colour mode :
- * 00 = 16 colour 01 = 256 colour
- * 10 = Undefined 11 = 65,536 colour
- * bit 4 - Horizontal Frequency : 0 = 15.98kHz, 1 = 31.50kHz
- * bits 2,3 - Vertical dots :
- * 00 = 256 01 = 512
- * 10 or 11 = 1024 (interlaced)
- * bits 0,1 - Horizontal dots :
- * 00 = 256 01 = 512
- * 10 = 768 11 = 50MHz clock mode (Compact XVI or later)
- * 21 - bit 9 - Text Screen Access Mask Enable
- * bit 8 - Text Screen Simultaneous Plane Access Enable
- * bits 4-7 - Text Screen Simultaneous Plane Access Select
- * bits 0-3 - Text Screen Line Copy Plane Select
- * Graphic Screen High-speed Clear Page Select
- * 22 - Text Screen Line Copy
- * bits 15-8 - Source Line
- * bits 7-0 - Destination Line
- * 23 - Text Screen Mask Pattern
- *
- * 0xe80481 - Operation Port (8-bit):
- * bit 3 - Text Screen Line Copy Begin
- * bit 1 - Graphic Screen High-speed Clear Begin
- * bit 0 - Image Taking Begin (?)
- * Operation Port bits are cleared automatically when the requested
- * operation is completed.
- */
-WRITE16_MEMBER(x68k_state::x68k_crtc_w )
-{
- if (offset < 0x24)
- COMBINE_DATA(m_crtc.reg+offset);
- switch(offset)
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- x68k_crtc_refresh_mode();
- break;
- case 9: // CRTC raster IRQ (GPIP6)
- {
- attotime irq_time;
- data = m_crtc.reg[9];
- irq_time = m_screen->time_until_pos((data) / m_crtc.vmultiple,2);
-
- if(data != m_screen->vpos())
- m_mfpdev->i6_w(1);
- if(irq_time.as_double() > 0)
- m_raster_irq->adjust(irq_time, (data) / m_crtc.vmultiple);
- }
- LOG("CRTC: Write to raster IRQ register - %i\n",data);
- break;
- case 20:
- if(ACCESSING_BITS_0_7)
- {
- m_crtc.interlace = 0;
- switch(data & 0x0c)
- {
- case 0x00:
- m_crtc.height = 256;
- break;
- case 0x08:
- case 0x0c: // TODO: 1024 vertical, if horizontal freq = 31kHz
- m_crtc.height = 512;
- m_crtc.interlace = 1; // if 31kHz, 1024 lines = interlaced
- break;
- case 0x04:
- m_crtc.height = 512;
- if(!(m_crtc.reg[20] & 0x0010)) // if 15kHz, 512 lines = interlaced
- m_crtc.interlace = 1;
- break;
- }
- switch(data & 0x03)
- {
- case 0x00:
- m_crtc.width = 256;
- break;
- case 0x01:
- m_crtc.width = 512;
- break;
- case 0x02:
- case 0x03: // 0x03 = 50MHz clock mode (XVI only)
- m_crtc.width = 768;
- break;
- }
- }
-/* if(ACCESSING_BITS_8_15)
- {
- m_crtc.interlace = 0;
- if(data & 0x0400)
- m_crtc.interlace = 1;
- }*/
- logerror("CRTC: Register 20 = %04x\n", m_crtc.reg[20]);
- x68k_crtc_refresh_mode();
- break;
- case 576: // operation register
- m_crtc.operation = data;
- if(data & 0x02) // high-speed graphic screen clear
- {
- memset(&m_gvram[0],0,0x40000);
- timer_set(attotime::from_msec(10), TIMER_X68K_CRTC_OPERATION_END, 0x02); // time taken to do operation is a complete guess.
- }
- break;
- }
-// LOG("%s CRTC: Wrote %04x to CRTC register %i\n",machine().describe_context(),data,offset);
-}
-
-READ16_MEMBER(x68k_state::x68k_crtc_r )
-{
- if(offset < 24)
- {
-// LOG("%s CRTC: Read %04x from CRTC register %i\n",machine().describe_context(),m_crtc.reg[offset],offset);
- switch(offset)
- {
- case 9:
- return 0;
- case 10: // Text X/Y scroll
- case 11:
- case 12: // Graphic layer 0 scroll
- case 13:
- return m_crtc.reg[offset] & 0x3ff;
- case 14: // Graphic layer 1 scroll
- case 15:
- case 16: // Graphic layer 2 scroll
- case 17:
- case 18: // Graphic layer 3 scroll
- case 19:
- return m_crtc.reg[offset] & 0x1ff;
- default:
- return m_crtc.reg[offset];
- }
- }
- if(offset == 576) // operation port, operation bits are set to 0 when operation is complete
- return m_crtc.operation;
-// LOG("CRTC: [%08x] Read from unknown CRTC register %i\n",activecpu_get_pc(),offset);
- return 0xffff;
-}
-
-WRITE16_MEMBER(x68k_state::x68k_gvram_w )
-{
-// int xloc,yloc,pageoffset;
- /*
- G-VRAM usage is determined by colour depth and "real" screen size.
-
- For screen size of 1024x1024, all G-VRAM space is used, in one big page.
- At 1024x1024 real screen size, colour depth is always 4bpp, and ranges from
- 0xc00000-0xdfffff.
-
- For screen size of 512x512, the colour depth determines the page usage.
- 16 colours = 4 pages
- 256 colours = 2 pages
- 65,536 colours = 1 page
- Page 1 - 0xc00000-0xc7ffff Page 2 - 0xc80000-0xcfffff
- Page 3 - 0xd00000-0xd7ffff Page 4 - 0xd80000-0xdfffff
- */
-
- // handle different G-VRAM page setups
- if(m_crtc.reg[20] & 0x0800) // G-VRAM set to buffer
- {
- if(offset < 0x40000)
- COMBINE_DATA(&m_gvram[offset]);
- }
- else
- {
- switch(m_crtc.reg[20] & 0x0300)
- {
- case 0x0300:
- if(offset < 0x40000)
- COMBINE_DATA(&m_gvram[offset]);
- break;
- case 0x0100:
- if(offset < 0x40000)
- {
- m_gvram[offset] = (m_gvram[offset] & 0xff00) | (data & 0x00ff);
- }
- if(offset >= 0x40000 && offset < 0x80000)
- {
- m_gvram[offset-0x40000] = (m_gvram[offset-0x40000] & 0x00ff) | ((data & 0x00ff) << 8);
- }
- break;
- case 0x0000:
- if(offset < 0x40000)
- {
- m_gvram[offset] = (m_gvram[offset] & 0xfff0) | (data & 0x000f);
- }
- if(offset >= 0x40000 && offset < 0x80000)
- {
- m_gvram[offset-0x40000] = (m_gvram[offset-0x40000] & 0xff0f) | ((data & 0x000f) << 4);
- }
- if(offset >= 0x80000 && offset < 0xc0000)
- {
- m_gvram[offset-0x80000] = (m_gvram[offset-0x80000] & 0xf0ff) | ((data & 0x000f) << 8);
- }
- if(offset >= 0xc0000 && offset < 0x100000)
- {
- m_gvram[offset-0xc0000] = (m_gvram[offset-0xc0000] & 0x0fff) | ((data & 0x000f) << 12);
- }
- break;
- default:
- logerror("G-VRAM written while layer setup is undefined.\n");
- }
- }
+ return m_tvram[offset];
}
-WRITE16_MEMBER(x68k_state::x68k_tvram_w )
+WRITE16_MEMBER(x68k_state::tvram_write)
{
- uint16_t text_mask;
-
- text_mask = ~(m_crtc.reg[23]) & mem_mask;
-
- if(!(m_crtc.reg[21] & 0x0200)) // text access mask enable
- text_mask = 0xffff & mem_mask;
-
- mem_mask = text_mask;
-
- if(m_crtc.reg[21] & 0x0100)
- { // simultaneous T-VRAM plane access (I think ;))
- int plane,wr;
- offset = offset & 0x00ffff;
- wr = (m_crtc.reg[21] & 0x00f0) >> 4;
- for(plane=0;plane<4;plane++)
- {
- if(wr & (1 << plane))
- {
- COMBINE_DATA(&m_tvram[offset+0x10000*plane]);
- }
- }
- }
- else
- {
- COMBINE_DATA(&m_tvram[offset]);
- }
+ COMBINE_DATA(&m_tvram[offset]);
}
-READ16_MEMBER(x68k_state::x68k_gvram_r )
+READ16_MEMBER(x68k_state::gvram_read)
{
- uint16_t ret = 0;
-
- if(m_crtc.reg[20] & 0x0800) // G-VRAM set to buffer
- return m_gvram[offset];
-
- switch(m_crtc.reg[20] & 0x0300) // colour setup determines G-VRAM use
- {
- case 0x0300: // 65,536 colour (RGB) - 16-bits per word
- if(offset < 0x40000)
- ret = m_gvram[offset];
- else
- ret = 0xffff;
- break;
- case 0x0100: // 256 colour (paletted) - 8 bits per word
- if(offset < 0x40000)
- ret = m_gvram[offset] & 0x00ff;
- if(offset >= 0x40000 && offset < 0x80000)
- ret = (m_gvram[offset-0x40000] & 0xff00) >> 8;
- if(offset >= 0x80000)
- ret = 0xffff;
- break;
- case 0x0000: // 16 colour (paletted) - 4 bits per word
- if(offset < 0x40000)
- ret = m_gvram[offset] & 0x000f;
- if(offset >= 0x40000 && offset < 0x80000)
- ret = (m_gvram[offset-0x40000] & 0x00f0) >> 4;
- if(offset >= 0x80000 && offset < 0xc0000)
- ret = (m_gvram[offset-0x80000] & 0x0f00) >> 8;
- if(offset >= 0xc0000 && offset < 0x100000)
- ret = (m_gvram[offset-0xc0000] & 0xf000) >> 12;
- break;
- default:
- logerror("G-VRAM read while layer setup is undefined.\n");
- ret = 0xffff;
- }
-
- return ret;
+ return m_gvram[offset];
}
-READ16_MEMBER(x68k_state::x68k_tvram_r )
+WRITE16_MEMBER(x68k_state::gvram_write)
{
- return m_tvram[offset];
+ COMBINE_DATA(&m_gvram[offset]);
}
WRITE16_MEMBER(x68k_state::x68k_spritereg_w )
@@ -636,44 +119,44 @@ WRITE16_MEMBER(x68k_state::x68k_spritereg_w )
switch(offset)
{
case 0x400:
- m_bg0_8->set_scrollx(0,(data - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff);
- m_bg0_16->set_scrollx(0,(data - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff);
+ m_bg0_8->set_scrollx(0,(data - m_crtc->hbegin() - m_video.bg_hshift) & 0x3ff);
+ m_bg0_16->set_scrollx(0,(data - m_crtc->hbegin() - m_video.bg_hshift) & 0x3ff);
break;
case 0x401:
- m_bg0_8->set_scrolly(0,(data - m_crtc.vbegin) & 0x3ff);
- m_bg0_16->set_scrolly(0,(data - m_crtc.vbegin) & 0x3ff);
+ m_bg0_8->set_scrolly(0,(data - m_crtc->vbegin()) & 0x3ff);
+ m_bg0_16->set_scrolly(0,(data - m_crtc->vbegin()) & 0x3ff);
break;
case 0x402:
- m_bg1_8->set_scrollx(0,(data - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff);
- m_bg1_16->set_scrollx(0,(data - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff);
+ m_bg1_8->set_scrollx(0,(data - m_crtc->hbegin() - m_video.bg_hshift) & 0x3ff);
+ m_bg1_16->set_scrollx(0,(data - m_crtc->hbegin() - m_video.bg_hshift) & 0x3ff);
break;
case 0x403:
- m_bg1_8->set_scrolly(0,(data - m_crtc.vbegin) & 0x3ff);
- m_bg1_16->set_scrolly(0,(data - m_crtc.vbegin) & 0x3ff);
+ m_bg1_8->set_scrolly(0,(data - m_crtc->vbegin()) & 0x3ff);
+ m_bg1_16->set_scrolly(0,(data - m_crtc->vbegin()) & 0x3ff);
break;
case 0x406: // BG H-DISP (normally equals CRTC reg 2 value + 4)
if(data != 0x00ff)
{
- m_crtc.bg_visible_width = (m_crtc.reg[3] - ((data & 0x003f) - 4)) * 8;
- m_crtc.bg_hshift = ((data - (m_crtc.reg[2]+4)) * 8);
- if(m_crtc.bg_hshift > 0)
- m_crtc.bg_hshift = 0;
+ m_video.bg_visible_width = m_crtc->hend() - ((data & 0x003f) - 4) * 8;
+ m_video.bg_hshift = ((data - 4) * 8) - (m_crtc->hbegin() - 1);
+ if(m_video.bg_hshift > 0)
+ m_video.bg_hshift = 0;
}
break;
case 0x407: // BG V-DISP (like CRTC reg 6)
- m_crtc.bg_vshift = m_crtc.vshift;
+ m_video.bg_vshift = m_crtc->vshift();
break;
case 0x408: // BG H/V-Res
- m_crtc.bg_hvres = data & 0x1f;
+ m_video.bg_hvres = data & 0x1f;
if(data != 0xff)
{ // Handle when the PCG is using 256 and the CRTC is using 512
- if((m_crtc.bg_hvres & 0x0c) == 0x00 && (m_crtc.reg[20] & 0x0c) == 0x04)
- m_crtc.bg_double = 2;
+ if((m_video.bg_hvres & 0x0c) == 0x00 && m_crtc->vfactor() == 1)
+ m_video.bg_double = 2;
else
- m_crtc.bg_double = 1;
+ m_video.bg_double = 1;
}
else
- m_crtc.bg_double = 1;
+ m_video.bg_double = 1;
break;
}
}
@@ -724,7 +207,7 @@ void x68k_state::x68k_draw_text(bitmap_rgb32 &bitmap, int xscr, int yscr, rectan
for(line=rect.min_y;line<=rect.max_y;line++) // per scanline
{
// adjust for scroll registers
- loc = (((line - m_crtc.vbegin) + yscr) & 0x3ff) * 64;
+ loc = (((line - m_crtc->vbegin()) + yscr) & 0x3ff) * 64;
loc += (xscr / 16) & 0x7f;
loc &= 0xffff;
bit = 15 - (xscr & 0x0f);
@@ -763,16 +246,16 @@ bool x68k_state::x68k_draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprec
for(scanline=cliprect.min_y;scanline<=cliprect.max_y;scanline++) // per scanline
{
- if(m_crtc.reg[20] & 0x0400) // 1024x1024 "real" screen size - use 1024x1024 16-colour gfx layer
+ if(m_crtc->is_1024x1024()) // 1024x1024 "real" screen size - use 1024x1024 16-colour gfx layer
{
// adjust for scroll registers
if(m_video.reg[2] & 0x0010 && priority == m_video.gfxlayer_pri[0])
{
- xscr = (m_crtc.reg[12] & 0x3ff);
- yscr = (m_crtc.reg[13] & 0x3ff);
- lineoffset = (((scanline - m_crtc.vbegin) + yscr) & 0x3ff) * 1024;
+ xscr = (m_crtc->xscr_gfx(0) & 0x3ff);
+ yscr = (m_crtc->yscr_gfx(0) & 0x3ff);
+ lineoffset = (((scanline - m_crtc->vbegin()) + yscr) & 0x3ff) * 1024;
loc = xscr & 0x3ff;
- for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
+ for(pixel=m_crtc->hbegin();pixel<=m_crtc->hend();pixel++)
{
switch(lineoffset & 0xc0000)
{
@@ -810,14 +293,14 @@ bool x68k_state::x68k_draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprec
switch(m_video.reg[0] & 0x03)
{
case 0x00: // 16 colours
- xscr = ((m_crtc.reg[12+(page*2)])) & 0x1ff;
- yscr = ((m_crtc.reg[13+(page*2)])) & 0x1ff;
- lineoffset = (((scanline - m_crtc.vbegin) + yscr) & 0x1ff) * 512;
+ xscr = m_crtc->xscr_gfx(page) & 0x1ff;
+ yscr = m_crtc->yscr_gfx(page) & 0x1ff;
+ lineoffset = (((scanline - m_crtc->vbegin()) + yscr) & 0x1ff) * 512;
loc = xscr & 0x1ff;
shift = 4;
if((m_video.reg[2] & 0x1a00) == 0x1a00)
ret = true;
- for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
+ for(pixel=m_crtc->hbegin();pixel<=m_crtc->hend();pixel++)
{
colour = ((m_gvram[lineoffset + loc] >> page*shift) & 0x000f);
if(ret && (colour & 1))
@@ -848,14 +331,14 @@ bool x68k_state::x68k_draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprec
case 0x01: // 256 colours
if(page == 0 || page == 2)
{
- xscr = ((m_crtc.reg[12+(page*2)])) & 0x1ff;
- yscr = ((m_crtc.reg[13+(page*2)])) & 0x1ff;
- lineoffset = (((scanline - m_crtc.vbegin) + yscr) & 0x1ff) * 512;
+ xscr = m_crtc->xscr_gfx(page) & 0x1ff;
+ yscr = m_crtc->yscr_gfx(page) & 0x1ff;
+ lineoffset = (((scanline - m_crtc->vbegin()) + yscr) & 0x1ff) * 512;
loc = xscr & 0x1ff;
shift = 4;
if((m_video.reg[2] & 0x1a00) == 0x1a00)
ret = true;
- for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
+ for(pixel=m_crtc->hbegin();pixel<=m_crtc->hend();pixel++)
{
colour = ((m_gvram[lineoffset + loc] >> page*shift) & 0x00ff);
if(ret && (colour & 1))
@@ -885,11 +368,11 @@ bool x68k_state::x68k_draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprec
}
break;
case 0x03: // 65536 colours
- xscr = ((m_crtc.reg[12])) & 0x1ff;
- yscr = ((m_crtc.reg[13])) & 0x1ff;
- lineoffset = (((scanline - m_crtc.vbegin) + yscr) & 0x1ff) * 512;
+ xscr = m_crtc->xscr_gfx(0) & 0x1ff;
+ yscr = m_crtc->yscr_gfx(0) & 0x1ff;
+ lineoffset = (((scanline - m_crtc->vbegin()) + yscr) & 0x1ff) * 512;
loc = xscr & 0x1ff;
- for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
+ for(pixel=m_crtc->hbegin();pixel<=m_crtc->hend();pixel++)
{
colour = m_gvram[lineoffset + loc];
if(colour || (priority == 3))
@@ -913,7 +396,7 @@ void x68k_state::x68k_draw_gfx(bitmap_rgb32 &bitmap,rectangle cliprect)
//int xscr,yscr;
//int gpage;
- if(m_crtc.reg[20] & 0x0800) // if graphic layers are set to buffer, then they aren't visible
+ if(m_crtc->gfx_layer_buffer()) // if graphic layers are set to buffer, then they aren't visible
return;
m_gfxbitmap.fill(0, cliprect);
@@ -929,7 +412,7 @@ void x68k_state::x68k_draw_gfx(bitmap_rgb32 &bitmap,rectangle cliprect)
{
uint16_t colour;
bool blend = false;
- for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
+ for(pixel=m_crtc->hbegin();pixel<=m_crtc->hend();pixel++)
{
if((m_video.reg[0] & 0x03) == 3)
{
@@ -1024,15 +507,15 @@ void x68k_state::x68k_draw_sprites(bitmap_ind16 &bitmap, int priority, rectangle
int sx = (m_spritereg[ptr+0] & 0x3ff) - 16;
int sy = (m_spritereg[ptr+1] & 0x3ff) - 16;
- rect.min_x=m_crtc.hshift;
- rect.min_y=m_crtc.vshift;
- rect.max_x=rect.min_x + m_crtc.visible_width-1;
- rect.max_y=rect.min_y + m_crtc.visible_height-1;
+ rect.min_x=m_crtc->hshift();
+ rect.min_y=m_crtc->vshift();
+ rect.max_x=rect.min_x + m_crtc->visible_width()-1;
+ rect.max_y=rect.min_y + m_crtc->visible_height()-1;
- sx += m_crtc.bg_hshift;
+ sx += m_video.bg_hshift;
sx += m_sprite_shift;
- m_gfxdecode->gfx(1)->zoom_transpen(bitmap,cliprect,code,colour,xflip,yflip,m_crtc.hbegin+sx,m_crtc.vbegin+(sy*m_crtc.bg_double),0x10000,0x10000*m_crtc.bg_double,0x00);
+ m_gfxdecode->gfx(1)->zoom_transpen(bitmap,cliprect,code,colour,xflip,yflip,m_crtc->hbegin()+sx,m_crtc->vbegin()+(sy*m_video.bg_double),0x10000,0x10000*m_video.bg_double,0x00);
}
}
}
@@ -1147,19 +630,19 @@ uint32_t x68k_state::screen_update_x68000(screen_device &screen, bitmap_rgb32 &b
x68k_bg0 = m_bg0_16;
x68k_bg1 = m_bg1_16;
}
-// rect.max_x=m_crtc.width;
-// rect.max_y=m_crtc.height;
+// rect.max_x=m_crtc->width();
+// rect.max_y=m_crtc->height();
bitmap.fill(0, cliprect);
if(m_sysport.contrast == 0) // if monitor contrast is 0, then don't bother displaying anything
return 0;
- rect.min_x=m_crtc.hbegin;
- rect.min_y=m_crtc.vbegin;
-// rect.max_x=rect.min_x + m_crtc.visible_width-1;
-// rect.max_y=rect.min_y + m_crtc.visible_height-1;
- rect.max_x=m_crtc.hend;
- rect.max_y=m_crtc.vend;
+ rect.min_x=m_crtc->hbegin();
+ rect.min_y=m_crtc->vbegin();
+// rect.max_x=rect.min_x + m_crtc->visible_width()-1;
+// rect.max_y=rect.min_y + m_crtc->visible_height()-1;
+ rect.max_x=m_crtc->hend();
+ rect.max_y=m_crtc->vend();
if(rect.min_y < cliprect.min_y)
rect.min_y = cliprect.min_y;
@@ -1198,14 +681,14 @@ uint32_t x68k_state::screen_update_x68000(screen_device &screen, bitmap_rgb32 &b
{
if((m_spritereg[0x404] & 0x0030) == 0x10) // BG1 TXSEL
{
- x68k_bg0->set_scrollx(0,(m_spritereg[0x402] - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff);
- x68k_bg0->set_scrolly(0,(m_spritereg[0x403] - m_crtc.vbegin) & 0x3ff);
+ x68k_bg0->set_scrollx(0,(m_spritereg[0x402] - m_crtc->hbegin() - m_video.bg_hshift) & 0x3ff);
+ x68k_bg0->set_scrolly(0,(m_spritereg[0x403] - m_crtc->vbegin()) & 0x3ff);
x68k_bg0->draw(screen, m_pcgbitmap,rect,0,0);
}
else
{
- x68k_bg1->set_scrollx(0,(m_spritereg[0x402] - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff);
- x68k_bg1->set_scrolly(0,(m_spritereg[0x403] - m_crtc.vbegin) & 0x3ff);
+ x68k_bg1->set_scrollx(0,(m_spritereg[0x402] - m_crtc->hbegin() - m_video.bg_hshift) & 0x3ff);
+ x68k_bg1->set_scrolly(0,(m_spritereg[0x403] - m_crtc->vbegin()) & 0x3ff);
x68k_bg1->draw(screen, m_pcgbitmap,rect,0,0);
}
}
@@ -1214,14 +697,14 @@ uint32_t x68k_state::screen_update_x68000(screen_device &screen, bitmap_rgb32 &b
{
if((m_spritereg[0x404] & 0x0006) == 0x02) // BG0 TXSEL
{
- x68k_bg0->set_scrollx(0,(m_spritereg[0x400] - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff);
- x68k_bg0->set_scrolly(0,(m_spritereg[0x401] - m_crtc.vbegin) & 0x3ff);
+ x68k_bg0->set_scrollx(0,(m_spritereg[0x400] - m_crtc->hbegin() - m_video.bg_hshift) & 0x3ff);
+ x68k_bg0->set_scrolly(0,(m_spritereg[0x401] - m_crtc->vbegin()) & 0x3ff);
x68k_bg0->draw(screen, m_pcgbitmap,rect,0,0);
}
else
{
- x68k_bg1->set_scrollx(0,(m_spritereg[0x400] - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff);
- x68k_bg1->set_scrolly(0,(m_spritereg[0x401] - m_crtc.vbegin) & 0x3ff);
+ x68k_bg1->set_scrollx(0,(m_spritereg[0x400] - m_crtc->hbegin() - m_video.bg_hshift) & 0x3ff);
+ x68k_bg1->set_scrolly(0,(m_spritereg[0x401] - m_crtc->vbegin()) & 0x3ff);
x68k_bg1->draw(screen, m_pcgbitmap,rect,0,0);
}
}
@@ -1229,7 +712,7 @@ uint32_t x68k_state::screen_update_x68000(screen_device &screen, bitmap_rgb32 &b
for(scanline=rect.min_y;scanline<=rect.max_y;scanline++)
{
- for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
+ for(pixel=m_crtc->hbegin();pixel<=m_crtc->hend();pixel++)
{
uint8_t colour = m_pcgbitmap.pix16(scanline, pixel) & 0xff;
if((colour && (m_pcgpalette->pen(colour) & 0xffffff)) || ((m_video.reg[1] & 0x3000) == 0x2000))
@@ -1241,9 +724,9 @@ uint32_t x68k_state::screen_update_x68000(screen_device &screen, bitmap_rgb32 &b
// Text screen
if(m_video.reg[2] & 0x0020 && priority == m_video.text_pri)
{
- xscr = (m_crtc.reg[10] & 0x3ff);
- yscr = (m_crtc.reg[11] & 0x3ff);
- if(!(m_crtc.reg[20] & 0x1000)) // if text layer is set to buffer, then it's not visible
+ xscr = (m_crtc->xscr_text() & 0x3ff);
+ yscr = (m_crtc->yscr_text() & 0x3ff);
+ if(!m_crtc->text_layer_buffer()) // if text layer is set to buffer, then it's not visible
x68k_draw_text(bitmap,xscr,yscr,rect);
}
}
@@ -1253,7 +736,7 @@ uint32_t x68k_state::screen_update_x68000(screen_device &screen, bitmap_rgb32 &b
uint16_t colour;
for(scanline=rect.min_y;scanline<=rect.max_y;scanline++)
{
- for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
+ for(pixel=m_crtc->hbegin();pixel<=m_crtc->hend();pixel++)
{
colour = m_special.pix16(scanline, pixel) & 0xff;
if(colour)