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:
- 40x25 Zeichenschirm
- Erweiterter Farbmodus
- Multicolormodus
- 320x200 Hochauflösende Grafik
- 160x200 Multicolor Grafik
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:
- 00 Hintergrundfarbe
- 01 Dasselbe wie "Aus" im Hires-Modus
- 10 Dasselbe wie "An" im Hires-Modus
- 11 Eine andere Hintergrundfarbe
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 |
|
|