/*******************************************************/
/* READTRACK                                           */
/* Lecture d'un bloc de disquette grâce au dispositif  */
/* logique trackdisk.device                            */
/*                                                     */
/* Copyright © 1993 by Pierre Philippe Launay          */
/*******************************************************/

/*-----------------------------------------------------*/
/* Include many system files                           */
/* Chargement des fichiers systèmes nécessaires        */
/*-----------------------------------------------------*/
#include <exec/types.h>
#include <exec/memory.h>
#include <devices/trackdisk.h>

/*-----------------------------------------------------*/
/* PROGRAMME PRINCIPAL                                 */
/* MAIN CODE                                           */
/*-----------------------------------------------------*/
main()
{
 struct MsgPort *diskport;
 struct IOStdReq *diskrequest;
 LONG *blockmemory;
 LONG blockbyte;
 blockmemory = (LONG*) AllocMem(512L, MEMF_CHIP);
 /* CAUTION: CHIP MEMORY and not FAST */
 diskport = CreatePort(0L, 0L);
 diskrequest = CreateStdIO(diskport);
 */ CreatStdIO(replyport) /*
 OpenDevice(TD_NAME, 0, diskrequest, 0);
  /* OpenDevice(DevName, Unit, IORequest, Flags) */
 SetMotor(diskrequest, 1L);
 ReadBlock(diskrequest, 0L, blockmemory);
 for(blockbyte=0; blockbyte<128; blockbyte++)
 {
   printf("%lx ", blockmemory[blockbyte]);
 }
 printf("\n\n");
 ReadTSH(diskrequest, 0L, 0L, 0L, blockmemory);
 for(blockbyte=0; blockbyte<128; blockbyte++)
 {
   printf("%lx ", blockmemory[blockbyte]);
 }
 printf("\n");
 SetMotor(diskrequest, 0L);
 CloseDevice(diskrequest);
 DeleteStdIO(diskrequest);
 DeletePort(diskport);
 FreeMem(blockmemory, 512L);
 /* END of CODE */
}


/*******************************************************/
/* PROCEDURES                                          */
/* PROCEDURES                                          */
/*******************************************************/


LONG *ReadBlock(iodr, block, data)
/*-----------------------------------------------------*/
/* Lecture du bloc sélectionné                         */
/* Read the block                                      */
/*-----------------------------------------------------*/
struct IOStdReq *iodr;
LONG block;
LONG *data;
{
LONG *succes = NULL;
  iodr->io_Command = CMD_READ;
  iodr->io_Length = TD_SECTOR;
  iodr->io_Data = (APTR)data;
  iodr->io_Offset = TD_SECTOR * block;
 DoIO(iodr);
 return(succes);
}

LONG *ReadTSH(iodr, track, sector, head, data)
/*-----------------------------------------------------*/
/* Lecture d'un secteur                                */
/* Read a sector                                       */
/*-----------------------------------------------------*/
struct IOStdReq *iodr;
LONG track;
LONG sector;
LONG head;
LONG *data;
{
LONG *succes = NULL;

 iodr->io_Command = CMD_READ;
 iodr->io_Length = TD_SECTOR;
 iodr->io_Data = (APTR)data;
 iodr->io_Offset = TD_SECTOR*(sector
                             + NUMSECS*head
                             + NUMSECS*NUMHEADS*track);
 DoIO(iodr);
 return(succes);
}

SetMotor(iodr, status)
/*-----------------------------------------------------*/
/* Allumer ou éteindre le moteur                       */
/* Switch on or off the drive motor                    */
/*-----------------------------------------------------*/
struct IOStdReq *iodr;
LONG status;
{
 iodr->io_Command = TD_MOTOR;
 iodr->io_Length = status; /* 1=ON or 0=OFF */
 DoIO(iodr);
}
