]> 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 69c45df5e279b3bb28adeb917815c65ff4674ed0..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"
@@ -24,19 +24,20 @@ _ser_drv:       .res    2                   ; Pointer to driver
 ser_vectors:
 ser_install:           jmp     return0
 ser_uninstall:         jmp     return0
-ser_params:     jmp     return0
+ser_open:       jmp     return0
+ser_close:      jmp     return0
 ser_get:        jmp     return0
 ser_put:        jmp     return0
-ser_pause:      jmp     return0
-ser_unpause:    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
@@ -59,15 +60,21 @@ _ser_install:
 
 ; Copy the jump vectors
 
-        ldy     #SER_HDR_JUMPTAB
+        ldy     #SER_HDR::JUMPTAB
         ldx     #0
 @L1:    inx                             ; Skip the JMP opcode
         jsr     copy                    ; Copy one byte
         jsr     copy                    ; Copy one byte
-        cpx     #(SER_HDR_JUMPCOUNT*3)
+        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