From 8f87973a96a72d86fd29f08e994724b2e9ada146 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 5 Apr 2016 22:07:10 -0400 Subject: [PATCH] Switched to table-based byte to output conversion. --- Machines/Electron/Electron.cpp | 40 ++++++++++++++++++++++++---------- Machines/Electron/Electron.hpp | 8 +++++++ 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/Machines/Electron/Electron.cpp b/Machines/Electron/Electron.cpp index 67c678700..00dfbb73a 100644 --- a/Machines/Electron/Electron.cpp +++ b/Machines/Electron/Electron.cpp @@ -266,6 +266,30 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin _palette[registers[index][0]] = (_palette[registers[index][0]]&5) | ((colour >> 2)&2); _palette[registers[index][1]] = (_palette[registers[index][1]]&5) | ((colour >> 1)&2); } + + // regenerate all palette tables for now +#define pack(a, b) (uint8_t)((a << 4) | (b)) + for(int byte = 0; byte < 256; byte++) + { + uint8_t *target = (uint8_t *)&_paletteTables.forty1bpp[byte]; + target[0] = pack(_palette[(byte&0x80) >> 4], _palette[(byte&0x40) >> 3]); + target[1] = pack(_palette[(byte&0x20) >> 2], _palette[(byte&0x10) >> 1]); + + target = (uint8_t *)&_paletteTables.eighty2bpp[byte]; + target[0] = pack(_palette[((byte&0x80) >> 4) | ((byte&0x08) >> 2)], _palette[((byte&0x40) >> 3) | ((byte&0x04) >> 1)]); + target[1] = pack(_palette[((byte&0x20) >> 2) | ((byte&0x02) >> 0)], _palette[((byte&0x10) >> 1) | ((byte&0x01) << 1)]); + + target = (uint8_t *)&_paletteTables.eighty1bpp[byte]; + target[0] = pack(_palette[(byte&0x80) >> 4], _palette[(byte&0x40) >> 3]); + target[1] = pack(_palette[(byte&0x20) >> 2], _palette[(byte&0x10) >> 1]); + target[2] = pack(_palette[(byte&0x08) >> 0], _palette[(byte&0x04) << 1]); + target[3] = pack(_palette[(byte&0x02) << 2], _palette[(byte&0x01) << 3]); + + _paletteTables.forty2bpp[byte] = pack(_palette[((byte&0x80) >> 4) | ((byte&0x08) >> 2)], _palette[((byte&0x40) >> 3) | ((byte&0x04) >> 1)]); + _paletteTables.eighty4bpp[byte] = pack( _palette[((byte&0x80) >> 4) | ((byte&0x20) >> 3) | ((byte&0x08) >> 2) | ((byte&0x02) >> 1)], + _palette[((byte&0x40) >> 3) | ((byte&0x10) >> 2) | ((byte&0x04) >> 1) | ((byte&0x01) >> 0)]); + } +#undef pack } } break; @@ -554,26 +578,21 @@ inline void Machine::output_pixels(unsigned int number_of_cycles) case 3: case 0: { - _current_output_target[0] = pack(_palette[(_last_pixel_byte&0x80) >> 4], _palette[(_last_pixel_byte&0x40) >> 3]); - _current_output_target[1] = pack(_palette[(_last_pixel_byte&0x20) >> 2], _palette[(_last_pixel_byte&0x10) >> 1]); - _current_output_target[2] = pack(_palette[(_last_pixel_byte&0x08) >> 0], _palette[(_last_pixel_byte&0x04) << 1]); - _current_output_target[3] = pack(_palette[(_last_pixel_byte&0x02) << 2], _palette[(_last_pixel_byte&0x01) << 3]); + *(uint32_t *)_current_output_target = _paletteTables.eighty1bpp[_last_pixel_byte]; _current_output_target += 4; } break; case 1: { - _current_output_target[0] = pack(_palette[((_last_pixel_byte&0x80) >> 4) | ((_last_pixel_byte&0x08) >> 2)], _palette[((_last_pixel_byte&0x40) >> 3) | ((_last_pixel_byte&0x04) >> 1)]); - _current_output_target[1] = pack(_palette[((_last_pixel_byte&0x20) >> 2) | ((_last_pixel_byte&0x02) >> 0)], _palette[((_last_pixel_byte&0x10) >> 1) | ((_last_pixel_byte&0x01) << 1)]); + *(uint16_t *)_current_output_target = _paletteTables.eighty2bpp[_last_pixel_byte]; _current_output_target += 2; } break; case 2: { - _current_output_target[0] = pack( _palette[((_last_pixel_byte&0x80) >> 4) | ((_last_pixel_byte&0x20) >> 3) | ((_last_pixel_byte&0x08) >> 2) | ((_last_pixel_byte&0x02) >> 1)], - _palette[((_last_pixel_byte&0x40) >> 3) | ((_last_pixel_byte&0x10) >> 2) | ((_last_pixel_byte&0x04) >> 1) | ((_last_pixel_byte&0x01) >> 0)]); + *_current_output_target = _paletteTables.eighty4bpp[_last_pixel_byte]; _current_output_target += 1; } break; @@ -581,8 +600,7 @@ inline void Machine::output_pixels(unsigned int number_of_cycles) case 6: case 4: { - _current_output_target[0] = pack(_palette[(_last_pixel_byte&0x80) >> 4], _palette[(_last_pixel_byte&0x40) >> 3]); - _current_output_target[1] = pack(_palette[(_last_pixel_byte&0x20) >> 2], _palette[(_last_pixel_byte&0x10) >> 1]); + *(uint16_t *)_current_output_target = _paletteTables.forty1bpp[_last_pixel_byte]; _last_pixel_byte <<= 4; _current_output_target += 2; } @@ -590,7 +608,7 @@ inline void Machine::output_pixels(unsigned int number_of_cycles) case 5: { - _current_output_target[0] = pack(_palette[((_last_pixel_byte&0x80) >> 4) | ((_last_pixel_byte&0x08) >> 2)], _palette[((_last_pixel_byte&0x40) >> 3) | ((_last_pixel_byte&0x04) >> 1)]); + *_current_output_target = _paletteTables.forty2bpp[_last_pixel_byte]; _last_pixel_byte <<= 2; _current_output_target += 1; } diff --git a/Machines/Electron/Electron.hpp b/Machines/Electron/Electron.hpp index ab5efc0ed..dd5bf2a77 100644 --- a/Machines/Electron/Electron.hpp +++ b/Machines/Electron/Electron.hpp @@ -189,6 +189,14 @@ class Machine: public CPU6502::Processor, Tape::Delegate { unsigned int _frameCycles, _displayOutputPosition; int _audioOutputPosition, _audioOutputPositionError; + struct { + uint16_t forty1bpp[256]; + uint8_t forty2bpp[256]; + uint32_t eighty1bpp[256]; + uint16_t eighty2bpp[256]; + uint8_t eighty4bpp[256]; + } _paletteTables; + // Display generation. uint16_t _startLineAddress, _currentScreenAddress; int _current_pixel_line, _current_pixel_column, _current_character_row;