// https://forum.arduino.cc/t/direct-addressing-to-the-arduino-flash-memory/1016070
#include <EEPROM.h>
typedef uint8_t (* memf_t)(uint32_t const);
uint8_t readMem(uint32_t const index) {
char const* mem = 0;
return mem[index];
}
uint8_t readFlash(uint32_t const index) {
#ifdef pgm_read_byte_far
return pgm_read_byte_far(index);
#else
return pgm_read_byte(index);
#endif
}
uint8_t readEEPROM(uint32_t const index) {
return EEPROM.read(index);
}
char printable(uint8_t const x) {
if (x < 32 or x > 126) {
return '.';
}
return x;
}
void dumpLine(char line[], memf_t const f, uint32_t const offset) {
sprintf(line, "%06lx ", offset);
for (uint32_t i = 0; i < 16; i++) {
sprintf(line + strlen(line), "%02x ", f(offset + i));
}
sprintf(line + strlen(line), " ");
for (uint32_t i = 0; i < 16; i++) {
sprintf(line + strlen(line), "%c", printable(f(offset + i)));
}
}
void dumpBlock(Stream& out, memf_t const f, uint32_t const offset, uint32_t const size) {
for (uint32_t i = offset; i < offset + size; i += 16) {
char line[74];
dumpLine(line, f, i);
out.println(line);
}
}
void setup() {
Serial.begin(115200);
Serial.println("EEPROM");
dumpBlock(Serial, readEEPROM, 0, 16); // 1024 max.
Serial.println("\r\n\nMemory");
dumpBlock(Serial, readMem, 0, 1280); // 8192 max.
Serial.println("\r\n\nFLASH");
dumpBlock(Serial, readFlash, 0, 4096); // 262144 max.
}
void loop() {}