#include  <exec/types.h>
#include  <proto/dos.h>
#include  <proto/asl.h>
#include  <string.h>


/*
// Constantes pour la taille d'une disquette
*/
#define SECTSIZE   512          /* Nombre d'octets pour 1 secteur */
#define NBSECT       9          /* Nombre de secteurs par pistes  */


/*
// Structure d'un secteur
*/
typedef struct
    {
    UBYTE C;
    UBYTE H;
    UBYTE R;
    UBYTE N;
    UBYTE datas[ SECTSIZE ];
    } StSect;


/*
// Structure d'une piste
*/
typedef struct
    {
    StSect Sect[ NBSECT ];
    } StTrack;



static void ReadTrack( BPTR handle, UBYTE newTrack, StTrack * CurrTrackDatas )
{
    Seek( handle
        , ( LONG )( newTrack * sizeof( * CurrTrackDatas ) )
        , OFFSET_BEGINNING 
        );
    Read( handle, CurrTrackDatas, sizeof( * CurrTrackDatas ) );
}


static void CreeCPE( BPTR handle )
{
    static StTrack CurrTrackDatas;
    static UBYTE tab[ 66 ];
    BPTR handleOut;
    int p, s;

    handleOut = Open( "drivea.dat", MODE_NEWFILE );
    for ( p = 0; p < 40; p++ )
        {
        ReadTrack( handle, p, &CurrTrackDatas );
        for ( s = 0; s < NBSECT; s++ )
            tab[ s ] = CurrTrackDatas.Sect[ s ].R;
        tab[ NBSECT ] = 0xFF;
        Write( handleOut, tab, sizeof( tab ) );
        for ( s = 0; s < NBSECT; s++ )
            Write( handleOut, CurrTrackDatas.Sect[ s ].datas, SECTSIZE );
        Write( handleOut, CurrTrackDatas.Sect[ 0 ].datas, SECTSIZE );
        }
    Close( handleOut );
}



static char * SelectFichier( char * titre, char * masque )
{
    struct FileRequester * req;
    static char nomFic[ 256 ];

    * nomFic = 0;
    req = ( struct FileRequester * )AllocAslRequest( ASL_FileRequest
                                                   , TAG_DONE 
                                                   );
    if ( req )
        {
        if ( AslRequestTags( req
                           , ASLFR_InitialPattern,  masque
                           , ASLFR_DoPatterns,      TRUE
                           , ASLFR_TitleText,       titre
                           , TAG_DONE
                           ) 
           )
            {
            strcpy( nomFic, req->fr_Drawer );
            if ( ( * nomFic ) && 
                 ( nomFic[ strlen( nomFic ) - 1 ] != ':' ) && 
                 ( nomFic[ strlen( nomFic ) - 1 ] != '/' ) 
               )
                strcat( nomFic, "/" );
            strcat( nomFic, req->fr_File );
            }
        FreeAslRequest( ( APTR )req );
        }
    return nomFic;
}


void main( void )
{
    BPTR handle;
    char * nom;

    nom = SelectFichier( "Séléctionnez le nom du fichier disc CPC"
                       , "#?.CPC" 
                       );
    handle = Open( nom, MODE_OLDFILE );
    if ( handle )
        CreeCPE( handle );

    Close( handle );
}
