CODING ★ Die "Neuen" geknackt : So nutzen Sie die zusätzliche Power der CPC-"plus"-Serie ★

Asic - Die Neuen Geknackt (CPC Amstrad International)
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

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
di ;Interrupts aus
ld e,&10 ; 16 Durchlaeufe
ld hl, daten; Zeiger auf 16 Datenbytes
ld b, &bc ; CRTC Adressregister
loop ldc, (hl) ;Datenbyte aus Speicher in c
out (c), c ;Daten an Port &bcXX schicken ( Lowbyre egal )
inc hl ; naechsces Datenbyte selektieren
dec e ; Zaehler minus 1
jr nz, loop ; Noch ein Byte da ?, dann nochmals
ei ; Interrupts freigeben
ret ;fertig
daten db &ff,0,&ff,&77,&b3,&51,&a8,&d4,&62,&39,&9c,&46,&2b,&15, &8a,&cd

Und das entsprechende Listing in BASIC:

10 OUT &7f00,&84
20 FOR a=1 TO 17
30 READ d
40 OUT &BC00, d
50 NEXT a
60 OUT &7FFF, &B8
70 DATA &FF,&00,&FF, &77,&B3,&51, &A8
80 DATA 4D4,&62,&39,&9C, &46, &2B, &15
90 DATA &8A, &CD,&EE

Diese Routine muß gestartet werden, bevor man das Listing zur Bild-schirmeinblendung startet. Nach dem Aufruf dieser Routine ist die neue Hardware erst zu gebrauchen. Mit OUT &7F00,&B8 wird ein 16 kByte großes Fernster im Speicher geöffnet, dies reicht von &4000 bis &7FFF. Nur wenn man dieses Fenster im Speicher geöffnet hat, kann man die Zusatzhardware ansprechen. Will man wieder normal arbeiten, so schließt man dieses Fenster mit OUT&7F00,&A0. Dieser 16-kByte-Speicherbereich (Memory Mapped) hat folgenden Aufbau:

Im Bereich von &4000 bis &4FFF befinden sich die Daten der 16 Sprites. Für jedes Sprite stehen 256 Bytes zur Verfügung. Die ersten 16 Bytes stellen die ersten 16 Pixel der ersten Pixelzeile eines Sprites dar. Das erste Byte ist das Pixel links oben, das nächste Byte ist für das Pixel rechts daneben. Ab dem 17. Byte geht es in der zweiten Pixelzeile mit dem Pixel ganz links weiter. Es werden also alle Pixel von links oben bis rechts unten der Reihe nach durchnumeriert. Das erste Sprite hat seine Grafikdaten ab &4000. Das erste Byte des ersten Sprites liegt also auf &4000, das zweite Byte auf &4001. Das gehl so weiter bis zum 256. Byte, das beim ersten Sprite auf &40FF liegt. Das zweite Sprite hat seinen Grafikdatenblock von &4100 bis &41 FF...

Memory Mapped

In jedem Byte, das die Grafikdaten der verschiedenen Sprites enthält (also von &4000 bis &4FFF), lassen sich aber nur die unteren vier Bits nutzen, so daß man diese Bytes nur mit Werten von 0 bis 15 beschreiben kann. Bei anderen Werten werden einfach die höherwertigen Bits abgeschnitten. Enthält eines dieser Grafikbytes eine Nu 11, so bedeutet dies, daß das Sprite an diesem Pixel durchsichtigist. Werte von 1 bis 15 stellen sozusagen einen von 15 Sprite-Pens dar. Weiche Farbe diese Sprite-Pens haben, wird gesondert definiert.

4000 - 40FF Daten für Sprite 0
4100 - 41FF Daten für Sprite 1
4200 - 42FF Daten für Sprite 2
...
4F00 - 4FFF Daten für Sprite 15

Im Bereich von &6000 bis &607F ist die Information über die X- und Y-Koordinaten sowie über die Ausdehnung aller 16 Sprites gespeichert. Jedem Sprite stehen acht Bytes zur Verfügung. Das erste Sprite benutzt beispielsweise die Bytes von &6000 bis &6007, das zweite Sprite die Bytes von &6008 bis &600F. Das geht so weiter bis zum 16. Sprite, welches die acht Bytes von &6078 bis &607F benutzt. Die Funktion dieser 16 mal 8 Byte ist für jedes Sprite identisch. Die jeweils fünften, sechsten, siebten und achten Bytes eines Sprites sind stets vollkommen identisch und haben auch immer dieselbe Funktion. Am Beispiel von Sprite 0 soll der genaue Aufbau dieser Datenbytes deutlich werden.

Adresse &6000 &6001 &6002 &6003 &6004 - &6007
Funktion XX 0X YY &00 oder &FF Zoomfaktor

In Adresse &6000 (Lowbyte) und &6001 (Highbyte) wird die X-Koordi-nate des ersten Sprites angegeben, es sind Werte von 0 bis &0FFF möglich. Da hierbei in Pixeln gerechnet wird, lassen sich aber nur die Werte von 0 bis 639 nützlich anwenden. In Adresse &6002 ist die Y-Koordinate einzutragen. Hier sind Werte von 0 bis &FF möglich, wobei sich wieder nur die Werte von 0 bis 199 nutzen lassen (200 Rasterzeilen).

Generell beziehen sich die X- und Y-Koordinaten auf die linke obere Ecke des Sprites.

Mit Hilfe von Byte &6003 läßt sich das Sprite einschalten (Werl &00) oderausschalten (Wert &FF). Das bedeutet, dieses Byte entscheidet darüber, ob das Sprite auf dem Bildschirm überhaupt dargestellt wird oder nicht. Und nun zu den Bytes in &6004, &6005, &6006 und &6007. Wie gesagt haben alle vier dieselbe Funktion, und es ist egal, mit welchem der vier man arbeitet. Aufgabe dieser Bytes ist es, die Ausdehnung des Sprites auf dem Bildschirm festzulegen. Von den vier Bytes werden jeweils nur die unteren vier Bits benutzt, das obere Nibble ist bedeutungslos. Der Standardwert ist hier&05 (das heißt in X-und Y-Richtung normale Ausdehnung).

Aufschlüsselung der unteren vier Bits: Binärformat: 0000XXYY Hierbei stellen XX und Y Y die Ausdehnung des Sprites in X- oder Y-Richtung dar.

Werte für XX oder YY:

00 ==> Sprite wird nicht dargestellt.
01 ==> Sprite in Normalgröße
10 ==> Sprite verdoppelt
11 ==> Sprite wird vervierfacht

Eines der vier Bytes von &6004 bis &6007 wird ausgewählt und beschrieben, dabei ergeben sich folgende Funktionen:

BinärHexAuswirkung
00000101&05Sprite wird in X-und Y-Richtung normal groß dargestellt.
00000110&06in X-Richtung normal, in Y-Richtung doppelte Größe.
00000111&07in X-Richtung normal, in Y-Richtung vervierfacht. 00001001 &09 in X-Richtung verdoppelt, in Y-Richtung normal.
00001001&09in X-Richtung verdoppelt, in Y-Richtung normal.
00001010&0Ain X- und Y-Richtungdoppeltso groß dargestellt.
00001011&0Bin X-Richtung verdoppelt, Y-Richtung vervierfacht.
00001101&0Din X-Richtung vervierfacht, Y-Rich-tung normal groß.
00001110&0EX-Richtung vervierfacht, Y-Richtung verdoppelt.
00001111&0FX- 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:

rel.Byte 0 1
Funktion rb 0g

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.

Stefan Stumpferl, CPCAI9204

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» Stefan  Stumpferl-Die  Neuen  Geknackt    (CPC  Amstrad  International)    GERMANDATE: 2020-04-26
DL: 237
TYPE: ZIP
SiZE: 5Ko
NOTE: 40 Cyls
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Basic - Moving Basic
» Coding » Basic - Compatibilite Graphics Pen - Graphics Paper
» Coding » Bug du MERGE (CPC Revue)
» Coding Src's » Disassembly of AMSDOS ROM CPCplus
» Coding » Clefs1 31 Adr Exec Basic 464
» Coding » LOGON CPCPLUS 38: Dessinez en 4096 couleurs
Je participe au site:
» Vous avez des infos personnel ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 215 millisecondes et consultée 1406 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.