; 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"
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 */
_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
; 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
_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