1
0
Fork 0

New function to recalculate some values after a scanline length change

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1665
This commit is contained in:
Sjoerd van der Berg 2004-02-07 23:40:46 +00:00
parent 7ca20ac50f
commit 84058c007b
3 changed files with 28 additions and 10 deletions

View file

@ -296,6 +296,7 @@ void VGA_SetMode(VGAModes mode);
void VGA_SetupHandlers(void);
void VGA_StartResize(void);
void VGA_SetupDrawing(Bitu val);
void VGA_CheckScanLength(void);
/* Some DAC/Attribute functions */
void VGA_DAC_CombineColor(Bit8u attr,Bit8u pal);

View file

@ -222,6 +222,7 @@ void write_p3d5(Bit32u port,Bit8u val) {
crtc(offset)=val;
vga.config.scan_len&=0x300;
vga.config.scan_len|=val;
VGA_CheckScanLength();
/*
0-7 Number of bytes in a scanline / K. Where K is 2 for byte mode, 4 for
word mode and 8 for Double Word mode.
@ -330,7 +331,7 @@ void write_p3d5(Bit32u port,Bit8u val) {
if (((val & 0x4) ^ (vga.config.scan_len >> 6)) & 0x4) {
vga.config.scan_len&=0x2ff;
vga.config.scan_len|=(val & 0x4) << 6;
VGA_StartResize();
VGA_CheckScanLength();
}
break;
/*
@ -351,7 +352,7 @@ void write_p3d5(Bit32u port,Bit8u val) {
if (((val & 0x30) ^ (vga.config.scan_len >> 4)) & 0x30) {
vga.config.scan_len&=0xff;
vga.config.scan_len|=(val & 0x30) << 4;
VGA_StartResize();
VGA_CheckScanLength();
}
break;
/*

View file

@ -199,6 +199,29 @@ static void VGA_VerticalTimer(Bitu val) {
}
}
void VGA_CheckScanLength(void) {
switch (vga.mode) {
case M_EGA16:
case M_VGA:
case M_LIN8:
vga.draw.address_add=vga.config.scan_len*2;
break;
case M_CGA2:case M_CGA4:case M_CGA16:
vga.draw.address_add=80;
break;
case M_TANDY16:
vga.draw.address_add=160;
break;
case M_TEXT16:
case M_TEXT2:
vga.draw.address_add=vga.config.scan_len*4;
break;
case M_HERC:
vga.draw.address_add=vga.draw.blocks;
break;
}
}
void VGA_SetupDrawing(Bitu val) {
/* Calculate the FPS for this screen */
double fps;
@ -265,14 +288,12 @@ void VGA_SetupDrawing(Bitu val) {
vga.draw.lines_scaled=scaleh;
height/=scaleh;
width<<=2;
vga.draw.address_add=vga.config.scan_len*2;
vga.draw.address_line_total=1;
VGA_DrawLine=VGA_VGA_Draw_Line;
break;
case M_LIN8:
width<<=3;
scaleh*=vga.draw.font_height;
vga.draw.address_add=vga.config.scan_len*2;
vga.draw.lines_scaled=scaleh;
vga.draw.address_line_total=1;
VGA_DrawLine=VGA_VGA_Draw_Line;
@ -284,7 +305,6 @@ void VGA_SetupDrawing(Bitu val) {
vga.draw.lines_scaled=scaleh;
height/=scaleh;
if (vga.seq.clocking_mode & 0x8) scalew*=2;
vga.draw.address_add=vga.config.scan_len*2;
vga.draw.address_line_total=1;
VGA_DrawLine=VGA_EGA_Draw_Line;
break;
@ -296,7 +316,6 @@ void VGA_SetupDrawing(Bitu val) {
height/=2;
vga.draw.lines_scaled=1;
vga.draw.address_line_total=2;
vga.draw.address_add=80; //CGA doesn't have an offset reg
VGA_DrawLine=(vga.mode == M_CGA4) ? VGA_CGA4_Draw_Line : VGA_CGA16_Draw_Line;
break;
case M_CGA2:
@ -305,7 +324,6 @@ void VGA_SetupDrawing(Bitu val) {
vga.draw.blocks=width;
width<<=3;
vga.draw.address_line_total=2;
vga.draw.address_add=80; //CGA doesn't have an offset reg
vga.draw.lines_scaled=1;
VGA_DrawLine=VGA_CGA2_Draw_Line;
break;
@ -313,7 +331,6 @@ void VGA_SetupDrawing(Bitu val) {
vga.draw.address_line_total=4;
width*=9;
vga.draw.blocks=width/8;
vga.draw.address_add=width/8;
vga.draw.lines_scaled=1;
height=348;
aspect_ratio=1.5;
@ -322,7 +339,6 @@ void VGA_SetupDrawing(Bitu val) {
case M_TANDY16:
scaleh=2;scalew=2;
vga.draw.blocks=width*2;
vga.draw.address_add=160;
vga.draw.address_line_total=4;
vga.draw.lines_scaled=1;
width<<=2;height/=2;
@ -336,7 +352,6 @@ void VGA_SetupDrawing(Bitu val) {
};
vga.draw.address_line_total=vga.draw.font_height;
vga.draw.blocks=width;
vga.draw.address_add=vga.config.scan_len*4;
if (vga.seq.clocking_mode & 0x8) scalew*=2;
if (vga.crtc.maximum_scan_line&0x80) scaleh*=2;
vga.draw.lines_scaled=scaleh;
@ -349,6 +364,7 @@ void VGA_SetupDrawing(Bitu val) {
default:
LOG(LOG_VGA,LOG_ERROR)("Unhandled VGA type %d while checking for resolution");
};
VGA_CheckScanLength();
vga.draw.lines_total=height;
if (( width != vga.draw.width) || (height != vga.draw.height)) {
PIC_RemoveEvents(VGA_VerticalTimer);