1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-06-18 13:29:41 +00:00

Reduce TODOs, do _something_ with border colour.

This commit is contained in:
Thomas Harte 2024-03-21 21:40:11 -04:00
parent 66e62857c4
commit 4ac4da908c

View File

@ -22,7 +22,10 @@ struct Video {
sound_(sound),
ram_(ram),
crt_(Outputs::Display::InputDataType::Red4Green4Blue4) {
set_clock_divider(2);
set_clock_divider(3);
// Limit to a subset of the PAL area.
crt_.set_visible_area(Outputs::Display::Rect(0.1f, 0.07f, 0.9f, 0.9f));
}
void write(uint32_t value) {
@ -30,6 +33,10 @@ struct Video {
const auto timing_value = [](uint32_t value) -> uint32_t {
return (value >> 14) & 0x3ff;
};
const auto colour = [](uint32_t value) -> uint16_t {
// TODO: convert to internal format.
return static_cast<uint16_t>(value & 0x1fff);
};
switch(target) {
case 0x00: case 0x04: case 0x08: case 0x0c:
@ -39,78 +46,31 @@ struct Video {
logger.error().append("TODO: Video palette logical colour %d to %03x", (target >> 2), value & 0x1fff);
break;
case 0x40:
logger.error().append("TODO: Video border colour to %03x", value & 0x1fff);
break;
case 0x40: border_colour_ = colour(value); break;
case 0x44: case 0x48: case 0x4c:
logger.error().append("TODO: Cursor colour %d to %03x", (target - 0x44) >> 2, value & 0x1fff);
break;
case 0x80:
logger.error().append("TODO: Video horizontal period: %d", (value >> 14) & 0x3ff);
horizontal_timing_.period = timing_value(value);
break;
case 0x84:
logger.error().append("TODO: Video horizontal sync width: %d", (value >> 14) & 0x3ff);
horizontal_timing_.sync_width = timing_value(value);
break;
case 0x88:
logger.error().append("TODO: Video horizontal border start: %d", (value >> 14) & 0x3ff);
horizontal_timing_.border_start = timing_value(value);
break;
case 0x8c:
logger.error().append("TODO: Video horizontal display start: %d", (value >> 14) & 0x3ff);
horizontal_timing_.display_start = timing_value(value);
break;
case 0x90:
logger.error().append("TODO: Video horizontal display end: %d", (value >> 14) & 0x3ff);
horizontal_timing_.display_end = timing_value(value);
break;
case 0x94:
logger.error().append("TODO: Video horizontal border end: %d", (value >> 14) & 0x3ff);
horizontal_timing_.border_end = timing_value(value);
break;
case 0x98:
logger.error().append("TODO: Video horizontal cursor end: %d", (value >> 14) & 0x3ff);
horizontal_timing_.cursor_end = timing_value(value);
break;
case 0x80: horizontal_timing_.period = timing_value(value); break;
case 0x84: horizontal_timing_.sync_width = timing_value(value); break;
case 0x88: horizontal_timing_.border_start = timing_value(value); break;
case 0x8c: horizontal_timing_.display_start = timing_value(value); break;
case 0x90: horizontal_timing_.display_end = timing_value(value); break;
case 0x94: horizontal_timing_.border_end = timing_value(value); break;
case 0x98: horizontal_timing_.cursor_end = timing_value(value); break;
case 0x9c:
logger.error().append("TODO: Video horizontal interlace: %d", (value >> 14) & 0x3ff);
break;
case 0xa0:
logger.error().append("TODO: Video vertical period: %d", (value >> 14) & 0x3ff);
vertical_timing_.period = timing_value(value);
break;
case 0xa4:
logger.error().append("TODO: Video vertical sync width: %d", (value >> 14) & 0x3ff);
vertical_timing_.sync_width = timing_value(value);
break;
case 0xa8:
logger.error().append("TODO: Video vertical border start: %d", (value >> 14) & 0x3ff);
vertical_timing_.border_start = timing_value(value);
break;
case 0xac:
logger.error().append("TODO: Video vertical display start: %d", (value >> 14) & 0x3ff);
vertical_timing_.display_start = timing_value(value);
break;
case 0xb0:
logger.error().append("TODO: Video vertical display end: %d", (value >> 14) & 0x3ff);
vertical_timing_.display_end = timing_value(value);
break;
case 0xb4:
logger.error().append("TODO: Video vertical border end: %d", (value >> 14) & 0x3ff);
vertical_timing_.border_end = timing_value(value);
break;
case 0xb8:
logger.error().append("TODO: Video vertical cursor start: %d", (value >> 14) & 0x3ff);
vertical_timing_.cursor_start = timing_value(value);
break;
case 0xbc:
logger.error().append("TODO: Video vertical cursor end: %d", (value >> 14) & 0x3ff);
vertical_timing_.cursor_end = timing_value(value);
break;
case 0xa0: vertical_timing_.period = timing_value(value); break;
case 0xa4: vertical_timing_.sync_width = timing_value(value); break;
case 0xa8: vertical_timing_.border_start = timing_value(value); break;
case 0xac: vertical_timing_.display_start = timing_value(value); break;
case 0xb0: vertical_timing_.display_end = timing_value(value); break;
case 0xb4: vertical_timing_.border_end = timing_value(value); break;
case 0xb8: vertical_timing_.cursor_start = timing_value(value); break;
case 0xbc: vertical_timing_.cursor_end = timing_value(value); break;
case 0xe0:
logger.error().append("TODO: video control: %08x", value);
@ -193,7 +153,7 @@ struct Video {
crt_.output_level<uint16_t>(duration, 0xf888);
break;
case Phase::Border:
crt_.output_level<uint16_t>(duration, 0xffff);
crt_.output_level<uint16_t>(duration, border_colour_);
break;
}
@ -274,6 +234,9 @@ private:
};
Timing horizontal_timing_, vertical_timing_;
// Colour palette, converted to internal format.
uint16_t border_colour_;
// An interrupt flag; more closely related to the interface by which
// my implementation of the IOC picks up an interrupt request than
// to hardware.