C 64
Grafik

Olympia Compact 2: ein Interface

Das hier beschriebene Interface ermöglicht den Anschluß einer Olympia Compact 2 an den Commodore 64. Es gleicht einerseits die Zeichensätze der beiden Geräte an die ASCII-Norm an, andererseits gestattet es den Ausdruck der Steuerzeichen des C 64.

Die Steuerzeichen werden in einer Form dargestellt, anhand derer man sie bequem identifizieren und wieder eingeben kann. Außerdem simuliert das Programm eine Rücktaste und führt einen Cursor für den Drucker.

Für die Verbindung des Userports mit der Centronics-Schnittstelle ist ein Kabel erforderlich, das folgende Pins verbindet:

Userport 8 C D E F H J K L B A und N
Amphenol 1 2 3 4 5 6 7 8 9 11 19 — 29

PC2 des C 64 liefert also das Strobe-Signal, das der Schreibmaschine das Vorhandensein gültiger Daten mitteilt, und an FLAG2 wird das BUSY-Signal des Druckers auf Bereitschaft zur Entgegennahme neuer Zeichen abgefragt.

Das Programm können Sie natürlich auch ohne die REMs abtippen, die hier wiedergegebene Pseudo-Assembler-Fassung hat den Sinn, einen gewissen Durchblick zu ermöglichen und Änderungen zu vereinfachen.

Die Schnittstelle hat die Sekundäradresse 4. Wird eine andere Geräteadresse gewünscht, etwa, weil schon ein Matrixdrucker mit dieser Adresse existiert, so sind die Zeilen 127 und 137 des Programms entsprechend zu ändern.

Das Maschinenprogramm belegt in der vorliegenden Fassung die Speicherplätze von 32000 bis 32511. So ist eine Zusammenarbeit mit Simons Basic und Exbasic II gewährleistet. Wer das Programm in einen anderen Bereich, zum Beispiel in die 4 KByte RAM ab 49152, legen will, muß dazu die Zeilen 79, 111, 114, 116, 142, 144, 218, 224, 233, 237 und 256, die durch ein Sternchen gekennzeichnet sind, ändern. In 111 ist das MSB der Anfangsadresse einzusetzen (bei Anfang 50000 ist dies 195), in 114 das LSB der Anfangsadresse des CHROUT-Teils (Anfang + 55, im Beispiel 135), in 116 die Anfangsadresse des CHKOUT-Teils (Anfang + 30, im Beispiel 110). In 142 und 144 stehen jeweils als zweites Byte LSB und MSB vom Anfang des Umsetzungskatalogs. Sie wären bei Umlegung der Schnittstelle nach 50000 auf 73 (Zeile 144) und 196 (Zeile 140) zu ändern.

Das Programm verwendet die Adresse »Anfang« (32000) als Druckercursor, der für formatierten Druck abgefragt werden kann (zum Beispiel mit PRINT#4 TAB(31-PEEK (32000)),…). Im Programm dient er dazu, durch (von der Compact 2 nicht tatsächlich ausgeführten, sondern druckwegoptimierten) Wagenrücklauf und Wiedervorrücken eine Rücktaste zu simulieren. Dieser Cursor wird in den Zeilen 218, 224, 233, 237 und 256 des Programms verwendet und müßte bei Verlegung des Programms geändert werden (für Anfang 50000 ist jeweils das LSB 80 statt 0 und das MSB 195 statt 125).

Zum Aufbau des Programms: Der Initialisierungsteil verbiegt die KERNAL-Vektoren CHKOUT und CHROUT in die Schnittstellensoftware. Da diese Vektoren durch RUNSTOP/RESTORE wieder zurückgestellt werden, muß die Initialisierungsroutine nicht nur nach dem Laden, sondern nach jedem RUNSTOP/ RESTORE mit SYS 32001 aufgerufen werden. Die neu eingebauten Teile CHKOUT und CHROUT prüfen nun bei jeder Zeichenausgabe, ob das Zeichen für die Schreibmaschinenschnittstelle bestimmt ist.

Der CHROUT-Teil sucht ein auszugebendes Zeichen zunächst im Sonderzeichenkatalog. Hier wird ein Zeichen des C 64 in bis zu drei Codes an die Schreibmaschine umgesetzt. (Man beachte das zusammengestoppelte Potenzzeichen oder das elegante Pi). Dabei werden die Steuerzeichen für die Schreibmaschine im Druckmodus anders behandelt als im Listmodus. Ist das auszugebende Zeichen nicht im Sonderzeichenkatalog zu finden, so wird es je nach Zeichensatz auf ASCII-Wert umgesetzt. Anstelle von unbekannten Zeichen druckt die Schreibmaschine als Joker einen accent aigu »`«.

In den folgenden drei Abschnitten des Programms werden die angesammelten Schreibmaschinencodes der Reihe nach ausgegeben und der Cursor aktualisiert.

Zum Katalog der Sonderzeichen: Hier steht an erster Stelle der Wagenrücklauf, der beim C 64 anders als bei der Schreibmaschine gehandhabt wird. Jeder Wagenrücklauf (CR, CHR$(13)), den der C 64 sendet, muß durch eine Zeilenschaltung (LF, CHR$(10)) ergänzt werden. Das zu ersetzende Zeichen (hier 13) steht immer in der vierten Spalte des Kataloges, die Ersatzzeichen (hier 13,10,0) in den ersten drei Spalten. Das Zeichen 0 wird nur deswegen gesendet, weil jedes umzusetzende C64 Sonderzeichen prinzipiell durch drei Compact 2-Zeichen ersetzt wird.

Das folgende Sonderzeichen ermöglicht es, bei Bedarf auch nur den Wagenrücklauf zu senden. Der neue Code hierfür ist 11 (Befehl PRINT CHR$(11) oder in Strings PRINT »<Control>K«. Die dritte Umsetzung ist erforderlich, damit die Compact 2 auch ein geshiftetes Space als solches serviert bekommt.

Danach folgen 8 Steuerzeichen der Schreibmaschine, die mit PRINT CHR$(1, 2, 3, 21, 22, 23, 25 oder 26) oder in einen String auch mit PRINT »<Control>A, B, C, U, V, W, Y oder Z« gesendet werden können. Dies ist auch mit PRINT CHR$(12) beziehungsweise PRINT »<Control>L« möglich, was einen Seitenvorschub bewirkt. Die Control-Methode führt jedoch bei A,B,C und L zu Problemen, da sie nicht gelistet, sondern auch im Listmodus ausgeführt werden.

Im Katalog folgen nun die Umlaute und Sonderzeichen der Schreibmaschine, die den folgenden Tasten des C 64 zugeordnet wurden:

Comm + : ä
Shift + : Ä
Comm - : ö
Shift - : Ö
Pfund : ß
Comm Pfund : ü
Shift Pfund : Ü
Comm Alphak : §
Shift Alphak : |
Comm ★ : ´
Shift ★ : Unterstreichen des nächsten Zeichens
eckige Klammer auf : 2
eckige Klammer zu : 3

Der Akzent »´« wird über das nachfolgende Zeichen gedruckt, UNT+RT unterstreicht das nachfolgende Zeichen. Auf den Einbau von Promille und My wurde verzichtet. Wem diese Zeichen lieb und wert sind, der möge eine der Zeilen 298 bis 303 ändern, indem er die ersten drei DATA durch 60,0,0 für My und durch 14,46,15 für Promille ändert. (Die vierte DATA-Zahl ist, wie erwähnt, der Code des C 64-Zeichens, das ersetzt wird). In TEXT 64, das das Pfundzeichen als Steuerzeichen benutzt könnte man sich das »ß« erhalten, indem man die 64 und die 92 in den Zeilen 288 und 294 vertauscht und so das »ß« auf die Alphakringel-Taste legt. Ich selbst habe stattdessen die Zeilen 3160, 7110, 540, 1200, 7200, 8220 und 7140 von TEXT 64 geändert.

Bei den nun anstehenden Listcodes herrscht folgende Systematik: Die Kleinbuchstabencodes gehören zu den direkt ansprechbaren Funktionen CLR, HOME und den Cursortasten. »g« bedeutet CHR$(142), Umschalten auf Großschrift, was nur mit Tricks eingegeben werden kann, aber in manchen Listings auftaucht.

Die Zeichen ”!,”, #, $, %, &, ’ und (” stehen für die acht Farben, die zusammen mit der Commodore-Taste eingegeben werden.

Ziffern und Großbuchstaben werden zusammen mit < Control > eingegeben. Es sind dies die ersten acht Farben, 9 und 0 für RVS und RVS OFF, die Umschaltung auf den zweiten Zeichensatz durch <Control>N, Blockieren und Freigabe der Umschaltung durch <Control>H beziehungsweise <Control>I sowie die oben schon erwähnten Steuercodes <Control>F, K,U,V,W,Y,Z für die Schreibmaschine. Die angegebenen Control-Codes gehören natürlich in einen String nach PRINT.

Nicht in Print-Statements, sondern nur in Abfragen tauchen mitunter auch die Listcodes der Funktionstasten auf, die aber aus Platzgründen hier ausgelassen werden mußten und von der Schreibmaschine wie alle unbekannten Zeichen als Joker »`« ausgegeben werden.

Damit nicht jedesmal das ganze, lange Programm eingelesen werden muß, habe ich am Anfang des Programms eine Möglichkeit beschrieben, eine reine Maschinencodefassung abzuspeichern und direkt oder unter Programmkontrolle wieder einzulesen.

(Reinhard Atzbach/rg)
100 rem ******  centronics  ***********
101 rem interface fuer olympia compact2
102 rem  (c) reinhard atzbach 020784
103 rem *******************************
104 forn=0to462: readb: poke32000+n,b
105 next:sys32000:poke55,255:poke56,124
106 rem *******************************
107 :
108 :     rem initialisierung
109 :
110 data 169,255    :rem   lda #ff
111 data 141,  3,221:rem   sta ddr b
112 data 169,  0    :rem   lda #00
113 data 141,  1,221:rem   sta port b
114 data 169,125    :rem * lda #chrouth
115 data 141, 39,  3:rem   sta chrvekh
116 data 141, 33,  3:rem   sta chkvekh
117 data 169, 54    :rem * lda #chroutl
118 data 141, 38,  3:rem   sta chrvekl
119 data 169, 29    :rem * lda #chkoutl
120 data 141, 32,  3:rem   sta chkvekl
121 data  96        :rem   rts
122 :
123 :     rem chkout
124 :
125 data  32, 15,243:rem   jsr filenr
126 data 240,  3    :rem   beq a
127 data  76,  1,247:rem   jmp f n open
128 data  32, 31,243:rem a jsr setpara
129 data 165,186    :rem   lda geraetnr
130 data 201,  4    :rem   cmp #cen
131 data 240,  5    :rem   beq b
132 data 165,186    :rem   lda geraetnr
133 data  76, 93,242:rem   jmp anderes
134 data  76,117,242:rem b jmp centr.
135 :
136 :     rem chrout
137 :
138 data  72        :rem   pha
139 data 165,154    :rem   lda geraet
140 data 201,  4    :rem   cmp #centr.
141 data 240,  3    :rem   beq c
142 data  76,205,241:rem   jmp anderes
143 :
144 :     rem olympiaumsetzung
145 :
146 data 134,  5    :rem c stx 5
147 data 132,  6    :rem   sty 6
148 data 169,  6    :rem * lda #endpgl
149 data 133,  3    :rem   sta 3
150 data 169,126    :rem * lda #endpgh
151 data 133,  4    :rem   sta 4
152 data 160,200    :rem   ldy lencat
153 data 162,  1    :rem   ldx #1
154 data 104        :rem   pla
155 :
156 :     rem sonderzeichen
157 :
158 data 201,127    :rem   cmp #7f
159 data 240, 77    :rem   beq k
160 :
161 data 209,  3    :rem d cmp (3),y
162 data 240,  8    :rem   beq e
163 data 136        :rem   dey
164 data 136        :rem   dey
165 data 136        :rem   dey
166 data 136        :rem   dey
167 data 208,246    :rem   bne d
168 data 240, 27    :rem   beq g
169 data 192, 73    :rem e cpy #49
170 data 144,  8    :rem   bcc f
171 data  36, 15    :rem   bit 15
172 data  48,  4    :rem   bmi f
173 data 169,  0    :rem   lda #0
174 data  16, 53    :rem   bpl k
175 data 162,  3    :rem f ldx #3
176 data 136        :rem   dey
177 data 177,  3    :rem   lda (3),y
178 data  72        :rem   pha
179 data 136        :rem   dey
180 data 177,  3    :rem   lda (3),y
181 data  72        :rem   pha
182 data 136        :rem   dey
183 data 177,  3    :rem   lda (3),y
184 data  16, 38    :rem   bpl k
185 :
186 :     rem zeichensatz ?
187 :
188 data  72        :rem g pha
189 data 173, 24,208:rem   lda video
190 data  41,  2    :rem   and #02
191 data 208,  9    :rem   bne h
192 :
193 :     rem 1.zeichensatz
194 :
195 data 104        :rem   pla
196 data 201, 91    :rem   cmp #5b
197 data 144, 25    :rem   bcc k
198 data 169, 95    :rem   lda #5f
199 data 176, 21    :rem   bcs k
200 :
201 :     rem 2.zeichensatz
202 :
203 data 104        :rem h pla
204 data 201, 64    :rem   cmp #40
205 data 144, 10    :rem   bcc j
206 data 201,192    :rem   cmp #c0
207 data 144,  4    :rem   bcc i
208 data  41,127    :rem   and #7f
209 data 208,  2    :rem   bne j
210 data   9, 32    :rem i ora #20
211 data 201,123    :rem j cmp #7a
212 data 144,  2    :rem   bcc k
213 data 169, 95    :rem   lda #5f
214 data  72        :rem k pha
215 :
216 :     rem ruecktaste
217 :
218 data 104        :rem l pla
219 data 201,127    :rem   cmp #7f
220 data 208, 20    :rem   bne o
221 data 198,  2    :rem   dec 2
222 data 230,  2    :rem   inc 2
223 data 240, 68    :rem   beq t
224 data 198,  2    :rem   dec 2
225 data 240,  8    :rem   beq n
226 data 169, 32    :rem   lda #20
227 data 232        :rem m inx
228 data  72        :rem   pha
229 data 198,  2    :rem   dec 2
230 data 208,250    :rem   bne m
231 data 169, 13    :rem n lda #0d
232 :
233 :     rem druckercursor in 0002
234 :
235 data 201, 13    :rem o cmp #0d
236 data 208,  6    :rem   bne q
237 data  72        :rem p pha
238 data 169,  0    :rem   lda #0
239 data 133,  2    :rem   sta 2
240 data 104        :rem   pla
241 :
242 data 201, 27    :rem q cmp #1b
243 data 208,  2    :rem   bne r
244 data 198,  2    :rem   dec 2
245 :
246 data 201, 32    :rem r cmp #20
247 data 144, 34    :rem   bcc u
248 :
249 data 201, 94    :rem   cmp #5e
250 data 208, 12    :rem   bne s
251 data 169,127    :rem   lda #7f
252 data  72        :rem   pha
253 data 232        :rem   inx
254 data 169, 32    :rem   lda #20
255 data  72        :rem   pha
256 data 232        :rem   inx
257 data 169, 94    :rem   lda #5e
258 data 208, 18    :rem   bne u
259 :
260 data 201, 96    :rem s cmp #60
261 data 208, 12    :rem   bne t
262 data 169,127    :rem   lda #7f
263 data  72        :rem   pha
264 data 232        :rem   inx
265 data 169, 32    :rem   lda #20
266 data  72        :rem   pha
267 data 232        :rem   inx
268 data 169, 96    :rem   lda #60
269 data 208,  2    :rem   bne u
270 :
271 data 230,  2    :rem t inc 2
272 :
273 :     rem ausgabe
274 :
275 data  72        :rem u pha
276 data 173, 13,221:rem v lda flag
277 data  41, 16    :rem   and #10
278 data 240,249    :rem   beq v
279 data 104        :rem   pla
280 data 141,  1,221:rem   sta port
281 data 202        :rem   dex
282 data 208,162    :rem   bne l
283 data 166,  5    :rem   ldx 5
284 data 164,  6    :rem   ldy 6
285 data  24        :rem   clc
286 data  96        :rem   rts
287 :
288 :     rem olympiadaten
289 :
290 data  13, 10,  0, 13 :rem cr mit lf
291 data  13,  0,  0, 11 :rem   ohne lf
292 data 112,127,105,255 :rem ~
293 data  96, 94, 39, 94 :rem ^
294 data  62,  0,  0, 64 :rem @
295 data  14, 47, 15, 62 :rem >
296 data  14, 45, 15, 60 :rem <
297 data 123,  0,  0,166 :rem kl ae
298 data 124,  0,  0,220 :rem kl oe
299 data 125,  0,  0,168 :rem kl ue
300 data 126,  0,  0, 92 :rem sz
301 data  91,  0,  0,219 :rem gr ae
302 data  92,  0,  0,221 :rem gr oe
303 data  93,  0,  0,169 :rem gr ue
304 data  95,  0,  0,164 :rem unterstr
305 data  14, 44, 15,186 :rem teilung
306 data  14, 42, 15,223 :rem quadrat
307 data  14, 43, 15,192 :rem kubik
308 data  95,127, 85,145 :rem curs u
309 data  95,127, 68, 17 :rem curs d
310 data  95,127, 76,157 :rem curs l
311 data  95,127, 82, 29 :rem curs r
312 data  95,127, 67, 19 :rem clr
313 data  95,127, 72,147 :rem home
314 data  95,127, 73, 18 :rem rvs
315 data  95,127, 78,146 :rem rvs off
316 data  95,127, 97,144 :rem schwarz
317 data  95,127, 98,  5 :rem weiss
318 data  95,127, 99, 28 :rem rot
319 data  95,127,100,159 :rem cyan
320 data  95,127,101,156 :rem magenta
321 data  95,127,102, 30 :rem gruen
322 data  95,127,103, 31 :rem blau
323 data  95,127,103,158 :rem yellow
324 data  95,127,105,129 :rem orange
325 data  95,127,106,149 :rem braun
326 data  95,127,107,150 :rem hellrot
327 data  95,127,108,151 :rem grau 1
328 data  95,127,109,152 :rem grau 2
329 data  95,127,110,153 :rem gruen
330 data  95,127,111,154 :rem hellblau
331 data  95,127,112,155 :rem grau 3
332 data  95,127, 49,133 :rem f 1
333 data  95,127, 51,134 :rem f 3
334 data  95,127, 53,135 :rem f 5
335 data  95,127, 55,136 :rem f 7
336 data  95,127, 50,137 :rem f 2
337 data  95,127, 52,138 :rem f 4
338 data  95,127, 54,139 :rem f 6
339 data  95,127, 56,140 :rem f 8
Listing: Interface für Olympia Compact 2

PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →