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:
parent
34ccfaec46
commit
a32707e4e1
3 changed files with 36 additions and 20 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue