--- /dev/null
+;
+; Standard joystick driver for the Atari 5200.
+;
+; Christian Groessler, 2014-05-12
+;
+
+        .include        "zeropage.inc"
+
+        .include        "joy-kernel.inc"
+        .include        "joy-error.inc"
+        .include        "atari5200.inc"
+
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table
+
+.segment        "JUMPTABLE"
+
+; Driver signature
+
+        .byte   $6A, $6F, $79           ; "joy"
+        .byte   JOY_API_VERSION         ; Driver API version number
+
+; Library reference
+
+        .addr   $0000
+
+; Button state masks (8 values)
+
+        .byte   $01                     ; JOY_UP
+        .byte   $02                     ; JOY_DOWN
+        .byte   $04                     ; JOY_LEFT
+        .byte   $08                     ; JOY_RIGHT
+        .byte   $10                     ; JOY_FIRE
+        .byte   $20                     ; JOY_FIRE2
+        .byte   $00                     ; Future expansion
+        .byte   $00                     ; Future expansion
+
+; Jump table.
+
+        .addr   INSTALL
+        .addr   UNINSTALL
+        .addr   COUNT
+        .addr   READJOY
+        .addr   0                       ; IRQ entry not used
+
+; ------------------------------------------------------------------------
+; Constants
+
+JOY_COUNT       = 4             ; 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:
+        lda     #JOY_ERR_OK
+        ldx     #0
+;       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     #0
+        rts
+
+; ------------------------------------------------------------------------
+; READ: Read a particular joystick passed in A.
+;
+
+CENTER =       228 / 2
+SENSIVITY      = 16
+
+READJOY:
+        and     #3              ; fix joystick number
+       asl     a
+        tax                     ; Joystick number * 2 (0-6) into X, index into ZP shadow registers
+       lda     #0              ; Initialize return value
+
+; Read joystick
+
+       ldy     PADDL0,x        ; get horizontal position
+       cpy     #CENTER-SENSIVITY
+       bcs     @chkleft
+
+       ora     #4              ; JOY_LEFT
+       bne     @updown
+
+@chkleft:
+       cpy     #CENTER+SENSIVITY
+       bcc     @updown
+
+       ora     #8              ; JOY_RIGHT
+
+@updown:ldy    PADDL0+1,x      ; get vertical position
+       cpy     #CENTER-SENSIVITY
+       bcs     @chkdown
+
+       ora     #1              ; JOY_UP
+       bne     @buttons
+
+@chkdown:
+       cpy     #CENTER+SENSIVITY
+       bcc     @buttons
+
+       ora     #2              ; JOY_DOWN
+
+@buttons:
+       ; @@@ TODO: BOTTON STATE
+
+       rts
+