From: cuz Date: Sun, 14 Dec 2003 17:39:22 +0000 (+0000) Subject: Added an IRQ vector X-Git-Tag: V2.12.0~1053 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=ba079ae6a1e22aa5456ab92803db5c6552a18f0f;p=cc65 Added an IRQ vector git-svn-id: svn://svn.cc65.org/cc65/trunk@2753 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/asminc/ser-kernel.inc b/asminc/ser-kernel.inc index c099b8173..debae78fc 100644 --- a/asminc/ser-kernel.inc +++ b/asminc/ser-kernel.inc @@ -48,6 +48,7 @@ PUT .word ; PUT routine STATUS .word ; STATUS routine IOCTL .word ; IOCTL routine + IRQ .word ; IRQ routine .endstruct .endstruct @@ -138,7 +139,7 @@ SER_STATUS_DSR = $40 ; NOT data set ready .global ser_put .global ser_status .global ser_ioctl - + .global ser_irq ;------------------------------------------------------------------------------ ; ASM functions diff --git a/libsrc/c128/c128-swlink.s b/libsrc/c128/c128-swlink.s index 3194cf02d..558d80db8 100644 --- a/libsrc/c128/c128-swlink.s +++ b/libsrc/c128/c128-swlink.s @@ -47,6 +47,7 @@ .word PUT .word STATUS .word IOCTL + .word IRQ ;---------------------------------------------------------------------------- ; I/O definitions @@ -56,7 +57,6 @@ ACIA_DATA = ACIA+0 ; Data register ACIA_STATUS = ACIA+1 ; Status register ACIA_CMD = ACIA+2 ; Command register ACIA_CTRL = ACIA+3 ; Control register -ACIA_CLOCK = ACIA+7 ; Turbo232 external baud-rate generator ;---------------------------------------------------------------------------- ; @@ -397,6 +397,12 @@ IOCTL: lda #SER_ERR_INV_IOCTL rts +;---------------------------------------------------------------------------- +; IRQ: Not used on the C128 +; + +IRQ = $0000 + ;---------------------------------------------------------------------------- ; ; NMI handler diff --git a/libsrc/c64/c64-swlink.s b/libsrc/c64/c64-swlink.s index 4e7730b56..9f1b23c5b 100644 --- a/libsrc/c64/c64-swlink.s +++ b/libsrc/c64/c64-swlink.s @@ -47,6 +47,7 @@ .word PUT .word STATUS .word IOCTL + .word IRQ ;---------------------------------------------------------------------------- ; I/O definitions @@ -56,7 +57,6 @@ ACIA_DATA = ACIA+0 ; Data register ACIA_STATUS = ACIA+1 ; Status register ACIA_CMD = ACIA+2 ; Command register ACIA_CTRL = ACIA+3 ; Control register -ACIA_CLOCK = ACIA+7 ; Turbo232 external baud-rate generator ;---------------------------------------------------------------------------- ; @@ -368,7 +368,13 @@ STATUS: lda ACIA_STATUS IOCTL: lda #SER_ERR_INV_IOCTL - rts + rts + +;---------------------------------------------------------------------------- +; IRQ: Not used on the C64 +; + +IRQ = $0000 ;---------------------------------------------------------------------------- ; diff --git a/libsrc/serial/ser-kernel.s b/libsrc/serial/ser-kernel.s index a0285f6c3..5e76358be 100644 --- a/libsrc/serial/ser-kernel.s +++ b/libsrc/serial/ser-kernel.s @@ -4,9 +4,9 @@ ; Common functions of the serial drivers ; - .export ser_clear_ptr .import return0 .importzp ptr1 + .condes ser_irq, 2 ; Export as IRQ handler .include "ser-kernel.inc" .include "ser-error.inc" @@ -30,6 +30,7 @@ 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 @@ -66,7 +67,13 @@ _ser_install: cpy #(SER_HDR::JUMPTAB + .sizeof(SER_HDR::JUMPTAB)) bne @L1 - jmp ser_install ; Call driver install routine + jsr ser_install ; Call driver install routine + + lda ser_irq+2 ; Check high byte of IRQ vector + beq @L2 ; Jump if vector invalid + lda #$4C ; Jump opcode + sta ser_irq ; Activate IRQ routine +@L2: rts ; Driver signature invalid @@ -92,7 +99,9 @@ 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 + lda #0 sta _ser_drv sta _ser_drv+1 ; Clear the driver pointer diff --git a/libsrc/serial/ser_unload.s b/libsrc/serial/ser_unload.s index 64ffb99bc..70e8abbd5 100644 --- a/libsrc/serial/ser_unload.s +++ b/libsrc/serial/ser_unload.s @@ -17,16 +17,20 @@ _ser_unload: ora _ser_drv+1 beq no_driver ; No driver - jsr ser_uninstall ; Deinstall the driver - - lda _ser_drv - ldx _ser_drv+1 - jsr _mod_free ; Free the driver - - jmp ser_clear_ptr ; Clear the driver pointer, return zero + lda _ser_drv + pha + lda _ser_drv+1 + pha ; Save pointer to driver + + jsr _ser_uninstall ; Deinstall the driver + + pla + tax + pla ; Get pointer to driver + jmp _mod_free ; Free the driver no_driver: - tax ; X = 0 - lda #SER_ERR_NO_DRIVER + tax ; X = 0 + lda #