> We generate code: > 1) > save regs > ... > restore regs > reti > 2) > di > save regs > ... > restore regs > ei > reti > 3) > save regs > ... > restore regs > retn > > Out of these, 3) looks correct to me. But 1) fails to reenable > interrupts at the end (I think there should be an ei before the reti). > And 2) is completly wrong, I think it should be: > ei > save regs > ... > restore regs > reti > > Did I miss something?
When I looked at this ages ago I came to the same conclusion but never worried about it as I couldn't use those methods anyway because I needed to be able to save/restore interrupt state. Of the others Your changes to #1 are IMHO correct You can't implement #2 on a Z80 this way #3 appears to be correct (as far as it goes for Z80) For the #2 case you can't do the ei because on many platforms (eg MSX) you'll immediately take another interrupt and execute nothing but ei push af irq entry ei push af irq entry until you crash. The #1 case is only safe because the ei takes effect the instruction after (ie after the reti), a detail quite a few emulators get wrong The general case of a Z80 interrupt handler that can be re-entered is irq_entry: push stuff save state from interrupting device ack interrupt source on priority aware controller ei process state from device pop stuff ret In some situations you even end up having to do stuff like irq_entry: push stuff save state from interrupting device push dummy_ret ei reti ; acks the IRQ returns to the next instr dummy_ret: process state from device pop stuff ret Neither of those can be expressed in a function entry annotation Z180 is different again because you've got multiple IRQ sources and something resembling onboard interrupt controllers. Alan ------------------------------------------------------------------------------ Find and fix application performance issues faster with Applications Manager Applications Manager provides deep performance insights into multiple tiers of your business applications. It resolves application problems quickly and reduces your MTTR. Get your free trial! https://ad.doubleclick.net/ddm/clk/302982198;130105516;z _______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user