/*

    Passerelle de transfer des fichiers .CPC d'ami cpc vers les fichiers
    utilisés par emu-cpc v0.7

    ATTENTION : Version alpha... Limitée à des disquettes d'une face.

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


#define     SECTSIZE        512
#define     NBTRACK          40
#define     NBSECT            9
#define     EMUCPCNBSECT     26


typedef struct
    {
    ULONG   Signature;
    ULONG   MagicNumber;
    UBYTE   NbSide;
    UBYTE   NbTracks;
    USHORT  TrackSize;
    ULONG   DiskSize;
    } EMUCPCEnt;


typedef struct
    {
    UBYTE R;
    UBYTE N;
    SHORT Un1;
    LONG  Offset;
    } EMUCPCSect;


typedef struct
    {
    EMUCPCSect sect[ EMUCPCNBSECT ];
    } EMUCPCTrack;


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

typedef struct
    {
    StSect Sect[ NBSECT ];
    } 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( void )
{
    BPTR HandleSource;
    BPTR HandleDest;
    static StTrack pisteCPC;
    static EMUCPCEnt EmuCPCEntete;
    static EMUCPCTrack EmuCPCPiste;
    int i, s;
    char nomSource[ 256 ];
    char nomDest[ 256 ];

    STRPTR p = SelectFichier( "Sélectionnez le nom du fichier .CPC", "#?.CPC" );
    STRPTR q = strchr( p, '.' );
    if ( q )
        * q = 0;

    strcpy( nomSource, p );
    strcat( nomSource, ".CPC" );
    strcpy( nomDest, p );
    strcat( nomDest, ".EMUCPC" );
    memset( &EmuCPCEntete, 0, sizeof( EmuCPCEntete ) );
    memset( &EmuCPCPiste, 0, sizeof( EmuCPCPiste ) );
    EmuCPCEntete.Signature = *( ULONG * )"CPCD";
    EmuCPCEntete.MagicNumber = 1;
    EmuCPCEntete.NbSide = 1;
    EmuCPCEntete.NbTracks = NBTRACK;
    EmuCPCEntete.TrackSize = NBSECT * SECTSIZE;

    for ( i = 0; i < EMUCPCNBSECT; i++ )
        {
        EmuCPCPiste.sect[ i ].R = 0xC1 + i;
        EmuCPCPiste.sect[ i ].N = 2;
        EmuCPCPiste.sect[ i ].Offset = SECTSIZE * i;
        }

    HandleSource = Open( nomSource, MODE_OLDFILE );
    if ( HandleSource )
        {
        HandleDest = Open( nomDest, MODE_NEWFILE );
        if ( HandleDest )
            {
            Write( HandleDest, &EmuCPCEntete, sizeof( EmuCPCEntete ) );
            for ( i = 0; i < NBTRACK; i++ )
                {
                Read( HandleSource, &pisteCPC, sizeof( pisteCPC ) );
                for ( s = 0; s < NBSECT; s++ )
                    {
                    EmuCPCPiste.sect[ s ].R = pisteCPC.Sect[ s ].R;
                    EmuCPCPiste.sect[ s ].N = pisteCPC.Sect[ s ].N;
                    }
                Write( HandleDest, &EmuCPCPiste, sizeof( EmuCPCPiste ) );
                for ( s = 0; s < NBSECT; s++ )
                    Write( HandleDest, pisteCPC.Sect[ s ].datas, SECTSIZE );
                }
            Close( HandleDest );
            }
        Close( HandleSource );
        }
}
