Skip to content

Commit

Permalink
enable copper functions for all paletted modes
Browse files Browse the repository at this point in the history
  • Loading branch information
stevesims committed Jan 26, 2025
1 parent 6ca9a65 commit ad5126e
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 16 deletions.
48 changes: 48 additions & 0 deletions video/agon_screen.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,54 @@ void updateRGB2PaletteLUT() {
}
}

// Create a palette
//
void createPalette(uint16_t paletteId) {
// Use instance, as call not present on VGABaseController, only on VGAPaletteController derived classes
switch (_VGAColourDepth) {
case 2: fabgl::VGA2Controller::instance()->createPalette(paletteId); break;
case 4: fabgl::VGA4Controller::instance()->createPalette(paletteId); break;
case 8: fabgl::VGA8Controller::instance()->createPalette(paletteId); break;
case 16: fabgl::VGA16Controller::instance()->createPalette(paletteId); break;
}
}

// Delete a palette
//
void deletePalette(uint16_t paletteId) {
// Use instance, as call not present on VGABaseController, only on VGAPaletteController derived classes
switch (_VGAColourDepth) {
case 2: fabgl::VGA2Controller::instance()->deletePalette(paletteId); break;
case 4: fabgl::VGA4Controller::instance()->deletePalette(paletteId); break;
case 8: fabgl::VGA8Controller::instance()->deletePalette(paletteId); break;
case 16: fabgl::VGA16Controller::instance()->deletePalette(paletteId); break;
}
}

// Set item in palette
//
void setItemInPalette(uint16_t paletteId, uint8_t index, RGB888 colour) {
// Use instance, as call not present on VGABaseController, only on VGAPaletteController derived classes
switch (_VGAColourDepth) {
case 2: fabgl::VGA2Controller::instance()->setItemInPalette(paletteId, index, colour); break;
case 4: fabgl::VGA4Controller::instance()->setItemInPalette(paletteId, index, colour); break;
case 8: fabgl::VGA8Controller::instance()->setItemInPalette(paletteId, index, colour); break;
case 16: fabgl::VGA16Controller::instance()->setItemInPalette(paletteId, index, colour); break;
}
}

// Update signal list
//
void updateSignalList(uint16_t * signalList, uint16_t count) {
// Use instance, as call not present on VGABaseController, only on VGA16Controller
switch (_VGAColourDepth) {
case 2: fabgl::VGA2Controller::instance()->updateSignalList(signalList, count); break;
case 4: fabgl::VGA4Controller::instance()->updateSignalList(signalList, count); break;
case 8: fabgl::VGA8Controller::instance()->updateSignalList(signalList, count); break;
case 16: fabgl::VGA16Controller::instance()->updateSignalList(signalList, count); break;
}
}

// Get current colour depth
//
inline uint8_t getVGAColourDepth() {
Expand Down
22 changes: 6 additions & 16 deletions video/vdu_sys.h
Original file line number Diff line number Diff line change
Expand Up @@ -688,16 +688,12 @@ void VDUStreamProcessor::vdu_sys_copper() {
case COPPER_CREATE_PALETTE: {
auto paletteId = readWord_t(); if (paletteId == -1) return;

if (fabgl::VGA16Controller::instance()) {
fabgl::VGA16Controller::instance()->createPalette(paletteId);
}
createPalette(paletteId);
} break;
case COPPER_DELETE_PALLETE: {
auto paletteId = readWord_t(); if (paletteId == -1) return;

if (fabgl::VGA16Controller::instance()) {
fabgl::VGA16Controller::instance()->deletePalette(paletteId);
}
deletePalette(paletteId);
} break;
case COPPER_SET_PALETTE_COLOUR: {
auto paletteId = readWord_t(); if (paletteId == -1) return;
Expand All @@ -706,9 +702,7 @@ void VDUStreamProcessor::vdu_sys_copper() {
auto g = readByte_t(); if (g == -1) return;
auto b = readByte_t(); if (b == -1) return;

if (fabgl::VGA16Controller::instance()) {
fabgl::VGA16Controller::instance()->setItemInPalette(paletteId, index, RGB888(r, g, b));
}
setItemInPalette(paletteId, index, RGB888(r, g, b));
} break;
case COPPER_UPDATE_SIGNALLIST: {
auto bufferId = readWord_t(); if (bufferId == -1) return;
Expand All @@ -721,15 +715,11 @@ void VDUStreamProcessor::vdu_sys_copper() {

// only use first block in buffer
auto buffer = bufferIter->second[0];
if (fabgl::VGA16Controller::instance()) {
fabgl::VGA16Controller::instance()->updateSignalList((uint16_t *)buffer->getBuffer(), buffer->size() / 4);
}
updateSignalList((uint16_t *)buffer->getBuffer(), buffer->size() / 4);
} break;
case COPPER_RESET_SIGNALLIST: {
if (fabgl::VGA16Controller::instance()) {
uint16_t signalList[2] = { 0, 0 };
fabgl::VGA16Controller::instance()->updateSignalList(signalList, 1);
}
uint16_t signalList[2] = { 0, 0 };
updateSignalList(signalList, 1);
} break;
}
}
Expand Down

0 comments on commit ad5126e

Please sign in to comment.