diff --git a/Machines/Electron/Electron.cpp b/Machines/Electron/Electron.cpp index 35dfaf718..703c505f7 100644 --- a/Machines/Electron/Electron.cpp +++ b/Machines/Electron/Electron.cpp @@ -82,15 +82,12 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin } else { - // If we're still before the display will start to be painted, or the address is - // less than both the current line address and 0x3000, (the minimum screen mode - // base address) then there's no way this write can affect the current frame. Sp - // no need to flush the display. Otherwise, output up until now so that any - // write doesn't have retroactive effect on the video output. -// if(!( -// (_fieldCycles < first_graphics_line * cycles_per_line) || -// (address < _startLineAddress && address < 0x3000) -// )) + if( + ( + ((_frameCycles >= first_graphics_line * cycles_per_line) && (_frameCycles < (first_graphics_line + 256) * cycles_per_line)) || + ((_frameCycles >= (first_graphics_line + field_divider_line) * cycles_per_line) && (_frameCycles < (first_graphics_line + 256 + field_divider_line) * cycles_per_line)) + ) + ) update_display(); _ram[address] = *value; @@ -101,7 +98,6 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin cycles += 1 + (_frameCycles&1); if(_screen_mode < 4) { - update_display(); const int current_line = graphics_line(_frameCycles + (_frameCycles&1)); const int current_column = graphics_column(_frameCycles + (_frameCycles&1)); if(current_line < 256 && current_column < 80 && !_isBlankLine) diff --git a/Outputs/CRT/Internals/CRTConstants.hpp b/Outputs/CRT/Internals/CRTConstants.hpp index 46d4d7209..ae9f4abc7 100644 --- a/Outputs/CRT/Internals/CRTConstants.hpp +++ b/Outputs/CRT/Internals/CRTConstants.hpp @@ -48,7 +48,7 @@ const GLsizeiptr InputVertexBufferDataSize = 262080; // a multiple of 6 * Output // Runs are divided discretely by vertical syncs in order to put a usable bounds on the uniform used to track // run age; that therefore creates a discrete number of fields that are stored. This number should be the // number of historic fields that are required fully to -const int NumberOfFields = 3; +const int NumberOfFields = 4; } } diff --git a/Outputs/CRT/Internals/CRTOpenGL.cpp b/Outputs/CRT/Internals/CRTOpenGL.cpp index c6c73a6dd..de9159273 100644 --- a/Outputs/CRT/Internals/CRTOpenGL.cpp +++ b/Outputs/CRT/Internals/CRTOpenGL.cpp @@ -358,7 +358,7 @@ char *OpenGLOutputBuilder::get_output_vertex_shader() "srcCoordinatesVarying = vec2(srcCoordinates.x / textureSize.x, (srcCoordinates.y + 0.5) / textureSize.y);" "float age = (timestampBase - timestamp) / ticksPerFrame;" - "vec3 alphas = vec3(10.0 * exp((-age - 0.66) * 2.0), 10.0 * exp(-(age - 0.33) * 2.0), 10.0 * exp(-age * 2.0));" + "vec3 alphas = vec3(10.0 * exp((-age - 1.33) * 2.0), 10.0 * exp(-(age - 0.66) * 2.0), 10.0 * exp(-age * 2.0));" // "alpha = min(10.0 * exp(-age * 2.0), 1.0);" "alpha = dot(alphas, filterCoefficients);" @@ -512,7 +512,7 @@ void OpenGLOutputBuilder::prepare_rgb_output_shader() glUniform1f(ticksPerFrameUniform, (GLfloat)(_cycles_per_line * _height_of_display)); glUniform2f(positionConversionUniform, _horizontal_scan_period, _vertical_scan_period / (unsigned int)_vertical_period_divider); - SignalProcessing::FIRFilter filter(3, 3 * 50, 0, 25, SignalProcessing::FIRFilter::DefaultAttenuation); + SignalProcessing::FIRFilter filter(3, 6 * 50, 0, 25, SignalProcessing::FIRFilter::DefaultAttenuation); float coefficients[3]; filter.get_coefficients(coefficients); glUniform3fv(filterCoefficients, 1, coefficients);