APPLICATIONSDIVERS ★ BEFEHLSERWEITERUNG HARDCOPY/WEICHE HARDCOPY ★

Befehlserweiterung Hardcopy/Weiche HardcopyApplications Divers
★ 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 ★ 

Fast jeder Schneider-Besitzer schwärmt von den Grafikfähigkerten seines Computers. Was dem CPC aber fehlt, ist eine Routine, um Bilder auch auszudrucken. Mit einer RSX-Erwerterung kann man diesen Mangel elegant beheben.

Das Basic des Schneider CPC 464 ist sehr umfangreich. Trotzdem fehlen einige nützliche Befehle. Zum Beispiel gibt es keine Anweisung, mit der der Bildschirminhalt direkt auf dem Drucker ausgegeben wird. Routinen, die einen Hardcopy-Befehl in das Betriebssystem einbinden, gibt es viele. Ihr Fehler ist aber, daß sie sich meist auf nur einen Drucker beziehen.

Jeder, der sich mit dem Bildschirmaufbau des CPC beschäftigt hat. weiß, daß dieser Aufbau etwas ungewohnt ist: man kann nicht einfach Bit für Bit auslesen und an den Drucker übergeben. Was man beachten muß, um sich eine Hardcopy-Routine zu schreiben, das lesen Sie hier. Wollen Sie hingegen nur ein Hardcopy-Programm haben, das auch mit Ihrem Drucker zusammenarbeitet, dann tippen Sie einfach Listing 1 ab.

Bild 1. So wird ein Zeichen auf dem Bildschirm verschlüsselt >>

Um den Bildschirmaufbau des CPC 464 verstehen zu lernen, schreiben wir mit »MODE 2: PRINT ' A« das Zeichen »A« in die linke, obere Ecke des Bildschirms. Da jedem Punkt genau ein Bit im Bildschirmspeicher entspricht, entsteht daraus ein Bitmuster wie im Bild 1 zu sehen ist. Jeweils acht nebeneinanderliegende Bits sind zu einem Byte zusammengefaßt. Jeder Rasterzeile entspricht ein eigenes Byte. Schön wäre es, wenn diese acht Bytes im Speicher hintereinander abaeleqt wären. Das sind sie aber leider nicht. Sie liegen vielmehr nach dem Schema in Bild 2 verteilt: jede der 2000 möglichen Zeichenpositionen enthält acht Rasterzeilen. Dabei stehen zunächst alle 2000 »ersten Rasterzeilen« hintereinander im Speicher, danach folgen die 2000 »zweiten Rasterzeilen« und so weiter bis hin zur letzten (achten) Zeile. Die Zahl 2000 ist ein bißchen weniger als 2048 oder 2n. Für jede 2000-Zeichen-Gruppe einer bestimmten Rasterzeile ist deshalb im Speicher der Einfachheit halber ein Speicherbereich von 2048 Byte reserviert, die damit 48 Byte »zu viel« belegen. Diese acht Gruppen beginnen an den Positionen &C000, &C800, &D000, &D800, ... &F800

Da alle 2048 Byte langen Blöcke (entspricht jeweils einer Sammlung einer bestimmten Rasterzeile aller Zeichenpositionen) gleich organisiert sind, folgen die 8 Byte einer Zeichenposition in 2048-Byte-Schrit-ten aufeinander.

Probieren Sie das einmal aus: Geben Sie »FOR i=(irgendeine Zahl im Bereich 49152 bis 51199) TO 65535 STEP 2048:POKE i,255:NEXT« ein. Wenn Sie nicht gerade einen vom Bildschirm nicht benutzten Speicherplatz als Startwert ausgewählt haben, erscheint (im Modus 2) auf dem Bildschirm ein weißer Fleck, der genau den Raum eines Zeichens ausfüllt. Die Position ist nur von dem oben gewählten Startwert abhängig. Experimentieren Sie ein wenig und ändern Sie diesen Startwert (beispielsweise um die Werte 80,160,1,2 und andere). Daraus läßt sich die interne Struktur einer 2048 Byte-Rasterzeilengruppe erschließen (Bild 3). Die 80 Spalten x 25 Zeilen = 2000 Byte sind wie erwartet in der Reihenfolge angeordnet, die Ihrer tatsächlichen Zeichenposition auf dem Bildschirm entspricht: Zuerst die 80 Bytes der ersten Zeile, dann die der zweiten, bis hin zur 25. Zeile. Am Ende jeder Rasterzeile folgen noch die 48 unbelegten Bytes.

<< Bild 2. Der Aufbau des Bildschirm Speichers

Der Anfang dieses 2048-Byte-Bereichs liegt jedoch keineswegs fest, sondern kann sich irgendwo im Speicher befinden. So liegt beispielsweise die erste Rasterzeile der linken oberen Bildschirmecke normalerweise nicht an der ersten Speicherstelle des zugehörigen 2048-Byte-Bereichs, sondern irgendwo innerhalb dieses Bereichs. Dadurch wird nämlich das sehr schnelle Scrollen des Bildschirms möglich. Dem Videointerface wird nur übermittelt, wo es die linke obere Ecke des Bildschirms im Speicher »finden« kann. Der Bildaufbau beginnt hier. Ändert sich die Start-adresse. so muß nur der neue Wert übergeben werden. Das Scrollen (oder sonstiges Verschieben) des Bildschirms erfordert nur eine Parameterübergabe, ohne daß die ganzen 16 KByte des Bildschirmspeichers umgelagert werden müssen. Dieses können Sie ganz einfach vom Basic aus simulieren. Geben Sie einmal die Befehlsfolge »OUT &BCFF, &OC:OUT &BDFF.N1 OR &30:OUT &BCFF.&OD:OUT &BDFF.N2« ein, wobei Sie NI und N2 im Bereich von 0 bis 255 beliebig wählen dürfen. Das funktioniert allerdings nur. wenn unmittelbar nach Eingabe dieser Zeile kein automatisches Bildschirmscrolling durchgeführt wird. Positionieren Sie also vor Eingabe der Befehlsfolge den Cursor mindestens fünf Zeilen oberhalb der letzten Bildschirmzeile.

Durch diese etwas ungewohnte Beschaltung giht es aber noch eine Besonderheit zu beachten. Wenn das Videointerface den Speicher betrachtet, sieht es einen 2048-Byte-Bereich aus Bild 3 nicht als einen Ausschnitt aus dem gesamten 64-KByte-RAM-Bereich. sondern als geschlossenen Ring. Für das Interface folgt also auf die Adresse &C000 + 2047 nicht die Adresse &c000+2048. sondern wieder die Anfangsadresse &C000+0. Entsprechendes gilt natürlich für die anderen Rasterzeilenbereiche. Ein Beispiel: Steht die erste Rasterzeile des ersten Zeichens der zweiten Bildschirmzeile an der Position &C7FF, so steht die erste Rasterzeile des zweiten Zeichens der Zeile nicht an der Postion &C800, sondern an der Position &C000. Diese Besonderheit gilt es bei Arbeiten mit dem Bildschirmspeicher zu beachten.

Prinzipiell genauso aufgebaut ist der Bildschirm im Modus 1 und im Modus 0, nur daß dort jeweils mehrere Bits zu einem einzigen (dafür mehrfarbigen) Punkt zusammengeschlossen sind. Ttesten Sie das einmal, indem Sie das erste Experiment im Modus 1 oder 0 und mit anderen zu POKEnden Werten (statt 255) durchführen.

Druckerausgabe im Grafikmodus

Gegenüber dem doch komplizierten Bildschirmaufbau ist die Grafik-Ausgabe auf den Drucker relativ einfach. Während der Druckkopf über das Papier fährt, kann angegeben werden, welche der sieben übereinander angeordneten Nadeln jeweils auf das Papier schlägt. In der Praxis sieht das so aus, daß man dem Drucker für die Grafikausgabe mitteilt: »Interpretiere die soundsoviel folgenden Signale nicht mehr als Buchstaben, sondern betrachte sie als direkte Anweisungen, welche Nadeln auf das Papier schlagen sollen«. Gibt man danach beispielsweise »PRINT #8,CHR$(65);« ein. so erscheint nicht mehr ein »A« auf dem Papier, sonder 65 steht für eine bestimmte Kombination von gesetzten und nichtgesetzten Nadeln. Sinnigerweise entspricht diese Zuordnung des Code-Zustands des Druckkopfes genau dem Binärcode. Der Wert 65 = &x01000001 bedeutet also, die unterste Nadel und die siebte Nadel von unten sind gesetzt. Wenn Sie einen NLQ 401 oder einen dazu kompatiblen Drucker besitzen, dann sollten Sie jezt »PRINT #8,CHR$(27)"K,'CHR$(50)CHR$(0);: FOR i = 1 TO 50:PRINT # 8.CHR$(65);: NEXT: PRINT # 8« eingeben. Das Ergebnis ist eine waagrechte Doppellinie. Experimentieren Sie auch mit anderen Werten in der Schleife »CHR$(27)"K«ist dabei die oben erwähnte Mitteilung an den Drucker die folgenden Signale als Grafikzeichen zu interpretieren. »CHR$(50) CHR$(0)« ist das Low- und High-Byte der Anzahl der Grafikzeichen. Passen dieser Wert und der Wert in der Schleife nicht zusammen, werden vielleicht einige »normale« Zeichen verschluckt und als Grafikzeichen ausgegeben oder umgekehrt.

Bild 3. Der Bildspeicher wird Im »Kreisverkehr« bearbeitet >>

Seien Sie aber nicht enttäuscht, wenn der Drucker das Gewünschte nicht sofort ausdruckt. Meistens sammelt er die Daten so lange, bis ein Zeilenvorschub erfolgt und gibt dann erst alle Daten auf einmal aus. Schicken Sie deshalb nach jeder Ausgabe eine Leerzeile »PRINT #8« an den Drucker.

Sie sehen, daß die Ausgabe von Grafiken an den Drucker im Prinzip gar nicht schwierig ist. Was Probleme bereitet, ist die Umsetzung der Daten des Bildschirmspeichers in eine für den Drucker brauchbare Form. Das wäre also das Sortieren des »v/irren« Bildschirmspeichers und die Umwandlung des zeilenorientierten (acht nebeneinanderliegende Punkte in einem Byte) Aufbaus in einen spaltenorientierten Aufbau.

Diese komplizierte Aufgabe und die große Anzahl der Punkte bewirkt, daß das Problem in Basic nahezu unlösbar ist — zumindest, wenn man eine halbwegs passable Rechengeschwindigkeit wünscht.

Einfach wird die Lösung, wenn man sich auf die vom Betriebssystem bereitgestellten »Firmware-CALLs« stützt. Da gibt es zum Beispiel so nützliche Routinen wie »GRA TEST ABSOLUTE«, mit der man ohne lange Rechnerei testen kann, welche Farbe der Punkt mit den Koordinaten im Register DE/HL hat.

Das Hardcopy-Programm besteht damit im wesentlichen nur aus zwei ineinandergeschachtelten Schleifen und einigen CALLs. Hier macht aber wieder die Rechenzeit einen Strich durch die Rechnung. Die »Firmware-CALLs« sind zwar nützlich, wenn es darum geht, nur gelegentlich eine Abfrage durchzuführen. In unserem speziellen Fall wird aber leicht einiges Überflüssige mitberechnet.

»GRA TEST ABSOLUTE« wählt nämlich zunächst die richtige ROM/ RAM-Konfiguration aus. Dann wird die Speicheradresse bestimmt, in der der Punkt zu finden ist. bevor die hier relevanten Bits ausgesucht werden. Die restlichen Bytes werden in die Farbe umgerechnet bevor die ursprüngliche ROM/RAM-Konfigu-ration wieder hergestellt wird. Und das. obwohl (bei geschickter Programmierung) das benötigte Bild-schirmspeicher-Byte in den meisten Fällen schon im CPU-Register stehen könnte. Bei 100000 Durchläufen summiert sich der Zeitaufwand zu ein paar Minuten. In einer Befehlserweiterung »Hardcopy« ist es also besser, auf die vorliegenden Routinen zu verzichten und lieber »maßgeschneiderte« zu erarbeiten — wenn es auch vielleicht 100 Byte Speicher kostet.

Der Programmblock Zeile 26 des Assembler-Listings (Listing 2) regelt die Voreinstellung der verschiedenen Flags und Druckerparameter. In der Speicherzelle &blc8 steht der aktuelle Bildschirmmodus. Abhängig davon wird festgestellt, wieviele Punkte nun durch ein einziges Byte codiert werden. Später wird diese Information auch genutzt, um den Drucker voreinzustellen. Im Modus 1 erfolgt dann die Grafikausgabe ganz normal. Im Modus 0 wird jeder Punkt einfach doppelt ausgegeben. Im Modus 2 wird der Drucker auf »Halbschritt« oder »doppelte Dichte« eingestellt — damit passen auf dieselbe Fläche doppelt soviel Punkte.

Umsetzung in ein Hardcopy-Programm

Die Zahl der (wie oben erwähnt) nach einem Steuerbefehl als Grafikzeichen zu interpretierenden Zeichen. addiert sich zu 640 (volle Zeilenbreite). NI und N2 hätten also die Werte 128 und 2. Den Wert 128 kann der Schneider aber nicht an den Drucker senden (7-Bit-Schmttstelle). Deshalb muß die Ausgabe im Modus 2 in zwei Portionen zu je 320 Punkten (= 256 + 64) erfolgen. Die Ausgabe der zweiten Hälfte erfolgt bei Bedarf in den Zeilen 55 bis 57 des Assemblerlistings. Die 200 (25 x 8) Bildschirmrasterzeilen ergeben dann 200 : 7 = 28, Rest 3 Druckzeilen. In der letzten Zeile werden die vier unteren Nadeln somit nicht benötigt. Das Flag »used« ist eine Maske. mit der man diese nicht benötigten Bits aus dem Grafikzeichen ausblenden kann.

In dem Block ab Zeile 47 erfolgt die Ausgabe des gesamten Bildes. In der Regel zeigt das Register HL auf das er3te Byte der obersten Rasterzeile der auszugebenden (Druk-ker-)Zeile (7 Nadeln). Hier erfolgt auch die Abfrage der Break-Taste nach jeder Zeile.

Das Hardcopy-Programm im Detail

Der Block ab Zeile 98 regelt die Ausgabe einer Zeile. Nachdem der Druckermode gewählt und entschieden wurde, ob 40 oder 80 Bytes anzugeben sind, beginnt in der Zeile 116 die Übergabeschleife. Für den Drucker benötigt man die Ausgäbe in 7-Zeilen-Schritten. obwohl der Bildschirm nach einer 8-Zeilen-Periode aufgebaut ist. Um den daraus entstehenden hohen Rechenaufwand zu minimieren werden sieben, auf dem Bildschirm jeweils untereinananderliegende Bytes, in einen Pufferspeicher zuerst einmal abgelegt.

Je nach Modus enthält ein Byte 2, 4 oder 8 Punkte. Entsprechend oft werden diese sieben Pufferspeicherbytes 2.4 oder 8mal ab dem Label »nxtdot« zu einem Byte komprimiert. das jeweils direkt die Nadeln des Druckers codiert. Ab der Adresse &blcf stehen Maskenbytes, mit deren Hilfe man aus einem anderen Byte die für einen bestimmten Punkt relevanten Bits herausfinden kann. Das erste Maskenbyte enthält dabei die relevanten Bits für den ganz linken Punkt, das zweite Byte das für den zweiten Punkt etc. Auf dem Drucker erscheint ein Punkt des Stifts 0 (PENO) weiß, alle anderen Stifte (PEN 1, 2 und 3) schwarz.

Das Unterprogramm «Print« gibt ein Zeichen an den Drucker aus. War der Drucker nicht bereit, wird die ESC-Taste getestet und bei Bedarf das Programm abgebrochen. Andernfalls wird die Ausgabe wiederholt — so lange, bis die Übertragung klappt.

Anpassung an andere Drucker

Um eine Anpassung des Programms auch an nicht NLQ401-kom-patible Drucker zu ermöglichen, sind alle druckerabhängigen Steuercodes in einer Tabelle am Ende des Programms zusammengefaßt. Im Basic-Lader sind das die letzten 18 Nicht-Null-Bytes. Den Aufbau der Tabelle zeigt Bild 4: Jeder Satz besteht aus einem Byte, in dem die Länge des Satzes steht, und den eigentlichen Steuerzeichen. Der erste Satz enthält dabei die Steuercodes für die Nachricht »320 folgende Grafikzeichen in doppelter Dichte«, der zweite Satz »320 Zeichen pro Zeile in einfacher Dichte«. Der dritte besorgt das Umschalten der Zeilenhöhe auf einen Wert, der genau der Höhe der sieben Nadeln entspricht (um unnötige Lücken zu vermeiden) und der vierte Satz restauriert die Zeilenhöhe auf den Standardwert von 1/8 Zoll.

Um die Routine in das Betriebssystem einzubinden, geht man wie folgt vor: Nachdem das Programm geladen und mit einem CALL-Befehl gestartet wurde, wird das Hardcopy-Programm als Basic-Befehls-erweiterung ins Betriebssystem eingebunden und kann durch »HARDCOPY« gestartet werden. Danach wird der (eventuell vorhandene) Basic-Lader ohne Schaden gelöscht.

SatzlängeInhalt-SteuercodesBedeutung
4
4
5
5
1B 4C 40 01
1B 4B 40 01
1B 41 01 1B 32
1B 41 0C 1B 32
Grafikmode »doppelte Dichte«; 320 Punkte/Zeile
Grafikmode »einfache Dichte«; 320 Punkte/Zeile
Zeilenvorschub 7/12 Zoll
Zeilenvorschub 1/8 Zoll

Bild 4. Aufbau der Steuerzeichentabelle (angepaßt für NLQ401)

Durch den Start des Basic-Laders wird das Maschinenprogramm lauffähig in den Speicher des CPC 464 geschrieben und gestartet. Integriert ist eine Routine zum Verschieben der Maschinencode-Routine (der Verschiebe-Lader), so daß das Programm auch im Speicher abgelegt werden kann, ohne daß unnötiger Speicherplatz verschwendet wird.

2 KByte Puffer

Zuvor wird gefragt, wieviel Zeichen frei definierbar sein sollen und durch »OPENOITIV ein 2 KByte großer Kassetten/Diskettenpuffer angelegt. Dadurch braucht der Computer ihn vor einem »OPEN«-, »LOAD«- oder »SAVE«-Befehl nicht mehr anlegen, so daß man die lästige Garbage-Collection vor jeder Ausgabeoperation vermeidet.

Noch ein Tip zum Schluß: Nach einer Unterbrechung einer Hardcopyausgabe durch »ESC« sollte der Drucker aus- und wiedereingeschaltet werden, um den eventuell noch vorhanden Grafikmodus zu löschen. Außerdem werden alle nicht mit » PEN 0 « auf dem Bildschirm gebrachten Zeilen schwarz dargestellt.

Helmut Tischer/hg, HAPPY COMPUTER

★ PUBLISHER: HAPPY COMPUTER
★ YEAR: 1985
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: LISTING
★ COLLECTION: HAPPY COMPUTER 1985
★ AUTHOR: Helmut Tischer
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» Befehlserweiterung  Hardcopy    (Happy  Computer)    GERMANDATE: 2017-02-12
DL: 237
TYPE: PDF
SiZE: 606Ko
NOTE: Uploaded by hERMOL ; 4 pages/PDFlib v1.6

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

Lien(s):
» Applications » Rsx - Resident System Extensions (CPC Amstrad International)
» Applications » Voyeur Cat
» Applications » SysPatch version beta
» Applications » 3D Mapper (Amstrad Computer User)
» Applications » Kabli
» Applications » Data Moving Routine (Your Computer)
Je participe au site:
» Pour ce titre nous ne disposons de fichier executable sur CPC (Dump, Saisie du listing) , alors si vous avez ça dans vos cartons ou vous désirez usé vos petit doigts boudinés sur votre clavier faites le nous savoir.
» 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 413 millisecondes et consultée 1589 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.