(**********************************************************************

    :Program.    TrackDemo.mod
    :Contents.   Test and demo module for "TrackDiskSupport"
    :Author.     Fridtjof Siebert [fbs]
    :Author.     Nicolas Benezan [bne]
    :Address.    [bne] Postwiesenstr. 2, D7000 Stuttgart 60
    :Phone.      [bne] 711/333679
    :Copyright.  Public Domain
    :Language.   Modula-2
    :Translator. M2Amiga A+L V3.2d
    :Imports.    TrackDiskSupport2.0 [fbs],[bne]
    :History.    V1.0 [fbs] ?.Dez.1988
    :History.    V2.0 [bne] 13.May.1989

**********************************************************************)
MODULE TrackDemo;

FROM Arts             IMPORT BreakPoint;
FROM Exec             IMPORT Byte;
FROM TrackDisk        IMPORT badDriveType;
FROM InOut            IMPORT WriteString, WriteLn, WriteInt, Write,
                             ReadString, WriteHex;
FROM MemSystem        IMPORT NoCareAllocMem, Deallocate;
FROM SYSTEM           IMPORT ADR, CAST;
FROM TrackDiskSupport IMPORT OpenDiskDevice, CloseDiskDevice, GetDiskChange,
                             ChangeState, ProtStatus, Motor, ReadBlock,
                             GetDriveType, GetNumTracks, DiskUnit,
                             DeviceInfo, GetDeviceInfo;

VAR
  DevName: ARRAY [0..7] OF CHAR;
  Unit: DiskUnit;
  Error: Byte;
  Buffer: POINTER TO ARRAY [0..511] OF CHAR;

PROCEDURE WriteDiskInfo;
  VAR
    Info:DeviceInfo;
  BEGIN
    GetDeviceInfo(Unit,Info);
    WITH Info DO
      WriteString("DeviceName: "); WriteString(devName); WriteLn;
      WriteString("Unit:       "); WriteInt(devUnit,1); WriteLn;
      WriteString("Flags:      "); WriteHex(CAST(LONGINT,devFlags),2); WriteLn;
      WriteString("BlockSize:  "); WriteInt(blockLen,1); WriteLn;
      WriteString("TrackSize:  "); WriteInt(trackLen,1); WriteLn;
      WriteString("CylindSize: "); WriteInt(cylinderLen,1); WriteLn;
      WriteString("Blocks:     "); WriteInt(numBlocks,1); WriteLn;
    END;
  END WriteDiskInfo;

BEGIN
  NoCareAllocMem(Buffer,SIZE(Buffer^),TRUE);
  LOOP
    WriteString('Device-Namen eingeben (zB. "DF0"): ');
    ReadString(DevName);
    IF DevName[0]=CHR(0) THEN
      EXIT
    END;
    Error:= OpenDiskDevice(DevName,Unit);
    IF Error=badDriveType THEN
      WriteString(" not connected");
      WriteLn;
    ELSIF Error#0 THEN
      WriteString(" Error:"); WriteInt(Error,4);
      WriteLn;
    ELSE
      WriteString(" ok");
      WriteLn;
      WriteDiskInfo;
      WriteString("  DiskChangeCount:");
      WriteInt(GetDiskChange(Unit),5);
      WriteLn;
      IF ChangeState(Unit) THEN
        WriteString("  Disk in Drive");
      ELSE
        WriteString("  No Disk in Drive");
      END;
      WriteLn;
      IF ProtStatus(Unit) THEN
        WriteString("  Write enabled");
      ELSE
        WriteString("  Write protected");
      END;
      WriteLn;
      Error:= ReadBlock(Unit,0,1,Buffer,GetDiskChange(Unit));
      IF Error#0 THEN
        WriteString("Couldn't read block! Error: "); WriteInt(Error,4);
      ELSE
        WriteString("  DiskID: ");
        Write(Buffer^[0]); Write(Buffer^[1]);
        Write(Buffer^[2]); Write(Buffer^[3]);
      END;
      WriteLn;
      IF Motor(Unit,FALSE) THEN END;
      CloseDiskDevice(Unit);
    END;   (* IF OpenTrackDisk()#0 THEN ELSE *)
  END;   (* LOOP *)
  Deallocate(Buffer);
END TrackDemo.
