1
0
mirror of https://github.com/cc65/cc65.git synced 2025-01-12 02:30:44 +00:00

Added an IRQ vector

git-svn-id: svn://svn.cc65.org/cc65/trunk@2753 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2003-12-14 17:39:22 +00:00
parent 6a3ea29429
commit ba079ae6a1
5 changed files with 41 additions and 15 deletions

View File

@ -48,6 +48,7 @@
PUT .word ; PUT routine PUT .word ; PUT routine
STATUS .word ; STATUS routine STATUS .word ; STATUS routine
IOCTL .word ; IOCTL routine IOCTL .word ; IOCTL routine
IRQ .word ; IRQ routine
.endstruct .endstruct
.endstruct .endstruct
@ -138,7 +139,7 @@ SER_STATUS_DSR = $40 ; NOT data set ready
.global ser_put .global ser_put
.global ser_status .global ser_status
.global ser_ioctl .global ser_ioctl
.global ser_irq
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; ASM functions ; ASM functions

View File

@ -47,6 +47,7 @@
.word PUT .word PUT
.word STATUS .word STATUS
.word IOCTL .word IOCTL
.word IRQ
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
; I/O definitions ; I/O definitions
@ -56,7 +57,6 @@ ACIA_DATA = ACIA+0 ; Data register
ACIA_STATUS = ACIA+1 ; Status register ACIA_STATUS = ACIA+1 ; Status register
ACIA_CMD = ACIA+2 ; Command register ACIA_CMD = ACIA+2 ; Command register
ACIA_CTRL = ACIA+3 ; Control 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 ; We don't support ioclts for now
ldx #>SER_ERR_INV_IOCTL ldx #>SER_ERR_INV_IOCTL
rts rts
;----------------------------------------------------------------------------
; IRQ: Not used on the C128
;
IRQ = $0000
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
; ;
; NMI handler ; NMI handler

View File

@ -47,6 +47,7 @@
.word PUT .word PUT
.word STATUS .word STATUS
.word IOCTL .word IOCTL
.word IRQ
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
; I/O definitions ; I/O definitions
@ -56,7 +57,6 @@ ACIA_DATA = ACIA+0 ; Data register
ACIA_STATUS = ACIA+1 ; Status register ACIA_STATUS = ACIA+1 ; Status register
ACIA_CMD = ACIA+2 ; Command register ACIA_CMD = ACIA+2 ; Command register
ACIA_CTRL = ACIA+3 ; Control 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 ; We don't support ioclts for now IOCTL: lda #<SER_ERR_INV_IOCTL ; We don't support ioclts for now
ldx #>SER_ERR_INV_IOCTL ldx #>SER_ERR_INV_IOCTL
rts rts
;----------------------------------------------------------------------------
; IRQ: Not used on the C64
;
IRQ = $0000
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
; ;

View File

@ -4,9 +4,9 @@
; Common functions of the serial drivers ; Common functions of the serial drivers
; ;
.export ser_clear_ptr
.import return0 .import return0
.importzp ptr1 .importzp ptr1
.condes ser_irq, 2 ; Export as IRQ handler
.include "ser-kernel.inc" .include "ser-kernel.inc"
.include "ser-error.inc" .include "ser-error.inc"
@ -30,6 +30,7 @@ ser_get: jmp return0
ser_put: jmp return0 ser_put: jmp return0
ser_status: jmp return0 ser_status: jmp return0
ser_ioctl: jmp return0 ser_ioctl: jmp return0
ser_irq: .byte $60, $00, $00 ; RTS plus two dummy bytes
; Driver header signature ; Driver header signature
.rodata .rodata
@ -66,7 +67,13 @@ _ser_install:
cpy #(SER_HDR::JUMPTAB + .sizeof(SER_HDR::JUMPTAB)) cpy #(SER_HDR::JUMPTAB + .sizeof(SER_HDR::JUMPTAB))
bne @L1 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 ; Driver signature invalid
@ -92,7 +99,9 @@ copy: lda (ptr1),y
_ser_uninstall: _ser_uninstall:
jsr ser_uninstall ; Call driver routine 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 lda #0
sta _ser_drv sta _ser_drv
sta _ser_drv+1 ; Clear the driver pointer sta _ser_drv+1 ; Clear the driver pointer

View File

@ -17,16 +17,20 @@ _ser_unload:
ora _ser_drv+1 ora _ser_drv+1
beq no_driver ; No driver beq no_driver ; No driver
jsr ser_uninstall ; Deinstall the driver lda _ser_drv
pha
lda _ser_drv+1
pha ; Save pointer to driver
lda _ser_drv jsr _ser_uninstall ; Deinstall the driver
ldx _ser_drv+1
jsr _mod_free ; Free the driver pla
tax
jmp ser_clear_ptr ; Clear the driver pointer, return zero pla ; Get pointer to driver
jmp _mod_free ; Free the driver
no_driver: no_driver:
tax ; X = 0 tax ; X = 0
lda #SER_ERR_NO_DRIVER lda #<SER_ERR_NO_DRIVER
rts rts