C 64
Tips & Tricks

Programmierter Direktmodus

Programmierter Direktmodus hört sich wie ein Widerspruch in sich an. Entweder man befindet sich im Direktmodus oder es läuft ein Programm, beides gleichzeitig scheint kaum vereinbar. Dennoch gibt es eine Verbindung, die bisher ungeahnte Möglichkeiten eröffnet.

Das Geheimnis dieser Verbindung liegt im Tastaturpuffer (Tabelle 1) und dem Umstand, daß der Computer, nachdem er im Programm auf eine END-Anweisung trifft, so viele Zeichen aus dem Tastaturpuffer holt, wie der Anzahlspeicher angibt und sofort ausführt. Dies kann man sich zunutze machen, indem man mittels PRINT eine Anweisung auf den Bildschirm bringt, den Cursor veranlaßt, in diese Zeile zu springen und den Computer durch ein im Puffer abgelegtes RETURN mit der Abarbeitung der eingegebenen Bildschirmzeile fortfahren läßt. Dabei werden alle Zeichen über ihren ASCII-Code in den Puffer gebracht. Ein kleines Beispiel soll dieses Vorgehen verdeutlichen:

Geben Sie Beispiel 1 ein.

Was passiert? — Der Computer geht nach der END-Anweisung in den Direktmodus über und führt die beiden Steuerzeichen CURSOR/HOME und RETURN (CHR$(19 beziehungsweise 13)) aus. Der Cursor springt also in die erste Bildschirmzeile, wo zu lesen ist: I = I + 1 : GOTO 20 Diese Zeile führt der Computer nun aus und springt, nachdem er die Variable I um 1 hochgezählt hat, zurück in Programmzeile 20. Jetzt hilft nur noch RUN/STOP.

Beispiel 2

Dieses Programm bewirkt folgendes:

Anstelle des LIST-Befehles könnte auch ein GOTO beziehungsweise GOSUB-Befehl wieder in das Programm zurückspringen. Allerdings ist auch hier zu beachten, daß, sobald man neue Basic-Zeilen einfügt (beziehungsweise löscht), die Variablenwerte verloren gehen.

Mittels dieser Methode kann man zum Beispiel ein Programm entwickeln, das die DATA-Zeilen eines Sprites berechnet, ins laufende Programm übernimmt und dann die restlichen Programmzeilen herauslöscht, so daß nur ein Sprite-Ladeprogramm übrigbleibt, welches sofort abgespeichert werden kann. Eine weitere sinnvolle Anwendungsmöglichkeit des »Programmierten Direktmodus« können Sie den folgenden Ausführungen entnehmen.

System Lademenü

Das System soll die folgenden Aufgaben erfüllen:

  1. Mit verschiedenen Programmen (eventuell auf verschiedenen Disketten) arbeiten, ohne daß ständig LOAD und RUN gegeben werden muß.
  2. Den ärgerlichen »file not found error« verhindern, der bereits auftritt, wenn man ein Leerzeichen zuviel oder zuwenig eingibt.
  3. Programmiertes Aufrufen von Programmen (eventuell mit Parameterübergabe). Arbeiten mit dem Programmsystem ohne genaue Kenntnis der verwendeten Filenamen.

Die Idee

Mit Hilfe des Commodore-Programmes DOS 5.1 und der Methode des Programmierten Direktmodus kann man das oben genannte Ziel erreichen. Man geht dabei folgendermaßen vor:

Auf jede Diskette, die nach diesem System arbeiten soll, bringt man das Programm DOS 5.1 sowie dessen Lader unter einem möglichst kurzen einprägsamen Filenamen (hier »£«-Listing 1). Weiterhin kopiert man das Programm »Lademenü« auf jede der Disketten und trägt in dieses die Filenamen ein (Listing 2). Dabei ist darauf zu achten, daß die Filenamen »£« und »Lademenü« überall exakt gleich sind.

Der Arbeitsablauf gestaltet sich dann in folgender Weise: Nach dem Einschalten von Computer und Floppy legt man die gewünschte Diskette ein und lädt »£«. Dieses Programm initialisiert nach dem Starten die bekannten DOS 5.1-Befehle. Das RUN für »£« soll auch gleichzeitig das letzte sein, da nun der DOS-Befehl »↑« zur Verfügung steht. Mit dessen Hilfe wird das Lademenü dieser Disk geladen und gestartet, welches die Programme anbietet und automatisch richtig lädt und startet. Zusätzlich bietet das Lademenü auch einen Überblick über die wichtigsten DOS-Befehle, die ja nun zur Verfügung stehen.

Um den Kreis zu schließen wird an jedes Programm auf der Diskette anstelle des üblichen END die folgende Zeile eingefügt: PRINT CHR$(147); »Lademenü« :POKE 631,19:POKE 632,13:POKE 198,2:END

Dadurch wird nach jedem regulären Programmabbruch wieder das Lademenü dieser, oder wenn die Diskette vorher gewechselt wurde, einer beliebigen anderen Disk geladen. Nun wird durch das Lademenü das nächste ausgewählte Programm geladen und gestartet. Will man Parameter an andere Programme übergeben, so erreicht man dies über sequentielle Dateien.

Die Lösung

Ausblick

Schreibt man noch einen Autostart für »£« (eventuell mittels des Beispiels in Ausgabe 6/84) so kann man das »System Lademenü« zu einem System »Nie wieder RUN« ausbauen.

(Bernhard Lauer/rg)
10 i=1
20 print"{clr}{down}{down}{down}{down}{down}{down}"i".lauf"
30 for j=0 to 1500 : next
40 print"{clr} i=i+1 : goto 20"
50 for j=0 to 1500 : next
60 poke 631,19 : poke 632,13 : poke 198,2 : end
Beispiel 1
10 print"{clr}";
20 print 100 "rem == zeile 100 wird eingefuegt =="
30 print"350
40 print"70 rem morgenstund hat blei im hintern"
50 print"list"
60 poke 631,19 : for i=1 to 5 : poke 632 +i,13 : next
65 poke 198,6 : end
70 rem morgenstund hat gold im mund
350 rem == diese zeile wird geloescht!==
Beispiel 2
Speicherstelle (n)
dezimal hex
Tastaturpuffer 631 - 640 0277 - 0280
erweitert* 631 - 645 0277 - 0285
Anzahlspeicher 198 00C6
max. Größe des Tastaturpuffers 649 0289

* Anm.: Obwohl der Tastaturpuffer normalerweise nur 10 Zeichen faßt, können insgesamt 15 Zeichen dort abgelegt werden.

Tabelle 1
10 rem ^ = pfeil nach oben
20 poke53280,0:poke53281,0:printchr$(158)
30 ifa=0thena=1:load"dos 5.1",8,1
40 ifa=1thensys12*4096+12*256
50 print"{clr}";"^lademenue"
60 poke631,19:poke632,13:poke198,2:end
Listing 1. »£«
1 rem ^ = pfeil nach oben
2 rem _ = pfeil nach links
10 poke53281, 0:poke53280, 0:printchr$(158):printchr$(142)
20 a=0:print"{clr}":print"            UCCCCC"
22 print"              {rvon}lademenue"
25 print"            JCCCCCCCCCCCK":print:print
30 print"          1 = liste der dos befehle
31 print"          2 =beispielprogramm"
32 print"          3 =*hier muessen
33 print"          4 =*sie ihre
34 print"          5 =*programme ein-
35 print"          6 =*tragen
37 print"          7 =*
38 print"          8 =*
39 print"          9 =*
40 print"         10 = ende":print
100 input"ihre wahl";a:a=int(a):ifa<1ora>10thenprint"{clr}":goto20
105 print"{clr}";
110 onagoto300,111,112,113,114,115,116,117,118,119,
111 print"^beispielprg"        :goto200
112 print"^prg2"               :goto200
113 print"^prg3"               :goto200
114 print"^prg4"               :goto200
115 print"^prg4"               :goto200
116 print"^prg5"               :goto200
117 print"^prg6"               :goto200
118 print"^ und so weiter     ":goto200
119 poke198,0:print"ciao":end
120 poke198,0:end
200 poke639,19:poke632,13:poke198,2:end
300 print:print"der dos manager bietet folgende befehle:":print
310 print"=======================================":print
320 print"    \ = save
330 print"    / = load
340 print"    ^ = load mit autostart
350 print"    @ = anzeigen diskstatus
360 print"   @$ = anzeigen direktory
370 print"=======================================":print
380 print"diese befehle koennen sie jetzt nutzen!"
390 print"=======================================":poke198,0
395 print:print:print"               {rvon}*taste*":wait198,1:geta$:goto20
Listing 2. »Lademenü«
1 rem ^ = pfeil nach oben
100 rem beispielprogramm
110 :
120 bernhard lauer
130 :
140 print"{clr}"
150 print"an jedes listing muessen sie"
160 print"die zeile":print
170 print"print chr$(147);"chr$(34)"^lademenue"chr$(34)":poke 631,19:";
180 print"poke 632,13:poke198,2:end":print
190 print"anstelle des end anfuegen!"
200 print:print:print:print
210 print"{rvon} ** taste **"
220 poke 198,0:wait 198,1
230 print"{clr}";"^lademenue":poke631,19:poke632,13:poke198,2:end
Listing 3. »Beispielprogramm«
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →