2 ; Standard joystick driver for the Creativision.
4 ; Christian Groessler, 2017-03-08
7 .include "zeropage.inc"
9 .include "joy-kernel.inc"
10 .include "joy-error.inc"
11 .include "creativision.inc"
16 ; ------------------------------------------------------------------------
17 ; Header. Includes jump table
19 module_header _creativisionstd_joy
23 .byte $6A, $6F, $79 ; "joy"
24 .byte JOY_API_VERSION ; Driver API version number
37 ; ------------------------------------------------------------------------
40 JOY_COUNT = 2 ; Number of joysticks we support
42 ; Symbolic names for joystick masks (similar names like the defines in joystick.h, but not related to them)
49 ; ------------------------------------------------------------------------
54 ; ------------------------------------------------------------------------
55 ; INSTALL routine. Is called after the driver is loaded into memory. If
56 ; possible, check if the hardware is present and determine the amount of
58 ; Must return an JOY_ERR_xx code in a/x.
61 INSTALL: lda #JOY_ERR_OK
65 ; ------------------------------------------------------------------------
66 ; UNINSTALL routine. Is called before the driver is removed from memory.
67 ; Can do cleanup or whatever. Must not return anything.
73 ; ------------------------------------------------------------------------
74 ; COUNT: Return the total number of available joysticks in a/x.
77 COUNT: lda #<JOY_COUNT
81 ; ------------------------------------------------------------------------
82 ; READ: Read a particular joystick passed in A.
85 READJOY: and #1 ; fix joystick number
86 bne READJOY_1 ; read right joystick
92 jmp convert ; convert joystick state to cc65 values
96 READJOY_1: ldx ZP_JOY1_DIR
100 ;jmp convert ; convert joystick state to cc65 values
103 ; ------------------------------------------------------------------------
104 ; convert: make runtime lib compatible values
114 ; Port values are for the left hand joystick (right hand joystick
115 ; values were shifted to the right to be identical).
116 ; Why are there two bits indicating a pressed trigger?
117 ; According to the "Second book of programs for the Dick Smith Wizard"
118 ; (pg. 88ff), the left hand button gives the value of
119 ; %00010001 and the right hand button gives %00100010
120 ; Why two bits? Can there be cases that just one of those bits is set?
121 ; Until these questions have been answered, we only use the lower two
122 ; bits and ignore the upper ones...
124 and #%00000011 ; button status came in in A, strip high bits
125 sta retval ; initialize 'retval' with button status
129 ; CV has a 16-direction joystick
131 ; port values: (compass points)
132 ; N - $49 - %01001001
133 ; NNE - $48 - %01001000
134 ; NE - $47 - %01000111
135 ; ENE - $46 - %01000110
136 ; E - $45 - %01000101
137 ; ESE - $44 - %01000100
138 ; SE - $43 - %01000011
139 ; SSE - $42 - %01000010
140 ; S - $41 - %01000001
141 ; SSW - $40 - %01000000
142 ; SW - $4F - %01001111
143 ; WSW - $4E - %01001110
144 ; W - $4D - %01001101
145 ; WNW - $4C - %01001100
146 ; NW - $4B - %01001011
147 ; NNW - $4A - %01001010
148 ; center - $00 - %00000000
150 ; mapping to cc65 definitions (4-direction joystick with 8 possible directions thru combinations)
151 ; N, E, S, W -> JOY_UP, JOY_RIGHT, JOY_DOWN, JOY_LEFT
152 ; NE, SE, SW, NW -> (JOY_UP | JOY_RIGHT), (JOY_DOWN | JOY_RIGHT), (JOY_DOWN | JOY_LEFT), (JOY_UP | JOY_LEFT)
153 ; NNE, ENE, ESE, SSE, SSW, WSW, WNW, NNW:
154 ; toggle between straight and diagonal direction for every call, e.g.
156 ; call to READJOY: return JOY_UP | JOY_RIGHT
157 ; call to READJOY: return JOY_UP
158 ; call to READJOY: return JOY_UP | JOY_RIGHT
159 ; call to READJOY: return JOY_UP
160 ; call to READJOY: return JOY_UP | JOY_RIGHT
163 txa ; move direction status into A
164 beq done ; center position (no bits are set), nothing to do
166 and #$0F ; get rid of the "$40" bit
167 bit bit0 ; is it a "three letter" direction (NNE, ENE, etc.)?
168 beq special ; yes (bit #0 is zero)
170 lsr a ; create index into table
173 done: ora retval ; include "button" bits
177 ; NNE, ENE, ESE, SSE, SSW, WSW, WNW, NNW
182 lda toggler ; toggle the toggler
185 bne spec_1 ; toggler is 1, use spectable_1 entry
187 lda spectable_0,x ; toggler is 0, use spectable_0 entry
188 bne done ; jump always
190 spec_1: lda spectable_1,x
191 bne done ; jump always
193 ; ------------------------------------------------------------------------
197 ; a mapping table of "port values" to "cc65 values"
198 ; port value had been shifted one bit to the right (range 0..7)
199 dirtable: .byte JOY_DOWN ; S
200 .byte JOY_DOWN | JOY_RIGHT ; SE
202 .byte JOY_UP | JOY_RIGHT ; NE
204 .byte JOY_UP | JOY_LEFT ; NW
206 .byte JOY_DOWN | JOY_LEFT ; SW
208 ; two "special" mapping tables for three-letter directions (NNE, etc.)
209 spectable_0: .byte JOY_DOWN ; SSW
211 .byte JOY_RIGHT ; ESE
212 .byte JOY_RIGHT ; ENE
213 .byte JOY_RIGHT ; NNE
218 spectable_1: .byte JOY_DOWN | JOY_LEFT ; SSW
219 .byte JOY_DOWN | JOY_RIGHT ; SSE
220 .byte JOY_DOWN | JOY_RIGHT ; ESE
221 .byte JOY_UP | JOY_RIGHT ; ENE
222 .byte JOY_UP | JOY_RIGHT ; NNE
223 .byte JOY_UP | JOY_LEFT ; NNW
224 .byte JOY_UP | JOY_LEFT ; WNW
225 .byte JOY_DOWN | JOY_LEFT ; WSW
227 ; ------------------------------------------------------------------------
231 ; ------------------------------------------------------------------------