Tool: Directory Selector
DirSelect
DirSelect
Was vorher war

In den letzten Jahren hat sich Peter Hagemann, der im Mai 2023 gestorben ist, ganz intensiv mit Simons' Basic und dessen Erweiterung Simons' Basic Extension (auch unter dem Namen Simons' Basic II bekannt) beschäftigt. Alle C64-Wiki-Einträge dazu stammen von ihm, ein Projekt, das er aber nicht mehr abschließen konnte.

Natürlich hat er sich auch mit TSB auseinandergesetzt und ganz unverzichtbare Beiträge dazu geleistet, etwa die Flexibilisierung von SCRLD und SCRSV durch SCRLD/SV DEF und eine ganz lange Reihe von nützlichen Verbesserungsvorschlägen und Tipps und Tricks zur Arbeit mit TSB. Im C64-Wiki kann man alle diese Projekte gut nachverfolgen.

Zuletzt hat er sich mit der Erstellung eines Diashow-Programms zur Anzeige von PETSCII-Grafiken beschäftigt, "Show PET Pix". Um eine automatische Diashow benutzerfreundlich zu gestalten, hat er dazu ein altes Tool ("directory") aus dem 64'er Sonderheft Nr. 15 (S. 154, PDF) ausgegraben, was von ihm aber damals schon verbessert worden war. Die Anregung dazu kam von C64-Unterstützer Retrofan und vom TSB-Projekt ByPixx. Die letzte Version (v6) des "directory"-Tools war dann die Vorlage für das nun vorliegende dirselect.

<nach oben>


Unterschiede

Das Tool "dirselect" ist flexibler in der Anwendung als "directory_6": Bisher konnte man lediglich einstellen, an welcher horizontalen Bildschirmposition das Directory der eingelegten Floppy ausgegeben wurde (Spalte 0 bis 22). Die Anzahl der angezeigten Directory-Einträge konnte man nicht beeinflussen, die Ausgabe reichte bis zur untersten Zeile (wenn entsprechend viele Dateien auf Disk waren), entsprechend 24 Einträgen. Wenn die Bildschirmhöhe zur Ausgabe nicht ausreichte, bewegte man sich durch Scrollen in der Ausgabeliste vorwärts (und rückwärts).

Mit der Returntaste konnte man eine Datei auswählen, deren Name dann in einer Variablen zur Weiterverarbeitung abgelegt wurde. Peter hat noch die Möglichkeit einiger anderer Tastendrücke ins Tool eingebaut ("h", das man im Basicprogramm als "Hilfe"-Taste interpretieren konnte, ebenso die Taste "n" und die Leertaste). Mit der Linkspfeiltaste verließ man das Tool.

Die wichtigsten dieser Features gelten in "dirselect" weiterhin: Man kann die Ausgabe horizontal steuern (Spalte 0 bis 22). Es gibt weiterhin Tasten, die im Tool abgefragt werden und ans Basic-Programm übermittelt werden können (statt "n" jetzt "v", weil "n" oft für "j/n"-Abfragen verwendet wird und damit kollidieren könnte) und die im Tool ausgewählte Datei wird weiterhin ans Basic-Programm übermittelt.

Neu ist jedoch, dass die Länge der Ausgabeliste flexibel ist. Wenn man in seinem Screen-Design nur Platz für eine Ausgabe von 10 Dateien erübrigen kann, so lässt sich das jetzt einstellen. Damit ist jetzt auch die vertikale Position der Ausgabeliste steuerbar.

<nach oben>

Bedienung von dirselect

Der Aufruf des Tools dirselect erfolgt nun so:

Wie man sieht, liegt die Routine an Speicherposition $C000, d.h. sie darf nicht verwendet werden, wenn im weiteren Programm die hochauflösende Grafik (mit HIRES) ins Spiel kommt (in diesem Fall sollte man den Code der Routine neu an die Adresse $7000 assemblieren). Hierbei bedeuten fn$: Filename des mit Return in der Liste ausgewählten Programms, ln: Länge der Ausgabeliste (Anzahl der angezeigten Dateinamen, der Diskname zählt nicht mit).

Der Directory-String (hier: "$") kommt mit beliebigen Filtern klar (z.B. "*=p" für "alle PRG-Dateien").

Die Angabe der Ausgabespalte des Original-directory_v6-Tools dagegen ist weggefallen, das wird jetzt mit PRINT AT erledigt (was auch gleich die senkrechte Position übermittelt). Auch die Laufwerksangabe kann in TSB genausogut von USE vorgenommen werden, sodass der im Original optionale Parameter Drive in dirselect durch die Angabe der Anzahl der direkt angezeigten Dateinamen ersetzt wird. Im Direktmodus (ohne eine Längenangabe) eingegeben entsteht die Ausgabeliste direkt unterhalb des Befehls und reicht bis zur untersten Bildschirmzeile. Das im Speicher befindliche Basic-Programm wird dabei nicht korrumpiert.

Im Original muss man die Speicherposition des Namenspuffers und seine Länge (in Pages) per POKE (nach 780 und 781, als Übergabeparameter für SYS) angeben. In dirselect ist das optional, es wird (bei Verzicht auf die beiden POKEs) ein Puffer für 96 Dateien an $6A00 angelegt. dirselect behebt dabei auch gleich einen Fehler im Original, der zu Abstürzen führen konnte: Beim Verlassen des Tools setzt es jetzt die SYS-Übergabebytes 780 und 781 zurück auf Null.

<nach oben>

dirselect.dmo

Auf der TSB-Disk ist ein Demo-Programm ("dirselect.dmo"), das zeigen soll, wie flexibel bei dirselect der Ort der Ausgabe der Liste gehandhabt werden kann: Es wechselt einfach von Tastendruck zu Tastendruck zufallsgesteuert die Position der Ausgabeliste und auch seine Länge. Im Demo wird immer ein Rahmen um die Directory-Liste gezeichnet. Das sieht einerseits besser aus, dient aber andererseits auch dazu, die Screen-Begrenzungen zu überwachen, vor allem nach unten, denn dort würde ein Überstand das Basic-Programm zerstören.

<nach oben>


Show PET Pix

Im dirselect-Demo wird bei jedem Neuaufbau der Liste die Liste auch komplett neu von Disk geladen. dirselect hat jedoch (wie auch seine Vorgänger) eine Funktion, eine bereits geladene Liste einfach nur neu auszugeben, ohne wieder aufs Laufwerk zuzugreifen. Da das mit einem SYS ohne weitere Parameter (SYS $C009) geschieht, gibt es dann einen zweiten SYS, der die Dateinamensübernahme (wie beim Drücken von Return) durchführt (SYS $C003). Leichter Nachteil hierbei: diese Ausgabeliste hat immer die Position und Länge der mit dem Haupt-SYS eingestellten Werte, ist also nicht ganz so flexibel.

Peter Hagemann (†), der Programmierer von Show PET Pix und dirselect, fand es sehr nützlich, dass man die Directory-Liste auch wie ein Text-Array verwenden kann, wenn man einfach die aktuelle Position des Listenzeigers (an Speicherstelle $C00D) manipuliert:

Dies holt den Dateinamen mit dem Listenindex 5 in die Filenamensvariable (hier: fn$), das ist die sechste Datei in der Liste, da der Index bei Null beginnt. Wurde keine Datei ausgewählt, steht an $C00D eine $00.

Show PET PixDie Benutzeroberfläche der DiashowMithilfe der direkten Namensübergabe von dirselect hat Peter dann sein Diashow-Programm realisiert, denn bei einem automatischen Ablauf eines Programms gibt es ja niemanden, der die Return-Taste drücken würde.

Im folgenden Code-Ausschnitt sieht man die Hauptschleife von "Show PET Pix". Die Variable SL enthält die Adresse $C00D und in IN steht $C003. RR zeigt auf den momentanen Index in die Ausgabeliste. Der Wert wird bei aktivierter Diashow in der Routine .diashow bei jedem Bild erhöht. SYS IN holt also den nächsten Filenamen, in .scrload wird das Bild mit diesem Namen geladen und in .image wird es angezeigt. Genial einfach!

170 loop
180  exit if aus
190  rr=peek(sl)
200  .scrload:.diskerror
210  if ff=0 then .image: else .dsperror
220  if d=0 then .getkey
230  if d=1 then .diashow
240  if aus then .abfrage
250  poke sl,rr: sys in
260 end loop

Im Diashow-Programm ruft man mit "H" die Hilfeseite auf, mit "V" liest man das Directory (von einer evtuell anderen Disk) neu ein. Mit den Cursortasten blättert man vor oder zurück und mit "L" wechselt man aus der Bildanzeige zurück in die Auswahlliste. "D" startet bzw. stoppt die Diashow und der Linkspfeil beendet das Ganze.

PETSCII Art

<nach oben>

Download Show PET Pix (D64)