Centronics Nikolaus Heusler Centronics Drucker Assembler 10.09.93 10.09.93 Objekt: 64'er Magazin Ausgabe: Redakteur: Autor: Nicki Heusler Rubrik: Hardware/Assembler Inhalt: Centronics-Schnittstelle E-Dat: Konv-Dat: 09.10.93 B-Dat: ================================================================================ Anschluß gesucht! Über die Funktionsweise einer Centronics-Schnittstelle Moderne Drucker verfügen meistens über eine Centronics-Schnittstelle. Will man sie an den C 64 anschließen, benötigt man entweder ein Interface, oder ein Userport-Kabel. Die zweite Lösung bringt einige Vorteile. Wir beschreiben den Selbstbau und vor allem die Programmierung. Dabei lernen Sie auch einige nützliche Dinge über die Centronics-Schnittstelle allgemein. von Nikolaus M. Heusler Kein C 64-Anwender ist heute mehr auf die Billigdrucker der MPS-Serie von Commodore beschränkt. Bessere Drucker, die auf dem PC-Markt erhältlich sind, leisten ein Vielfaches der MPS-Drucker und sind darüberhinaus schneller. Bei einem Umstieg auf den PC müssen Sie keinen neuen Drucker anschaffen. Einen wichtigen Nachteil hat dieser Weg allerdings: professionelle Drucker, wie man sie für PCs erhält, lassen sich nicht direkt an den C 64 anschließen. Ihnen fehlt der serielle Port. Meistens ist nur ein paralleler PC-Datenport, die sogenannte »Centronics-Schnittstelle« (Bild) vorhanden. Dennoch ist es im Prinzip kein Problem, auch ein solches Gerät mit dem C 64 zu verbinden. Allerdings wird ein spezieller Adapter, ein »Interface« benötigt, das die seriellen Daten (Bit für Bit der zu druckenden Zeichen auf einer einzigen Leitung) des C 64 in für den Drucker verständliche parallele (immer acht Bit zugleich über acht Leitungen) Centronics-Daten umwandelt. Ein bekanntes Interface ist beispielsweise das 92000 der Firma Wiesemann. Verwenden Sie diesen Umsetzer, können Sie Ihren neuen Drucker grundsätzlich wie einen MPS-Drucker von Commodore ansprechen, nur eben mit Hilfe einer speziellen Sekundäradresse mit stark erweitertem Befehlssatz und in der Leistung verbessert. Interface contra Userport-Kabel Allerdings hat dieses Interface einen stolzen Preis. Um die hundert Mark müssen Sie dafür berappen. Dazu kommt noch erschwerend, daß solche Interfaces oft unerwünschte Codewandlungen vornehmen, die Daten auf dem Weg zum Drucker also verfälschen. Da die Druckdaten zwischen C 64 und Interface weiterhin über den bekannt langsamen seriellen Port übertragen werden, kann der Druck einer umfangreichen Grafik schon zur Geduldsprobe werden. Wesentlich billiger und direkter geht's auch mit einem sogenannten Userport-Kabel. Dabei wird ausgenutzt, daß auch der C 64 einen parallelen Port (Anschluß) besitzt, nämlich den User-Port, der normalerweise ja brachliegt. Da auf diesem Signalweg keine serielle Übertragung stattfindet, ist diese Lösung dem Interface im Allgemeinen auch in der Geschwindigkeit überlegen. Wir wollen Ihnen aber einen ganz wesentlichen Nachteil des Userport-Kabels nicht verschweigen. Da Standard-Software zum C 64 fast immer von einem unter der Geräteadresse 4 anzusprechenden Drucker am seriellen Port ausgeht und nicht weiß, daß der Printer jetzt am Userport angeschlossen ist, sind bei Anwendung der Userport-Lösung immer spezielle Treiber vonnöten. Viele Floppy-Speeder und geänderte Betriebssysteme, zum Beispiel Speed-DOS enthalten bereits solche Treiber. Viele neuere Programme lassen sich auch von sich aus so betreiben. In allen anderen Fällen müssen Sie selbst für die entsprechenden Treiber sorgen. Wie man diese meist nur wenige Bytes umfassenden Routinen selbst schreibt, lernen Sie weiter unten. Bei einem Interface wären all diese Probleme nicht vorhanden. Ein Userport-Kabel führen zum einen die meisten Fachhändler, der Preis liegt üblicherweise um die 30 bis 40 Mark. Der ambitionierte Bastler kann es sich aber auch selbst herstellen, die Kosten liegen dann bei etwa 10 bis 20 Mark. Sie brauchen dazu einen 24 poligen Userport-Stecker, einen 36 poligen Centronics-Stecker, zum Beispiel von Amphenol mit der Bezeichnung 552742 bzw. Typ 57-30360 und als Verbindung ein elfadriges Kabel. Dieses sollte nicht länger als etwa einen Meter und zur Vermeidung von Störungen ein abgeschirmtes EDV-Rundkabel sein. Zur Not tut's aber auch ein Flachbandkabel. Bevor wir darauf eingehen, wie nun die Verdrahtung vor sich geht, einige Hinweise zur Centronics-Schnittstelle. Das Bild zeigt eine Centronics-Buchse, wie man sie von außen gesehen an einem Drucker finden kann. Die 36 Anschlüsse sind von 1 bis 36 numeriert. Nur die wenigsten dieser Leitungen werden für den Betrieb am C 64 benötigt und angeschlossen, dennoch wollen wir einen Blick darauf werden. Bei den einzelnen Pins wird der Signal-Name angegeben, ob das Signal vom Drucker oder vom System (dem Computer) stammt und eine kurze Beschreibung. Ein Minuszeichen vor dem Signalnamen weist auf eine »low-aktive« Leitung hin, die also im Ruhezustand auf »High« liegt. Die Centronics-Schnittstelle Pin 1: -Data Strobe (vom System): Nachdem der Computer auf den acht Datenleitungen D1 bis D8 die acht Bits des Zeichens zur Verfügung gestellt hat, die der Drucker drucken soll, wird das Strobe-Signal mindestens 30 ns auf logisch 0 (Null Volt) gelegt, wobei sich die Daten in den 20 ns vor der negativen Flanke der Strobe-Leitung nicht mehr ändern dürfen. Der Drucker übernimmt mit der fallenden Flanke die Daten in seinen Speicher und setzt von sich aus nach maximal 110 ns die Busy-Leitung auf 1. Die Strobe-Leitung wirkt wie ein Klingelknopf: Der Drucker öffnet seine »Haustür« und schaut nach, wer (welche Daten) vor der Tür steht (in welchem Zustand die Datenleitungen D1 bis D8 sind). Während dieser Zeit kann er keine neuen Zeichen annehmen und setzt die Busy-Leitung auf high. Pins 2 bis 9: Data 1 bis 8 (vom System) Diese acht Leitungen sind die wichtigsten: Hier stellt der Computer die acht Bits des zu druckenden Zeichens zur Verfügung. Pin 2 enthält das niederwertige Bit 1, bei Pin 9 liegt das höchste Bit 8. Meistens sind innerhalb des Druckers diese Leitungen mit einem Pull-Up Widerstand von 1 bis 4,7 Kiloohm gegen +5 Volt abgesichert, so daß der im Computer enthaltene Ausgangstransistor für ein 0-Bit gegen Masse durchschalten muß, sonst (1-Bit) sperren. Pin 10: -Acknowledge (vom Drucker) Diese Leitung (kurz: ACK oder »Acknlg«) wird vom Drucker nach Übernahme eines empfangenen Zeichens für etwa 5 us auf Low gesetzt, um die Übernahme zu quittieren. Der Sender kann nun die Datenleitungen mit einem neuen Byte beaufschlagen (aber noch kein Strobe schicken!) Beim Betrieb mit dem C 64 benötigen wir das Signal nicht. Diese Leitung ist durchaus verzichtbar, da sie zur fehlerfreien Steuerung des Datenflusses nicht unbedingt nötig ist. Die sog. reine Busy-Steuerung reicht vollkommen, das im folgenden beschriebene Signal ist wesentlich wichtiger, weshalb auch die meisten Interfaces von ACK keinen Gebrauch machen. Pin 11: Busy (vom Drucker) Diese Leitung wird vom Drucker auf High (+5 Volt) gesetzt, wenn dieser keine neuen Zeichen mehr empfangen kann, also während der Übernahme eines Zeichens, im Offline-Modus, bei Papierende oder sonstigem erkannten Bedienerfehler. Bei der Datenübermittlung wartet der C 64 so lange, bis Busy low ist, und sendet erst dann mit Strobe ein weiteres Zeichen. Pin 12: Paper End (vom Drucker) Bei Betrieb mit Einzelblatteinzug oder Traktorführung meldet der Drucker mit einem High-Signal auf dieser Leitung ein erkanntes Papierende. Für den C 64 nicht von Interesse. Pin 13: Select (vom Drucker) Immer, wenn der Drucker im Online-Modus ist, setzt er Select auf high. Wir als C 64 Anwender brauchen diese Leitung nicht. Pin 14: -Auto Feed (vom System) Ein logisches Null-Signal bewirkt bei vielen Druckern den automatischen Weitertransport des Papiers um eine Zeile nach dem Druck einer Zeile. Auch diesen Pin werden wir nicht beschalten. Pin 15: nicht belegt Pins 16 und 17: GND Dies ist die Signal-Erde, die unbedingt mit dem Masse-Anschluß des Computers verbunden werden muß. Pin 18: +5 Volt (vom Drucker) Manche (leider nicht alle) Drucker stellen hier +5 Volt Gleichstrom (gegen GND) zur Verfügung. Das oben beschriebene Wiesemann-Interface benötigt diese Speisespannung unbedingt zum Arbeiten. Da bei vielen neueren Druckern diese Leitung nicht belegt ist, muß dann über eine Leitung der Cassettenport angezapft werden. Dieses Problem tritt bei Verwendung eines Userport-Kabels nicht auf. Pins 19 bis 30: GND Pin 31: -Init (vom System) Dieser Pin ist praktisch der Reset-Anschluß des Computers, der wie beim C 64 low-aktiv ist. Verbindet man diese Leitung mit GND, kehrt der Drucker augenblicklich in seinen Einschaltzustand zurück. Für den C 64 nicht interessant. Pin 32: -Fault (vom Drucker) Liegt diese Leitung auf High, so ist alles in Ordnung. Legt der Drucker jedoch ein Low-Signal an, ist etwas unangenehmes passiert. Beispielsweise kam das Papierende, der Drucker ist im Offline-Zustand, seine Gehäuseklappe wurde geöffnet. Aus der Kombination der Signale Paper end und Fault können Sie die Ursache für Busy herleiten und programmtechnisch auswerten, wenn es Ihnen gelingt, diese Signale in den Rechner zu bringen. Davon wird jedoch nur selten Gebrauch gemacht. Wir werden auch diese Leitung nicht benötigen. Pin 33: nicht belegt Einige Drucker stellen hier ein weiteres GND zur Verfügung. Pin 34: nicht belegt Pin 35: nicht belegt Manche Drucker stellen hier eine Versorgungsspannung über einen Widerstand zur Verfügung, die jedoch nicht zum Betrieb des Interfaces ausreicht, also nicht den Pin 18 ersetztzt. Pin 36: -Select in (vom System) Es können nur dann Daten an den Drucker übergeben werden, wenn diese Leitung nicht beschaltet ist oder an Low liegt. Man kann, indem man dieses Signal mit +5 Volt verbindet, den Drucker vom System abkoppeln, um beispielsweise mehrere Drucker gleichzeitig zu betreiben. Für uns nicht von Interesse. Centronics-Timing So. Damit wären die eigentlichen Signale technisch beschrieben. Es ist ohne weiteres möglich, das Gerät nur mit den Leitungen 1 bis 9, 11 und 16 zu betreiben. Anhand eines Beispiels beschreiben wir nun, wie man vorgeht, wenn man dem Drucker ein Zeichen, das er drucken soll, schicken will - und zwar unabhängig, ob bei Betrieb am C 64 mit Interface oder Userport-Kabel oder gar am PC. Zuerst muß man sich unbedingt davon vergewissern, ob der Drucker überhaupt Daten von uns annehmen will. Dazu lesen wir die Busy-Leitung. Ist sie high, ist der Drucker noch »beschäftigt« und kann keine neuen Daten annehmen. Wir müssen warten, bis Busy low wird. Der Drucker soll das Zeilenende-Zeichen, also CHR$(13) (Carriage Return, kurz »CR«) erhalten. Rechnen wir die Zahl 13 in das Binärformat um, so erhalten wir die Zahl %00001101. Das bedeutet, die Bits 1, 3 und 4 sind gesetzt, alle anderen gelöscht. Zunächst liegt die Strobe-Leitung auf high (nicht aktiv), Busy (low) und Acknowledge (high) sind ebenfalls im nicht-aktiv Zustand. Der Drucker sei im Online-Modus und empfangsbereit (vgl. Timing-Grafik). Wir müssen also zunächst die Datenleitungen Nr. 1, 3 und 4 auf High setzen, alle anderen (Nr. 2, 5, 6, 7 und 8) auf Low. Damit steht das Zeichen 13 bereits auf dem parallelen Port. Mindestens 20 Nanosekunden darf sich daran nichts mehr ändern. Wir müssen dem Drucker jetzt noch befehlen, das gesendete Zeichen anzunehmen. Dazu setzen wir kurz (mindestens 30 Nanosekunden) die Strobe-Leitung auf Low. An den Vergleich mit dem Klingelknopf erinnern Sie sich noch? Der Drucker braucht maximal 110 Nanosekunden, um »an die Haustür zu gehen« und die Datenleitungen zu checken. Er setzt nach dieser Zeit die Busy-Leitung auf high und blockiert damit erst einmal die weitere Datenausgabe durch den Computer. Wir können dort erst einmal im Programm weitermachen und den Drucker arbeiten lassen. Erst wenn das nächste Zeichen zum Drucker gelangen soll, beginnen wir von vorn mit der Abfrage der Busy-Leitung. Wie gesagt werden wir die Acknowledge-Leitung des Druckers, auf der er uns quittiert, daß er ein Zeichen (die CHR$(13)) empfangen hat und damit auch etwas anzufangen wußte, nicht prüfen. Dennoch ist sie der Vollständigkeit halber im Timing-Diagramm eingezeichnet. Wir basteln uns ein Userport-Kabel Mit den bisher gewonnenen Erkenntnissen wird es uns nun nicht mehr schwerfallen, ein eigenes Userport-Kabel zu bauen. Die Materialien (Userport- und Centronics-Stecker, 11 adriges Kabel) haben wir ja schon weiter oben genauer beschrieben. Der Centronics-Anschluß ist ein paralleler Port und soll an den Userport angeschlossen werden. Überlegen wir uns also, wo am Userport parallele Datenleitungen zur Verfügung stehen. Richtig, der Port B der CIA 2 steht an der Userport-Unterseite zur Verfügung. Wir verbinden also die Datenleitung PB0 mit D1, PB1 mit D2 und so weiter bis zur Verbindung von PB7 mit D8. Die Zählung der Datenleitungen beginnt am Userport definitionsgemäß mit Null, am Centronics-Port mit eins. Als nächstes brauchen wir eine Leitung, mit der wir den Strobe-Anschluß bedienen werden. Hier bietet sich eine freie Leitung des Ports A der CIA 2 an, die Leitung PA2, die ebenfalls am Pin M des Userports zur Verfügung steht. Bisher hatten wir es mit der Datenrichtung C 64 -> Drucker zu tun. Weiter soll jetzt das Busy-Signal des Druckers in den C 64 geleitet werden. Eine reine Portleitung ist am Userport nicht mehr frei, daher weichen wir auf das Signal FLAG aus. Ein Impuls an diesem Anschluß löst im C 64 ggf. einerseits einen Interrupt aus (von dieser Technik machen wir hier keinen Gebrauch) und setzt andererseits ein Bit in einer bestimmten Speicherzelle. Mit dieser Zelle können wir fortan prüfen, ob der Drucker zur (weiteren) Datenaufnahme bereit ist. Sehr wichtig ist die Kopplung von Drucker und Computer, das heißt, wir müssen die beiden Erdleitungen GND verbinden. Am Userport steht GND gleich viermal zur Verfügung, an der Centronics-Buchse wählen wir den Anschluß 16. Zusammenfassend ergibt so daraus folgendes Verdrahtungsschema (die Pins I und H des Userports existieren nicht): C e n t r o n i c s │ U s e r p o r t Signal Pin │ Pin Signal --------------------------------------- GND (Erde) 16 <-----> A GND Busy 11 ------> B Flag D1 2 <------ C PB0 D2 3 <------ D PB1 D3 4 <------ E PB2 D4 5 <------ F PB3 D5 6 <------ H PB4 D6 7 <------ J PB5 D7 8 <------ K PB6 D8 9 <------ L PB7 Strobe 1 <------ M PA2 --------------------------------------- Wie üblich sollten Sie auch hier äußerst sorgfältig arbeiten. Bei einem Verdrahtungsfehler haben Sie die Chance, gleich zwei Geräte auf einmal zu zerstören: Den Computer und den Drucker! Vor allem stecken oder entfernen Sie niemals die Stecker in User- oder Centronics-Port, während Drucker und/oder C 64 eingeschaltet sind. Mit etwas Umsicht wird es jedoch keine Probleme geben. Viele C 64 Anwender arbeiten mit dieser Lösung bereits seit langem ohne Probleme. Die Software Leider ist es mit dem Kabel allein nicht getan. Wir müssen schon dafür sorgen, daß der Computer jetzt am Userport Druckerdaten zur Verfügung stellt. Spezielle Ansteuerungssoftware, sozusagen ein Geräte-Treiber, muß her. Aus Gründen der Geschwindigkeit und des Komforts programmiert man solche Routinen in Maschinensprache, Sie sollten also zumindest über grundlegende Assemblerkenntnisse verfügen. Falls nicht, seien Sie an dieser Stelle auf einen Assembler-Kurs verwiesen. Kenntnisse über die grobe Funktionsweise und Ansteuerung des Userports können ebenfalls nicht schaden, obgleich sie nicht unbedingt notwendig sind. Beginnen wir mit dem einfachsten: Der Routine zur Ausgabe eines Zeichens an den Drucker. Dazu werden wir es mit folgenden fünf Speicherzellen zu tun bekommen (es handelt sich allesamt um Hardwareregister der CIA. Die CIA ist der Baustein im C 64, der u.a. den Userport steuert): 56576 = $DD00: Datenregister PA Mit dieser Adresse bedienen wir nur die Strobe-Leitung des Druckers. Das Bit 2 (Wertigkeit 4) steuert die Userport-Leitung PA2. Wird das Bit gelöscht, wird das Strobe-Signal ausgelöst, und der Drucker übernimmt ggf. die anstehenden Daten. 56577 = $DD01: Datenregister PB In diese Speicherzelle schreiben wir das zu druckende Byte, das dadurch automatisch an die Leitungen PBx am Userport weitergegeben wird. 56578 = $DD02: Datenrichtung (DDR) PA Wollen wir einen Crash vermeiden, müssen wir dem Computer mitteilen, daß die Leitung PA2 als Ausgang (sie ist ja an Strobe angeschlossen) verwendet wird. Dazu werden wir das Bit 2 dieser Zelle setzen. 56579 = $DD03: Datenrichtung (DDR) PB Die CIA muß analog dazu auch informiert werden, daß der Datenport PB als Ausgang fungiert. Dazu werden wir alle Bits dieser Zelle setzen. 56589 = $DD0D: Multifunktionsregister Bit 4 dieser Zelle gibt uns über den Zustand der Flag-Leitung des Userports Auskunft. Ist dieses Bit gelöscht, kann der Drucker keine Daten aufnehmen. Und nun die Routine, die zur Ausgabe eines im Akkumulator enthaltenen Zeichens an den Drucker dient: PRINT PHA ; Zeichen merken LDA #$FF ; Alle Bits Ausgabe STA $DD03 ; DDR PB LDA $DD02 ; DDR PA ORA #4 ; Bit 2 setzen STA $DD02 ; DDR PA LDA #$10 ; Bit 4 testen BUSY BIT $DD0D ; Busy-Status prüfen BEQ BUSY ; so lange warten, bis Drucker bereit PLA ; zu druckendes Zeichen STA $DD01 ; auf Userport legen LDA $DD00 ; PA ORA #4 ; Bit 2 setzen, Strobe-Signal STA $DD00 ; PA AND #$FB ; Bit 2 löschen, Strobe auslösen STA $DD00 ; PA RTS ; und fertig Mehr ist es nicht. Dies ist die gesamte Routine, die ein Zeichen über das Userport-Kabel an den Drucker ausgibt. Dazu wird der Routine das Zeichen im Akku übergeben (im Standard-Ascii-Code). Wenn Sie die Routine gleich ausprobieren (denken Sie bitte daran, daß erst nach dem Zeilenende (CHR$(13), CR)gedruckt wird!), werden Sie feststellen, daß nicht immer die gewünschten Zeichen beim Drucker ankommen. Dies liegt daran, daß Centronics-Drucker den Standard-ASCII-Code verstehen, der sich aber vom CBM-ASCII des C 64 unterscheidet. Insbesondere sind die Groß- und Kleinbuchstaben der beiden Codes vertauscht. Wir könnten also noch eine Konvertier-Routine schreiben, die die Vertauschung vornimmt: CODE CMP #$41 ; kleines A? BCC FERTIG; darunter, dann OK CMP #$5F ; über kleinem Z? BCS GROSS ; ja, dann evtl. Großbuchstabe ORA #$20 ; Kleinbuchstabe: Bit 4 setzen FERTIG RTS ; und fertig GROSS CMP #$C1 ; großes A? BCC FERTIG; kleiner, dann OK CMP #$DE ; über großem Z? BCS FERTIG; ja, dann fertig AND #$7F ; Großbuchstabe: Bit 8 löschen RTS ; und fertig Diese Konvertier-Routine kann direkt vor PRINT aufgerufen werden und nimmt die erforderlichen Wandlungen vor. Beispielsweise wollen wir das Wort »Test« ausgeben: TEST LDA #$D4 ; großes T JSR CODE ; wandeln JSR PRINT ; drucken LDA #$45 ; kleines e JSR CODE ; wandeln JSR PRINT ; drucken LDA #$53 ; kleines s JSR CODE ; wandeln JSR PRINT ; drucken LDA #$54 ; kleines t JSR CODE ; wandeln JSR PRINT ; drucken LDA #$0D ; Zeilenende JSR PRINT ; drucken RTS ; fertig Das CR-Zeichen CHR$(13) brauchen wir nicht zu wandeln, da es in beiden Codes an der selben Stelle zu finden ist. Gleichwohl schadet der Aufruf von CODE nicht, da die Konvertier-Routine keine Änderung vornimmt, aber eben Zeit kostet. In das System einbinden Ist der Selbsttest zu Ihrer Zufriedenheit verlaufen, können wir zu weiterem voranschreiten. Uns stört vor allem noch die komplizierte Handhabung der Routine, man kann nicht ohne weiteres längere Texte ausgeben. Man könnte jetzt auf die Idee kommen, ein eigenes Betriebssystem mit allen Ausgaberoutinen zu schreiben und damit den Drucker anzusprechen. Das ist aber gar nicht notwendig. Wir ändern einfach den Ausgabevektor und lassen den Computer somit jedesmal dann, wenn er ein Zeichen ausgeben will, eine eigene kurze Routine abarbeiten. Diese prüft, ob das Zeichen auf den Drucker gehen soll. Wenn nicht (z.B. Bildschirm, Floppy) geht alles ganz normal weiter. Sonst konvertieren wir das Zeichen und schicken es zum Userport. Wie Sie vielleicht wissen, kann man durch Ändern der Speicherzellen $326 und $327 solche Modifikationen erreichen. In diesem Paar steht die Adresse der Routine, die der C 64 zur Ausgabe eines Zeichens abarbeiten soll. Normalerweise steht hier die Adresse der Betriebssystemroutine BSOUT, das können wir aber ändern. Hier ist wieder die fertige Lösung: INIT LDA #NEU ; Highbyte der neuen Routine STA $326 ; in Vektor schreiben STY $327 ; ebenso das Highbyte RTS ; fertig NEU PHA ; Zeichen merken LDA $9A ; Geräteadresse CMP #4 ; Drucker? BEQ PRNT ; ja, dann unten weiter JMP $F1CD ; sonst weiter mit Original-Routine PRNT PLA ; Zeichen zurückholen PHA ; und wieder speichern JSR CODE ; wandeln JSR PRINT ; und ausgeben PLA ; Zeichen zurückholen CLC ; alles OK RTS ; fertig Den Teil ab dem Label INIT bis zu dem RTS vor dem Label NEU bezeichnet man als Initialisierung. Diese beiden POKEs dienen nur dazu, das High- und Lowbyte der Routine NEU in die Adressen $326 und $327 zu schreiben. Damit ist die Vorbereitung abgeschlossen. Jedesmal, wenn ab jetzt der C 64 ein Zeichen ausgeben will, sei es auf Bildschirm, Floppy oder eben Drucker, wird NEU durchlaufen. Diese Routine ist weitgehend dem Original ab $F1CA nachempfunden. Der C 64 speichert das zu druckende Zeichen auf dem Stack und holt sich die Geräteadresse aus Adresse $9A. Ist es keine 4 (von OPEN 1,4), war nicht der Drucker gemeint und es kann normal im Betriebssystem weitergehen. War die Geräteadresse jedoch eine 4, soll ein Zeichen zum Drucker gesendet werden. Wir holen den Code mit PLA vom Stack und speichern ihn gleich wieder. Der Code wird jetzt gewandelt (Routine CODE) und über den Userport ausgegeben (Routine PRINT). Danach holt sich der C 64 vom Stack wieder das Zeichen und ist fertig. Vorher wird noch mit CLC das Carry-Flag gelöscht, um der übergeordneten Routine anzuzeigen, daß kein Fehler aufgetreten ist. Wenn Sie noch weitere Änderungen an NEU vornehmen wollen, beachten Sie bitte, daß bei Beendigung von NEU die drei Register Akku, X und Y exakt den selben Wert haben müssen wie zu Beginn. Wir brauchen hier nicht extra dafür zu sorgen, daß X und Y gespeichert wird, da diese Register nicht benutzt werden. Außerdem muß das Carry-Flag gelöscht sein. Um unsere Umleitung anzuwenden, müssen Sie mit SYS den Programmteil ab INIT aufrufen (welche Adresse hinter SYS zu setzen ist, hängt davon ab, an welche Adresse assembliert wurde). Der C 64 meldet sich mit READY. zurück. Sie können jetzt ganz normal mit Ihrem Computer arbeiten und Programm laufen lassen, nur mit dem Unterschied, daß alle Zeichen, die an die Geräteadresse 4 geschickt werden, über den Userport beim Drucker ankommen. Mit etwas Geschick wird es Ihnen gelingen, diese Routine in Ihre Programme einzubinden. Damit können Sie dann Userport-Drucker mit allen Programmen betreiben. Eine etwas komfortablere Lösung, die beispielsweise auch einen Linear-Kanal (alle Zeichen werden ohne Änderungen direkt weitergegeben, der Aufruf von CODE entfällt also) und die Ausgabe von Basic-Listings mit ausgeschriebenen Cursor-Steuerzeichen ermöglicht, finden Sie unter dem Namen »Eyssele-Schnittstelle« in den 64'er-Sonderheften Nr. 18, 32 und 47. (Nikolaus M. Heusler)