Super-Install: Das Aus für widerspenstige Drucker
Vergessen Sie die ewigen Probleme mit der Druckeranpassung. Super-Install versetzt Sie in die Lage, beliebige ASCII-Werte zu ändern und sorgt dafür, daß die entsprechenden Zeichen auch wie gewünscht auf dem Drucker erscheinen.
Nahezu jeder C 64-Besitzer kennt das Problem: Die euphorische Begeisterung über den neuen Drucker mit passendem Interface legt sich oft beim ersten Probeausdruck. Der C 64 und der angeschlossene Drucker verstehen sich nicht.
Manche Textverarbeitungsprogramme besitzen zum Glück eine eigene Druckeranpassung. Doch was tun, wenn dies nicht der Fall ist? Entweder man versucht es »zu Fuß«, indem man selbst eine entsprechende Routine schreibt, oder aber — man kann auf Super-Install zurückgreifen. Dieses komplett in Basic geschriebene Programm wird im folgenden am Beispiel einer Textverarbeitung vorgestellt und beschrieben.
Spaziergang durch den Werte-Dschungel
Nur in seltenen Fällen weiß der Anwender, welche Werte das Textprogramm dem Drucker schickt, um das gerade anstehende Zeichen auszugeben. Die meisten Programme haben mit dem amerikanischen Standardzeichensatz. keinerlei Probleme, doch wenn es darum geht, Umlaute auszudrucken, spielen die Drucker des öfteren verrückt. Um eine solide Grundlage für das Arbeiten mit Super-Install zu schaffen, sollte man sich als erstes eine Liste der ASCII-Werte seines Druckers erstellen. Dies geschieht mit folgendem kleinen Programm:
10 OPEN 1,4,7
20 FOR I=0 TO 255 : PRINT I
30 POKE 198,0 : WAIT 198,1
: GET X$ : IF
X$=CHR$(13) THEN NEXT
40 PRINT#1,CHR$(I); I
50 NEXT
60 CLOSE
Wenn Sie <RETURN> drücken, wird das Zeichen übersprungen, ansonsten erfolgt die Ausgabe auf dem Drucker mit Wert und Bedeutung (Bild 1). Nachdem diese Wertetabelle erstellt worden ist, laden Sie als nächstes Ihr Textverarbeitungsprogramm. Dort erfassen Sie nun alle sinnvollen Zeichen (Bild 2) und drucken diese aus. Sollten Sie nach einem Vergleich von Eingabe und Ausdruck (Bild 3) keine Unterschiede feststellen, brauchen Sie keine Anpassung durchführen. Ansonsten tritt jetzt Super-Install in Aktion. Alle nicht übereinstimmenden Zeichen werden der Übersicht halber in eine Liste (Bild 4) eingetragen. Die verschiedenen Werte der Zeichen werden ebenfalls in die Liste geschrieben. Man stellt fest, daß viele Zeichen mehrfach belegt sind. Nun könnte das große Rätselraten beginnen, wenn man nicht etwas logisch vorgehen würde. Es empfiehlt sich, zuerst die Zeichen zu ersetzen, die in der Wertetabelle nur einmal vorkommen. In diesem Fall sind das die Zeichen »A« mit dem Wert 219, »O« mit 220, »U« mit 221 und »A« mit 193. Man sollte grundsätzlich nicht versuchen, die gesamte Anpassung auf einmal durchzuführen, da man schnell den Überblick verlieren kann.
| = 32 | f | = 70 | , | = 108 | 4 | = 180 | Z | = 218 | |
| ! | = 33 | g | = 71 | — | = 109 | 5 | = 181 | Ä | = 219 |
| " | = 34 | h | = 72 | . | = 110 | 6 | = 182 | Ö | = 220 |
| # | = 35 | i | = 73 | / | = 111 | 7 | = 183 | Ü | = 221 |
| $ | = 36 | j | = 74 | 0 | = 112 | 8 | = 184 | ß | = 222 |
| % | = 37 | k | = 75 | 1 | = 113 | 9 | = 185 | _ | = 223 |
| & | = 38 | l | = 76 | 2 | = 114 | : | = 186 | ' | = 224 |
| ' | = 39 | m | = 77 | 3 | = 115 | ; | = 187 | a | = 225 |
| ( | = 40 | n | = 78 | 4 | = 116 | ( | = 188 | b | = 226 |
| ) | = 41 | o | = 79 | 5 | = 117 | = | = 189 | c | = 227 |
| * | = 42 | p | = 80 | 6 | = 118 | ) | = 190 | d | = 228 |
| + | = 43 | q | = 81 | 7 | = 119 | ? | = 191 | e | = 229 |
| , | = 44 | r | = 82 | 8 | = 120 | § | = 192 | f | = 230 |
| — | = 45 | s | = 83 | 9 | = 121 | A | = 193 | g | = 231 |
| . | = 46 | t | = 84 | : | = 122 | B | = 194 | h | = 232 |
| / | = 47 | u | = 85 | ; | = 123 | C | = 195 | i | = 233 |
| 0 | = 48 | v | = 86 | ( | = 124 | D | = 196 | j | = 234 |
| 1 | = 49 | w | = 87 | = | = 125 | E | = 197 | k | = 235 |
| 2 | = 50 | x | = 88 | ) | = 126 | F | = 198 | l | = 236 |
| 3 | = 51 | y | = 89 | ! | = 161 | G | = 199 | m | = 237 |
| 4 | = 52 | z | = 90 | " | = 162 | H | = 200 | n | = 238 |
| 5 | = 53 | ä | = 91 | # | = 163 | I | = 201 | o | = 239 |
| 6 | = 54 | ö | = 92 | $ | = 164 | J | = 202 | p | = 240 |
| 7 | = 55 | ü | = 93 | % | = 165 | K | = 203 | q | = 241 |
| 8 | = 56 | ß | = 94 | & | = 166 | L | = 204 | r | = 242 |
| 9 | = 57 | _ | = 95 | ' | = 167 | M | = 205 | s | = 243 |
| : | = 58 | = 96 | ( | = 168 | N | = 206 | t | = 244 | |
| ; | = 59 | ! | = 97 | ) | = 169 | O | = 207 | u | = 245 |
| ( | = 60 | " | = 98 | * | = 170 | P | = 208 | v | = 246 |
| = | = 61 | # | = 99 | + | = 171 | Q | = 209 | w | = 247 |
| ) | = 62 | $ | = 100 | , | = 172 | R | = 210 | x | = 248 |
| ? | = 63 | % | = 101 | — | = 173 | S | = 211 | y | = 249 |
| ' | = 64 | & | = 102 | . | = 174 | T | = 212 | z | = 250 |
| a | = 65 | ' | = 103 | / | = 175 | U | = 213 | ä | = 251 |
| b | = 66 | ( | = 104 | 0 | = 176 | V | = 214 | ö | = 252 |
| c | = 67 | ) | = 105 | 1 | = 177 | W | = 215 | ü | = 253 |
| d | = 68 | * | = 106 | 2 | = 178 | X | = 216 | ß | = 254 |
| e | = 69 | + | = 107 | 3 | = 179 | Y | = 217 |
1234567890+— !"#$%&'() qwertyuiop* QWERTYUIOP asdfghjkl:;= ASDFGHJKL zxcvbnm,./ ZXCVBNM? äöüß ÄÖÜ
1234567890+— !"#$%&'() qwertyuiop* QWERTYUIOP !sdfghjkl:;= aSDFGHJKL zxcvbnm,./ ZXCVMBNM? ; (=) äöü
| auf Bildschirm | auf Drucker | ||
|---|---|---|---|
| Codes | Ze1 | Codes | Ze2 |
| 91, 251 | ä | 59, 123, 187 | ; |
| 92, 252 | ö | 40, 60, 104, 124, 168, 188 | ( |
| 93, 253 | ü | 61, 125, 189 | = |
| 94, 222, 254 | ß | 41, 62, 105, 126, 169, 190 | ) |
| 219 | Ä | 91, 251 | ä |
| 220 | Ö | 92, 252 | ö |
| 221 | Ü | 93, 253 | ü |
| 65, 225 | a | 33, 97, 161 | ! |
| 193 | A | 65, 225 | a |
Zunächst werden in »Super-Install« die Werte
ä = 91 durch 219
ö = 92 durch 220
ü = 93 durch 221
a = 65 durch 193
ersetzt. Führt dies nicht zum Erfolg, so hat man, wie aus der Wertetabelle ersichtlich, noch eine andere Möglichkeit:
ä = 219 wird durch 251
ö = 220 durch 252
ü = 221 durch 253
a = 193 durch 225
ersetzt.
Wenden wir uns nun den anderen Zeichen zu. Beiden verbleibenden Zeichen ist folgendes zu beachten: die Zeichen »; ( = ) I« müssen ja selbst auch gedruckt werden. Wie wir gesehen haben, werden diese Zeichen richtig zu Papier gebracht. Der Wert darf also nicht überschrieben werden. Man erhält zum Beispiel an Stelle des »;« ein »ä«.
Drucker überlistet
In den meisten Fällen kann man davon ausgehen, daß der niedrigste Wert für das Zeichen selbst reserviert ist und demzufolge nicht umdefiniert werden sollte.
Sehen wir uns zunächst die Werte für »ä öü ß« näher an. Die ersten Werte, so bleibt zu vermuten, scheiden von vorneherein aus. Wenn man unterstellt, daß die Werte vom Textprogramm nicht kreuz und quer verteilt sind, sondern nacheinander stehen, so können einige Werte schon mal unter den Tisch fallen.
Mit Super-Install werden zunächst die Werte ‚= 123 durch 91 C = 124 durch 92 = = 125 durch 93
= 126 durch 94 ersetzt. Führt dies wiederum nicht zum Erfolg, ist es sinnvoll, die Anpassung mit folgenden Werten zu wiederholen:
; = 91 wird durch 187 ( = 92 durch 188 = = 93 durch 189 ) = 94 durch 190 ersetzt. Weitere Kombinationsmöglichkeiten sind möglich, aber nicht erforderlich. Wenden wir uns dem letzten Zeichen zu. Aus den eben genannten Gründen setzt man nicht den Wert 33 für das »I«, sondern den Wert 97. Nunistesunlogisch, wie bisher den ersten Wert (65) einzusetzen, also für »I« = 97 die 65. Es wurde bereits für den Wert 65 die 193 eingesetzt, was zur Folge haben würde, daß nun beim Drucken des»a«ein»A«entstünde (den Vorgang muß man erst einmal langsam durchdenken). Geht man nicht logisch vor, so erkennt man spätestens beim Ausdruck, daß die nächste Kombination zum Erfolg führt. Man ersetzt »I« = 228.
Soviel vorerst zur Anpassung, wobei noch anzumerken ist, daß Super-Install die Umlaute und Sonderzeichen natürlich nicht anzeigt, sondernnurdie dem Commodore-Code entsprechenden Zeichen.
Hoher Bedienungskomfort
Im folgenden werden nun der Programmaufbau und die Bedienung von Super-Install näher erläutert. Wie bereits erwähnt, ist Super-Install ein Basic-Programm. Es wird also ganz gewöhnlich mit
LOAD "Super-Install",8 von Diskette geladen. Nach dem Starten erscheint eine übersichtliche Bildschirmmaske, in der die ersten Werte mit Zeichenbedeutung zu finden sind. Mit den Cursortasten kann man in der Tabelle blättern. Um nun einen Wert zu ändern, bewegt man den Cursor neben das zu ändernde Zeichen und gibt den neuen Wert ein. Sofort erscheint die neue Belegung. Nachdem alle erforderlichen Definitionen durchgeführt sind, wird die neue Wertetabelle abgespeichert. Dazu muß der Anwender mit der Taste <S> den Menüpunkt Sichern anwählen. Das Programm meldet sich mit »CODE SICHERN:«. An dieser Stelle geben Sie den frei wählbaren Namen Ihrer Wertetabelle ein, der sich sinnvollerweise auf das angewendete Programm beziehen sollte. Danach verlangt Super-Install die Eingabe der Adresse. Und damit wären wir dann bei der eigentlichen Besonderheit von Super-Install. Hier wird mit Hilfe des Basic-Programms ein Maschinensprache-Programm erstellt, wofür Super-Install allerdings die Startadresse benötigt. Nachdem die Adresse erfaßt ist, verlangt Super-Install noch den Namen des Textprogramms, das unterstützt werden soll. Natürlich können Sie hier auch eigene Programme angeben, da die Maschinenroutine auch mit Basic-Programmen zusammenarbeitet.
Wenn alle Angaben ordnungsgemäß gemacht wurden, kann nun mit <CTRL+ X> der Lader für das Programm erstellt werden. Dieser erhält den Namen »LADER.Textprogramm«.
Wenn das Anwenderprogramm mit Druckeranpassung gestartet werden soll, lädt man zuerst den Lader in den Speicher. Alles andere übernimmt dann der C 64.
Längst ist jetzt eine nähere Beschreibung der erstellten Maschinenroutine fällig. Die Routine muß unbedingt in einen Speicherbereich geladen werden, der vom eigentlichen Anwenderprogramm nicht belegt wird. Allerdings kann der Kassettenpuffer dafür nicht verwendet werden, da die Routine zu lang ist. Am besten verwendet man den Speicherbereich oberhalb von Adresse 49152. Noch etwas muß unbedingt beachtet werden: Die Geräteadresse des Druckers muß 4 sein, da in der Maschinenroutine sonst, ohne das Zeichen zu konvertieren, in die BSOUT-Routine des C 64 gesprungen wird. Doch nun zu der Maschinenroutine (Bild 5) im einzelnen. Als erstes wird dort der OUTPUT-Vektor verbogen, so daß er auf die eigentliche Änderungsroutine zeigt. Steht ein Zeichen zur Ausgabe an, wird als erstes abgeprüft, ob die Geräteadresse auf 4 steht. Ist dies nicht der Fall, wird das Zeichen auf den Bildschirm ausgegeben und nicht konvertiert. Andernfalls wird aus der direkt hinter dem Maschinenprogramm gespeicherten Wertetabelle, mit dem übergebenen Wert im Y-Register indiziert, der entsprechende Wert geholt und im Akkumulator an die Ausgaberoutine BSOUT übergeben. Das war dann auch schon alles. Im Prinzip kein großer Aufwand, aber es erfüllt in jedem Fall seinen Zweck. Der, wie bereits erwähnt, größte Vorteil, liegt in der Anwendbarkeit auf fast alle Programme. Dies soll an einem kleinen Beispiel demonstriert werden. Dazu nehmen Sie wieder das kleine Programm zum Ausdrucken der ASCII-Werte. Die alte Liste können Sie ohne weiteres verwenden. Mit Super-Install wird nun der Wert für »a« durch den Wert von »Z« ersetzt und umgekehrt. Das Ganze speichern Sie unter dem Namen »Test« ab. Als Adresse gibt man 49152 an.
| C000 = A9 0B | LDA #$0B | ; Output-Vektor auf $C00B |
| C002 = 8D 26 03 | STA $0326 | |
| C005 = A9 C0 | LDA #$C0 | |
| C007 = 8D 27 03 | STA $0327 | |
| C00A = 60 | RTS | |
| C00B = 48 | PHA | |
| C00C = A5 9A | LDA $9A | |
| C00E = C9 04 | CMP #$04 | ; Ausgabe auf Drucker? |
| C010 = D0 0C | BNE $C01E | |
| C012 = 68 | PLA | |
| C013 = 8C 23 C0 | STY $C023 | ; Y-Register sichern |
| C016 = A8 | TAY | |
| C017 = B9 25 C0 | LDA $C025,Y | ; Zeichen aus Tabelle holen |
| C01A = 48 | PHA | |
| C01B = AC 23 C0 | LDY $C023 | ; Y-Register holen |
| C01E = 68 | PLA | |
| C01F = 4C CA F1 | JMP $F1CA | ; BSOUT: Zeichen ausgeben |
Für den Namen des Textverarbeitungsprogramms wird einfach der Name des Programms zum Drucken der Wertetabelle erfaßt. Mit <CTRL+X> erstellen Sie sodann noch den Lader für den kleinen Test. Wenn mit dem Lader ein Basic-Programm aufgerufen werden soll, muß in Zeile 5 des Laders die 1 nach der Geräteadresse entfernt und das Programm nochmals abgespeichert werden. Nachdem dann »NEW« eingegeben wurde, kann es losgehen. Mit »LADER.Programmname« wird das Ladeprogramm eingeladen. Dieses wird dann nur noch mit »RUN« gestartet, und nach kurzer Zeit beginnt der Drucker mit seinem Werk. Beim Vergleichen der neuen Wertetabelle mit der alten, kann man feststellen, daß sich hier einiges geändert hat. So wurde, um auf obiges Beispiel zurückzukommen, das »a« mit dem »Z« vertauscht.
Zu guter Letzt...
Mit Super-Install hat auch . der mit der Maschinenprogrammierung weniger vertraute Anwender die Möglichkeit, mit den Problemen der Druckeranpassung fertig zu werden. Noch dazu kann Super-Install sowohl bei der Textverarbeitung als auch bei eigenen Programmen verwendet werden, die Garantie für ein breites Anwendungsspektrum.
(Mario Schacht/rf)10 rem ********************************
20 rem ** -- super-install -- **
30 rem ** m. schacht / m.klemm **
40 rem ** berlin 51 (c) 1985 **
50 rem ********************************
60 poke53280,0:poke53281,0:poke53272,23:printchr$(147)chr$(159)chr$(9)
61 poke788,52:rem stop blockieren
62 dimla$(11),dt(36),in(255),bi(255),in$(16)
65 fori=0to38:bl$=bl$+chr$(32):next
67 po=23:pt=10:pr$="... bitte warten ...":gosub100
70 rem ------------tabellenwertevorgabe
73 fori=0to31:bi(i)=i+128:bi(i+32)=i+32:bi(i+64)=i:bi(i+96)=i+64
74 bi(i+128)=i+192:bi(i+160)=i+96:bi(i+192)=i+64:bi(i+223)=i+95:next:bi(255)=94
75 fori=0to255:in(i)=i:next:poke631,17:poke198,1
76 restore:fori=0to36:readdt(i):next
77 fori=0to11:readla$(i):next
78 ze=10:n$="codetabellen name":ad=49152:tx$="textprogramm"
80 goto919
98 :
99 rem ----------ausdruck positionieren
100 poke214,po-1:print:poke211,pt:printchr$(145)pr$:return
198 :
199 rem -------------------vorblaettern
200 ifii=240thenreturn
205 ii=ii+16:fori=0to15:poke214,i+4:print:poke211,23:printleft$(bl$,3)
210 poke214,i+4:print:poke211,22:printin(i+ii)
220 poke(1236+i*40),bi(i+ii):poke(1242+i*40),bi(in(i+ii)):next:return
298 :
299 rem ---------------zurueckblaettern
300 ifii<=0thenreturn
305 ii=ii-16:fori=15to0step-1:poke214,i+4:print:poke211,23:printleft$(bl$,3)
310 poke214,i+4:print:poke211,22:printin(i+ii)
320 poke(1236+i*40),bi(i+ii):poke(1242+i*40),bi(in(i+ii)):next:return
598 :
599 rem -------editor(idee:data becker)
600 in=0:poke214,po-1:print:poke211,pt:printfr$;" ";
605 poke204,0
609 poke212,1:getin$:ifin$=""then609
610 ifnu=0then616
611 ifin=0then615
612 ifin$=chr$(20)then620
613 ifin$=chr$(17)orin$=chr$(145)thenpoke631,asc(in$):poke198,1:in$=chr$(13):goto625
614 ifin$="s"orin$="l"orin$="_"thenpoke631,asc(in$):poke198,1:in$=chr$(13):nu=0:goto625
615 :ifasc(in$)<48orasc(in$)>57then605
616 ifin$=chr$(29)orin$=chr$(157)thenin$="":goto605
617 ifin$="_"orin$=chr$(145)orin$=chr$(17)thenpoke204,1:poke212,0:return
618 ifin$=chr$(13)andin=0thenin$="":goto605
620 poke207,0
625 ifin$=chr$(13)thenpoke204,1:printchr$(32):in$="":goto650
630 ifin$=chr$(20)thengosub660:goto605
635 ifin>ll-1then605
640 printin$;
645 in$(in)=in$:in=in+1:goto605
650 forsl=0toin-1
655 in$=in$+in$(sl):next:return
660 ifin=0thenreturn
665 poke212,0:poke207,0:printchr$(157)chr$(32)chr$(32)chr$(157)chr$(157);
670 in=in-1:in$(in)="":return
698 :
699 rem ------------------------anzeige
700 ifze>18thenze=3:poke198,0:po=21:pt=26:pr$=chr$(32):gosub100
705 ze=ze+1:pt=26:poke214,ze-1:print:poke211,pt:printchr$(32)chr$(158);
715 printchr$(157)chr$(17)chr$(18)chr$(32)chr$(146)chr$(159):ifze=4thengosub200
720 return
740 :
750 ifze<5thenze=20:poke198,0:po=6:pt=26:pr$=chr$(32):gosub100
755 ze=ze-1:pt=26:poke214,ze+1:print:poke211,pt:printchr$(32)chr$(158);
765 printchr$(157)chr$(145)chr$(18)chr$(32)chr$(146)chr$(159):ifze=19thengosub300
770 return
798 :
799 rem ----------------------editieren
800 fr$="":po=ze+1:pt=22:ll=3:nu=1:poke214,po-1:print:poke211,23:printleft$(bl$,4)
810 poke631,asc(x$):poke198,1:gosub600:ifval(in$)>255thenx$=chr$(32):goto800
820 in(ii+ze-4)=val(in$):poke1242+(ze-4)*40,bi(val(in$))
830 return
898 :
899 rem --------------hauptmenue layout
900 poke214,0:print:poke211,7:forq=1to25:printchr$(175);:next
905 pr$="zeichen code":po=3:pt=12:gosub100
909 poke214,1:print:forq=1to21:poke211,7:printchr$(165):poke211,31:printchr$(145)chr$(167):next
910 pr$="{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T} {CBM-T}{CBM-T}{CBM-T}{CBM-T}":po=4:pt=12:gosub100
915 pr$=chr$(18)+" sichern {SHIFT--} laden {SHIFT--}_ ende ":po=23:pt=7:gosub100:printbl$
916 return
917 :
918 rem ------------hauptmenue abfragen
919 gosub900:ii=-16:gosub200:gosub2350:rem vorgaben listen
920 getx$:ifx$=""then920
925 ifasc(x$)>47andasc(x$)<58thengosub800:goto920
930 ifx$<>"s"andx$<>"l"andx$<>chr$(17)andx$<>chr$(145)andx$<>"_"andx$<>chr$(24)then920
940 ifx$=chr$(17)andii+ze<259thengosub700:goto920
945 ifx$=chr$(17)andii+ze>258thenii=-16:gosub700:goto920
950 ifx$=chr$(145)andii+ze>4thengosub750:goto920
955 ifx$=chr$(145)andii+ze<5thenii=256:gosub750:goto920
960 ifx$="s"thengosub1100:po=24:pt=0:pr$=bl$:gosub100:goto920
970 ifx$="l"thengosub1000:po=24:pt=0:pr$=bl$:gosub100:goto920
980 ifx$=chr$(24)thengosub3000
985 ifx$="_"thenpoke788,49:printchr$(147):end
990 goto920
998 :
999 rem ----------------indexfeld laden
1000 fr$="code laden:":ll=16:po=23:pt=7:nu=0:gosub600:n$=in$
1002 ifin$="_"orin$=chr$(145)orin$=chr$(17)thenpoke631,asc(in$):poke198,1:return
1005 open15,8,15:open1,8,2,in$+",p,r":gosub2200:rem fehler
1010 iffe<>0then1090
1020 get#1,z$,v$:ad=asc(z$+chr$(0))+256*asc(v$+chr$(0)):rem adresse
1030 fori=0to36:get#1,x$:next:rem ueberlesen
1040 fori=0to255:get#1,x$:in(i)=asc(x$+chr$(0)):next
1045 get#1,l$:le=asc(l$+chr$(0))-1
1050 tx$="":fori=0tole:get#1,x$:tx$=tx$+x$:next:gosub2350:rem textprg.name
1060 ii=-16:gosub200:rem neu listen
1090 close1:close15:in$="":return
1098 :
1099 rem -------------indexfeld sichern
1100 fr$="code sichern:":ll=16:po=23:pt=7:nu=0:gosub600:n$=in$
1101 gosub1190:ifpeek(198)=1thenreturn
1102 fr$="adresse <dez>:":ll=5:gosub600:ad=val(in$):gosub1190:ifpeek(198)=1thenreturn
1103 gosub2400:aa=ad:gosub2450:ifad=0then1102
1104 fr$="textprogramm:":ll=16:gosub600:tx$=in$:gosub1190:ifpeek(198)=1thenreturn
1110 open15,8,15:open1,8,1,"@:"+n$:gosub2200:rem fehler
1112 iffe<>0thenclose1:close15:in$="":return
1115 gosub2350:rem statuszeile
1120 print#1,chr$(lb);chr$(hb);:rem adresse
1125 k=0:fori=adto(ad+36):print#1,chr$(dt(k));:k=k+1:next:rem maschinenprg drucker
1130 k=0:fori=(ad+36)to(ad+36+255):print#1,chr$(in(k));:k=k+1:next:rem indexfeld
1135 print#1,chr$(len(tx$));
1140 k=1:fori=(ad+36+255)to(ad+36+255+len(tx$)-1)
1145 print#1,chr$(asc(mid$(tx$,k,1)));:k=k+1:next:rem name
1150 close1:close15:gosub3000:in$="":return
1188 :
1189 rem --------------abfrage ausstieg
1190 po=24:pt=0:pr$=bl$:gosub100
1191 ifin$="_"orin$=chr$(145)orin$=chr$(17)thenpoke631,asc(in$):poke198,1:return
1192 po=23:pt=7:return
2198 :
2199 rem ------------------------fehler
2200 input#15,fe,fe$:iffe=0then2220
2210 pr$=bl$:po=24:pt=0:gosub100:pr$=fe$:pt=(40-len(fe$))/2:gosub100:gosub2300
2220 return
2298 :
2299 rem -----------------warteschleife
2300 forq=1to2500:next:return
2348 :
2349 rem -------------------statuszeile
2350 po=1:pt=0:pr$=bl$:gosub100:ad$=right$(str$(ad),len(str$(ad))-1)
2352 pr$=chr$(30)+chr$(34)+n$+chr$(47)+ad$+chr$(47)+tx$+chr$(34)+chr$(159)
2353 iflen(pr$)>40thenpr$=left$(pr$,39)+chr$(34)
2355 pt=int((41-len(pr$))/2):gosub100:return
2398 :
2399 rem --------------adresse anpassen
2400 aa=ad+11:gosub2450:dt(1)=lb:dt(6)=hb
2405 aa=ad+35:gosub2450:dt(20)=lb:dt(21)=hb:dt(28)=lb:dt(29)=hb
2410 aa=ad+37:gosub2450:dt(24)=lb:dt(25)=hb
2420 return
2448 :
2449 rem -----------------high/low byte
2450 hb=int(aa/256):lb=aa-hb*256:return
2998 :
2999 rem -------ladeprogramm generieren
3000 po=23:pt=7:pr$=chr$(18)+"mit ctrl-x lader erzeugen":gosub100
3002 po=24:pr$="programm wird geloescht !":gosub100
3003 getx$:ifx$=""then3003
3005 ifx$<>chr$(24)thengosub915:return
3010 printchr$(147);la$(0)
3020 print:print:printla$(1);chr$(34);n$;chr$(34);la$(2):printla$(3)
3030 printla$(4);chr$(34);la$(5);str$(ad);la$(6);chr$(34);la$(7);chr$(34);tx$;
3040 printchr$(34);la$(7);chr$(34);la$(2):printla$(8)
3050 printla$(9);chr$(34);la$(10)+tx$;chr$(34);la$(11)
3060 poke631,19:fori=632to637:pokei,13:next:poke198,7:end
4998 :
4999 rem ---------------druckerprogramm
5000 data169,11,141,38,3,169,192,141,39,3,96,72,165,154,201,4,208,12,104,140
5010 data35,192,168,185,37,192,72,172,35,192,104,76,202,241,255,255,255
5998 :
5999 rem ------------datas-ladeprogramm
6000 data "new" , "1 printchr$(147):ifa=0thena=1:load"
6010 data ",8,1"
6020 data "3 printchr$(19);" , "5 print" , "sys" , ":load" , "chr$(34)"
6030 data "7 poke631,19:poke632,13:poke198,2:end"
6040 data "save" , "@:lader." , ",8"