]> git.sur5r.net Git - cc65/blobdiff - libsrc/serial/ser-kernel.s
no TGI_ERR_NO_MEM or TGI_ERR_NO_IOCB anymore: replaced by TGI_ERR_NO_RES
[cc65] / libsrc / serial / ser-kernel.s
index 338136ac4d7bfcb5cf0e8eb32c4bf1583198acfb..d666e94521e6f515c8221ecf6429309fe855b31c 100644 (file)
@@ -4,9 +4,9 @@
 ; Common functions of the serial drivers
 ;
 
-        .export         ser_clear_ptr
         .import         return0
         .importzp       ptr1
+               .interruptor    ser_irq, 29     ; Export as high priority IRQ handler
 
         .include        "ser-kernel.inc"
         .include        "ser-error.inc"
@@ -30,13 +30,14 @@ ser_get:        jmp     return0
 ser_put:        jmp     return0
 ser_status:     jmp     return0
 ser_ioctl:      jmp     return0
+ser_irq:       .byte   $60, $00, $00   ; RTS plus two dummy bytes
 
 ; Driver header signature
 .rodata
-ser_sig:        .byte   $73, $65, $72, $00      ; "ser", version
-ser_sig_len     = * - ser_sig
+ser_sig:        .byte   $73, $65, $72, SER_API_VERSION  ; "ser", version
 
 
+.code
 ;----------------------------------------------------------------------------
 ; unsigned char __fastcall__ ser_install (void* driver);
 ; /* Install the driver once it is loaded */
@@ -44,13 +45,13 @@ ser_sig_len     = * - ser_sig
 
 _ser_install:
                sta     _ser_drv
-       sta     ptr1
-       stx     _ser_drv+1
-       stx     ptr1+1
+       sta     ptr1
+       stx     _ser_drv+1
+       stx     ptr1+1
 
 ; Check the driver signature
 
-        ldy     #ser_sig_len-1
+        ldy     #.sizeof(ser_sig)-1
 @L0:    lda     (ptr1),y
         cmp     ser_sig,y
         bne     inv_drv
@@ -64,10 +65,16 @@ _ser_install:
 @L1:    inx                             ; Skip the JMP opcode
         jsr     copy                    ; Copy one byte
         jsr     copy                    ; Copy one byte
-        cpx     #(SER_HDR::JUMPTAB + .sizeof(SER_HDR::JUMPTAB))
+        cpy     #(SER_HDR::JUMPTAB + .sizeof(SER_HDR::JUMPTAB))
         bne     @L1
 
-        jmp     ser_install             ; Call driver install routine
+        jsr     ser_install             ; Call driver install routine
+
+        ldy     ser_irq+2               ; Check high byte of IRQ vector
+        beq     @L2                     ; Jump if vector invalid
+       ldy     #$4C                    ; Jump opcode
+       sty     ser_irq                 ; Activate IRQ routine
+@L2:    rts
 
 ; Driver signature invalid
 
@@ -93,7 +100,10 @@ copy:   lda     (ptr1),y
 _ser_uninstall:
         jsr     ser_uninstall           ; Call driver routine
 
-ser_clear_ptr:                          ; External entry point
+       lda     #$60                    ; RTS opcode
+       sta     ser_irq                 ; Disable IRQ entry point
+
+_ser_clear_ptr:                         ; External entry point
         lda     #0
         sta     _ser_drv
         sta     _ser_drv+1              ; Clear the driver pointer