]> git.sur5r.net Git - cc65/commitdiff
Carry is clear on IRQ entry
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 5 May 2005 10:11:23 +0000 (10:11 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 5 May 2005 10:11:23 +0000 (10:11 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3500 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/cbm510/cbm510-stdser.s
libsrc/cbm610/cbm610-stdser.s
libsrc/plus4/plus4-stdser.s

index 223668fec1a5802aaf3497626530c1df0f7b632c..072079b850516a61e8b814410cd03c8fd09952a9 100644 (file)
@@ -344,8 +344,9 @@ IOCTL:  lda     #<SER_ERR_INV_IOCTL     ; We don't support ioclts for now
 
 ;----------------------------------------------------------------------------
 ; IRQ: Called from the builtin runtime IRQ handler as a subroutine. All
-; registers are already save, no parameters are passed and no return code
-; is expected.
+; registers are already save, no parameters are passed, but the carry flag
+; is clear on entry. The routine must return with carry set if the interrupt
+; was handled, otherwise with carry clear.
 ;
 
 IRQ:    lda     #$0F
@@ -353,16 +354,16 @@ IRQ:    lda     #$0F
         ldy     #ACIA::STATUS
         lda     (acia),y        ; Check ACIA status for receive interrupt
        and     #$08
-               beq     @L10            ; Jump if no ACIA interrupt
+               beq     @L9             ; Jump if no ACIA interrupt (carry still clear)
         ldy     #ACIA::DATA
         lda            (acia),y        ; Get byte from ACIA
-       ldx     RecvFreeCnt     ; Check if we have free space left
+       ldx     RecvFreeCnt     ; Check if we have free space left
                beq     @L1             ; Jump if no space in receive buffer
-       ldy     RecvTail        ; Load buffer pointer
-       sta     RecvBuf,y       ; Store received byte in buffer
-       inc     RecvTail        ; Increment buffer pointer
-       dec     RecvFreeCnt     ; Decrement free space counter
-       cpx     #33             ; Check for buffer space low
+       ldy     RecvTail        ; Load buffer pointer
+       sta     RecvBuf,y       ; Store received byte in buffer
+       inc     RecvTail        ; Increment buffer pointer
+       dec     RecvFreeCnt     ; Decrement free space counter
+       cpx     #33             ; Check for buffer space low
                bcs     @L9             ; Assert flow control if buffer space low
 
 ; Assert flow control if buffer space too low
@@ -370,7 +371,7 @@ IRQ:    lda     #$0F
 @L1:   lda     RtsOff
         ldy     #ACIA::CMD
         sta     (acia),y
-       sta     Stopped
+       sta     Stopped
         sec                     ; Interrupt handled
 
 ; Done, switch back to the execution segment
@@ -379,13 +380,6 @@ IRQ:    lda     #$0F
         sta     IndReg
         rts
 
-; No ACIA interrupt
-
-@L10:   clc                     ; Interrupt not handled
-        lda     ExecReg
-        sta     IndReg
-        rts
-
 ;----------------------------------------------------------------------------
 ; Try to send a byte. Internal routine. A = TryHard
 
index 74fd480c84b0a420031d16760b0435585121878e..491a7fe816df1bce47a3b4a940c6c1d6d1dc3c92 100644 (file)
@@ -344,8 +344,9 @@ IOCTL:  lda     #<SER_ERR_INV_IOCTL     ; We don't support ioclts for now
 
 ;----------------------------------------------------------------------------
 ; IRQ: Called from the builtin runtime IRQ handler as a subroutine. All
-; registers are already save, no parameters are passed and no return code
-; is expected.
+; registers are already save, no parameters are passed, but the carry flag
+; is clear on entry. The routine must return with carry set if the interrupt
+; was handled, otherwise with carry clear.
 ;
 
 IRQ:    lda     #$0F
@@ -353,16 +354,16 @@ IRQ:    lda     #$0F
         ldy     #ACIA::STATUS
         lda     (acia),y        ; Check ACIA status for receive interrupt
        and     #$08
-               beq     @L10            ; Jump if no ACIA interrupt
+               beq     @L9             ; Jump if no ACIA interrupt (carry still clear)
         ldy     #ACIA::DATA
         lda            (acia),y        ; Get byte from ACIA
-       ldx     RecvFreeCnt     ; Check if we have free space left
+       ldx     RecvFreeCnt     ; Check if we have free space left
                beq     @L1             ; Jump if no space in receive buffer
-       ldy     RecvTail        ; Load buffer pointer
-       sta     RecvBuf,y       ; Store received byte in buffer
-       inc     RecvTail        ; Increment buffer pointer
-       dec     RecvFreeCnt     ; Decrement free space counter
-       cpx     #33             ; Check for buffer space low
+       ldy     RecvTail        ; Load buffer pointer
+       sta     RecvBuf,y       ; Store received byte in buffer
+       inc     RecvTail        ; Increment buffer pointer
+       dec     RecvFreeCnt     ; Decrement free space counter
+       cpx     #33             ; Check for buffer space low
                bcs     @L9             ; Assert flow control if buffer space low
 
 ; Assert flow control if buffer space too low
@@ -370,7 +371,7 @@ IRQ:    lda     #$0F
 @L1:   lda     RtsOff
         ldy     #ACIA::CMD
         sta     (acia),y
-       sta     Stopped
+       sta     Stopped
         sec                     ; Interrupt handled
 
 ; Done, switch back to the execution segment
@@ -379,13 +380,6 @@ IRQ:    lda     #$0F
         sta     IndReg
         rts
 
-; No ACIA interrupt
-
-@L10:   clc                     ; Interrupt not handled
-        lda     ExecReg
-        sta     IndReg
-        rts
-
 ;----------------------------------------------------------------------------
 ; Try to send a byte. Internal routine. A = TryHard
 
index 53cec287579633abcf60b9e93a9051151a16fb3f..daa4e175a0fb621b4626bbda8e6e873d6eb10b94 100644 (file)
@@ -346,13 +346,14 @@ IOCTL:  lda     #<SER_ERR_INV_IOCTL     ; We don't support ioclts for now
 
 ;----------------------------------------------------------------------------
 ; IRQ: Called from the builtin runtime IRQ handler as a subroutine. All
-; registers are already save, no parameters are passed and no return code
-; is expected.
+; registers are already save, no parameters are passed, but the carry flag
+; is clear on entry. The routine must return with carry set if the interrupt
+; was handled, otherwise with carry clear.
 ;
 
 IRQ:    lda            ACIA_STATUS     ; Check ACIA status for receive interrupt
        and     #$08
-               beq     @L10            ; Jump if no ACIA interrupt
+               beq     @L9             ; Jump if no ACIA interrupt (carry still clear)
         lda    ACIA_DATA       ; Get byte from ACIA
        ldx     RecvFreeCnt     ; Check if we have free space left
                beq     @L1             ; Jump if no space in receive buffer
@@ -370,12 +371,7 @@ IRQ:    lda        ACIA_STATUS     ; Check ACIA status for receive interrupt
        sta     ACIA_CMD
        sta     Stopped
         sec                     ; Interrupt handled
-        rts
-
-; No ACIA interrupt
-
-@L10:   clc                     ; Interrupt not handled
-        rts
+@L9:    rts
 
 ;----------------------------------------------------------------------------
 ; Try to send a byte. Internal routine. A = TryHard