1
0
Fork 0

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
This commit is contained in:
Sjoerd van der Berg 2004-07-08 17:20:59 +00:00
parent f84843769b
commit 36d07f2f46
2 changed files with 63 additions and 78 deletions

View file

@ -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;

View file

@ -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.mode<M_TEXT) && !(vga.draw.address_line_total & 1)) {
vga.draw.address_line_total/=2;
doubleheight=true;
height/=2;
}
vga.draw.lines_total=height;
vga.draw.parts_lines=vga.draw.lines_total/vga.draw.parts_total;
if (( width != vga.draw.width) || (height != vga.draw.height)) {
PIC_RemoveEvents(VGA_VerticalTimer);
PIC_RemoveEvents(VGA_VerticalDisplayEnd);
PIC_RemoveEvents(VGA_DrawPart);
vga.draw.drawing=false;
vga.draw.width=width;
vga.draw.height=height;
vga.draw.scaleh=scaleh;
vga.draw.doublewidth=doublewidth;
vga.draw.doubleheight=doubleheight;
if (doubleheight) vga.draw.lines_scaled=2;
else vga.draw.lines_scaled=1;
LOG(LOG_VGA,LOG_NORMAL)("Width %d, Height %d, fps %f",width,height,fps);
LOG(LOG_VGA,LOG_NORMAL)("Scalew %d, Scaleh %d aspect %f",scalew,scaleh,aspect_ratio);
RENDER_SetSize(width,height,8,aspect_ratio,scalew>1,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);
}
};