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
36 .addr 0 ; IRQ entry not used
38 ; ------------------------------------------------------------------------
41 JOY_COUNT = 2 ; Number of joysticks we support
43 ; Symbolic names for joystick masks (similar names like the defines in joystick.h, but not related to them)
50 ; ------------------------------------------------------------------------
55 ; ------------------------------------------------------------------------
56 ; INSTALL routine. Is called after the driver is loaded into memory. If
57 ; possible, check if the hardware is present and determine the amount of
59 ; Must return an JOY_ERR_xx code in a/x.
62 INSTALL: lda #JOY_ERR_OK
66 ; ------------------------------------------------------------------------
67 ; UNINSTALL routine. Is called before the driver is removed from memory.
68 ; Can do cleanup or whatever. Must not return anything.
74 ; ------------------------------------------------------------------------
75 ; COUNT: Return the total number of available joysticks in a/x.
78 COUNT: lda #<JOY_COUNT
82 ; ------------------------------------------------------------------------
83 ; READ: Read a particular joystick passed in A.
86 READJOY: and #1 ; fix joystick number
87 bne READJOY_1 ; read right joystick
93 jmp convert ; convert joystick state to cc65 values
97 READJOY_1: ldx ZP_JOY1_DIR
101 ;jmp convert ; convert joystick state to cc65 values
104 ; ------------------------------------------------------------------------
105 ; convert: make runtime lib compatible values
115 ; Port values are for the left hand joystick (right hand joystick
116 ; values were shifted to the right to be identical).
117 ; Why are there two bits indicating a pressed trigger?
118 ; According to the "Second book of programs for the Dick Smith Wizard"
119 ; (pg. 88ff), the left hand button gives the value of
120 ; %00010001 and the right hand button gives %00100010
121 ; Why two bits? Can there be cases that just one of those bits is set?
122 ; Until these questions have been answered, we only use the lower two
123 ; bits and ignore the upper ones...
125 and #%00000011 ; button status came in in A, strip high bits
126 sta retval ; initialize 'retval' with button status
130 ; CV has a 16-direction joystick
132 ; port values: (compass points)
133 ; N - $49 - %01001001
134 ; NNE - $48 - %01001000
135 ; NE - $47 - %01000111
136 ; ENE - $46 - %01000110
137 ; E - $45 - %01000101
138 ; ESE - $44 - %01000100
139 ; SE - $43 - %01000011
140 ; SSE - $42 - %01000010
141 ; S - $41 - %01000001
142 ; SSW - $40 - %01000000
143 ; SW - $4F - %01001111
144 ; WSW - $4E - %01001110
145 ; W - $4D - %01001101
146 ; WNW - $4C - %01001100
147 ; NW - $4B - %01001011
148 ; NNW - $4A - %01001010
149 ; center - $00 - %00000000
151 ; mapping to cc65 definitions (4-direction joystick with 8 possible directions thru combinations)
152 ; N, E, S, W -> JOY_UP, JOY_RIGHT, JOY_DOWN, JOY_LEFT
153 ; NE, SE, SW, NW -> (JOY_UP | JOY_RIGHT), (JOY_DOWN | JOY_RIGHT), (JOY_DOWN | JOY_LEFT), (JOY_UP | JOY_LEFT)
154 ; NNE, ENE, ESE, SSE, SSW, WSW, WNW, NNW:
155 ; toggle between straight and diagonal direction for every call, e.g.
157 ; call to READJOY: return JOY_UP | JOY_RIGHT
158 ; call to READJOY: return JOY_UP
159 ; call to READJOY: return JOY_UP | JOY_RIGHT
160 ; call to READJOY: return JOY_UP
161 ; call to READJOY: return JOY_UP | JOY_RIGHT
164 txa ; move direction status into A
165 beq done ; center position (no bits are set), nothing to do
167 and #$0F ; get rid of the "$40" bit
168 bit bit0 ; is it a "three letter" direction (NNE, ENE, etc.)?
169 beq special ; yes (bit #0 is zero)
171 lsr a ; create index into table
174 done: ora retval ; include "button" bits
178 ; NNE, ENE, ESE, SSE, SSW, WSW, WNW, NNW
183 lda toggler ; toggle the toggler
186 bne spec_1 ; toggler is 1, use spectable_1 entry
188 lda spectable_0,x ; toggler is 0, use spectable_0 entry
189 bne done ; jump always
191 spec_1: lda spectable_1,x
192 bne done ; jump always
194 ; ------------------------------------------------------------------------
198 ; a mapping table of "port values" to "cc65 values"
199 ; port value had been shifted one bit to the right (range 0..7)
200 dirtable: .byte JOY_DOWN ; S
201 .byte JOY_DOWN | JOY_RIGHT ; SE
203 .byte JOY_UP | JOY_RIGHT ; NE
205 .byte JOY_UP | JOY_LEFT ; NW
207 .byte JOY_DOWN | JOY_LEFT ; SW
209 ; two "special" mapping tables for three-letter directions (NNE, etc.)
210 spectable_0: .byte JOY_DOWN ; SSW
212 .byte JOY_RIGHT ; ESE
213 .byte JOY_RIGHT ; ENE
214 .byte JOY_RIGHT ; NNE
219 spectable_1: .byte JOY_DOWN | JOY_LEFT ; SSW
220 .byte JOY_DOWN | JOY_RIGHT ; SSE
221 .byte JOY_DOWN | JOY_RIGHT ; ESE
222 .byte JOY_UP | JOY_RIGHT ; ENE
223 .byte JOY_UP | JOY_RIGHT ; NNE
224 .byte JOY_UP | JOY_LEFT ; NNW
225 .byte JOY_UP | JOY_LEFT ; WNW
226 .byte JOY_DOWN | JOY_LEFT ; WSW
228 ; ------------------------------------------------------------------------
232 ; ------------------------------------------------------------------------