if (!vector || !vector->vector)
return 0;
- if (vector->pending) {
- if (vector->trace)
- printf("IRQ%d:I=%d already raised (enabled %d) (cycle %lld pc 0x%x)\n",
- vector->vector, !!avr->sreg[S_I], avr_regbit_get(avr, vector->enable),
- (long long int)avr->cycle, avr->pc);
- // no return - polling ISR within interrupt allowed
- }
-
if (vector->trace)
printf("IRQ%d raising (enabled %d)\n",
vector->vector, avr_regbit_get(avr, vector->enable));
+
// always mark the 'raised' flag to one, even if the interrupt is disabled
// this allow "polling" for the "raised" flag, like for non-interrupt
// driven UART and so so. These flags are often "write one to clear"
if (vector->raised.reg)
avr_regbit_set(avr, vector->raised);
+ if (vector->pending) {
+ if (vector->trace)
+ printf("IRQ%d:I=%d already raised (enabled %d) (cycle %lld pc 0x%x)\n",
+ vector->vector, !!avr->sreg[S_I], avr_regbit_get(avr, vector->enable),
+ (long long int)avr->cycle, avr->pc);
+
+ return 0;
+ }
+
avr_raise_irq(vector->irq + AVR_INT_IRQ_PENDING, 1);
avr_raise_irq(avr->interrupts.irq + AVR_INT_IRQ_PENDING, 1);