From 56a192bb82f36803fa59d3ca8e915d942e0de9c3 Mon Sep 17 00:00:00 2001 From: stefanrueger Date: Mon, 27 Nov 2023 00:11:55 +1300 Subject: [PATCH] Initialise dryrun io memory from register file --- src/dryrun.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/dryrun.c b/src/dryrun.c index 472879b4..3ca479dd 100644 --- a/src/dryrun.c +++ b/src/dryrun.c @@ -119,7 +119,7 @@ static void dryrun_enable(PROGRAMMER *pgm, const AVRPART *p) { dry.dp = avr_dup_part(p); // Allocate dryrun part memset(inifuses, 0xff, sizeof inifuses); - // Initialise the device with fuse factory setting and erase flash/EEPROM to 0xff + // Initialise the device with factory setting and erase flash/EEPROM to 0xff for (LNODEID ln=lfirst(dry.dp->mem); ln; ln=lnext(ln)) { AVRMEM *m = ldata(ln); if(mem_is_in_flash(m) || mem_is_eeprom(m)) { @@ -166,6 +166,15 @@ static void dryrun_enable(PROGRAMMER *pgm, const AVRPART *p) { for(int i=0; i<3; i++) m->buf[2*i] = dry.dp->signature[i]; } + } else if(mem_is_io(m)) { // Initialise reset values (if known) + int nr; + const Register_file_t *rf = avr_locate_register_file(p, &nr); + if(rf) + for(int i = 0; i < nr; i++) + if(rf[i].initval != -1 && rf[i].size > 0 && rf[i].size < 5) + if(rf[i].addr >= 0 && rf[i].addr+rf[i].size <= m->size) + for(int k = 0; k < rf[i].size; k++) // FIXME: Assume little endian compiler + m->buf[rf[i].addr+k] = ((unsigned char *) &rf[i].initval)[k]; } } if(prodsigm) {