home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 421.lha / BTNtape_v1.0 / tapeio.c < prev    next >
C/C++ Source or Header  |  1990-09-29  |  6KB  |  206 lines

  1. /*
  2. **  TapeIO: performs operations to the tape unit via SCSI-direct for BTNtape
  3. **     Version 1.0  09/10/90
  4. **
  5. **   (c) Copyright 1990 Robert Rethemeyer.
  6. **     This code is freely distributable and redistributable,
  7. **     for non-commercial purposes, provided this notice is included.
  8. **
  9. **   This code was derived from programs written by Robert Mitchell.
  10. */
  11.  
  12. #include <exec/types.h>
  13. #include <exec/io.h>
  14. #include <libraries/dos.h>
  15. #include <libraries/dosextens.h>
  16. #include <devices/scsidisk.h>
  17. #include <intuition/intuition.h>
  18. #include <stdio.h>
  19. #include <string.h>
  20.  
  21. #if defined AZTEC_C
  22.   #include <functions.h>
  23. #elif defined LATTICE
  24.   #include <proto/exec.h>
  25.   #include <proto/intuition.h>
  26. #endif
  27.  
  28. #include "tape.h"
  29. #include "tplink.h"
  30.  
  31. /* the following SCSI commands are defined for the 3M MCD-403 tape unit */
  32. #define CMD_TEST_UNIT_READY         0x00
  33. #define CMD_REZERO                  0x01
  34. #define CMD_REQUEST_SENSE           0x03
  35. #define CMD_FORMAT_UNIT             0x04
  36. #define CMD_SEND_SYSTEM_DATA        0x05
  37. #define CMD_RECEIVE_SYSTEM_DATA     0x06
  38. #define CMD_REASSIGN_BLOCKS         0x07
  39. #define CMD_SCSI_READ               0x08
  40. #define CMD_VERIFY_UNIT             0x09
  41. #define CMD_SCSI_WRITE              0x0a
  42. #define CMD_SEEK                    0x0b
  43. #define CMD_READ_SCSI_DEFECT        0x0d
  44. #define CMD_READ_CONTROLLER_INFO    0x0e
  45. #define CMD_WRITE_CONTROLLER_INFO   0x0f
  46. #define CMD_DRIVE_PASS_THRU         0x10
  47. #define CMD_READ_DRIVE_LINES        0x11
  48. #define CMD_INQUIRY                 0x12
  49. #define CMD_READ_QIC100_INFO        0x13
  50. #define CMD_WRITE_QIC100_INFO       0x14
  51. #define CMD_MODE_SELECT             0x15
  52. #define CMD_RESERVE                 0x16
  53. #define CMD_RELEASE                 0x17
  54. #define CMD_READ_QIC100_DEFECT      0x19
  55. #define CMD_MODE_SENSE              0x1a
  56. #define CMD_LOAD_UNLOAD             0x1b
  57. #define CMD_READ_DIAG_RESULT        0x1c
  58. #define CMD_SEND_DIAG               0x1d
  59. #define CMD_READ_CAPACITY           0x25
  60. #define CMD_READ_EXTENDED           0x28
  61. #define CMD_WRITE_EXTENDED          0x2a
  62. #define CMD_SEEK_EXTENDED           0x2b
  63. #define CMD_READ_SCSI_DEFECT_DATA   0x37
  64. #define CMD_WRITE_BUFFER            0x3b
  65. #define CMD_READ_BUFFER             0x3c
  66.  
  67. #define CBLEN 6
  68. extern          UBYTE  *cdb;
  69. extern          UBYTE  *sns;
  70. extern struct SCSICmd  *cmd;
  71. extern          UBYTE  *TapeBuff[2];
  72. extern struct IOStdReq *ior;
  73. extern          ULONG  blknum;
  74. extern          ULONG  numblks;
  75. extern          ULONG  rwlen;
  76. extern          ULONG  bugmask;
  77. extern          long   tpsize;
  78. extern struct tplink   *linktp;
  79. extern          short  inprog;
  80. extern          char   dbb[80];
  81.  
  82.  
  83. long TapeIO(int toper, int bn, UBYTE ctl)
  84. {
  85.  char *z;
  86.  short i;
  87.  
  88.   if(inprog) { WaitIO((struct IORequest *)ior);
  89.                inprog = FALSE;
  90.                if(ior->io_Error)
  91.                  return((long)((ior->io_Error << 8) + cmd->scsi_Status));
  92.              }
  93.   if(toper == TFINISH) return(0L);
  94.   cmd->scsi_Command = cdb;
  95.   cmd->scsi_CmdLength = CBLEN;
  96.   cmd->scsi_Status = 0;
  97.   ior->io_Command = HD_SCSICMD;
  98.   ior->io_Data = (APTR) cmd;
  99.   ior->io_Length = sizeof(struct SCSICmd);
  100.   ior->io_Error = 0;
  101.   ior->io_Flags = IOF_QUICK;
  102.   for (i=0 ; i<CBLEN; i++) cdb[i] = 0x00;
  103.  
  104.   switch(toper) {
  105.   case TREAD:
  106.     if((blknum+numblks)>=tpsize) NewTape();
  107.     cdb[0] = CMD_SCSI_READ;
  108.     cdb[2] = (UBYTE) ( (blknum >> 8) & 0x00ff);
  109.     cdb[3] = (UBYTE) (blknum & 0x00ff);
  110.     cdb[4] = (UBYTE) numblks ;
  111.     cmd->scsi_Data = (UWORD *) TapeBuff[bn];
  112.     cmd->scsi_Length = rwlen;
  113.     cmd->scsi_Flags = SCSIF_READ;
  114.     MPR2("Reading block %d * %d\n",blknum,numblks)
  115.     break;
  116.  
  117.   case TWRITE:
  118.     if((blknum+numblks)>=tpsize) NewTape();
  119.     cdb[0] = CMD_SCSI_WRITE;
  120.     cdb[2] = (UBYTE)(blknum >> 8) & 0x00ff;
  121.     cdb[3] = (UBYTE)(blknum & 0x00ff);
  122.     cdb[4] = (UBYTE) numblks ;
  123.  /* cmd->scsi_Data = (UWORD *) TapeBuff[bn]; */      /* 2090A bug fix */
  124.     cmd->scsi_Data = (UWORD *) ((ULONG) TapeBuff[bn] | bugmask);
  125.     cmd->scsi_Length = rwlen;
  126.     cmd->scsi_Flags = SCSIF_WRITE;
  127.     MPR2("Writing block %d * %d\n",blknum,numblks)
  128.     break;
  129.  
  130.   case TREWIND:
  131.     cdb[0] = CMD_REZERO;
  132.     cmd->scsi_Data = (UWORD *) TapeBuff[bn];
  133.     cmd->scsi_Length = 0;
  134.     cmd->scsi_Flags  = 0;
  135.     MPR0("Rewinding\n")
  136.     break;
  137.  
  138.   case TSENSE:
  139.     cdb[0] = CMD_REQUEST_SENSE;
  140.     cdb[4] = 28;  /* extended sense */
  141.     cmd->scsi_Length = 28;
  142.     cmd->scsi_Data = (UWORD *) sns;
  143.     cmd->scsi_Flags = SCSIF_READ;
  144.     MPR0("Sense:")
  145.     break;
  146.  
  147.   case RDCAP:
  148.     cdb[0] = CMD_READ_CAPACITY;
  149.     cmd->scsi_Length = 8;
  150.     cmd->scsi_Data = (UWORD *) sns;
  151.     cmd->scsi_Flags = SCSIF_READ;
  152.     MPR0("Capacity:")
  153.     break;
  154.  
  155.   case RAWCMD:    /* Convert hex in tape buffer to bytes in command buffer. */
  156.     i = 0;        /* Bytes are specified by hex digit pairs sep. by blanks  */
  157.     z = (char *)TapeBuff[bn];   /* terminated by newline */
  158.     while(z[0]!='\n' && i<32)  cdb[i++] = (UBYTE) 0xff & strtol(z,&z,16);
  159.     cmd->scsi_Data = (UWORD *) sns;
  160.     cmd->scsi_Length = 0;
  161.     cmd->scsi_Flags  = 0;
  162.     MPR0("Raw command\n")
  163.     break;
  164.  
  165.   }
  166.   if(ctl == CTLWAIT) {
  167.          DoIO ((struct IORequest *)ior);    /* start sync io */
  168.          return((long)((ior->io_Error << 8) + cmd->scsi_Status));
  169.          }
  170.   else               {
  171.          BeginIO((struct IORequest *)ior);  /* start async io */
  172.          if(ior->io_Error)
  173.                   return((long)((ior->io_Error << 8) + cmd->scsi_Status));
  174.          if( !(ior->io_Flags & IOF_QUICK) )  inprog = TRUE;
  175.          return(0L);
  176.          }
  177. }
  178.  
  179. /**************************************************************************
  180. *  NewTape()   Displays a requester asking user to insert a new tape.
  181. */
  182.  
  183. void NewTape(void)
  184. {
  185.  extern ULONG  blknum;
  186.  extern short  reserved;
  187.  extern void   DoSense();
  188.  
  189.  static struct IntuiText reqtext[] = {
  190.      { AUTOFRONTPEN,AUTOBACKPEN,AUTODRAWMODE,AUTOLEFTEDGE,AUTOTOPEDGE,AUTOITEXTFONT,
  191.         "  EOT: Insert next tape", AUTONEXTTEXT },
  192.      { AUTOFRONTPEN,AUTOBACKPEN,AUTODRAWMODE,AUTOLEFTEDGE,AUTOTOPEDGE,AUTOITEXTFONT,
  193.         "Continue", AUTONEXTTEXT },
  194.      { AUTOFRONTPEN,AUTOBACKPEN,AUTODRAWMODE,AUTOLEFTEDGE,AUTOTOPEDGE,AUTOITEXTFONT,
  195.         "Quit", AUTONEXTTEXT }
  196.   };
  197.  
  198.  TapeIO(TFINISH,0,CTLWAIT);   /* yeeks, recursion! */
  199.  MPR0("Time for a new tape\n")
  200.  if( AutoRequest(NULL,&reqtext[0],&reqtext[1],&reqtext[2],NULL,NULL,250,50) ) {
  201.       blknum=reserved;  /* reset block number for new tape */
  202.       DoSense(0);      /* eat tape change status (recursion again) */
  203.       }
  204.  return;
  205. }
  206.