Fernsehschnittstellenadapter - Television Interface Adaptor

Der Television Interface Adapter ( TIA ) ist der kundenspezifische Computerchip , der zusammen mit einer Variante der MOS Technology 6502 das Herzstück der 1977er Atari Video Computer System -Spielekonsole bildet. Der TIA generiert die Bildschirmanzeige, Soundeffekte und liest die Controller. Zu der Zeit, als der Atari VCS entwickelt wurde, waren selbst kleine Mengen an RAM teuer. Der Chip wurde so konzipiert, dass er keinen Framebuffer hat, sondern eine detaillierte Programmierung erfordert, um auch nur eine einfache Anzeige zu erstellen.

Die Entwicklung des CO10444/CO11903 TIA wurde von Jay Miner geleitet, der bei Atari das Design des TIA für die Atari 400 / 800- Computer mit den ANTIC- und CTIA/GTIA- Chips weiter ausbaute . Jay Miner leitete später das Design der benutzerdefinierten Chips für den Amiga- Computer.

Design

Das Motherboard des ursprünglichen Atari VCS mit sechs Schaltern. Auf der linken Seite befindet sich der 40-Pin-TIA-Chip. Der mittlere 24-Pin ist der MOS Technology 6507 und rechts davon der 40-Pin MOS Technology 6352 Ram-I/O-Timer (RIOT)-Chip. Der Patroneneinschubschlitz befindet sich direkt rechts neben dem RIOT-Chip.

Hintergrund

Um 1975 hatten Ataris Ingenieure bei Cyan Engineering unter der Leitung von Steve Mayer und Ron Milner Alternativen zur Entwicklung dedizierter Hardware wie anwendungsspezifische integrierte Schaltkreise (ASIC) für Arcade-Videospiele und Heimvideospielkonsolen in Betracht gezogen. Programmierbare Mikroprozessoren hatten den Markt erreicht, aber Atari hielt sie für zu teuer für eine Heimanwendung. Sie waren auch durch die Kosten bei den Optionen für die Anzeige von Grafiken begrenzt. Zu diesem Zeitpunkt wurden die meisten Computergrafiken unter Verwendung von Sprites erzeugt, die auf einem Spielfeld gezeichnet wurden, die dann in ein analoges Signal zur Anzeige auf einem CRT -Videomonitor übersetzt wurden . Sprites würden als Bitmap in einem Framebuffer gespeichert , was einen Arbeitsspeicher (RAM) erfordert . RAM war immer noch teuer und kostete Zehntausende Dollar pro Megabyte, und die Anzeige eines zweifarbigen Spielfelds auf einem 80×48-Display hätte Tausende von Dollar an Speicher gekostet. Bei einem herkömmlichen NTSC- Farbfernseher fielen die maximalen Auflösungen im Allgemeinen zwischen 256 und 320 Pixel pro Zeile und 192 bis 240 Zeilen pro Bildschirm.

Im September 1975 stellte MOS Technology den Mikroprozessor 6502 vor , einen der ersten kostengünstigen Mikroprozessoren auf dem Markt. Mayer und Milner verabredeten sich mit dem Chipdesigner Chuck Peddle über die Verwendung des 6502 als Basis für ihre programmierbare Videospielkonsole. Innerhalb weniger Tage wurde das Grunddesign des Atari VCS ausgelegt, wobei Peddle Atari den Einsatz des kostengünstigeren MOS Technology 6507 Prozessors und des MOS Technology 6532 RAM-I/O-Timer (RIOT) anbot. als Kern des Designs. Mit einem Breadboard- Prototyp für den Display-Adapter auf einem 6502-Testbed-System konnte Milner die Fähigkeit demonstrieren, eine einfache Version ihres Tank- Spiels zu programmieren . Joe Decuir wurde eingestellt, um Milners Machbarkeitsstudie in einen funktionsfähigen Prototypen umzuwandeln, der für Atari ausreichend ist, um grünes Licht für die Fortsetzung der Entwicklung zu geben.

Während Decuir am Design des restlichen Systems arbeitete, konzentrierte sich Jay Miner darauf, einen ASIC für den Display-Adapter zu erstellen . Schon früh wurde der ASIC-Anzeigeadapter als Television Interface Adapter (TIA) bezeichnet. Die Kosten für RAM blieben hoch, als das Team mit dem Design begann, und daher wurde die Option, speicherbasierte Framebuffer zu verwenden, aus dem Design des TIA gestrichen.

RAM-loses Design

Aufgrund des fehlenden Arbeitsspeichers unterscheidet sich der TIA vom herkömmlichen Framebuffer-Ansatz dadurch, dass das Bild auf dem Bildschirm durch die Manipulation von fünf beweglichen Grafikobjekten (2 Spieler, 2 Raketen und 1 Ball) und einem statischen Spielfeldobjekt zusammengesetzt wird. Diese werden alle auf jeder Abtastzeile aus ihren jeweiligen Registern erzeugt, anders als bei der Technik, die in einem Rahmenpuffer-abgebildeten Modell verwendet wird, das erfordert, dass das Programm diese auf jeder Abtastzeile aktualisiert. Die horizontale Auflösung ist nicht einheitlich, da ihre Größe vom jeweiligen Grafikobjekt abhängt. Die kleinste Pixeleinheit entspricht 1 Farbtakt des Chips, von denen 160 auf einer Zeile sichtbar sind.

Das Playfield-Objekt besteht aus einem zweieinhalb Byte langen Register (20 Bit breit), das symmetrisch gespiegelt oder unverändert in die rechte Bildschirmhälfte für insgesamt 40 Bit kopiert werden kann (jedes Bit besteht aus 4 Farbzyklen color breit). Die Farbe, die gezeichnet wurde, wenn das Bit eine 1 oder eine 0 war, wurde aus einer vordefinierten Palette von bis zu 128 Farben (siehe unten) ausgewählt und in anderen Registern gespeichert.

Der TIA unterstützt auch fünf separate Grafikobjekte, bestehend aus:

  • Zwei horizontale 8-Pixel-Linien, die die ' Sprites ' Player 1 und Player 2 bilden. Diese sind einfarbig, können um den Faktor 2 oder 4 gestreckt werden und können dupliziert oder verdreifacht werden.
  • Ein „Ball“ – eine horizontale Linie, die dieselbe Farbe wie das Spielfeld hat. Es kann ein, zwei, vier oder acht Pixel breit sein.
  • Zwei "Raketen" - eine weitere horizontale Linie, die die gleiche Farbe wie ihr jeweiliger Spieler hat. Es kann ein, zwei, vier oder acht Pixel breit sein.

Ohne RAM-basierte Framebuffer ist auch die Kollisionserkennung kompliziert. Der TIA verfügt über eine Hardware-Kollisionserkennung für all diese Objekte durch die Verwendung von 15 Set/Reset -Flipflops und speichert eine Bitmap von Kollisionen, die typischerweise während der VBLANK-Periode gelesen werden. Register im TIA ermöglichen es dem Programmierer, die Positionierung der grafischen Objekte und deren Farbe zu steuern.

Der TIA bietet auch zwei Kanäle mit 1-Bit-Ton. Jeder Kanal bietet 32 ​​Tonhöhenwerte und 16 mögliche Bitfolgen. Es gibt eine 4-Bit-Lautstärkeregelung.

Schließlich verfügt der TIA über Eingänge zum Auslesen von bis zu vier analogen Paddle-Controllern mit Potentiometern und für zwei Joystick-Trigger.

Zeichnen des Displays

Da die Register Daten nur für eine einzelne Zeile des Displays enthalten, erfordert die Erstellung eines Vollbilds, dass das Spielprogramm die Register im laufenden Betrieb aktualisiert, ein Vorgang, der als „ Racing the beam “ bekannt ist.

Um den Vorgang zu starten, lädt das Spielprogramm, das auf der MOS Technology 6502- basierten CPU läuft, die Register des TIA mit den Daten, die zum Zeichnen der ersten Zeile des Displays benötigt werden. Der TIA wartet dann, bis der Fernseher bereit ist, die Linie zu zeichnen (unter dem Befehl der zugehörigen analogen Hardware des TIA) und die Register auszulesen, um ein Signal für diese Linie zu erzeugen. Während der horizontalen Austastperiode zwischen den Zeilen ändert der 6502 schnell die Register des TIA nach Bedarf für die nächste Zeile. Dieser Vorgang wird auf dem Bildschirm fortgesetzt.

Dies wird erschwert, da die MOS-Technologie 6507 im 2600 eine pinreduzierte Version des 6502 ohne Unterstützung für Hardware- Interrupts ist . Im Allgemeinen erzeugt die analoge Seite des Anzeigesystems einen Interrupt, wenn sie das Zeichnen einer Rasterlinie beendet und sich auf die nächste vorbereitet. Der Interrupt löst den Code aus, der zum Aktualisieren des Bildschirms benötigt wird, und kehrt dann zum "Haupt"-Programm zurück. Der 6507 hat diese Pins von der CPU weggelassen, um Geld zu sparen, hat jedoch einen "RDY" -Pin, um Wartezustände in CPU-Buszyklen einzufügen. Der TIA wurde speziell entwickelt, um den RDY-Pin zu verwenden, um die CPU mit dem Rasterzeilen-Timing des vom TIA erzeugten Videos zu synchronisieren: Wenn die CPU in eine bestimmte Registeradresse des TIA schreibt, senkt der TIA sein RDY-Ausgangssignal bis zum Anfang der nächsten Zeile ein "wait for sync"-Befehl. Dies unterbricht den Betrieb der CPU bis zum Start (Farbtaktzyklus 0) der nächsten Zeile, wodurch ein Maß für die automatische Synchronisation bereitgestellt wird. Die beabsichtigte Verwendung dieses Mechanismus besteht darin, dass die CPU die TIA-Register für die folgende Zeile einrichtet, bevor der TIA das Ende der aktuellen Zeile erreicht, dann in das Register schreibt, das die Synchronisationsverzögerung über RDY auslöst, wobei eine variable Menge von . weggeworfen wird CPU-Zeit zugunsten einer einfacheren Video-Timing-Synchronisation.

Darüber hinaus erzeugt der TIA nur halbautomatisch vertikale Sync-Timing-Signale (um das Ende jedes Videoframes und den Beginn des nächsten zu markieren). Der TIA ist in der Lage, ein vertikales Sync-Signal in das analoge Videoausgangssignal einzufügen, hat jedoch keinen Frame-Zeilenzähler und kann daher nicht sagen, wann ein Frame enden sollte. Stattdessen bleibt es dem CPU-Programm überlassen, vertikale Sync-Signale auszulösen und die Zeilen in jedem Frame zu zählen, um zu bestimmen, wann ein vertikales Sync-Signal erzeugt werden sollte. Wie bei der RDY-Wait-Hardware wird das vertikale Sync-Signal dadurch ausgelöst, dass die CPU auf eine bestimmte TIA-Registeradresse schreibt. Wenn nie an diese Adresse geschrieben wurde und der TIA frei laufen durfte, würde er einen einzelnen unendlichen Frame aktiver Rasterlinien erzeugen, der normalerweise auf dem Fernseher als Rollbild angezeigt wird. Die meisten veröffentlichten Spiele für den Atari 2600 erzeugten entweder alle 262 oder alle 263 Zeilen eine vertikale Synchronisierung (aber nichts am TIA hindert ihn daran, Frames beliebiger Länge, kürzer oder länger, zu erzeugen, obwohl die resultierenden Videoanzeigen auf normalen Fernsehern vertikal rollen würden).

Diese und andere Details der TIA-Programmierung bedeuten, dass Programmierer ihre Programme sorgfältig planen müssen, um die genaue Anzahl von Zyklen zu durchlaufen, die für verschiedene bildschirmbezogene Ereignisse erforderlich sind. Wenn dies falsch ist, wird der Bildschirm nicht richtig gezeichnet. Der Teil eines Programms, der dies tut, wird als "Kernel" dieses Programms bezeichnet.

Angesichts dieser Komplexität neigten frühe Spiele, bei denen das System verwendet wurde, zu einem einfachen Layout und nutzten den TIA, um symmetrische Spielfelder mit Spielern an der Spitze zu erstellen. Dies war die ursprüngliche Absicht des Systems: die Handvoll Arcade-Spiele zu betreiben, die Atari bereits produziert hatte, wie Tank und Pong . In diesen Fällen wurden die Spielfelddaten typischerweise im 2 kB ROM- Speicher in der Spielkassette angelegt . Da jede Zeile 20 Bit Daten verbrauchte und es 192 Zeilen auf einem NTSC-Display gab, benötigte ein Display mit einem anderen Layout in jeder Zeile nur 480 Byte (192 x 20 / 8) der 4 kB der Cartridge, um eine einzelne Festplatte aufzunehmen. codierte Anzeige. In diesem Fall schob der Kernel einfach 20 Bits durch das ROM für jede Zeile vor, während der TIA den Bildschirm nach unten vorrückte, eine Aufgabe, die nur wenige Zyklen CPU-Zeit beanspruchte. Dies kann weiter reduziert werden, indem dieselben Daten für mehrere Zeilen verwendet werden, entweder vertikal verdoppelt oder die Liste nach oben hin und wieder zurück nach unten gelesen werden, wodurch eine vertikal gespiegelte Anzeige von nur 240 Byte entsteht.

Ein wichtiger Fortschritt war die Lizenzierung von Space Invaders für die Plattform, die viel mehr Spielergrafiken erforderte, um die feindlichen Außerirdischen zu zeichnen. Die Lösung bestand darin, die Spielerdaten für jede Linie zu ändern, während das Bild gezeichnet wurde, wodurch eine offensichtlich große Anzahl von Spielern erzeugt wurde. Ein weiterer Fortschritt wurde gemacht, indem die Anzeige (teilweise) als CPU-Befehle codiert wurde, anstatt sie als feste Daten im ROM zu speichern. Adventure verwendet dieses Konzept, um eine Vielzahl von Karten zu erstellen, indem verschiedene Teile der Daten im ROM kombiniert und während der Bildschirmzeichnung hin und her gesprungen wird. Dadurch konnte das Spiel über 30 Räume verfügen, die sonst 14 kB ROM benötigt hätten.

Als sich Programmierer an das seltsame Timing gewöhnten, das erforderlich war, damit die Dinge auf dem Bildschirm richtig funktionieren, begannen sie, die dem TIA innewohnende Flexibilität zu nutzen, um die Displays erheblich zu verbessern. Eine übliche Technik bestand darin, die Farbregister zu ändern, die verwendet wurden, um die Zustände 1 und 0 des Spielfelds zu zeichnen, was zu Anzeigen mit regenbogenähnlichen Effekten führte. Spätere Spiele könnten die Mittellinie des Spielfelds modifizieren, um asymmetrische Muster zu erzeugen, die Spieler-Sprites in der Mitte des Bildschirms neu positionieren und ändern, um zusätzliche Sprites zu erzeugen.

TIA-Farbfunktionen

Der TIA verwendet je nach verwendetem Fernsehsignalformat unterschiedliche Farbpaletten. Für das NTSC- Format (Teilenummer CO10444) wird eine 128-Farben-Palette bereitgestellt, während für PAL (Teilenummer CO11903) nur 104 Farben verfügbar sind . Außerdem besteht die SECAM- Palette nur aus 8 Farben.

NTSC-Palette

Leuchtdichte
Farbton
0 2 4 6 8 10 12 14
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
fünfzehn

PAL-Palette

Leuchtdichte
Farbton
0 2 4 6 8 10 12 14
0,1,14,15
2
3
4
5
6
7
8
9
10
11
12
13

SECAM-Palette

0 2 4 6 8 10 12 14

Rausch-/Tongenerator (AUD0/1)

Der TIA ist in der Lage, verschiedene Arten von Impuls- und Rauschausgaben an seine beiden Oszillatoren (oder Kanäle) AUD0 und AUD1 zu erzeugen. Jeder Oszillator verfügt über einen 5-Bit-Frequenzteiler und ein 4-Bit-Audiosteuerregister, das die Wellenform manipuliert. Es gibt auch ein 4-Bit-Lautstärkeregelregister pro Kanal.

Frequenzteiler (AUDF0/1)

Frequenzen werden erzeugt, indem 30 kHz genommen und durch den gelieferten 5-Bit-Wert geteilt wird. Das Ergebnis ist ein billiger Frequenzteiler, der verstimmte Töne und ungerade abgestimmte Frequenzen verarbeiten kann. Der TIA ist kein Musikchip, es sei denn, der Komponist arbeitet innerhalb der Frequenzgrenzen oder moduliert zwischen zwei verstimmten Frequenzen, um eine vibratogestimmte Note zu erzeugen.

Audiosteuerung (AUDC0/1)

Das Audio Control Register erzeugt und manipuliert eine Pulswelle, um komplexe Pulse oder Rauschen zu erzeugen. Die folgende Tabelle (mit entworfenen Duplikaten) erklärt, wie seine Töne erzeugt werden:

VERHEXEN D7 D6 D5 D4 D3 D2 D1 D0 Geräuschart oder Teilung
0   0 0 0 0 Auf 1 setzen (nur Lautstärke)
1 0 0 0 1 4-Bit-Poly
2 0 0 1 0 ÷ 15 → 4-Bit-Poly
3 0 0 1 1 5-Bit-Poly → 4-Bit-Poly
4 0 1 0 0 ÷ 2
5 0 1 0 1 ÷ 2
6 0 1 1 0 ÷ 31
7 0 1 1 1 5-Bit-Poly → ÷ 2
8 1 0 0 0 9-Bit-Poly (weißes Rauschen)
9 1 0 0 1 5-Bit-Poly
EIN 1 0 1 0 ÷ 31
B 1 0 1 1 Setze die letzten 4 Bits auf 1
C 1 1 0 0 ÷ 6
D 1 1 0 1 ÷ 6
E 1 1 1 0 ÷ 93
F 1 1 1 1 5-Bit-Poly ÷ 6

Verweise

Quellen

Externe Links