Pour la carte SD, si c'est une des saletés taïwanaise sans marque vendue par les chinois, il faut essayer de l'insérer
après avoir démarré l'ordinateur. Il y a une chance (minime) pour qu'elle puisse s'initialiser.
Les dernières cartes que j'ai achetées sont celles-ci :
https://www.ebay.fr/itm/10-128MB-SanDis ... 2480550349
Elles existent aussi en 256 Mo et 512 Mo, mais c'est plus cher.
Contrairement à ce qu'annonce le titre elles ne sont pas neuves, mais d'occasion. Avant de les utiliser on peut retrouver toutes les photos, vidéos et musiques avec un logiciel de récupération de fichiers perdus. Là elles sont en lot de 10, mais on doit en trouver à l'unité chez aliexpress.
N'achetez surtout pas des cartes microSD pas chères sur le "market place" d'Amazon, CDiscount, Rue du Commerce ou autres. A moins de 2 € la carte de 4 Go ou plus, ce sont toutes des contrefaçons. Je me suis fait avoir chez CDiscount, mais les autres sont pareils. Les clients ne s'aperçoivent pas tout de suite de la supercherie, car en général elles contiennent une centaine de Mo valides et permettent d'enregistrer quelques fichiers, mais ensuite on perd tout. Les contrefacteurs arrivent à modifier les registres CID et CSD de la carte pour que Windows la reconnaisse bien et affiche la capacité attendue, mais à l'usage c'est la catastrophe.
FD2SD et SD2FD sont des programmes d'une très grande simplicité :
FD2SD ajoute 256 octets FF (hexa) à chaque secteur de 256 octets du fichier .fd
SD2FD retire les 256 octets FF ajoutés par FD2SD.
J'avais aussi prévu l'ajout d'une checksum, mais elle est inutilisée (jamais testée).
Code : Tout sélectionner
/*****************************************************************************\
* FD2SD.C - Conversion fichiers .fd (secteur 256 octets) en .sd (512 octets) *
* Auteur : Daniel Coulom - danielcoulom@gmail.com *
* Creation : Juillet 2013 *
* Ajout checksum en juillet 2017 *
\*****************************************************************************/
#include <windows.h>
#include <dirent.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <shlobj.h>
#define SECTEUR_MAX 5120 //4 unites de 80 pistes de 16 secteurs
char version[11]; //numero de version
char filename[256];
char string[256];
//Initialisation de la version/////////////////////////////////////////////////
void Initversion()
{
char months[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
char datecompil[12];
char mois[3];
char jour[3];
//date de compilation
strcpy(datecompil, __DATE__);
datecompil[3] = datecompil[6] = 0;
//mois
sprintf(mois, "%02i", 1 + (strstr(months, datecompil) - months) / 3);
//jour
strcpy(jour, datecompil + 4);
if(jour[0] < '0') jour[0] = '0';
//version
strcpy(version, datecompil + 7);
strcat(version, ".");
strcat(version, mois);
strcat(version, ".");
strcat(version, jour);
}
// conversion ////////////////////////////////////////////////////////////////
int Convertfd2sd()
{
FILE *ffd;
FILE *fsd;
int i, r, secteur, checksum;
char buffer[512];
for(i = 0; i < 512; i++) buffer[i] = 0xff;
//confirmation
sprintf(string, "Voulez-vous convertir %s ?", filename);
r = MessageBox(NULL, string, " FD2SD",
MB_YESNOCANCEL | MB_TOPMOST | MB_ICONINFORMATION);
if(r == IDNO) return 1;
if(r == IDCANCEL) return -1;
//ouverture des fichiers
ffd = fopen(filename, "rb");
filename[strlen(filename) - 2] = 's';
fsd = fopen(filename, "wb");
secteur = 0;
//ecriture des secteurs du fichier .fd
while(fread(buffer, 1, 256, ffd) == 256)
{
checksum = 0;
for(i = 0; i < 256; i++) checksum += buffer[i] & 0xff; //calcul checksum
buffer[256] = checksum & 0xff; //checksum en 256 a la suite du secteur
fwrite(buffer, 1, 512, fsd);
secteur++;
}
//completer a la taille maxi d'un fichier .fd (4 unites de 80 pistes)
for(i = 0; i < 512; i++) buffer[i] = 0xff;
buffer[256] = 0; //checksum
for(i = secteur; i < SECTEUR_MAX; i++) fwrite(buffer, 1, 512, fsd);
//fermeture des fichiers
fclose(ffd);
fclose(fsd);
return 0;
}
// main program //////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hpre, LPSTR lpCmd, int nCmdShow)
{
DIR *dp;
DIR *dummy;
int i, r;
struct dirent *ep;
char progdir[MAX_PATH];
//fenetre du programme
Initversion();
sprintf(string, " FD2SD - Conversion des fichiers .fd en .sd - Version %s",
version);
r = MessageBox(NULL,
"Fichier .fd : Image de disquette pour dcmoto, secteurs de 256 octets.\
\nFichier .sd : Image de disquette pour carte SD, secteurs de 512 octets.\
\n\nVoulez-vous convertir tous les fichiers .fd du répertoire ?",
string, MB_OKCANCEL | MB_TOPMOST | MB_ICONINFORMATION);
if(r == IDCANCEL) return 0;
//recherche et conversion des fichiers .fd
GetCurrentDirectory(MAX_PATH, progdir);
//boucle sur chaque fichier du dossier
dp = opendir(progdir);
if(dp == NULL) return -1;
while((ep = readdir(dp)))
{
strcpy(filename, ep->d_name);
if(filename[0] == '.') continue; //c'est un fichier supprime
strcpy(string, progdir);
strcat(string, filename);
dummy = opendir(string);
if(dummy) {closedir(dummy); continue;} //c'est un repertoire
for(i = 0; i < strlen(filename); i++) filename[i] = tolower(filename[i]);
if(strstr(filename, ".fd") == NULL) continue; //ce n'est pas un fichier .fd
if(Convertfd2sd() < 0) return 0;
}
closedir(dp);
MessageBox(NULL, "Fin de la conversion", " FD2SD",
MB_OK | MB_TOPMOST | MB_ICONINFORMATION);
return 0;
}
Code : Tout sélectionner
/*****************************************************************************\
* SD2FD.C - Conversion fichiers .sd (secteur 512 octets) en .fd (256 octets) *
* Auteur : Daniel Coulom - danielcoulom@gmail.com *
* Creation : Decembre 2013 *
* Controle de la checksum : Juillet 2017 *
\*****************************************************************************/
#include <windows.h>
#include <dirent.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <shlobj.h>
#define SECTEUR_MAX 5120 //4 unites de 80 pistes de 16 secteurs
char version[11]; //numero de version
char filename[256];
char string[256];
//Initialisation de la version/////////////////////////////////////////////////
void Initversion()
{
char months[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
char datecompil[12];
char mois[3];
char jour[3];
//date de compilation
strcpy(datecompil, __DATE__);
datecompil[3] = datecompil[6] = 0;
//mois
sprintf(mois, "%02i", 1 + (strstr(months, datecompil) - months) / 3);
//jour
strcpy(jour, datecompil + 4);
if(jour[0] < '0') jour[0] = '0';
//version
strcpy(version, datecompil + 7);
strcat(version, ".");
strcat(version, mois);
strcat(version, ".");
strcat(version, jour);
}
// conversion ////////////////////////////////////////////////////////////////
int Convertsd2fd()
{
FILE *fsd;
FILE *ffd;
int i, r, secteur, checksum, controle;
char buffer[512];
//confirmation
sprintf(string, "Voulez-vous convertir %s ?", filename);
r = MessageBox(NULL, string, " SD2FD",
MB_YESNOCANCEL | MB_TOPMOST | MB_ICONINFORMATION);
if(r == IDNO) return 1;
if(r == IDCANCEL) return -1;
//ouverture des fichiers
fsd = fopen(filename, "rb");
filename[strlen(filename) - 2] = 'f';
ffd = fopen(filename, "wb");
secteur = 0;
controle = 1;
//ecriture des secteurs du fichier .sd
while(fread(buffer, 1, 512, fsd) == 512)
{
checksum = 0;
for(i = 0; i < 256; i++) checksum += buffer[i] & 0xff; //calcul checksum
if(controle) if((buffer[256] & 0xff) != (checksum & 0xff))
{
sprintf(string, "Erreur secteur %i !\n\
checksum calculée : $%02x\n\
checksum lue : $%02x\n\n\
Cliquez sur OK pour continuer les contrôles, ou sur\n\
ANNULER pour les arrêter jusqu'à la fin du fichier.",
secteur, checksum & 0xff, buffer[256] & 0xff);
r = MessageBox(NULL, string, "SD2FD - Erreur",
MB_OKCANCEL | MB_TOPMOST | MB_ICONWARNING);
if(r == IDCANCEL) controle = 0;
}
fwrite(buffer, 1, 256, ffd);
secteur++;
}
//fermeture des fichiers
fclose(fsd);
fclose(ffd);
return 0;
}
// main program //////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hpre, LPSTR lpCmd, int nCmdShow)
{
DIR *dp;
DIR *dummy;
int i, r;
struct dirent *ep;
char progdir[MAX_PATH];
//fenetre du programme
Initversion();
sprintf(string, " SD2FD - Conversion des fichiers .sd en .fd - Version %s",
version);
r = MessageBox(NULL,
"Fichier .fd : Image de disquette pour dcmoto, secteurs de 256 octets.\
\nFichier .sd : Image de disquette pour carte SD, secteurs de 512 octets.\
\n\nVoulez-vous convertir tous les fichiers .sd du répertoire ?",
string, MB_OKCANCEL | MB_TOPMOST | MB_ICONINFORMATION);
if(r == IDCANCEL) return 0;
//recherche et conversion des fichiers .fd
GetCurrentDirectory(MAX_PATH, progdir);
//boucle sur chaque fichier du dossier
dp = opendir(progdir);
if(dp == NULL) return -1;
while((ep = readdir(dp)))
{
strcpy(filename, ep->d_name);
if(filename[0] == '.') continue; //c'est un fichier supprime
strcpy(string, progdir);
strcat(string, filename);
dummy = opendir(string);
if(dummy) {closedir(dummy); continue;} //c'est un repertoire
for(i = 0; i < strlen(filename); i++) filename[i] = tolower(filename[i]);
if(strstr(filename, ".sd") == NULL) continue; //ce n'est pas un fichier .fd
if(Convertsd2fd() < 0) return 0;
}
closedir(dp);
MessageBox(NULL, "Fin de la conversion", " SD2FD",
MB_OK | MB_TOPMOST | MB_ICONINFORMATION);
return 0;
}
Normalement les 4 unités d'un fichier .sd de 2 621 440 octets contenant n'importe quoi (zéro binaire, ou FF, ou autre) doivent pouvoir être formatées sur Thomson par les commandes DSKINI 0, DSKINI 1, DSKINI 2, DSKINI 3. Je ne vois pas pourquoi ça ne fonctionnerait pas.
Sinon il suffit de prendre un fichier .sd valide (par exemple le DOS TO7) et le reformater avec ces mêmes commandes.
Attention, la commande DSKINI nécessite le BASIC 512 (ou 128). Avec le BASIC 1.0 on peut aussi l'utiliser, mais il faut au préalable booter sur une disquette DOS.