[Coco] CoCo joystk() Routine

Robert Gault robert.gault at worldnet.att.net
Fri Dec 7 09:04:19 EST 2007


Joel Ewy wrote:
> Hey all,
> 
> I seem to remember something about the CoCo BASIC ROM sampling all
> joystick axes when you use joystk() to read one of them.  Is there a
> relatively simple fix for that (assuming CoCo 3 or 64K CoCo 1/2 in
> all-RAM mode of course)?
> 
> JCE
> 

With a caveat, what you want can be done. First, the only reason for 
doing this would be you can't sample fast enough for your purpose. If 
that is the case, you can only get a speed-up by a factor of 4 by 
sampling a single stick and axis. Second, the ROM routine samples 10 
times to make sure there is no "bounce" in the results. You might choose 
to sample all four sticks but fewer times to get a good value. Third, 
the ROM only samples the sticks when you request data for axis#0. 
otherwise it just reads stored values. Fresh values require all four 
axis to be read.

  The joystick routine is at $A9CA-$AA19. It can be separated into 
several parts. 1) Check for illegal axis #. 2) Check for axis#0 to 
select refresh or stored data read. 3) Sample an axis 10 times for a 
match. 4) Shift to next axis. You probably will want to keep 1) and 3) 
but discard 2) and 4), if I read your request correctly.
  So, at $A9D0 is a bne $A9D4 which needs to be changed to a brn or 
completely nop'd out to remove 1). For a single byte correction, POKE 
&HA9D0,&H21.
  At $A9E3 there is a ldb #3 which preselects the axis to be read and 
will later be decremented to get all axes. Here you must enter the 
specific axis you want read, 0, 1, 2, or 3; POKE &HA9E4,axis#. This must 
be changed each time you want to select a different axis. At $AA17, is a 
bpl $A9E5 if all axes have not been read. This needs to be a brn or 
nop'd so POKE &HAA17,&H21. Now 4) has been removed from the ROM routine.



More information about the Coco mailing list