From 549100192361812e0adfccdf898141040abb8338 Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Sun, 30 Mar 2008 18:02:23 +0000 Subject: [PATCH] Add zooming stuff from hal. Add some fixes by wd and hal to prevent crashing related not enough lines calculated with screenresizes (vgaonly). Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3134 --- include/vga.h | 3 +-- src/hardware/vga_crtc.cpp | 20 ++++++++++++----- src/hardware/vga_dac.cpp | 5 ++++- src/hardware/vga_draw.cpp | 45 ++++++++++++++++++++++----------------- 4 files changed, 45 insertions(+), 28 deletions(-) diff --git a/include/vga.h b/include/vga.h index ba39f2b2..7a849bf5 100644 --- a/include/vga.h +++ b/include/vga.h @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: vga.h,v 1.39 2008-02-06 18:22:27 c2woody Exp $ */ +/* $Id: vga.h,v 1.40 2008-03-30 18:02:23 qbix79 Exp $ */ #ifndef DOSBOX_VGA_H #define DOSBOX_VGA_H @@ -128,7 +128,6 @@ typedef struct { double vdend, vtotal; double hdend, htotal; double parts; - double virtline; } delay; double aspect_ratio; bool double_scan; diff --git a/src/hardware/vga_crtc.cpp b/src/hardware/vga_crtc.cpp index cc941e12..70fce996 100644 --- a/src/hardware/vga_crtc.cpp +++ b/src/hardware/vga_crtc.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: vga_crtc.cpp,v 1.31 2008-02-06 18:23:34 c2woody Exp $ */ +/* $Id: vga_crtc.cpp,v 1.32 2008-03-30 18:02:23 qbix79 Exp $ */ #include #include "dosbox.h" @@ -141,11 +141,21 @@ void vga_write_p3d5(Bitu port,Bitu val,Bitu iolen) { if (IS_VGA_ARCH) vga.config.line_compare=(vga.config.line_compare & 0x5ff)|(val&0x40)<<3; - // don't call resize on doublescan change (magic.exe by European Technology) - if ((vga.crtc.maximum_scan_line ^ val) & ((svgaCard==SVGA_None)?0x3f:0xbf)) { + if(IS_VGA_ARCH && (svgaCard==SVGA_None) && (vga.mode==M_EGA || vga.mode==M_VGA)) { + // in vgaonly mode we take special care of line repeats (excluding CGA modes) + if ((vga.crtc.maximum_scan_line ^ val) & 0x20) { + crtc(maximum_scan_line)=val; + VGA_StartResize(); + } crtc(maximum_scan_line)=val; - VGA_StartResize(); - } else crtc(maximum_scan_line)=val; + vga.draw.address_line_total = (val &0x1F) + 1; + if(val&0x80) vga.draw.address_line_total*=2; + } else { + if ((vga.crtc.maximum_scan_line ^ val) & 0xbf) { + crtc(maximum_scan_line)=val; + VGA_StartResize(); + } + } /* 0-4 Number of scan lines in a character row -1. In graphics modes this is the number of times (-1) the line is displayed before passing on to diff --git a/src/hardware/vga_dac.cpp b/src/hardware/vga_dac.cpp index 80dc7196..2dd7f52a 100644 --- a/src/hardware/vga_dac.cpp +++ b/src/hardware/vga_dac.cpp @@ -179,9 +179,12 @@ void VGA_DAC_CombineColor(Bit8u attr,Bit8u pal) { /* Check if this is a new color */ vga.dac.combine[attr]=pal; switch (vga.mode) { - case M_VGA: case M_LIN8: break; + case M_VGA: + // used by copper demo; almost no video card seems to suport it + if(!IS_VGA_ARCH || (svgaCard!=SVGA_None)) break; + default: vga.dac.xlat16[attr] = ((vga.dac.rgb[pal].blue>>1)&0x1f) | (((vga.dac.rgb[pal].green)&0x3f)<<5)| diff --git a/src/hardware/vga_draw.cpp b/src/hardware/vga_draw.cpp index dbfb1ba6..033c5ad7 100644 --- a/src/hardware/vga_draw.cpp +++ b/src/hardware/vga_draw.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: vga_draw.cpp,v 1.93 2008-03-08 12:29:59 c2woody Exp $ */ +/* $Id: vga_draw.cpp,v 1.94 2008-03-30 18:02:23 qbix79 Exp $ */ #include #include @@ -634,17 +634,12 @@ static INLINE void VGA_ChangesEnd(void ) { static void VGA_DrawSingleLine(Bitu blah) { if(vga.attr.enabled || (!(vga.mode==M_VGA || vga.mode==M_EGA))) { Bit8u * data=VGA_DrawLine( vga.draw.address, vga.draw.address_line ); - // Magic Circle last part - if((vga.crtc.maximum_scan_line & 0x80)&& !vga.draw.doubleheight) - RENDER_DrawLine(data); RENDER_DrawLine(data); } else { // else draw overscan color line // TODO: black line should be good enough for now // (DoWhackaDo) memset(TempLine, 0, sizeof(TempLine)); - if((vga.crtc.maximum_scan_line & 0x80)&& !vga.draw.doubleheight) - RENDER_DrawLine(TempLine); RENDER_DrawLine(TempLine); } @@ -662,8 +657,8 @@ static void VGA_DrawSingleLine(Bitu blah) { } vga.draw.address_line=0; } - if ((vga.draw.lines_done < vga.draw.lines_total) && (!vga.draw.resizing)) { - PIC_AddEvent(VGA_DrawSingleLine,(float)vga.draw.delay.virtline); + if (vga.draw.lines_done < vga.draw.lines_total) { + PIC_AddEvent(VGA_DrawSingleLine,(float)vga.draw.delay.htotal); } else RENDER_EndUpdate(); } @@ -855,7 +850,7 @@ static void VGA_VerticalTimer(Bitu val) { vga.draw.vret_triggered=true; } } - if ((IS_VGA_ARCH) && (svgaCard==SVGA_None)) PIC_AddEvent(VGA_DrawSingleLine,(float)vga.draw.delay.htotal); + if ((IS_VGA_ARCH) && (svgaCard==SVGA_None)) PIC_AddEvent(VGA_DrawSingleLine,(float)(vga.draw.delay.htotal/4.0)); else PIC_AddEvent(VGA_DrawPart,(float)vga.draw.delay.parts,vga.draw.parts_lines); //VGA_DrawPart( vga.draw.parts_lines ); //PIC_AddEvent(VGA_DrawPart,(float)vga.draw.delay.parts,vga.draw.parts_lines); @@ -1010,9 +1005,17 @@ void VGA_SetupDrawing(Bitu val) { if (vga.seq.clocking_mode & 0x8) { htotal*=2; } - vga.draw.address_line_total=(vga.crtc.maximum_scan_line&0xf)+1; - - if (IS_VGA_ARCH) vga.draw.double_scan=(vga.crtc.maximum_scan_line&0x80)>0; + vga.draw.address_line_total=(vga.crtc.maximum_scan_line&0x1f)+1; + if(IS_VGA_ARCH && (svgaCard==SVGA_None) && (vga.mode==M_EGA || vga.mode==M_VGA)) { + // vgaonly; can't use with CGA because these use address_line for their + // own purposes. + // Set the low resolution modes to have as many lines as are scanned - + // Quite a few demos change the max_scanline register at display time + // to get SFX: Majic12 show, Magic circle, Copper, GBU, Party91 + if( vga.crtc.maximum_scan_line&0x80) vga.draw.address_line_total*=2; + vga.draw.double_scan=false; + } + else if (IS_VGA_ARCH) vga.draw.double_scan=(vga.crtc.maximum_scan_line&0x80)>0; else vga.draw.double_scan=(vtotal==262); } else { htotal = vga.other.htotal + 1; @@ -1313,11 +1316,15 @@ void VGA_SetupDrawing(Bitu val) { if (IS_VGA_ARCH) height/=2; doubleheight=true; } - //Only check for extra double height in vga modes - if (!doubleheight && (vga.mode