6502-hacking/arduino-bin-loader/arduino-bin-loader.ino

65 lines
1.1 KiB
C++

#define ROM_SIZE (0xffff)
#define SER_BUF (1024)
#define SIG_RESET ('r')
#define SIG_WRITE ('w')
enum states {
IDLE,
WRITE // write rom to memory
};
void do_reset() {
SCB->AIRCR = 0x05fa0004;
}
enum states state = IDLE;
volatile static uint8_t rom[ROM_SIZE];
uint8_t buf[SER_BUF];
uint16_t rom_idx = 0;
uint32_t start = 0;
void setup() {
bzero(&buf, SER_BUF);
bzero((void*)&rom, ROM_SIZE);
Serial.begin(115200);
start = millis();
state = IDLE;
Serial.println("READY");
}
void flush_serial() {
while(Serial.available() > 0) Serial.read();
}
void loop() {
if(state == IDLE) {
char c = Serial.read();
if(c == SIG_RESET) {
Serial.println("resetting");
delay(1000);
do_reset();
} else if(c == SIG_WRITE) {
state = WRITE;
rom_idx = 0;
bzero((void*)&rom, ROM_SIZE);
start = millis();
Serial.println("Ready for ROM");
}
} else if(state == WRITE) {
while(true && rom_idx < 0x7ffe && millis() - start < 3000) {
while(Serial.available()) rom[rom_idx++] = Serial.read();
}
state = IDLE;
Serial.printf("Read 0x%04X bytes into memory\r\n", rom_idx);
}
}