; ; 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-02-27 ; 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. ; INSTALL: ; Assume 7800 2-button controller, can change ; to 2600 1-button later lda #$14 sta CTLSWB ; enable 2-button 7800 controller 1: set pin 6 to output ldy #$00 sty SWCHB ; enable 2-button 7800 controller 2: pull pin 6 (INPT4) high reset: lda #JOY_ERR_OK ; 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 rts ; ------------------------------------------------------------------------ ; READ: Read a particular joystick passed in A for 2 fire buttons. readbuttons: ; Y has joystick of interest 0/1 ; return value: ; $00: no button, ; $80: left/B button, ; $40: right/A button, ; $c0: both buttons ; preserves X tya beq L5 ; Joystick 1 processing ; 7800 joystick 1 buttons ldy #0 ; ........ bit INPT2 ; Check for right button bpl L1 ldy #2 ; ......2. L1: bit INPT3 ;Check for left button bpl L2 iny ; ......21 L2: tya bne L4 ; Joystick worked ; 2600 Joystick 1 bit INPT5 bpl L4 L3: iny ; .......1 lda #0 ; Fallback to 2600 joystick mode sta CTLSWB L4: tya ror ; .......2 1 ror ; 1....... 2 ror ; 21...... rts L5: ; Joystick 0 processing ; 7800 joystick 0 buttons ldy #0 ; ........ bit INPT0 ; Check for right button bpl L6 ldy #2 ; ......2. L6: bit INPT1 ;Check for left button bpl L7 iny ; ......21 L7: tya bne L4 ; Joystick worked ; 2600 Joystick 0 bit INPT4 bpl L4 bmi L3 READ: tay ; Store joystick 0/1 in Y beq L8 lda SWCHA rol ; ...RLDU. rol ; ..RLDU.. rol ; .RLDU... - joystick 1 jmp L9 L8: lda SWCHA ; Read joystick ror ; .RLDU... - joystick 0 L9: tax jsr readbuttons ; A = 21......, X = .RLDU... rol ; A = 1 .......2 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