Retrocomputing Asked by bjb on August 25, 2021
The Commodore 64 has two DE-9 joystick ports. If I’m the only person that ever plays games on it, you would assume that you could just leave a joystick plugged into Port 1 and be done with it. However, there are a number of games out there which want you to have the joystick plugged into Port 2.
Why is that the case? What is the reason for this sometimes inconsistent requirement by C64 software?
As Wilson points out in his answer, it has to do with how the CIA chips interact with the keyboard and the joystick ports, and the confusion that can arise trying to determine where input is being received from.
Compute!'s Mapping the Commodore 64 has an excellent write-up here explaining how the "Complex Interface Adapter" (CIA#1) deals with scanning the keyboard matrix and how the joystick ports are caught up in the drama. Specifically, look at pages 172 to 176 for full details - but here is a brief excerpt with the relevant info:
"Since CIA #1 Data Port B is used for reading the keyboard as well as joystick 1, some confusion can result. The routine that checks the keyboard has no way of telling whether a particular bit was set to by a keypress or one of the joystick switches. For example, if you plug the joystick into Controller Port 1 and push the stick to the right, the routine will interpret this as the 2 key being pressed, because both set the same bit to 0. Likewise, when you read the joystick, it will register as being pushed to the right if the 2 key is being pressed.
The problem of mistaking the keyboard for the joystick can be solved by turning off the keyscan momentarily when reading the stick with a POKE 56333,127:POKE 56320,255, and restoring it after the read with a POKE 56333,129. Sometimes you can use the simpler solution of clearing the keyboard buffer after reading the joystick, with a POKE 198,0.
The problem of mistaking the joystick for a keypress is much more difficult — there is no real way to turn off the joystick. Many commercially available games just use Controller Port 2 to avoid the conflict. So, if you can't beat them, sit back and press your joystick to the left in order to slow down a program listing (the keyscan routine thinks that it is the CTRL key)."
Correct answer by Geo... on August 25, 2021
The design of the C64 hardware makes it somewhat complex to properly disambiguate joystick and keyboard inputs. The routines in the ROM for scanning the keyboard and joystick don't address all of this complexity, but they do allow better disambiguation of joystick port 2 than 1, so developers who use that routine (or a similar one) can improve joystick/keyboard scanning in a single-joystick game by using port 2 instead of port 1. The quote in Geo's answer gives a little more high-level detail on this.
Though it's not clear from the other answers here (or in some cases they're just wrong), it is possible to do scanning of one or both joysticks and the keyboard that is either perfectly or highly probable to be interference-free. This is not trivial, however, since it involves not just writing and testing custom code to do the scanning, but also analysis and possibly slight redesign of gameplay details. (For example, whether there are certain keyboard-triggered actions that need be detected only if a joystick is being held in a certain direction.) This answer provides the information needed to do that, and should give you a sense of its level of complexity.
Lack of knowledge by the developers may sometimes explain the choice of the port 2 solution, with its downside that the user must figure out which port to use and probably unplug and replug his joystick stick, but likely more often it's simply a matter of cost-benefit: the time saved on designing a better solution to this problem can be spent on improving other areas of the game, such as adding a new feature or improving a level.
Answered by cjs on August 25, 2021
In addition to what already was stated, namely:
The signals a (digital) JoyStick delivers, come in via Pins 1 to 4 (Up, Down, Left, Right) and additionally Pins 6 and 9 for the buttons (Left, Right) - the equivalent values are represented on the charmap by e.g.: SPACE for Pin 6 aka Fire|Click and other keys, like Numbers and Arrows (can't recall which exactly, i think LEFT-ARROW was one of them). - Signals are cached in CIA #DC01.
But for the second Port the keys representing its signals are always a key-combination starting with the C= | Cequal (as in equal and as in "Key is followed by another, so it becomes a sequel") | Commodore-Key | The Key with the Commodore-Logo. - Signals are cached in CIA +DC00.
Also, the yet not mentioned pins 5 and 9 cache the position (y- and x- -axis) for analogue joystick | mouse | paddle operation-mode.
While the pins used for digital signal input are generic as in cross-platform on (purposely) identical ports like e.g. on Atari ST or Amiga, the analogue ones are not.
But regarding your question, another detail has to be mentioned:
The CIA has at an offset +2 to the direct digital signal cache registers - so for #DC00 at #DC02 and for #DC01 at #DC03 respectively - registers that state if a signal is read-only or if it is allowed to write to it.
Furthermore, the C=64 is designed to allow for a charmap-flip from alphanumeric with UPPER- and lower- -case to UPPERCASE plus GRAPHIC-SYMBOLS.
Another factor can be that a game makes use of memory-intensive bitmap-graphics and therefore has to swap-out some memory from kernel-space (Yes: KERNAL, it's okay, calm down ...), which leads to an overlap with the registers for the Joystick.
Or the game makes intense use of (especially ring-)modulation for its sound-processing, which in return contaminates the registers for the Joystick-ports, because the processing of analogue JoyStick|Mouse|etc. is handled by the SID sound-chip. It is kind of hardwired to the registers for x- and y- -axis in the #DC00|#DC01 and making use of it switches these to read-only mode. So input can not be processed simultaneosly.
Maybe the game syncs graphical representations in general and RasterBars | Z-Scrolling | interlaced colors | etc. specifically to IRQs. This can affect the handling of the registers, too; mostly due to timing- and memory-swapping- -constraints.
Maybe the software has AI built-in or simplified NPCs (Non-Playable-Characters) to provide a single-player-mode for a game that actually requires two players to be playing; like TicTacToe, Chess, etc. - In this case it would be dumb to pollute the already very limited amount of RAM for the program with a stack of extra-routines solely for that specific case; Instead the computer-players simulated interaction is using the real registers of Port 1. This can be done even in basic, by using the equivalent Characters or KeyCodes of these or by poking directly into them. For that to work the registers have to be made writable. You can cheat in these games, by having a joystick in port 1 and overwrite the actions of the computer-player.
-
Using Port 2 for the human player mostly avoids many of the problems that can arise when the software is making use of the aforementioned methods. Why exactly, can't hardly be fitted in here and would be a separate task - or question - in this case.
-
Hope it helps. Anyhow. Thanks for reading.
Answered by Leahpar Suidualc on August 25, 2021
Because of the way that the joystick port 1 is mapped to the same hardware as the keyboard, from the software's point of view it's impossible to tell if you're wiggling the joystick or typing something on the keyboard. So many games used port 2 instead.
Answered by OmarL on August 25, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP