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