ON KEY (TSB)/Anwendungsbeispiel

Aus C64-Wiki
Zur Navigation springenZur Suche springen

<< zurück zu ON KEY (TSB)


Hier eine umfangreich kommentierte Kurzanwendung des Befehls ON KEY. Die Idee dazu entstand vor einiger Zeit im Forum64. Die Programmteile können hier kopiert und in einen Emulator wie z.B. VICE direkt eingespeist werden. Die in geschweifte Klammern gesetzten Zeichen müssen dann aber von Hand ersetzt werden. Der hier verwendete Zeichensatz befindet sich auf der TSB-Demo-Diskette und stammt aus dem 64'er Magazin-Ausgabe 5/88. Er wurde entworfen von Ralph Schmieder.

Programm "forum64.tsb"[Bearbeiten | Quelltext bearbeiten]

Start des Programms, Einbinden eines fensterorientierten Zeichensatzes und in Zeile 30 Definieren der ON-KEY-Hotkey-Tasten und deren Auswertung (siehe unten). Die zulässigen Tasten sind die vier Cursortasten und die Tasten g , w , s , l , o  und x  und Return ,:

 10 dr=peek(190)
 13 if display <>$cc00 then do
 14   mem: print "wait..."
 15   load "zeichensatz",0,0,$e800
 17 done
 20 init
 30 on key k$ :disable:auswertung:resume

Da mit MEM auf einen neuen Zeichensatz umgeschaltet wird, verhindern die Zeilen 13 bis 17, dass dieser bei jedem RUN neu geladen wird. Ist DISPLAY auf $CC00, ist der Zeichensatz bereits initialisiert.

Zeile 20 ruft die Variablen-Initialisierung (in Zeile 10000 ff) auf:

10000 proc init
10010   dim a$(2),mn,um,zl,sp,br,ho,f,im,x,c,bt
10020   sp=1: f=11: um=1: mn=1
10025   k$="{left}{up}{right}{down}gwslox"+chr$(13)
10030   a$(0)="{c=+}{c=t}{c=i}{c=g} {c=l}{c=-}{c=k}{shift-}"
10040   a$(1)="{c=c}{c=e}{c=x}{c=f} {c=u}{c=v}{c=r}{c=b}"
10050   a$(2)="{c=m}{c=pfund}{shift pfund}{c=g} {c=n}{c=z}{c=@}{c=s}"
10060   print "{clear}{ctrl n}{ctrl h}";: colour 11,1,f
10070   fill 0,0,40,25,96,f
10080   mbar
10090 end proc

In A$(..) befinden sich die Fenster-Definitionen, im folgenden Bild besser erkennbar (die Variable A$(0) - ein windows-ähnliches Fenster - wird im Programm nicht verwendet):

TSB-Fenster-Definitionszeichen


Die Zeilen 10060 bis 10080 erzeugen die Benutzeroberfläche des Programms, zuerst die Farben, dann den Hintergrund und zum Schluss den Menübalken:

Benutzeroberfläche des Programms


Dann definieren wir die Routinen, mit denen die Menünavigation visualisiert wird: Erzeugen einer Menübox ("MBOX"), erzeugen des Menübalkens ("MBAR", der in INIT schon verwendet wurde) und erzeugen eines beliebigen Fensters ("BOX"):

600 proc mbox
610   inv 0,sp,6,1
620   fill 1,1,20,6,96,f
630   insert a$(2),zl,sp,br+2,ho,f
640 end proc 

700 proc mbar
710   print "{home} Datei Grafik "
720 end proc 

650 proc box
670   insert a$(bt),zl,sp,br,ho,f
680 end proc

Wobei Zeile 610 die Menü-Überschrift markiert und Zeile 620 vorherige Kästen vom Bildschirm weglöscht. Die INSERT-Befehle erzeugen mit A$(..) die entsprechenden Kästen.

Jetzt kommt der wichtigste Teil des Programms, die Routine, die die ON-KEY-Tastendrücke auswertet:

9000 proc auswertung
9010   c=peek($c5ec): poke $c5ec,0
9020   if c=29 then t=3
9025   if c=157 then t=7
9030   if c=17 then t=5
9035   if c=145 then t=1
9040   if c=13 then t=128: if mn=0 then t=7
9045   if c=87 then im=-1: mn=2: um=2
9050   if c=71 then im=-1: mn=2: um=1
9055   if c=79 then im=-1: mn=2: um=3
9060   if c=76 then im=-1: mn=1: um=1
9065   if c=83 then im=-1: mn=1: um=2
9070   if c=88 then t=128
9080 end proc

Diese Routine wird nach dem ON KEY in Zeile 30 bei jedem beliebigen Tastendruck aufgesucht. Sie holt die von ON KEY registrierten Tastendrücke aus der Speicherstelle $C5EC ab (in die Variable C) und löscht die Übergabestelle sofort (geschieht nicht automatisch!) Danach werden die CHR$-Werte der Tastendrücke mit Bedeutung versehen. Da das Programm auch mit einem Joystick bedient werden kann, hält es in der Variablen T die entsprechenden Richtungen fest: 1 = nach oben, 3 = nach rechts, 5 = nach unten und 7 = nach links, Feuer ist 128 (Zeilen 9020 bis 9040). Die Zeilen 9045 bis 9070 reagieren auf die oben genannten Hotkeys. Hier legen wir mit MN und UM das jeweils aufzurufende Menü und Untermenü fest. IM ist das Aktivierungsflag, auf das in Zeile 240 reagiert wird (siehe unten). Dies alles geschieht aus der Hauptprogrammschleife zwischen den Zeilen 100 und 250 heraus:

100 repeat: x=0: if joy(2) then t=joy(2)
190   if t=128 then x=t
200   if t=3 then im=-1: mn=mn+1: um=1: if mn>2 then mn=2
210   if t=7 then im=-1: mn=mn-1: um=1: if mn<1 then mn=1
220   if t=1 then um=um-1: im=-1
230   if t=5 then um=um+1: im=-1
240   if im then verteiler: im=0: t=0
250 until x

Hier (in Zeile 100) fragen wir einen Joystick in Port 2 ab (JOY(2)). Wird er nicht bewegt, liefert JOY eine Null, ansonsten in der Variablen T die genannten Werte von 1 bis 7 und 128 für Feuer. Auch hier ist IM das Aktivierungsflag für eine Änderung in der Menünavigation. Und genau dann, wenn etwas geändert wurde, tritt die Abfrage in Zeile 240 in Kraft und ruft die Routine "verteiler" auf, um zu entscheiden, welche Aktion nun durchgeführt werden soll (wobei die Zeile 305 nur eine Kontrollroutine ist, die die letzte Cursorbewegung anzeigt, sie kann auch weggelassen werden):

300 proc verteiler
305   if t<>tt then insert a$(1),2,22,6,3,f: print at(23,3)t: tt=t
310   if mn=1 then menue1
320   if mn=2 then menue2
340 end proc

Hier verzweigt das Programm je nach Inhalt der Variablen MN für das aktuelle Menü eben dorthin, zu "menue1" oder "menue2":

400 proc menue1
405   if um<1 then um=2
407   if um>2 then um=1
409   mbar
410   br=9: sp=1: zl=1: ho=4: mbox
440   print at(sp+1,zl+1)"Laden"
460   print at(sp+1,zl+2)"Speichern"
480   inv um+1,sp+1,br,1
490 end proc 

500 proc menue2
505   if um<1 then um=3
507   if um>3 then um=1
509   mbar
510   br=6: sp=7: zl=1: ho=5: mbox
540   print at(sp+1,zl+1)"Gas"
550   print at(sp+1,zl+2)"Wasser"
560   print at(sp+1,zl+3)"Strom"
580   inv um+1,sp+1,br,1
590 end proc

Die Zeilen 405 bis 409 (und ebenso 505 bis 509) steuern die Umläufigkeit der Navigation: Ist man ganz unten und geht weiter nach unten, kommt man ganz oben im Menü an. Die Zeile 410 (510) öffnet den Menükasten und die folgenden Zeilen füllen ihn mit Inhalt. Der aktuelle Menüpunkt wird in Zeile 480 (580) hervorgehoben.

Man verlässt das Programm mit der Taste x , wobei in Zeile 270 bei einem bestimmten letzten Menüpunkt ("Wasser") ein Fenster geöffnet wird, nur um zu zeigen, dass hier das Programm weitergehen könnte (die Variable BT steht für "Boxtype"):

255 
260 fill 1,1,20,6,96,f: mbar: print at(0,12)"";
270 if mn=2 and um=2 then zl=3: sp=3: br=20: ho=15: bt=2: box
280 
295 end


Hier ein Screenshot, bei dem sich das Programm in Aktion befindet. Rechts im kleinen Fenster sieht man, was Zeile 305 macht. Es wurde zuletzt eine Bewegung nach oben durchgeführt.

Das Programm in Aktion


Mit den Hotkey-Tasten (fast immer die Großbuchstaben) würde man direkt in die entsprechenden Menüs gelangen, mit w  also in das angezeigte Menü (da das "S" zweimal vorkommt, gilt für den Menüpunkt "Strom" das o .

Viel Vergnügen!