1
0
Fork 0

Change the video card timing a bit. Fix a few bugs related to the palette registers. Fix pel_panning.

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2819
This commit is contained in:
Peter Veenstra 2007-02-22 08:47:45 +00:00
parent 34ccfaec46
commit a32707e4e1
3 changed files with 36 additions and 20 deletions

View file

@ -23,10 +23,13 @@
#define attr(blah) vga.attr.blah
void VGA_ATTR_SetPalette(Bit8u index,Bit8u val) {
if (vga.attr.mode_control & 0x80) val=(val&0xf) | (vga.attr.color_select << 4);
else val=(val & 63) | (vga.attr.color_select & 0xc) << 4;
vga.attr.palette[index] = val;
if (vga.attr.mode_control & 0x80) val = (val&0xf) | (vga.attr.color_select << 4);
val &= 63;
val |= (vga.attr.color_select & 0xc) << 4;
VGA_DAC_CombineColor(index,val);
}
Bitu read_p3c0(Bitu port,Bitu iolen) {
//Wcharts
return 0x0;

View file

@ -125,7 +125,7 @@ static void write_p3c9(Bitu port,Bitu val,Bitu iolen) {
default:
/* Check for attributes and DAC entry link */
for (Bitu i=0;i<16;i++) {
if (vga.attr.palette[i]==vga.dac.write_index) {
if (vga.dac.combine[i]==vga.dac.write_index) {
RENDER_SetPal(i,
vga.dac.rgb[vga.dac.write_index].red << 2,
vga.dac.rgb[vga.dac.write_index].green << 2,
@ -167,11 +167,10 @@ static Bitu read_p3c9(Bitu port,Bitu iolen) {
void VGA_DAC_CombineColor(Bit8u attr,Bit8u pal) {
/* Check if this is a new color */
vga.attr.palette[attr]=pal;
vga.dac.combine[attr]=pal;
switch (vga.mode) {
case M_VGA:
case M_LIN8:
case M_LIN16:
break;
default:
RENDER_SetPal(attr,
@ -188,7 +187,7 @@ void VGA_DAC_SetEntry(Bitu entry,Bit8u red,Bit8u green,Bit8u blue) {
vga.dac.rgb[entry].green=green;
vga.dac.rgb[entry].blue=blue;
for (Bitu i=0;i<16;i++)
if (vga.attr.palette[i]==entry)
if (vga.dac.combine[i]==entry)
RENDER_SetPal(i,red << 2,green << 2,blue << 2);
}

View file

@ -145,10 +145,17 @@ static Bit8u * VGA_Draw_Changes_Line(Bitu vidstart, Bitu line) {
Bitu checkMask = vga.changes.checkMask;
Bit8u *map = vga.changes.map;
Bitu start = (vidstart >> VGA_CHANGE_SHIFT);
Bitu end = ((vidstart + vga.changes.lineWidth ) >> VGA_CHANGE_SHIFT);
Bitu end = ((vidstart + vga.draw.line_length ) >> VGA_CHANGE_SHIFT);
for (; start <= end;start++) {
if ( map[start] & checkMask ) {
return &vga.draw.linear_base[ vidstart & vga.draw.linear_mask ];
Bit8u *ret = &vga.draw.linear_base[ vidstart & vga.draw.linear_mask ];
#if !defined(C_UNALIGNED_MEMORY)
if (GCC_UNLIKELY( ((Bitu)ret) & (sizeof(Bitu)-1)) ) {
memcpy( TempLine, ret, vga.draw.line_length );
return TempLine;
}
#endif
return ret;
}
}
// memset( TempLine, 0x30, vga.changes.lineWidth );
@ -159,7 +166,14 @@ static Bit8u * VGA_Draw_Changes_Line(Bitu vidstart, Bitu line) {
#endif
static Bit8u * VGA_Draw_Linear_Line(Bitu vidstart, Bitu line) {
return &vga.draw.linear_base[ vidstart & vga.draw.linear_mask ];
Bit8u *ret = &vga.draw.linear_base[ vidstart & vga.draw.linear_mask ];
#if !defined(C_UNALIGNED_MEMORY)
if (GCC_UNLIKELY( ((Bitu)ret) & (sizeof(Bitu)-1)) ) {
memcpy( TempLine, ret, vga.draw.line_length );
return TempLine;
}
#endif
return ret;
}
//Test version, might as well keep it
@ -436,7 +450,7 @@ static void VGA_DrawPart(Bitu lines) {
#endif
vga.draw.address=0;
if(!(vga.attr.mode_control&0x20))
vga.draw.address += vga.draw.panning;
vga.draw.address += vga.config.pel_panning;
vga.draw.address_line=0;
#ifdef VGA_KEEP_CHANGES
vga.changes.start = vga.draw.address >> VGA_CHANGE_SHIFT;
@ -499,7 +513,8 @@ static void VGA_VerticalTimer(Bitu val) {
error = vga.draw.delay.framestart - error - vga.draw.delay.vtotal;
// if (abs(error) > 0.001 )
// LOG_MSG("vgaerror: %f",error);
PIC_AddEvent(VGA_VerticalTimer, (float)vga.draw.delay.vtotal );
PIC_AddEvent( VGA_VerticalTimer, (float)vga.draw.delay.vtotal );
PIC_AddEvent( VGA_VerticalDisplayEnd, (float)vga.draw.delay.vrstart );
if ( GCC_UNLIKELY( vga.draw.parts_left )) {
LOG(LOG_VGAMISC,LOG_NORMAL)( "Parts left: %d", vga.draw.parts_left );
PIC_RemoveEvents( &VGA_DrawPart );
@ -510,11 +525,12 @@ static void VGA_VerticalTimer(Bitu val) {
if (!RENDER_StartUpdate())
return;
//TODO Maybe check for an active frame on parts_left and clear that first?
vga.draw.parts_left=vga.draw.parts_total;
vga.draw.lines_done=0;
vga.draw.address=vga.config.display_start;
vga.draw.address_line=vga.config.hlines_skip;
vga.draw.split_line=(vga.config.line_compare/vga.draw.lines_scaled);
vga.draw.parts_left = vga.draw.parts_total;
vga.draw.lines_done = 0;
// vga.draw.address=vga.config.display_start;
vga.draw.address = vga.config.real_start;
vga.draw.address_line = vga.config.hlines_skip;
vga.draw.split_line = (vga.config.line_compare/vga.draw.lines_scaled);
switch (vga.mode) {
case M_EGA:
case M_LIN4:
@ -543,8 +559,7 @@ static void VGA_VerticalTimer(Bitu val) {
#endif
break;
case M_TEXT:
vga.draw.address *= 2;
vga.draw.panning = vga.config.pel_panning;
vga.draw.address = vga.config.display_start * 2;
case M_TANDY_TEXT:
case M_HERC_TEXT:
vga.draw.cursor.address=vga.config.cursor_start*2;
@ -944,10 +959,9 @@ void VGA_SetupDrawing(Bitu val) {
}
vga.draw.lines_total=height;
vga.draw.parts_lines=vga.draw.lines_total/vga.draw.parts_total;
vga.draw.line_length = width * ((bpp + 1) / 8);
#ifdef VGA_KEEP_CHANGES
vga.changes.active = false;
vga.changes.lineWidth = width * ((bpp + 1) / 8);
vga.changes.frame = 0;
vga.changes.writeMask = 1;
#endif