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

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