Stringy: C64-Erweiterung
Stringy stellt eine Basic-Interpretererweiterung dar, die den Befehlssatz des C 64 um acht Befehle ergänzt. Mit diesen Befehlen ausgestattet, kann man sich einen Programmgenerator von Basic aus programmieren.
Das Listing zu Stringy entstand mit Hilfe von Stringy. Dabei wurden die Zahlen formatiert, die Prüfsummen berechnet und nach jeder vierten Zeile angefügt. Mit Stringy kann man Strubs-ähnliche Erweiterungen programmieren (Der Grund, weshalb ich Stringy schrieb). Man könnte auch ein Programm schreiben, das die in einem Basic-Programm vorkommenden Grafikzeichen durch die entsprechenden CHR$-Funktionen ersetzt, damit sie im Listing besser zu erkennen sind. Auch Sprite- oder Bildschirmmasken-Generatoren sind recht einfach zu programmieren. Der wichtigste Befehl von Stringy ist der !INPUT-Befehl. Mit ihm kann man einen String, der eine Basic-Zeile mit Zeilennummer darstellt, bei laufendem Programm in das Basic-Programm übernehmen — ohne, daß dabei die Programmausführung unterbrochen wird.
Umgekehrt kann es sinnvoll sein, eine Zeile aus dem Basic-Programm herauszuholen, um sie einer Stringvariablen zuzuordnen. Dies ermöglicht der !GET-Befehl.
Damit es keine Komplikationen mit den Basic-Zeilennummern gibt, teilt der !NEXL-Befehl Ihnen die Folge der Zeilennummern mit.
Die anderen fünf Befehle dienen der Stringverarbeitung. Vier davon sind dem Sinn nach identisch mit den entsprechenden Stringoperationen aus Simons Basic, mit dem Unterschied, daß die Parameter beliebig komplizierte Ausdrücke sein können (dies gilt für alle Befehle von Stringy).
Der letzte der fünf Stringbefehle ist der !REPLACE-Befehl.
Die Stringy-Befehle
Nachfolgend bedeuten str1, str2, str3 immer Stringausdrücke und m, n, p, w, z immer numerische Ausdrücke.
!PLACE
Format: | !PLACE (str1,str2) |
!PLACE (str1,str2,m) | |
!PLACE (str1,str2,m,n) |
Funktion: Bestimmung der Position, an der str2 in str1 steht. Die Angabe von m und n grenzt str1 auf einen Teilstring ein. Nur dieser Teilstring von str1 wird dann durchsucht, und nicht der ganze String, m gibt den Beginn dieses Teilstrings an, gerechnet vom Anfang von str1, n bestimmt das Ende des Teilstrings. Vorsichtig: n wird vom Ende von str1 aus gezählt, also in anderer Richtung als m.
Beispiel: »PRINT !PLACE ("COMMODORE", "O")« liefert 2 als Antwort.
»PRINT !PLACE ("COMMODORE", "O",3)« liefert 5 als Antwort, da nur in "MMODORE" gesucht wurde
»PRINT !PLACE ("COMMODORE", "E", 1, 4)« liefert 0 als Ergebnis, da "E" nicht in dem Teilstring "COMMOD" enthalten ist.
!REPLACE
Format: | !REPLACE (str1,str2,str3) |
!REPLACE (str1,str2,str3,m) | |
!REPLACE (str1,str2,str3,m,n) |
Funktion: Ersetzen aller str2, die in str1 vorkommen, durch str3. Dabei kann str1, wie beim !PLACE-Befehl beschrieben, durch n und m eingegrenzt werden.
Beispiel: | 10 A$="INDEX=B$+C$" |
Nach Ausführung gilt: | B$="IN$=B$+C$" |
10 N$="PETER PAUL MARY" | |
Nach Ausführung gilt: | M$="PAUL MARY" |
!INSERT
Format: !INSERT(str1,str2,p)
Funktion: Fügt str2 in str1 ein. Die Position p bestimmt, an welcher Stelle str2 in str1 eingefügt werden soll.
Ist dabei p=0 oder p=len (str1), so wird angefügt.
Beispiel: »PRINT !INSERT ("ABCEF","D",3)« liefert: "ABCDEF"
»PRINT !INSERT ("ABCEF","D",5)« liefert: "ABCEFD"
!STOVER
Format: !STOVER (str1,str2,p)
Funktion: Überschreibt str1 mit str2.
Die Position, ab der str1 überschrieben werden soll, wird durch p angegeben.
Ist str2 länger als str1, oder ist wegen der Positionsangabe p ein Überschreiben nicht möglich, so erfolgt ein ILLEGAL QUANTITY ERROR.
Beispiel: »PRINT !STOVER ("GOTO XXXX","0169",6)« liefert: "GOTO 0169"
!DUP
Format: !DUP (str,w)
Funktion: Es wird str w-mal dupliziert.
Beispiel: A$=!DUP(".",255) liefert einen String mit 255 einzelnen Punkten.
!INPUT
Format: !INPUT(str)
Funktion: Hat str keine Zeilennummer am Anfang, so geht der Computer in den Direktmodus über und führt str sofort aus. Soll der Computer anschließend zum Programm zurückkehren, so muß der letzte Befehl in str ein »GOTO (Zeilennummer)« sein.
Beginnt str mit einer Zeilennummer, so wird str als Basic-Zeile in das laufende Programm eingefügt, sofern in dem Programm nicht bereits eine Zeile mit derselben Zeilennummer existiert. Andernfalls wird die betreffende Zeile vor dem Einfügen gelöscht. Wenn allerdings diese zu löschende Zeile eine noch offene FOR…TO-Anweisung oder ein noch nicht durch RETURN abgeschlossenes GOSUB enthält, so erfolgt ein CAN’T CONTINUE ERROR.
Die gleiche Fehlermeldung erscheint auch, wenn Sie eine Zeile löschen wollen, in der sich der DATA-Zeiger momentan befindet. Beispiel:
10 DATA56
20 READA:!INPUT(STR$(10))
Nach RUN erfolgt ein CAN’T CONTINUE ERROR, da sich der DATA-Zeiger in Zeile 10 befindet. Durch einen RESTORE-Befehl, läßt sich diese Zeile dennoch löschen:
10 DATA56
20 READA:RESTORE:!INPUT("10")
Nach Ausführung dieser beiden Zeilen ist die Zeile 10 gelöscht. Enthielt die gelöschte Basic-Zeile eine DEF-Anweisung, so gilt diese Funktion als nicht definiert. Enthielt die gelöschte Basic-Zeile eine Stringvariablenzuordnung der Art »AA$="ABCD"« oder »A$(n)="ABCDE"«, so ist anschließend die Variable nur noch als Leerstring definiert.
Soll der !INPUT-Befehl direkt nach einem THEN stehen, dann ist ein Doppelpunkt einzufügen »…THEN:!INPUT…«
!GET
Format: !GET(z)
Funktion: Es wird die Basic-Zeile mit der Zeilennummer z in Stringformat geholt. Der Parameter z darf dabei nicht den Wert 0 haben. Beispiel:
10 REM !GET-DEMO
20 PRINT!GET(10):PRINT!GET(20)
30 A$ = !GET(30)
40 PRINT MID$(A$,!PLACE(A$," ") + 1)
!NEXL
Format: !NEXL(z)
Funktion: Es wird die auf z folgende Basic-Zeilennummer geholt. Hat !NEXL(z) den Wert 0, so bedeutet dies, daß auf z keine Basic-Zeilen mehr folgen. Beispiel:
10 REM !NEXL-DEMO
20 REM SIMULATION DES LIST-BEFEHLS
30 Z = 0
40 Z=!NEXL(Z):IF Z = 0 THEN END
50 PRINT !GET(Z):GOTO 40
Zum Schluß noch einige Daten zu Stringy. Stringy belegt den Speicher von $c100 bis $c85a. Der Bereich von $c000 bis $c0ff dient als Stringzwischenspeicher (je nach Befehl wird dieser Raum benutzt). Die Speicherplätze $c85b bis $c865 dienen als Zwischenspeicher für einige wichtige Betriebssystemdaten. Der unter dem Basic-ROM liegende Speicherbereich wird mitbenutzt.
(Karl Szameitat/ev)0 rem stringy by karl szameitat, muehlenstr 8b, 2355 wankendorf 100 data238,000,192,208,003,076,113,165,238,017,193,208,003,238,018,193 101 data141,071,192,096,165,001,041,254,133,001,096,165,001,009,001,133 102 data001,096,169,000,162,160,133,020,134,021,133,002,162,192,160,000 103 data177,020,145,020,200,208,249,230,021,228,021,208,241,169,096,141,7522 104 data020,167,141,038,181,160,005,169,234,153,209,166,136,016,250,160 105 data002,153,237,164,136,016,250,169,000,162,193,141,072,171,142,073 106 data171,169,243,141,000,003,142,001,003,169,122,141,008,003,142,009 107 data003,169,170,141,010,003,142,011,003,096,032,115,000,008,201,033,6890 108 data240,004,040,076,231,167,032,115,000,201,133,208,004,104,076,015 109 data196,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234 110 data234,234,234,234,234,234,234,076,008,175,169,000,133,013,032,115 111 data000,008,201,033,240,004,040,076,141,174,104,032,115,000,160,006,9045 112 data217,077,200,240,005,136,016,248,048,199,185,084,200,168,032,115 113 data000,217,032,200,208,187,200,201,040,208,243,185,032,200,072,185 114 data033,200,072,076,115,000,169,000,162,192,141,017,193,142,018,193 115 data076,016,193,138,048,010,169,000,133,002,032,027,193,076,058,164,7638 116 data076,116,164,032,020,193,134,035,104,133,020,104,133,021,169,006 117 data032,251,163,230,002,160,011,185,165,000,072,136,016,249,165,021 118 data072,165,020,072,166,035,134,174,169,165,162,000,133,175,134,176 119 data032,158,173,032,143,173,160,002,177,100,145,175,136,016,249,165,7306 120 data100,164,101,032,219,182,198,174,240,011,032,253,174,230,175,230 121 data175,230,175,208,219,162,001,032,121,000,201,041,240,006,032,253 122 data174,032,158,183,134,174,162,001,201,041,240,006,032,253,174,032 123 data158,183,134,175,076,247,174,032,230,193,165,073,072,165,074,072,8831 124 data032,138,173,032,247,183,032,247,174,032,019,166,032,020,193,032 125 data189,166,032,027,193,104,133,074,104,133,073,169,001,162,192,133 126 data111,134,112,173,017,193,076,192,180,166,168,165,166,197,175,240 127 data023,160,000,177,166,209,169,208,006,202,240,011,200,208,244,230,8555 128 data166,208,230,230,167,208,226,024,096,165,174,240,025,165,175,240 129 data021,198,174,198,175,024,165,174,101,175,176,010,101,168,176,006 130 data197,165,240,005,144,003,076,072,178,024,165,166,101,165,056,229 131 data175,056,229,168,133,175,230,175,024,165,166,101,174,133,166,144,9181 132 data002,230,167,096,162,002,032,003,194,165,168,240,034,165,165,240 133 data030,197,168,144,026,165,166,072,032,201,194,032,169,194,104,176 134 data014,229,166,073,255,170,232,032,051,195,138,168,076,162,179,162 135 data000,240,244,104,133,020,104,133,021,160,244,104,153,177,255,200,8729 136 data208,249,165,021,072,165,020,072,198,002,208,003,032,027,193,096 137 data162,003,032,003,194,024,165,166,133,034,101,165,133,037,165,167 138 data133,035,032,230,193,032,201,194,032,169,194,144,004,165,037,133 139 data166,165,166,197,034,240,015,160,000,177,034,032,000,193,230,034,7186 140 data208,239,230,035,208,235,165,034,197,037,240,037,024,160,000,165 141 data034,101,168,133,034,144,002,230,035,196,171,240,008,177,172,032 142 data000,193,200,208,244,165,034,197,037,240,006,032,191,194,076,107 143 data195,032,051,195,076,155,194,162,002,032,003,194,165,168,240,008,8087 144 data165,165,240,004,197,174,176,003,076,072,178,024,101,168,176,248 145 data032,125,180,138,208,001,136,202,142,017,193,140,018,193,160,000 146 data140,000,192,196,174,240,014,177,166,032,000,193,200,198,165,208 147 data242,165,168,240,020,152,170,160,000,177,169,032,000,193,200,198,8633 148 data168,208,246,138,168,165,165,208,222,032,051,195,076,202,180,160 149 data011,185,165,000,153,091,200,136,016,247,032,166,179,032,115,000 150 data032,250,174,032,158,173,032,247,174,032,163,182,201,089,144,003 151 data076,113,165,170,208,003,076,055,198,165,122,164,123,133,165,132,8466 152 data166,160,000,132,167,132,168,132,169,232,202,240,008,177,034,153 153 data000,002,200,208,245,138,153,000,002,202,160,001,134,122,132,123 154 data032,115,000,144,003,076,019,200,032,107,169,032,121,165,132,011 155 data032,019,166,176,003,076,216,196,032,072,198,176,036,166,020,164,7200 156 data021,196,064,208,020,228,063,208,016,165,043,229,065,008,201,001 157 data208,015,040,165,044,229,066,208,008,196,058,208,009,228,057,208 158 data005,162,026,076,055,164,165,095,072,165,096,072,056,160,000,177 159 data095,133,167,229,095,133,169,200,177,095,133,168,032,131,198,162,7546 160 data000,056,181,045,229,169,149,045,232,176,002,214,045,232,224,006 161 data208,239,104,133,096,104,133,095,173,000,002,208,005,133,011,076 162 data031,197,024,165,049,133,090,101,011,133,088,164,050,132,091,144 163 data001,200,132,089,032,184,163,162,000,024,181,045,101,011,149,045,6847 164 data232,144,002,246,045,232,224,004,208,239,165,020,164,021,141,254 165 data001,140,255,001,164,011,136,185,252,001,145,095,136,016,248,032 166 data051,165,165,165,164,166,032,182,198,133,122,132,123,165,065,164 167 data066,032,182,198,133,065,132,066,032,206,198,165,045,166,046,133,8216 168 data034,134,035,160,000,177,034,016,007,200,177,034,048,007,016,031 169 data200,177,034,048,077,024,165,034,105,007,133,034,144,002,230,035 170 data165,035,197,048,144,221,165,034,197,047,144,215,076,187,197,200 171 data200,177,034,170,136,177,034,032,028,199,176,028,032,050,199,145,6648 172 data034,200,138,145,034,200,200,177,034,170,136,177,034,032,050,199 173 data145,034,138,200,145,034,208,189,169,000,168,145,034,200,145,034 174 data208,179,200,200,200,177,034,170,136,177,034,032,028,199,176,232 175 data032,050,199,145,034,200,138,145,034,208,154,165,047,166,048,133,8228 176 data034,134,035,228,050,208,013,197,049,208,009,076,055,198,165,036 177 data166,037,208,235,024,160,002,113,034,133,036,200,138,113,034,133 178 data037,160,000,177,034,048,231,200,177,034,016,226,160,004,177,034 179 data010,105,005,101,034,133,034,144,002,230,035,160,000,177,034,240,6620 180 data022,200,200,177,034,170,136,177,034,032,028,199,176,034,032,050 181 data199,145,034,200,138,145,034,024,165,034,105,003,133,034,144,002 182 data230,035,165,035,197,037,144,211,165,034,197,036,144,205,176,158 183 data169,000,168,145,034,240,224,160,244,185,103,199,153,177,255,200,8065 184 data208,247,032,121,000,076,231,167,186,189,003,001,201,141,240,006 185 data201,129,240,027,024,096,189,004,001,197,020,208,007,189,005,001 186 data197,021,240,241,024,138,105,007,170,201,248,144,220,176,229,189 187 data017,001,197,020,208,007,189,018,001,197,021,240,216,024,138,105,7736 188 data018,208,229,160,000,177,095,133,034,200,177,095,133,035,165,049 189 data133,036,165,050,133,037,136,177,034,145,095,165,036,197,034,208 190 data007,165,037,197,035,208,001,096,230,034,208,002,230,035,230,095 191 data208,229,230,096,208,225,196,096,144,013,240,012,229,169,176,001,7971 192 data136,024,101,011,144,001,200,096,197,095,144,251,176,236,186,189 193 data003,001,201,141,240,005,201,129,240,028,096,189,006,001,188,007 194 data001,032,182,198,157,006,001,152,157,007,001,024,138,105,007,170 195 data201,248,144,219,176,228,188,019,001,189,020,001,032,182,198,157,7404 196 data020,001,152,157,019,001,189,004,001,188,005,001,032,182,198,157 197 data004,001,152,157,005,001,024,138,105,018,208,211,228,168,144,006 198 data208,014,197,167,176,010,228,096,144,007,208,005,197,095,176,001 199 data024,096,228,052,240,004,176,023,144,004,197,051,176,017,228,096,6562 200 data144,013,240,012,229,169,176,001,202,024,101,011,144,001,232,096 201 data197,095,144,251,176,238,162,002,032,003,194,165,168,240,004,165 202 data165,208,003,076,072,178,024,166,174,240,248,202,134,174,138,101 203 data168,197,165,240,002,176,236,165,165,032,125,180,134,033,132,034,8518 204 data164,165,136,177,166,145,098,152,208,248,024,165,174,101,033,133 205 data033,144,002,230,034,164,168,136,177,169,145,033,152,208,248,032 206 data051,195,076,202,180,076,227,168,162,001,032,003,194,165,165,208 207 data003,076,072,178,032,230,193,166,174,240,246,160,000,177,166,032,8614 208 data000,193,200,196,165,208,246,202,208,241,032,051,195,076,155,194 209 data032,138,173,032,247,183,032,019,166,160,000,144,039,177,095,133 210 data020,200,177,095,133,021,177,020,240,021,200,200,177,020,170,136 211 data177,020,133,099,134,098,162,144,056,032,073,188,076,247,174,169,8321 212 data000,170,240,238,200,177,095,240,246,166,095,165,096,134,020,133 213 data021,208,215,169,255,133,058,032,121,165,032,115,000,076,055,198 214 data040,194,118,076,065,067,069,040,195,003,069,080,076,065,067,069 215 data040,195,079,078,083,069,082,084,040,195,182,164,086,069,082,040,7129 216 data199,085,085,080,040,199,167,069,088,076,040,199,207,161,080,082 219 data073,083,068,078,000,003,010,019,027,034,039,2291 300 : 310 rem poke/pruefroutine 320 : 330 restore:ad=49408:ze=100 340 pr=0 350 readpo:ifpo>255then370 360 pr=pr+po:pokead,po:ad=ad+1:goto350 370 ifpo<>prthenprint"fehler in zeilen"ze"bis"ze+3:end 380 ifpo=2291thenprint"datas ok - save programm und starte mit sys49442":end 390 ze=ze+4:goto340