Auto-Save
Wenn Ihnen beim Abtippen eines Programms schon mal der Strom ausgefallen ist, dann ist das folgende Programm genau das richtige für Sie.
Die abgedruckten Listings in den Fachzeitschriften sind ja eine willkommene Programmquelle. Allerdings ist das Abtippen der oft sehr langen Programme eine sehr mühselige Angelegenheit. Besonders groß wird der Ärger, wenn ein Stromausfall beziehungsweise ein Hardware-Defekt stundenlange Tipparbeit zunichte machen. Abhilfe schafft hier nur das umständliche Zwischenspeichern in gewissen Abständen, doch das wird oft vergessen oder aus Bequemlichkeit unterlassen.
Das hier vorgestellte Programm nimmt nun dem geplagten Computer-Benutzer diese Arbeit ab. Es speichert automatisch das bisher Getippte in Intervallen oder auch auf Knopfdruck ab. Bitte tippen Sie vor der Benutzung Listing 1 mit dem MSE und Listing 2 mit dem Checksummer ab. Vergessen Sie das Speichern nicht!
Hinweise zur Benutzung:
Geladen wird das Programm mit LOAD"AUTO-SAVE",8 und anschließendem RUN. Der Maschinensprachteil wird nachgeladen und dann der Name des einzutippenden Programms erfragt. Keine beziehungsweise Eingabe von Leerzeichen wird abgefangen.
Bei der Eingabe des Speicher-Intervalls ist folgendes zu beachten: Die Intervalle werden nicht durch die Zeit, sondern durch die Speicherbelegung gesteuert. Dies geschieht durch eine Abfrage der Speicherstelle 46. Diese enthält das High-Byte des Zeigers auf den Variablen-Anfang (=Programmende). Gibt man also als Intervall zum Beispiel 4 ein, so wird immer dann, wenn 1 KByte Programmtext neu im Speicher stehen, zwischengespeichert. Um außerdem besonders schwierige Programmteile, zum Beispiel Bildschirmmasken oder mathematische Formeln, sofort zu speichern, gibt es die Möglichkeit, per Knopfdruck ein Speichern auszulösen.
Dies geschieht durch Drücken der @-Taste (Klammeraffe) und anschließendem RETURN. Diese Funktion kann mit POKE 49177,ASC("taste") leicht auf jede andere Taste verlegt werden.
Beendet werden kann das Programm durch RUN STOP/RESTORE oder einen Reset, neu wird es gestartet mit SYS 49152.
Erläuterungen zum Programm: »SAVE.OBJ«:
Die Gliederung des Maschinenprogramms läßt sich am besten anhand einer Tabelle durchführen:
| Speicherbereich hexadezimal | Belegung |
|---|---|
| $C000-C014 | INIT |
| $C015-C02A | BEFEHL |
| $C02B-C037 | AUTO |
| $C038-C0A6 | SAVE |
| $C0A7-C0D2 | Textmeldung |
| $C0D3 | Sollwert |
| $C0D4 | Intervall |
| $C0D5 | Namenlänge |
| $C0D6 | Namenlänge+ 2 |
| $C0D7-C0D8 | "S:" |
| $C0D9 | Programmname |
INIT: Zwei Vektoren werden umgeändert und damit das Maschinenprogramm aktiviert.
BEFEHL: Dieser Teil wird über den Vektor "Neuen Basic-Befehl ausführen" (dez. 776-777) angesprungen. Er prüft, ob der Klammeraffe beziehungsweise die festgelegte Taste gedrückt wurde. Falls ja, wird zu SAVE verzweigt, ansonsten wieder in die Interpreterschleife.
AUTO: Diese Routine wurde über den "Zeiger auf Tastatur-Dekodiertabelle" (dez. 655-656) eingebunden. Bei jedem Tastendruck wird der Inhalt der Speicherstelle 46 mit dem Sollwert (siehe oben) verglichen und bei Gleichheit wiederum SAVE angesprungen.
SAVE: Der eigentliche Hauptteil des Programms. Er wird von den oben genannten Routinen angesprungen und hat mehrere Aufgaben:
— »Sollwert« um »Intervall« erhöhen
— bisherigen Programmteil löschen
— neuen Programmteil speichern
— Textmeldung ausgeben.
Um den »Replace«-Befehl mittels Klammeraffen, der bekanntlich seine Tücken hat, zu umgehen, wurde der etwas umständlichere Weg gewählt, vor dem Speichern einen »Scratch«-Befehl an das Laufwerk zu senden und somit das alte Programm zu löschen.
Die Meldung »Saving« des Interpreters wird unterdrückt und statt dessen der Text »Programm wird abgespeichert« ausgegeben. Wem diese Meldung nicht gefällt, der kann sie leicht ändern, indem er sie im ASCII-Format in den oben genannten Speicherbereich schreibt.
(Manfred Lins/bs)PROGRAMM : SAVE-OBJ C000 C0D5 ----------------------------------- C000 : A2 15 A0 C0 8E 08 03 8C BB C008 : 09 03 A2 2B A0 C0 8E 8F 0A C010 : 02 8C 90 02 60 20 73 00 92 C018 : C9 40 F0 06 20 79 00 4C 65 C020 : E7 A7 20 73 00 20 38 C0 B5 C028 : 4C 7B A4 A5 2E CD D3 C0 32 C030 : D0 03 20 38 C0 4C 48 EB F8 C038 : A9 01 A2 08 A0 6F 20 BA 87 C040 : FF A9 00 20 BD FF 20 C0 F6 C048 : FF A9 08 20 B1 FF A9 6F C3 C050 : 20 93 FF A2 00 BD D7 C0 5D C058 : 20 A8 FF E8 8A CD D6 C0 DD C060 : D0 F3 A9 08 20 AE FF A9 60 C068 : 01 20 C3 FF AD D3 C0 18 17 C070 : 6D D4 C0 8D D3 C0 A2 00 F7 C078 : BD A7 C0 20 D2 FF E8 8A 23 C080 : C9 2C D0 F4 A9 00 A2 08 67 C088 : 20 BA FF A2 D9 A0 C0 AD 5A C090 : D5 C0 20 BD FF A9 00 85 DD C098 : 9D A9 2B A6 2D A4 2E 20 9A C0A0 : D8 FF A9 80 85 9D 60 11 DB C0A8 : 20 20 20 20 20 12 20 50 98 C0B0 : 52 4F 47 52 41 4D 4D 20 BA C0B8 : 57 49 52 44 20 41 42 47 75 C0C0 : 45 53 50 45 49 43 48 45 C6 C0C8 : 52 54 20 92 20 20 20 20 63 C0D0 : 20 20 11 01 08 BD
1 rem ******************************** 2 rem * * 3 rem * auto - save * 4 rem * * 5 rem * 1985 by manfred lins * 6 rem * reitacker 1 * 7 rem * 6492 zuentersbach * 8 rem * * 9 rem ******************************** 10 : 11 : 12 rem maschinen-programm nachladen 13 if r=0 then r=1:load"save-obj",8,1 14 : 16 print chr$(147)chr$(18)" auto - save " 19 print:print:print 21 : 22 rem name eingeben 23 print" programmnamen (max. 16 zeichen) ein-" 24 print" geben :" 25 : 26 s=10:z=6:gosub 62 27 if a$="" or left$(a$,1)=" " then 26 28 : 29 rem namen und laenge abspeichern 30 n$="s:"+left$(a$,16):l=len(n$) 31 poke 49365,l-2:poke 49366,l 32 : 33 for i=1 to l:poke 49366+i,asc(mid$(n$,i,1)):next i 36 print:print 39 rem intervall eingeben 40 print" abspeicher-intervall (256 byte = 1)" 41 print" eingeben :" 43 s=13:z=10:gosub 62 46 rem intervall abspeichern 47 i=val(a$):if i<1 then i=1 48 poke 49363,8+i:poke 49364,i 51 rem maschinenprogramm initialisieren 52 sys 49152 53 : 54 rem ladeprogramm loeschen 55 new:end 60 rem unterprogramm stringeingabe 62 print chr$(144):open 1,0 63 poke 214,z:poke 211,s:sys 58640 64 input#1,a$ 65 close 1:print chr$(154):return