CPC Wiki Forum Die Amstrad-CPC-Community

Wie Directory eines DSK auslesen

Started by oobdoo · 2020-06-10 14:21 · Replies: 20 · Views: 5611
#1
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.  🙁
📎 Unbenannt.png
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088
Unbenannt.png
👍 0👎 0
#2
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
👍 0👎 0
#3
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.
📎 Unbenannt.png
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088
Unbenannt.png
👍 0👎 0
#4
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
👍 0👎 0
#5
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:
📎 Unbenannt.png
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088
Last edited by oobdoo on 2020-06-11 00:31
Unbenannt.png
👍 0👎 0
#6
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.
👍 0👎 0
#7
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?
📎 Unbenannt.png
📎 Cpmplgs4.dsk
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088
Last edited by oobdoo on 2020-06-13 01:34
Unbenannt.png
👍 0👎 0
#8
Und auch hier ist es wieder wichtig zu prüfen, ob eine Datei einen 128 Byte Header hat oder nicht.
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 30.05.2026)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 29.01.2025)
👍 0👎 0
#9
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.  :'(
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088
👍 0👎 0
#10
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.
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 30.05.2026)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 29.01.2025)
👍 0👎 0
#11
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.  😄

Ich war fest davon ausgegangen das beide Programme das gleiche Verhalten bei einem Export der Datei zeigen würden.
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088
👍 0👎 0
#12
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.
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 30.05.2026)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 29.01.2025)
👍 0👎 0
#13
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:
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088
👍 0👎 0
#14
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:
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088
👍 0👎 0
#15
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.
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088
👍 0👎 0
#16
Die Sektornummer einfach hochzählen, wenn es nicht weiter geht, dann mit dem ersten Sektor auf der nächsten Spur weitermachen.
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 30.05.2026)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 29.01.2025)
👍 0👎 0
#17
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;
  }
👍 0👎 0
#18
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
Last edited by drazil on 2020-07-05 19:44
👍 0👎 0
#19
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).
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 30.05.2026)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 29.01.2025)
👍 0👎 0
#20
Hi, wo finde ich denn das Floppbuch hier im Forum?

Sorry, schon gefunden.
👍 0👎 0

Log in to post