From 1661132819e092199b8eae3ab8604d38aa2574eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Mon, 31 Jul 2023 14:45:21 +0000 Subject: [PATCH] Move MMU registers into PROGMEM Change in memory: Flash: +34 bytes SRAM: -170 bytes --- src/registers.cpp | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/registers.cpp b/src/registers.cpp index b4f93dd..818fee6 100644 --- a/src/registers.cpp +++ b/src/registers.cpp @@ -246,7 +246,7 @@ struct RegisterRec { // In this project that's really not an issue since we have half of the RAM empty: // Data: 1531 bytes (59.8% Full) // But it would be nice to fix that in the future - might be hard to push the compiler to such a construct -static const RegisterRec registers[] /*PROGMEM*/ = { +static const RegisterRec registers[] PROGMEM = { // 0x00 RegisterRec(false, &project_major), // 0x01 @@ -403,31 +403,35 @@ static const RegisterRec registers[] /*PROGMEM*/ = { }; static constexpr uint8_t registersSize = sizeof(registers) / sizeof(RegisterRec); +static_assert(registersSize == 34); bool ReadRegister(uint8_t address, uint16_t &value) { if (address >= registersSize) { return false; } value = 0; - if (!registers[address].flags.rwfuncs) { - switch (registers[address].flags.size) { + + // Get pointer to register at address + RegisterRec reg = *static_cast(pgm_read_ptr(registers + address)); + if (!reg.flags.rwfuncs) { + switch (reg.flags.size) { case 0: case 1: - value = *static_cast(registers[address].A1.addr); + value = *static_cast(reg.A1.addr); break; case 2: - value = *static_cast(registers[address].A1.addr); + value = *static_cast(reg.A1.addr); break; default: return false; } return true; } else { - switch (registers[address].flags.size) { + switch (reg.flags.size) { case 0: case 1: case 2: - value = registers[address].A1.readFunc(); + value = reg.A1.readFunc(); break; default: return false; @@ -440,28 +444,30 @@ bool WriteRegister(uint8_t address, uint16_t value) { if (address >= registersSize) { return false; } - if (!registers[address].flags.writable) { + + RegisterRec reg = *static_cast(pgm_read_ptr(registers + address)); + if (!reg.flags.writable) { return false; } - if (!registers[address].flags.rwfuncs) { - switch (registers[address].flags.size) { + if (!reg.flags.rwfuncs) { + switch (reg.flags.size) { case 0: case 1: - *static_cast(registers[address].A1.addr) = value; + *static_cast(reg.A1.addr) = value; break; case 2: - *static_cast(registers[address].A1.addr) = value; + *static_cast(reg.A1.addr) = value; break; default: return false; } return true; } else { - switch (registers[address].flags.size) { + switch (reg.flags.size) { case 0: case 1: case 2: - registers[address].A2.writeFunc(value); + reg.A2.writeFunc(value); break; default: return false;