]> git.sur5r.net Git - cc65/commitdiff
Change the sematics of callirq and the existing interruptors: The interrupts
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 25 Apr 2005 20:10:10 +0000 (20:10 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 25 Apr 2005 20:10:10 +0000 (20:10 +0000)
must now return carry set if the interrupt has been handled, and carry clear
if not. The callirq routine will stop calling handlers with the first handler
that claims to have handled the interrupt. callirq will return the carry flag
to the caller as it came from the last interruptor called.

git-svn-id: svn://svn.cc65.org/cc65/trunk@3491 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/c128/c128-1351.s
libsrc/c128/c128-joymouse.s
libsrc/c64/c64-1351.s
libsrc/c64/c64-hitjoy.s
libsrc/c64/c64-joymouse.s
libsrc/runtime/callirq.s

index afb451eb8fb2ac0909975d384152096e9c094f1b..ae8f01f040b693f7068a17b6b7bcde06c1df3313 100644 (file)
@@ -269,7 +269,9 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioclts for now
 
 ;----------------------------------------------------------------------------
 ; IRQ: Irq handler entry point. Called as a subroutine but in IRQ context
-; (so be careful).
+; (so be careful). The routine MUST return carry set if the interrupt has been
+; 'handled' - which means that the interrupt source is gone. Otherwise it
+; MUST return carry clear.
 ;
 
 IRQ:    lda    SID_ADConv1             ; Get mouse X movement
@@ -355,10 +357,11 @@ IRQ:    lda       SID_ADConv1             ; Get mouse X movement
 ; Move the mouse pointer to the new X pos
 
         tya
-        jmp     CMOVEY
+        jsr     CMOVEY
 
 ; Done
 
+        clc                     ; Interrupt not "handled"
 @SkipY: rts
 
 ; --------------------------------------------------------------------------
index 161d24c2d2fbb343117f00d51340bf4712121fdf..9fad2cf6faab5605e2eb1834ed575392a35a3fdf 100644 (file)
@@ -269,7 +269,9 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioclts for now
 
 ;----------------------------------------------------------------------------
 ; IRQ: Irq handler entry point. Called as a subroutine but in IRQ context
-; (so be careful).
+; (so be careful). The routine MUST return carry set if the interrupt has been
+; 'handled' - which means that the interrupt source is gone. Otherwise it
+; MUST return carry clear.
 ;
 
 IRQ:   lda     #$7F
@@ -381,9 +383,10 @@ IRQ:       lda     #$7F
 ; Move the mouse pointer to the new X pos
 
         tya
-        jmp     CMOVEY
+        jsr     CMOVEY
 
 ; Done
 
-@SkipY: rts
+@SkipY: clc                             ; Interrupt not "handled"
+        rts
 
index 5fbc8122eefdea6ba13e42a3b73b7671c4c169d2..bc849acab8837e90511d0c893a383e50c507ecc9 100644 (file)
@@ -178,7 +178,7 @@ BOX:    ldy     #5
 ; MOVE: Move the mouse to a new position. The position is passed as it comes
 ; from the C program, that is: X on the stack and Y in a/x. The C wrapper will
 ; remove the parameter from the stack on return.
-; No checks are done if the new position is valid (within the bounding box or 
+; No checks are done if the new position is valid (within the bounding box or
 ; the screen). No return code required.
 ;
 
@@ -269,7 +269,9 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioclts for now
 
 ;----------------------------------------------------------------------------
 ; IRQ: Irq handler entry point. Called as a subroutine but in IRQ context
-; (so be careful).
+; (so be careful). The routine MUST return carry set if the interrupt has been
+; 'handled' - which means that the interrupt source is gone. Otherwise it
+; MUST return carry clear.
 ;
 
 IRQ:    lda    SID_ADConv1             ; Get mouse X movement
@@ -355,10 +357,11 @@ IRQ:    lda       SID_ADConv1             ; Get mouse X movement
 ; Move the mouse pointer to the new X pos
 
         tya
-        jmp     CMOVEY
+        jsr     CMOVEY                                         
 
 ; Done
 
+        clc                             ; Interrupt not handled
 @SkipY: rts
 
 ; --------------------------------------------------------------------------
index 028d480fe551b50781383d2c7c7d4a1be4b610f5..ae09182dc3b5f4231c35f1eb62948f1c1e8d636d 100755 (executable)
@@ -79,8 +79,10 @@ UNINSTALL:
         rts
 
 ; ------------------------------------------------------------------------
-; IRQ entry point. Is called from the C layer as a subroutine in the 
-; interrupt.
+; IRQ entry point. Is called from the C layer as a subroutine in the
+; interrupt. The routine MUST return carry set if the interrupt has been
+; 'handled' - which means that the interrupt source is gone. Otherwise it
+; MUST return carry clear.
 
 IRQ:    ; cia 2 setup
 
@@ -156,6 +158,8 @@ fire:
         lda     #0
         sta     $dc04
 
+        ; We do never "handle" the interrupt, we use it just as a timer.
+        clc
         rts
 
 ; ------------------------------------------------------------------------
index 798eaea0c9da497ac4cf7ccefb171a08c231003b..fe8bfe24923dc21a1a25966496b182d48fac0f7a 100644 (file)
@@ -269,7 +269,9 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioclts for now
 
 ;----------------------------------------------------------------------------
 ; IRQ: Irq handler entry point. Called as a subroutine but in IRQ context
-; (so be careful).
+; (so be careful). The routine MUST return carry set if the interrupt has been
+; 'handled' - which means that the interrupt source is gone. Otherwise it
+; MUST return carry clear.
 ;
 
 IRQ:   lda     #$7F
@@ -381,9 +383,10 @@ IRQ:       lda     #$7F
 ; Move the mouse pointer to the new X pos
 
         tya
-        jmp     CMOVEY
+        jsr     CMOVEY
 
 ; Done
 
-@SkipY: rts
+@SkipY: clc                             ; Interrupt not handled
+        rts
 
index b456ce892c09cd9bf71fd61656a4ce6b878447ef..15490e1abb3bb5a730b6c44027b4179d88cfc38d 100644 (file)
 ;      code avoids this by using locking mechanisms, but it's complex and
 ;      has a size and performance penalty.
 ;
+;   3. Special semantics: An interruptor called by callirq must tell by
+;      setting or resetting the carry flag if the interrupt has been handled
+;      (which means that the interrupt is no longer active at the interrupt
+;      source). callirq will call no other interruptors if this happens.
+;
 ; As the normal condes routine, this one has the limitation of 127 table
 ; entries.
 ;
@@ -29,7 +34,9 @@
 
 ; --------------------------------------------------------------------------
 ; Call all IRQ routines. The function needs to use self modifying code and
-; is thereforce placed in the data segment.
+; is thereforce placed in the data segment. It will return carry set if the
+; interrupt was handled and carry clear if not. The caller may choose to
+; ignore this at will.
 ; NOTE: The routine must not be called if the table is empty!
 
 .data
@@ -45,9 +52,9 @@ callirq_y:
         sta     jmpvec+1                ; Modify code below
                sty     index+1                 ; Modify code below
 jmpvec: jsr            $FFFF                   ; Patched at runtime
+        bcs     done                    ; Bail out if interrupt handled
 index:         ldy     #$FF                    ; Patched at runtime
                bne     callirq_y
-        rts
-
+done:   rts