==============================================================================
                       DOCUMENTAZIONE SMD ROM FORMAT 
                     Written by Bart Trzynadlowski 1999
                   Tradotto da ev0 aka Dark DreAm (c)2003
==============================================================================

Questo documento descrive il formato ROM SMD Genesis. L'ho scritto perchè ho 
trovato che la documentazione di XnaK è errata.

0. FORMATO ROM SUPER MAGICDRIVE INTERLEAVED
Il formato SMD è un formato ROM Genesis che deve essere decodificato per essere
manipolato come normali dati Genesis cartridge. I file SMD consistono  in
una serie di blocchi da 16KB di dati con i loro byte dispari all'inizio, 
ed i byte pari alla fine. Hanno anche un'header che è lungo 15 byte.

        Byte importanti nell'header SMD:

        Offset 00h:     Numero di blocchi da 16KB. Questo numero potrebbe essere
			incorretto in alcuni file, è raccomandabile che te lo 
			calcoli da solo manualmente: 
			num_blocks = (sizeof(file) - 512) / 16384
        Offset 02h:     Indica quando la ROM è parte di una serie di split
                        ROM (1, o possibile non-zero,) o è una ROM standalone
                        o l'ultima ROM in una serie di split (0)
        Offset 08h:     AAh
        Offset 09h:     BBh

        * Note: Alcuni doc dicono che il byte 1 è sempre 3 e tutti gli altri
          byte menzionati dietro come importante sono 0. Questo non è sempre
	  il caso. Le informazioni sull'header in questo doc dovrebbero essere
          molto accurate.

Ogni blocco 16KB ha i dati da ogni indirizzo dispari all'inizio, ed i dati
per ogni altro indirizzo alla fine.

        Decodifica di un blocco SMD di 16KB:

        1. Se il byte offset nel blocco è più piccolo di 8192, copia il byte
           dal blocco SMD al primo offset dispari non usato nel decode
           buffer.
        2. Altrimenti, metti nel primo offset pari non usato nel decode
           buffer.

        Ecco un'esmpio di codice sorgente in C per un convertitore SMD-in-BIN:

        /* converte smd in bin */
        for (i = 0; i < header[0]; i++)
        {
                e = 0;
                o = 1;
                fread(smd_block, 1, 16384, in_fp);
                for (j = 0; j < 16384; j++)
                {
                        if (j < 8192)
                        {
                                bin_block[o] = smd_block[j];
                                o += 2;
                        }
                        else
                        {
                                bin_block[e] = smd_block[j];
                                e += 2;
                        }
                }
                fwrite(bin_block, 1, 16384, out_fp);
        }    

        Nel pezzetto di codice, 'e' rappresenta il primo offset pari non usato
	che parte sempre a 0) nel 16KB 'bin_block array'. Così 'o' rappresenta
        il primo oofset dispari non usato (che parte sempre a 1) nel 16KB
        'bin_block array'. Il 'for (i) loop' usa le informazioni dall'header
        per determinare quanti blocchi decodificare. Il 'for (j) loop' attualmente
        ha la funzione di decodificare un blocco individuale. Dovrebbe essere stato
        facilmente spiegato. Il metodo mostrato è un modo lineare di farlo, ci sono
	modi più veloci di farlo -- per esempio puoi decodificare 2 byte in un
        'loop', uno pari ed uno dispari.

Per avere un file SMD basta effettuare il contrario della decodifica.