mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-26 23:52:26 +00:00
Blank lines are missing (if the double negative can be forgiven) but the framebuffer is otherwise seemingly working well again.
This commit is contained in:
parent
a3432120f3
commit
518c134348
@ -386,7 +386,8 @@ inline void Machine::reset_pixel_output()
|
|||||||
{
|
{
|
||||||
display_x = 0;
|
display_x = 0;
|
||||||
display_y = 0;
|
display_y = 0;
|
||||||
_startLineAddress = _startScreenAddress;
|
_currentScreenAddress = _startLineAddress = _startScreenAddress;
|
||||||
|
_currentOutputLine = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Machine::output_pixels(int start_x, int number_of_pixels)
|
inline void Machine::output_pixels(int start_x, int number_of_pixels)
|
||||||
@ -416,13 +417,30 @@ inline void Machine::output_pixels(int start_x, int number_of_pixels)
|
|||||||
number_of_pixels = ((start_x + number_of_pixels) >> 1) - (start_x >> 1);
|
number_of_pixels = ((start_x + number_of_pixels) >> 1) - (start_x >> 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define GetNextPixels() \
|
||||||
|
if(_currentScreenAddress&32768)\
|
||||||
|
{\
|
||||||
|
_currentScreenAddress = (_screenModeBaseAddress + _currentScreenAddress)&32767;\
|
||||||
|
}\
|
||||||
|
uint8_t pixels = _ram[_currentScreenAddress];\
|
||||||
|
_currentScreenAddress = _currentScreenAddress+8
|
||||||
switch(_screen_mode)
|
switch(_screen_mode)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case 0: case 3: case 4: case 6:
|
case 0: case 3: case 4: case 6:
|
||||||
while(number_of_pixels--)
|
while(number_of_pixels--)
|
||||||
{
|
{
|
||||||
_writePointer[0] = 7;
|
GetNextPixels();
|
||||||
|
|
||||||
|
_writePointer[0] = _palette[(pixels&0x80) >> 4];
|
||||||
|
_writePointer[1] = _palette[(pixels&0x40) >> 3];
|
||||||
|
_writePointer[2] = _palette[(pixels&0x20) >> 2];
|
||||||
|
_writePointer[3] = _palette[(pixels&0x10) >> 1];
|
||||||
|
_writePointer[4] = _palette[(pixels&0x08) >> 0];
|
||||||
|
_writePointer[5] = _palette[(pixels&0x04) << 1];
|
||||||
|
_writePointer[6] = _palette[(pixels&0x02) << 2];
|
||||||
|
_writePointer[7] = _palette[(pixels&0x01) << 3];
|
||||||
|
|
||||||
_writePointer += 8;
|
_writePointer += 8;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -430,6 +448,13 @@ inline void Machine::output_pixels(int start_x, int number_of_pixels)
|
|||||||
case 1: case 5:
|
case 1: case 5:
|
||||||
while(number_of_pixels--)
|
while(number_of_pixels--)
|
||||||
{
|
{
|
||||||
|
GetNextPixels();
|
||||||
|
|
||||||
|
_writePointer[0] = _palette[((pixels&0x80) >> 4) | ((pixels&0x08) >> 2)];
|
||||||
|
_writePointer[1] = _palette[((pixels&0x40) >> 3) | ((pixels&0x04) >> 1)];
|
||||||
|
_writePointer[2] = _palette[((pixels&0x20) >> 2) | ((pixels&0x02) >> 0)];
|
||||||
|
_writePointer[3] = _palette[((pixels&0x10) >> 1) | ((pixels&0x01) << 1)];
|
||||||
|
|
||||||
_writePointer += 4;
|
_writePointer += 4;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -437,11 +462,17 @@ inline void Machine::output_pixels(int start_x, int number_of_pixels)
|
|||||||
case 2:
|
case 2:
|
||||||
while(number_of_pixels--)
|
while(number_of_pixels--)
|
||||||
{
|
{
|
||||||
|
GetNextPixels();
|
||||||
|
|
||||||
|
_writePointer[0] = _palette[((pixels&0x80) >> 4) | ((pixels&0x20) >> 3) | ((pixels&0x08) >> 2) | ((pixels&0x02) >> 1)];
|
||||||
|
_writePointer[1] = _palette[((pixels&0x40) >> 3) | ((pixels&0x10) >> 2) | ((pixels&0x04) >> 1) | ((pixels&0x01) >> 0)];
|
||||||
|
|
||||||
_writePointer += 2;
|
_writePointer += 2;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#undef GetNextPixels
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Machine::end_pixel_output()
|
inline void Machine::end_pixel_output()
|
||||||
@ -467,6 +498,7 @@ inline void Machine::update_pixels_to_position(int x, int y)
|
|||||||
_crt->output_sync(9 * crt_cycles_multiplier);
|
_crt->output_sync(9 * crt_cycles_multiplier);
|
||||||
_crt->output_blank((first_graphics_cycle - 9) * crt_cycles_multiplier);
|
_crt->output_blank((first_graphics_cycle - 9) * crt_cycles_multiplier);
|
||||||
end = _crt->get_field_cycle();
|
end = _crt->get_field_cycle();
|
||||||
|
_currentScreenAddress = _startLineAddress;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -481,10 +513,10 @@ inline void Machine::update_pixels_to_position(int x, int y)
|
|||||||
{
|
{
|
||||||
end_pixel_output();
|
end_pixel_output();
|
||||||
|
|
||||||
if(_crt->get_field_cycle() - end != 640)
|
// if(_crt->get_field_cycle() - end != 640)
|
||||||
{
|
// {
|
||||||
printf("!!!\n");
|
// printf("!!!\n");
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -495,6 +527,14 @@ inline void Machine::update_pixels_to_position(int x, int y)
|
|||||||
_crt->output_blank((128 - 80 - first_graphics_cycle) * crt_cycles_multiplier);
|
_crt->output_blank((128 - 80 - first_graphics_cycle) * crt_cycles_multiplier);
|
||||||
display_x = 0;
|
display_x = 0;
|
||||||
display_y++;
|
display_y++;
|
||||||
|
|
||||||
|
_startLineAddress++;
|
||||||
|
_currentOutputLine++;
|
||||||
|
if(_currentOutputLine == 8)
|
||||||
|
{
|
||||||
|
_currentOutputLine = 0;
|
||||||
|
_startLineAddress += ((_screen_mode > 3) ? 40 : 80) * 8 - 8;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -572,7 +612,11 @@ inline void Machine::update_display()
|
|||||||
if(_displayOutputPosition < end_of_top && _fieldCycles >= end_of_top)
|
if(_displayOutputPosition < end_of_top && _fieldCycles >= end_of_top)
|
||||||
{
|
{
|
||||||
// printf("[1] %d / %d\n", _crt->get_field_cycle() >> 10, (_crt->get_field_cycle() >> 3)&127);
|
// printf("[1] %d / %d\n", _crt->get_field_cycle() >> 10, (_crt->get_field_cycle() >> 3)&127);
|
||||||
if(!_is_odd_field) _crt->output_blank(64 * crt_cycles_multiplier);
|
if(!_is_odd_field)
|
||||||
|
{
|
||||||
|
_crt->output_sync(9 * crt_cycles_multiplier);
|
||||||
|
_crt->output_blank(55 * crt_cycles_multiplier);
|
||||||
|
}
|
||||||
_crt->output_sync(320 * crt_cycles_multiplier);
|
_crt->output_sync(320 * crt_cycles_multiplier);
|
||||||
if(_is_odd_field) _crt->output_blank(64 * crt_cycles_multiplier);
|
if(_is_odd_field) _crt->output_blank(64 * crt_cycles_multiplier);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user