home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 2: PC / frozenfish_august_1995.bin / bbs / d07xx / d0744.lha / FO2 / Sources_FO2 / RoutinesTD.c < prev    next >
C/C++ Source or Header  |  1992-10-12  |  4KB  |  150 lines

  1.                     /*                                           */
  2.                     /* Sous Prog pour utilisation du trackdisk */
  3.                     /*                                           */
  4.  
  5. #include "RoutinesTD.h"
  6.  
  7. #define Prototype extern
  8. #define ON 1L
  9. #define OFF 0L
  10. #define R CMD_READ
  11. #define W CMD_WRITE
  12. #define Actual[drive] ((*DiskReq[drive]).io_Actual)
  13.  
  14.  
  15. struct IOStdReq *DiskReq[4]={0,0,0,0};
  16. struct IOStdReq *A;
  17. struct MsgPort  *DiskPort[4]={0,0,0,0};
  18.  
  19. Prototype BYTE OpenTD(LONG drive);
  20. Prototype BYTE CMDonD(ULONG drive,UWORD Command,UBYTE Flags,ULONG Length,APTR Data,ULONG Offset);
  21. Prototype BYTE Read_WriteB(UWORD CMD,ULONG drive,APTR buffer,ULONG Bloc);
  22. Prototype BYTE Read_WriteT(UWORD CMD,ULONG drive,APTR buffer,ULONG Track);
  23. Prototype BYTE Read_WriteC(UWORD CMD,ULONG drive,APTR buffer,ULONG Cyl);
  24. Prototype BYTE MtrOn(LONG drive);
  25. Prototype BYTE MtrOff(LONG drive);
  26. Prototype void CloseaTD(LONG drive);
  27. Prototype void CloseTD();
  28. Prototype VOID DiskBUSY(UBYTE *drive,LONG onflag);
  29. Prototype ULONG isInserted(ULONG drive);
  30. Prototype ULONG isProtected(LONG drive);
  31.  
  32. Prototype struct IOStdReq *DiskReq[4];
  33.  
  34.  
  35. BYTE OpenTD(LONG drive)
  36. {
  37.     DiskPort[drive] =(struct MsgPort *)CreatePort(0L,0L);
  38.     DiskReq[drive] =(struct IOStdReq *)CreateStdIO(DiskPort[drive]);
  39.     if (!OpenDevice(TD_NAME,(ULONG)drive,(struct IORequest *)DiskReq[drive],0UL)) return(TRUE);
  40.         else
  41.     {
  42.         DeleteStdIO (DiskReq[drive]);
  43.         DeletePort    (DiskPort[drive]);
  44.         DiskReq[drive]=0;
  45.         DiskPort[drive]=0;
  46.     }
  47.         return(FALSE);
  48. }
  49.  
  50. BYTE CMDonD(ULONG drive,UWORD Command,UBYTE Flags,ULONG Length,APTR Data,ULONG Offset)
  51. {
  52.     A=DiskReq[drive];
  53.     (*A).io_Command = Command;
  54.     (*A).io_Flags = Flags;
  55.     (*A).io_Length = Length;
  56.     (*A).io_Data = Data;
  57.     (*A).io_Offset = Offset;
  58.     
  59.     DoIO((struct IORequest *)DiskReq[drive]);
  60.     return(    (*A).io_Error );
  61. }
  62.  
  63. BYTE Read_WriteB(UWORD CMD,ULONG drive,APTR buffer,ULONG Bloc)
  64. {
  65.     return (CMDonD(drive,CMD,0,TD_SECTOR,buffer,Bloc * TD_SECTOR));
  66. }
  67.  
  68. BYTE Read_WriteT(UWORD CMD,ULONG drive,APTR buffer,ULONG Track)
  69. {
  70.     return (CMDonD(drive,CMD,0,11 * TD_SECTOR,buffer,Track * 11 * TD_SECTOR));
  71. }
  72.  
  73. BYTE Read_WriteC(UWORD CMD,ULONG drive,APTR buffer,ULONG Cyl)
  74. {
  75.     return(CMDonD(drive,CMD,0,22 * TD_SECTOR,buffer,Cyl * 22 * TD_SECTOR));
  76.  
  77. BYTE MtrOn(LONG drive)
  78. {
  79.     return(CMDonD(drive,TD_MOTOR,0L,1L,0L,0L));
  80. }
  81.  
  82. BYTE MtrOff(LONG drive)
  83. {
  84.     return(CMDonD(drive,TD_MOTOR,0L,0L,0L,0L));
  85. }
  86.  
  87. void CloseaTD(LONG drive)
  88. {
  89.     if (DiskReq[drive])
  90.     {
  91.         A=DiskReq[drive];
  92.         CloseDevice((struct IORequest *)A);
  93.         DeleteStdIO (A);
  94.         DeletePort  (DiskPort[drive]);
  95.         DiskReq[drive]=NULL;
  96.         DiskPort[drive]=NULL;
  97.     }
  98. }
  99.  
  100. void CloseTD()
  101. {
  102. LONG  drive;
  103.     for (drive=0;drive<4;drive++) 
  104.     {
  105.         if (DiskReq[drive]) MtrOff(drive);
  106.         CloseaTD(drive);
  107.     }
  108. }
  109.  
  110. VOID DiskBUSY(UBYTE *drive,LONG onflag)
  111. {
  112. struct StandardPacket     *pk;
  113. struct Process            *tsk;
  114.  
  115.     tsk=(struct Process *)FindTask(NULL);
  116.     if (pk=(APTR)AllocMem (sizeof(struct StandardPacket), MEMF_PUBLIC|MEMF_CLEAR))
  117.     {
  118.         pk->sp_Msg.mn_Node.ln_Name=(UBYTE *)&(pk->sp_Pkt);
  119.  
  120.         pk->sp_Pkt.dp_Link=&(pk->sp_Msg);
  121.         pk->sp_Pkt.dp_Port=&(tsk->pr_MsgPort);
  122.         pk->sp_Pkt.dp_Type=ACTION_INHIBIT;
  123.         pk->sp_Pkt.dp_Arg1=(onflag ? -1L : 0L);
  124.  
  125.         PutMsg(DeviceProc(drive),(struct Message*)pk);
  126.         WaitPort(&(tsk->pr_MsgPort));
  127.         GetMsg(&(tsk->pr_MsgPort));
  128.         FreeMem(pk,(long)sizeof(*pk));
  129.     }
  130.  
  131. }    
  132.  
  133. /* return -1 if out , 0 if in */
  134. ULONG isInserted(ULONG drive)
  135. {
  136.     if (DiskReq[drive]) {
  137.     CMDonD(drive,TD_CHANGESTATE,0,0,0,0);
  138.     return((*DiskReq[drive]).io_Actual); }
  139.     else return(-1);
  140. }
  141.  
  142. ULONG isProtected(LONG drive)
  143. {
  144.     if (DiskReq[drive]) {
  145.     CMDonD(drive,TD_PROTSTATUS,0,0,0,0);
  146.     return((*DiskReq[drive]).io_Actual);}
  147.     else return(-1);
  148. }
  149.