
#include <devices/scsidisk.h>

#define BUFBLKS 100

struct SCSIBase *Base;
struct SCSICmd sc;
struct MsgPort *reply;
struct IOStdReq *req;
UBYTE dev_flag=0;
char ans[10],devname[30];
int len,i,nbytes,mode,id,flags;
UBYTE *buffer,*sensedata;
UBYTE cmd[6];
ULONG x[6];
ULONG ret, unit, val, no_open;
int x0,x1,x2,x3,x4,x5;

main()
{
  register int i;
   
  printf("Device: "); gets(devname);
  printf("Unit: "); gets(ans); id = atoi(ans);

  reply = CreatePort("my_main_reply",0);
  if (!reply) die("Can't create reply port");

  req = (struct IOStdReq *)CreateStdIO(reply);
  if (!req) die("Can't create IO request");

  ret = OpenDevice(devname,id,req,flags);
  if (ret) die("Can't open device");
  dev_flag = 1;

  for (;;) {
    printf("Six ommand bytes: "); gets(ans);
    if (!strlen(ans)) die("bye");
    sscanf(ans,"%d %d %d %d %d %d",&x0,&x1,&x2,&x3,&x4,&x5);
    cmd[0]=x0; cmd[1]=x1; cmd[2]=x2; cmd[3]=x3; cmd[4]=x4; cmd[5]=x5; 
    printf("No data(0), read(1), write(2): "); gets(ans); mode = atoi(ans);
    if (mode) {
      printf("Number of bytes to transfer: "); gets(ans); nbytes = atoi(ans);
      sc.scsi_Length = nbytes;
      buffer = malloc(nbytes);
      if (!buffer) puts("Couldn't alloc buffer");
      if (mode==1) { 
        sc.scsi_Flags = SCSIF_READ;
      }
      else sc.scsi_Flags = SCSIF_WRITE;
    }
    if ((buffer&&mode)||(!mode)) {
      sc.scsi_Data = buffer;
      sc.scsi_Command = cmd; sc.scsi_CmdLength = 6;
      req->io_Command = HD_SCSICMD;
      req->io_Length = sizeof(struct SCSICmd);
      req->io_Data = (APTR)&sc;
      DoIO((void *)req);

      printf("Status: scsi: %d  iob: %d\n",(ULONG)sc.scsi_Status,(ULONG)req->io_Error);
      printf("Actual data length: scsi: %d  iob: %d (bytes)\n",sc.scsi_Actual,req->io_Actual);
      if (mode==1) {
        printf("Data: ");
        for (i=0;i<MIN(40,sc.scsi_Actual);i++) {
          printf("%3x",buffer[i]);
        }
      }
      if (mode&&buffer) { free(buffer); buffer=NULL; }
      printf("\n\n");
    }
  }
}


die(str)
  char *str;
{
  puts(str);

  if (dev_flag) CloseDevice(req);
  if (req) DeleteStdIO(req);
  if (reply) DeletePort(reply);
  exit(0);
}

