Move MMU registers into PROGMEM
Change in memory: Flash: +34 bytes SRAM: -170 bytespull/289/head
parent
f164a8afa0
commit
1661132819
|
|
@ -246,7 +246,7 @@ struct RegisterRec {
|
||||||
// In this project that's really not an issue since we have half of the RAM empty:
|
// In this project that's really not an issue since we have half of the RAM empty:
|
||||||
// Data: 1531 bytes (59.8% Full)
|
// 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
|
// 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
|
// 0x00
|
||||||
RegisterRec(false, &project_major),
|
RegisterRec(false, &project_major),
|
||||||
// 0x01
|
// 0x01
|
||||||
|
|
@ -403,31 +403,35 @@ static const RegisterRec registers[] /*PROGMEM*/ = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static constexpr uint8_t registersSize = sizeof(registers) / sizeof(RegisterRec);
|
static constexpr uint8_t registersSize = sizeof(registers) / sizeof(RegisterRec);
|
||||||
|
static_assert(registersSize == 34);
|
||||||
|
|
||||||
bool ReadRegister(uint8_t address, uint16_t &value) {
|
bool ReadRegister(uint8_t address, uint16_t &value) {
|
||||||
if (address >= registersSize) {
|
if (address >= registersSize) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
value = 0;
|
value = 0;
|
||||||
if (!registers[address].flags.rwfuncs) {
|
|
||||||
switch (registers[address].flags.size) {
|
// Get pointer to register at address
|
||||||
|
RegisterRec reg = *static_cast<RegisterRec *>(pgm_read_ptr(registers + address));
|
||||||
|
if (!reg.flags.rwfuncs) {
|
||||||
|
switch (reg.flags.size) {
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
value = *static_cast<uint8_t *>(registers[address].A1.addr);
|
value = *static_cast<uint8_t *>(reg.A1.addr);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
value = *static_cast<uint16_t *>(registers[address].A1.addr);
|
value = *static_cast<uint16_t *>(reg.A1.addr);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
switch (registers[address].flags.size) {
|
switch (reg.flags.size) {
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
case 2:
|
case 2:
|
||||||
value = registers[address].A1.readFunc();
|
value = reg.A1.readFunc();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -440,28 +444,30 @@ bool WriteRegister(uint8_t address, uint16_t value) {
|
||||||
if (address >= registersSize) {
|
if (address >= registersSize) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!registers[address].flags.writable) {
|
|
||||||
|
RegisterRec reg = *static_cast<RegisterRec *>(pgm_read_ptr(registers + address));
|
||||||
|
if (!reg.flags.writable) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!registers[address].flags.rwfuncs) {
|
if (!reg.flags.rwfuncs) {
|
||||||
switch (registers[address].flags.size) {
|
switch (reg.flags.size) {
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
*static_cast<uint8_t *>(registers[address].A1.addr) = value;
|
*static_cast<uint8_t *>(reg.A1.addr) = value;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
*static_cast<uint16_t *>(registers[address].A1.addr) = value;
|
*static_cast<uint16_t *>(reg.A1.addr) = value;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
switch (registers[address].flags.size) {
|
switch (reg.flags.size) {
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
case 2:
|
case 2:
|
||||||
registers[address].A2.writeFunc(value);
|
reg.A2.writeFunc(value);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue