mirror of
https://github.com/cc65/cc65.git
synced 2024-12-27 00:29:31 +00:00
175 lines
4.8 KiB
ArmAsm
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
|