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