home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 465.lha / Sparc2Amiga / Disk2File.mod < prev    next >
Text File  |  1991-01-09  |  6KB  |  217 lines

  1.  
  2. MODULE Disk2File;
  3.  
  4. FROM ASCII       IMPORT nul, lf;
  5. FROM Arts        IMPORT Error, TermProcedure;
  6. FROM SYSTEM      IMPORT ADR, LONGSET, BYTE;
  7. FROM Exec        IMPORT IOStdReq, IOStdReqPtr, DoIO, MsgPort, MsgPortPtr,
  8.                         OpenDevice, CloseDevice, IOFlagSet, read,
  9.                         AllocMem, FreeMem, MemReqs, MemReqSet;
  10. FROM ExecSupport IMPORT CreatePort, DeletePort, CreateExtIO, DeleteExtIO;
  11. FROM TrackDisk   IMPORT sector;
  12. FROM Dos         IMPORT Open, Close, Write, Output, FileHandlePtr, newFile;
  13. FROM Arguments   IMPORT NumArgs, GetArg;
  14. FROM Conversions IMPORT ValToStr;
  15.  
  16.  
  17. CONST Version       = "Disk2File v2.0  (c) by jf (19.10.1990)";
  18.       Koepfe        = 2;
  19.       maxSektoren   = 11;
  20.       Tracks        = 80;
  21.       trackLaenge   = sector * maxSektoren;
  22.  
  23.  
  24. TYPE  tBuffer       = ARRAY [0..trackLaenge-1] OF BYTE;
  25.  
  26. VAR DiskPort      : MsgPortPtr;
  27.     DiskReq       : IOStdReqPtr;
  28.     ChipMem,
  29.     error, Ok     : BOOLEAN;
  30.     StdOut,
  31.     Datei         : FileHandlePtr;
  32.     Drive, Len    : LONGINT;
  33.     i, Sektoren,
  34.     TrackLaenge   : LONGCARD;
  35.     l, n          : INTEGER;
  36.     Attribut      : MemReqSet;
  37.     Buffer        : POINTER TO tBuffer;
  38.     Dummy,
  39.     trackDiskName,
  40.     FileName      : ARRAY [0..40] OF CHAR;
  41.  
  42.  
  43. PROCEDURE Fehler (error: INTEGER; Text: ARRAY OF CHAR);
  44. BEGIN
  45. (*                                 wird von CleanUp erledigt
  46.   CASE error OF
  47.        | 0: FreeMem (Buffer, SIZE (tBuffer));
  48.        | 1: CloseDevice (DiskReq);
  49.             DeleteExtIO (DiskReq);
  50.             DeletePort (DiskPort);
  51.             FreeMem (Buffer, SIZE (tBuffer));
  52.        | 2: DeleteExtIO (DiskReq);
  53.             DeletePort (DiskPort);
  54.             FreeMem (Buffer, SIZE (tBuffer));
  55.        | 3: DeletePort (DiskPort);
  56.             FreeMem (Buffer, SIZE (tBuffer));
  57.        | 4:
  58.        | 5:
  59.        ELSE; END;
  60. *)
  61.   Error (ADR ("Disk2File:"), ADR (Text));
  62. END Fehler;
  63.  
  64.  
  65. PROCEDURE CleanUp;
  66. BEGIN
  67.   IF Buffer # NIL THEN
  68.      FreeMem (Buffer, SIZE (tBuffer)); END;
  69.   IF Datei # NIL THEN
  70.      Close (Datei); END;
  71.   IF DiskReq # NIL THEN
  72.      CloseDevice (DiskReq); END;
  73.   IF DiskReq # NIL THEN
  74.      DeleteExtIO (DiskReq); END;
  75.   IF DiskPort # NIL THEN
  76.      DeletePort (DiskPort); END;
  77. END CleanUp;
  78.  
  79.  
  80. PROCEDURE WriteLn;
  81. VAR ch: CHAR;
  82.     l : LONGINT;
  83. BEGIN
  84.   ch:= lf;
  85.   l:= Write (StdOut, ADR (ch), 1);
  86. END WriteLn;
  87.  
  88.  
  89. PROCEDURE WriteString (string: ARRAY OF CHAR);
  90. VAR l, len: LONGINT;
  91. BEGIN
  92.   l:= 0;
  93.   len:= HIGH (string);
  94.   WHILE (l < len) & (string [l] # nul) DO
  95.         INC (l); END;
  96.   IF (l = len) & (string [l] # nul) THEN
  97.      INC (l); END;
  98.   l:= Write (StdOut, ADR (string), l);
  99. END WriteString;
  100.  
  101.  
  102. PROCEDURE USAGE;
  103. BEGIN
  104.   WriteString (Version);
  105.   WriteLn;
  106.   WriteString ("  [Unit <0..3>] [Filename] [Device <0..1>]");
  107.   WriteLn;
  108.   WriteString ("  default 0 DH2:T/Disk.tar 0");
  109.   WriteLn;
  110.   WriteString ("  [Unit <0..3>] StdOut");
  111.   WriteLn;
  112.   WriteString ("  Device 0 :  messydisk.device  9 Sektoren");
  113.   WriteLn;
  114.   WriteString ("  Device 1 :  trackdisk.device 11 Sektoren");
  115.   WriteLn;
  116. END USAGE;
  117.  
  118.  
  119. PROCEDURE ReadTrack (Track: LONGCARD): BOOLEAN;
  120. BEGIN
  121.    DiskReq^.command:= read;
  122.    DiskReq^.offset := Track * TrackLaenge;
  123.    DiskReq^.length := TrackLaenge;
  124.    DiskReq^.data:= Buffer;
  125.    DoIO (DiskReq);
  126.    IF DiskReq^.error = 0
  127.       THEN RETURN TRUE
  128.       ELSE RETURN FALSE; END;
  129. END ReadTrack;
  130.  
  131.  
  132. BEGIN
  133.   DiskPort:= NIL;
  134.   DiskReq := NIL;
  135.   Datei   := NIL;
  136.   Buffer  := NIL;
  137.   ChipMem := FALSE;
  138.   TermProcedure (ADR (CleanUp));
  139.   FileName:= "DH2:T/Disk.tar";
  140.   Drive   := 0;
  141.   trackDiskName:= "messydisk.device";
  142.   Sektoren:= 9;
  143.   TrackLaenge:= sector * Sektoren;
  144.   StdOut:= Output ();
  145.   IF StdOut = NIL THEN
  146.      Fehler (0, "Kein StdOut!"); END;
  147.  
  148.   n:= NumArgs ();
  149.   IF n >= 1 THEN
  150.      GetArg (1, Dummy, l);
  151.      IF l # 1 THEN
  152.         Fehler (4, "Falsches Laufwerk"); END;
  153.      CASE Dummy [0] OF
  154.           | "?"     : USAGE;
  155.                       RETURN;
  156.           | "0".."3": Drive:= LONGINT (Dummy [0]) - LONGINT ("0");
  157.           ELSE Fehler (4, "Falsches Laufwerk"); END; END;
  158.   IF n >= 2 THEN
  159.      GetArg (2, FileName, l); END;
  160.   IF n >= 3 THEN
  161.      GetArg (3, Dummy, l);
  162.      IF l # 1 THEN
  163.         Fehler (4, "Falsches Device"); END;
  164.      CASE Dummy [0] OF
  165.           | "0" : trackDiskName:= "messydisk.device";
  166.                   Sektoren:= 9;
  167.           | "1" : trackDiskName:= "trackdisk.device";
  168.                   Sektoren:= 11;
  169.                   ChipMem := TRUE;
  170.           ELSE Fehler (4, "Falsches Device"); END; END;
  171.   TrackLaenge:= sector * Sektoren;
  172.  
  173.   IF ChipMem
  174.      THEN Attribut:= MemReqSet {chip};
  175.      ELSE Attribut:= MemReqSet {public}; END;
  176.   Buffer:= AllocMem (SIZE (tBuffer), Attribut);
  177.   IF Buffer = NIL THEN
  178.      Fehler (4, "Zuwenig Speicherplatz!"); END;
  179.   DiskPort:= CreatePort (0, 0);
  180.   IF DiskPort = NIL THEN
  181.      Fehler (4, "Port läßt sich nicht öffnen!"); END;
  182.   DiskReq:= CreateExtIO (DiskPort, SIZE (IOStdReq));
  183.   IF DiskReq = NIL THEN
  184.      Fehler (3, "Request nicht zu erstellen!"); END;
  185.   OpenDevice (ADR (trackDiskName), Drive, DiskReq, LONGSET {} );
  186.   IF DiskReq^.error # 0 THEN
  187.      Fehler (2, "Device läßt sich nicht öffnen!"); END;
  188.  
  189.   i:= 0;
  190.   IF n = 1
  191.      THEN Datei:= StdOut;
  192.      ELSE Datei:= Open (ADR (FileName), newFile);
  193.           IF Datei = NIL THEN
  194.              Fehler (1, "Datei nicht geöffnet !"); END; END;
  195.   REPEAT
  196.     Ok:= ReadTrack (i);
  197.     IF Ok THEN
  198.        Len:= Write (Datei, Buffer, TrackLaenge); END;
  199.        i:= i + 1;
  200.   UNTIL ~Ok;
  201.   IF n # 1 THEN
  202. (*                                 wird von CleanUp erledigt
  203.      Close (Datei);
  204. *)
  205.      ValToStr (i-1, FALSE, Dummy, 10, -1, " ", error);
  206.      WriteString (Dummy);
  207.      WriteString (" Tracks übertragen");
  208.      WriteLn; END;
  209.  
  210. (*                                 wird von CleanUp erledigt
  211.   FreeMem (Buffer, SIZE (tBuffer));
  212.   CloseDevice (DiskReq);
  213.   DeleteExtIO (DiskReq);
  214.   DeletePort  (DiskPort);
  215. *)
  216. END Disk2File.mod
  217.