TED 7360

TED (TExt Display) war der Name für Commodores neuesten und letzten All-in-one Sound, Video und I/O-Chip. Dieser DIL-48 IC war speziell für die Rechner der 264er Reihe entworfen worden. Im Unterschied zur CIA oder ACIA kann man diesen Chip nicht ohne weiteres in anderen Systemen einsetzen.

Der TED enthält all die Funktionen, die von Commodore vorher auf mehrere Chips verteilt worden sind. Er ist ein komplettes Video-Interface mit Composite-Signalgenerator, 2-Kanal Sounderzeuger, Tasteneingabeverwaltung, Timer, Takterzeuger, Speichermanager und DRAM-Refreshschaltkreis auf einem Chip. Er kann den gesamten Speicher der 264er adressieren und erzeugt die RAS, CAS und MUX - Signale für den Speicher. Für das ROM erzeugt er je nach Registereinstellung die CS (chip select) - Signale. Das macht ihn gleichzeitig zu einer einfachen MMU.

Dummerweise hat der Chip eine recht hohe Ausfallrate, und die einzige Quelle für Ersatz ist ein anderer Rechner der 264-Reihe. Das Problem ist in den meisten Fällen auf die hohe Abwärme des Chips zurückzuführen, als vorbeugende Maßnahme sind zusätzliche Kühlkörper auf dem Chip zu empfehlen.

Bildschirmmodi

Die Hauptaufgabe des Chips liegt jedoch in der Grafikerzeugung. Die Grafikmöglichkeiten des TED sind ähnlich denen des VIC-II im C64. Er besitzt die folgenden Anzeigemodi:

Natürlich gibt es auch Unterschiede. Der TED unterstützt keine Sprites.

Um dies auszugleichen kann der Chip 8 unterschiedliche Leuchtstärken für jede der 16 verfügbaren Farben darstellen. Dies ergibt 121 darstellbare Farben (Schwarz ist in allen Leuchtstärken schwarz). Andere Besonderheiten sind ein Hardwarecursor, Hardwaretextblinken und -zeicheninversion. Zeichentabellen, Bildschirm, Farbspeicher und Bitplanes können ohne zusätzliche Logikschaltkreise wie im C64 direkt adressiert werden. Tatsächlich reicht zur RAM/ROM-Wahl die Änderung eines einzigen Bits.

Beschreibung der Bildschirmmodi

Zeichenmodi benötigen $800 Bytes Speicher für den Bildschirm und den Farbspeicher. Letzterer wird mit den ersten $400 Bytes realisiert (beim C64 liegt dieser immer an Adresse $d800), wobei pro Byte die ersten 4 Bits wie beim C64 die Farbcodes enthalten. Die Bits 4-6 enthalten die Helligkeit und das höchste Bit ist das Blink-bit. Die anderen $400 Bytes enthalten die eigentlichen Zeichencodes. Bei aktivierter Zeicheninversion enthalten die unteren 7 Bit den Zeichencode und das oberste wählt ide Inversion. Bei deaktivierter Zeicheninversion enthalten alle 8 Bits den Zeichencode. Der Erweiterte Farbmodus und der Multicolormodus funktionieren genau wie beim C64. Bei beiden Modi werden Inversion und Blinken ausgeschaltet.

Im Hires-Grafikmodus wird es etwas komplexer. Hier benutzt die Bitplane $2000 Bytes und wird genau wie eine VIC-II Bitplane benutzt. Die Farben werden allerdings anders verwaltet. $800 Bytes werden für den Farbspeicher benötigt, welcher in $400 Intensitäts- und $400 Farbcodebytes unterteilt ist. Ein "Aus"-Bit in der Bitplane benutzt das unterste Nibble der entsprechenden Farbspeicherstelle als Farbe und nimmt sich die Intensität von den Bits 4-6 der entsprechenden Intensitätsspeicherstelle. Bei einem "An"-Bit wird das obere Nibble der Farbspeicherstelle und die Bits 0-2 der Intensitätsspeicherstelle benutzt. Die Bits 3 und 7 im Intensitätsspeicher sind unbenutzt.

Im Multicolormodus gibt es weitere Unterschiede. Der VIC-II des C64 erlaubte die Verwendung von 3 unterschiedlichen Farben und einer allgemeinen Hintergrundfarbe pro 8x8 Pixelblock. Der TED kann das aufgrund des nicht ausreichenden Farbspeichers nicht. Also gibt es nur 2 unterschiedliche Farben pro Block und 2 generell gewählte Farben. Da immer 2 Bits Pro Pixel verwendet werden (deshalb die halbierte Horizontalauflösung von 160 x 200 Pixeln) sieht die Bitaufteilung pro Pixel wie folgt aus:

Weitere Besonderheiten

Genau wie im VIC-II gibt es auch Rasterzeileninterrupts. Leider ist die Zeile 0 nicht die Obergrenze des Rahmens sondern die Obergrenze des sichtbaren Bereichs. Außerdem kann man die aktuelle Rasterzeile aus einem TED-Register auslesen und ändern, was sich meist direkt auf die Anzeige auswirkt. Als Bonus kann die Horizontale Rasterposition auf dieselbe weise gelesen und modifiziert werden.

Wie bereits erwähnt macht der TED mehr als nur Grafiken erzeugen. Eine seiner Aufgaben ist es, das Taktsignal für den 7501/ 8501 Mikroprozessor zu erzeugen. Dieser Takt ist nicht konstant, er wechselt zwischen 885 kHz und dem doppelten, 1,773 Mhz. Er erzeugt die niedrige Taktrate bei DRAM Zugriffen und Bildschirmaufbau, ansonsten wird die hohe Taktrate erzeugt. Die Erzeugung der hohen Taktrate kann per Register abgeschaltet werden. Das Endresultat ist ein Computer, der mit ca. 1 Mhz läuft, da die CPU während dem Bildschirmaufbau mit dem langsamen Takt und während dem Anzeigen des Rahmens mit dem schnellen Takt läuft.

Da der Chip auch über I/O-Funktionen verfügte, wurde auch eine spezielle Floppy, die 1551 entwickelt. Diese erfuhr über den proprietären TED-Parallelport eine starke Leistungssteigerung gegenüber der 1541. Auch die Tastaturabfrage wird vom TED erledigt.

Soweit es den Sound betrifft, kann es der TED nicht annähernd mit dem SID des C64 aufnehmen. Gerade einmal 2 Rechteckwellenformgeneratoren stehen zur Verfügung, wobei der Zweite außerdem weißes rauschen erzeugen kann. Jeder Generator kann Frequenzen von 100 Hz bis 23 Khz erzeugen. Die Lautstärke kann in 8 Schritten eingestellt werden. Um Samples abzuspielen, können die Soundkanäle auf einen festen Ausgabewert eingestellt werden, die Digital/Analogwandelung wird dann mit dem Lautstärkeregler erledigt. Die Samplegenauigkeit beträgt 3 Bit (8 Werte).

Bei den Timern im TED handelt es sich um nichts weiter als 16 Bit Herabzähler. Sie werden immer mit der langsamen Taktrate betrieben. Der erste Timer lädt seinen Startwert wieder wenn er 0 erriecht, die anderen 2 laufen einfach so weiter.

Der TED wird oft angegriffen, aber Tatsache ist, dass er eine der besseren Entwicklungen von Commodore darstellt. Die Grafik ist sehr gut für einen Rechner der frühen 80er, und wenn Sprites vorhanden gewesen und der Sound besser gewesen wären, hätte er den C64-Besitzern zu denken gegeben.

Darstellungsmodi

Dies sind nur die "offiziellen" Auflösungen, es gibt noch mehr Möglichkeiten.

Art Auflösung Farben
Text 40 x 25 1 aus 121
Grafik 160 x 200 4 aus 121 pro 4 x 8-Pixel Block
Grafik 320 x 200 2 aus 121 pro 8 x 8-Pixel Block
Register 0 / $0: Zähler 1
76543210 RW Zähler 1 (High Byte). Zählt immer vom zuletzt hineingeschriebenen Wert herunter.
Register 1 / $1: Zähler 1
76543210 RW Zähler 1 (Low Byte)
Register 2 / $2: Zähler 2
76543210 RW Zähler 2 (High Byte). Zählt von $ffff abwärts
Register 3 / $3: Zähler 2
76543210 RW Zähler 2 (Low Byte)
Register 4 / $4: Zähler 3
76543210 RW Zähler 3 (High Byte). Zählt von $ffff abwärts
Register 5 / $5: Zähler 3
76543210 RW Zähler 3 (Low Byte)
Register 6 / $6:
7....... RW Internes TED Testregister
.6...... RW Extended Color Mode: 0 = Aus, 1 = An
..5..... RW Grafikmodus: 0 = Aus, 1 = An
...4.... RW Bildschirmanzeige: 0 = Aus, 1 = An
....3... RW Textzeilenanzahl: 0 = 24 Zeilen, 1 = 25 Zeilen
.....210 RW Y-Scrollposition: 0 - 7
Register 7 / $7:
7....... RW Inversmodus. Wenn gesetzt werden die Zeichencodes ab 128 aus den ersten 128 generiert und revers dargestellt, ansonsten wird normal verfahren: 0 = Revers aus, 1 = Revers an
.6...... RW PAL/NTSC Schalter: 0 = PAL, 1 = NTSC
..5..... RW TED Stop. Hält die Counter und die Bildausgabe an: 0 = Aus, 1 = An
...4.... RW Multicolormodus: 0 = Aus, 1 = An
....3... RW Textspaltenanzahl: 0 = 38 Spalten, 1 = 40 Spalten
.....210 RW X-Scrollposition: 0 - 7
Register 8 / $8: Keyboard input latch
76543210 RW Nach einem Schreibzugriff kann hier der Status der Keyboardleitungen abgefragt werden
Register 9 / $9: Interruptstatusregister
7....... RW Interrupt-Flag: 0 = Kein Interrupt, 1 = Interrupt ist erfolgt
.6...... RW Zähler 3 0 = ist nicht erfolgt, 1 = ist erfolgt
..5..... RW Ungenutzt
...4.... RW Zähler 2 0 = ist nicht erfolgt, 1 = ist erfolgt
....3... RW Zähler 1 0 = ist nicht erfolgt, 1 = ist erfolgt
.....2.. RW Lichtgriffel-Interrupt: (Nicht implementiert) 0 = ist nicht erfolgt, 1 = ist erfolgt
......1. RW Rasterzeileninterrupt: 0 = ist nicht erfolgt, 1 = ist erfolgt
.......0 RW Ungenutzt
Register 10 / $a: Interrupt Maskenregister
7....... RW Ungenutzt
.6...... RW Interrupt von Zähler 3 erlaubt: 0 = Nein, 1 = Ja
..5..... RW Ungenutzt
...4.... RW Interrupt von Zähler 2 erlaubt: 0 = Nein, 1 = Ja
....3... RW Interrupt von Zähler 1 erlaubt: 0 = Nein, 1 = Ja
.....2.. RW Lichtgriffel-Interrupt erlaubt: (Nicht implementiert) 0 = Nein, 1 = Ja
......1. RW Rasterzeileninterrupt erlaubt: 0 = Nein, 1 = Ja
.......0 RW 9. Bit von Register 11
Register 11 / $b:
76543210 RW Rasterzeile für Rasterzeileninterupt, siehe Register 10
Register 12 / $c: Position des Hardware-Cursors
765432.. RW Ungenutzt
......10 RW Speicherposition des Hardware-Cursors (10 Bits, High Byte)
Register 13 / $d: Position des Hardware-Cursors
76543210 RW Speicherposition des Hardware-Cursors (10 Bits, Low Byte)
Register 14 / $e: Frequenz der ersten Stimme
76543210 RW Untere 8 Bit des Frequenzwertes der ersten Stimme
Register 15 / $f: Frequenz der zweiten Stimme
76543210 RW Untere 8 Bit des Frequenzwertes der zweiten Stimme
Register 16 / $10:
765432.. RW Ungenutzt
......10 RW Obere 2 Bit des Frequenzwertes der ersten Stimme
Register 17 / $11: Soundkontrollregister
7....... RW D/A Modus
.6...... RW Stimme #2 Rauschen: 0 = Aus, 1 = An
..5..... RW Stimme #2 Rechteckwelle: 0 = Aus, 1 = An
...4.... RW Stimme #1: 0 = Aus, 1 = An
....3210 RW Lautstärke: 0 - 8
Register 18 / $12:
76...... RW Ungenutzt
..543... RW Bestimmen die Position der Bitplane im Speicher in 8 KByte Schritten ab Adresse 0
.....2.. RW Characterset im RAM oder ROM: 0 = RAM, 1 = ROM
......10 RW Obere 2 Bit des Frequenzwertes der zweiten Stimme
Register 19 / $13:
765432.. RW Ort des Charactergenerators. Kann in 1 KByte Schritten ab Adresse 0 verschoben werden
......1. RW Langsamen Taktmodus erzwingen: 0 = Taktwechsel 0,885 Mhz/1,773 Mhz , 1 = nur langsamer 0,885 Mhz Takt
.......0 RW Merker, ob der Bereich über $8000 ROM oder RAM ist. Nur Lesbar: 0 = RAM, 1 = ROM
Register 20 / $14: Ort des Video-RAMs
76543... RW Ort des Video-RAMs. Kann in 2 KByte Schritten ab Adresse 0 verschoben werden
.....210 RW Ungenutzt
Register 21 / $15: Hintergrundfarbe
7....... RW Ungenutzt
.654.... RW Helligkeit: 0 - 7
....3210 RW Farbe: 0 - 15
Register 22 / $16: Farbe 1
7....... RW Ungenutzt
.654.... RW Helligkeit: 0 - 7
....3210 RW Farbe: 0 - 15
Register 23 / $17: Farbe 2
7....... RW Ungenutzt
.654.... RW Helligkeit: 0 - 7
....3210 RW Farbe: 0 - 15
Register 24 / $18: Farbe 3
7....... RW Ungenutzt
.654.... RW Helligkeit: 0 - 7
....3210 RW Farbe: 0 - 15
Register 25 / $19: Rahmenfarbe
7....... RW Ungenutzt
.654.... RW Helligkeit: 0 - 7
....3210 RW Farbe: 0 - 15
Register 26 / $1a:
765432.. RW Ungenutzt
......10 RW Obere 2 Bit von Register 27
Register 27 / $1b:
76543210 RW Aktuelle Characterposition. Zählt die gerade ausgegebene Zeichenposition mit.
Register 28 / $1c:
7654321. RW Ungenutzt
.......0 RW Oberstes Bit der aktuellen vertikalen Scanposition
Register 29 / $1d:
76543210 RW Untere 8 Bit der aktuellen vertikalen Scanposition. Kann sowohl gelesen als auch geschrieben werden!
Register 30 / $1e:
7654321. RW Aktuelle horizontale Scanposition. Kann sowohl gelesen als auch geschrieben werden!
Register 31 / $1f:
7....... RW Ungenutzt
.6543... RW Blinkzähler
.....210 RW Aktuelle horizontale Scanposition innerhalb eines Zeichens. Kann sowohl gelesen als auch geschrieben werden!
Register 32 / $20:
76543210 RW Schaltet das ROM ab Adresse $8000 ein
Register 33 / $21:
76543210 RW Schaltet das ROM ab Adresse $8000 ab