diff --git a/libsrc/common/interrupt.s b/libsrc/common/interrupt.s
index 950d3d787..6bdbb5fe4 100644
--- a/libsrc/common/interrupt.s
+++ b/libsrc/common/interrupt.s
@@ -8,7 +8,7 @@
 
         .export         _set_irq, _reset_irq
         .interruptor    clevel_irq, 1           ; Export as low priority IRQ handler
-        .import         popax, __ZP_START__
+        .import         popax, __ZP_START__, jmpvec
 
         .include        "zeropage.inc"
 
@@ -84,6 +84,12 @@ zpsave: .res    zpsavespace
         dex
         bpl     @L2
 
+        ; Save jmpvec
+        lda     jmpvec+1
+        pha
+        lda     jmpvec+2
+        pha
+
         ; Set C level interrupt stack
         lda     irqsp
         ldx     irqsp+1
@@ -93,15 +99,21 @@ zpsave: .res    zpsavespace
         ; Call C level interrupt request handler
         jsr     irqvec
 
-        ; Copy back our zero page content
+        ; Mark interrupt handled / not handled
+        lsr
+
+        ; Restore our zero page content
         ldx     #.sizeof(::zpsave)-1
-@L3:    ldy     zpsave,x
-        sty     <__ZP_START__,x
+@L3:    lda     zpsave,x
+        sta     <__ZP_START__,x
         dex
         bpl     @L3
 
-        ; Mark interrupt handled / not handled and return
-        lsr
+        ; Restore jmpvec and return
+        pla
+        sta     jmpvec+2
+        pla
+        sta     jmpvec+1
         rts
 
 .endproc