;
-; Standard joystick driver for the Apple ][. May be used multiple times when
-; linked to the statically application.
+; 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 "joy-error.inc"
.include "apple2.inc"
- .macpack generic
+; ------------------------------------------------------------------------
+
+; Constants
+THRESHOLD = 20 ; Deviation from center triggering movement
; ------------------------------------------------------------------------
-; Constants
-OFFS = 10
+; ROM entry points
+
+PREAD := $FB1E ; Read paddle in X, return AD conv. value in Y
; ------------------------------------------------------------------------
-; Header. Includes jump table
-.segment "JUMPTABLE"
+; Header. Includes jump table.
+
+ .segment "JUMPTABLE"
; Driver signature
- .byte $6A, $6F, $79 ; "joy"
- .byte JOY_API_VERSION ; Driver API version number
+ .byte $6A, $6F, $79 ; "joy"
+ .byte JOY_API_VERSION ; Driver API version number
; Button state masks (8 values)
- .byte $40
- .byte $80
.byte $10
.byte $20
+ .byte $04
.byte $08
- .byte $00 ; Future expansion
- .byte $00 ; Future expansion
- .byte $00 ; Future expansion
-
-; Jump table.
-
- .word INSTALL
- .word UNINSTALL
- .word COUNT
- .word READJOY
-
-; ------------------------------------------------------------------------
-; Constants
+ .byte $40
+ .byte $80
+ .byte $00 ; Future expansion
+ .byte $00 ; Future expansion
-JOY_COUNT = 2 ; Number of joysticks we support
+; Jump table
+ .addr INSTALL
+ .addr UNINSTALL
+ .addr COUNT
+ .addr READJOY
+ .addr 0 ; IRQ not used
; ------------------------------------------------------------------------
-; Data.
+ .code
-.code
-
-; ------------------------------------------------------------------------
; 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 #<JOY_ERR_OK
ldx #>JOY_ERR_OK
-; rts ; Run into UNINSTALL instead
+ ; Fall through
-; ------------------------------------------------------------------------
; UNINSTALL routine. Is called before the driver is removed from memory.
; Can do cleanup or whatever. Must not return anything.
-;
-
UNINSTALL:
rts
-
-; ------------------------------------------------------------------------
; COUNT: Return the total number of available joysticks in a/x.
-;
-
COUNT:
- lda #<JOY_COUNT
- ldx #>JOY_COUNT
+ lda #$02 ; Number of joysticks we support
+ ldx #$00
rts
-; ------------------------------------------------------------------------
; READ: Read a particular joystick passed in A.
-;
-
READJOY:
- and #$01 ; Fix joystick number
- asl a ;
- tax ; Joystick number (0,2) into X
-
-; Read joystick
-
- lda OPEN_APPLE,x ; Check fire button
- and #$80 ; BTN 0 0 0 0 0 0 0
-
+ bit $C082 ; Switch in ROM
+ and #$01 ; Restrict joystick number
+
+ ; Read horizontal paddle
+ asl ; Joystick number -> paddle number
+ tax ; Set paddle number (0, 2)
+ jsr PREAD ; Read paddle value
+ lda #$00 ; 0 0 0 0 0 0 0 0
+ cpy #127 - THRESHOLD
+ ror ; !LEFT 0 0 0 0 0 0 0
+ cpy #127 + THRESHOLD
+ ror ; RIGHT !LEFT 0 0 0 0 0 0
+
+ ; Read vertical paddle
pha
- jsr PREAD ; Read first paddle value
+ inx ; Set paddle number (1, 3)
+ jsr PREAD ; Read paddle value
pla
- cpy #127-OFFS
- ror a ; /LEFT BTN 0 0 0 0 0 0
- cpy #127+OFFS
- ror a ; RIGHT /LEFT BTN 0 0 0 0 0
-
- inx
- pha
- jsr PREAD ; Read second paddle
- pla
- cpy #127-OFFS
- ror a ; /UP RIGHT /LEFT BTN 0 0 0 0
- cpy #127+OFFS
- ror a ; DOWN /UP RIGHT /LEFT BTN 0 0 0
- eor #%01010000 ; DOWN UP RIGHT LEFT BTN 0 0 0
-
- ldx #0 ; fix X
+ cpy #127 - THRESHOLD
+ ror ; !UP RIGHT !LEFT 0 0 0 0 0
+ cpy #127 + THRESHOLD
+ ror ; DOWN !UP RIGHT !LEFT 0 0 0 0
+
+ ; Read primary button
+ tay
+ lda BUTN0-1,x ; Check button (1, 3)
+ asl
+ tya
+ ror ; FIRE DOWN !UP RIGHT !LEFT 0 0 0
+
+ ; Read secondary button
+ tay
+ inx
+ txa
+ and #$03 ; IIgs has fourth button at TAPEIN
+ tax
+ lda BUTN0-1,x ; Check button (2, 0)
+ asl
+ tya
+ ror ; FIRE2 FIRE DOWN !UP RIGHT !LEFT 0 0
+
+ ; Finalize
+ eor #%00010100 ; FIRE2 FIRE DOWN UP RIGHT LEFT 0 0
+ ldx #$00
+ bit $C080 ; Switch in LC bank 2 for R/O
rts
-
-