diff --git a/src/hardware/vga_attr.cpp b/src/hardware/vga_attr.cpp index 0ca6b54f..3a0e3f90 100644 --- a/src/hardware/vga_attr.cpp +++ b/src/hardware/vga_attr.cpp @@ -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; diff --git a/src/hardware/vga_dac.cpp b/src/hardware/vga_dac.cpp index 980e0654..9aee8848 100644 --- a/src/hardware/vga_dac.cpp +++ b/src/hardware/vga_dac.cpp @@ -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); } diff --git a/src/hardware/vga_draw.cpp b/src/hardware/vga_draw.cpp index be422a8e..6a79b16d 100644 --- a/src/hardware/vga_draw.cpp +++ b/src/hardware/vga_draw.cpp @@ -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