fmtowns: support partial updates and use for palette changes (nw)

This commit is contained in:
cracyc 2017-12-17 22:02:33 -06:00
parent 0d6d246fa8
commit 9cb22761f2
2 changed files with 37 additions and 21 deletions

View File

@ -105,6 +105,7 @@ class towns_state : public driver_device
m_icmemcard(*this, "icmemcard"), m_icmemcard(*this, "icmemcard"),
m_i8251(*this, "i8251"), m_i8251(*this, "i8251"),
m_rs232(*this, "rs232c"), m_rs232(*this, "rs232c"),
m_screen(*this, "screen"),
m_nvram(*this, "nvram"), m_nvram(*this, "nvram"),
m_nvram16(*this, "nvram16"), m_nvram16(*this, "nvram16"),
m_ctrltype(*this, "ctrltype"), m_ctrltype(*this, "ctrltype"),
@ -142,6 +143,7 @@ class towns_state : public driver_device
required_device<fmt_icmem_device> m_icmemcard; required_device<fmt_icmem_device> m_icmemcard;
required_device<i8251_device> m_i8251; required_device<i8251_device> m_i8251;
required_device<rs232_port_device> m_rs232; required_device<rs232_port_device> m_rs232;
required_device<screen_device> m_screen;
ram_device* m_messram; ram_device* m_messram;
cdrom_image_device* m_cdrom; cdrom_image_device* m_cdrom;
cdda_device* m_cdda; cdda_device* m_cdda;

View File

@ -504,6 +504,8 @@ void towns_state::towns_update_palette()
m_palette->set_pen_color(entry, r, g, b); m_palette->set_pen_color(entry, r, g, b);
break; break;
} }
if(!m_screen->vblank())
m_screen->update_partial(m_screen->vpos());
} }
/* Video/CRTC /* Video/CRTC
@ -1545,52 +1547,56 @@ void towns_state::towns_crtc_draw_layer(bitmap_rgb32 &bitmap,const rectangle* re
{ {
int line; int line;
int scanline; int scanline;
int height; int bottom;
int top;
uint8_t zoom; uint8_t zoom;
uint8_t count; uint8_t count;
if(layer == 0) if(layer == 0)
{ {
scanline = rect->min_y; scanline = rect->min_y;
height = (rect->max_y - rect->min_y); top = (scanline - m_video.towns_crtc_layerscr[0].min_y);
bottom = (rect->max_y - rect->min_y) + top;
zoom = ((m_video.towns_crtc_reg[27] & 0x00f0) >> 4) + 1; zoom = ((m_video.towns_crtc_reg[27] & 0x00f0) >> 4) + 1;
height /= zoom; count = top % zoom;
bottom /= zoom;
top /= zoom;
switch(m_video.towns_video_reg[0] & 0x03) switch(m_video.towns_video_reg[0] & 0x03)
{ {
case 0x01: case 0x01:
for(line=0;line<height;line++) for(line=top;line<=bottom;line++)
{ {
count = 0;
do do
{ {
towns_crtc_draw_scan_layer_16(bitmap,rect,layer,line,scanline); towns_crtc_draw_scan_layer_16(bitmap,rect,layer,line,scanline);
scanline++; scanline++;
count++; count++;
} while(count < zoom); } while(count < zoom);
count = 0;
} }
break; break;
case 0x02: case 0x02:
for(line=0;line<height;line++) for(line=top;line<=bottom;line++)
{ {
count = 0;
do do
{ {
towns_crtc_draw_scan_layer_256(bitmap,rect,layer,line,scanline); towns_crtc_draw_scan_layer_256(bitmap,rect,layer,line,scanline);
scanline++; scanline++;
count++; count++;
} while(count < zoom); } while(count < zoom);
count = 0;
} }
break; break;
case 0x03: case 0x03:
for(line=0;line<height;line++) for(line=top;line<=bottom;line++)
{ {
count = 0;
do do
{ {
towns_crtc_draw_scan_layer_hicolour(bitmap,rect,layer,line,scanline); towns_crtc_draw_scan_layer_hicolour(bitmap,rect,layer,line,scanline);
scanline++; scanline++;
count++; count++;
} while(count < zoom); } while(count < zoom);
count = 0;
} }
break; break;
} }
@ -1598,45 +1604,48 @@ void towns_state::towns_crtc_draw_layer(bitmap_rgb32 &bitmap,const rectangle* re
else else
{ {
scanline = rect->min_y; scanline = rect->min_y;
height = (rect->max_y - rect->min_y); top = (scanline - m_video.towns_crtc_layerscr[1].min_y);
bottom = (rect->max_y - rect->min_y) + top;
zoom = ((m_video.towns_crtc_reg[27] & 0xf000) >> 12) + 1; zoom = ((m_video.towns_crtc_reg[27] & 0xf000) >> 12) + 1;
height /= zoom; count = top % zoom;
bottom /= zoom;
top /= zoom;
switch(m_video.towns_video_reg[0] & 0x0c) switch(m_video.towns_video_reg[0] & 0x0c)
{ {
case 0x04: case 0x04:
for(line=0;line<height;line++) for(line=top;line<=bottom;line++)
{ {
count = 0;
do do
{ {
towns_crtc_draw_scan_layer_16(bitmap,rect,layer,line,scanline); towns_crtc_draw_scan_layer_16(bitmap,rect,layer,line,scanline);
scanline++; scanline++;
count++; count++;
} while(count < zoom); } while(count < zoom);
count = 0;
} }
break; break;
case 0x08: case 0x08:
for(line=0;line<height;line++) for(line=top;line<=bottom;line++)
{ {
count = 0;
do do
{ {
towns_crtc_draw_scan_layer_256(bitmap,rect,layer,line,scanline); towns_crtc_draw_scan_layer_256(bitmap,rect,layer,line,scanline);
scanline++; scanline++;
count++; count++;
} while(count < zoom); } while(count < zoom);
count = 0;
} }
break; break;
case 0x0c: case 0x0c:
for(line=0;line<height;line++) for(line=top;line<=bottom;line++)
{ {
count = 0;
do do
{ {
towns_crtc_draw_scan_layer_hicolour(bitmap,rect,layer,line,scanline); towns_crtc_draw_scan_layer_hicolour(bitmap,rect,layer,line,scanline);
scanline++; scanline++;
count++; count++;
} while(count < zoom); } while(count < zoom);
count = 0;
} }
break; break;
} }
@ -1806,19 +1815,24 @@ uint32_t towns_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
layer2_en = false; layer2_en = false;
} }
rectangle cliplayer0 = m_video.towns_crtc_layerscr[0];
cliplayer0 &= cliprect;
rectangle cliplayer1 = m_video.towns_crtc_layerscr[1];
cliplayer1 &= cliprect;
if(!(m_video.towns_video_reg[1] & 0x01)) if(!(m_video.towns_video_reg[1] & 0x01))
{ {
if((m_video.towns_layer_ctrl & 0x03) != 0 && layer1_en) if((m_video.towns_layer_ctrl & 0x03) != 0 && layer1_en)
towns_crtc_draw_layer(bitmap,&m_video.towns_crtc_layerscr[1],1); towns_crtc_draw_layer(bitmap,&cliplayer1,1);
if((m_video.towns_layer_ctrl & 0x0c) != 0 && layer2_en) if((m_video.towns_layer_ctrl & 0x0c) != 0 && layer2_en)
towns_crtc_draw_layer(bitmap,&m_video.towns_crtc_layerscr[0],0); towns_crtc_draw_layer(bitmap,&cliplayer0,0);
} }
else else
{ {
if((m_video.towns_layer_ctrl & 0x0c) != 0 && layer1_en) if((m_video.towns_layer_ctrl & 0x0c) != 0 && layer1_en)
towns_crtc_draw_layer(bitmap,&m_video.towns_crtc_layerscr[0],0); towns_crtc_draw_layer(bitmap,&cliplayer0,0);
if((m_video.towns_layer_ctrl & 0x03) != 0 && layer2_en) if((m_video.towns_layer_ctrl & 0x03) != 0 && layer2_en)
towns_crtc_draw_layer(bitmap,&m_video.towns_crtc_layerscr[1],1); towns_crtc_draw_layer(bitmap,&cliplayer1,1);
} }
#if 0 #if 0