Hi,
prologue and epilogue code for MOS6502 interrupt is incorrect. General-purpose registers (A, X, Y) will not be restored to their previous state after returning from the interrupt service routine.
C source:
void ISR(void) __interrupt(0)
{
// code here
}
results:
_ISR:
tya
pha
; code here
pla
tay
rti
.area CODE
.area RODATA
.area XINIT
.area CABS (ABS)
More universal approach should look something like this:
void ISR(void) __interrupt(0) __naked
{
// prologue
__asm__("pha");
__asm__("txa");
__asm__("pha");
__asm__("tya");
__asm__("pha");
// prologue end
// code here
// epilogue
__asm__("pla");
__asm__("tay");
__asm__("pla");
__asm__("tax");
__asm__("pla");
__asm__("rti");
// epilogue end
}
Should be fixed now in SDCC 4.4.4 [r15034].
Related
Commit: [r15034]