Programm-Generator für den C 64
Diese Routine kann Basic-Zeilen innerhalb eines Basic-Programms erzeugen, löschen und in einen String einlesen, ohne Variablen zu zerstören.
Das Programm (Listing 1) ist vollständig in Maschinensprache geschrieben und belegt den Speicherbereich von $C800 bis $CA70. Nach dem Laden ist eine Initialisierung nicht notwendig. Um die Basic-Zeiger zurückzusetzen, ist nur ein NEW <RETURN> einzugeben.
Zum Erzeugen einer Basic-Zeile ist die Zeile selbst in einem String abzulegen. Anschließend kann dieser String mit
SYS51200, String
in das Basic-Programm eingebunden werden. Zum Beispiel:
A$="100 S=SQR (2):PRINTS,S+100":SYS 51200,A$
Mit dem Befehl SYS 51442, Zeilennummer, läßt sich eine Basic-Zeile innerhalb eines Basic-Programms löschen.
Der Befehl
SYS 51442,100
löscht zum Beispiel die Zeile 100. Beim Generieren oder Löschen ergeben sich folgende Einschränkungen:
- Der Aufruf (SYS 51200,A$ oder SYS 51442,100) darf nicht innerhalb einer FOR-NEXT-Schleife stehen.
- SYS 51200,A$ oder SYS51442,100 darf nicht in einem Unterprogramm stehen, falls sich die neue oder die zu löschende Zeile vor diesem Unterprogramm befindet.
Auch kann der Programm-Generator Zeilen in einen String einlesen. Dazu muß der String vorher jedoch mit beliebigen Zeichen gefüllt werden. Dabei gilt: Anzahl der Zeichen >= Anzahl der Zeichen in der zu erwartenden Zeile.
Es bietet sich natürlich an, den String mit Leerzeichen (CHR$(32)) zu belegen.
Anschließend kann die Zeile mit
SYS 51642, String, Zeilennummer
eingelesen werden.
Beispiel:
100 S=SQR(2):PRINTS,S + 100
110 A$=”
120 SYS51642,A$,100
130 PRINT A$
Nach dem Start dieses Beispiels mit RUN <RETURN> erscheint auf dem Bildschirm die Zeile 100:
S=SQR(2): PRINT S, S+100
READY.
Für dieses Programm gibt es nun eine Anzahl von Anwendungsmöglichkeiten. Es läßt sich zum Beispiel ein nur acht Zeilen langes Basic-Programm schreiben, das ein Maschinenprogramm in DATA-Zeilen ablegt (Listing 2).
Dabei wird etwa die Geschwindigkeit erreicht, die die entsprechende Routine im SMON hat. Außerdem wäre ein »intelligentes« Programm vorstellbar, das sich selbst verändert. Typische Maschinenroutinen wie RENUMBER, FIND und AUTO sind natürlich auch denkbar. Sie sehen, die Möglichkeiten dieses Programm-Generators sind nahezu unbegrenzt.
(Michael Dietz/ah)PROGRAMM : PROGRAMM GEN C800 CA64 ----------------------------------- C800 : 20 FD AE 20 9E AD 20 A3 EE C808 : B6 A0 00 85 57 B1 22 99 7E C810 : 00 02 C8 C4 57 D0 F6 A9 07 C818 : 00 99 00 02 A5 7A 8D 70 6A C820 : CA A5 7B 8D 71 CA A9 FF 61 C828 : 85 7A A9 01 85 7B 20 73 10 C830 : 00 20 6B A9 20 79 A5 84 BE C838 : 0B 8C 72 CA 20 13 A6 18 E5 C840 : A5 31 85 57 6D 72 CA 85 6B C848 : 59 A5 32 85 58 69 00 85 8D C850 : 5A 38 A5 5F E9 01 8D 73 DF C858 : CA A5 60 E9 00 8D 74 CA 1E C860 : A0 00 B1 57 91 59 38 A5 68 C868 : 57 E9 01 85 57 A5 58 E9 7D C870 : 00 85 58 38 A5 59 E9 01 1F C878 : 85 59 A5 5A E9 00 85 5A C8 C880 : AD 74 CA C5 58 D0 DB AD A9 C888 : 73 CA C5 57 D0 D4 A2 00 FB C890 : 18 B5 2D 6D 72 CA 95 2D AA C898 : E8 B5 2D 69 00 95 2D E8 07 C8A0 : E0 08 D0 EC A0 00 A5 5F B5 C8A8 : 91 5F C8 A5 60 91 5F C8 71 C8B0 : A5 14 91 5F C8 A5 15 91 E1 C8B8 : 5F C8 B9 FC 01 91 5F C8 35 C8C0 : CC 72 CA D0 F5 A0 00 18 27 C8C8 : B1 5F 6D 72 CA 91 5F 8D A4 C8D0 : 73 CA C8 B1 5F 69 00 91 75 C8D8 : 5F 8D 74 CA AD 73 CA 85 21 C8E0 : 5F AD 74 CA 85 60 B1 5F 6D C8E8 : D0 DB A9 00 8D 73 CA 4C 48 C8F0 : 79 C9 20 FD AE 20 8A AD 87 C8F8 : 20 F7 B7 A5 7A 8D 70 CA 22 C900 : A5 7B 8D 71 CA 20 13 A6 3C C908 : B0 01 60 A0 00 38 B1 5F AC C910 : 85 57 E5 5F 8D 72 CA C8 CF C918 : B1 5F 85 58 88 A5 5F 85 23 C920 : 59 A5 60 85 5A B1 57 91 C8 C928 : 59 18 A5 57 69 01 85 57 45 C930 : A5 58 69 00 85 58 18 A5 22 C938 : 59 69 01 85 59 A5 5A 69 36 C940 : 00 85 5A A5 32 C5 58 D0 A2 C948 : DC A5 31 C5 57 D0 D6 A0 94 C950 : 00 38 B1 5F ED 72 CA 91 85 C958 : 5F 8D 73 CA C8 B1 5F E9 1F C960 : 00 91 5F 8D 74 CA AD 73 EE C968 : CA 85 5F AD 74 CA 85 60 F7 C970 : B1 5F D0 DB A9 FF 8D 73 38 C978 : CA A5 9D D0 32 38 A5 14 3A C980 : E5 39 A5 15 E5 3A B0 27 4F C988 : AD 73 CA D0 11 18 AD 70 25 C990 : CA 6D 72 CA 85 7A AD 71 CC C998 : CA 69 00 85 7B 60 38 AD BF C9A0 : 70 CA ED 72 CA 85 7A AD 5D C9A8 : 71 CA E9 00 85 7B 60 AD 0A C9B0 : 70 CA 85 7A AD 71 CA 85 D3 C9B8 : 7B 60 20 FD AE 20 9E AD ED C9C0 : 20 A3 B6 A5 22 85 59 A5 13 C9C8 : 23 85 5A 20 FD AE 20 9E 5B C9D0 : AD 20 F7 B7 20 13 A6 B0 19 C9D8 : 03 4C 61 CA A5 14 85 63 8B C9E0 : A5 15 85 62 A2 90 38 20 8D C9E8 : 49 BC 20 DF BD A0 FF C8 06 C9F0 : B9 00 01 91 59 D0 F8 A9 6F C9F8 : 20 91 59 C8 84 57 A0 03 DC CA00 : 84 58 E6 58 A4 58 B1 5F 08 CA08 : F0 57 C9 22 D0 19 A4 57 72 CA10 : 91 59 E6 57 E6 58 A4 58 67 CA18 : B1 5F C9 22 F0 0D A4 57 E8 CA20 : 91 59 E6 57 4C 14 CA C9 26 CA28 : 80 10 09 A4 57 91 59 E6 BC CA30 : 57 4C 02 CA C9 FF F0 F3 CF CA38 : 38 E9 7F AA A0 FF CA F0 B1 CA40 : 08 C8 B9 9E A0 10 FA 30 C5 CA48 : F5 C8 B9 9E A0 30 0D 84 AC CA50 : 5B A4 57 91 59 E6 57 A4 79 CA58 : 5B 4C 49 CA 29 7F 4C 2B 9B CA60 : CA 60 00 31 19
10 z=100:a=10:i=51200:e=51810 20 a$=str$(z)+"data ":z=z+a 30 s$=str$(peek(i)):a$=a$+right$(s$,len(s$)-1)+"," 40 if len(a$)<35 then i=i+1:if i<e then 30 50 a$=left$(a$,len(a$)-1) 60 sys 51200,a$:print a$:i=i+1:if i<e then 20 70 i=10:goto 50000 50000 sys 51442,i:i=i+10:if i<71 then 50000