From 36d07f2f46914ef4ba2257692e909a5fcb88330e Mon Sep 17 00:00:00 2001 From: Sjoerd van der Berg Date: Thu, 8 Jul 2004 17:20:59 +0000 Subject: [PATCH] Handle width and height doubling slightly better and allow vga height stretching again Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1880 --- include/vga.h | 8 +-- src/hardware/vga_draw.cpp | 133 +++++++++++++++++--------------------- 2 files changed, 63 insertions(+), 78 deletions(-) diff --git a/include/vga.h b/include/vga.h index bd6dd84f..af45a822 100644 --- a/include/vga.h +++ b/include/vga.h @@ -23,12 +23,12 @@ #include "dosbox.h" enum VGAModes { - M_TEXT, - M_HERC_GFX,M_HERC_TEXT, M_CGA2,M_CGA4, M_EGA16, M_VGA, M_LIN8, + M_TEXT, + M_HERC_GFX,M_HERC_TEXT, M_CGA16,M_TANDY2,M_TANDY4,M_TANDY16,M_TANDY_TEXT, M_ERROR, }; @@ -114,10 +114,8 @@ typedef struct { Bitu hend; Bitu parts; } micro; - Bitu scaleh; bool double_scan; - bool double_scan_active; - Bit8u font_height; + bool doublewidth,doubleheight; Bit8u font[64*1024]; Bit8u * font_tables[2]; Bitu blinking; diff --git a/src/hardware/vga_draw.cpp b/src/hardware/vga_draw.cpp index ce14ddc2..891a2895 100644 --- a/src/hardware/vga_draw.cpp +++ b/src/hardware/vga_draw.cpp @@ -31,7 +31,6 @@ typedef Bit8u * (* VGA_Line_Handler)(Bitu vidstart,Bitu panning,Bitu line); static VGA_Line_Handler VGA_DrawLine; static Bit8u TempLine[1280]; - static Bit8u * VGA_Draw_1BPP_Line(Bitu vidstart,Bitu panning,Bitu line) { line*=8*1024;Bit32u * draw=(Bit32u *)TempLine; for (Bitu x=vga.draw.blocks;x>0;x--) { @@ -171,8 +170,6 @@ static void VGA_HorizontalTimer(void) { } static void VGA_DrawPart(Bitu lines) { - Bitu subline=0;Bitu vidofs=vga.config.real_start; - Bit8u * draw=0; while (lines--) { vga.draw.lines_done++; Bit8u * data=VGA_DrawLine(vga.draw.address,vga.draw.panning,vga.draw.address_line); @@ -187,10 +184,11 @@ static void VGA_DrawPart(Bitu lines) { vga.draw.address_line=0; } } - vga.draw.parts_left--; - if (vga.draw.parts_left) { - PIC_AddEvent(VGA_DrawPart,vga.draw.micro.parts,vga.draw.parts_lines); + if (--vga.draw.parts_left) { + PIC_AddEvent(VGA_DrawPart,vga.draw.micro.parts, + (vga.draw.parts_left!=1) ? vga.draw.parts_lines : (vga.draw.lines_total - vga.draw.lines_done)); } else { + vga.draw.drawing=false; RENDER_EndUpdate(); } } @@ -235,7 +233,8 @@ static void VGA_VerticalTimer(Bitu val) { break; } if (machine==MCH_TANDY) vga.draw.address+=vga.tandy.disp_bank << 14; - if (RENDER_StartUpdate()) { + if (!vga.draw.drawing && RENDER_StartUpdate()) { + vga.draw.drawing=true; PIC_AddEvent(VGA_DrawPart,vga.draw.micro.parts,vga.draw.parts_lines); } } @@ -313,17 +312,19 @@ void VGA_SetupDrawing(Bitu val) { if (vga.seq.clocking_mode & 0x8) { htotal*=2; } - vga.draw.font_height=(vga.crtc.maximum_scan_line&0xf)+1; + vga.draw.address_line_total=(vga.crtc.maximum_scan_line&0xf)+1; /* Check for dual transfer whatever thing,master clock/2 */ if (vga.s3.pll.cmd & 0x10) clock/=2; + vga.draw.double_scan=(vga.crtc.maximum_scan_line&0x80)>0; } else { - vga.draw.font_height=vga.other.max_scanline+1; + vga.draw.address_line_total=vga.other.max_scanline+1; htotal=vga.other.htotal; hdispend=vga.other.hdend; hrstart=vga.other.hsyncp; - vtotal=vga.draw.font_height*vga.other.vtotal+vga.other.vadjust; - vdispend=vga.draw.font_height*vga.other.vdend; - vrstart=vga.draw.font_height*vga.other.vsyncp; + vtotal=vga.draw.address_line_total*vga.other.vtotal+vga.other.vadjust; + vdispend=vga.draw.address_line_total*vga.other.vdend; + vrstart=vga.draw.address_line_total*vga.other.vsyncp; + vga.draw.double_scan=false; switch (machine) { case MCH_CGA: case MCH_TANDY: @@ -352,29 +353,20 @@ void VGA_SetupDrawing(Bitu val) { double correct_ratio=(100.0/525.0); double aspect_ratio=((double)htotal/((double)vtotal)/correct_ratio); - + vga.draw.resizing=false; - Bitu width,height; - Bitu scalew=1; - Bitu scaleh=1; - width=hdispend; - height=vdispend; - vga.draw.double_scan=false; + Bitu width=hdispend; + Bitu height=vdispend; + bool doubleheight=false; + bool doublewidth=false; switch (vga.mode) { case M_VGA: - scalew=2;scaleh*=vga.draw.font_height; - if (vga.crtc.maximum_scan_line&0x80) scaleh*=2; - vga.draw.lines_scaled=scaleh; - vga.draw.address_line_total=1; - height/=scaleh;width<<=2; + doublewidth=true; + width<<=2; VGA_DrawLine=VGA_Draw_VGA_Line; break; case M_LIN8: - scaleh*=vga.draw.font_height; - if (vga.crtc.maximum_scan_line&0x80) scaleh*=2; - vga.draw.lines_scaled=scaleh; - vga.draw.address_line_total=1; - height/=scaleh;width<<=3; + width<<=3; /* Use HW mouse cursor drawer if enabled */ if(vga.s3.hgc.curmode & 0x1) { VGA_DrawLine=VGA_Draw_VGA_Line_HWMouse; @@ -383,85 +375,65 @@ void VGA_SetupDrawing(Bitu val) { } break; case M_EGA16: - scaleh*=vga.draw.font_height; - if (vga.crtc.maximum_scan_line&0x80) scaleh*=2; - vga.draw.lines_scaled=scaleh; - if (vga.seq.clocking_mode & 0x8) scalew*=2; - width<<=3;height/=scaleh; - vga.draw.address_line_total=1; + doublewidth=(vga.seq.clocking_mode & 0x8) > 0; + width<<=3; VGA_DrawLine=VGA_Draw_EGA_Line; break; case M_CGA4: - scaleh=2;scalew*=2; + doublewidth=true; vga.draw.blocks=width*2; - vga.draw.lines_scaled=1; - vga.draw.address_line_total=2; - width<<=3;height/=2; + width<<=3; VGA_DrawLine=VGA_Draw_2BPP_Line; break; case M_CGA2: - scaleh=2; + doubleheight=true; vga.draw.blocks=width; - vga.draw.lines_scaled=1; - vga.draw.address_line_total=2; - width<<=4;height/=2; + width<<=4; VGA_DrawLine=VGA_Draw_1BPP_Line; break; case M_TEXT: aspect_ratio=1.0; - vga.draw.address_line_total=vga.draw.font_height; vga.draw.blocks=width; - if (vga.seq.clocking_mode & 0x8) scalew*=2; - if (vga.crtc.maximum_scan_line&0x80) scaleh*=2; - height/=scaleh; - vga.draw.lines_scaled=scaleh; + doublewidth=(vga.seq.clocking_mode & 0x8) > 0; width<<=3; /* 8 bit wide text font */ VGA_DrawLine=VGA_TEXT_Draw_Line; break; case M_HERC_GFX: aspect_ratio=1.5; - vga.draw.address_line_total=vga.draw.font_height; vga.draw.blocks=width*2; - vga.draw.lines_scaled=1; width*=16; VGA_DrawLine=VGA_Draw_1BPP_Line; break; case M_TANDY2: - scaleh=2;aspect_ratio=1.2; - scalew=(vga.tandy.mode_control & 0x10) ? 1 : 2; - vga.draw.blocks=width*8/scalew; - vga.draw.address_line_total=vga.draw.font_height; - vga.draw.lines_scaled=1; + aspect_ratio=1.2; + doubleheight=true; + doublewidth=(vga.tandy.mode_control & 0x10)==0; + vga.draw.blocks=width * (doublewidth ? 4:8); width=vga.draw.blocks*2; VGA_DrawLine=VGA_Draw_1BPP_Line; break; case M_TANDY4: - scaleh=2;aspect_ratio=1.2; - scalew=(vga.tandy.mode_control & 0x10) ? 1 : 2; - vga.draw.blocks=width*8/scalew; - vga.draw.address_line_total=vga.draw.font_height; - vga.draw.lines_scaled=1; + aspect_ratio=1.2; + doubleheight=true; + doublewidth=(vga.tandy.mode_control & 0x10)==0; + vga.draw.blocks=width * (doublewidth ? 4:8); width=vga.draw.blocks*2; VGA_DrawLine=VGA_Draw_2BPP_Line; break; case M_TANDY16: - scaleh=2;aspect_ratio=1.2; - scalew=(vga.tandy.mode_control & 0x10) ? 1 : 2; - vga.draw.blocks=width*4/scalew; - vga.draw.address_line_total=vga.draw.font_height; - vga.draw.lines_scaled=1; + aspect_ratio=1.2; + doubleheight=true; + doublewidth=(vga.tandy.mode_control & 0x10)==0; + vga.draw.blocks=width * (doublewidth ? 2:4); width=vga.draw.blocks*2; VGA_DrawLine=VGA_Draw_4BPP_Line; break; case M_TANDY_TEXT: - scalew=(vga.tandy.mode_control & 0x1) ? 1 : 2; + doublewidth=(vga.tandy.mode_control & 0x1)==0; case M_HERC_TEXT: aspect_ratio=1; - scaleh=(vga.mode==M_HERC_TEXT) ? 1 : 2; - vga.draw.lines_scaled=1; - vga.draw.address_line_total=vga.draw.font_height; + doubleheight=(vga.mode!=M_HERC_TEXT); vga.draw.blocks=width; - vga.draw.lines_scaled=1; width<<=3; VGA_DrawLine=VGA_TEXT_Draw_Line; break; @@ -469,19 +441,34 @@ void VGA_SetupDrawing(Bitu val) { LOG(LOG_VGA,LOG_ERROR)("Unhandled VGA type %d while checking for resolution"); }; VGA_CheckScanLength(); + if (vga.draw.double_scan) { + height/=2; + doubleheight=true; + } + //Only check for exra double heigh in vga modes + if (!doubleheight && (vga.mode1,scaleh>1); + LOG(LOG_VGA,LOG_NORMAL)("%s width, %s height aspect %f", + doublewidth ? "double":"normal",doubleheight ? "double":"normal",aspect_ratio); + RENDER_SetSize(width,height,8,aspect_ratio,doublewidth,doubleheight); PIC_AddEvent(VGA_VerticalTimer,vga.draw.micro.vtotal); } };