Centronics-Schnittstelle für Seikosha GP-550A
Mit diesem Software-Interface können Sie auf einem Seikosha GP-550A die Steuer- und Grafikzeichen des C 64 listen und drucken. Der Wert der Schnittstelle wird dabei durch eine Hardcopy-Funktion noch um ein Vielfaches erhöht.
Der Seikosha-Drucker GP-550A besitzt in der Grundversion eine Centronics-Schnittstelle. Zum Anschluß an den C 64 ist deshalb ein Interface notwendig. Unser Leser Pius Nippgen wollte sich aber die hohen Kosten für ein Hardware-Interface sparen. Er dachte sich, was mit einem Epson funktioniert, muß auch mit dem GP-550A gehen. Er nahm sich dazu kurzerhand die Eyssele-Schnittstelle aus Ausgabe 7/84 (auch in diesem Sonderheft) vor und schrieb sie auf den GP-550A um. Diese Schnittstelle besteht aus einem Programmteil und einem Kabel vom User-Port des C 64 an den Centronics-Eingang des Druckers.
Die gesamte Ansteuerung (Sekundär- und Geräteadressen) wurde beibehalten. Die Adressen und die Verbindungsvorschrift des Kabels können Sie bei der Eyssele-Schnittstelle nachschlagen.
Der GP-550A wird mit anderen Befehlssequenzen angesteuert als ein Epson-Drucker. Diese Sequenzen sind nötig, um beispielsweise den Grafikmodus des Druckers einzuschalten. Deshalb war die erste Aufgabe, alle Steuer-Codes der Eyssele-Schnittstelle dem GP-550A entsprechend zu ändern. Aber nicht nur das. Ein Epson-Drucker ordnet, beginnend mit der untersten der acht Nadeln, steigende binäre
Wertigkeiten zu, der GP-550A aber fallende:
Epson | Nadel | Gp-550A |
---|---|---|
128 | 8 | 1 |
64 | 7 | 2 |
32 | 6 | 4 |
16 | 5 | 8 |
8 | 4 | 16 |
4 | 3 | 32 |
2 | 2 | 64 |
1 | 1 | 128 |
Zusätzlich zu diesen Änderungen wurde eine Hardcopy-Funktion (Ausdruck des Grafikspeichers) in die Eyssele-Schnittstelle aufgenommen. Die Hardcopy-Routine wird nach dem Öffnen des Druckerkanals, beispielsweise mit OPEN 19,19 mit SYS 52223 aufgerufen. Der Aufruf kann sowohl innerhalb eines Programms, als auch im Direktmodus erfolgen. Es können alle Grafikseiten gedruckt werden, auch solche im RAM unterhalb des ROMs.
Mit ein paar POKE-Befehlen läßt sich die Hardcopy variieren. Durch POKE 52236,224 wird der Speicherbereich von $E000 bis $FFFF selektiert. 224 ist das Highbyte von $E000 (57344). Erfolgt kein POKE-Befehl, wird vom Programm der normale Grafikbereich von $2000 (8192) bis $3FFF (16383) angenommen. Verschiedene Hardcopies können stufenlos aneinander gedruckt werden, indem man einfach mehrmals nacheinander mit SYS 52223 die Routine aufruft. Vorher muß man nur mit POKE 52236,X den gewünschten Grafikbereich einstellen.
Flexible Hardcopy
Über die Speicherzelle 52242 läßt sich die Zeilenzahl der Hardcopy einstellen. POKE 52242,25 bedeutet, daß die gesamte Grafikseite (25 Zeilen) ausgedruckt wird.
Einen invertierten Ausdruck erreichen Sie durch POKE 52296,165. Durch POKE 52310,0:POKE 52239,50:POKE 52340,51 wird die Hardcopy-Breite auf die Hälfte reduziert, das Bild also gestaucht.
Initialisiert wird die Schnittstelle mit SYS 51456. Sowohl nach dem Laden als auch nach RUN/STOP-RESTORE.
Geben Sie das Listing mit dem MSE ein. Danach können Sie mit LOAD "name",8,1 oder 1,1 laden. Nach dem Laden sollten Sie noch NEW eingeben, damit die Basic-Vektoren wieder vernünftig gesetzt werden. Ohne NEW erhalten Sie bei der nächsten Anweisung einen »Out of Memory Error«. Wie Sie das Druckerkabel bauen müssen, entnehmen Sie bitte dem Artikel über die Eyssele-Schnittstelle.
(Pius Nippgen/hm)
930: cbd2 1b .byte27 ;grafik-steuersequenz 932: cbd3 47 .byte71 ;fuer 934: cbd4 30 .bvte"0" ;grafikzeichen-ausgabe 936: cbd5 30 .byte"0" ;seikosha gp 550 a 938: cbd6 38 .byte"8" ; ; ;-----------------------; ; 'umdreh'-routine ; ; der bit-wetigkeiten ; ;der grafikzeichebbytes ; ;-----------------------; ; ; 954: cbd7 a9 80 lda #$80 ;bit7-wertigkeit 956: cbd9 85 97 sta $97 958: cbdb a9 00 lda #$00 960: cbdd a8 tay 962: cbde 85 fb sta $fb 964: cbe0 bd c0 02 lda $02c0,x ;das zu drehende 966: cbe3 85 fc sta $fc ;byte laden ; 970: cbe5 a5 fc loop lda $fc 972: cbe7 25 97 and $97 ;pruefen , ob 974: cbe9 f0 07 beq $cbf2 ;bit gesetzt ; 978: cbeb a5 fb lda $fb ;byte-zwischenspeicher 980: cbed 19 77 cc ora $cc77,y ;wenn das jeweilige bit gesetzt ist, ;dann dafuer das entsprechende 'umkehr-bit' ;aus bit-wertigkeits-tabelle holen 988: cbf0 85 fb sta $fb 990: cbf2 c8 iny ;bit-tabelen-zeiger erhoehen ; 996: cbf3 18 clc 998: cbf4 46 97 lsr $97 ;naechst-niedrigeres bit pruefen 1002: cbf6 b0 02 bcs $cbfa ;wenn alle bits geprueft 1006: cbf8 90 eb bcc loop ;wenn noch nicht alle bits geprueft 1010: cbfa a5 fb lda $fb ;fertig 'gedrehtes' byte laden 1014: cbfc 4c 20 cb jmp $cb20 ;und in eyssele-routine zurueckspringen ; ; ;--------------------; ; hardcopy - routine ; ;--------------------; ; ; 1028: cbff a9 1b lda #$1b ;steuersequenz, welche 1030: cc01 20 40 c9 jsr $c940 ;passenden zeilenabstand 1032: cc04 a9 39 lda #$39 ;fuer grafikausdruck 1034: cc06 20 40 c9 jsr $c940 ;(hardopy) festlegt ; 1038: cc09 a9 00 lda #$00 ;zeiger auf gewuenschten 1040: cc0b a0 20 ldy #$20 ;grafikspeicher 1042: cc0d a5 fd sta $fd ;setzen 1044: cc0f 84 fe sty $fe ; 1048: cc11 a2 19 ldx #$19 ;anzahl der auszudruckenden ;hardcopyzeilen steht in x-register 1054: cc13 a0 04 zeile ldy #$04 ;grafiksteuersequenz fuer 1056: cc15 b9 72 cc lda $cc72,y ;eine hardcopyzeile 1058: cc18 20 40 c9 jsr $c940 ;an drucker ueber 1060: cc1b 88 dey ;userport senden 1062: cc1c 10 f7 bpl $cc15 1064: cc1e a9 28 lda #$28 ;40 zeichen 1066: cc20 85 15 sta $15 ;pro hardcopyzeile ; 1070: cc22 a9 80 loop1 lda #$80 ;bit7-wertigkeit 1072: cc24 85 97 sta $97 ;speicher des jeweiligen pruef-bits ; 1078: cc26 a9 00 loop2 lda #$00 1080: cc28 85 14 sta $14 ;zwischenspeicher des spaltenbytes ; 1084: cc2a a0 07 lda #$07 ;in 8 zeilenbytes pruefen, ob jeweiliges ;pruef-bit ($97) gesetzt ist ; 1092: cc2c a9 34 lda #$34 ;ganzen ram einschalten 1094: cc2e 78 sei ;in dem in speicherstelle1 1096: cc2f 85 01 sta $01 ;bit 0,1 geloescht ; ;umformung der zeilenbytes des grafikspeichers ;in spaltenbytes fuer drucker 1104: cc31 b1 fd loop3 lda ($fd),y ;zeilenbyte lesen 1108: cc33 25 97 and $97 ;in $97 steht jeweils das bit, auf weches ;die 8 zeilenbytes qeprueft werden 1114: cc35 f0 07 beq $cc3e 1116: cc37 a5 14 lda $14 1118: cc39 19 77 cc ora $cc77,y 1120: cc3c 85 14 sta $14 ;entsprechendes bit aus tabelle holen ;und im spaltenbyte-zwischenspeicher setzen 1126: cc3e 88 dey ;jeweiliges bit in allen 8 zeilenbytes ;pruefen, ob gesetzt 1132: cc3f 10 f0 bpl loop3 1134: cc41 a9 02 lda #$02 1136: cc43 85 fb sta $fb ;'zaehler' fuer zweimalige ausgabe 1140: cc45 a9 f4 lda #$ff 1142: cc47 38 sec 1144: cc48 e5 14 sbc $14 ;spaltenbyte (=byte fuer drucker) ;invertieren 1150: cc4a a0 37 ldy #$37 ;rom wieder 1152: cc4c 84 01 sty $01 ;einschalten 1154: cc4e 58 cli 1156: cc4f 20 40 c9 jsr $c940 ;spaltenbyte an drucker 1160: cc52 18 clc 1162: ce53 46 fb lsr $fb 1164: cc55 90 ee bcc $cc45 ;zweimal spaltenbyte an drucker ausgeben, ;wodurch hardcopy doppelt so breit wird 1170: cc57 46 97 lsr $97 ;naechst-niedrigeres bit ;der 8 zeilenbytes pruefen 1176: cc59 90 cb bcc loop2 1178: cc5b a5 fd lda $fd ;grafikspeicherzeiger 1180: ec5d 69 07 adc #$07 ;um 8 bytes erhoehen 1182: ccSf 85 fd sta $fd ;erforderlichenfalls 1184: cc61 90 02 bcc $cc65 ;highbyte des 1186: cc63 e6 fe inc $fe ;zeigers erhoehen 1188: cc65 c6 15 dec $15 ;pruefen, ob 1190: cc67 d0 b9 bne loop1 ;hardcopyzeile fertig. 1192: cc69 a9 0a lda #$0a ;line-feed an 1194: cc6b 20 40 c9 jsr $c940 ;drucker senden 1196: cc6e ca dex 1198: cc6f d0 a2 bne zeile ;pruefen, ob alle hardcopyzeilen ;ausgegeben sind, also ob hardcopy ;fertig ist 1206: cc71 60 rts ;ende der hardcopy-routine, ;ruecksprung in programm ;bzw. direktmodus ; 1216: cc72 30 .byte"0" ;grafiksteuersequenz 1218: cc73 34 .byte"4" ;fuer eine 1220: cc74 36 .byte"6" ;hardcopyzeile 1222: cr75 47 .byte71 1224: cc76 1b .byte27 1228: ce77 01 .byte1 ;bit-wertigkeits- 1230: cc78 02 .byte2 ;tabelle 1232: cc79 04 .byte4 1234: cc7a 08 .byte8 1236: cc7b 10 .byte16 1238: cc7c 20 .byte32 1240: cc7d 40 .byte64 1242: cc7e 80 .byte128
PROGRAMM : CENTRON. GP-550A C900 CC7F ----------------------------------- C900 : A9 5A A0 C9 8D 1A 03 8C 06 C908 : 1B 03 A9 91 A0 C9 8D 1C 08 C910 : 03 8C 1D 03 A9 AD A0 C9 1F C918 : 8D 1E 03 8C 1F 03 A9 C8 49 C920 : A0 C9 8D 20 03 8C 21 03 2B C928 : A9 E3 A0 C9 8D 26 03 8C 53 C930 : 27 03 A9 FF 8D 03 DD AD 07 C938 : 02 DD 09 04 8D 02 DD 60 0D C940 : 48 A9 10 2C 0D DD F0 FB 62 C948 : 68 8D 01 DD AD 00 DD 09 D7 C950 : 04 8D 00 DD 29 FB 8D 00 7F C958 : DD 60 A6 B8 F0 05 20 0F FC C960 : F3 D0 03 4C FE F6 A6 98 79 C968 : E0 0A 90 03 4C FB F6 E6 20 C970 : 98 A5 B8 9D 59 02 A5 B9 6C C978 : 09 60 9D 6D 02 A5 BA 9D 3A C980 : 63 02 C9 04 F0 04 C9 10 4E C988 : 90 02 18 60 C9 00 4C 77 E8 C990 : F3 20 14 F3 F0 02 18 60 57 C998 : 20 1F F3 8A 48 A5 BA C9 C6 C9A0 : 10 B0 07 C9 04 F0 03 4C 70 C9A8 : 9D F2 4C F1 F2 20 0F F3 64 C9B0 : F0 03 4C 01 F7 20 1F F3 3A C9B8 : A5 BA C9 04 F0 04 C9 10 24 C9C0 : 90 03 4C 0A F7 4C 19 F2 52 C9C8 : 20 0F F3 F0 03 4C 01 F7 11 C9D0 : 20 1F F3 A5 BA C9 04 F0 1D C9D8 : 04 C9 10 90 03 4C 75 F2 25 C9E0 : 4C 5B F2 48 85 9E A5 9A B9 C9E8 : C9 10 B0 07 C9 04 F0 03 4D C9F0 : 4C CD F1 98 48 8A 48 A5 F7 C9F8 : 9E A4 9A C0 10 D0 06 20 87 CA00 : 40 C9 18 90 1F C0 11 D0 1B CA08 : 06 20 5C CA 18 90 15 C0 6B CA10 : 04 F0 04 C0 12 D0 06 20 A5 CA18 : 2B CA 18 90 07 C0 13 D0 25 CA20 : 03 20 44 CA 68 AA 68 A8 6D CA28 : 68 18 60 C9 41 90 12 C9 62 CA30 : 5F B0 04 09 20 D0 0A C9 4E CA38 : C1 90 06 C9 DE B0 02 29 CA CA40 : 7F 4C 40 C9 C9 FF F0 18 BF CA48 : C9 60 B0 03 4C 40 C9 E9 90 CA50 : 40 10 02 E9 40 A0 D0 84 AB CA58 : 06 4C C4 CA C9 FF D0 06 FB CA60 : A2 5E A0 D0 D0 5B 48 A4 C6 CA68 : B9 C0 FF D0 02 E6 B9 29 2C CA70 : 7F C9 20 90 2C A8 A5 B9 00 CA78 : 29 01 F0 10 68 C9 A0 90 D8 CA80 : 04 C9 C0 90 03 4C 2B CA 80 CA88 : E9 40 D0 0E 68 C9 60 B0 3F CA90 : 03 4C 40 C9 E9 40 10 02 E7 CA98 : E9 40 A0 D0 84 06 4C C4 17 CAA0 : CA 68 24 0F 30 03 4C 40 56 CAA8 : C9 18 69 40 30 02 69 40 19 CAB0 : AA A5 B9 29 02 D0 71 A0 6E CAB8 : D0 A5 B9 29 01 F0 02 A0 CF CAC0 : D8 84 06 8A A8 A9 00 A2 CA CAC8 : 07 9D C0 02 CA 10 FA 98 58 CAD0 : 4A 4A 4A 4A 4A 18 65 06 22 CAD8 : 85 06 98 0A 0A 0A 85 05 D9 CAE0 : A9 01 85 03 78 A5 01 29 D7 CAE8 : FB 85 01 A0 07 B1 05 85 17 CAF0 : 02 A2 07 06 02 90 08 BD 06 CAF8 : C0 02 05 03 9D C0 02 CA D9 CB00 : 10 F1 06 03 88 10 E6 A5 DB CB08 : 01 09 04 85 01 58 A2 00 9D CB10 : BD D2 CB 20 40 C9 E8 E0 E5 CB18 : 05 D0 F5 A2 07 4C D7 CB 21 CB20 : 20 40 C9 CA 10 F7 18 60 0E CB28 : E0 D5 90 01 CA 8A 29 7F DC CB30 : C9 50 90 02 E9 03 C9 45 EE CB38 : 90 02 E9 03 C9 41 90 02 91 CB40 : E9 21 C9 1C 90 02 E9 08 81 CB48 : C9 11 90 02 E9 0B 38 E9 AA CB50 : 04 AA A9 3C 20 40 C9 A0 08 CB58 : FF CA F0 08 C8 B9 7A CB D5 CB60 : 10 FA 30 F5 C8 B9 7A CB 94 CB68 : 30 06 20 40 C9 18 90 F4 35 CB70 : 29 7F 20 40 C9 A9 3E 4C E4 CB78 : 40 C9 57 48 D4 43 52 C4 B6 CB80 : 52 4F CE 48 4F CD 52 45 6E CB88 : C4 43 52 D2 47 52 CE 42 A3 CB90 : 4C D5 4F 52 C7 46 B1 46 E7 CB98 : B3 46 B5 46 B7 46 B2 46 A9 CBA0 : B4 46 B6 46 B8 42 4C CB 54 CBA8 : 43 52 D5 52 4F C6 43 4C A5 CBB0 : D2 42 52 CE 48 52 D4 47 0B CBB8 : 52 B1 47 52 B2 48 47 CE 27 CBC0 : 48 42 CC 47 52 B3 50 55 F4 CBC8 : D2 43 52 CC 59 45 CC 43 E3 CBD0 : 59 CE 1B 47 30 30 38 A9 F9 CBD8 : 80 85 97 A9 00 A8 85 FB 89 CBE0 : BD C0 02 85 FC A5 FC 25 6A CBE8 : 97 F0 07 A5 FB 19 77 CC 6E CBF0 : 85 FB C8 18 46 97 B0 02 90 CBF8 : 90 EB A5 FB 4C 20 CB A9 AF CC00 : 1B 20 40 C9 A9 39 20 40 DA CC08 : C9 A9 00 A0 20 85 FD 84 E9 CC10 : FE A2 19 A0 04 B9 72 CC 2B CC18 : 20 40 C9 88 10 F7 A9 28 93 CC20 : 85 15 A9 80 85 97 A9 00 66 CC28 : 85 14 A0 07 A9 34 78 85 E9 CC30 : 01 B1 FD 25 97 F0 07 A5 96 CC38 : 14 19 77 CC 85 14 88 10 8B CC40 : F0 A9 02 85 FB A9 FF 38 B4 CC48 : E5 14 A0 37 84 01 58 20 38 CC50 : 40 C9 18 46 FB 90 EE 46 D0 CC58 : 97 90 CB A5 FD 69 07 85 31 CC60 : FD 90 02 E6 FE C6 15 D0 1F CC68 : B9 A9 0A 20 40 C9 CA D0 9C CC70 : A2 60 30 34 36 47 1B 01 E1 CC78 : 02 04 08 10 20 40 80 44