Skip to content

Commit d9c90ee

Browse files
committed
Move the interrupt table to the bootloader sector when IVSEL is set
1 parent 8d8e833 commit d9c90ee

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

simavr/sim/sim_interrupts.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "sim_interrupts.h"
2828
#include "sim_avr.h"
2929
#include "sim_core.h"
30+
#include "sim_core_declare.h"
3031

3132
DEFINE_FIFO(avr_int_vector_p, avr_int_pending);
3233

@@ -281,7 +282,13 @@ avr_service_interrupts(
281282
printf("IRQ%d calling\n", vector->vector);
282283
_avr_push_addr(avr, avr->pc);
283284
avr_sreg_set(avr, S_I, 0);
284-
avr->pc = vector->vector * avr->vector_size;
285+
const int mcucr = _SFR_IO8(0x35);
286+
const int ivsel = 1;
287+
const char interrupt_sector_moved_to_bootloader = avr->data[mcucr] & (1 << ivsel);
288+
if (interrupt_sector_moved_to_bootloader)
289+
avr->pc = vector->vector * avr->vector_size + 0x7000;
290+
else
291+
avr->pc = vector->vector * avr->vector_size;
285292

286293
avr_raise_irq(vector->irq + AVR_INT_IRQ_RUNNING, 1);
287294
avr_raise_irq(table->irq + AVR_INT_IRQ_RUNNING, vector->vector);

0 commit comments

Comments
 (0)