| |
Krill
Registered: Apr 2002 Posts: 2804 |
TIL: The instruction after SEI can be executed before a pending IRQ is handled
As described here: http://visual6502.org/wiki/index.php?title=6502_Timing_of_Inter..
I never knew this, after all those years, and thought i'd share this as a heads-up.
Thanks to Bubis for pointing it out to me! |
|
... 89 posts hidden. Click here to view all posts.... |
| |
ChristopherJam
Registered: Aug 2004 Posts: 1359 |
Wait, so if I understand that correctly if I have
SEI
{instruction1}
{instruction2}
it's possible to get an interrupt *between* instructions one and two?
That could be Bad :(
Thanks for the heads up. |
| |
JackAsser
Registered: Jun 2002 Posts: 1987 |
So, always nop after sei? :) |
| |
ChristopherJam
Registered: Aug 2004 Posts: 1359 |
Eh, anything that doesn't access any memory outside the instruction stream should be fine.
Though if you're being really evil one might have to also remember to avoid using your interrupt handler to modify the instruction immediately following the SEI... |
| |
chatGPZ
Registered: Dec 2001 Posts: 11088 |
yet another reason to forget this cargo cult of putting sei/cli around raster irq setup :) |
| |
MagerValp
Registered: Dec 2001 Posts: 1055 |
I think you're reading the trace wrong. The next instruction following an SEI can be fetched, but not executed if an IRQ occurs during the SEI. The instruction will be re-fetched and executed following the RTI.
And yes, protecting IRQ setup with SEI/CLI is still wrong, but not for this reason :) |
| |
Dano
Registered: Jul 2004 Posts: 226 |
Quote: I think you're reading the trace wrong. The next instruction following an SEI can be fetched, but not executed if an IRQ occurs during the SEI. The instruction will be re-fetched and executed following the RTI.
And yes, protecting IRQ setup with SEI/CLI is still wrong, but not for this reason :)
Sorry for being offtopic there, but why is putting the IRQ setup into SEI/CLI wrong? Doesn't this ensure that no IRQ is happening while setting up the shizzle? I am happy to be enlighted on how to do this correctly. |
| |
TWW
Registered: Jul 2009 Posts: 541 |
Quote: Sorry for being offtopic there, but why is putting the IRQ setup into SEI/CLI wrong? Doesn't this ensure that no IRQ is happening while setting up the shizzle? I am happy to be enlighted on how to do this correctly.
What he said |
| |
ChristopherJam
Registered: Aug 2004 Posts: 1359 |
Quoting MagerValpI think you're reading the trace wrong. The next instruction following an SEI can be fetched, but not executed if an IRQ occurs during the SEI. The instruction will be re-fetched and executed following the RTI.
Ok, that makes a lot more sense. |
| |
MagerValp
Registered: Dec 2001 Posts: 1055 |
SEI doesn't prevent IRQs from happening, it just stops the CPU from handling them. Odds are good that you have a pending IRQ when you CLI, which means you have to have extra setup code to clear that. So for your generic $080d setup code, simply do
lda #$7f
sta $dc0d before setting up a raster IRQ instead of using SEI. |
| |
lft
Registered: Jul 2007 Posts: 369 |
Quoting MagerValpI think you're reading the trace wrong. The next instruction following an SEI can be fetched, but not executed if an IRQ occurs during the SEI. The instruction will be re-fetched and executed following the RTI.
That makes more sense indeed. The status register will still be pushed with I set, but the interrupt handler is called between the SEI and the following instruction. Phew! |
Previous - 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 - Next |