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


#define     NB_TRACK    40
#define     NB_SECT      9
#define     SECT_SIZE  512


typedef struct
    {
    char  debut[ 0x30 ]; /* "MV - CPCEMU Disk-File\r\nDisk-Info\r\n" */
    UBYTE NbTracks;
    UBYTE NbHeads;
    SHORT DataSize;     /* 0x1300 */
    UBYTE Unused[ 0xCC ];
    } CPCEMUEnt;



typedef struct
    {
    UBYTE C;                 /* track */
    UBYTE H;                 /* head  */
    UBYTE R;                 /* sect  */
    UBYTE N;                 /* size  */
    SHORT Un1;
    SHORT Un2;
    } CPCEMUSect;


typedef struct
    {
    char  ID[ 0x10 ];   /* "Track-Info\r\n" */
    UBYTE Track;
    UBYTE Head;
    SHORT Unused;
    UBYTE X1;       /* 2    */
    UBYTE X2;       /* 9    */
    UBYTE X3;       /* 0x4E */
    UBYTE X4;       /* 0xE5 */
    CPCEMUSect sect[ NB_SECT ];
    UBYTE Unu2[160];
    } CPCEMUTrack;

typedef struct
    {
    UBYTE C;
    UBYTE H;
    UBYTE R;
    UBYTE N;
    UBYTE datas[ SECT_SIZE ];
    } StSect;

typedef struct
    {
    StSect Sect[ NB_SECT ];
    } StTrack;


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( int argc, char * argv[] )
{
    BPTR HandleSource;
    BPTR HandleDest;
    static StTrack pisteCPC;
    static CPCEMUEnt EnteteDSK;
    static CPCEMUTrack pisteDSK;
    int i, s;
    char nomSource[ 256 ];
    char nomDest[ 256 ];
    STRPTR p;
    STRPTR q;

    if ( argc == 2 )
        p = argv[ 1 ];
    else        
        p = SelectFichier( "Sélectionnez le nom du fichier .CPC", "#?.CPC" );
    
    q = strchr( p, '.' );
    if ( q )
        * q = 0;

    strcpy( nomSource, p );
    strcat( nomSource, ".CPC" );
    strcpy( nomDest, p );
    strcat( nomDest, ".DSK" );
    memset( &EnteteDSK, 0, sizeof( EnteteDSK ) );
    memset( &pisteDSK, 0, sizeof( pisteDSK ) );
    strcpy( EnteteDSK.debut, "MV - CPCEMU Disk-File\r\nDisk-Info\r\n" );
    EnteteDSK.NbTracks = NB_TRACK;
    EnteteDSK.NbHeads = 1;
    EnteteDSK.DataSize = 0x0013;

    strcpy( pisteDSK.ID, "Track-Info\r\n" );
    pisteDSK.X1 = 2;
    pisteDSK.X2 = NB_SECT;
    pisteDSK.X3 = 0x4E;
    pisteDSK.X4 = 0xE5;

    HandleSource = Open( nomSource, MODE_OLDFILE );
    if ( HandleSource )
        {
        HandleDest = Open( nomDest, MODE_NEWFILE );
        if ( HandleDest )
            {
            Write( HandleDest, &EnteteDSK, sizeof( EnteteDSK ) );
            for ( i = 0; i < NB_TRACK; i++ )
                {
                Read( HandleSource, &pisteCPC, sizeof( pisteCPC ) );
                for ( s = 0; s < NB_SECT; s++ )
                    {
                    pisteDSK.sect[ s ].C = pisteCPC.Sect[ s ].C;
                    pisteDSK.sect[ s ].H = pisteCPC.Sect[ s ].H;
                    pisteDSK.sect[ s ].R = pisteCPC.Sect[ s ].R;
                    pisteDSK.sect[ s ].N = pisteCPC.Sect[ s ].N;
                    pisteDSK.Track = i;
                    }
                Write( HandleDest, &pisteDSK, sizeof( pisteDSK ) );
                for ( s = 0; s < NB_SECT; s++ )
                    Write( HandleDest, pisteCPC.Sect[ s ].datas, SECT_SIZE );
                }
            Close( HandleDest );
            }
        Close( HandleSource );
        }
}
