mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-19 23:29:05 +00:00
Introduced a four-cycle delay between playfield fetch and display, curing Yar's Revenge. Also disabled barrel roll scanling colouring again. I really need to make my mind up on that.
This commit is contained in:
parent
f19ed2e8f8
commit
4ad074fc78
@ -80,8 +80,12 @@ Machine::~Machine()
|
|||||||
uint8_t Machine::get_output_pixel()
|
uint8_t Machine::get_output_pixel()
|
||||||
{
|
{
|
||||||
// get the playfield pixel and hence a proposed colour
|
// get the playfield pixel and hence a proposed colour
|
||||||
int offset = _horizontalTimer - (horizontalTimerPeriod - 160);
|
unsigned int offset = _horizontalTimer - (horizontalTimerPeriod - 160);
|
||||||
uint8_t playfieldPixel = _playfield[offset >> 2];
|
if(!(offset&3))
|
||||||
|
{
|
||||||
|
_playfieldPixel = _nextPlayfieldPixel;
|
||||||
|
_nextPlayfieldPixel = _playfield[(1 + (offset >> 2))%40];
|
||||||
|
}
|
||||||
uint8_t playfieldColour = ((_playfieldControl&6) == 2) ? _playerColour[offset / 80] : _playfieldColour;
|
uint8_t playfieldColour = ((_playfieldControl&6) == 2) ? _playerColour[offset / 80] : _playfieldColour;
|
||||||
|
|
||||||
// get player and missile proposed pixels
|
// get player and missile proposed pixels
|
||||||
@ -176,7 +180,7 @@ uint8_t Machine::get_output_pixel()
|
|||||||
}*/
|
}*/
|
||||||
|
|
||||||
// return colour
|
// return colour
|
||||||
return playfieldPixel ? playfieldColour : _backgroundColour;
|
return _playfieldPixel ? playfieldColour : _backgroundColour;
|
||||||
}
|
}
|
||||||
|
|
||||||
// in imputing the knowledge that all we're dealing with is the rollover from 159 to 0,
|
// in imputing the knowledge that all we're dealing with is the rollover from 159 to 0,
|
||||||
@ -249,6 +253,15 @@ void Machine::output_pixels(unsigned int count)
|
|||||||
_outputBuffer++;
|
_outputBuffer++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// fetch this for the entire blank period just to ensure it's in place when needed
|
||||||
|
if(!(_horizontalTimer&3))
|
||||||
|
{
|
||||||
|
unsigned int offset = 4 + _horizontalTimer - (horizontalTimerPeriod - 160);
|
||||||
|
_nextPlayfieldPixel = _playfield[(offset >> 2)%40];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* if(_horizontalTimer < (_vBlankExtend ? 152 : 160)) {
|
/* if(_horizontalTimer < (_vBlankExtend ? 152 : 160)) {
|
||||||
uint8_t throwaway_pixel;
|
uint8_t throwaway_pixel;
|
||||||
@ -266,6 +279,7 @@ void Machine::output_pixels(unsigned int count)
|
|||||||
if(!_horizontalTimer)
|
if(!_horizontalTimer)
|
||||||
{
|
{
|
||||||
_vBlankExtend = false;
|
_vBlankExtend = false;
|
||||||
|
set_ready_line(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -277,14 +291,17 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
|
|||||||
uint8_t returnValue = 0xff;
|
uint8_t returnValue = 0xff;
|
||||||
unsigned int cycles_run_for = 1;
|
unsigned int cycles_run_for = 1;
|
||||||
|
|
||||||
|
// this occurs as a feedback loop — the 2600 requests ready, then performs the cycles_run_for
|
||||||
|
// leap to the end of ready only once ready is signalled — because on a 6502 ready doesn't take
|
||||||
|
// effect until the next read; therefore it isn't safe to assume that signalling ready immediately
|
||||||
|
// skips to the end of the line.
|
||||||
if(operation == CPU6502::BusOperation::Ready) {
|
if(operation == CPU6502::BusOperation::Ready) {
|
||||||
unsigned int distance_to_end_of_ready = horizontalTimerPeriod - _horizontalTimer;
|
unsigned int distance_to_end_of_ready = horizontalTimerPeriod - _horizontalTimer;
|
||||||
cycles_run_for = distance_to_end_of_ready / 3;
|
cycles_run_for = distance_to_end_of_ready / 3;
|
||||||
output_pixels(distance_to_end_of_ready);
|
|
||||||
} else {
|
|
||||||
output_pixels(3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
output_pixels(cycles_run_for * 3);
|
||||||
|
|
||||||
// if(_hMoveWillCount) {
|
// if(_hMoveWillCount) {
|
||||||
// _hMoveCounter = 0x0f;
|
// _hMoveCounter = 0x0f;
|
||||||
// _hMoveFlags = 0x1f;
|
// _hMoveFlags = 0x1f;
|
||||||
@ -292,9 +309,6 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
|
|||||||
// _hMoveWillCount = false;
|
// _hMoveWillCount = false;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if(!_horizontalTimer)
|
|
||||||
set_ready_line(false);
|
|
||||||
|
|
||||||
if(operation != CPU6502::BusOperation::Ready) {
|
if(operation != CPU6502::BusOperation::Ready) {
|
||||||
|
|
||||||
// check for a paging access
|
// check for a paging access
|
||||||
@ -558,6 +572,8 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
|
|||||||
_piaTimerStatus |= 0xc0;
|
_piaTimerStatus |= 0xc0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// output_pixels(cycles_run_for * 3);
|
||||||
|
|
||||||
return cycles_run_for;
|
return cycles_run_for;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,6 +48,10 @@ class Machine: public CPU6502::Processor<Machine> {
|
|||||||
uint8_t _backgroundColour;
|
uint8_t _backgroundColour;
|
||||||
uint8_t _playfield[40];
|
uint8_t _playfield[40];
|
||||||
|
|
||||||
|
// playfield outputs
|
||||||
|
uint8_t _playfieldPixel; // the pixel currently being output
|
||||||
|
uint8_t _nextPlayfieldPixel; // the next pixel to be output; latched ahead of time
|
||||||
|
|
||||||
// player registers
|
// player registers
|
||||||
uint8_t _playerColour[2];
|
uint8_t _playerColour[2];
|
||||||
uint8_t _playerReflection[2];
|
uint8_t _playerReflection[2];
|
||||||
|
@ -78,7 +78,7 @@ std::unique_ptr<OutputShader> OutputShader::make_shader(const char *fragment_met
|
|||||||
|
|
||||||
"void main(void)"
|
"void main(void)"
|
||||||
"{"
|
"{"
|
||||||
"fragColour = vec4(%s, 0.5*cos(lateralVarying));"
|
"fragColour = vec4(%s, 0.5);"//*cos(lateralVarying)
|
||||||
"}",
|
"}",
|
||||||
sampler_type, fragment_methods, colour_expression);
|
sampler_type, fragment_methods, colour_expression);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user