1
0
mirror of https://github.com/cc65/cc65.git synced 2025-01-24 20:30:08 +00:00
cc65/libsrc/atari7800/joy/atari7800-stdjoy.s
2024-07-20 13:14:22 +03:00

198 lines
5.0 KiB
ArmAsm

;
; Standard joystick driver for the Atari 7800.
; This version tries to use 7800 and 2600 joysticks.
; But assumes that both joysticks are of same type.
;
; Modified by Karri Kaksonen, 2022-03-31
; Ullrich von Bassewitz, 2002-12-20
; Using code from Steve Schmidtke
;
.include "zeropage.inc"
.include "joy-kernel.inc"
.include "joy-error.inc"
.include "atari7800.inc"
.macpack generic
.macpack module
; ------------------------------------------------------------------------
; Header. Includes jump table
module_header _atari7800_stdjoy_joy
; Driver signature
.byte $6A, $6F, $79 ; "joy"
.byte JOY_API_VERSION ; Driver API version number
; Library reference
.addr $0000
; Jump table.
.addr INSTALL
.addr UNINSTALL
.addr COUNT
.addr READ
; ------------------------------------------------------------------------
; Constants
JOY_COUNT = 2 ; Number of joysticks we support
.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.
;
PB2 = $04 ; Joystick 0
PB4 = $10 ; Joystick 1
INSTALL:
; Assume 7800 2-button controller, can change
; to 2600 1-button later
lda #(PB2 | PB4)
; enable 2-button 7800 controllers on both ports
; by setting PB2 and PB4 to output
sta CTLSWB
; enable 2-button 7800 controllers by setting
; the outputs to 0; (INPT4 and INPT5) high
ldy #$00
sty SWCHB
reset:
lda #JOY_ERR_OK
.assert JOY_ERR_OK = 0, error
tax
; rts ; Run into UNINSTALL instead
; ------------------------------------------------------------------------
; 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
rts
; ------------------------------------------------------------------------
; READ: Read a particular joystick passed in A for 2 fire buttons.
readdualbuttons0:
ldy #0 ; ........
bit INPT0 ; Check for right button
bpl L1
ldy #2 ; ......2.
L1: bit INPT1 ; Check for left button
bpl L2
iny ; ......21
L2: tya
rts
readdualbuttons1:
ldy #0 ; ........
bit INPT2 ; Check for right button
bpl L1
ldy #2 ; ......2.
L3: bit INPT3 ; Check for left button
bpl L2
iny ; ......21
L4: tya
rts
readbuttons:
; Y has joystick of interest 0/1
; return value:
; $00: no button,
; $01: left/B button,
; $02: right/A button,
; $03: both buttons
; preserves X
tya
beq readbuttons0
readbuttons1:
; Joystick 1 processing
; Start by checking for single button 2600 joystick
bit INPT5
bpl singlebtn1detected
jmp readdualbuttons1
singlebtn1detected:
; Single button joystick detected but could be dual
jsr readdualbuttons1
bne L5 ; It was a dual button press
; It was a single button press
bit INPT5
bmi L5
iny ; .......1
lda #PB4 ; Joystick 1 is a single button unit
clc
adc SWCHB
sta SWCHB ; Cut power from the dual button circuit
L5: tya ; ......21
rts
readbuttons0:
; Joystick 0 processing
; Start by checking for single button 2600 joystick
bit INPT4
bpl singlebtn0detected
jmp readdualbuttons0
singlebtn0detected:
; Single button joystick detected but could be dual
jsr readdualbuttons0
bne L6 ; It was a dual button press
; It was a single button press
bit INPT4
bmi L6
iny ; .......1
lda #PB2 ; Joystick 0 is a single button unit
clc
adc SWCHB
sta SWCHB ; Cut power from the dual button circuit
L6: tya ; ......21
rts
READ:
tay ; Store joystick 0/1 in Y
beq L8
lda SWCHA ; Read directions of joystick 1
rol ; ...RLDU.
rol ; ..RLDU..
rol ; .RLDU... - joystick 1
jmp L9
L8: lda SWCHA ; Read directions of joystick 0
ror ; .RLDU... - joystick 0
L9: tax
jsr readbuttons ; A = ......21, X = .RLDU...
ror ; A = .......2 1
tay ; Y = .......2
txa ; A = .RLDU...
ror ; A = 1.RLDU..
tax ; X = 1.RLDU..
tya ; A = .......2
ror ; A = ........ 2
txa ; A = 1.RLDU..
rol ; A = .RLDU..2 1
rol ; A = RLDU..21
eor #$F0 ; The direction buttons were inversed
and #$F3
rts