Commit 58506fe0240ff2902e9fb740cab6df80e1436baa
authorMichel Pollet <buserror@gmail.com>
Fri, 6 Apr 2012 17:25:10 +0000 (18:25 +0100)
committerMichel Pollet <buserror@gmail.com>
Fri, 6 Apr 2012 17:25:10 +0000 (18:25 +0100)
Also added a sanity check

Signed-off-by: Michel Pollet <buserror@gmail.com>
2 files changed:
simavr/sim/sim_avr.h
simavr/sim/sim_io.c

index 6c0fc0388f7abaecd0a690d5ab0252eb254d39c3..bcc5898b79cf13842badbcf4c820249a011df1cb 100644 (file)
@@ -53,7 +53,7 @@ enum {
        R_SREG  = 32+0x3f,
 
        // maximum number of IO registers, on normal AVRs
-       MAX_IOs = 256 - 32,     // minus 32 GP registers
+       MAX_IOs = 256,  // Bigger AVRs need more than 256-32 (mega1280)
 };
 
 #define AVR_DATA_TO_IO(v) ((v) - 32)
index 2fa455be6dc214a14009c93ece3747f47982e155..7edb7865580a9a3bdca7b0978e6f6437b5445382 100644 (file)
@@ -99,6 +99,12 @@ avr_register_io_write(
 {
        avr_io_addr_t a = AVR_DATA_TO_IO(addr);
 
+       if (a >= MAX_IOs) {
+               fprintf(stderr,
+                               "Error: avr_register_io_write(): IO address 0x%04x out of range (max 0x%04x).\n",
+                                       a, MAX_IOs);
+               abort();
+       }
        /*
         * Verifying that some other piece of code is not installed to watch write
         * on this address. If there is, this code installs a "dispatcher" callback