Pour pouvoir utiliser ou jouer aux jeux et utilitaires conçus
pour la gamme des ordinateurs Hector ou tout simplement pour préserver
ces programmes de la dégradation du support magnétique sur
lequel ils ont été enregistrés à l'origine,
plusieurs outils ont été développés, wav2hec
est l'un d'eux, il permet de transformer le contenu d'une cassette Hector
en format binaire.
"Comment, ça marche ? Eh bien, c'est très simple!"
Michel Chevalet
1. Enregistrement d'une cassette Hector
Après avoir branché un magnétophone
sur la carte son d'un PC (Mic-in) et utilisé le "magnétophone"
Windows (XP):
Dans le menu "Fichier", sélectionner
"Propriétés" et cliquer sur "choisir à
partir de" l'option "Formats d'enregistrement" puis cliquer
sur "Convertir Maintenant":
La boite de dialogue apparait:
Sélectionner la "Qualité CD" et
valider, vous êtes prêts à enregistrer toutes vos cassettes
Hector! Après avoir mis le lecteur de cassettes en branle, une
pression sur le bouton "Enregistrer" (bouton rouge) et lorsque
l'enregistrement est fini, cliquer sur "stop" et sauver le fichier
sous (Menu fichier, option "Enregistrer Sous...") un nom à
l'extension .wav
2. Où sont passés les 1 et les 0 ?
Lorsqu'on ouvre le fichier .wav produit avec un éditeur,
on obtient une courbe de ce type:
On voit que les différentes périodes (distances
entre deux passages en ordonnée 0) ne sont pas toujours identiques!
Mais comment savoir si on a des 1, des 0 ou autre chose dans ce fichier
?
Nous allons tout simplement compter le nombre de périodes
de mêmes longueurs. Le résultat est le suivant (sur un fichier
wav enregistré en 22Khz):
Mis à part le pic en position 36-39 qui semble être
du bruit, on voit que l'on a trois types d'informations différents
stockés sur une bande magnétique pour Hector. Des 1, des
0 et des ???. Apres lecture des articles qui ont pu paraitre sur la machine:
Surement des cycles de synchronisation nécessaires à l'acquisition
correcte des données qui les suivent.
Un article (Hectorien 1,2) fait mention d'environ 7 secondes
de synchronisation en début de bande, le pic situé en 21-24
correspondrait à peu-près à cette durée. Les
deux premiers pics seraient donc les 0 et 1, comment décider lequel
des deux est 1 ?
Pas de miracle, il va falloir tester les deux cas.
On prend tous les cycles, à l'exception des cycles
de synchronisation pour les grouper par paquets de 8.
Dans l'un des deux cas on obtient des octets qui correspondent
à quelque chose:
Les zéros ont donc une longueur d'environ 27 échantillons,
les uns de 47 échantillons et les cycles de synchronisation de
75 echantillons (en 44.1Khz).
3. Le format WAVE (.wav)
On dit: "On lit le fichier .wav et on convertit...",
facile ! Mais sans connaître l'organisation interne d'un fichier
.wav, dur dur.
Ce format, inventé par Micro$oft est très
simple de manipulation, sa structure, dans son format de base est composé
de blocs:
"RIFF"
Longueur du fichier - 8
"WAVE"
"fmt"
Longueur de bloc format
Encodage
Nombre de canaux
Taux d'échantillonnage
ByteRate
Alignement du bloc
Nombre de bits par échantillon
"data"
longueur des données
<Données
proprement dites>
En C, on utilise trois stuctures pour reproduire le format
ci-dessus:
/* Microsoft
WAVE file header */
typedef struct _WAVEHDR
{
CHAR achRIFF[4]; /* Always contains "RIFF" */
UINT32 nLength; /*Length of file in bytes, minus eight*/
CHAR achWAVE[4]; /* Always contains "WAVE" */
} WAVEHDR, *PWAVEHDR;
/* Microsoft WAVE file chunk header */
typedef struct _WAVECHKHDR
{
CHAR achType[4]; /* Type ID of this chunk */
UINT32 nLength; /* Length of the chunk data */
} WAVECHKHDR, *PWAVECHKHDR;
/* Microsoft WAVE file format chunk data structure */
typedef struct _WAVEFMTCHKHDR
{
UINT16 nFormat; /* Format encoding tag */
UINT16 nChannels; /* Number of channels */
UINT32 nSampleRate; /*Sample rate: samples per second*/
UINT32 nByteRate; /* Sample rate: bytes per second */
UINT16 nBlockAlign; /* Block alignment, in bytes */
UINT16 nBitsPerSample; /* Bits per sample */
} WAVEFMTCHKHDR, *PWAVEFMTCHKHDR;
Le paragraphe <Données
proprement dites> est une succession de valeurs représentant
une courbe qui est l'image de ce qui avait été enregistré
sur cassette.
4. Le format HEC (.hec)
Un format inventé par moi-même ;-) pour pouvoir
stocker le contenu converti des fichiers sons. On cherche a conserver
les octets et les périodes de synchronisation.
On compte trois types de blocs différents, un premier
qui est une entête de fichier qui contient diverses informations
relatives au jeu et au dump lui-même. Puis viennent des blocs de
données et des blocs de synchronisation.
Version de format
nom du jeu
Nom du convertisseur
Date de la conversion
Annee de parution du logiciel
Nom de l'éditeur
Prix (Euros) du logiciel lors de sa parution
"DATA"
Longueur
<données proprement dites>
ou
"SYNC"
Nombre de cycles
....
Les deux structures C utilisées sont:
typedef struct
{
unsigned char version_fichier; /* version de format de fichier */
char prg_nom[60]; /* nom original du jeu */
char nom_dumpeur[50]; /* nom de la personne ayant effectue le dump*/
short dump_annee; /* annee a laquelle le dump a ete fait*/
short dump_mois; /* mois */
short dump_jour;
short prg_annee_parution; /* annee de parution du soft */
char prg_editeur[50]; /* editeur du logiciel */
short prg_prix; /* prix du soft a sa sortie */
} hector_header;
typedef struct
{
char typed[5]; /* contient 'SYNC\0' ou 'DATA\0' */
UCHAR dummy;
INT16 len; /* nb cycles de sync ou nb d'octets de data */
} digital_sync,digital_data,hector_blk;