★ CODING ★ Die "Neuen" geknackt : So nutzen Sie die zusätzliche Power der CPC-"plus"-Serie ★ |
Asic - Die Neuen Geknackt (CPC Amstrad International) |
Daß der CPCplus über spezielle Hardware-Eigenschaften verfügt, die die herkömmlichen CPCs nicht haben, hat sich inzwischen herumgesprochen. Wir zeigen Ihnen jetzt, wie man das Plus im "plus" programmiert - mit BASIC und Assembler. Assembler-Freaks dürfen den Entwicklern bei Amstrad dankbar sein: Hat man doch dort die zusätzlichen "Juwelen" des 464plus und des 6128plus so angelegt, daß diese sich von der Maschinenebene aus sehr angenehm ansprechen lassen. Anders steht die Sache leider bei BASIC. Hier muß man praktisch alle Funktionen über die Befehle PEEK, POKE, INP und OUT realisieren. Es gibt nämlich keine BASIC-Be-fehle, die die neue Hardware direkt unterstützen. Beherrscht man allerdings die vier genannten Befehle, so hat auch der reine BASIC-Programmierer die Möglichkeit, sich zum Beispiel seine eigenen Sprites zu generieren und diese pixelweise zu bewegen. Bevor nun genauer von der Hardware-Programmierung die Rede ist, ein paar allgemeine Infos: Die neuen CPCs haben insgesamt 16 Hardwaresprites, von denen jedes in einer Matrix aus 16 Punkten horizontal und 16 Zeilen vertikal angeordnet ist. Ein Sprite hat also insgesamt immer 16x 16 = 256 Pixel. Jedes dieser 256 Pixel kann entweder durchsichtig sein (man sieht auf dem Bildschirm den Untergrund), öderes hat eine von 15 Farben. Welche 15 von den 4096 möglichen Farben zum Einsatz kommen, kann gesondert programmiert werden. Des weiteren spielt es keine Rolle, welcher Bildschirmmodus gerade aktiv ist. So hat ein Sprite in Mode 0 und in Mode 2 dieselbe Größe und immer 15 verschiedene Farben plus durchsichtig. Die Sprites werden auch stets in Mode-2-Koordinaten bewegt, es stehen also 640 mal 200 Punkte zur Verfügung. Hat man beispielsweise Mode 0 mit 160 mal 200 Punkten aktiviert, so kann man die Sprites trotzdem an eine von 640 X-Koordinaten bewegen. So ist es zum Beispiel möglich, einen Mode-0-Pixel zu einem Viertel, zu einer Hälfte, zu drei Vierteln und natürl ich auch ganz zu überdecken. Man verwendet dazu natürlich kein Sprite, das komplett als durchsichtig definiert worden ist, da es in diesem Fall auch nichts überdecken könnte. Verdoppelte Sprites Wie erwähnt haben alle Sprites 16 Pixel auf 16 Pixelzeilen. In ihrer geringsten Größe haben sie eine Ausdehnung von zwei Mode-2-Zeichen horizontal und zwei Zeilen vertikal. Nun ist es aber möglich, jedes einzelne Sprite in X-und Y-Richtung zu zoomen. Man kann ein Sprite also beispielsweise in X-Richtung verdoppeln oder sogar vervierfachen. Zoomt man ein Sprite also maximal, das bedeutet eine Vervierfachung in X- und Y-Richtung, so hat es eine Ausdehnung von acht Mode-2-Zeichen auf 8 Zeilen. Dieses Sprite ist demnach doppelt so hoch wie breit. Die Ausdehnung der Sprites läßt sich für jedes einzeln definieren. Wenn man ein Sprite zoomt, behält es aber trotzdem seine Pixelanzahl, so daß sich bei einer Sprite-Verdoppelung nicht die Pixelzahl, wohl aber die Pixelgröße verdoppelt. Stellt man ein Sprite im kleinstmöglichen Formal dar, so ist ein einzelnes Pixel mit dem bloßem Auge nicht auszumachen. Wogegen ein Sprite, das in maximaler Größe dargestellt wird, jedes Pixel erstaunlich groß erkennen läßt. Man muß hierbei immer einen Kompromiß zwischen der Ausdehnung eines Sprites und der Schärfe seiner Pixel schließen. 4096 Farben in allen Modi So, und nun zu den Farben. Die CPCs der "plus"-Reihe haben 4096 verschiedene Farben im Gegensatz zu den 27 Farben der älteren CPCs. Trotzdem können maximal 16 Farben gleichzeitig dargestellt werden, wie dies auch schon bei den alten CPCs der Fall war. Bei den neuen CPCs kann man nun aber für jeden PEN einzeln den Blau-, den Grün- und den Rot-Anteil wählen. Diese drei Parameter können Werte zwischen 0 und 15 annehmen. Daraus ergeben sich 16x16x16 = 4096 Kombinationsmöglichkeiten. Nun ist es aber so, daß das Betriebssystem der CPCsjede 1/50 Sekunde die Farben neu initialisiert. Das hat zur Folge, daß die Auswahl einer der neuen Farben spätestens nach 1 /50 Sekunde wieder neutralisiert wird. Will man also die neuen Farben nutzen, so muß man die Interrupts ausschalten. Dies funktioniert allerdings nur in Assembler mit dem DI-Befehl. Es besteht jedoch die Möglichkeit, die Interrupts auch durch die Manipulation eines Bytes im Memory-Mapped-Bereich zu desaktivieren. So kann man die 4096 Farben auch unter BASIC verwenden. Leider funktioniert die Tastaturabfrage bei ausgeschalteten Interrupts nur noch unvollkommen beziehungsweise gar nicht mehr. Das eingeschobene Bild Außerdem haben die Neuen noch einige zusätzliche Fähigkeiten spendiert bekommen. So wird zum Beispiel von der Hardware ein kompletter zweiter Bildschirm verwaltet. Dieser kann ra-sterzeilenweise von unten her über den normalen Bildschirm geschoben werden. So ist es unter anderem möglich, ein Bild von unten in den Screen einlaufen zu lassen oder ein Bild so nach unten fallen zu lassen, daß es den Blick auf ein darunterliegendes Bild freigibt. Diese Effekte arbeiten natürlich pixelweise und ohne Rucke Iii. Diesen Effekt demonstriert das Programm "Bildschirmeinblendung". Es gibt aber auch eine andere Art des Scrollings. Der Bildschirm kann nun pixelweise in X- und Y-Richtung verschoben werden. Kombiniert man dies, so ist es möglich, den Bildschirm mittels Softscrolling in fast beliebigen Winkeln zu verschieben. Nun noch etwas zum Analog-Port. Damit läßt sich jeder handelsübliche PC-Joystick anschließen und mittels PEEK von BASIC aus abfragen. Die Auswertung ist allerdings nicht so leicht, aber in dem Listing "Abfrage des Analogports" einfach nachzuvollziehen. Bevor man nun all die wunderbaren neuen Eigenschaften der neuen CPCs nutzen kann, muß man noch einige Hindernisse aus dem Weg räumen. Nach dem Einschalten eines der neuen CPCs verhält sich dieser praktisch wie ein normaler 6128. Die Zusatzhardware muß erst durch einen speziellen Code aktiviert werden. Dieser Code funktioniert nachfolgendem Prinzip: An das CRTC-Adreßregister wird eine Reihe von 16 Bytes gesendet, welche unbedingt aufeinanderfolgen müssen. Hierein Beispiel, wiedas unter Assembler mit dem Programm MAX AM aussehenkönnte: org &A000 ;ab &A000 im Speicher |
Binär | Hex | Auswirkung |
00000101 | &05 | Sprite wird in X-und Y-Richtung normal groß dargestellt. |
00000110 | &06 | in X-Richtung normal, in Y-Richtung doppelte Größe. |
00000111 | &07 | in X-Richtung normal, in Y-Richtung vervierfacht. 00001001 &09 in X-Richtung verdoppelt, in Y-Richtung normal. |
00001001 | &09 | in X-Richtung verdoppelt, in Y-Richtung normal. |
00001010 | &0A | in X- und Y-Richtungdoppeltso groß dargestellt. |
00001011 | &0B | in X-Richtung verdoppelt, Y-Richtung vervierfacht. |
00001101 | &0D | in X-Richtung vervierfacht, Y-Rich-tung normal groß. |
00001110 | &0E | X-Richtung vervierfacht, Y-Richtung verdoppelt. |
00001111 | &0F | X- und Y-Richtung in vierfacher Größe (max.mögl. Ausdehnung). |
Der Speicherbereich von &6400 bis &643F ist für die gesamte Farbinformation zuständig. Hier werden sowohl die 16 Pens und der Border als auch die 15 Sprite-Pens verwaltet. Für jeden der 16 normalen Pens, den Border (die es auch in den alten CPCs schon gab) und für die Sprite-Pens stehen je zwei Bytes zur Verfügung. Die ersten 16 Bytepaare geben die Farbinformation dernormalen Grafikpens an (&6400 bis &641F). Die Farbinformation, in der Pen 0 (also der Bildschirmuntergrund) erscheint, ist in den Bytes &6400 und &6401 enthalten. Pen 1 wird von &6402 und &6403 bestimmt. Danach folgt Pen 3 und so weiter, bis alle 16 Pens durch sind. Die Farbinformation der 16 Pens ist also im Speicherbereich von &6400 bis &641F codiert. Danach folgt der Border. Für seine Farbe sind die Bytes &6420 und &6421 verantwortlich.
Bytepaare
Im Bereich von &6422 bis &643F ist die Farbinformation der 15 Sprite-Pens enthalten, Sprite-Pen 1 benutzt die Adressen &6422 und &6423, danach folgen in aufsteigender Reihenfolge die anderen Sprite-Pens. Diese Farbtabelle endet mit den Adressen &643E und &643F, die die Farbe von Sprite-Pen 15 zur Verfügung stel len. Nun will ich etwas genauer auf den Aufbau dieser Bytepaare eingehen. In ihnen ist die Farbinformation getrennt nach den drei Farben Rot, Blau und Grün verschlüsselt. Das höherwertige Nibble (die oberen vier Bits) des ersten der zwei Bytes eines Bytepaars enthält den digitalen Wert des Rotanteils des entsprechenden Pens. Das niederwerti-ge Nibble (die unteren vier Bits) enthält den Wert des Blauanteils. Und schließlich enthält das niederwertige Nibble des zweiten Bytes eines jeden Bytepaars den Grünanteil der Farbinformation. Das höherwertige Nibble ist beim zweiten Byte bedeutungslos. Der Rot-, Blau- und der Grünanteil der einzelnen Pens können Werte von 0 bis 15 annehmen. Hierbei steigt die Helligkeit mit der Zunahme des Wertes an. Also ergibt zum Beispiel ein Blauanteil von Heine hellere Farbe alsein Blauanteil von 4. Je eins dieser Bytepaare hat folgenden Aufbau:
Erklärung: r, b und g haben je 4 Bit (r = Rot, b = Blau, g = Grün). Die Nibbles r, g und b bestimmen die jeweilige Pen-, Border- oder Spritefarbe. Es gibt 16 (Rot) x 16 (Blau) x 16 (Grün) = 4096 Kombinationsmöglichkeiten, also 4096 Farben.
Ab &6800 folgen noch einige Bytes, die für verschiedene Features verantwortlichsind.
Da wäre zuerst einmal die Adresse &6800. Ihr Standardwert ist Null, schreibt man allerdings einen anderen Wert hinein, so werden alle Interrupts desaktiviert. Will man die Interrupts wieder aktivieren, so schreibt man einfach den Wert Null in die Adresse &6800 zurück.
Mit dem Byte in &680I läßt sich die Anzahl der angezeigten Rasterzeilen minus I bestimmen. Die erste Rasterzeile ist auch die erste und zugleich oberste des Bildschirmspeichers. Es lassen sich Werte von 0 bis &FF eintragen. Jeder andere Wert entspricht 199. Unterhalb der durch Adresse &6801 bestimmten Rasterzeilen wird ein zweiter Bildschirm angezeigt. Dieser Bildschirm kann in einem der vier 16-kByte-Blöcke der ersten 64 kByte liegen. Es bietet sich hier nur der Bereich von &4000 bis &3FFF an, da man die anderen Blöcke kaum vernünftig nutzen kann. Lediglich bei der Auswahl des Blocks von &C000 bis &FFFF kann man eventuell einige neue Video-effektc nutzen, da dann derselbe Bildschirm zweimal angezeigt wird. Verwendet man aber den Block von &4000 bis &7FFF, so läßt sich damit durchaus professionell arbeiten. Wie wird aber nun der RAM-Bereich dieses zweiten
Bildschirms ausgewählt? Man nutzt dazu die Adressen &6802 (High) und &6803 (Low).
Diese Adressen entsprechen den CRTC-Registern 12 und 13, die für den normalen Bildschirm zuständig sind. Dabei entspricht &6802 dem Register 12, und die Adresse &6803 stellt Register 13 zur Verfügung. Beispiel: Will man den Block von &4000 bis &7FFF als zweiten Bildschirm nutzen, so schreibt man in Adresse &6802 den Wert &30 und in Adresse &6803 den Wert &00. Will man den Bildschirm softscrollen, dann muß man dies mit dem Byte in Adresse &6804 bewerkstelligen. Das höherwertige Nibble gibt an, um wie viele Mode-2-Pixel das Bild nach rechts gescrollt werden soll. Es sind Werte von 0 bis 15 erlaubt. Das nieder-wertige Nibble in &6804 gibt an, um wie viele Pixel das Bild nach oben verschoben werden soll. Auch hier sind Werte von 0 bis 15 erlaubt. Will man die 4 Bit jeweils voll ausnutzen, so sollte man gleichzeitig in X- und Y-Richtung, also nach rechts oben, serollen. Es treten hier manchmal einige X- und Y-Kombinationen auf, so daß sich nur Werte von 0 bis 7 nutzen lassen, aber wie auch sonst geht hier Probieren über Studieren.
Abfrage des PC-Joysticks
In Adresse &6808 kann der X-Wert des PC-Joysticks abgefragt werden, in der Adresse &6809 der Y-Wert. Der X- und auch der Y-Wert liegen zwischen &00 und &3F.
Ist der PC-Joystick optimal eingestellt, sollten X- und Y-Wert zwischen 31 und 32 dezimal schwanken. Durch die einfache Abfrage mittels PEEK ist es sehr leicht möglich, mit dem CPC analoge Daten zu erfassen und dem Programm digital mitzuteilen.
Im Bereich von &6C00 bis &6C0F wird der DMA-Sound verwaltet. Wie dieser jedoch im einzelnen programmiert wird, ist ein nicht ganz leichtes Kapitel. Dazu also ein andermal. Auch ohne DMA-Sound haben nun sicher alle "plus"-Freunde genug Experimentierstoff bis zum nächsten Heft.
|