mirror of
https://github.com/TomHarte/CLK.git
synced 2025-01-11 08:30:55 +00:00
Started trying to move some logic out of the inner loop.
This commit is contained in:
parent
48ddd3c497
commit
34640cec93
@ -476,6 +476,8 @@ inline void Machine::update_display()
|
|||||||
|
|
||||||
if(line_position >= 24 && line_position < 104)
|
if(line_position >= 24 && line_position < 104)
|
||||||
{
|
{
|
||||||
|
// determine whether the pixel clock divider has changed; if so write out the old
|
||||||
|
// data and start a new run
|
||||||
unsigned int newDivider = 0;
|
unsigned int newDivider = 0;
|
||||||
switch(_screenMode)
|
switch(_screenMode)
|
||||||
{
|
{
|
||||||
@ -491,83 +493,73 @@ inline void Machine::update_display()
|
|||||||
_currentLine = _writePointer = (uint8_t *)_crt->get_write_target_for_buffer(0);
|
_currentLine = _writePointer = (uint8_t *)_crt->get_write_target_for_buffer(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: determine whether we need to change divider
|
|
||||||
// int pixels_to_output = std::max(_frameCycles - _displayOutputPosition, 104 - line_position);
|
|
||||||
// if(_screenMode >= 4)
|
|
||||||
// {
|
|
||||||
// // just shifting wouldn't be enough if both
|
|
||||||
// if(_displayOutputPosition&1) pixels_to_output++;
|
|
||||||
// pixels_to_output >>= 1;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// swi
|
|
||||||
|
|
||||||
if(_currentLine && ((_screenMode < 4) || !(line_position&1)))
|
int pixels_to_output = std::min(_frameCycles - _displayOutputPosition, 104 - line_position);
|
||||||
|
_displayOutputPosition += pixels_to_output;
|
||||||
|
if(_screenMode >= 4)
|
||||||
{
|
{
|
||||||
if(_currentScreenAddress&32768)
|
// just shifting wouldn't be enough if both
|
||||||
{
|
if(_displayOutputPosition&1) pixels_to_output++;
|
||||||
_currentScreenAddress = _screenModeBaseAddress + (_currentScreenAddress&32767);
|
pixels_to_output >>= 1;
|
||||||
}
|
}
|
||||||
uint8_t pixels = _ram[_currentScreenAddress];
|
|
||||||
_currentScreenAddress = _currentScreenAddress+8;
|
|
||||||
|
|
||||||
|
#define GetNextPixels() \
|
||||||
|
if(_currentScreenAddress&32768)\
|
||||||
|
{\
|
||||||
|
_currentScreenAddress = _screenModeBaseAddress + (_currentScreenAddress&32767);\
|
||||||
|
}\
|
||||||
|
uint8_t pixels = _ram[_currentScreenAddress];\
|
||||||
|
_currentScreenAddress = _currentScreenAddress+8
|
||||||
|
|
||||||
|
if(pixels_to_output)
|
||||||
|
{
|
||||||
switch(_screenMode)
|
switch(_screenMode)
|
||||||
{
|
{
|
||||||
case 0:
|
default:
|
||||||
case 3:
|
case 0: case 3: case 4: case 6:
|
||||||
for(int c = 0; c < 8; c++)
|
while(pixels_to_output--)
|
||||||
{
|
{
|
||||||
uint8_t colour = (pixels&0x80) >> 4;
|
GetNextPixels();
|
||||||
_writePointer[c] = _palette[colour];
|
for(int c = 0; c < 8; c++)
|
||||||
pixels <<= 1;
|
{
|
||||||
|
uint8_t colour = (pixels&0x80) >> 4;
|
||||||
|
_writePointer[c] = _palette[colour];
|
||||||
|
pixels <<= 1;
|
||||||
|
}
|
||||||
|
_writePointer += 8;
|
||||||
}
|
}
|
||||||
_writePointer += 8;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
for(int c = 0; c < 4; c ++)
|
case 5:
|
||||||
|
while(pixels_to_output--)
|
||||||
{
|
{
|
||||||
uint8_t colour = ((pixels&0x80) >> 4) | ((pixels&0x08) >> 2);
|
GetNextPixels();
|
||||||
_writePointer[c] = _palette[colour];
|
for(int c = 0; c < 4; c ++)
|
||||||
pixels <<= 1;
|
{
|
||||||
|
uint8_t colour = ((pixels&0x80) >> 4) | ((pixels&0x08) >> 2);
|
||||||
|
_writePointer[c] = _palette[colour];
|
||||||
|
pixels <<= 1;
|
||||||
|
}
|
||||||
|
_writePointer += 4;
|
||||||
}
|
}
|
||||||
_writePointer += 4;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
for(int c = 0; c < 2; c ++)
|
while(pixels_to_output--)
|
||||||
{
|
{
|
||||||
uint8_t colour = ((pixels&0x80) >> 4) | ((pixels&0x20) >> 3) | ((pixels&0x08) >> 2) | ((pixels&0x02) >> 1);
|
GetNextPixels();
|
||||||
_writePointer[c] = _palette[colour];
|
for(int c = 0; c < 2; c ++)
|
||||||
pixels <<= 1;
|
{
|
||||||
|
uint8_t colour = ((pixels&0x80) >> 4) | ((pixels&0x20) >> 3) | ((pixels&0x08) >> 2) | ((pixels&0x02) >> 1);
|
||||||
|
_writePointer[c] = _palette[colour];
|
||||||
|
pixels <<= 1;
|
||||||
|
}
|
||||||
|
_writePointer += 2;
|
||||||
}
|
}
|
||||||
_writePointer += 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 5:
|
|
||||||
for(int c = 0; c < 4; c ++)
|
|
||||||
{
|
|
||||||
uint8_t colour = ((pixels&0x80) >> 4) | ((pixels&0x08) >> 2);
|
|
||||||
_writePointer[c] = _palette[colour];
|
|
||||||
pixels <<= 1;
|
|
||||||
}
|
|
||||||
_writePointer += 4;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
case 4:
|
|
||||||
case 6:
|
|
||||||
for(int c = 0; c < 8; c ++)
|
|
||||||
{
|
|
||||||
uint8_t colour = (pixels&0x80) >> 4;
|
|
||||||
_writePointer[c] = _palette[colour];
|
|
||||||
pixels <<= 1;
|
|
||||||
}
|
|
||||||
_writePointer += 8;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_displayOutputPosition++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(line_position == 104)
|
if(line_position == 104)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user