cc65/libsrc/apple2/joy/a2.stdjoy.s

175 lines
4.8 KiB
ArmAsm

;
; Standard joystick driver for the Apple ][. May be used multiple times
; when statically linked to the application.
;
; Ullrich von Bassewitz, 2003-05-02
; Oliver Schmidt, 2008-02-25
; Using the readjoy code from Stefan Haubenthal
;
.include "zeropage.inc"
.include "joy-kernel.inc"
.include "joy-error.inc"
.include "apple2.inc"
.macpack module
; ------------------------------------------------------------------------
; Constants
LOWER_THRESHOLD = 05
UPPER_THRESHOLD = 85
; ------------------------------------------------------------------------
; Header. Includes jump table.
.ifdef __APPLE2ENH__
module_header _a2e_stdjoy_joy
.else
module_header _a2_stdjoy_joy
.endif
; Driver signature
.byte $6A, $6F, $79 ; "joy"
.byte JOY_API_VERSION ; Driver API version number
; Library reference
libref: .addr $0000
; Jump table
.addr INSTALL
.addr UNINSTALL
.addr COUNT
.addr READ
; ------------------------------------------------------------------------
.bss
ostype: .res 1
value0: .res 1
value1: .res 1
; ------------------------------------------------------------------------
.data
; INSTALL routine. Is called after the driver is loaded into memory. If
; possible, check if the hardware is present and determine the amount of
; memory available.
; Must return an JOY_ERR_xx code in a/x.
INSTALL:
lda libref
ldx libref+1
sta gettype+1
stx gettype+2
gettype:jsr $0000
sta ostype
lda #JOY_ERR_OK
.assert JOY_ERR_OK = 0, error
tax
; Fall through
; UNINSTALL routine. Is called before the driver is removed from memory.
; Can do cleanup or whatever. Must not return anything.
UNINSTALL:
rts
; ------------------------------------------------------------------------
.code
; COUNT routine. Return the total number of available joysticks in a/x.
COUNT:
ldx #$02
bit ostype
bvc noiic ; Not $4x
dex ; Only one joystick for the //c
noiic: txa ; Number of joysticks we support
ldx #$00
rts
; READ routine. Read a particular joystick passed in A.
READ:
asl ; Joystick number -> paddle number
tax
ldy #$00
sty value0
sty value1
; If IIgs -> set speed to normal
bit ostype
bpl nogs1 ; Not $8x
lda CYAREG
pha
and #%01111111
sta CYAREG
; Read both paddles simultaneously according to:
; Apple IIe Technote #6, The Apple II Paddle Circuits
nogs1: lda PTRIG ; Trigger paddles
loop: lda PADDL0,x ; Read paddle (0 or 2)
bmi set0 ; Cycles: 2 3
nop ; Cycles: 2
bpl nop0 ; Cycles: 3
set0: sty value0 ; Cycles: 4
nop0: ; - -
; Cycles: 7 7
lda PADDL1,x ; Read paddle (1 or 3)
bmi set1 ; Cycles: 2 3
nop ; Cycles: 2
bpl nop1 ; Cycles: 3
set1: sty value1 ; Cycles: 4
nop1: ; - -
; Cycles: 7 7
iny
cpy #UPPER_THRESHOLD+1
bne loop
; If IIgs -> restore speed
bit ostype
bpl nogs2 ; Not $8x
pla
sta CYAREG
; Transform paddle readings to directions
nogs2: lda #$00 ; 0 0 0 0 0 0 0 0
ldy value0
cpy #LOWER_THRESHOLD
ror ; !LEFT 0 0 0 0 0 0 0
cpy #UPPER_THRESHOLD
ror ; RIGHT !LEFT 0 0 0 0 0 0
ldy value1
cpy #LOWER_THRESHOLD
ror ; !UP RIGHT !LEFT 0 0 0 0 0
cpy #UPPER_THRESHOLD
ror ; DOWN !UP RIGHT !LEFT 0 0 0 0
; Read primary button
tay
lda BUTN0,x ; Check button (0 or 2)
asl
tya
ror ; BTN_1 DOWN !UP RIGHT !LEFT 0 0 0
; Read secondary button
tay
txa
eor #$02 ; IIgs has fourth button at TAPEIN
tax
lda TAPEIN,x ; Check button (1 or 3)
asl
tya
ror ; BTN_2 BTN_1 DOWN !UP RIGHT !LEFT 0 0
; Finalize
eor #%00010100 ; BTN_2 BTN_1 DOWN UP RIGHT LEFT 0 0
ldx #$00
rts