1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-24 11:31:31 +00:00
cc65/libsrc/joystick/joy-kernel.s
Oliver Schmidt 1976d6cd32 Removed IRQ support from joystick drivers.
All but one joystick drivers didn't use IRQs. Espsecially when the joystick driver kernel was the only .interruptor this meant quite some unnecessary overhead because it pulled in the whole IRQ infrastructure.

I was told that the one driver using IRQs (the DXS/HIT-4 Player joystick driver for the C64) can be reworked to not do it. Until this is done that driver is defunct.
2018-02-01 22:38:36 +01:00

107 lines
2.5 KiB
ArmAsm

;
; Ullrich von Bassewitz, 2002-12-20
;
; Common functions of the joystick API.
;
.import joy_libref
.importzp ptr1
.include "joy-kernel.inc"
.include "joy-error.inc"
;----------------------------------------------------------------------------
; Variables
.bss
_joy_drv: .res 2 ; Pointer to driver
; Jump table for the driver functions.
.data
joy_vectors:
joy_install: jmp $0000
joy_uninstall: jmp $0000
joy_count: jmp $0000
joy_read: jmp $0000
; Driver header signature
.rodata
joy_sig: .byte $6A, $6F, $79, JOY_API_VERSION ; "joy", version
.code
;----------------------------------------------------------------------------
; unsigned char __fastcall__ joy_install (void* driver);
; /* Install the driver once it is loaded */
_joy_install:
sta _joy_drv
sta ptr1
stx _joy_drv+1
stx ptr1+1
; Check the driver signature
ldy #.sizeof(joy_sig)-1
@L0: lda (ptr1),y
cmp joy_sig,y
bne inv_drv
dey
bpl @L0
; Set the library reference
ldy #JOY_HDR::LIBREF
lda #<joy_libref
sta (ptr1),y
iny
lda #>joy_libref
sta (ptr1),y
; Copy the jump vectors
ldy #JOY_HDR::JUMPTAB
ldx #0
@L1: inx ; Skip the JMP opcode
jsr copy ; Copy one byte
jsr copy ; Copy one byte
cpy #(JOY_HDR::JUMPTAB + .sizeof(JOY_HDR::JUMPTAB))
bne @L1
jmp joy_install ; Call driver install routine
; Driver signature invalid
inv_drv:
lda #JOY_ERR_INV_DRIVER
ldx #0
rts
; Copy one byte from the jump vectors
copy: lda (ptr1),y
iny
sta joy_vectors,x
inx
rts
;----------------------------------------------------------------------------
; unsigned char joy_uninstall (void);
; /* Uninstall the currently loaded driver. Note: This call does not free
; ** allocated memory.
; */
_joy_uninstall:
jsr joy_uninstall ; Call the driver routine
_joy_clear_ptr: ; External entry point
lda #0
sta _joy_drv
sta _joy_drv+1 ; Clear the driver pointer
tax ; Return zero
rts