Die Textseiten des Buchs in vorformatiertem ASCII, zum Teil auch schon in echter HTML-Darstellung.
Lieber Leser,
gleich zu Anfang dieser Einleitung möchten wir uns bei Ihnen bedanken, daß Sie dieses Kapitel überhaupt lesen. Hoffentlich blättern Sie nicht jetzt gleich um. Dies wäre kurzsichtig gehandelt, wie die Autoren aus eigener Erfahrung berichten können.
Sicherlich haben Sie wie wir nach dem Kauf Ihres Atari, sofern Sie einen besitzen, zuerst das Gerät ausprobiert, bevor Sie die Bedienungsanleitung gelesen haben. Bei genauerem Studium der mitgelieferten Dokumentation werden Sie dann sicherlich auch festgestellt haben, daß die interessantesten Angaben fehlen.
Dies ist in der Computerbranche leider üblich. Zudem gibt es über das Atari-System eine Reihe von Einzelpublikationen, die jeweils nur ein Spezialgebiet ohne Betrachtung anderer und oft auch unvollständig oder gar falsch erfassen. Bitte denken Sie nicht, daß wir für unser Buch Vollständigkeit oder gar Fehlerfreiheit beanspruchen; wir versuchen lediglich, ein Buch zu schreiben, das möglichst umfassend die Atari - Hardware und das Betriebssystem erläutert und allein schon dadurch die vielfältigen Möglichkeiten des Atari aufzeigt. Zudem werden wir an Stellen, die uns problematisch erscheinen, Beispiele einfügen.
Dieses Buch ist also besonders für den gedacht, der das Prinzip des Computers und das Basic bereits ausreichend beherrscht, vielleicht auch schon weiß, was hexadezimale Zahlen sind. Im nächsten Kapitel erklären wir auch noch kurz den Umgang mit dem uns normalerweise leider fremden Zahlensystem.
Wenn man ein Buch über Computer schreibt oder auch einfach nur über sie spricht, so stellt sich immer die Frage nach der Wortwahl. Da in der gesamten Informatik Englisch Fachsprache ist, sind praktisch alle Fachausdrücke ebenfalls Englisch. Man muß sich also darüber klar werden, welche Ausdrücke man eindeutscht und für welche man den englischen Ausdruck beibehält.
Bereits in der Branche akzeptierte Fachausdrücke sollte man unbehandelt lassen, allerdings nur, sofern es nicht bereits einen ebenso akzeptierten deutschen Ausdruck dafür gibt. Dies sichert nach einiger Eingewöhnungszeit leichtere Verständigung mit anderen. Bei der Übersetzung oder beim "Eindeutschen" sollte man darauf achten, wenigstens "richtiges" Deutsch zu benutzen. Wer von "editieren" redet, weiß nicht, daß die Übersetzung schon in Form von "edieren" vorhanden ist. Ungläubige mögen den Duden zu Rate ziehen.
Weiter ist unbedingt zu beachten, daß keine sogenannten "Sekretärinnenübersetzungen" entstehen. Zum Beispiel ist es unsinnig und sogar falsch, den Ausdruck "Symbol table" in "Zeichentisch" zu übersetzen, richtig wäre "Symboltabelle". Allgemein sollte man immer versuchen, ein gesundes Mittelmaß zu finden. So ist es unsinnig, den Fachausdruck "Editor" korrekt in "Textbearbeiter" zu übersetzen. Wer jedoch bei Leitungen von "Lines" spricht, täuscht im allgemeinen Fachwissen vor und sollte weiter nur versuchen, Gäste von Stehparties zu beeindrucken und sich nicht wundern, wenn ihn wirkliche Fachleute belächeln.
Vielleicht kann man aber auch durch eine günstig gewählte Übersetzung das englischsprachige Original an Klarheit übertreffen. Wir werden zum Beispiel statt des in Deutschland durchaus üblichen Ausdrucks "Display-List" den Begriff "ANTIC-Programm" verwenden.
Ein weiteres Problem ergibt sich bei der Verwendung der Artikel bei englisch belassenen Ausdrücken. Soll man den Artikel übersetzen? Wir glauben, daß es dafür keine allgemeingültige Regel gibt. Allerdings hat sich für die meisten Wörter eine Form besonders durch den Univeritätsbetrieb eingebürgert. Wir versuchen, diese, soweit sie uns bekannt ist, zu verwenden.
In der Öffentlichkeit hat Ataris Ruf leider etwas gelitten. Dies liegt vor allem daran, daß Atari eine Zeitlang durch konsequentes Nichteinhalten jeglicher Liefertermine glänzte. Durch die in dieser Zeit sehr hohen Verkaufszahlen der Konkurrenz, im Speziellen Commodore C-64, erhielten die Atari-Geräte den Ruf, auch technisch grundsätzlich schlechter zu sein.
Wir meinen dagegen, mit der Ansicht, beide Geräte auf eine Stufe zu stellen, der Wahrheit wesentlich näher zu kommen. Natürlich könnte man anführen, daß der C-64 eine wesentlich einfachere Sprite-Verarbeitung hat, das heißt, daß sich sehr leicht bewegliche Spielfiguren darstellen und verarbeiten lassen. Für den versierten Atari-Programmierer bieten sich dagegen mit der Player-Missile-Grafik zwar nicht so leicht zu programmierende, aber wesentlich effektvollere Bildaufbauten. Mit entsprechenden Tricks lassen sich auch erheblich mehr Objekte, als "in der Grundausstattung" vorhanden, darstellen.
Den größten Leistungsvorsprung findet man beim Atari im ANTIC-Baustein. Dieser Baustein stellt einen zweiten Prozessor dar, der auch über einen eigenen Maschinencode verfügt. Die einzelnen Befehle des ANTIC erzeugen bei ihrer Ausführung jeweils Teile des Gesamtbildes. Dabei ist es möglich, verschiedene Grafikbetriebsarten, sogenannte Grafikmodes, auf einem Bild frei zu kombinieren. Zum Beispiel kann man diverse Textdarstellungen mit unterschiedlich hoch auflösenden Blockgrafikmodes auf einem Bild kombinieren. Dieses Konzept findet man auch bei erheblich teureren Systemen nur sehr selten.
Die Tonerzeugung auf den vier grundsätzlich unabhängigen Tonkanälen ist ebenfalls sehr sauber entwickelt. Sie kann sich nach unserer Meinung mit allen anderen auf dem Homecomputermarkt befindlichen Systemen messen.
Das Basic ist aufgrund seiner eingeschränkten Größe in der Verarbeitung von Strings (Zeichenketten) unglücklich und gewöhnungsbedürftig, liefert aber gerade für den Einsteiger vielfältige Möglichkeiten durch zahlreiche schnelle Grafikund Tonbefehle. Es ist grundsätzlich leider nicht üblich, mit dem bereits eingebauten Basic die Hardware so leicht und effizient auszunutzen, wie es erfreulicherweise bei Atari der Fall ist. Gerade für den Anfänger ist es angenehm, wenn er häufig benötigte Befehle nicht erst in teuer zu erstehenden oder illegal (schwarz) zu kopierenden Erweiterungen findet.
Dieses Buch soll sowohl "durchlesbares" Lehrbuch als auch Nachschlagewerk sein. Wir haben daher sowohl ein Register der verwendeten LABELS, als auch ein INHALTSREGISTER im Buch aufgenommen. Dabei haben wir beide alphabetisch geordnet. Das Labelregister verweist auf die hexadezimalen Adressen, die das jeweilige Label repräsentiert. Das Kapitel über das Betriebssystem ist grundsätzlich nach Adressen geordnet. Das Inhaltsregister verweist dagegen auf Seitenzahlen.
Hexadezimale Zahlenwerte werden wir immer durch ein vorangestelltes "$"-Zeichen kennzeichnen. Binäre Werte erhalten an Stellen, die Unklarheiten mit sich bringen können, ein vorangestelltes "%"-Zeichen.
Die Atari-Mikrocomputer sind vom Konzept her eindeutig als Hobbygeräte entworfen. Ihre Hard- und Softwareeigenschaften bieten verschiedene Anwendungen besonders an. So eignen sich die Atari-Geräte durch ihre Ton- und Bilddeigenschaften besonders zum Videospielcomputer. Natürlich sind sie ebenso zum Erlernen von BASIC geeignet. Aber schon das BASIC ist mehr auf spielerische Anwendungen, als auf kommerzielle, ausgelegt. Genauso ist es möglich, mit Zusätzen auch andere Programmiersprachen, wie zum Beispiel Assembler oder auch PILOT, PASCAL, C oder ACTION!, kennenzulernen. Auch für eine Sprache wie Forth eignet sich der Atari hervorragend. Eine weitere Anwendung wäre die Verwendung des Atari als Lerncomputer für den Schulstoff (zum Beispiel für Vokabeln). Sicher kann man den Atari auch im Haushalt verwenden. So ließe sich beispielsweise eine Budgetüberwachung realisieren oder eine Schallplattenkartei aufbauen. Auch kürzere Briefe ließen sich durch den Atari leicht und effizient erstellen.
Jedoch erreicht der Atari hier seine Grenze. Größere Datenmengen lassen sich mit ihm nur sehr schwer bewältigen, da seine Diskettenlaufwerke nicht groß und schnell genug sind. Auch ist es mühsam, ihn als Textsystem zu gebrauchen, da sein Bildschirm nicht über die, für die meisten Zwecke benötigten, 80 Zeichen pro Zeile verfügt. Für kommerzielle Anwendungen sind die Atari-Geräte also nur sehr bedingt geeignet. Auch für "diskettenorientierte" Programmiersprachen, wie PASCAL, FORTRAN oder insbesondere COBOL, ist der Atari in der praktischen Arbeit nicht unbedingt geeignet.
Um den Atari in seinen Einzelheiten zu verstehen, sollte man sich sein Konzept, seine prinzipielle Struktur vor Augen führen. Erst wenn man diese "durchschaut" hat, ist es sinnvoll auf die Einzelheiten der hochintegrierten Peripheriebausteine (POKEY, ANTIC, GTIA und PIA) und des Betriebssystems einzugehen.
Bei den Atari-Geräten handelt es sich um Mikrocomputer, die mit dem weit verbreiteten Mikroprozessor "6502" ausgerüstet sind.
Sicherlich kann man sich angesichts der auf dem Markt befindlichen Prozessoren fragen, ob dieser Prozessor überhaupt noch zeitgemäß ist. Gerade die 16-Bit bzw. 32-Bit-Prozessoren sind erheblich leistungsfähiger. Auch gibt es in diesen Prozessorfamilien Bausteine, die über einen nur 8 Bit breiten Datenbus verfügen, die also kaum eine komplexere Hardware benötigen, als der 6502. Zur Zeit, als die ersten Atari-Mikrocomputer entwickelt wurden, gab es diese Prozessoren allerdings noch nicht in den benötigten Stückzahlen auf dem Markt. Auch sind sie noch heute wesentlich teurer als der 6502.
Andere zu dieser Zeit verfügbare 8-Bit-Prozessoren, wie zum Beispiel der Z80, der 8080/8085, der 6800/6802 oder auch der 6809, haben entweder keinen entscheidenden Leistungsvorsprung gegenüber dem 6502 oder sind selbst relativ teuer (oder waren zum Zeitpunkt der Entwicklung der ersten AtariGeräte relativ teuer). Man sollte aber ehrlich anmerken, daß bei der Auswahl auch ganz andere Gesichtspunkte eine Rolle spielen. So kommt es bei derartigen "Großprojekten" (in der Stückzahl) auch auf das Vertrauen, und besonders die Verbindungen zum Lieferanten an. Auch müssen die personellen Möglichkeiten für eine Entwicklung vorhanden sein oder entsprechende Entwickler angeworben werden. Sicher spielen besondere Vorlieben der maßgeblichen Leute für einen bestimmten Prozessor auch noch eine Rolle.
Bei der Entwicklung der 600XL- und 800XL-Geräte wählte Atari wiederum einen 6502-Prozessor. Es wurde eine weiterentwickelte Version der bekannten CPU mit der Bezeichnung 6502C, die aber vollständig softwarekompatibel ist, verwendet. Dies geschah wohl vor allem mit Blick auf eine größtmögliche Kompatibilität zu den alten Modellen. So konnte man viele Programme und Programmteile direkt übernehmen.
Der 6502 hat außerdem den Vorteil, daß sein Systemtakt aus zwei gleichlangen Phasen besteht. Der Prozessor greift jeweils nur während der zweiten Phase auf die Peripherie bzw. auf den Speicher zu. Die Zugriffe erfolgen also immer an den gleichen "Stellen" des Systemtaktes. Dieses Konzept vereinfacht die Hardware anderer Bausteine im System, die ohne Umweg über die CPU direkt auf den Speicher zugreifen sollen und dazu die CPU stoppen müssen. In diesem Detail unterscheidet sich der 6502 wesentlich von anderen Mikroprozessoren wie zum Beispiel vom Z80, 8080 oder auch 8085.
Der 6502-Prozessor wird im Atari mit 1,77 MHz betrieben. Diese Frequenz liegt erheblich über der bei 6502-Rechnern dieser Preisklasse üblichen Arbeitsfrequenz.
Die normale Eingabe erfolgt über eine Tastatur. Die Belegung entspricht im wesentlichen der in Amerika üblichen Form (QWERTY). Einige Sonderzeichen sind beim Atari jedoch an anderer Stelle zu finden als bei anderen Computern. Die Umlaute oder andere, für andere Sprachen nötige Sonderzeichen oder Sonderformen von Buchstaben, sind beim Atari nicht ohne weiteres über die Tastatur verfügbar. Dies ist bei Computern in dieser Preisklasse aber leider üblich zu nennen. Der Atari 400 war mit einer Folientastatur ausgestattet. Das größere Modell, der Atari 800, besaß dagegen eine Tastatur mit "normalen" Tasten (ähnlich Schreibmaschinentasten). Die neuen Atari-Geräte, also der Atari 600XL und der Atari 800XL, verfügen grundsätzlich über "normale" Tasten. Die Tastaturbelegungen der Geräte unterscheiden sich nur in sehr kleinen Details, es gibt also nicht, wie bei anderen Herstellern, für jeden neuen Computer auch eine neue Tastaturbelegung. Zusätzlich zum Haupttastenfeld gibt es noch rechts auf dem Gerät die Zusatztasten "SELECT", "OPTION" und "START".
Zur Abfrage der Tastatur wurde keiner der üblichen Tastaturabfragebausteine verwendet. Statt dessen übernimmt ein Baustein im Atari (der sogennannte POKEY), der ansonsten noch für die serielle Schnittstelle und für die Tonerzeugung zuständig ist, die Abfrage der Tastatur. Das Ergebnis, das heißt, welche Taste gedrückt ist, stellt er in einem Register zur Verfügung. Die Tastatur, die wie bei anderen Systemen als Matrix aufgebaut ist, wird also nicht, wie bei anderen Hobbycomputersystemen, von der CPU zeilenweise abgefragt. Dies spart Rechenzeit der CPU. Der POKEY ist in der Lage, in dem Moment, in dem eine Taste gedrückt wird, einen Interrupt bei der CPU auszulösen (den IRQ). Es ist damit möglich, die Tastatur per Interrupt zu betreiben.
Die Zusatztasten ("SELECT", "OPTION" und "START"), die sogenannten Konsolentaster, werden über einen weiteren hochintegrierten Baustein im Atari (den GTIA) abgefragt.
Die Standardausgabe des Atari erfolgt auf einen Bildschirm. Als Bildschirm eignet sich praktisch jeder Fernseher. Ein Modulator ist in die Atari-Geräte eingebaut, es wird also nur der normale Antennen- und kein Videoeingang beim Fernseher benötigt. Zur Darstellung steht auf einem Farbfernseher eine Palette von 128 Farben zur Verfügung. Dabei wird vom Betriebssystem eine Auflösung von bis zu 320 x 192 Punkten oder 24 Zeilen mit je 40 Zeichen unterstützt. Die höchste Auflösung liegt bei 384 Punkten horizontal und etwa 210 Punkten vertikal (je nach Bildschirm).
Die gesamte Bilderstellung wird von einem Baustein, der nur von Atari verwendet wird, übernommen. Dieser Baustein wird als "ANTIC" bezeichnet. ANTIC steht wohl für "Alphanumeric Television Interface Controller". Der ANTIC ist ein zweiter Mikroprozessor, der über einen eigenen Befehlssatz verfügt. Durch das Programm des ANTICs, das man an beliebiger Stelle im Speicherraum ablegen kann, wird das darzustellende Bild definiert. Der ANTIC verfügt über 14 verschiedene Modi zur Bilddarstellung. Diese Modi lassen sich beliebig auf dem Bildschirm kombinieren. Es stehen sowohl Modi zur Schriftdarstellung (auch mit Unterlängen) und Modi zur allgemeinen Zeichendarstellung (zum Beispiel für Spielfiguren) als auch zahlreiche Betriebsarten zur Einzelpunktdarstellung mit unterschiedlich hohen Auflösungen zur Verfügung.
Die Breite des Bildes läßt sich auf drei verschiedene Werte einstellen. Je nach Einstellung ergeben sich maximale horizontale Auflösungen von 256, 320 oder 384 Bildpunkten pro Zeile. In der Bildumrandung erscheint eine (programmierbare) Farbe.
Der ANTIC liest alle Daten, die er zur Bilddarstellung benötigt, direkt ohne Umweg über die CPU aus dem Speicher. Diese Art des Zugriffs bezeichnet man als DMA (Direct Memory Access - direkten Speicherzugriff). Während eines Zugriffes des ANTICs auf den Speicher im DMA wird die CPU angehalten. Dadurch vermindert sich die effektive Arbeitsgeschwindigkeit der CPU. In den meisten Modi ist der Befehlsdurchsatz der CPU jedoch trotzdem höher als bei 6502-Systemen mit einem Systemtakt von einem Megahertz.
Der ANTIC erstellt nicht selbst die Farbinformationen im Videosignal, das über den Modulator auf dem Fernseher dargestellt wird. Der ANTIC überträgt die Bildinformationen, die er per DMA aus dem Speicher gelesen hat, zu einem weiteren Atari-Baustein. Dieser Baustein wird "GTIA" genannt. GTIA steht wohl für "Graphic Television Interface Adaptor". Der GTIA enthält unter anderem neun Farbregister, mit denen der Benutzer die Farben, die auf dem Bildschirm erscheinen sollen, aus einer Palette von 128 Farben auswählen kann. Der GTIA erhält vom ANTIC jeweils Informationen, welche Farbe, das heißt, die Farbe welchen Farbregisters, er abbilden soll. Durch dieses Konzept ergibt sich eine Farbpalette, die sonst meist nur von professionellen CAD-Systemen erreicht wird und sich kaum mit der anderer Mikrocomputer vergleichen läßt.
Besonders interessant dürfte auch sein, daß die Hardware des ANTICs die Verschiebung des Bildes um einzelne Punkte sowohl horizontal als auch vertikal unterstützt. Der Bildspeicher kann ohne "Tricks" an beliebiger Stelle im Speicherraum liegen. Der Zeichengenerator kann sich prinzipiell auch an jeder Stelle des Speichers befinden, muß allerdings, je nach ANTIC-Modus (je nachdem ob er 512 oder 1024 Bytes groß ist), an einer 512-Byte oder 1 KByte-Grenze des Speichers beginnen.
Mit diesem Gesamtkonzept der Bildschirmdarstellung ist der Atari leistungsfähiger als die meisten anderen Systeme dieser Klasse. Gerade für seine Zielgruppe, das heißt für Anwender im Spiel-, Hobby- und Heimbereich, dürften diese Leistungsmerkmale besonders interessant sein. Vor allem das Konzept eines zweiten Mikroprozessors im System, das Konzept des ANTICs, ermöglicht eine auf andere Art nicht zu erreichende Vielfalt von unterschiedlichen Arten der Bildschirmdarstellung. Auch bringt das Prinzip eines relativ hohen Systemtakts (1,77 MHz), bei dem der Befehlsdurchsatz der CPU durch Speicherzugriffe per DMA des ANTICs verringert wird, eine relativ hohe Verarbeitungsgeschwindigkeit. Zudem kann man während der Bearbeitung rechenintensiver Routinen einen ANTIC-Darstellungsmodus wählen, der nur wenige Zugriffe im DMA benötigt, oder kann sogar den Bildschirm abschalten. Dadurch erhöht sich der Befehlsdurchsatz der CPU erheblich.
Der Atari besitzt außerdem sehr vielfältige Möglichkeiten einer Tonausgabe. Diese wird von dem Baustein übernommen, der außerdem für die Abfrage der Tastatur zuständig ist, dem "POKEY". POKEY steht wohl für "POtentiometer and KEYboard Integrated Circuit". Der Pokey verfügt über vier Tongeneratoren, die sowohl unabhängig voneinander, als auch miteinander verbunden arbeiten können. Außerdem sind für jeden Kanal vielfältige Möglichkeiten zur Verzerrung usw. vorhanden. Auch sogenannte Höhenfilter lassen sich programmieren. Mit dem POKEY kann man, entsprechende Programme vorausgesetzt, die Klangvielfalt eines Synthesizers erreichen. Es ließe sich zum Beispiel auch eine SynthesizerTastatur an den Atari anschließen. Der Ton des POKEYs wird über den Modulator zum Fernseher übertragen. Zur Tonausgabe wird also der normale Fernseherlautsprecher verwendet. Es ist zudem möglich, über einen Eingang des Atari, ein externes Tonsignal in das Signal des POKEYs zu mischen.
Als großer Vorteil muß die Tatsache angesehen werden, daß es möglich ist, aus dem BASIC heraus Töne zu erzeugen, ohne, wie es bei Konkurrenzmodellen nötig ist, den "POKE"-Befehl zu benutzen. Die direkte Programmierung der Tonkanäle aus Assemblerprogrammen ist etwas komplizierter als bei vergleichbaren Geräten. Dafür sind die Möglichkeiten der Tonerzeugung, die der Atari bietet, aber den Möglichkeiten der Tonerzeugung bei Konkurrenzmodellen mindestens ebenbürtig. Unterstützt wird die Tonerzeugung zudem durch mehrere automatische Zähler, die in dem Moment, in dem sie bei Null angelangt sind, einen Interrupt der CPU auslösen. In der Interruptroutine kann man dann die Frequenz oder Lautstärke oder auch andere Parameter der Tonerzeugung verändern.
Die neuen Atari-Geräte (600XL/800XL) entsprechen in den meisten Details den alten Modellen (400/800). So sind alle Adressen der Hardware gleich geblieben. Basicprogramme lassen sich meist direkt austauschen oder müssen nur geringfügig modifiziert werden.
Bei den alten Atari-Modellen sind 4 Joystick-Ports vorhanden. An jeden der Joystick-Ports lassen sich, an Stelle eines Joysticks, auch zwei Paddles ("Drehregler") oder ein sogenannter Lightpen anschließen. Wenn man einen Lightpen auf eine Stelle des Bildschirms hält, ist es möglich, die Position des Lightpens zu bestimmen. Dies wird durch den ANTIC ermöglicht. Die Abfrage der "Joystick-Richtungen" erfolgt über einen weiteren Baustein im Atari, die "PIA". Pia steht für "Peripheral Interface Adaptor". Die "Feuertasten
der Joysticks werden über die sogenannten Triggereingänge des GTIA abgefragt. Der analoge Wert der Stellung der Drehregler (Paddles) wird im POKEY in einen digitalen Wert umgewandelt.
Bei den neuen Geräten sind nur noch zwei Anschlüsse für Joysticks vorhanden. Dies stellt nur einen geringfügigen Nachteil dar, da es für die alten Geräte nur wenige Spiele und Anwendungen gab, die alle vier Joystickports belegten, und außerdem die Werte der Joystickports 3 und 4 simuliert werden. Die so frei gewordenen Anschlüsse der PIA wurden zum Teil intern im Atari für die sogenannte MMU (Memory Management Unit) verwendet.
Im Gegensatz zu den alten Geräten, hat Atari den Speicherraum des Prozessors bei den 600XL und 800XL-Modellen zum Teil doppelt belegt. So läßt sich zum Beispiel beim Atari 800XL (oder bei einem Atari 600XL der auf 64 KByte RAM nachgerüstet wurde) das Betriebssystem abschalten. An Stelle des Betriebssystems steht dann RAM zur Verfügung. So ist es zum Beispiel möglich, das Betriebssystem der Atari 400 und 800-Modelle in die neuen Geräte zu laden. Außerdem verfügen die neuen Modelle über ein Selbsttestprogramm (im ROM), das in den normalen Arbeitsspeicherbereich eingeblendet wird, wenn beim Einschalten des Atari die "OPTION"-Taste gedrückt ist und kein Cartridge eingesteckt ist. Mit diesem Selbsttestprogramm ist es möglich den RAM-Speicher, die Tonerzeugung, die Tastatur und den Bildschirm zu testen.
Die verschiedenen Speicherbelegungen wählt man mit mehreren Portleitungen der PIA, die bei den alten Geräten für den dritten und vierten Joystickport verwendet wurden. Die sogenannte MMU gibt, je nach Einstellung und "Situation", Freigaben an die einzelnen Hardwarekomponenten des Atari. Bei der MMU handelt es sich um einen Logikbaustein, einen sogenannten PAL-Baustein (PAL steht hier für "Programmable Array Logic" und nicht für das Fernseherfarbsystem), der speziell für Atari programmiert ist. In seiner Funktion ist dieser PAL-Baustein mit gewöhnlichen TTL-Bausteinen vergleichbar.
Um andere Programme ohne Ladezeiten der Diskette oder Cassette verwenden zu können, verfügt der Atari über einen Cartridge-Slot. In diesen Cartridge-Slot lassen sich Module einstecken, die bis zu 16 KByte im Speicher belegen können. Diese Module bieten eine höhere Datensicherheit als Cassetten oder Disketten, unter anderem durch eine grundsätzlich kaum begrenzte Lebensdauer. Wenn ein Cartridge in den Slot gesteckt ist, wird der vom Speicher im Cartridge überdeckte RAM-Speicher (in zwei 8 KByte-Blöcken) abgeschaltet. Außerdem startet das Betriebssystem automatisch das im Cartridge enthaltene Programm. Zudem ist im Cartridge-Slot noch eine Freigabe-Leitung für einen 256 Byte-Block (eine Page) im Bereich der anderen I/O-Bausteine vorhanden. Damit ist es möglich, im Cartridge verschiedene ROM-Bereiche umzuschalten. Man kann also auch ROMs mit mehr als 16 KByte verwenden. Selbstverständlich könnte man mit Hilfe dieser Freigabe-Leitung auch eine Karte mit einem Peripheriebaustein im Slot betreiben. Dies ist aber bei den Atari 400 und 800Modellen umständlich, da für den Betrieb die Klappe über dem Slot geschlossen sein muß. Bei den neuen Geräten hat Atari auf die Klappe wohl aus Kostengründen verzichtet. Dabei hat sich aber die Bildqualität geringfügig verschlechtert (da die Abschirmung nicht mehr so gut ist). Dieser Effekt ist aber von Gerät zu Gerät unterschiedlich. Es kommt vor allem auch darauf an, welche anderen Geräte in der Nähe des Computers arbeiten.
Ursprünglich enthielten die Atari-Computer nur das Betriebssystem. Das BASIC, das es als Cartridge gab, mußte extra erworben werden. Atari ging offenbar davon aus, daß nicht jeder das BASIC haben wollte. Später gehörte ein BASICCartridge zum Lieferumfang dazu. Jeder, der einen AtariComputer (400 oder 800) kaufte, bekam einen BASIC-Cartridge.
Die neuen Atari-Computer (600XL/800XL) enthalten das BASIC bereits fest eingebaut. Es ist vollkommen kompatibel zu den Cartridge-Versionen des BASICs. Die Programme lassen sich also direkt austauschen, sofern nicht einige Betriebssystemroutinen, bestimmte Betriebssystemadressen oder bestimmte "Zero-Page-Adressen" verwendet worden sind. Auch ist es möglich, mit Hilfe der MMU das BASIC abzuschalten. Wenn ein Cartridge in den Slot gesteckt wird, wird das eingebaute BASIC abgeschaltet, sofern der Cartridge den gleichen Speicherraum wie das BASIC belegt. So ist es möglich, sowohl andere Programmiersprachen, als auch Erweiterungen des BASICs als Cartridge zu verwenden.
Diskettenlaufwerke, Drucker, der Cassettenrecorder sowie andere Peripheriegeräte werden an eine serielle Schnittstelle angeschlossen. Dieser Übertragungskanal wird vom POKEY bedient. Mit ihr sind Übertragungsraten bis zu 19200 Baud (in diesem Zusammenhang = Bit/Sekunde) möglich. Die Wandlung der parallen Daten in serielle und umgekehrt wird von der POKEY-Hardware übernommen. So ergeben sich höhere Übertragungsraten als bei vergleichbaren Systemen, die diese parallel/seriell-Wandlung von der CPU vornehmen lassen. Der POKEY kann einen Interrupt an die CPU senden, wenn entweder alle Bits des Ausgaberegisters übertragen sind oder das Eingaberegister voll ist. Durch diese Möglichkeit des POKEY ist es möglich, die Datenübertragung zu erledigen, gleichzeitig die CPU aber andere Aufgaben erfüllen zu lassen. Die serielle Schnittstelle entspricht leider keinem üblichen Standard. Prinzipiell ließe sie sich auch als "normale" V24-Schnitstelle programmieren. Dann wäre aber zum Beispiel ein Diskettenbetrieb nicht quasi-gleichzeitig möglich. Auch der Steckverbinder der seriellen Schnittstelle entspricht leider keiner üblichen amerikanischen oder europäischen Norm. Dadurch ist es für Zweitanbieter schwierig, die serielle Schnitstelle in eigenen Produkten zu verwenden.
Bei den alten Modellen war der Systembus nicht extra herausgeführt. Alle Änderungen und Erweiterungen mußten im Gerät vorgenommen werden. Bei den neuen Geräten ist ein "Parallelbus" mit einem 50-poligen Anschluß vorhanden. Ein Platinensteckverbinder mit einem Kontaktabstand von 2,54 mm (1/10") läßt sich ohne weiteres aufstecken. Am Parallelbus sind alle Daten- und Adressleitungen, viele Steuersignale, sowie Signale zum Anschluß von sogenanneten dynamischen RAMs herausgeführt.
Damit ist es ohne weiteres möglich, den Atari 600XL oder 800XL zu erweitern. Beispiele wären RAM-Erweiterungen, Z80Erweiterungen um CP/M zu verwenden, direkt angeschlossene Diskettenlaufwerke, 80-Zeichen-Karten, diverse Schnittstellen, Steuerungen oder Überwachungsschaltungen. Die Reihe ließe sich fast beliebig fortsetzen.
Die Atari 400 und 800-Geräte verfügten in mehreren Bausteinen über 10 KByte ROM. Darin befand sich im wesentlichen das Betriebssystem und ein Zeichengenerator. Bei den neuen Geräten setzte Atari ein modernes 16 KByte-ROM ein. Der so hinzugekommene ROM-Speicherraum wurde unter anderem für die Selbsttestroutine, einen zweiten Zeichengenerator und ein erweitertes Betriebssytem verwendet.
Atari hat schon bei den alten Geräten ein "fast" echtes Betriebssystem verwendet. Im Gegensatz zu vielen anderen sogenannten Betriebssystemen besteht das Atari-Betriebssystem nicht nur aus elementaren Betriebsroutinen, sondern verfügt über leistungsfähige Betriebssystemroutinen, die universell verwendet werden können. Zum Beispiel wird der Verkehr mit Peripheriegeräten durch eine universelle Prozedur erledigt. Das aufrufende Programm muß der I/O-Routine die Ziel- bzw. Quellenangaben und alle anderen Parameter in einem sogenannten I/O-Controlblock übergeben. Dieses Konzept findet man sonst erst bei diskettenorientierten Betriebssystemen wie CP/M, MSDOS, UNIX oder QNX. Bei den Betriebssystemen der anderen Hobbycomputer, ist gewöhnlich für jedes Ein- bzw. Ausgabegerät (Bildschirm, Tastatur, Diskette, Cassette, Drucker usw.) eine eigene Routine vorhanden. Jede dieser Routinen erwartet die Daten meist in einem anderen Format. Wenn man nun ein Programm schreiben möchte, das die Ausgaben entweder in einer Diskettendatei oder auf einem Drucker bringt, stellen sich bei derartigen Betriebssystemen meist nicht ganz unerhebliche Probleme.
Die Ein- und Ausgabe des Atari ist grundsätzlich, von ihrer Hardware her, interruptfähig. Dies wird vom Betriebssystem voll unterstützt. In eigenen Maschinenprogrammen ist es also ohne weiteres möglich, zu drucken oder Ein- und Ausgaben der Diskettenlaufwerke auszuführen, während der Prozessor ansonsten noch oder bereits mit einer anderen Aufgabe beschäftigt ist. Diese Möglichkeiten des Betriebssytems werden vom BASIC jedoch nicht ausgenutzt, da dies bei einem BASIC auf einem Einplatzsystem ohne Multitask-Option ohnehin kaum sinnvoll ist. Es ließe sich aber zum Beispiel ein Textsystem programmieren, bei dem der Benutzer praktisch ohne Rücksicht auf Diskettenschreib- oder -leseoperationen oder Such- und Austauschfunktionen des Textsystems, dauermäßig Eingaben machen kann. Der Datenverkehr mit den Disketten wird über das Betriebssystem im Interrupt vorgenommen. Um keine Tastatureingaben verlorengehen zu lassen, müßte der POKEY immer, wenn eine Taste gedrückt wird, einen Interrupt auslösen. In der Unterbrechungsroutine würden alle Tastatureingaben in einen Tastaturpuffer geladen. Der "Vordergrundjob" (die Tätigkeit der CPU, die von den Interrupts unterbrochen wird, das eigentliche Textverarbeitungsprogramm) holt sich die Eingaben bei Bedarf aus dem Tastaturpuffer. Nach diesem "Muster" lassen sich noch viele andere Programme entwerfen.
Der normale Betrieb des Atari wird alle 1/50 Sekunde unterbrochen. Während der Vertikalsynchronisation des Bildschirms wird ein Interrupt ausgelöst. In der dazugehörigen Interruptroutine werden mehrere Aufgaben erfüllt. So werden mehrere Speicherzellen erhöht oder erniedrigt, diese Speicherstellen stellen dadurch Softwarezähler dar, mit denen es möglich ist, den Zeitablauf der Programme (insbesondere bei Spielen wichtig !) zu steuern. Mehrere Register lassen sich, entsprechend umgerechnet, als Uhr verwenden. Eine weitere Hauptaufgabe dieser "Vertikal-Interrupt-Routine" ist es, sogenannte Schattenregister zur Verfügung zu stellen. Da viele Hardwareregister nur schreibend oder nur lesend sind, werden vom Betriebssystem Schattenregister im RAM erzeugt. Die Werte der Schattenregister bzw. der Hardwareregister werden so 50 mal pro Sekunde aktualisiert. Die Schattenregister kann man im Gegensatz zu den meisten Hardwareregistern auch zum Beispiel durch "Increment"- und "Decrement"-Befehle modifizieren. Allerdings muß man dabei immer beachten, daß die Inhalte der Schattenregister nicht unbedingt aktuell sind.
Das Betriebssystem der Atari-Geräte ist grundsätzlich sehr sauber programmiert. Die berühmte "Hauptsache: funktioniert"-Mentalität, die man bei vielen anderen Geräten dieser Preisklasse vorfindet, wird man bei Atari, von sehr wenigen Ausnahmen abgesehen, vergeblich suchen. Das Atari-Betriebssystem verfügt über relativ wenige, dafür aber universelle Unterprogramme. Alle wichtigen Routinen werden, auch im Betriebssystem intern, über eine sogenannte Vektortabelle angesprungen. In dieser Vektortabelle stehen die Startadressen der einzelnen Routinen. Durch dieses Konzept ist es relativ einfach, das Betriebssystem sowohl aus Maschinenprogrammen heraus zu benutzen, als auch es zu verändern.
Bei den neuen Geräten ist das Betriebssystem teilweise verändert und verbessert worden. So stehen beim neuen Betriebssystem einige neue Routinen zur Verfügung. Die Vektortabelle ist prinzipiell nicht verändert worden, es sind lediglich einige Vektoren angefügt worden. Auch mußte natürlich die veränderte Hardware (zum Beispiel die MMU und das eingebaute BASIC) im Betriebssystem berücksichtigt werden. Dies hat zur Folge, daß sehr viele Routinen im neuen Betriebssystem an anderer Stelle geringfügig modifiziert vorgefunden werden. Auch viele Speicherstellen im RAM, die vom Betriebssystem als Zwischenspeicher benutzt werden, liegen jetzt an anderen Stellen. Dies hat zur Folge, daß nicht mehr alle alten Programme auf den neuen Geräten laufen. Programme, die aber Betriebssystemroutinen nur über die Vektortabelle anspringen und sich auch ansonsten an die "Betriebssystemspezifikationen" halten, werden meist ohne Problem laufen. Programme, die "Tricks" anwenden, laufen dagegen oft nur nach einer, von Fall zu Fall unterschiedlich schwierigen Anpassung auf den neuen Geräten.
*** ATARI INTERN Inhaltsregister *** D A S I N H A L T S R E G I S T E R -------------------------------------- $ Bildzeilenbefehl 8 91 % Bit 8 14 6502 Block 28 237 ANTIC Booten 39 236 . Busstecker 65 71 ANTIC-Befehlssatz Byte 87 20 ANTIC-Programm CAS 87 61 . CHARBASE 94 102 ANTIC-Programmzähler CHARCNTL 88 105 AUDIOCOM COLPFn 162 131 Adresse CPU 25 28 Analog/digital . 166 64 Anschlußpläne CTIA 64 131 Asynchrone Übertragung Cartridge 169 43 Ausgaberoutine . 263 70 BASIC Color-Clock 44 76 Befehlstabellen Cursorsteuerung 92 301 Betriebssystem DLPTRH/L 47 88 . DMA 191 40 Betriebssystemroutinen DMA-Kontrolle 214 76 Bildaufbauprinzip DMA-Kontroller 118 193 Bildbreite DMACNTL 40 76 . Digitalrechner 76 11 Bilddatendarstellung Diskettenverarbeitung 129 212 Bilddatenquellen Druckerverwaltung 75 314 Bilderstellung Ein-/Ausgabe 39 202 Bildgrafikmodus Eingabe 95 38 Bildgrafiktabelle Einleitung 100 5 Bildschirm Erweiterung 39 45 Bildschirmsteuerung Farben 301 40 Bildspeicher . 40 130 Bildspeicherzähler Farbregister 89 129 Bildverschiebung . 112 138 381 *** ATARI INTERN Inhaltsregister *** Farbtakt Kbit 76 29 Feinverscheibung Keyboard 116 38 Formatierung Kollisionen 244 144 Frequenz Konsolentaster 154 150 Frequenzbereich LPENH/V 155 81 GTIA Leerzeilenbefehl 40 90 . Lesen 66 26 . Lightpen 125 42 GTIA-Betriebsarten . 132 59 GTIACNTL . 143 81 Geräusch Link/Unlink 155 272 Geschoßgrafikregister Listen lineare 139 272 Geschoßgröße Low 141 32 Grafikregister MMU 138 43 Grobverschiebung . 113 54 HATABS . 269 69 HSCROL MPD 116 61 Halbbilder Matrix 76 23 Handlertabelle Messen 269 33 Hardware Meßinstrumente 52 33 Hardwareprinzip NMI 21 79 Hardwarespeicherplan NTSC/PAL 360 151 Hauptausgaberoutine Netzteil 263 52 Hexadezimal Oktal 16 20 High Outputleitungen 32 30 Horizontalverschiebung Overscan 121 76 Hüllkurve PAL 155 43 I/O PIA 30 42 IOCB . 203 68 IOCB-Befehle . 204 183 IOCB-Status PMCNTL 207 137 Informationstheorie POKEY 23 38 Inputleitungen . 30 67 Interlaced Scan . 76 153 Interrupt Paddle 47 42 . . 199 59 Joystick Paddlesteuerung 42 166 Joystickport Pixel 59 101 . Player-Missile-Grafik 70 82 KByte Port A 29 185 Kaltstart Port B 227 185 382 *** ATARI INTERN Inhaltsregister *** Positionsregister Sprungvektorentabelle 139 258 Pragmatik Standardausgabe 23 39 Projektion Startbit 101 171 RAM Stopbit 21 171 . Synchrone Übertragung 52 169 RAS Syntax 61 23 ROM Systembus 21 45 . TTL-Standard 57 31 Reset Taktgenerator 55 53 . Tastatur 199 38 . Tastaturabfrage 228 154 SIO-Steuerung Timer 286 200 SIZEM Tonerzeugung 142 41 SIZEPn . 141 154 SKSTAT Track 176 237 Schattenregister Triggereingänge 128 149 . Unterlängen 199 106 Schieberegister VCOUNT 157 80 Schnittstelle (ser.) VDELAY 44 140 Schreiben VSCROL 26 117 Schriftgrafik Verschieben (Bild) 101 112 Schriftgrafik, Übers. Vertical-Blank-Int. 111 219 Schwingung Vertikalverschiebung 155 117 Scrolling Verzerrung 112 158 Sedezimal WAITHSYNC 16 80 Sektor Wandlung (Hex - Dez) 237 15 Selbsttest Warmstart 43 226 Semantik Wortwahl 23 6 Serielle Schnittstelle Zahlensystem 44 11 . Zeichenausblendung 69 105 . Zeichendrehung 166 105 Serieller Bus Zeichengenerator 286 101 Sonderzeichen Zeichengrafik 8 101 Speicher Zeichengrafik (Übers.) 21 111 Speicheranordnung Zeicheninvertierung 23 105 Speicheraufteilung Zeichensatz 63 101 Speicherplan Zentraleinheit 321 28 Speicherplatz Zielgruppe des Atari 26 36 Spielergröße Zusammenstöße 141 144 Spielfeldbreite Überschreiben 78 27 Sprungbefehl Übertragungsraten 91 170 383
*** ATARI INTERN Labelregister *** D A S R E G I S T E R D E R L A B E L S ------------------------------------------------ ABUFPTR1 BITGET $001D $F75D ABUFPTR2 BITMASK $001E $006E ABUFPTR3 BITMASKE $001F $CA2F ACMISR BITPUT $02D7 $F73C ACMVAR BITROL $03ED $F732 ACTCHRNUM BLOAD $0063 $C637 ADD28E BLOCK1 $C87B $C5C9 ADD28EGET BOOT $C8C3 $C599 ADD28EPUT BOTTOMLIN $C8E0 $F55F ADD28EWRD BRKEVENT $C8A0 $C092 ADDRESS BUFENDPTR $0064 $0034 ADJUST BUFFERADR $ED2E $0015 ADJUSTTAB BUFFULL $EE11 $0038 AKTBUFLEN BUFSTR $006B $006C ATASCICHR CALLTAB $02FB $E48F ATRAKTMSK CALLVKT $004E $E900 ATTRACT CALLVKTC1 $004D $E894 AUDICNTL1 CARTCKSUM $D204 $03EB AUDICNTL2 CARTGO $D205 $C47F AUDICNTL3 CASBOOT $D206 $C67C AUDICNTL4 CASBUFLIM $D207 $028A AUDICOM CASBUFPTR $D208 $003D AUDIFREQ1 CASCLOSE $D200 $FDCF AUDIFREQ2 CASDATA $D201 $0400 AUDIFREQ3 CASENTER $D202 $EB9D AUDIFREQ4 CASEOF $D203 $003F BASMEMTOP CASFLAG $000E $030F BEEPCOUNT CASINIT $0040 $C6AE BEEPWAIT CASINITV $FDFC $0002 BEGINREAD CASMOTOFF $ED3D $FD05 BELL CASOPEN $F556 $FCE6 BITCLR CASPUTBYT $F74A $FDB4 BITCON CASRDBYTE $F723 $FD7A 373 *** ATARI INTERN Labelregister *** CASREADBL COLDSTART $FD8D $0244 CASSPEED COLINC $02EE $02F9 CASSTART COLPF0 $03EA $D016 CHAINLINK COLPF0@ $03FB $02C4 CHAINTMP COLPF1 $02EC $D017 CHAINTP1 COLPF1@ $0312 $02C5 CHAINTP1H COLPF2 $0313 $D018 CHARBASE COLPF2@ $D409 $02C6 CHARBASE@ COLPF3 $02F4 $D019 CHARCNTL COLPF3@ $D401 $02C7 CHARCNTL@ COLPM0 $02F3 $D012 CHARSTPTR COLPM0@ $026B $02C0 CHECKFF COLPM1 $CB64 $D013 CHECKNEWP COLPM1@ $C9EA $02C1 CHECKROM1 COLPM2 $FF6E $D014 CHECKROM2 COLPM2@ $FF8D $02C2 CHECKSR0 COLPM3 $C000 $D015 CHECKSUM COLPM3@ $008B $02C3 CHECKSUM2 COLREGSH $FFF8 $004F CHKSUMSND COMENT $003B $E695 CHKSUMTAB COMPUTE $FFD2 $ECC8 CIOCLOSE COMTAB $E57C $E72D CIOINIT CONSOL $E4C1 $D01F CIOJUMP CONVERT $E6F4 $F5AC CIOMAIN CPIRQQ $E4DF $FC1A CIONOTOPN CRETRY $E4DC $029C CIOREAD CRITICIO $E5B2 $0042 CIORETURN CURSCOL $E670 $0055 CIOSTATSP CURSOCTAB $E597 $F49A CIOWRITE CURSORBS $E61E $F450 CLEARLINE CURSORDWN $F7E2 $F3F3 CLEARSCRN CURSORHOM $F420 $F440 CLICKDISA CURSORINH $02DB $02F0 CLOCK CURSORLFT $0012 $F400 CMDAUX1 CURSORRIG $023C $F411 CMDAUX2 CURSORTAB $023D $F47A CMDCMD CURSORUP $023B $F3E6 CMDDEVIC CURSOSTAB $023A $F495 COLBAK@ CURSROW $02C8 $0054 COLCR DBDDEC $F997 $F565 COLDCARTC DCBINIT $C431 $E7BE 374 *** ATARI INTERN Labelregister *** DCBXINIT DSKFLAG $E833 $0240 DECBFP DSKLDADR $E6C8 $0242 DECBUFL DSKRDERR $E6BB $C64C DECTIMER DSKSECCNT $C263 $0241 DELCHAR DSKSECLEN $F4D5 $02D5 DELLINE DSKSTAT $F520 $0030 DELTIA DSKSTATUS $F918 $0303 DERRMSG DSKTIMOUT $C44B $0246 DEVICSRCH DSKTIMOUT $E712 $0306 DEVICSTAT DSKUNIT $02EA $0301 DEVS2PL3 EDITORVKT $E6FF $E400 DISKFORM EGETCH $0018 $F24A DISKINIT ENDPOINTR $C6B1 $0074 DISKINTERF EOUTCH $C6C1 $F2B0 DISKUTIL ERANGE $001A $F6BC DISPLYFLG ERRORFLAG $02FE $023F DISPLYMSK ESCAPE $02A0 $F3E0 DLIVKT ESCAPEFLG $0200 $02A2 DLPTR@ EXITVBL $0230 $C298 DLPTRH EXTEND $D403 $F7C2 DLPTRL FILEDAT $D402 $02FD DMACNTL FILEMNGMT $D400 $0043 DMACNTL@ FINESCRFL $022F $026E DMASAVE FINESCROL $02DD $026C DOBUFC FKDEF $F8B1 $FB11 DOSAKTIV FKTDEFPTR $0009 $0060 DOSCROLL FREI0 $F7F7 $CB73 DOSINITC FREI1 $C649 $EF65 DOSINITV FREI2 $000C $FCD6 DOSVKT GAPTYPE $000A $003E DOSVKTC GETBLOCK $C434 $C667 DRAWTO GETBYTEAC $F9AF $C7DD DRETRY GETCH $02BD $F180 DSKAUX1 GETCHECKS $030A $FFA4 DSKAUX2 GETLOWEST $030B $C9BD DSKBUFFER GETPLT $0304 $F18F DSKBUFPTR GETRAMHI $0032 $C4B7 DSKBYTCNT GOHANDLER $0308 $E6EA DSKCHKSUM GOMEMTEST $0031 $C3BD DSKCMD GRAFM $0302 $D011 DSKDEVICE GRAFP0 $0300 $D00D 375 *** ATARI INTERN Labelregister *** GRAFP1 INTVKT $D00E $FFFE GRAFP2 IOCB0 $D00F $0340 GRAFP3 IOCB1 $D010 $0350 GRAPHEMUL IOCB2 $0057 $0360 GTIACNTL IOCB3 $D01B $0370 GTIACNTL@ IOCB4 $026F $0380 HANDLERTB IOCB5 $E440 $0390 HATABS IOCB6 $031A $03A0 HELPFLAG IOCB7 $02DC $03B0 HIBYTELD IOCBAUX1Z $0288 $002A HILFSWORT IOCBAUX2Z $0000 $002B HITCLR IOCBAUX3Z $D01E $002C HIUSEDLOD IOCBAUX4Z $02CB $002D HNDLRLOAD IOCBBUFAZ $02E9 $0024 HOLD2 IOCBBUFLZ $029F $0028 HPOSM0 IOCBCHARZ $D004 $002F HPOSM1 IOCBCHIDZ $D005 $0020 HPOSM2 IOCBCMD $D006 $0017 HPOSM3 IOCBCMDZ $D007 $0022 HPOSP0 IOCBDSKNZ $D000 $0021 HPOSP1 IOCBNUMZ $D001 $002E HPOSP2 IOCBPUTBZ $D002 $0026 HPOSP3 IOCBSTATZ $D003 $0023 HSCROL IOPORTINI $D404 $C4E8 IANTEMP IOSOUNDEN $022D $0041 INATAC IRQEN $F76A $D20E INCBFP IRQEN@ $E6D1 $0010 INCLOAD IRQST@ $E816 $0011 INCRSB IRQSTAT $F60A $D20E INDSETVKT ISRODN $E912 $EAAD INIT ISRSIR $FCDB $EB2C INIT200 ISRXD $C459 $EAEC INIT31A JMPCASOFF $C34C $EF6B INITCARTC JMPF21E $C437 $F715 INITLOAD JMPF983 $E7DE $FCD8 INITPOTS JMPIRQVKT $C239 $C02C INITSOME JMPSIOINT $EF8E $E959 INSCHAR JMPTAB $F49F $E450 INSLINE JMPTIMER1 $F50C $C25D INTERCHAR JMPTIMER2 $CC00 $C260 INTTAB JOYSTICK0@ $ECA9 $0278 376 *** ATARI INTERN Labelregister *** JOYSTICK1@ LODZHIUSE $0279 $02CD JOYSTICK2@ LODZLOADA $027A $02D3 JOYSTICK3@ LOGGET $027B $F758 JSRIND LOGICMASK $F2AD $02B2 KBCODE LOWMEM $D209 $0080 KBCODE@ LPENH $02FC $D40C KBDISABLE LPENH@ $026D $0234 KBGETCHAR LPENV $F302 $D40d KBVKT LPENV@ $E420 $0235 KEYCLICK LPTVKT $F983 $E430 KEYDEF MASKTAB $FB51 $C0CF KEYDEFPTR MATHMUELL $0079 $D805 KEYDELAY MEMLO $02F1 $02E7 KEYREP MEMTOP $02DA $02E5 KEYRPDELY MINTLK $02D9 $03F9 KOLM0PF MLTTMP $D000 $0066 KOLM0PL MONSTATUS $D008 $004C KOLM1PF MONTEMP1 $D001 $0051 KOLM1PL NEUDEVC1 $D009 $C99F KOLM2PF NEUDEVC3 $D002 $C9A4 KOLM2PL NEUDEVC5 $D00A $C9A9 KOLM3PF NEUDEVC7 $D003 $C9AE KOLM3PL NEUDEVC9 $D00B $C9B3 KOLP0PF NEUDEVCB $D004 $C9B8 KOLP0PL NEUINIT $D00C $C91A KOLP1PF NEUINITC $D005 $E49B KOLP1PL NEUIODREQ $D00D $0248 KOLP2PF NEUIOINIV $D006 $0238 KOLP2PL NEUIOMASK $D00E $0249 KOLP3PF NEUIOPTR $D007 $028C KOLP3PL NEUIOREQ $D00F $C97C LCOUNT NEUPORT $0233 $D1FF LFTMARGIN NEUPORTERR $0052 $C9D8 LINEINSERT NEUPORTST $F78E $CA11 LINK NEUVECTOR $E898 $C8F2 LINKSOMETH NEUVRORHDN $E739 $0247 LOADER NEWADRLOD $C753 $028E LOADERTMP NEWCART $0036 $C4D7 LOADPTR NEWDEVICE $EB87 $EEBC LODADRESS NEWGRCOL $02D1 $02F6 LODGBYTEA NEWGRROW $02CF $02F5 377 *** ATARI INTERN Labelregister *** NEWLDTMP1 PORTB $024A $D301 NMIEN PORTBCNTL $D40E $D303 NMIENABLE POT0 $C00C $D200 NMIRES POT1 $D40F $D201 NMIST POT2 $D40F $D202 NMIVKT POT3 $FFFA $D203 NOCHKSUM POT4 $003C $D204 NTSCPAL@ POT5 $0062 $D205 NUMTXTLIN POT6 $02BF $D206 OFFCURSOR POT7 $F718 $D207 OLDGRADR POTGO $005E $D20b OLDGRCHR POTSTAT $005D $D208 OLDGRCOL POWUPBYT1 $005B $033D OLDGRROW POWUPBYT2 $005A $033E OPTIONJMP POWUPBYT3 $030E $033F OUTCH PREPLINK $F1A4 $CA37 OUTPLT PRINTBUF $F1CA $03C0 PADDLE0@ PRMODE $0270 $FF46 PADDLE1@ PRTBUFPTR $0271 $02DE PADDLE2@ PRTBUFSIZ $0272 $02DF PADDLE3@ PRWONA $0273 $EF6E PADDLE4@ PTIMOUT $0274 $0314 PADDLE5@ PTRIG0@ $0275 $027C PADDLE6@ PTRIG1@ $0276 $027D PADDLE7@ PTRIG2@ $0277 $027E PADTRIGS PTRIG3@ $C23C $027F PHACRS PTRIG4@ $F94C $0280 PHCLOSE PTRIG5@ $FF02 $0281 PHOPEN PTRIG6@ $FEC2 $0282 PHPUT PTRIG7@ $FF3F $0283 PHSTAT PUTADRESS $FEA3 $C748 PHWRITE PUTBYTE1 $FECB $EF26 PLACRS PUTCHAR $F957 $C7E3 PLOTCOLAC PUTLINE $0072 $C650 PLOTROWAC PUTMSC $0070 $F9A6 PMBASE RAMSIZE $D407 $02E4 PMCNTL RAMTOP $D01D $006A PNMI RAMTSTPTR $C018 $0004 POKTAB RANDOM $EDF9 $D20A PORTA READJOY0 $D300 $C20E PORTACNTL READJOY1 $D302 $C201 378 *** ATARI INTERN Labelregister *** READPOTS SIOTAB $C22B $E851 READTRIG0 SIZEM $C219 $D00C READTRIG1 SIZEP0 $C222 $D008 RECEIVE SIZEP1 $EAFD $D009 RECEIVEN SIZEP2 $EC40 $D00A RECEIVEND SIZEP3 $0039 $D00B RECLEN SKCNTL $0245 $D20F RESETCOLD SKCNTL@ $C2D6 $0232 RESETCOLD SKSTAT $C2B8 $D20F RESETVKT SKSTATRES $FFFC $D20A RESETWARM SPECHANDL $C29E $EEF9 RETURM SRTIMER $F20B $022B RIGMARGIN STACKSAVE $0053 $0318 ROMFLAG STANDCHAR $03FA $E000 ROWINC STARTSTOP $02F8 $02FF RTS STARTTST $E4C0 $03E9 RUNADRC STATUS $C7E0 $FDCC RUNADRLOD STIMER $02C9 $D209 RUNLOADED STRBEG $C7A3 $F90C SAVEADR SUBBFL $0068 $E6D8 SCREENVKT SUBEND $E410 $F6AE SCRNSTART SUBTEMP $0058 $029E SCROLFINE SUPERFLAG $F22E $03E8 SEARCHLNK SWAP $E85D $F962 SEND SWAPANSPR $EA88 $F21E SENDDIS SWAPFLAG $EC84 $007B SENDENABL SWITCHROM $EC17 $C90A SENDINIT SYSINIT $ECAF $C543 SERIN SYSTEMVBL $D20d $C0F0 SEROUT TABELLE $D20d $FE8D SETDCB TABELLEN $FF0F $FB04 SETTIM1V TABELLEN $EDE2 $CA65 SETTIMOUT TABMAP $EC9A $02A3 SETVBLVKT TABSIOINI $C280 $E7D4 SHFAMT TEMPLBT $006F $02A1 SHIFTLOCK TEMPROW $02BE $02B8 SINRDYIRQ TEMPSTAT $C030 $0319 SIO TESTCNTL $E971 $F93C SIOINIT TESTDATA $E95C $0007 SIOINTERF TESTROMEN $C941 $F223 SIOSYSBUF TEXTBUF $FE3F $0580 379 *** ATARI INTERN Labelregister *** TEXTCOL VBLKIVKT $0291 $0222 TEXTGRAD VBREAK $029A $0206 TEXTINDEX VBREAKKEY $0293 $0236 TEXTOLD VCOUNT $0296 $D40B TEXTROW VDELAY $0290 $D01C TEXTSTART VECTAB $0294 $C0D7 TIMCOUNT1 VIMMEDIRQ $0218 $0216 TIMCOUNT2 VINTERRUP $021A $0204 TIMCOUNT3 VKEYBOARD $021C $0208 TIMCOUNT4 VPRECEDE $021E $0202 TIMCOUNT5 VSCROL $0220 $D405 TIMEFLAG VSERCLOSE $0317 $020E TIMER1VKT VSERIELIN $0226 $020A TIMER2VKT VSERREADY $0228 $020C TIMER3SIG VTIMER1 $022A $0210 TIMER4SIG VTIMER2 $022C $0212 TIMER5SIG VTIMER4 $022E $0214 TIMOUTINT WAIT $EC11 $EA37 TMPRAMSIZ WAITHSYNC $0006 $D40A TRIG0 WAITRESET $0284 $CODF TRIG0 WARMFLAG $D010 $0008 TRIG1 WRITEMODE $0285 $0289 TRIG1 WSIOSB $D011 $FE7C TRIG2 X64KBFLAG $D012 $03F8 TRIG2 XMITEND $0286 $003A TRIG3 XORKEYMSK $0287 $02B6 TRIG3 ZCHAIN $D013 $004A UNLINK ZCHAINH $E915 $004B VBLKDVKT $0224 380
*** ATARI INTERN ANTIC *** D E R A N T I C ------------------ 1) ALLGEMEINES 2) DIE KONTROLL- UND LIGHTPENREGISTER 3) DER DMA FÜR DIE PLAYER-MISSILE-GRAFIK 4) DER BEFEHLSSATZ DES ANTIC UND DAS ANTIC-PROGRAMM 5) DIE BILDGRAFIK-MODI 6) DIE SCHRIFTGRAFIK-MODI 7) SCROLLING (VERSCHIEBEN DES BILDES) 73
*** ATARI INTERN ANTIC *** Der ANTIC ist kein Standard-IC, sondern ein Spezialbaustein. "ANTIC" steht dabei wohl für "Alphanumeric Television Inter- face Controller". Beim ANTIC handelt es sich um einen kun- denspezifisch hergestellten Mikroprozessor, der als Subpro- zessor für den Bildaufbau zuständig ist. Der ANTIC kann der CPU Arbeitszyklen "stehlen" (man spricht hier wirklich von "Cycle-Stealing"), das heißt, daß er die CPU immer dann anhält, wenn er Daten aus dem Arbeitsspeicher benötigt. Der ANTIC liest die Daten also im direkten Speicherzugriff, im DMA (Direct Memory Access). Der ANTIC kann die gesamten 64 KByte Arbeitsspeicher adressieren und muß nicht erst, wie andere Grafikbausteine in anderen Mikrocomputersystemen, durch Register auf bestimmte Speicherbereiche gelegt werden. Der ANTIC besitzt einen eigenen Befehlssatz, mit dem man ihn dazu bringen kann, einzelne oder auch gleich mehrere Bild- zeilen auf dem Bildschirm darzustellen. Durch den ANTIC ist es möglich, verschiedene Grafikmodi beliebig auf dem Bild- schirm zu kombinieren. Man kann also Schrift- und Grafikmodi gleichzeitig verwenden. Das ist bislang mit keinem anderen Mikrocomputer dieser Preisklasse mit der gleichen Flexibili- tät möglich. Der ANTIC ist aber nicht alleine für die Bildausgabe zustän- dig. Er erstellt nicht selbst das fertige Bildsignal mit den Farbinformationen, sondern überträgt die Informationen zur Bilderstellung, die er aufgrund von Befehlen aus seinem Programm (dem ANTIC-Programm) aus dem Arbeitsspeicher geholt hat, zu einem weiteren Baustein, dem GTIA. Der GTIA fügt zu den Bildinformationen, die der ANTIC ihm überträgt, die Farbinformationen hinzu. Außerdem ist der GTIA für die sogenannte Player-Missile- Grafik, das heißt für die Darstellung beweglicher Objekte auf dem Bildschirm, zuständig. Der ANTIC kann den GTIA bei der Erstellung der Player-Missile-Grafik unterstützen, indem er dem GTIA in jeder Bildzeile die Daten zur Erstellung der Player-Missile-Grafik aus dem Arbeitsspeicher holt und in GTIA-Register überträgt. 74
*** ATARI INTERN ANTIC *** Für viele der Register des ANTICs sind sogenannte Schatten- register vorhanden. Während des Vertikal-Leertaktes des Bildes werden die Register- und Schattenregisterinhalte aufeinander abgestimmt. Weitere Ausführungen dazu befinden sich in den Kapiteln über den GTIA und das Betriebssystem. Das folgende Schaubild soll die Herkunft und Verarbeitung der Bilddaten verdeutlichen:
75
*** ATARI INTERN ANTIC *** Der ANTIC erstellt 50 Halbbilder pro Sekunde. Die Halbbilder sind aber nicht wie beim normalen Fernsehbild gegeneinander verschoben. Auf diese Art erhält man ein ruhiger stehendes Bild. Man spricht hier auch vom "non interlaced Scan". Jedes dieser Halbbilder besteht aus 310 Bildzeilen. Jede Bildzeile besteht wiederum aus 228 sogenannten Farbtakten (engl. "Color-Clocks"). Ein solcher Farbtakt hat ungefähr die Breite von zwei Bildzeilen-Höhen. In einer Sekunde gibt es also ca. 3,5 Mio. Farbtakte (50 * 310 * 228). Die CPU arbei- tet mit einer Taktfrequenz von etwa 1,77 MHz. Diese Frequenz wurde gewählt, damit auf einen Maschinentakt genau zwei Farbtakte kommen. Im Grafikmodus mit der höchsten Auflösung kann man einzelne kleine Felder, sogenannte "PIXEL", mit einer horizontalen Auflösung von einem halben Farbtakt und einer vertikalen Auflösung von einer Bilzeile ansprechen. Da Fernseher normalerweise nicht den wirklichen Bildrand zeigen, erzeugt das Betriebssystem nach der Vertikal- Synchronisation 24 Leerzeilen bevor es mit dem eigentlichen Bild beginnt. Dadurch wird sichergestellt, daß auch das ganze Bild auf dem Bildschirm sichtbar ist. Sollte der Bildrand trotzdem nicht auf den Bildschirm gelangen, so ist der sogenannte "Overscan" des Bildschirms oder Fernsehers zu groß. Die Größe des eigentlichen Bildfeldes auf dem Bildschirm läßt sich vertikal durch die Anzahl und Art der ANTIC- Befehle im ANTIC-Programm bestimmen. Die Breite des eigentlichen Bildfeldes läßt sich auf drei verschiedene Werte bringen. Ein enges Bild hat 128 Farb- takte, das normale Bild (das auch vom Betriebssystem er- stellt wird) hat 160 Farbtakte und das breite Bild hat 192 Farbtakte. Somit ergeben sich maximale horizontale Auflösun- gen von 256, 320 und 384 Pixeln (Bildpunkten). Das Betriebssystem erstellt grundsätzlich ein ANTIC- Programm, das 24 Leerzeilen am oberen Bildrand und 192 eigentliche Bildzeilen hat. Man sollte grundsätzlich nie 76
*** ATARI INTERN ANTIC *** mehr Zeilen als das Betriebssystem abbilden. Wenn man ver- sucht, mehr als 24 Leer- und 192 Bildzeilen auf den Bild- schirm zu bringen, ist es möglich, daß das Bild anfängt zu rollen. ******************************************** * * * * * DIE KONTROLL- UND LIGHTPENREGISTER * * ---------------------------------- * * * ******************************************** Das Register (bzw. das Schattenregister) DMACNTL 54272 $d400 DMACNTL@ 559 $22f kontrolliert den direkten Speicherzugriff des ANTIC. Dabei haben die einzelnen Bits des Registers folgende Funktionen: Bit 0-1 : Größe des Bildschirms Bit 2 : Wenn dieses Bit auf "1" steht, ist der DMA für die Geschosse eingeschaltet. Bit 3 : Wenn dieses Bit auf "1" steht, ist der DMA für die Spieler eingeschaltet. Bit 4 : Wenn dieses Bit auf "1" steht, ist einzeilige Auflösung für Spieler und Geschosse gewählt, ist das Bit dagegen "0", werden Spieler und Geschosse zweizeilig aufgelöst dargestellt. 77
*** ATARI INTERN ANTIC *** Bit 5 : Wenn dieses Bit auf "1" steht, ist der DMA für das Lesen des ANTIC-Programms eingeschal- tet. Steht das Bit auf "0", erscheint kein Bild auf dem Monitor. Bit 6-7 : unbenutzt Die Bits 0 und 1 des Registers wählen die Breite des Bildfeldes auf folgende Art: Bit1 Bit0 Funktion 0 0 Es werden keine DMA-Zyklen für das Bild ausgeführt, es gibt also kein Bild (Spielfeld). 0 1 Enges Spielfeld Das Bild hat jetzt 128 Farbtakte. 1 0 Normales Spielfeld Das Bild hat jetzt 160 Farbtakte. Diese Einstellung benutzt das Betriebssystem grundsätzlich. 1 1 Breites Spielfeld Das Bild hat jetzt 192 Farbtakte. Der Standardwert (der sogenannte "default value") dieses Registers ist $22 bzw. 34. Oft ist es nötig, die "normale" Tätigkeit der CPU zu unter- brechen, da bestimmte Aufgaben zum Beispiel nur während der Vertikal-Synchronisation erledigt werden können oder sollen, oder es müssen bestimmte Anfragen von Peripheriegeräten sofort beantwortet werden. Dafür gibt es bei der CPU 6502, die auch im Atari verwendet wurde, grundsätzlich zwei ver- schiedene Interrupts (Unterbrechungen). Der maskierbare Interrupt (IRQ : Interrupt ReQuest, Unterbrechung auf An- 78
*** ATARI INTERN ANTIC *** frage) wird vom POKEY und gegebenenfalls von der PIA be- nutzt. Der nicht von der CPU intern maskierbare (abschalt- bare) Interrupt (NMI : Non Maskable Interrupt) wird vom ANTIC verwaltet. Bei den alten 400/800er Modellen löste auch die "RESET"-Taste über den ANTIC einen NMI aus, bei den neuen Modellen ist diese Methode unbrauchbar geworden, weil zum Beispiel nach dem Einstecken eines (anderen) ROM-Moduls unbedingt ein Hardware-Reset erfolgen muß, wenn dabei das System abgestürzt ist. Bei den alten Geräten wurde beim Modulwechsel automatisch der Computer abgeschaltet. Im ANTIC gibt es das Register NMIEN 54286 $d40e mit dem es möglich ist, die sogenannten ANTIC-Programm- Unterbrechungen und den Vertikalsynchron-Interrupt (in dem das Betriebssystem zum Beispiel die Schattenregister er- zeugt) bereits im ANTIC zu unterbinden. Eine Unterbindung (Maskierung) des NMI bei (hier nicht vorgesehenem) Signal an der "RNMI"-Leitung ist mit NMIEN nicht möglich. Die Bits von NMIEN haben folgende Funktionen: Bit 0-5 : nicht benutzt Bit 6 : Wenn dieses Bit gesetzt ist, ist der Vertikalsynchron-Interrupt eingeschaltet Bit 7 : Wenn dieses Bit gesetzt ist, sind ANTIC- Programm-Unterbrechungen möglich. Vom Betriebssystem wird der Wert $40 bzw. 64 in NMIEN einge- tragen. Wenn der NMI-Eingang der CPU auf "0" geht, unter- bricht sie ihre normale Tätigkeit und bearbeitet eine Interrupt-Routine, deren Anfangsadresse an einer bestimmten Adresse ($fffa und $fffb) im System gespeichert ist . Diese Routine muß am Anfang feststellen, was die Unterbrechung ausgelöst hat. Dies kann sie im Register NMIST 54287 $d40f 79
*** ATARI INTERN ANTIC *** abfragen. Für jede Interruptquelle steht ein Bit zur Verfü- gung. Daß eine bestimmte Unterbrechungsbedingung aufgetreten ist, zeigt der ANTIC durch Setzen des entsprechenden Bits. Die Bits in NMIST sind wie folgt zugeordnet: Bit 0-4 : unbenutzt Bit 5 : "RNMI"-Eingang Bit 6 : Vertikalsynchron-Interrupt Bit 7 : ANTIC-Programm-Unterbrechung Zum Rücksetzen eines gesetzten Bits in diesem Register, muß man lediglich irgendeinen Wert in das Register NMIRES 54287 $d40f schreiben. Dieses Register hat die gleiche Adresse wie NMIST. Wenn auf diese Adresse ein Lesezugriff erfolgt, wird NMIST angesprochen, bei einem Schreibzugriff dagegen NMIRES. Mit dem Register VCOUNT 54283 $d40b ist es möglich festzustellen, welche Bildzeile der ANTIC gerade darstellt. Die Bits des Registers VCOUNT enthalten den Stand des internen Bildzeilenzählers. Das niedrigste Bit des Bildzeilenzählers ist aber nicht in VCOUNT enthalten. VCOUNT enthält also die Nummer der aktuellen Bildzeile ge- teilt durch zwei. Bei einem Bilddurchlauf zählt VCOUNT von 0 bis 155. Unter Umständen ist es für besondere Effekte nötig den Prozessor parallel zu einer Zeile arbeiten zu lassen. Da der Aufbau einer Zeile jedoch zu schnell ist, um einfach abzu- fragen, wann die nächste Zeile beginnt, gibt es das Register 80
*** ATARI INTERN ANTIC *** WAITHSYNC 54282 $d40a Wenn irgendein Wert in dieses Register hineingeschrieben wird, wird die CPU bis zum Anfang der nächsten Zeile einfach gestoppt. Dabei wird die "READY"-Leitung der CPU auf "0" geschaltet. Sobald das nächste Horizotalsynchronisations- signal kommt, also die Zeile beendet ist, arbeitet die CPU wieder weiter. An den Atari-Computer läßt sich an die Joystick-Anschlüsse ein sogenannter "Lightpen" anschließen. Wenn man einen der- artigen Lightpen auf den Bildschirm hält, wird seine Posi- tion in zwei Registern und Schattenregistern gespeichert: LPENH 54284 $d40c Hier wird die Horizontalposi- LPENH@ 564 $234 tion des Lightpens gespei- chert. Das Register enthält die Nummer des Farbtaktes, bei dem sich der Lightpen befin- det. LPENV 54285 $d40d Hier wird die Vertikalposition LPENV@ 565 $235 des Lightpens gespeichert. Das Register enthält die Nummer der Bildzeile, in der sich der Lightpen befindet geteilt durch zwei. (vergl. VCOUNT) Es gibt allerdings häufig Probleme beim Einsatz eines Light- pens. Ein Lightpen ist eigentlich nichts weiter als ein Fototransistor. Das Prinzip des Lightpens ist es, ein Signal an den ANTIC zu geben, sobald der das Bild erzeugende Strahl die Position des Lightpens passiert. Dazu muß der Fototran- sistor oder das jeweilige Aufnahmeelement jedoch sehr schnell reagieren. Derartig schnell reagierende Elemente sind sehr teuer. Unter Umständen erhält man auch akzeptable Ergebnisse mit billigen Fototransistoren, meist gibt es mit ihnen aber Probleme bei der Aufnahme der Horizontalposition. 81
*** ATARI INTERN ANTIC *** Für viele Zwecke ist es ausreichend nur die Vertikalposition des Lightpens festzustellen, zum Beispiel wenn man Punkte eines Auswahlmenüs mit dem Lightpen wählen möchte. Dann kann auch ein in der Vertikalposition nicht richtig funktionie- render Lightpen befriedigende Ergebnisse liefern. ********************************************* * * * * * DER DMA FÜR DIE PLAYER-MISSILE-GRAFIK * * ------------------------------------- * * * ********************************************* Die Player-Missile-Grafik wird vom GTIA erzeugt. Der GTIA unterstützt dabei jedoch immer nur eine Bildzeile. Es müssen daher für jede Bildzeile jeweils neue Daten in die sogenann- ten Grafikregister des GTIA geschrieben werden. Dies kann auch per Assemblerprogramm geschehen, der Aufwand dafür ist aber sehr hoch. Einfacher ist es, den DMA des ANTICs für die Player-Missile-Grafik zu verwenden. Man muß lediglich ein Speicherfeld mit den Daten der Spieler und Geschosse im Speicher aufbauen. Für jede Bildzeile (oder für jede zweite Bildzeile, wenn zweizeilige Auflösung gewählt ist) holt der ANTIC Daten aus dem Speicher und überträgt sie in die GTIA-Grafikregister. Die Horizontalpo- sition der Objekte wählt man dann im GTIA, die Vertikalposi- tion wird durch die Lage des Objekts im Player-Missile- Speicherfeld bestimmt. 82
*** ATARI INTERN ANTIC *** Auf diese Art können Spieler beliebige vertikale Ausdehnung haben, also auch die gesamte Höhe des Schirms ausfüllen. Für die horizontale Darstellung stehen acht Bits bei Spielern und zwei Bits bei Geschossen zur Verfügung. Wieviel Farb- takte ein Bit von einem Spieler oder einem Geschoß jedoch belegt, wie groß ein Spieler oder ein Geschoß horizontal also ist, läßt sich durch die "SIZE"-Register im GTIA wählen. Der DMA für die Spieler und für die Geschosse, sowie die vertikale Auflösung (einzeilig oder zweizeilig), werden mit dem Register DMACNTL bzw. DMACNTL@ eingeschaltet bzw. ge- wählt. Die Basisadresse des Player-Missile-Speicherfeldes wird im Register PMBASE 54279 $d407 gespeichert. 83
*** ATARI INTERN ANTIC ***
84
*** ATARI INTERN ANTIC *** Die eigentliche Adresse, aus der sich der ANTIC die Daten für die Player-Missile-Grafik holt, setzt sich bei einzeili- ger Auflösung folgendermaßen zusammen: Bit 0-7 : Bildzeilenzähler für Spieler und Geschosse Bit 8-10 : Diese Bits wählen, für welchen Spieler/Geschoß der DMA erfolgt. Bit 11 : PMBASE, Bit 3 Bit 12 : PMBASE, Bit 4 Bit 13 : PMBASE, Bit 5 Bit 14 : PMBASE, Bit 6 Bit 15 : PMBASE, Bit 7 PMBASE wählt also die Nummer des 256-Byte-Blocks, an dem das Player-Missile-Speicherfeld beginnt. Dieser Block muß aber am Beginn eines 2 KByte Speicherblockes liegen. Man kann auch sagen, daß mit PMBASE einer von 32 möglichen 2 KByte Speicherblöcken ausgewählt wird ( 5 Bits von PMBASE werden verwendet). Die Bits 8-10 "wählen" wie erwähnt, für welchen Spieler/Geschoss der DMA erfolgt. Dies geschieht auf folgen- de Weise: Bit10 Bit9 Bit8 Beschreibung 0 0 0 Diese 3 Kombinationen treten nicht auf, 0 0 1 daher sind bei einzeiliger Auflösung 0 1 0 auch die ersten 3 * 256 Bytes unbenutzt. Prinzipiell gibt es 8 Kombinationen der Bits 8-10, da aber nur 4 Felder für Spieler und ein Feld für die Geschosse benötigt werden, bleiben 3 Kombinationen unbenutzt. 0 1 1 Bei dieser Kombination wird aus dem Speicherfeld für die Geschosse im DMA gelesen. 1 0 0 Bei dieser Kombination wird aus dem Speicherfeld für Spieler 0 im DMA 85
*** ATARI INTERN ANTIC *** gelesen. 1 0 1 Bei dieser Kombination wird aus dem Speicherfeld für Spieler 1 im DMA gelesen. 1 1 0 Bei dieser Kombination wird aus dem Speicherfeld für Spieler 2 im DMA gelesen. 1 1 1 Bei dieser Kombination wird aus dem Speicherfeld für Spieler 3 im DMA gelesen. Bei zweizeiliger Auflösung der Spieler und Geschosse, setzt sich die eigentliche Adresse für den DMA (das heißt die Adresse, aus der die Daten, die in die Grafikregister ge- schrieben werden, gelesen werden) folgendermaßen zusammen: Bit 0-6 : Bildzeilenzähler für Spieler und Geschosse Bit 7-9 : Diese Bits wählen, für welchen Spieler/Geschoß der DMA erfolgt. Dabei gilt das für die Bits 8-10 bei einzeili- ger Auflösung Gesagte. Jedoch muß beach- tet werden, daß jeder Spieler und die Geschosse nur je 128 Bytes belegen. Es bleiben am Anfang des Player-Missile- Speicherfeldes also auch nur 3 * 128 Byte unbenutzt (im Gegensatz zu den 3 * 256 Byte bei einzeiliger Auflösung). Bit 10 : PMBASE, Bit 2 Bit 11 : PMBASE, Bit 3 Bit 12 : PMBASE, Bit 4 Bit 13 : PMBASE, Bit 5 Bit 14 : PMBASE, Bit 6 Bit 15 : PMBASE, Bit 7 86
*** ATARI INTERN ANTIC *** PMBASE wählt also die Nummer des 256-Byte-Blocks, an dem das Player-Missile-Speicherfeld beginnt. Dieser Block muß aber am Beginn eines 1 KByte Speicherblockes liegen. Man kann auch sagen, daß mit PMBASE einer von 64 möglichen 1 KByte Speicherblöcken ausgewählt wird. ******************************************************* * * * * * DER BEFEHLSATZ DES ANTIC UND DAS ANTIC-PROGRAMM * * ----------------------------------------------- * * * ******************************************************* Wie schon erwähnt, handelt es sich beim ANTIC um einen Mikroprozessor. Bei seinen Befehlen handelt es sich um Kommandos, die die Darstellung von 1 bis 16 Bildzeilen zur Folge haben. Außerdem gibt es für jeden Befehl eine bestimm- te Form, die veranlaßt, daß sich der ANTIC den Anfang des Bildspeichers "merkt", daß der sogenannte Bildspeicherzähler geladen wird. Wie bei "normalen" Mikroprozessoren gibt es auch beim ANTIC Sprungbefehle, die bewirken, das er das ANTIC-Programm von einer anderen Speicherstelle aus weiter- liest. Natürlich muß man dem ANTIC mitteilen, von welcher Speicher- stelle aus er sein Programm abarbeiten soll. Diese Adresse teilt man ihm in zwei Registern bzw. zwei Schattenregistern (einem sogenannten Pointer, also Zeiger auf das ANTIC-Pro- gramm) mit: DLPTRL 54274 $d402 unteres Byte der Adresse DLPTRL@ 560 $230 (Schattenregister) 87
*** ATARI INTERN ANTIC *** DLPTRH 54275 $d403 obere Hälfte der Adresse DLPTRH@ 561 $231 (Schattenregister) Die Akürzung "DLPTR" kommt von "Display-List-Pointer", dies heißt soviel wie "Zeiger auf das ANTIC-Programm". Der ANTIC verwendet den Wert der Register intern als Wert seines Programm-Zählers. Dieser ANTIC-Programm-Zähler zeigt jeweils auf den abzuarbeitenden ANTIC-Befehl. Da die obersten 6 Bits des ANTIC-Programm-Zählers nur Register sind und nicht hoch- gezählt werden können, kann das ANTIC-Programm eine 1 KByte- Grenze nur durch einen ANTIC-Programm-Sprung überwinden. Durch den Wechsel der Inhalte der Register DLPTRL und DLPTRH kann man das gesamte Bild wechseln. Man muß vorher lediglich ein neues ANTIC-Programm und einen Bildspeicher irgendwo im System aufbauen. Man sollte diese Register nur während der Vertikalsynchroni- sation ändern, ansonsten kann das Bild kurzzeitig abrollen. Die Schattenregisterinhalte werden immer während der Verti- kalsynchronisation in die Register geschrieben, daher muß hier nicht darauf geachtet werden, daß man selbst nur wäh- rend der Vertikalsynchronisation schreibt. Damit der ANTIC überhaupt das ANTIC-Programm lesen kann, muß Bit 5 von Register DMACNTL gesetzt sein. Alle ANTIC-Befehle kann man grundsätzlich in 3 Gruppen einteilen: 1) Befehle, um Leerzeilen zu erzeugen 2) Sprungbefehle 3) Befehle, die Bildzeilen erzeugen Jeder ANTIC-Befehl wird per DMA in das Befehlsregister gela- den. Bei Sprungbefehlen werden vom ANTIC zwei weitere Bytes per DMA gelesen. Diese beiden Bytes werden in den ANTIC- Programm-Zähler geladen. Wie bei CPU-Befehlen wird auch hier zuerst das niederwertige Byte und dann das höherwertige Byte gelesen. 88
*** ATARI INTERN ANTIC *** Bei Befehlen, die veranlassen, daß der Bildspeicherzähler geladen wird, holt der ANTIC ebenfalls zwei weitere Bytes per DMA aus dem Speicher und transportiert sie in das Bild- speicherzählerregister (auch hier wird das niederwertige Byte zuerst gelesen). Bei "normalen" Anzeigekommandos holt der ANTIC das nächste Byte der Bilddaten direkt aus der Speicheradresse, die der folgt, aus der das letzte Byte der vorherigen Zeile gelesen wurde. Der Bildspeicherzähler wird dabei nicht neu geladen. Dadurch werden die Bilddaten der jeweils nächsten Zeile direkt aus den Speicherstellen, die der vorhergehenden Zeile folgen, gelesen. Die Bilddaten der einzelnen Zeilen werden so ohne Lücke aneinandergereiht. Es ergibt sich dadurch ein Bildspeicherblock, wie er auch bei fast allen anderen Mikrocomputern vorhanden ist. Der Bildspeicherzähler (der Pointer auf die Bilddaten) be- steht aus 4 Register- und 12 Zählerbits. Daher kann ein zusammenhängender Bildspeicherbereich nie länger als 4 KByte sein. Jeweils beim Übergang zum nächsten 4 KByte-Block muß der Bildspeicherzähler durch ein geeignetes ANTIC-Kommando neu geladen werden. Besonders sollte man auch darauf achten, das der 4 KByte-Block nicht während der Darstellung einer Zeile überschritten wird. Dies würde nämlich dazu führen, daß plötzlich, innerhalb der laufenden Zeile, die Daten aus Speicherstellen vom Anfang des durch die obersten 4 Bits des Bildspeicherzählers bestimmten 4 KByte-Blocks, gelesen wür- den. Für jeden Befehl gibt es eine Version, die veranlaßt, daß bei der Bearbeitung der letzten, durch diesen Befehl erzeug- ten Bildzeile, die normale Tätigkeit der CPU unterbrochen wird und stattdessen die Routine, deren Startadresse bei DLIVKT (niederwertiges Byte in 512/$200, höherwertiges Byte in 513/$201) steht, bearbeitet wird. Die Vorraussetzung für eine derartige ANTIC-Programm-Unterbrechung ist, daß Bit 7 von NMIEN gesetzt ist. Eine ANTIC-Programm-Unterbrechung ist nicht eine Unterbrechung des ANTIC-Programms, sondern eine Unterbrechung (Interrupt) der CPU, die durch das ANTIC- 89
*** ATARI INTERN ANTIC *** Programm ausgelöst wird. Mit ANTIC-Programm-Unterbrechungen lassen sich zum Beispiel während eines Bildes in einer bestimmten Zeile die Farben wechseln. Mit einer ANTIC-Programm-Unterbrechung ist es auch möglich, mehr als vier Spieler und Geschosse darzustellen, indem man PMBASE auf ein anderes Player-Missile-Speicherfeld legt und die Farben und Bildschirmpositionen, soweit nötig, wechselt. ANTIC-Programm-Unterbrechungen bieten vielfältige Möglichkeiten, da es mit ihnen auf sehr einfache Art möglich ist, einen Programmteil während der Darstellung einer be- stimmten Bildschirmposition abzuarbeiten. Befehle, um Leerzeilen zu erzeugen: ----------------------------------- Der ANTIC besitzt Befehle, die auf dem Bildschirm Leerzeilen erzeugen. Wenn ein derartiger Befehl abgearbeitet wird, werden keine Bilddaten aus dem Speicher geholt. Statt dessen erscheint die Hintergrundfarbe auf dem Monitor. Die Leerzei- lenbefehle sind grundsätzlich ein Byte lang. Mit einem Leer- zeilenbefehl werden ein bis acht Leerzeilen erzeugt. Ein ANTIC-Befehl für Leerzeilen wird wie folgt aufgebaut: Bit 0-3 : Diese Bits müssen für einen Leerzeilenbefehl binär %0000 enthalten. Bit 4-6 : Der Binärwert dieser drei Bits bestimmt die Anzahl der Leerzeilen plus eins, die mit diesem Befehl erzeugt werden. Wenn diese Bits zum Beispiel binär %010 enthalten, werden 3 Leerzeilen erzeugt. Bit 7 : Wenn dieses Bit gesetzt ist, wird eine ANTIC-Programm-Unterbrechung bei der Darstellung der letzten, durch diesen Befehl erzeugten Bildzeile ausgelöst. 90
*** ATARI INTERN ANTIC *** Sprungbefehle: -------------- Mit diesen Befehlen wird der ANTIC-Programm-Zähler neu gela- den. Wenn ein derartiger Befehl in einem Bildblock auftritt, verursacht er eine Leerzeile. Daher sollten Sprungbefehle nur am Ende eines Bildes ausgelöst werden. Die beiden Bytes, die im ANTIC-Programm einem Sprungbefehl folgen, enthalten die neue Adresse (niederwertiges Byte zuerst). Ein ANTIC- Sprungbefehl wird wie folgt aufgebaut: Bit 0-3 : Diese Bits müssen bei einem Sprungbefehl binär %0001 enthalten. Bit 4 : Wenn dieses Bit "0" ist, wird ein ein- facher Sprung ausgelöst, bei dem eine Leerzeile verursacht wird. Ist dieses Bit "1", erfolgt ebenfalls ein Sprung an die angegebene Adresse. Der ANTIC war- tet mit der Ausführung des folgenden Befehls bis zum Ende der nächsten Ver- tikalsynchronisation, also bis zum nächsten Bild. Bit 5-6 : Diese Bits sollten "0" sein. Bit 7 : Wenn dieses Bit "1" ist, wird eine ANTIC-Programm-Unterbrechung ausgelöst. Befehle, die Bildzeilen erzeugen: --------------------------------- Diese Befehle enthalten die Nummer (hexadezimal) des ANTIC- Modus, mit dem die nächste Bildzeile, bzw. der nächste Bildblock dargestellt wird. Oft werden diese Befehle auch als "Display"-Befehle bezeichnet. Ein Displaybefehl des ANTIC ist folgendermaßen aufgebaut: Bit 0-3 : Diese Bits enthalten die (hexadezimale) Nummer/Bezeichnung des ANTIC-Modus. Bit 4 : Wenn dieses Bit gesetzt ist, ist der 91
*** ATARI INTERN ANTIC *** Horizontalvorschub (das Horizontal- Scrolling) eingeschaltet. Bit 5 : Wenn dieses Bit gesetzt ist, ist der Vertikalvorschub (das Vertikal- Scrolling) eingeschaltet. Bit 6 : Wenn dieses Bit gesetzt ist, so wird vor der Darstellung der ersten, zu diesem Befehl gehörigen Zeile, der Bildspeicherzähler mit den beiden im ANTIC-Programm folgenden Bytes geladen. Bit 7 : Wenn dieses Bit gesetzt ist, wird eine ANTIC-Programm-Unterbrechung bei der Darstellung der letzten durch diesen Befehl erzeugten Bildzeile ausgelöst. ------------------------------------------------------------ Die folgenden Tabellen fassen die ANTIC-Befehle noch einmal zusammen (dabei sind die Daten hexadezimal angegeben): BEFEHL mit ohne ANTIC-Programm-Unterbrechung 1 Leerzeile 00 80 2 Leerzeilen 10 90 3 Leerzeilen 20 a0 4 Leerzeilen 30 b0 5 Leerzeilen 40 c0 6 Leerzeilen 50 d0 7 Leerzeilen 60 e0 8 Leerzeilen 70 f0 Sprung 01 81 Sprung u. Warten 41 c1 92
*** ATARI INTERN ANTIC *** HScrolling -- XX -- XX -- XX -- XX VScrolling -- -- XX XX -- -- XX XX lade Bildspei- -- -- -- -- XX XX XX XX cherzähler BEFEHL OHNE ANTIC-PROGRAMM-UNTERBRECHUNG Modus "2" 02 12 22 32 42 52 62 72 Modus "3" 03 13 23 33 43 53 63 73 Modus "4" 04 14 24 34 44 54 64 74 Modus "5" 05 15 25 35 45 55 65 75 Modus "6" 06 16 26 36 46 56 66 76 Modus "7" 07 17 27 37 47 57 67 77 Modus "8" 08 18 28 38 48 58 68 78 Modus "9" 09 19 29 39 49 59 69 79 Modus "A" 0a 1a 2a 3a 4a 5a 6a 7a Modus "B" 0b 1b 2b 3b 4b 5b 6b 7b Modus "C" 0c 1c 2c 3c 4c 5c 6c 7c Modus "D" 0d 1d 2d 3d 4d 5d 6d 7d Modus "E" 0e 1e 2e 3e 4e 5e 6e 7e Modus "F" 0f 1f 2f 3f 4f 5f 6f 7f BEFEHL MIT ANTIC-PROGRAMM-UNTERBRECHUNG Modus "2" 82 92 a2 b2 c2 d2 e2 f2 Modus "3" 83 93 a3 b3 c3 d3 e3 f3 Modus "4" 84 94 a4 b4 c4 d4 e4 f4 Modus "5" 85 95 a5 b5 c5 d5 e5 f5 Modus "6" 86 96 a6 b6 c6 d6 e6 f6 Modus "7" 87 97 a7 b7 c7 d7 e7 f7 Modus "8" 88 98 a8 b8 c8 d8 e8 f8 Modus "9" 89 99 a9 b9 c9 d9 e9 f9 Modus "A" 8a 9a aa ba ca da ea fa Modus "B" 8b 9b ab bb cb db eb fb Modus "C" 8c 9c ac bc cc dc ec fc Modus "D" 8d 9d ad bd cd dd ed fd Modus "E" 8e 9e ae be ce de ee fe Modus "F" 8f 9f af bf cf df ef ff 93
*** ATARI INTERN ANTIC *** BEISPIEL FÜR EIN ANTIC-PROGRAMM: -------------------------------- Das ANTIC Programm und der Bildspeicher im BASIC-Modus "0" ("GRAPHICS 0"): Adresse Daten (hex.) (hex.) 7c20 70 24 Leerzeilen am oberen Bildrand 70 (wegen "Overscan" des Bildschirms) 70 42 Der Bildspeicherzähler wird mit 40 $7c40 geladen 7c (Darstellung mit ANTIC-Modus "2") 02 --I 02 I 02 I . I . I-- 23 weitere Zeilen . I im ANTIC-Modus "2" . I 02 I 02 --I 41 Springe nach $7c20 und warte auf 20 das Ende des Vertikal-Leertaktes 7c (ANTIC-Programm-Zähler neu laden) 7c40 1. Bildzeile --I 7c68 2. Bildzeile I 7c90 3. Bildzeile I . I-- je 40 Zeichen . I Bildspeicher . I 7f60 23. Bildzeile I 7f88 24. Bildzeile --I Der Bildspeicher ist insgesamt 960 ($3c0) Bytes lang und endet bei $7faf (dezimal : 32687) 94
*** ATARI INTERN ANTIC *** *************************** * * * * * DIE BILDGRAFIK-MODI * * ------------------- * * * *************************** Der ANTIC verfügt über acht verschiedene Bildgrafik-Modi. Bei einem Bildgrafik-Modus kann man jedes einzelne Pixel auf dem Bildschirm einzeln ansprechen. Nicht alle sind durch das Betriebssystem im BASIC verfügbar. Die einzelnen Modi unter- scheiden sich im Grad der Auflösung und in der Anzahl der für jeden Pixel verfügbaren Farben, somit also auch im Speicherbedarf. Unter einem Pixel versteht man ein rechteckiges Feld auf dem Bildschirm, das ein bis acht Bildzeilen hoch und einen halben bis 4 Farbtakte breit sein kann. Bei einem ANTIC- Programm mit 192 Bildzeilen und 160 Farbtakten pro Zeile ergeben sich somit Auflösungen von 24 * 40 bis 192 * 320 Pixeln. Bei 192 Farbtakten pro Zeile ergibt sich sogar eine maximale horizontale Auflösung von 384 Pixeln. ANTIC-Modi mit geringer Auflösung haben den Vorteil, daß sie wenig Speicherraum verbrauchen, sich somit auch schnell komplett ändern lassen. Außerdem benötigen sie nicht so viele DMA-Zyklen, verlangsamen die CPU also auch weniger, als ANTIC-Modi mit hoher Auflösung. Die Adresse des Bild- speichers wird (wie im Kapitel über das ANTIC-Programm be- schrieben) im ANTIC-Programm festgelegt. Die Daten werden, wenn sie zur Bilddarstellung benötigt werden, per DMA vom ANTIC aus dem Arbeitsspeicher geholt. Außer auf den Bildschirm, transportiert der ANTIC die Bild- daten noch in ein internes, sogenanntes Verschieberegister. Dort stehen die Bilddaten für den Fall zur Verfügung, daß mehrere Zeilen gleichartig sind (wenn zum Beispiel ein Pixel mehrere Bildzeilen einnimmt). Auf diese Art liest der ANTIC die Bilddaten für gleichartige Zeilen nur einmal und spart dadurch DMA-Zyklen ein. 95
*** ATARI INTERN ANTIC *** DIE EINZELNEN MODI: ------------------- Die Angaben beziehen sich, wenn nicht anders angegeben, auf die normale Zeilenbreite (160 Farbtakte pro Bildzeile). ANTIC- Beschreibung MODUS "8" Dieser ANTIC-Modus entspricht dem BASIC-Modus "3". Es werden 40 Pixel pro Normalzeile dargestellt, dabei stehen vier verschiedene Farben zur Verfü- gung. Jedes Pixel hat eine Höhe von 8 Bildzeilen. Pro Normalzeile werden 10 Bytes Bildspeicher benö- tigt. Jedes Pixel belegt 4 Farbtakte. Bei normaler Bildschirmeinstellung sind die Pixel also quadra- tisch. Jeweils zwei Bits der Bilddaten wählen ein Farbregister an, dabei gilt folgende Tabelle: Daten Farbregister 00 COLBAK 01 COLPF0 10 COLPF1 11 COLPF2 "9" Dieser ANTIC-Modus entspricht dem BASIC-Modus "4". Es werden 80 Pixel pro Normalzeile dargestellt, dabei ist jedes Pixel 2 Farbtakte breit. Es stehen zwei verschiedene Farben zur Verfügung. Pro Zeile werden auch bei diesem Modus 10 Byte Bildspeicher benötigt. Auch bei diesem Modus sind die Pixel normalerweise quadratisch. Für jedes Pixel steht ein Bit in den Bilddaten zur Verfügung, wenn das Bit "0" ist, wird die Farbe aus COLBAK (Hinter- grund) abgebildet, ansonsten erscheint die Farbe aus COLPF0. 96
*** ATARI INTERN ANTIC *** "A" Dieser ANTIC-Modus entspricht dem BASIC-Modus "5". Auch hier sind die Pixel quadratisch. Pro Zeile werden 80 Pixel , die je zwei Farbtakte breit sind, dargestellt. Es stehen vier verschieden Farben für jedes Pixel zur Verfügung. Pro Zeile werden 20 Bytes Bildspeicher benötigt. Jedes Pixel ist 4 Bildzeilen hoch. Je zwei aufeinander folgen- de Bits der Bilddaten wählen aus vier Farbre- gistern eins aus, dabei gilt folgende Tabelle: Daten Farbregister 00 COLBAK 01 COLPF0 10 COLPF1 11 COLPF2 "B" Dieser ANTIC-Modus entspricht dem BASIC-Modus "6". Pro Zeile werden 160 quadratische Pixel darge- stellt, die je einen Farbtakt breit und 2 Bildzei- len hoch sind. Es stehen zwei Farben für die Pixel zur Verfügung. Pro Zeile werden also 20 Byte Bild- daten benötigt. Für die Farbe jedes Pixels ist ein Bit der Bilddaten "zuständig". Wenn dieses Bit "0" ist, wird die Farbe aus COLBAK dargestellt, an- sonsten erscheint die Farbe aus COLPF0. "C" Dieser ANTIC-Modus wird vom Betriebssystem nicht verwendet. Die Pixel sind hier etwa doppelt so breit wie hoch. Pro Zeile werden 160 Pixel darge- stellt, die je einen Farbtakt breit und eine Bild- zeile hoch sind. Es stehen zwei Farben zur Verfü- gung. Pro Zeile werden auch hier 20 Bytes Bildda- ten benötigt. Für jedes Pixel ist ein Bit der Bilddaten "zuständig". Wenn dieses Bit "0" ist, wird die Farbe aus COLBAK dargestellt, ansonsten erscheint die Farbe aus COLPF0. 97
*** ATARI INTERN ANTIC *** "D" Dieser ANTIC-Modus entspricht dem BASIC-Modus "7". Die Pixel sind hier quadratisch. Pro Normalzeile werden 160 Pixel abgebildet, für die vier Farben zur Verfügung stehen. Jedes Pixel ist einen Farb- takt breit und zwei Bildzeilen hoch. Pro Zeile werden also 40 Bytes Bilddaten benötigt. Je zwei aufeinander folgende Bits der Bilddaten wählen aus vier Farbregistern eins aus, dabei gilt folgende Tabelle: Daten Farbregister 00 COLBAK 01 COLPF0 10 COLPF1 11 COLPF2 "E" Auch dieser ANTIC-Modus wird nicht vom Betriebs- system bzw. BASIC benutzt. Die Pixel sind auch hier etwa doppelt so breit wie hoch. Pro Zeile werden 160 derartige Pixel dargestellt, für die vier Farben zur Verfügung stehen. Jedes Pixel ist einen Farbtakt breit und eine Bildzeile hoch. Für eine Zeile werden 40 Bytes Bildspeicher benötigt. Bei diesem Modus ist besondere Vorsicht bei der Erstellung eines ANTIC-Programms geboten: Wenn man diesen Modus mit 192 Zeilen bzw. Bildzeilen (hier sind Zeilen und Bildzeilen identisch) betreibt, ist der Bildspeicher größer als 4 KByte, etwa in der Mitte des ANTIC-Programms muß daher der Bild- speicherzähler durch einen entsprechenden ANTIC- Befehl neu geladen werden. Je zwei aufeinander folgende Bits der Bilddaten wählen aus vier Farbregistern eins aus, dabei gilt die folgende Zuordnung: Daten Farbregister 00 COLBAK 01 COLPF0 98
*** ATARI INTERN ANTIC *** 10 COLPF1 11 COLPF2 "F" Dieser ANTIC-Modus entspricht dem BASIC-Modus "8". In einer Zeile werden 320 quadratische Pixel dar- gestellt, die eine Bildzeile hoch und einen halben Farbtakt breit sind. Da die Pixel nur noch einen halben Farbtakt breit sind, können sie nur unter- schiedliche Helligkeiten und nicht verschiedene Farben haben. Pro Bildzeile werden auch bei diesem Modus 40 Bytes Bildspeicher benötigt. Auch bei der Erstellung eines ANTIC-Programms für diesem Modus ist besondere Vorsicht geboten: Wenn man diesen Modus mit 192 Zeilen bzw. Bildzeilen (hier sind Zeilen und Bildzeilen identisch) betreibt, ist der Bildspeicher größer als 4 KByte, etwa in der Mitte des ANTIC-Programms muß daher der Bildspeicherzäh- ler durch einen entsprechenden ANTIC-Befehl neu geladen werden. Die Farbe der Pixel ist immer die Farbe, die in COLPF2 steht. Für jedes Pixel steht ein Bit in den Bilddaten zur Verfügung. Wenn dieses Bit "0" ist, wird die Helligkeit des Pixels ebenfalls durch COLPF2 bestimmt. Ist das Bit "1" wird das Pixel mit der Helligkeit dargestellt, die in COLPF1 eingetragen ist. Auf der nächsten Seite folgt eine Tabelle, die die einzelnen Grafik-Modi noch einmal zusammenfaßt. 99
*** ATARI INTERN ANTIC *** ANTIC-MODUS "8" "9" "A" "B" "C" "D" "E" "F" Basic-Modus "3" "4" "5" "6" --- "7" --- "8" Pixel pro Zeile 32 64 64 128 128 128 128 256 (schmales Bild) Pixel pro Zeile 48 96 96 192 192 192 192 384 (breites Bild) Pixel pro Zeile 40 80 80 160 160 160 160 320 (Normalzeile) Bytes pro Zeile 10 10 20 20 20 40 40 40 (Normalzeile) Bildzeilen 8 4 4 2 1 2 1 1 (pro Pixel) Farbtakte 4 2 2 1 1 1 1 1/2 (pro Pixel) Farbanzahl 4 2 4 2 2 4 4 1,5 Datenbits 2 1 2 1 1 2 1 1 (pro Pixel) VERWENDETE FARBREGISTER COLPF0 X X X X X X X COLPF1 X X X X H COLPF2 X X X X X COLPF3 COLBAK X X X X X X X H : Nur die Helligkeitsangabe wird verwendet ! 100
*** ATARI INTERN ANTIC *** ************************** * * * * * DIE SCHRIFTGRAFIK * * ----------------- * * * ************************** Der ANTIC verfügt nicht nur über leistungsfähige Modi zur Darstellung von Punktgrafiken, er besitzt auch 6 Modi zur Darstellung von Schriftzeichen. Den Begriff Schriftzeichen sollte man allerdings nicht allzu wörtlich nehmen. Natürlich kann man auch andere Gegenstände mit den Schriftgrafik-Modi auf dem Bildschirm darstellen, man muß sich lediglich einen eigenen Zeichensatz definieren. Mehrere Schriftgrafik-Modi eignen sich auch nicht ohne weiteres zur Darstellung von Buchstaben, da sie nur vier Pixel breit sind. Dafür sind sie für andere Zeichendarstellungen (z.B. in Spielen) geeignet, da sie über vielfältige Farbmöglichkeiten verfügen. Mit den Schriftgrafik-Modi kann man sehr hoch aufgelöste Bilder mit wenig Bildspeicherraum darstellen. Der wesentliche Unterschied zwischen Bild- und Schriftgrafik-Modi liegt in der Quelle der Daten, die auf dem Bildschirm dargestellt werden. Bei der Bildgrafik werden die Daten aus dem Bildspeicher direkt auf dem Bildschirm abgebildet. Bei Schriftgrafik-Modi werden dagegen die Daten aus dem Bildspeicher als Nummer eines Zeichens (als Zeichen- name) aus einem Zeichensatz aufgefaßt. Die Bilddaten werden also indirekt über einen Zeichensatz, der irgendwo im Ar- beitsspeicher liegt (einen sogenannten "Zeichengenerator"), auf dem Bildschirm dargestellt. Man spricht bei dieser Form der Darstellung auch oft von einer Zeichen-Projektion. Der ANTIC liest dabei die Daten aus dem Bildspeicher und trans- portiert sie in das Verschieberegister. Je nachdem, welche Bildzeile einer Zeile gerade dargestellt werden soll, liest der ANTIC per DMA mit Hilfe der Daten aus dem Bildspeicher, die er ja im Schieberegister hat, die Bilddaten aus dem Zeichengenerator. 101
*** ATARI INTERN ANTIC *** Für jedes Zeichen sind acht Bytes im Zeichengenerator vor- handen. Jedes Byte eines Zeichens bestimmt das Aussehen des Zeichens in einer Zeile von Pixeln (also in ein oder zwei Bildzeilen je nach Modus). Der Zeichengenerator ist eine Liste aller Zeichendaten. Der Zeichengenerator enthält keine Lücken, die Zeichen sind direkt aneinandergereiht. Nach der Projektion einer Pixelzeile (Eine Pixelzeile hat ein oder zwei Bildzeilen, je nachdem, welcher ANTIC-Modus benutzt wird) wird intern im ANTIC der Zeilenzähler um eins erhöht (inkrementiert). Dadurch werden, nachdem zum Beispiel die Daten für die erste Bildzeile aus dem Zeichengenerator gelesen wurden, die Daten für die zweite Bildzeile aus dem Zeichengenerator gelesen. Natürlich muß man dem ANTIC mitteilen, wo er den Zeichenge- nerator findet. Die Nummer des 256 Byte-Blocks, an dem der Zeichengenerator beginnt, schreibt man in das Register bzw. Schattenregister CHARBASE 54281 $d409 CHARBASE@ 756 $2f4 Bei Modi mit 40 Zeichen pro Zeile werden Bit 0 bis 6 der Bildspeicherdaten als Name des darzustellenden Zeichens aufgefaßt. Der Zeichengenerator umfaßt also 128 Zeichen. Da jedes Zeichen 8 Bytes belegt, werden 1024 Bytes Zeichengene- rator benötigt. Bei diesen Modi werden die Bits 2 bis 7 von CHARBASE benutzt. Der Zeichengenerator muß daher an einer 1 KBYTE-Grenze im System beginnen. Bei Modi mit 20 Zeichen pro Zeile werden Bit 0 bis 5 der Bildspeicherdaten als Name des darzustellenden Zeichens aufgefaßt. Der Zeichengenerator umfaßt also 64 Zeichen. Da jedes Zeichen 8 Bytes belegt, werden 512 Bytes Zeichengene- rator benötigt. Bei diesen Modi werden die Bits 1 bis 7 von CHARBASE benutzt. Der Zeichengenerator muß daher an einer 512 Byte-Grenze im System beginnen. 102
*** ATARI INTERN ANTIC ***
103
*** ATARI INTERN ANTIC ***
104
*** ATARI INTERN ANTIC *** Die untersten 6 (bei Modi mit 64 Zeichen im Zeichensatz) bzw. 7 (bei Modi mit 128 Zeichen) Bits eines Bytes aus dem Bildspeicher bestimmen also, welches Zeichen aus dem Zei- chensatz abgebildet wird. Das oberste bzw. die beiden obersten Bits bestimmen bei mehreren Modi die Farbe. Bei zwei Modi (ANTIC-Modi "2" und "3") werden durch das oberste Bit (Bit 7) eines Bytes aus dem Bildspeicher zusätzliche Funktionen gesteuert. Für diese Zusatzfunktionen und die Steuerung der Schriftgrafik-Modi überhaupt, steht das Re- gister bzw. Schattenregister CHARCNTL 54273 $d401 CHARCNTL@ 755 $2f3 zur Verfügung. Die Bits dieses Registers haben folgende Funktionen: Bit 0 : Zeichen-Ausblendung: Dieses Bit hat nur bei den Modi "2" und "3" eine Funktion. Wenn es bei diesen Modi ge- setzt ist, veranlaßt es, daß alle Zeichen, bei denen das höchste Bit (Bit 7) gesetzt ist, nicht auf dem Bildschirm erscheinen. Wenn man das Bit 7 von einem Zeichen setzt und Bit 0 von CHARCNTL periodisch umschaltet, blinkt das Zeichen periodisch auf. Bit 1 : Zeichen-Invertierung: Dieses Bit hat nur bei den Modi "2" und "3" eine Funktion. Wenn es bei diesen Modi ge- setzt ist, veranlaßt es, daß bei allen Zei- chen, bei denen Bit 7 (das höchste Bit) ge- setzt ist, die Farben von Zeichen und Zeichenhintergrund vertauscht werden. Ein Zeichen, das sonst weiß auf blauem Grund erscheint, wird dann blau auf weißem Grund dargestellt. Diese Funktion wird zur Darstel- lung des Cursors verwendet. Bit 2 : Dieses Bit wird am Anfang jeder Schriftzeile abgefragt. Wenn es gesetzt ist, wird die 105
*** ATARI INTERN ANTIC *** Schriftzeile komplett auf den Kopf gestellt (vertikal gespiegelt). Bit 3-7 : unbenutzt Es folgt eine Aufstellung der einzelnen Schriftgrafik-Modi: ----------------------------------------------------------- ANTIC- BESCHREIBUNG MODUS "2" Dieser ANTIC-Modus entspricht dem BASIC-Modus "0", also dem, der nach dem Einschalten des Atari akti- viert ist. Es werden 40 Zeichen pro Normalzeile dargestellt. Jedes dieser Zeichen besteht horizon- tal aus 8 Pixeln, die jeweils einen halben Farb- takt breit sind. Dadurch können die einzelnen Pixel auch nicht mehr unterschiedliche Farben, sondern nur unterschiedliche Helligkeiten haben. Eine Zeile ist 8 Pixel hoch, dabei belegt jedes Pixel eine Bildzeile. Jedes Bit der Bilddaten im Zeichengenerator bestimmt die Helligkeit eines Pixels, die Farbe stammt immer aus COLPF2. Wenn das Bit "0" ist, wird auch die Helligkeit aus COLPF2 genommen, ansonsten wird die Helligkeit aus COLPF1 genommen. Der Zeichensatz für diesen Modus besteht aus 128 Zeichen, somit werden 1024 Byte Zeichengenerator benötigt. Bit 7 der Zeichennamen (der Daten im Bildspeicher) steuert das Aussehen des Zeichens über das Register CHARCNTL/CHARCNTL@. "3" Dieser ANTIC-Modus wird vom Betriebssystem nicht benutzt. Wie ANTIC-Modus "2", ist er besonders zur Darstellung vom Schriftzeichen geeignet. Der we- sentliche Unterschied zum ANTIC-Modus "2" ist, daß es mit diesem Modus möglich ist, die Buchstaben mit Unterlängen darzustellen. Unterlängen werden zum Beispiel für den Buchstaben "g" benötigt: Der 106
*** ATARI INTERN ANTIC *** untere Teil des "g" muß unter den anderen Buchsta- ben liegen. In einer Normalzeile werden 40 Zeichen mit je 8 Pixeln horizontal dargestellt, dabei belegt jedes Pixel einen halben Farbtakt. Neben- einander liegende Pixel können daher auch bei diesem Modus nur unterschiedliche Helligkeiten haben. Jedes Bit aus dem Zeichengenerator bestimmt dabei die Helligkeit eines Pixels, eine "0" wählt die Helligkeit aus COLPF2, eine "1" wählt die Helligkeit aus COLPF1. Die Farbe stammt immer aus COLPF2. Eine Zeile dieses Modus' ist 10 Pixel hoch, dabei belegt jedes Pixel eine Bildzeile. Auch bei diesem Modus enthält der Zeichensatz 128 Zeichen, das achte Bit der Zeichennamen (Bytes im Bildspeicher) steuert wiederum das Aussehen des Zeichens über Register CHARCNTL. Die folgende Skizze stellt die Darstellung der Zeichen aus dem Zeichengenerator dar:
107
*** ATARI INTERN ANTIC *** "4" Auch dieser Modus wird nicht vom BASIC benutzt. In diesem Modus werden wieder 40 Zeichen pro Normal- zeile abgebildet. Die einzelnen Zeichen sind hier aber nur 4 Pixel breit, dabei belegt jedes Pixel einen Farbtakt. Dieser Modus eignet sich dadurch besonders für Darstellungen in Spielen, die in vielen Farben dargestellt werden sollen, aber nur wenig Speicherraum benötigen dürfen. Landkarten zum Beipiel, lassen sich mit diesem Modus sehr gut darstellen. Die Zeichen haben eine Höhe von 8 Pixeln, dabei ist jedes Pixel eine Bildzeile hoch. Eine Zeile in diesem Modus ist also 8 Bildzeilen hoch. Die Bits 0 bis 6 der Zeichennamen wählen auch hier, welches Zeichen aus dem Zeichensatz dargestellt wird. Der Zeichensatz umfaßt also auch bei diesem Modus 128 Zeichen. Bit 7 der Zeichenna- men (der Daten des Bildspeichers) wird für die Wahl der Farben verwendet. Die Farbe eines Pixels wird außerdem von den Bits im Zeichengenerator gewählt. Je zwei im Zeichengenerator nebeneinan- derliegende Bits wählen ein Farbregister aus. Für die Farbwahl der Pixel in diesem Modus gilt fol- gende Tabelle: Bit 7 im Bitwerte im Farbregister Zeichennamen Zeichengenerator 0 00 COLBAK 0 01 COLPF0 0 10 COLPF1 0 11 COLPF2 1 11 COLPF3 "5" Die ANTIC-Modi "4" und "5" sind fast identisch. Sie unterscheiden sich nur in der Höhe der Zeilen. Während eine Zeile des ANTIC-Modus' "4" acht Bild- zeilen hoch ist, ist eine Zeile des ANTIC-Modus' 108
*** ATARI INTERN ANTIC *** "5" 16 Bildzeilen hoch. Aber auch im ANTIC-Modus "5" liegen 8 Pixel in einer Zeile übereinander, im Gegensatz zum ANTIC-Modus "4" ist hier aber jedes Pixel zwei Bildzeilen hoch. Auch der ANTIC-Modus "5" wird nicht vom BASIC unterstützt. Die Wahl der Farben ist in den ANTIC-Modi "4" und "5" identisch. "6" Dieser ANTIC-Modus wird vom BASIC als BASIC-Modus "1" unterstützt. Bei diesem Modus werden 20 Zei- chen pro Normalzeile abgebildet. Jedes Zeichen ist acht Pixel breit, ein Pixel belegt einen Farbtakt. Eine Zeile dieses Modus ist acht Pixel hoch, jedes Pixel ist eine Bildzeile hoch. Für die Zeichen stehen insgesamt fünf verschiedene Farben zur Verfügung. Mit den Bits 0 bis 5 der Daten des Bildspeichers (der Zeichennamen) wählt man das Zeichen aus. In diesem Modus besitzt der Zeichen- generator nur 64 Zeichen. Die Bits 6 und 7 wählen ein Farbregister aus: Bit7 Bit6 Farbregister 0 0 COLPF0 0 1 COLPF1 1 0 COLPF2 1 1 COLPF3 Für jedes Pixel steht im Zeichengenerator ein Bit zur Verfügung. Wenn dieses Bit "0" ist, hat das Pixel die Farbe aus COLBAK. Die Farbe des Farbre- gisters, das man über Bit 6 und 7 gewählt hat, erscheint überall dort im Zeichen, wo das ent- sprechende Bit des Zeichengenerators "1" ist. Dieser ANTIC-Modus eignet sich besonders zur Dar- stellung großer Schriften, also zum Beispiel für die Schaufensterwerbung. Die Technik der Farbwahl ermöglicht es, verschiedenfarbige Buchstaben mit 109
*** ATARI INTERN ANTIC *** dem gleichen Zeichengenerator zu erzeugen. Wer allerdings in einem Zeichen mehr als zwei Farben benötigt, muß die ANTIC-Gänge "4" oder "5" verwen- den. Für "normale" Schriften kann man ohne wei- teres den normalen Zeichensatz des Betriebssystems verwenden. "7" Dieser ANTIC-Modus entspricht dem BASIC-Modus "2". Die ANTIC-Modi "6" und "7" sind fast identisch. Sie unterscheiden sich lediglich in der Höhe der Zeilen. Während die Zeilen von ANTIC-Modus "6" acht Bildzeilen hoch sind, jedes Pixel also eine Bildzeile hoch ist, sind die Zeilen, die mit ANTIC-Modus "7" erzeugt werden, 16 Bildzeilen hoch. Jedes Pixel ist hier zwei Bildzeilen hoch. Damit eignet sich dieser Modus hervorragend für Überschriften und für die Werbung. Auch die Wahl der Farben für die Zeichen und den Hintergrund erfolgt im ANTIC-Modus "7" wie im ANTIC-Modus "6". Der Zeichengenerator kann ebenfalls übernommen werden. Auf der nächsten Seite folgt eine Übersicht über die ANTIC- Schriftgrafik-Modi. 110
*** ATARI INTERN ANTIC *** ANTIC-Modus "2" "3" "4" "5" "6" "7" Basic-Modus "0" --- --- --- "1" "2" Anzahl der Zeichen 40 40 40 40 20 20 pro Zeile Anzahl der Pixel 8 8 4 4 8 8 pro Zeichen (horizont.) Anzahl der Farbtakte 1/2 1/2 1 1 1 1 pro Pixel (horizont.) Anzahl der Pixel pro 8 8 8 8 8 8 Zeichen (vertikal) Anzahl der Bildzeilen 8 10 8 16 8 16 pro Zeile Anzahl der Bildzeilen 1 1 1 2 1 2 pro Pixel Anzahl der Farben 1,5 1,5 5 5 5 5 Anzahl der Buchstaben 128 128 128 128 64 64 pro Zeichensatz Anzahl der Bytes 1K 1K 1K 1K 512 512 pro Zeichensatz Anzahl der Bytes im 40 40 40 40 20 20 Bildspeicher pro Zeile Anzahl der Datenbits aus dem Zeichengenerator 1 1 2 2 1 1 pro Pixel 111
*** ATARI INTERN ANTIC *** ****************************************** * * * * * SCROLLING (VERSCHIEBEN DES BILDES) * * ---------------------------------- * * * ****************************************** Häufig existiert das Problem, mehr auf dem Bildschirm dar- stellen zu müssen, als Platz findet. Eine Möglichkeit wäre, das gesamte Bild nach bestimmten Tastenkommandos zu wech- seln, eine andere automatisch im Programmablauf zwischen den verschiedenen Bildern umzuschalten. Die meisten Mikrocomputern bieten höchstens die Auswahl zwischen zwei Bildspeichern und somit zwei Bildern. Möchte man zwischen mehr Bildern umschalten oder, wenn nur ein Bildspeicher vorhanden ist, überhaupt ein zweites Bild an- zeigen, muß der gesamte Inhalt des Bildspeichers von der CPU verschoben werden. Da dies für die CPU sehr arbeitsintensiv ist, geschieht es zu langsam, Störungen des Bildes sind kaum zu vermeiden. Der Atari bietet dagegen eine komfortable Möglichkeit, das Bild zu wechseln. Man braucht lediglich die Adresse des ANTIC-Programms zu wechseln. Wenn das ANTIC- Programm für beide Bilder identisch ist, reicht es aus, im ANTIC-Programm den Befehl, der die Adresse des Bildspeichers in den Bildspeicherzählers schreibt, jeweils abzuändern. Gerade bei der Bearbeitung großer Tabellen oder beim Schrei- ben von Texten mit mehr als 40 Zeichen pro Zeile, wird jedoch ein Bildwechsel als störend empfunden. Eine weitaus bessere Möglichkeit, mehr auf dem Bildschirm darzustellen, als auf einmal auf ihn paßt, ist es, das Bild vertikal oder horizotal in kleinen Schritten zu verschieben. Der Bildschirm fungiert nur noch als Fenster, durch das man ein größeres Feld betrachtet. Auf diese Art entsteht der Eindruck, auf einem großen Bild zu arbeiten. 112
*** ATARI INTERN ANTIC *** Auch dies ist beim Atari leichter möglich als bei anderen Mikrocomputern. Bei vielen anderen Geräten muß der gesamte Bildspeicherinhalt verschoben werden. Dabei ist der Rechen- aufwand der CPU enorm. Ein sich nur langsam verschiebendes Bild ist die Folge. Der Atari ermöglich es, für jede Zeile den Bildspeicherzähler neu durch das ANTIC-Programm laden zu lassen. Es können auch mehr Zeilen, als auf den Bildschirm passen, bereits im Speicher vorbereitet werden (ein Bild- speicher mit mehr Zeilen, als auf den Bildschirm passen, wird dazu angelegt). Soll das Bild verschoben werden, braucht man nur das ANTIC-Programm entsprechend zu ändern. Die Änderung des ANTIC-Programms erfordert weniger Rechen- aufwand als die Verschiebung des gesamten Bildspeicher- inhalts. BEISPIEL: --------- Der Bildschirm ist in zwei Teile zu unterteilen. Der obere Teil soll auf dem Bilschirm 16 Zeilen mit je 40 normalen Buchstaben umfassen, sich aber über ein Feld von 32 * 256 Zeichen bewegen lassen. Der untere Teil des Bildschirm soll 8 feststehende Textzeilen umfassen. Das Programm, das diesen Bildschirm benötigt, läßt den Arbeitsspeicher ab Adresse $5000 frei. Das folgende ANTIC-Programm liefert ein derartiges Bild: (alle Daten und Adressen hexadezimal): 113
*** ATARI INTERN ANTIC *** ADRESSE DATEN KOMMENTAR ------- ----- --------- das ANTIC-Programm für das Bild: 5000 70 70 24 Leerzeilen 70 5003 42 1. Bildzeile XPOS Bildspeicherzähler wird YPOS + $60 + 0 geladen 42 2. Bildzeile XPOS Bildspeicherzähler wird YPOS + $60 + 1 geladen 42 3. Bildzeile XPOS Bildspeicherzähler wird YPOS + $60 + 2 geladen 42 4. Bildzeile XPOS Bildspeicherzähler wird YPOS + $60 + 3 geladen . . . . . . . 42 15. Bildzeile XPOS Bildspeicherzähler wird YPOS + $60 + $e geladen 42 16. Bildzeile XPOS Bildspeicherzähler wird YPOS + $60 + $f geladen 5030 42 1. Zeile des 00 feststehenden Bildteils 55 Bildspeicherzähler laden 02 2. Zeile 02 3. Zeile 114
*** ATARI INTERN ANTIC *** . . . . . . . . 02 7. Zeile 02 8. Zeile 503a 41 springe nach $5000 und 00 warte auf das Ende der 50 Vertikalsynchronisation hier endet das ANTIC-Programm 5500 Beginn des Bildspeichers des feststehenden Bildteils (1. Zeile) 5528 2. Zeile des feststehenden Bildteils 5550 3. Zeile des feststehenden Bildteils 5578 4. Zeile des feststehenden Bildteils 55a0 5. Zeile des feststehenden Bildteils 55c8 6. Zeile des feststehenden Bildteils 55f0 7. Zeile des feststehenden Bildteils 5618 8. Zeile des feststehenden Bildteils 563f ENDE des Bildspeichers des feststehenden Bildteils 6000 Beginn des Feldes (mit 32 * 256 Zeichen) für den verschiebbaren Teil des Bildes 1. Zeile des Feldes 6100 2. Zeile des Feldes 6200 3. Zeile des Feldes 6300 4. Zeile des Feldes 6400 5. Zeile des Feldes 6500 6. Zeile des Feldes . . . . . . 7d00 31. Zeile des Feldes 7e00 32. Zeile des Feldes 7fff ENDE des Feldes für den verschiebbaren Teil des Bildes 115
*** ATARI INTERN ANTIC *** Dieses Beispiel ist bewußt sehr einfach aufgebaut. Bei jeder Änderung der "Position" des Bildes über dem Speicherfeld muß das ANTIC-Programm geändert werden. Es soll dabei nach dem im Beispiel angegebenen Muster erstellt werden. Für XPOS wird die horizontale Position im Speicherfeld eingesetzt, für YPOS die vertikale. Es muß darauf geachtet werden, daß XPOS nie größer als $d8 und YPOS nie größer als $10 wird. Ansonsten treten Fehler auf, weil die Zeilenenden des Bild- schirms die Zeilenenden des Speicherfeldes überschreiten. Das Beispiel nutzt den Speicher auch nicht besonders gut aus ( es hinterläßt große Lücken zwischen den einzelnen Spei- cherfeldern), dafür ergeben sich bei der Berechnung der Adressen aber meist "glatte" Werte. Natürlich kann man dieses Beispiel auch auf hochauflösende ANTIC-Modi übertragen. Allerdings wird dann sehr viel Ar- beitsspeicher für das Bildspeicherfeld benötigt. Das Ver- schieben von Bildteilen "lohnt" sich am meisten bei ANTIC- Modi, die wenig Speicherraum benötigen. Einen Nachteil hat die beschriebene Methode jedoch. Man erhält kein "pixelweise" ruhig abrollendes Bild, der Bild- schirm "springt" immer horizontal um ein Zeichen und verti- kal um eine Zeile. Der ANTIC bietet jedoch sehr komfortable Möglichkeiten zur Verschiebung von Bildteilen oder ganzen Bildern. Es ist mit dem ANTIC möglich, das Bild horizontal um einzelne Farbtakte und vertikal um einzelne Bildzeilen zu verschieben. Dabei bleiben die Spieler und Geschosse jedoch auf ihrer alten Position stehen. Sie werden durch die Verschiebungen nicht beeinflußt. Im ANTIC stehen zwei Register zur Verfügung, die die Fein- verschiebung des Bildes oder eines Bildteiles in horizonta- ler und vertikaler Richtung steuern. Für die horizontale Verschiebung, das horizontale Scrolling, ist Register HSCROL 54276 $d404 116
*** ATARI INTERN ANTIC *** zuständig. Die vertikale Verschiebung, das vertikale Scrolling, wird von Register VSCROL 54277 $d405 gesteuert. Von diesen Registern werden jedoch nicht unbedingt alle Bildzeilen beeinflußt. In jedem ANTIC-Befehl, der eine Er- zeugung von Bildzeilen zur Folge hat (also nicht in Leerzei- len-Befehlen), stehen zwei Bits zur Verfügung, die die hori- zontale bzw. die vertikale Verschiebung der von diesem Be- fehl erzeugten Bildzeilen einschalten. Auf diese Art ist es möglich, entweder das ganze Bild oder auch nur einzelne Teile des Bildes zu verschieben. Die horizontale Verschie- bung wird von Bit 4 des ANTIC-Befehls eingeschaltet. Für das Einschalten der vertikalen Verschiebung ist Bit 5 des ANTIC-Befehls zuständig. Hierbei muß der Teil des Bil- des, der horizontal verschoben wird, nicht mit dem identisch sein, der vertikal verschoben wird. Die vertikale Verschiebung -------------------------- Bei einem Grafik-Modus, der mit jedem ANTIC-Befehl nur eine Bildzeile erzeugt, kann mit der im Beispiel verwendeten Methode das Bild um einzelne Bildzeilen verschoben werden. Bei anderen Modi, zum Beispiel bei Schriftgrafik-Modi, er- zeugt jeder ANTIC-Befehl gleich mehrere Bildzeilen. Hier 117
*** ATARI INTERN ANTIC *** ergibt sich das Problem, daß mit der im Beispiel verwende- ten Methode das Bild nicht um einzelne Zeilen verschiebbar ist. Der ANTIC bietet mit dem VSCROL-Register die Möglichkeit, auch in ANTIC-Modi, die mehrere Bildzeilen erzeugen, das Bild um einzelne Bildzeilen zu verschieben. Es werden alle Bildzeilen, bei denen Bit 5 im ANTIC-Befehl gesetzt ist, um die Anzahl von Bildzeilen nach oben verschoben, die in VSCROL steht. Die letzte Zeile, die derartig verschoben wird, ist die erste Zeile, bei der Bit 5 des ANTIC-Befehls nicht gesetzt ist. Um zu verstehen, wie der ANTIC die Ver- schiebung erreicht, muß man sich zuerst den normalen Vorgang der Erzeugung der Bildzeilen vor Augen führen: Der ANTIC besitzt intern einen Zähler, der kontrolliert, welche Bildzeile der ANTIC-Programm-Zeile gerade abgebildet wird. Dieser Zähler wird in der Literatur auch oft als DCTR bezeichnet. DCTR steht dabei für "Deltacontrol", das Wort "Delta" wird in den meisten Naturwissenschaften für "Diffe- renz" verwendet. Dieser Zähler zählt die Bildzeilen von 0 bis zu einer höchsten Zahl, die durch den ANTIC-Modus be- stimmt wird. Diese höchste Zahl ist immer um eins niedriger als die Anzahl der Bildzeilen, die mit dem jeweiligen ANTIC- Modus erzeugt werden. Die folgende Tabelle soll noch einmal den Zählerhöchststand (das Maximum von DCTR) der einzelnen ANTIC-Modi zeigen: ANTIC-Modus Zählerhöchststand "2" 7 "3" 9 "4" 7 "5" 15 "6" 7 "7" 15 118
*** ATARI INTERN ANTIC *** "8" 7 "9" 3 "A" 3 "B" 1 "C" 0 "D" 1 "E" 0 "F" 0 Bei ANTIC-Modi, bei denen nur eine Bildzeile erzeugt wird, zählt der DCTR-Zähler nicht. Daher ist der Zählerhöchststand in diesen Modi auch "0". Bei diesen Modi ist eine Verschie- bung des Bildes um einzelne Bildzeilen auch ohne Benutzung von VSCROL möglich. Gewöhnlich wird durch das ANTIC-Programm ein Block von Zei- len definiert, der verschiebbar ist. Bei der Darstellung der ersten Zeile dieses verschiebbaren Blocks (der ersten Zeile, bei der Bit 5 des ANTIC-Befehls gesetzt ist), fängt DCTR nicht wie üblich mit "0" an zu zählen, sondern mit dem Wert, der in VSCROL steht. Dadurch fehlen Bildzeilen im oberen Teil der Zeile. Die Zeile ist nach oben gerückt worden. Alle weiteren Zeilen, bei denen Bit 5 des ANTIC-Befehls gesetzt ist, werden direkt an die letzte Bildzeile der jeweils vorhergehenden Zeile angefügt. Sie werden normal dargestellt. Da bei der ersten Zeile der verschiebbaren Zeilen oben Bildzeilen fehlen, ist der gesamte Block nach oben verschoben. Bei der ersten Zeile, bei der Bit 5 im ANTIC-Befehl nicht mehr gesetzt ist, beginnt der Zähler DCTR zwar bei "0", zählt aber nur bis zu dem Wert der in VSCROL steht. Dadurch erscheint diese Zeile als von unten gekürzt. Die erste Zeile, bei der Bit 5 des ANTIC-Befehls nicht mehr gesetzt ist, ist also die letzte Zeile, die nach oben verschoben wird. 119
*** ATARI INTERN ANTIC *** Es wäre unklug, den Wert im Register VSCROL (also die Anzahl der Bildzeilen, um die ein Bildblock nach oben gerückt werden soll), größer zu wählen, als den Maximalstand des DCTR-Zählers. Meistens werden die "überflüssigen" Bits ein- fach ignoriert, aber gerade bei ANTIC-Modus "3" kann es auch zu anderen Störungen kommen. Soll der gesamte Bildschirm oder nur die untersten Zeilen verschiebbar gemacht werden, so muß eine weitere Sache be- achtet werden: Wenn auch bei der letzten Zeile des Bildes Bit 5 des dazugehörigen ANTIC-Befehls gesetzt ist, rollt diese Zeile nicht in das Bild, sondern springt hinein. Der ANTIC kann nicht erkennen, daß es sich bei dieser Zeile um die letzte zu verschiebende Zeile handelt. Damit der ANTIC auch diese Zeile richtig behandelt, muß bei ihr Bit 5 des ANTIC-Befehls gelöscht werden. Jetzt kann der ANTIC erken- nen, daß dies die letzte zu verschiebende Zeile ist und er "rollt" auch diese Zeile ins Bild. Mit dem VSCROL-Register kann man das Bild natürlich nicht um mehr als eine Zeile, das heißt um eine bis 15 Bildzeilen, abrollen lassen. Meist möchte man das Bild aber über eine sehr viel größere Fläche bewegen. Um dies zu erreichen, muß die Technik der groben Verschiebung, die vorher im Beispiel verwendet wurde, mit der Feinverschiebung mit dem VSCROL- Register kombiniert werden. Beim Aufwärtsrollen eines nor- malen Textes, bei dem jeder ANTIC-Befehl 8 Bildzeilen er- zeugt (zum Beispiel ANTIC-Modus "2"), sollte man das Bild erst mit 7 Feinverschiebungen nach oben rollen. Statt einer (ohnehin nicht möglichen) achten Feinverschiebung, wird eine Grobverschiebung um eine Zeile vorgenommen und VSCROL wieder auf "0" gesetzt. Beim Abwärtsrollen wird dagegen zuerst die Grobverschiebung um eine Zeile vorgenommen. Gleichzeitig mit dieser Grobverschiebung, wird aber VSCROL auf "7" gesetzt. Die Verschiebungen um die nächsten sieben Bildzeilen sind reine Feinverschiebungen mit VSCROL. 120
*** ATARI INTERN ANTIC *** Auf diese Art erhält man ein Bild, das über eine Fläche, die nur durch den verfügbaren Speicherraum begrenzt wird, um einzelne Bildzeilen verschoben werden kann. Die folgende Grafik soll das Prinzip der vertikalen Ver- schiebung demonstrieren:
Die horizontale Verschiebung ---------------------------- Im Beispiel wurde gezeigt, wie das Bild um jeweils ganze Bytes des Bildspeichers horizontal verschoben werden kann. Bei der Verschiebung um ganze Bytes des Bildspeichers springt das Bild jedoch, da jedes Byte des Bildspeichers, je nach ANTIC-Modus, unterschiedlich viele Pixel in einer Bild- zeile, also auch unterschiedlich viele Farbtakte, erzeugt. 121
*** ATARI INTERN ANTIC *** Die folgende Tabelle zeigt noch einmal, welcher ANTIC-Modus in einer Bildzeile wieviele Farbtakte und Pixel pro Byte des Bildspeichers erzeugt: ANTIC-MODUS Anzahl der Pixel Anzahl der Farbtakte pro Byte des Bildspeichers und Bildzeile "2" 8 4 "3" 8 4 "4" 4 4 "5" 4 4 "6" 8 8 "7" 8 8 "8" 4 16 "9" 8 16 "A" 4 8 "B" 8 8 "C" 8 8 "D" 4 4 "E" 4 4 "F" 8 4 Zum Beispiel erzeugt im ANTIC-Modus "B" jedes Byte des Bildspeichers in zwei Bildzeilen je 8 Pixel. Diese 8 Pixel sind zusammen 8 Farbtakte breit. Anders ausgedrückt erzeugt ein Byte des Bildspeichers in diesem ANTIC-Modus in jeder der beiden Bildzeilen 8 Farbtakte. Der ANTIC bietet mit dem Register HSCROL eine Möglichkeit, das Bild auch um einzelne Farbtakte zu verschieben. Er verschiebt die Bildzeilen, bei deren ANTIC-Befehl das Bit 4 gesetzt ist, um die Anzahl von Farbtakten nach rechts, die in Register HSCROL steht. Dabei sind nur die untersten 4 Bits von HSCROL gültig. Das Bild läßt sich also nur um maximal 15 Farbtakte verschieben. Für darüber hinausgehende 122
*** ATARI INTERN ANTIC *** Verschiebungen gilt, wie beim vertikalen Verschieben, daß diese Art der "Feinverschiebung" mit der anfangs gezeigten Grobverschiebung kombiniert werden muß. Wenn der ANTIC einen Befehl liest, bei dem Bit 4 gesetzt ist, unterdrückt er eine, dem Inhalt von HSCROL entspre- chende, Anzahl von Farbtakten (und somit Pixeln) am Anfang jeder, zu diesem ANTIC-Befehl gehörigen, Bildzeile. Der ANTIC benötigt zur Darstellung von horizontal verschobe- nen Zeilen mehr Daten, als bei der Darstellung von Normal- zeilen, da ja zum Beispiel bei Textmodi mit 40 Zeichen pro Zeile, links das 41. Zeichen auftaucht. Daher holt der ANTIC sich, wenn im Register DMACNTL das schmale Spielfeld gewählt wurde, pro Zeile die Anzahl von Bytes aus dem Speicher, die sonst beim normalen Spielfeld pro Zeile verwendet werden. Bei normaler Spielfeldbreite liest der ANTIC die Anzahl von Bytes, die er sonst beim breiten Spielfeld lesen würde. Beim breiten Spielfeld kommt kein Wechsel der Byteanzahl in Frage, es wird Hintergrundfarbe eingeschoben. Normalerweise wird man bei Verwendung der horizontalen Fein- verschiebung ohnehin bei jedem ANTIC-Befehl den Bildspei- cherzähler neu setzen (wie auch im Beispiel). Daher ist es nur bedingt interessant, wieviele Bytes der ANTIC tatsäch- lich für eine Zeile liest. Man muß lediglich darauf achten, daß der ANTIC keine Bytes aus Speicherstellen, die hinter dem eigentlichen Zeilenende liegen, liest. Außerdem ist wichtig, daß bei horizontaler Verschiebung am Ende einer Zeile meist ein weiteres Zeichen auftaucht (bei Modi mit 40 Zeichen pro Zeile das 41. Zeichen). 123
*** ATARI INTERN ANTIC *** 124