Nintendo Famicom
Die Ansteuerung der Controller des Nintendo Famicom erfolgt verglichen mit anderen Spielekonsolen der damaligen Zeit auf erstaunlich komplexe Weise. Um die Controller auszulesen, wird die Leitung Out 0 von der CPU auf LOW
gezogen. Für einen Controller stellt das die Aufforderung dar, den aktuellen Status aller Tasten zu erfassen und in einem Schieberegister zu speichern. Anschließend sendet die CPU ein Taktsignal, woraufhin der gespeicherte Zustand der ersten Taste vom Controller an die CPU gesendet wird. Die Software kann nun an den Speicheradressen $4016 und $4017 den Zustand der ersten Taste als Binärwert auslesen. Gleichzeitig sorgt der Lesezugriff auf diese Adressen dafür, dass die CPU das nächste Taktsignal sendet und der Controller den Zustand der nächsten Taste überträgt. Die Software liest nun solange weiter Daten ein, bis alle Tasten des Controllers ausgewertet wurden.
Da jeder Controller immer nur ein Bit sendet, könnten an den beiden Speicheradressen zusammen die Daten von 16 Controllern bereitgestellt werden. Von der Speicheradresse $4016 werden jedoch nur die Bits 0 und 1, von Speicheradresse $4017 nur die Bits 0, 1, 2, 3 und 4 für diesen Zweck genutzt, weshalb maximal 7 Controller abgebildet werden können.
Beim Famicom sind zwei digitale Gamepads bereits fest mit der Konsole verkabelt. Diese nutzen jeweils das Bit 0 der Speicheradressen $4016 und $4017. Alle weiteren Controller müssen über einen Expansion Port angeschlossen werden, der als 15-poliger Sub-D-Stecker ausgeführt ist.
Die Realisierung des Expansion Ports macht die Gestaltungmöglichkeiten von zusätzlichen Controllern nahezu grenzenlos, da erst auf Software-Ebene den binären Daten in den Registern eine Bedeutung zugewiesen wird. Allerdings mangelt es dadurch an Standards, und häufig wird ein bestimmter Controller nur von einem dazugehörigen Spiel unterstützt.
Pin | Bezeichnung | Erklärung |
---|---|---|
1 | Masse | |
2 | Ⓐ ? Sound | Analoges Soundsignal der Konsole |
3 | ? → IRQ | Der angeschlossene Controller kann hierüber einen Interrupt der CPU auslösen. |
4 | Ⓛ → 4017.D4 | Daten eines Controllers, die im Register $4017 im Bit 4 bereitgestellt werden. |
5 | Ⓛ → 4017.D3 | Daten eines Controllers, die im Register $4017 im Bit 3 bereitgestellt werden. |
6 | Ⓛ → 4017.D2 | Daten eines Controllers, die im Register $4017 im Bit 2 bereitgestellt werden. |
7 | Ⓛ → 4017.D1 | Daten eines Controllers, die im Register $4017 im Bit 1 bereitgestellt werden. |
8 | Ⓛ → 4017.D0 | Daten eines Controllers, die im Register $4017 im Bit 0 bereitgestellt werden. Dies ist die Datenleitung des zweiten, fest-installierten Gamepads. Sollte ein Controller diese Datenleitung nutzen, kann das zweite Gamepad nicht mehr parallel genutzt werden. |
9 | Ⓛ ← 4017 Clock | Taktsignal für Daten, die im Register $4017 bereitgestellt werden. |
10 | Ⓛ ← Out 2 | Weitere Signalleitung von der CPU an den Controller; frei programmierbar. |
11 | Ⓛ ← Out 1 | Weitere Signalleitung von der CPU an den Controller; frei programmierbar. |
12 | Ⓛ ← Out 0 | Ein LOW auf dieser Leitung signalisiert den Controllern, den Tastenstatus auszulesen und im Schieberegister bereitszustellen. |
13 | Ⓛ → 4016.D1 | Daten eines Controllers, die im Register $4016 im Bit 1 bereitgestellt werden. |
14 | Ⓛ ← 4016 Clock | Taktsignal für Daten, die im Register $4016 bereitgestellt werden. |
15 | +5V |