Tips zu Textverarbeitungsprogrammen
Bei der Arbeit mit Textprogrammen wie »SM-Text«, »StarTexter« und »Vizawrite« kann man sich durch Tricks das Leben leichter machen. Wir zeigen Ihnen wie es geht.
Kann man Basic-Programme mit Textverarbeitungsprogrammen bearbeiten? Natürlich geht das, Sie brauchen nur ein Programm, das das Basic- in ein Text-File konvertiert, und diesen Vorgang nach der Bearbeitung wieder rückgängig macht. Ein solches Programm ist der »text-transposer«, dessen Listing wir nachfolgend abgedruckt haben.
Bevor wir allerdings dazu kommen, haben wir noch ein paar Tips zu »SM-Text« und »StarTexter«.
Tips zu SM-Text
Lädt man das »!«-Programm (Lader-Programm), so erscheint zunächst ein Menü, in dem man nochmals ein »t« für Textverarbeitung eingeben muß. Wem das zuviel ist, braucht nur im »!«-Programm in Zeile 60 folgende Erweiterung voranzustellen:
60 POKE631,84:POKE632,13: POKE 198,2:..
Es wird ein »t« im Tastaturpuffer abgelegt, und bei der Abfrage eingelesen. So ist es nun möglich, »SM-Text« in einem Stück zu laden.
Bei der neuesten Version (SM-Text+) braucht man diesen Kniff nicht, da das Programm mit »*« geladen werden kann.
Hier gibt es aber die Möglichkeit, kleine Routinen zu programmieren und diese zu speichern. Dadurch kann man einen kleinen Mangel kompensieren, der beim Speichern eines Textes auftritt. Normalerweise wird der Text dann gelöscht und man müßte ihn, wenn man weiterarbeiten möchte, wieder laden. Das Abarbeiten der einzelnen Menüpunkte können Sie dem C 64 überlassen. Nachstehend ist untereinander aufgelistet, was einzugeben ist. Daneben steht die Erklärung der Tastenoperationen:
Beim Eingeben der Routine sollte man einen Text benutzen, der bereits auf Diskette vorhanden ist, damit man die Routine (die ja beim Speichern gleichzeitig ausgeführt wird), eingeben kann.
Will man den laufenden Text zwischendurch einmal speichern, so genügt das Drücken von »RESTORE« und der F1-Taste.
Ein weiterer Trick ist folgender: Es geht darum, einen Info-Text in den vorhandenen Text, den man gerade bearbeitet, einzublenden und wieder zu löschen (Fenstertechnik). In diesem Infotext können zum Beispiel die gängigsten Steuerzeichen erklärt sein. So geht man vor:
Nun kann man durch Drücken von RESTORE und der F3-Taste einen beliebigen Text einblenden und ihn durch Drücken von RESTORE und der F4-Taste wieder löschen.
Tips zu StarTexter
Dieses Programm ist fast als perfekt zu bezeichnen. Es fehlt jedoch der Tabulator. Hier kann man sich aber leicht behelfen.
In einer Zeile setzt man an der gewünschten Tabulatorstelle einen Punkt. Dann vervielfältigt man diese Zeile so oft wie nötig: CTRL, a, e, i; etc. Hat man sich so ein mit Punkten ausgefülltes Feld aufgebaut, kann man mit der RUN/Stop-Taste (Worttabulator) schnell von Punkt zu Punkt springen.
Basic-Programme bearbeiten
Basic-Programme sind im Speicher normalerweise als Gemisch von Klartext und Token vorhanden. Damit kann ein Textprogramm natürlich nichts anfangen. Es ist also erforderlich, das Programm im Klartext zu haben. Der LIST-Befehl benutzt eine Betriebssystem-Routine, die dies bewerkstelligt. Es besteht die Möglichkeit, sein Basic-Programm als Text-File zu speichern. Man gibt im Direktmodus ein:
open8,8,8"NAME,P,W":cmd8:list: print#8
und schließt das File mit
close8
Ein solches Text-File kann zwar von vielen Textprogrammen geladen werden (auch als sequentielles File denkbar). Leider treten aber verschiedene unangenehme Effekte auf: Anführungsstriche verschwinden; die Formatierung stimmt nicht; Zeichen sind grundsätzlich codemäßig anders definiert.
Das Programm »text-transposer« (Listing) paßt das Text-File an das entsprechende Textprogramm an. Nun kann man mit diesem modifizierten File im Textprogramm hantieren. Beim Speichern macht nun jedes Textprogramm seinen eigenen Spaghetti-Code daraus. Mit »text-transposer« kann dieses File wieder in ein lauffähiges Basic-Programm umgewandelt werden.
Programmbeschreibung und Benutzung
Im Hauptmenü besteht die Auswahl zwischen
- »prg-file« in »textprg-file« wandeln und
- »textprg-file« in »basic-file« wandeln.
Hat man sein Basic-Programm in der oben erwähnten Weise abgespeichert, wählt man (a). Dann wählt man sein Textprogramm 1 bis 3 und lädt sein Text-Quellprogramm. Danach speichert man das modifizierte Textfile (unter anderem Namen).
Liegt nach der Bearbeitung mit einem Textprogramm ein von diesem gespeichertes File vor, wählt man (b) und lädt dieses Programm. Es besteht die Möglichkeit, das zu wandelnde Text-File komplett zu übernehmen oder einzeln nach Zeilennummern zu editieren. Editiert man im Textprogramm, sollte man die READY-Meldung unbedingt stehen lassen, »text-transposer« erkennt dadurch das Ende durch einen SYNTAX ERROR. Ist dies geschehen, kann man mit RUN 61500 den »text-transposer« löschen.
Bemerkungen zu SM-Text
Bevor man das gewandelte Text-File (sequentiell) lädt, muß man die Zeilenbreite auf die längste auftretende Zeile stellen (zirka 100). SM-Text hat die Eigenschaft, Buchstaben zu verlieren, wenn das Format größer ist als die eingestellte Zeilenzahl. Weiter ist die Umstellung vom deutschen Zeichensatz auf Commodore(ASCII-)Tastatur sinnvoll, aber nicht unbedingt nötig.
Hat man den Text geladen, bleibt als einzige Forderung nur, daß eine Leerzeile nach dem Textnamen stehenbleiben muß. Weiterhin sollte das Programm nicht mehr als 100 Zeilen haben, da SM-Text sonst indiskutabel langsam wird.
Bemerkungen zu StarTexter
Das Programm verarbeitet maximal 250 Zeilen ohne merkbar langsamer zu werden. Die Pfeil-nach-links-Taste wird durch das Telefonsymbol (Commodore-Taste »t«), und der Klammeraffe durch Pac-man dargestellt. Man fängt in der ersten Zeile an. Auch hier muß die READY-Meldung als Endekennzeichen am Schluß stehenbleiben.
Bemerkungen zu Vizawrite
Das Text-File wird als sequentielles File eingelesen. Dazu geht man ins Editierfeld und benutzt die Merge-Funktion: Commodore-Taste drücken, großes M, Namen eingeben, bei page ein »s« eingeben, RETURN. Nun wird das Text-File als sequentielles File geladen. Dabei sollte die Formatzeile unbedingt 75 Zeichen lang sein (sonst klappt die Rückwandlung nicht richtig).
Ist das Text-File geladen, muß man die ersten zwei Leerzeilen unbedingt stehenlassen. Man sollte sich nicht daran stören, wenn eine Basic-Zeile etwas unkonventionell abgekürzt wird (durch word-wrapping, also automatischem Zeilenumbruch); den Abschluß einer Basic-Zeile bildet immer das Dreieck-Sonderzeichen für RETURN.
Die Anführungsstriche werden von Vizawrite normalerweise eliminiert und sind daher vom »text-transposer« durch ein Sonderzeichen ersetzt. Beim weiteren Editieren des Programms kann man natürlich Anführungsstriche weiterverwenden. Beim Rücktransformieren werden die Anführungsstriche und das Sonderzeichen in jeden Fall als Anführungsstriche ausgegeben.
Funktionsweise von »text-transposer«
Der Klartext wird ab Adresse 20 000 geladen (die Lade- und Speicherroutine ist angelehnt an filecopy der Test/Demo-Disk). Die Parameter sind ab Zeile 61070 aufgeführt (lb = 32,hb = 78). Je nach verwendetem Textprogramm wird etwas unelegant von außen in ein Maschinenprogramm hineingePOKEt, um eine Verzweigung zu erreichen. Bei Vizawrite und SM-Text werden die Zeichen nacheinander eingelesen. Bei StarTexter wird beim Einlesen gleich formatiert, das heißt eine Zeile wird auf 80 Zeichen mit Leerzeichen aufgefüllt.
Vor dem Speichern werden, je nach Textprogramm, die entsprechenden Parameter (a) gesetzt (Zeile 60710, 60830, 60940). Zur Erklärung der einzelnen Parameter:
- (a) parameter-viza:
Text-File als sequentielles File (f$="s") speichern ab Adresse 20 000 (lb = 32, hb = 78); Anführungsstriche Code 34 in Code 191 wandeln. - (a) parameter-star:
Als Programm-File speichern ab Adresse 20152 (unnötige Leerzeichen); Code-Wandlung 95 in 163 und 13 in 95 - (a) parameter-sm:
Als sequentielles File speichern, ab Adresse 19983; Vorschreiben der Namenskennungszeile(nn$); Codewandlung 34 in 191
Wünscht man weitere Code-Wandlungen, so braucht man dies nur mit POKE TA + (ALTER CODE),(NEUER CODE) zu machen. TA ist eine Tabelle, die ab 50 000 im Speicher steht.
Hat man das Text-File mit einem Textprogramm bearbeitet und gespeichert, muß eine erneute Code-Wandlung erfolgen (b).
- (b) parameter-viza:
Als Programm-File laden; Code-Wandlung vornehmen (Zeile 60780, 60790); dann 279 Byte überlesen (POKE 250/251 Anfangsadresse; nur spezifische Informationen) - (b) parameter-star:
Als Programm-File laden; durch POKE 985,234 auf Routine »verzweigen«, die den Text wieder kürzt (alle Leerzeichen nach einer Zeile entfernt); Code-Wandlung 95 in 13, 163 in 95; dann die ersten beiden Byte überlesen (Sonderzeichen) - (b) parameter-sm:
Als sequentielles File laden; Code-Wandlung 191 in 34; dann die ersten 19 Byte überlesen (Namenskennungszeile; nn$).
Beim Editieren (Schleife 60310 bis 60390) wird durch SYS 864 eine Basic-Zeile nach der anderen auf den Bildschirm geschrieben, gleichzeitig der Code geändert, und die Zeile durch ein »Carriage Return« im Tastaturpuffer übernommen. Bei Zeilen, die länger als 80 Zeichen sind, erfolgt die Aufforderung zum Kürzen.
Die Schleife wird beendet, wenn die READY-Meldung auf dem Bildschirm erscheint, und bei dem Versuch, diese mit RETURN zu übernehmen, ein Syntax Error entsteht. Man hat nun die Möglichkeit, mit RUN 61500 den »text-transposer« zu löschen.
Hinweise zum Abtippen
Alle REM-Zeilen können weggelassen werden. Umnummerierung ist jedoch nicht ratsam, da aus dem Direktmodus heraus Zeilen direkt angesprungen werden, und durch ein Renumber nicht geändert würden (Zeilen 60380 und 61550).
(M. Schacht/og)60000 rem ***************************** 60010 rem ** text-transposer ** 60020 rem **(vizawrite/startexter/sm)** 60030 rem ** m.schacht (c) 1985 ** 60040 rem ***************************** 60050 : 60060 printchr$(147):poke788,52:rem run/stop blockieren 60070 an=32:en=78:rem lb/hb basic-ende=anfang textspeicher 60080 zs=20000:ta=50000:rem adressen zwischenspeicher/tabelle 60090 poke53280,0:poke53281,0 60100 fori=1to38:bl$=bl$+chr$(32):bs$=bs$+chr$(163):next 60110 gosub61220:gosub61300:rem datas einlesen 60120 poke250,80:poke251,195:sys927:rem tabelle vorbelegen 60130 : 60140 rem ---------------menue/abfragen 60150 po=4:az=18:gosub60690:printchr$(159)chr$(14)chr$(8):poke214,1:print 60160 printchr$(18)left$(bl$,14);"Text-Editor";left$(bl$,13):printbl$:printbs$ 60170 poke214,22:print:printchr$(18)left$(bl$,13);"mit _ zurueck";left$(bl$,12) 60180 poke214,8:print:fori=0to1:printme$(i):print:next 60190 poke198,0:wait198,1:getx$:ifx$="_"thenprintchr$(147):poke788,49:end 60200 ifasc(x$)<65orasc(x$)>66then60190 60210 poke214,2:print:printtab(2)right$(me$(asc(x$)-65),34) 60220 on(asc(x$)-64)gosub60420,60510 60230 po=4:az=18:gosub60690:goto60150 60240 : 60250 rem ---------------file editieren 60260 poke214,20:print:printchr$(18)"einzeln oder komplett editieren (e/k)?" 60270 poke198,0:wait198,1:getx$:ifx$<>"e"andx$<>"k"andx$<>"_"then60270 60280 ifx$="_"then run 60070 60290 poke788,49:poke49155,0:ifx$="e"thenpoke49155,1:rem flag 60300 : 60310 rem......schleife anfang......... 60320 printchr$(147):poke214,0:sys58640 60330 sys864:rem codewandlung und print 60340 an=peek(5)+peek(250)+1:en=peek(251):ifan>255thenan=an-256:en=en+1 60350 poke250,an:poke251,en:rem neue anfangsadresse 60360 poke631,19:poke632,13:poke633,13:poke634,13:poke198,4:ifpeek(49155)=1thenpoke198,2 60370 ifpeek(214)>2andpeek(1104)<>32thenpoke198,2:poke214,3:poke211,0:print:print"kuerzen!?" 60380 printchr$(18)"run 60320":end 60390 rem.....schleife ende............ 60400 : 60410 rem --------------(a)-prg => text 60420 po=8:az=3:gosub60690:poke214,4:print 60430 printtab(4)chr$(28)me$(5):printme$(6)chr$(34)me$(7)chr$(34);me$(8) 60440 printme$(9)chr$(159):printbs$ 60450 poke214,6:print:gosub60580:ift$="_"thenreturn 60460 gosub61080:rw$="r":ad=828:gosub61140:ifn$="_"thenreturn 60470 poke214,19:print:onval(t$)gosub60720,60840,60950 60480 rw$="w":ad=885:gosub61140:run 60070 60490 : 60500 rem --------------(b)-text => prg 60510 po=8:az=3:gosub60690 60520 gosub60580:ift$="_"thenreturn 60530 poke214,19:print:onval(t$)gosub60770,60890,61020 60540 rw$="r":poke936,96:ad=828:gosub61140:poke936,234:ifn$="_"thenreturn 60550 goto60260:rem editieren 60560 : 60570 rem-----------------------auswahl 60580 poke214,8:print:fori=2to4:print:printtab(12)me$(i):next 60590 poke198,0:wait198,1:gett$:ift$="_"thenreturn 60600 ifasc(t$)<49orasc(t$)>51 then60590 60610 poke214,val(t$)*2+7:print:printtab(12)chr$(18)me$(val(t$)+1):return 60620 : 60630 rem -----------------------fehler 60640 input#15,fe,fe$:iffe=0thenreturn 60650 poke214,20:print:printtab(19)chr$(28)left$(fe$+bl$,19)chr$(159) 60660 fori=0to2000:next:po=19:az=3:gosub60690:poke214,po:print:return 60670 : 60680 rem ---------teilbereich loeschen 60690 poke214,po:print:forq=1toaz:printbl$:next:return 60700 : 60710 rem -----------(a)-parameter-viza 60720 f$="s":an=32:en=78 60730 poketa+34,191 60740 return 60750 : 60760 rem -----------(b)-parameter-viza 60770 f$="p":poke985,96:rem prg-file/flag 60780 fori=0to31:poketa+i,i+64:poketa+65+i,i+97:next 60790 poketa+220,13:poketa+127,34 60800 poke250,an+23:poke251,en+1:rem bytes ueberlesen 60810 return 60820 : 60830 rem -----------(a)-parameter-star 60840 f$="p":an=184:en=78 60850 poketa+95,163:poketa+13,95 60860 return 60870 : 60880 rem -----------(b)-parameter-star 60890 f$="p":poke985,234 60900 poketa+95,13:poketa+163,95 60910 poke250,an+2:poke251,en:rem bytes ueberlesen 60920 return 60930 : 60940 rem -----------(a)-parameter---sm 60950 f$="s":an=15:en=78 60960 nn$=">.............000" 60970 fori=1to17:pokezs-18+i,asc(mid$(nn$,i,1)):next 60980 poketa+34,191 60990 return 61000 : 61010 rem -----------(b)-parameter---sm 61020 f$="s":poke985,96:rem seq-file/flag 61030 poketa+191,34 61040 poke250,an+19:poke251,en:rem bytes ueberlesen 61050 return 61060 : 61070 rem --------(a)-all.parameter-prg 61080 f$="p":an=32:en=78 61090 ift$="1"ort$="3"thenpoke936,96 61100 ift$="2"thenpoke936,234 61110 return 61120 : 61130 rem ---------file lesen/schreiben 61140 w$="<load> ":ifrw$="w"thenw$="<save> " 61150 poke214,19:print:print:printw$;:input"file-name:";n$:ifn$="_"thenreturn 61160 open15,8,15:open2,8,2,"@:"+n$+","+f$+","+rw$:gosub60640 61170 iffe<>0thenclose2:close15:goto61140 61180 poke3,an:poke4,en:sys ad:poke214,21:print:printbs$ 61190 close2:close15:return 61200 : 61210 rem ------------------datas menue 61220 fori=0to9:readme$(i):next:return 61230 data "(a) prg-file in textprg-file wandeln" 61240 data "(b) textprg-file in basic-file wandeln" 61250 data "(1) Vizawrite ","(2) StarTexter ","(3) SM - Text " 61260 data "prg-file zuvor abspeichern mit","open8,8,8,","name,p,w" 61270 data ":cmd8:list:print#8","close8" 61280 : 61290 rem ------datas maschinenroutinen 61300 ifpeek(828)=162thenreturn:rem bereits eingelesen 61310 fori=0to170:readdt:poke828+i,dt:next:return 61320 data162,2,32,198,255,160,0,32,207,255,32,168,3,145,3,230,3,208,2,230,4 61330 data36,144,80,238,165,3,133,5,165,4,133,6,76,204,255,160,0,177,250,170 61340 data189,80,195,32,210,255,201,13,240,106,200,132,5,208,238,96,162,2,32 61350 data201,255,198,1,160,0,56,165,3,229,5,165,4,229,6,176,17,177,3,170,189 61360 data80,195,32,210,255,230,3,208,232,230,4,208,228,230,1,76,204,255,160 61370 data0,152,145,250,200,208,250,96,234,232,201,13,240,1,96,145,3,224,82,240 61380 data13,176,16,169,32,232,230,3,208,241,230,4,208,237,162,2,96,145,3,224 61390 data162,240,11,169,32,232,230,3,208,243,230,4,208,239,162,2,96,96,200,177 61400 data250,201,32,240,1,96,132,5,76,218,3 61410 : 61490 rem -----------------prg loeschen 61500 printchr$(147);tab(7)"Text-Editor loeschen (j/n)?":poke198,0:wait198,1:getx$ 61510 ifx$<>"j"andx$<>"n"then61500 61520 ifx$="n"thenrun60060 61530 poke49152,0 61540 printchr$(147);:fori=peek(49152)topeek(49152)+7:print(i+6000)*10:next 61550 print"goto61540":poke49152,peek(49152)+8 61560 poke631,19:fori=632to640:pokei,13:next:poke198,10