home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 256.lha / XAD_v1.0 / xad.c < prev    next >
C/C++ Source or Header  |  1989-06-04  |  4KB  |  209 lines

  1. /* XAD 1.0, written by Jonathan Forbes                                    */
  2. /* Release date: 31st May, 1989                                           */
  3. /* Copyright (C) Xenomiga Technology, 1989                                */
  4. /* Call the Xenomiga BBS (416-921-6638), 14400/38400 HST system, 110 Megs */
  5.  
  6. /* NOTE:  This program is freely distributable, but is NOT Public Domain. */
  7. /*        You may NOT alter the source without the author's permission.   */
  8.  
  9.  
  10. #include <exec/types.h>
  11. #include <exec/io.h>
  12. #include <libraries/dos.h>
  13.  
  14.  
  15. #define BLOCK_SIZE 512
  16. #define SECTORS 11
  17. #define HEADS 2
  18. #define READ_MODE 1
  19. #define WRITE_MODE 2
  20.  
  21.  
  22. extern struct IOStdReq *CreateStdIO();
  23. extern struct MsgPort  *CreatePort();
  24. struct IOStdReq *RadWriteMsg, *RadReadMsg;
  25. struct MsgPort  *RadWritePort, *RadReadPort;
  26. char   Data[BLOCK_SIZE * SECTORS * HEADS];
  27. char   ParamFile[100], ModeName[50], DeviceName[50];
  28. UBYTE  Mode;
  29. USHORT NumTracks;
  30.  
  31.  
  32. void main(argc, argv)
  33. int  argc;
  34. char *argv[];
  35. {
  36. if (argc != 5) {
  37.     puts("XAD 1.0 by Jonathan Forbes");
  38.     puts("Usage: XAD <DeviceName> <FileName> <Mode:READ/WRITE> <NumTacks>\n");
  39.     puts(" E.g.: XAD ramdrive.device Testing.DAT WRITE 79\n");
  40.     exit(1);
  41.     }
  42.  
  43. NumTracks = atoi(argv[4]);
  44. if (NumTracks < 1) {
  45.     puts("Illegal number of tracks specified\n");
  46.     exit(1);
  47.     }
  48.  
  49. strcpy(DeviceName, argv[1]);
  50.  
  51. strcpy(ParamFile, argv[2]);
  52. stoupper(ParamFile);
  53.  
  54. strcpy(ModeName, argv[3]);
  55. stoupper(ModeName);
  56.  
  57. FindCorrectMode();
  58. OpenPorts();
  59. SetMessages();
  60. Title();
  61. MainProgram();
  62. CleanUp();
  63. }
  64.  
  65.  
  66. RadToDisk()
  67. {
  68. register USHORT i;
  69. ULONG           error;
  70. register ULONG  FilePtr;
  71.  
  72. error = OpenDevice(DeviceName, 0, RadReadMsg, 0);
  73. if (error) {
  74.     printf("Error opening '%s' in READ mode\n\n", DeviceName);
  75.     exit(1);
  76.     }
  77.  
  78. FilePtr = Open(ParamFile, MODE_NEWFILE);
  79. if (!FilePtr) {
  80.     printf("Fatal error opening '%s' for output\n\n", ParamFile);
  81.     exit(1);
  82.     }
  83.  
  84. for (i=0; i<=NumTracks; i++) {
  85.   printf("Writing Cylinder %d\nA", i);
  86.  
  87.   RadReadMsg->io_Data   = (APTR) &Data;
  88.   RadReadMsg->io_Offset = (SECTORS * HEADS * i) * BLOCK_SIZE;
  89.   RadReadMsg->io_Length = BLOCK_SIZE * SECTORS * HEADS;
  90.   if (DoIO(RadReadMsg))
  91.       printf("\nError: Track %d\nA", i);
  92.  
  93.   Write(FilePtr, Data, BLOCK_SIZE * SECTORS * HEADS);
  94.   }
  95.  
  96. Close(FilePtr);
  97. CloseDevice(RadReadMsg);
  98. }
  99.  
  100.  
  101. DiskToRad()
  102. {
  103. register USHORT i;
  104. ULONG           error;
  105. register ULONG  FilePtr;
  106.  
  107. error = OpenDevice(DeviceName, 0, RadWriteMsg, 0);
  108. if (error) {
  109.     printf("Error opening '%s' in WRITE mode\n\n", DeviceName);
  110.     exit(1);
  111.     }
  112.  
  113. FilePtr = Open(ParamFile, MODE_OLDFILE);
  114. if (!FilePtr) {
  115.     printf("Fatal error opening '%s' for input\n\n", ParamFile);
  116.     exit(1);
  117.     }
  118.  
  119. for (i=0; i<=NumTracks; i++) {
  120.   printf("Reading cylinder %d\nA", i);
  121.  
  122.   Read(FilePtr, Data, BLOCK_SIZE * SECTORS * HEADS);
  123.   RadWriteMsg->io_Data   = (APTR) &Data;
  124.   RadWriteMsg->io_Offset = (SECTORS * HEADS * i) * BLOCK_SIZE;
  125.   RadWriteMsg->io_Length = BLOCK_SIZE * SECTORS * HEADS;
  126.   if (DoIO(RadWriteMsg))
  127.       printf("\nError: Track %d\nA", i);
  128.   }
  129.  
  130. Close(FilePtr);
  131. CloseDevice(RadWriteMsg);
  132. }
  133.  
  134.  
  135. OpenPorts()
  136. {
  137. if (!(RadWritePort = CreatePort("RadWrite", 0L))) {
  138.     puts("Couldn't open WRITE port\n");
  139.     exit(1);
  140.     }
  141.  
  142. if (!(RadReadPort = CreatePort("RadRead", 0L))) {
  143.     puts("Couldn't open READ port\n");
  144.     exit(1);
  145.     }
  146.  
  147. if (!(RadWriteMsg  = CreateStdIO(RadWritePort))) {;
  148.     puts("Couldn't create WRITE msg\n");
  149.     exit(1);
  150.     }
  151.  
  152. if (!(RadReadMsg   = CreateStdIO(RadReadPort))) {
  153.     puts("Couldn't create READ msg\n");
  154.     exit(1);
  155.     }
  156. }
  157.  
  158.  
  159. FindCorrectMode()
  160. {
  161. if (!strcmp(ModeName, "READ"))
  162.     Mode = READ_MODE;
  163. else if (!strcmp(ModeName, "WRITE"))
  164.     Mode = WRITE_MODE;
  165. else {
  166.     puts("Use READ or WRITE for 'Mode' parameter\n");
  167.     exit(1);
  168.     }
  169. }
  170.  
  171.  
  172. SetMessages()
  173. {
  174. RadReadMsg->io_Command  = CMD_READ;
  175. RadWriteMsg->io_Command = CMD_WRITE;
  176. RadReadMsg->io_Length   = 512;
  177. RadWriteMsg->io_Length  = 512;
  178. }
  179.  
  180.  
  181. Title()
  182. {
  183. puts("\nXAD 1.0 by Jonathan Forbes\nCopyright (C) Xenomiga Technology, 1989\n");
  184. }
  185.  
  186.  
  187. MainProgram()
  188. {
  189. switch (Mode) {
  190.   case READ_MODE:
  191.     DiskToRad();
  192.     break;
  193.  
  194.   case WRITE_MODE:
  195.     RadToDisk();
  196.     break;
  197.   }
  198. }
  199.  
  200.  
  201. CleanUp()
  202. {
  203. DeleteStdIO(RadReadMsg);
  204. DeleteStdIO(RadWriteMsg);
  205. DeletePort(RadWritePort);
  206. DeletePort(RadReadPort);
  207. puts("\n** Done **\n");
  208. }
  209.