Schneider / Amstrad CPC Forum

Amstrad / Schneider CPC => Programmierung => Thema gestartet von: oobdoo am 10. Juni 2020, 14:21:23

Titel: Wie Directory eines DSK auslesen
Beitrag von: oobdoo am 10. Juni 2020, 14:21:23
Im "Das grosse Floppy Buch" von Data Becker wird auf Seite 216/217 die Directory Größe mit 2048 Bytes
angegeben, das Directory (D-Format) soll dabei die Sektoren &C1-&C5 belegen (5x512=2560 Bytes).
Was stimmt denn nun?  :gruebel:

Bisher ist es mir nicht gelungen das Directory vollständig richtig einzulesen.  :(

Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: TrebleAlex am 10. Juni 2020, 15:22:31
Hallo! :-)

Das Directory liegt beim DATA-Format in den ersten 4 Sektoren, d.h. &C1-&C4.
512 Bytes pro Sektor*4=2048 Bytes.
Ab &C5 liegt schon die erste Datei.

Evtl. kommt der Anzeigefehler zu Stande, weil Du auch den Sektor &C5 mit einliest und den Inhalt ausgibst (Steuerzeichen etc.)

Viele Grüsse,

Alex
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: oobdoo am 10. Juni 2020, 15:57:25
Ok, dann steht im Data Becker Buch was falsches. Trotzdem habe ich weiterhin ein Problem.
Sektor &42 gehört zum Directory. Wenn ich da mit einem Hexmonitor reinschaue dann scheint
da teilweise dummes Zeug zu stehen, z.B. "123456789" oder "@ABCDEFGHI", siehe Bild.
Das DSK wird von anderen Tools aber sauber ausgelesen.
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: TrebleAlex am 10. Juni 2020, 16:05:07
Hmmm.... Du darfst das DATA-Format (Sektor ID &C0) nicht mit dem SYSTEM-Format verwechseln! (Sektor ID &40)!

Beim System-Format sind die ersten beiden Spuren für CP/M reserviert, d.h. das Directory beginnt dort an Track 2 Sektoren &41-&44 !

Gruß,
Alex
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: oobdoo am 10. Juni 2020, 16:16:50
Das weiß ich. Dachte ich zumindest. Dank Dir weiß ich jetzt das in meinem Source da tatsächlich noch ein Zahlendreher drin war.  :smiley027:

Nachtrag:

Endlich.  :00008351:

Nun hat auch das Einlesen vom Directory vollständig geklappt.
Nachdem ich den vertikalen Scrollbalken dazu geschaltet hatte,
war auch erkennbar das das Verzeichnis vollständig in der Textbox
vorhanden war. Vorher konnte ich nur die letzten Einträge sehen,
die waren aber ohne Inhalt. Das zu finden hat mich locker 2h gekostet.  :banghead:

Ab morgen kommt endlich das Einlesen einzelner Dateien...  :jubelaola:
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: mv am 12. Juni 2020, 14:42:32
Mit DSK-Auslesen habe ich mich vor ein paar Tagen auch noch mal beschäftigt.
Dazu eine alte Perl-Version als Vorlage genommen, und in JavaScript umgeschrieben:
https://github.com/benchmarko/CPCBasic/blob/master/DiskImage.js
Im Moment nur für Lesen.
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: oobdoo am 13. Juni 2020, 01:14:07
Bin kurz davor ein File aus einem DSK raus zu holen. Dazu habe ich mit zwei anderen Tools zusätzlich gearbeitet.
Das blöde dabei, ManageDsk macht es scheinbar richtig  und CPCDiskXP falsch.  :(
AMSDOS1.COM scheint die richtigen Inhalte zu haben, AMSDOS2.COM die falschen. :gruebel
Beide Tools haben natürlich auf das selbe DSK zugegriffen.
Kann das mal einer prüfen?



Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: TFM am 14. Juni 2020, 00:13:52
Und auch hier ist es wieder wichtig zu prüfen, ob eine Datei einen 128 Byte Header hat oder nicht.
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: oobdoo am 14. Juni 2020, 01:43:09
Ich gehe davon aus das die beiden Tools das machen werden.
Mein Programm ist noch lange nicht so weit. Ich kann aktuell die
richtigen Blöcke raus bekommen, habe es aber noch nicht geschafft
die Formel zur Umrechnung nach Track/Sektor zum Laufen zu bekommen.   :(

Das DSK Auswerten scheint in meinen 35 Jahren als Hobby Programmierer
die härteste Nuss zu sein.  :'(
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: TFM am 14. Juni 2020, 14:09:36
Diese ganzen Sachen stehen unter FutureOS als Funktionen zur Verfügung, falls da Interesse besteht stehe ich gerne mit Rat und Tat zur Verfügung, steht aber auch alles im Handbuch.

Blocks auf Track, Sektorumrechnung ist an sich linear aufsteigend, beginnend mit dem DIR Blöcken, nummeriert ab 0.
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: oobdoo am 14. Juni 2020, 16:55:57
Guter Tip mit dem FOS Handbuch. Mal schauen ob ich da Denkanregungen für mich finden kann.  :zunge0020:

Den Hinweis mit dem Header hatte ich nicht sofort verstanden.  :gruebel:

Das passierte erst als ich Nachts im Bett lag.  :D

Ich war fest davon ausgegangen das beide Programme das gleiche Verhalten bei einem Export der Datei zeigen würden.
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: TFM am 14. Juni 2020, 17:25:05
K.A. wie die beiden Programme funktionieren, aber ich kann mich glaube ich auch an Probleme erinnern.

Eine Text-Datei braucht ja keinen Header, denn es ist ja nur Text.

BASIC und MC Programme (also Binärdateien) brauchen den Header um der Firmware zu sagen, wohin sie geladen werden sollen, wie lange sie sind, und ob / bzw. an welcher Adresse der Autostart Einsprung erfolgen soll. Ja, der Header ist da auch beschrieben.
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: oobdoo am 14. Juni 2020, 19:00:04
Eben hinbekommen das ich die ersten 128 Bytes einer Datei von einem DSK richtig auslesen konnte.  :00008351:

Der Code war weitgehend richtig, aber wenn man die eigenen Funktionen mit der falschen Sektorgröße und
MaxSektoren füttert dann kann nur dummes Zeug bei raus kommen.  :banghead:
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: oobdoo am 16. Juni 2020, 01:20:44
Und wieder ein Verständnisproblem.  :(

Die Datei AMSDOS.COM einer CP/M Diskette hat eine Größe von 1024 Byte. DataBlock wird
nur einer benötigt, weil 1 Block = 8 Record (1 Record = 128 Byte), also 8 x 128 = 1024 Byte.

Angegeben wird DataBlock mit 2. Das bedeutet Track 3 und Sektor 4 bzw. 2 und 3 wenn man
von Null zählt. Die Sektor-ID ist &43.

Damit kann ich nur 50% der Datei lesen, weil ein Sektor ja nur 512 Bytes hat.
Woher weiß ich welches den nächste Sektor ist, wo die anderen 50% von der Datei liegen?  :gruebel:
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: oobdoo am 16. Juni 2020, 02:56:56
Nächste Frage.  :(

Wie kann ich feststellen ob eine Datei einen Header hat oder nicht?
Die Auswertung des Dreizeichen-Filetyps kann es nicht sein, das
kann man ja willkürlich festlegen.
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: TFM am 16. Juni 2020, 09:41:06
Die Sektornummer einfach hochzählen, wenn es nicht weiter geht, dann mit dem ersten Sektor auf der nächsten Spur weitermachen.
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: Devilmarkus am 16. Juni 2020, 17:06:44
Im JavaCPC mache ich das so:
(Java Code)

  public static int ChecksumAMSDOS(byte[] pHeader) {
    int Checksum = 0;
    for (int i = 0; i < 67; i++) {
      int CheckSumByte = pHeader[i] & 0xFF;
      Checksum += CheckSumByte;
    }
    return Checksum;
  }
 
  public static boolean CheckAMSDOS(byte[] pHeader) {
    int CalculatedChecksum;
    try {
      CalculatedChecksum = ChecksumAMSDOS(pHeader);
    } catch (Exception e) {
      return false;
    }
    int ChecksumFromHeader = pHeader[67] & 0xFF | (pHeader[68] & 0xFF) << 8;
    if (ChecksumFromHeader == CalculatedChecksum && ChecksumFromHeader != 0) {
      System.out.println("Has AMSDOS header");
      return true;
    }
    System.out.println("Without header");
    return false;
  }
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: drazil am 05. Juli 2020, 17:25:07
Hi Oobdoo ich hänge mich mal an deinen Thread dran, da ich dazu auch noch ne Frage habe.

Mein Problem ist der Umgang mit NICHT ASCII files die aber keinen Header haben.

Um diese zu exportieren gehe ich momentan folgendermassen vor.
Die FileSize nehme ich aus dem Directoryeintrag, da ja kein Header vorhanden ist. Ist aber nicht die korrekte Grösse.
Anschliessen prüfe ich noch die ersten 100 Bytes auf Character.isAlphabetic. Wenn das nicht so ist wird eine normale Binärdatei gelesen.
Gibts da einen offizielleren Weg, oder wird das tatsächlich so ähnlich geprüft?
Ich habe keine anderen Flags im Directoryeintrag gefunden mit denen ich das steuern könnte.

Beste Grüße
Guido
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: TFM am 05. Juli 2020, 18:37:35
Da gehst Du schon richtig vor.
- Test auf Header. Wenn ja, dann ist es BIN oder BAS Datei
- Wenn nein, dann ist es Text oder z.B. ein CP/M Kommando (*.COM Dateien)

Zur Bestimmung der Länge kann man die Anzahl der 128 Byte Records aus dem DIRectory ermitteln. Das ist dann auf die nächsten 128 Bytes aufgerundet.

Rekord-Anzahl ermitteln:
------------------------
- Record_Anzahl = (Byte_&0C) * 128 + (Byte_&0F)


Im Data Becker Floppy Buch ist das gut erklärt, ist auch hier im Forum (wImre).
Titel: Re: Wie Directory eines DSK auslesen
Beitrag von: drazil am 06. Juli 2020, 07:46:55
Hi, wo finde ich denn das Floppbuch hier im Forum?

Sorry, schon gefunden.