Hallo Besucher, der Thread wurde 2,6k mal aufgerufen und enthält 6 Antworten

letzter Beitrag von Zyrian am

C64 Basic: Directory auslesen und als Stringarray speichern

  • Hallo BASIC Spezialisten,

    Ich suche eine schnelle BASIC Routine, dir mir nur die Files aus dem Directory in String Arrays speichert. Meine Routine mittels Open und dann Zeichen für Zeichen einlesen, auswerten, verwerfen oder speichern ist einfach zu langsam.


    Warum das ganze? Nun, ich möchte aus Spaß ein Disketten Dienstprogramm nur in BASIC schreiben. Dazu ist natürlich ein wichtiger Teil das auslesen des Directorys.


    Vielen Dank für die tollen Vorschläge.

  • (hab erst jetzt gemerkt, dass ja die Suche nach einer BASIC-Routine gefragt war, damit ist mein Assembler-Progrämmchen eine klassische Themenverfehlung, aber ich lass es, falls ja jemand auch so das Verzeichnis in BASIC als Array weiter verarbeiten möchte ...)


    Ich hab in meiner Funktionsbibliothek eine Routine, die mir Filename und Dateigröße als String in ein String-Array einliest:

    Verwendung sieht so aus:

    Code
    1. 10 dimd$(150)
    2. 20 sys51072,d$(0): if j=0 then end
    3. 30 fori=0toj-1
    4. 40 print d$(i)
    5. 50 next

    Das Array muss ausreichend groß dimensioniert sein (es wird nicht überprüft, ob das Array tatsächlich groß genug ist).

    Das Ergebnis der eingelesenen Einträge steht implizit in Variable J.

    Als Parameter gibt man das 1. Element des Arrays (also jenes mit Index 0). Ab diesem werden denn die folgenden Descriptoren im Array

    "beschrieben".

    Die Ausgabe sieht dann in etwa so aus:


    Erstellt wurde es einst mit HypraAss. Ich hab denn s-cat5.asm im Textformat ergänzt und nachkommentiert. Das c-cat5.prg ist bei mir von $c780 bis $c8a0

    Das Source-Listing ist an einer Stelle optimiert worden, statt JMP hab ich ein BEQ verwendet, also wenn man aus dem .asm ein Binary macht,

    kommt nicht exakt das gleich wie bei hier geposteten Binary (1 Byte länger) raus.


    Die Routine liest nur die Dateien vom Typ PRG ein. Ich überlasse es den Lesern hier die entsprechende Anpassung zu übernehmen.

    Wenn man den Dateityp auch im Array haben möchte, dann könnte man diesen als einzelnen Buchstaben ergänzen und einen Eintrag

    statt mit 20 dann mit 21 Bytes ansetzen und an Position 17 das 1. Zeichen des eingelesenen Dateityps verwenden. :D


    Mit RIGHT$, LEFT$ und MID$ kann man sich dann die Komponenten aus dem String holen. ;)

  • guk mal hier.

    Prima, gefällt mir.

    Wenn man das als Unterroutine gestaltet und nicht die Nachteile der GOTO-Schleifen haben möchte, könnte Skerns Variante in folgender Form verwendet werden:

    Code
    1. 0 goto1000
    2. 1 print"directory":open1,8,0,"$":poke781,1:sys65478:geta$,a$:e$=chr$(0)
    3. 2 fori=0to1step0:geta$,a$,h$,l$:ifstthensys65484:close1:return
    4. 3 print"{left}"asc(h$+e$)+256*asc(l$+e$);
    5. 4 fors=0to1:geta$,b$:ifa$thenprinta$b$;:s=abs(st):next
    6. 5 printa$:nexti
    7. 1000 gosub1

    Zeile 1 bis 5 kann so irgendwo in einem größeren Programm liegen, ohne unter der GOTO-Laufzeit zu leiden, wenn es weiter hinten im Programm zu liegen kommen sollte.

  • Ja vielen Dank. Das ist mehr als ich erwartet habe. Ich kann gleichsam alle Vorschläge irgendwie einbauen. Kann mich gar nicht entscheiden.
    Werds heute Abend direkt mal testen.

  • Ich grabe den Thread nochmal aus... hab eine Routine gesucht die auch am 128er funktioniert und lediglich das Verzeichnis ausgibt.

    Zeile 1 bis 5 kann so irgendwo in einem größeren Programm liegen, ohne unter der GOTO-Laufzeit zu leiden, wenn es weiter hinten im Programm zu liegen kommen sollte.

    Am 128er störten mich POKE/SYS-Befehle. Hab daher GET durch GET#1 ersetzt.

    Code
    1. 0 goto1000
    2. 1 print"directory":open1,8,0,"$":get#1,a$,a$:e$=chr$(0)
    3. 2 fori=0to1step0:get#1,a$,a$,h$,l$:ifstthenclose1:return
    4. 3 print"{left}"asc(h$+e$)+256*asc(l$+e$);
    5. 4 fors=0to1:get#1,a$,b$:ifa$thenprinta$b$;:s=abs(st):next
    6. 5 printa$:nexti
    7. 1000 gosub1

    Damit läuft das Programm auch am 128er...


    Danke für die Routine! :thumbsup:

  • Hi,

    ich habe in der ASM Routine aus Post #3 genau das gefunden was ich in meinem jetzigen Projekt brauchte.

    Naja fast, ein paar kleine Änderungen waren doch nötig. Vor allem habe ich die Syntax auf die des C64Studio umgeschrieben.

    Und weil ich bei ASM echt nicht so fit bin musste ich alles durchgehen und Kommentieren, damit ich Änderungen machen konnte, ohne alles zu ruinieren.

    Am Ende des Quellcodes sind ein paar Parameter die ich eingebaut habe.

    Ich poste den überarbeiteten Text mal hier.

    Vielleicht kann jemand ja was damit anfangen.

    Mir hat er weiter geholfen.


    dir.asm