C 64
Commodore Grafik auf Epson

Komfortables Treiberprogramm für Centronics-Drucker

Viele Anwender des Commodore 64 möchten anstelle eines Commodore-Druckers lieber den Drucker eines anderen Herstellers erwerben. Um diesen an ihren Computer anzuschließen, müssen sie entweder ein Hardwareinterface oder eine Softwarelösung kaufen. Dieser Artikel stellt die Softwarelösung für den Anschluß von Druckern am Userport des C 64 vor.

Es handelt sich hierbei um ein Maschinenspracheprogramm mit 726 Byte Länge, das den Adreßbereich CB57-CBD1 (dezimal: 51456 bis 52182) belegt. Damit kann zum Beispiel das DOS 5.1 auf der Demodiskette ohne Probleme zusätzlich geladen werden.

Das Programm ist ohne Einschränkung für alle Centronics-kompatiblen Drucker anwendbar, die über einen Bitmustermodus verfügen. Dieser Modus wird für die Ausgabe der Commodore-eigenen Grafikzeichen benötigt. Das Programm besteht aus mehreren Programmteilen, von denen die meisten Erweiterungen bestehender Ein-/Ausgaberoutinen des Betriebssystems sind und bei der Initialisierung in diese eingebunden werden. Dadurch können schon bestehende Basicbefehle wie OPEN und PRINT# zum Drucken benutzt, und Programme müssen nicht umgeschrieben werden. Zur Ansteuerung verschiedener Druckmodi wurden jedoch zusätzliche Gerätenummern definiert, deren Bedeutungen in Bild 1 erklärt sind. Gerätenummer 16 realisiert einen sogenannten Direktmodus, mit dem die internen Commodorezeichencodes ohne Wandlung an den Drucker gelangen. Der Direktmodus ist zur Ausgabe von Steuerzeichen oder bei der Verwendung des Druckers als Plotter zur Einzelnadelsteuerung beziehungsweise zur Ausgabe von Bitmustern geeignet. Der Textmodus (Groß- und Kleinschreibung) ist unter Gerätenummer 18 und, weil er wohl am häufigsten bei bereits bestehenden Programmen benutzt ist, unter Gerätenummer 4 ansprechbar. Die Gerätenummer 19 realisiert den Großschrift/Grafik-Modus, wie er beim C 64 gleich nach dem Einschalten voreingestellt ist. Der wichtige Modus zum Listen von Programmen wurde mit Gerätenummer 17 realisiert. Es läßt sich über die Sekundäradresse, wie in dem Musterlisting (Bild 4) gezeigt, noch zwischen vier Fällen unterscheiden. Einmal kann ausgewählt werden, ob das Listing, wie vom Bildschirm her gewohnt, mit Großbuchstaben und Grafikzeichen oder im Textmodus mit großen und kleinen Buchstaben gedruckt wird. Zum anderen kann man auswählen, ob die Steuerzeichen wie bei der Bildschirmausgabe als inverse Zeichen oder durch Abkürzungen wie (CRD) (Cursor down) im Klartext gedruckt werden. Durch all diese Möglichkeiten kann der Anwender zum einen auf seinem Drucker Ausgaben erzeugen, wie man sie von Commodore-Druckern her gewohnt ist, zum anderen auch alle Möglichkeiten seines Druckers voll nutzen.

GERÄTENUMMER 16 = DIREKTMODUS
GERÄTENUMMER 18,4 = TEXTMODUS
GERÄTENUMMER 19 = LIST-MODUS
GERÄTENUMMER 17 = DIREKTMODUS
SEK-ADR. MODUS STEUERZEICHEN
0 NORMAL NORMAL
1 KLEIN NORMAL
2 NORMAL ERKLÄRT
3 KLEIN ERKLÄRT
Bild 1. Die Bedeutungen der Gerätenummern

Commodore-eigene Grafikzeichen

Die Ausgabe von Grafikzeichen erfolgt in der Routine OUTGEN ab Adresse $CAC4. Zu diesem Zweck wird der Zeichengenerator des C 64 ausgelesen. Die Zeichen, die aus einer 8 x 8 Punktmatrix bestehen, sind dort in je 8 Byte abgelegt. Jedes Byte repräsentiert das Punktmuster einer Zeile der Matrix. Ein Matrixdrucker druckt die Zeichen, indem er sie ebenso als Muster von matrixartig angeordneten Punkten zu Papier bringt. Jedoch gibt er die Punktmatrix nicht wie der Bildschirm zeilenweise sondern spaltenweise aus. Deshalb wird in OUTGEN die im Zeichengenerator in 8 Zeilenbyte gespeicherte Zeichenmatrix zunächst in 8 Spaltenbyte umorganisiert. Nach Umschalten des Druckers in den sogenannten Bitmustermodus, in dem er jedes ankommende Datenbyte nicht mehr als ASCII-Zeichen sondern als Musterbyte für eine Matrixspalte interpretiert, gibt OUTGEN die acht geänderten Zeichenbyte an den Drucker aus. Dieser fügt sie wieder zu einem 8 x 8 Punktmatrixzeichen zusammen. So ist es möglich, auf einem Matrixdrucker exakte Kopien der C 64-Bildschirmzeichen herzustellen, obwohl dieser nicht über den entsprechenden Zeichensatz verfügt.

Handhabung des Programms

Die etwas Konzentration fordernde Methode der Programmeingabe besteht im Eintippen des abgebildeten Basicprogramms (Bild 2), in dem das Treiberprogramm in DATA-Zeilen steht. Ein eingebauter Quersummentest deckt hoffentlich Eingabefehler auf.

100 for i=51456 to 52182
110 : read x: poke i,x: s=s+x
120 next i
130 if s<>82731 then print"fehler in datas !!": end
140 sys 51456
150 rem
160 rem centronics treiberroutine
170 rem
200 data 169, 90,160,201,141, 26,  3,140
201 data  27,  3,169,145,160,201,141, 28
202 data   3,140, 29,  3,169,173,160,201
203 data 141, 30,  3,140, 31,  3,169,200
204 data 160,201,141, 32,  3,140, 33,  3
205 data 169,227,160,201,141, 38,  3,140
206 data  39,  3,169,255,141,  3,221,173
207 data   2,221,  9,  4,141,  2,221, 96
208 data  72,169, 16, 44, 13,221,240,251
209 data 104,141,  1,221,173,  0,221,  9
210 data   4,141,  0,221, 41,251,141,  0
211 data 221, 96,166,184,240,  5, 32, 15
212 data 243,208,  3, 76,254,246,166,152
213 data 224, 10,144,  3, 76,251,246,230
214 data 152,165,184,157, 89,  2,165,185
215 data   9, 96,157,109,  2,165,186,157
216 data  99,  2,201,  4,240,  4,201, 16
217 data 144,  2, 24, 96,201,  0, 76,119
218 data 243, 32, 20,243,240,  2, 24, 96
219 data  32, 31,243,138, 72,165,186,201
220 data  16,176,  7,201,  4,240,  3, 76
221 data 157,242, 76,241,242, 32, 15,243
222 data 240,  3, 76,  1,247, 32, 31,243
223 data 165,186,201,  4,240,  4,201, 16
224 data 144,  3, 76, 10,247, 76, 25,242
225 data  32, 15,243,240,  3, 76,  1,247
226 data  32, 31,243,165,186,201,  4,240
227 data   4,201, 16,144,  3, 76,117,242
228 data  76, 91,242, 72,133,158,165,154
229 data 201, 16,176,  7,201,  4,240,  3
230 data  76,205,241,152, 72,138, 72,165
231 data 158,164,154,192, 16,208,  6, 32
232 data  64,201, 24,144, 31,192, 17,208
233 data   6, 32, 92,202, 24,144, 21,192
234 data   4,240,  4,192, 18,208,  6, 32
235 data  43,202, 24,144,  7,192, 19,208
236 data   3, 32, 68,202,104,170,104,168
237 data 104, 24, 96,201, 65,144, 18,201
238 data  95,176,  4,  9, 32,208, 10,201
239 data 193,144,  6,201,222,176,  2, 41
240 data 127, 76, 64,201,201,255,240, 24
241 data 201, 96,176,  3, 76, 64,201,233
242 data  64, 16,  2,233, 64,160,208,132
243 data   6, 76,196,202,201,255,208,  6
244 data 162, 94,160,208,208, 91, 72,164
245 data 185,192,255,208,  2,230,185, 41
246 data 127,201, 32,144, 44,168,165,185
247 data  41,  1,240, 16,104,201,160,144
248 data   4,201,192,144,  3, 76, 43,202
249 data 233, 64,208, 14,104,201, 96,176
250 data   3, 76, 64,201,233, 64, 16,  2
251 data 233, 64,160,208,132,  6, 76,196
252 data 202,104, 36, 15, 48,  3, 76, 64
253 data 201, 24,105, 64, 48,  2,105, 64
254 data 170,165,185, 41,  2,208,113,160
255 data 208,165,185, 41,  1,240,  2,160
256 data 216,132,  6,138,168,169,  0,162
257 data   7,157,192,  2,202, 16,250,152
258 data  74, 74, 74, 74, 74, 24,101,  6
259 data 133,  6,152, 10, 10, 10,133,  5
260 data 169,  1,133,  3,120,165,  1, 41
261 data 251,133,  1,160,  7,177,  5,133
262 data   2,162,  7,  6,  2,144,  8,189
263 data 192,  2,  5,  3,157,192,  2,202
264 data  16,241,  6,  3,136, 16,230,165
265 data   1,  9,  4,133,  1, 88,162,  0
266 data 189,210,203, 32, 64,201,232,224
267 data   5,208,245,162,  7,189,192,  2
268 data  32, 64,201,202, 16,247, 24, 96
269 data 224,213,144,  1,202,138, 41,127
270 data 201, 80,144,  2,233,  3,201, 69
271 data 144,  2,233,  3,201, 65,144,  2
272 data 233, 33,201, 28,144,  2,233,  8
273 data 201, 17,144,  2,233, 11, 56,233
274 data   4,170,169, 60, 32, 64,201,160
275 data 255,202,240,  8,200,185,122,203
276 data  16,250, 48,245,200,185,122,203
277 data  48,  6, 32, 64,201, 24,144,244
278 data  41,127, 32, 64,201,169, 62, 76
279 data  64,201, 87, 72,212, 67, 82,196
280 data  82, 79,206, 72, 79,205, 82, 69
281 data 196, 67, 82,210, 71, 82,206, 66
282 data  76,213, 79, 82,199, 70,177, 70
283 data 179, 70,181, 70,183, 70,178, 70
284 data 180, 70,182, 70,184, 66, 76,203
285 data  67, 82,213, 82, 79,198, 67, 76
286 data 210, 66, 82,206, 72, 82,212, 71
287 data  82,177, 71, 82,178, 72, 71,206
288 data  72, 66,204, 71, 82,179, 80, 85
289 data 210, 67, 82,204, 89, 69,204, 67
290 data  89,206, 27, 42,  4,  8,  0
Bild 2. Basic-Lader für das Treiberprogramm

Zur Herstellung des Verbindungskabels zwischen Userport und Drucker ist in Bild 3 eine Verbindungstabelle angegeben. Das Kabel sollte für eine störungsfreie Funktion nicht länger als ein Meter lang sein und aus einem abgeschirmten, mehradrigen Steuerkabel bestehen, das man in (fast) jedem Elektronik-Bastelgeschäft findet. Dort sind auch meist der Centronicsstecker und der Stecker für den Userport erhältlich.

A GND 16
B FLAG – BUSY 11
C DO 2
D D1 3
E D2 4
F D3 5
H D4 6
J D5 7
K D6 8
L D7 9
M PA2 – STROBE 1
Bild 3. Der Verkabelungsplan

Initialisiert wird die geladene Treiberroutine mit
SYS 12*4096 + 9*256 beziehungsweise SYS 51456

Hierbei wird die Routine in das Betriebssystem eingebunden. Jedoch Vorsicht: Nach einem Break, zum Beispiel durch die Betätigung der Tasten RUN/STOP und RESTORE ausgelöst, muß die Routine erneut initialisiert werden, da die I/O-Vektoren vom Betriebssystem zurückgesetzt wurden. Die einzelnen Druckmodi spricht man mit den üblichen Basicbefehlen an. Geöffnet wird der Ausgabekanal mit:
OPEN log. Dateinummer, Geräteadr. [,Sekundäradr.]
Die eckigen Klammern kennzeichnen optionale Angaben. So dann kann auf den geöffneten Kanal mit PRINT # log. Dateinummer ausgegeben werden. Ein Programmlisting wird zum Beispiel erzeugt mit (Bild 4) den Befehlen
OPEN 17,17 [Sekundäradr.]:CMD17: LIST
PRINT#17 : CLOSE 17

Bild 4. Musterlisting, erstellt auf einem Epson FX-80

Der PRINT-Befehl vor dem CLOSE ist notwendig, damit der CMD-Modus aufgehoben wird.

Umstellen auf beliebige Drucker mit Centronics-Schnittstelle

Das Programm wurde für einen Epson-Drucker geschrieben. Unverändert ist es für jeden anderen Drucker verwendbar, sofern auf die Ausgabe von commodoreeigenen Grafikzeichen verzichtet wird. Für diese Funktion muß der Drucker jedoch vorübergehend in den Bitmustermodus umgeschaltet werden, was während einer normalen Textausgabe möglich sein muß. Diese Umschaltung erfolgt im Programm in der Schleife ab Adresse $CB10. Die Anzahl der auszugebenden Steuerzeichen ist unter Adresse $CB18 gespeichert und die Steuerzeichen selbst stehen ab Adresse $CBD2 am Ende des Programms. Für einen Epson-Drucker wird die Folge:
ESC »*« 4 8 0
ausgegeben, wobei mit vier der Bitmustermodus »CRT-Grafik« ausgewählt wird, 8 das niederwertige Byte und 0 das höherwertige Byte der Anzahl auszugebender Punktmatrixspalten darstellt. Der Epson-Drucker kehrt nach der Ausgabe der spezifizierten Anzahl Musterbytes wieder in den Textmodus zurück.

(H.Eyssele)
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →