/*****************************************************************************
 *                                                                           *
 *        Création d'une disquette CPC vierge au format DATA (178Ko)         *
 *                                                                           *
 *****************************************************************************/


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


/*
// Nom du fichier disquette
*/
#define NOM_DISC        "DISC.DSK"


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


typedef struct
    {
    char  debut[ 0x30 ]; /* "MV - CPCEMU Disk-File\r\nDisk-Info\r\n" */
    UBYTE NbTracks;
    UBYTE NbHeads;
    UBYTE Rien;
    UBYTE DataSize; 
    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       SectSize; /* 2    */
    UBYTE       NbSect;   /* 9    */
    UBYTE       Gap3;     /* 0x4E */
    UBYTE       OctRemp;  /* 0xE5 */
    CPCEMUSect  Sect[ 29 ];
    } CPCEMUTrack;


void main( void )
{
    static UBYTE datas[ NBSECT * SECTSIZE ];
    static CPCEMUTrack Piste;
    static CPCEMUEnt Entete;
    USHORT i, j, f = 0;
    BPTR handle;

    memset( &Entete, 0, sizeof( Entete ) );
    memset( &Piste, 0, sizeof( Piste ) );
    memset( datas, 0xE5, sizeof( datas ) );

    strcpy( Entete.debut, "MV - CPCEMU Disk-File\r\nDisk-Info\r\n" );
    Entete.NbTracks = NBTRACK;
    Entete.NbHeads = 1;
    Entete.DataSize = 0x13;

    strcpy( Piste.ID, "Track-Info\r\n" );
    Piste.SectSize = 2;
    Piste.NbSect = NBSECT;
    Piste.Gap3 = 0x4E;
    Piste.OctRemp = 0xE5;
  
    handle = Open( NOM_DISC, MODE_NEWFILE );
    Write( handle, &Entete, sizeof( Entete ) );
    for ( i = 0; i < NBTRACK; i++ )
        {
        for ( j = 0; j < NBSECT; j++ )
            {
            if ( ! f )
                {
                /* Données communes à toutes les pistes */
                Piste.Sect[ j ].H = 0;             /* Tête          */
                Piste.Sect[ j ].R = j + 0xC1;      /* N° secteur    */
                Piste.Sect[ j ].N = 2;             /* Taille        */
                }
            Piste.Sect[ j ].C = i;             /* N° piste  */
            Piste.Track = i;
            Piste.Head = Piste.Unused = 0;
            }
        f = 1;
        Write( handle, &Piste, sizeof( Piste ) );
        Write( handle, datas, sizeof( datas ) );
        }
    Close( handle );
}
