diff options
author | Stephane Carrez <stcarrez@nerim.fr> | 2000-09-10 12:58:53 +0000 |
---|---|---|
committer | Stephane Carrez <stcarrez@nerim.fr> | 2000-09-10 12:58:53 +0000 |
commit | a8afa79ab6fa5848dfd41b0e6173b51e4a898c9f (patch) | |
tree | 9ef2aefed0aa11af68e0be8dc3f19663220e34d5 /sim/m68hc11 | |
parent | 2990a9f484ce9ff796d68d6fbfdad7e8a2ea61b8 (diff) | |
download | ppe42-binutils-a8afa79ab6fa5848dfd41b0e6173b51e4a898c9f.tar.gz ppe42-binutils-a8afa79ab6fa5848dfd41b0e6173b51e4a898c9f.zip |
Fix clearing of interrupts in 68hc11 simulator
Diffstat (limited to 'sim/m68hc11')
-rw-r--r-- | sim/m68hc11/ChangeLog | 6 | ||||
-rw-r--r-- | sim/m68hc11/interrupts.c | 19 |
2 files changed, 21 insertions, 4 deletions
diff --git a/sim/m68hc11/ChangeLog b/sim/m68hc11/ChangeLog index 0f25891fb1..89d6cfbc1a 100644 --- a/sim/m68hc11/ChangeLog +++ b/sim/m68hc11/ChangeLog @@ -1,5 +1,11 @@ 2000-09-10 Stephane Carrez <Stephane.Carrez@worldnet.fr> + * interrupts.c (interrupts_update_pending): Clear the mask of + pending interrupts here. + (interrupts_get_current): Don't clear the mask of pending interrupts. + +2000-09-10 Stephane Carrez <Stephane.Carrez@worldnet.fr> + * sim-main.h: Define cycle_to_string. * dv-m68hc11tim.c (cycle_to_string): New function to translate the cpu cycle into some formatted time string. diff --git a/sim/m68hc11/interrupts.c b/sim/m68hc11/interrupts.c index 655c4006f9..44771bb4e0 100644 --- a/sim/m68hc11/interrupts.c +++ b/sim/m68hc11/interrupts.c @@ -102,13 +102,21 @@ interrupts_update_pending (struct interrupts *interrupts) { data = ioregs[idef->enable_paddr]; if (!(data & idef->enabled_mask)) - continue; + { + /* Disable it. */ + interrupts->pending_mask &= ~(1 << idef->int_number); + continue; + } } /* Interrupt is enabled, see if it's there. */ data = ioregs[idef->int_paddr]; if (!(data & idef->int_mask)) - continue; + { + /* Disable it. */ + interrupts->pending_mask &= ~(1 << idef->int_number); + continue; + } /* Ok, raise it. */ interrupts->pending_mask |= (1 << idef->int_number); @@ -159,14 +167,17 @@ interrupts_get_current (struct interrupts *interrupts) } /* Returns the first interrupt number which is pending. - The interrupt priority is specified by the table `interrupt_order'. */ + The interrupt priority is specified by the table `interrupt_order'. + For these interrupts, the pending mask is cleared when the program + performs some actions on the corresponding device. If the device + is not reset, the interrupt remains and will be re-raised when + we return from the interrupt (see 68HC11 pink book). */ for (i = 0; i < M6811_INT_NUMBER; i++) { enum M6811_INT int_number = interrupts->interrupt_order[i]; if (interrupts->pending_mask & (1 << int_number)) { - interrupts->pending_mask &= ~(1 << int_number); return int_number; } } |