Menu

#3787 MOS6502 interrupts

closed-fixed
interrupts (1)
MOS6502
5
2024-10-12
2024-10-11
Tomasz
No

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
}

Discussion

  • Maarten Brock

    Maarten Brock - 2024-10-12
    • status: open --> closed-fixed
    • assigned_to: Maarten Brock
     
  • Maarten Brock

    Maarten Brock - 2024-10-12

    Should be fixed now in SDCC 4.4.4 [r15034].

     

    Related

    Commit: [r15034]


Log in to post a comment.

MongoDB Logo MongoDB