Browse Source

Fix clearing of interrupts in 68hc11 simulator

binutils-2_11-branch
Stephane Carrez 26 years ago
parent
commit
a8afa79ab6
  1. 6
      sim/m68hc11/ChangeLog
  2. 19
      sim/m68hc11/interrupts.c

6
sim/m68hc11/ChangeLog

@ -1,3 +1,9 @@
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.

19
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;
}
}

Loading…
Cancel
Save