diff --git a/include/vga.h b/include/vga.h index f836a610..9046683a 100644 --- a/include/vga.h +++ b/include/vga.h @@ -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); diff --git a/src/hardware/vga_crtc.cpp b/src/hardware/vga_crtc.cpp index c8b8950f..23ca0959 100644 --- a/src/hardware/vga_crtc.cpp +++ b/src/hardware/vga_crtc.cpp @@ -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; /* diff --git a/src/hardware/vga_draw.cpp b/src/hardware/vga_draw.cpp index 5643bfca..90c65a91 100644 --- a/src/hardware/vga_draw.cpp +++ b/src/hardware/vga_draw.cpp @@ -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);