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:
- Zeile 100 wird in das Programm eingefügt
- Zeile 350 wird aus dem Programm gelöscht
- der in Zeile 70 stehende Spruch wird durch einen — meiner Meinung nach treffenderen — ersetzt
- das geänderte Programm wird gelistet.
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:
- Mit verschiedenen Programmen (eventuell auf verschiedenen Disketten) arbeiten, ohne daß ständig LOAD und RUN gegeben werden muß.
- Den ärgerlichen »file not found error« verhindern, der bereits auftritt, wenn man ein Leerzeichen zuviel oder zuwenig eingibt.
- 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
- Listing »£«
- Listing »Lademenü«
- Listing »Beispielprogramm«
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
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!==
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.
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
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
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