blob: ddac4acd4f71c07cd5563321c591a6ca54f45f92 [file] [log] [blame]
/*
*
* FD2SAP conversion FD => SAP
*
*/
#include <stdio.h>
#include <strings.h>
#define NBSIDE 4
#define NBTRACK 80
#define NBSECT 16
#define SECTSIZE 256
unsigned char disk[NBSIDE][NBTRACK][NBSECT][SECTSIZE];
#define SIDESIZE (NBTRACK*NBSECT*SECTSIZE)
int LoadFD(char * name)
{
FILE * f;
int sector,track,side;
int nb_side,size;
f=fopen(name,"rb");
if (f==NULL) return -1;
fseek(f, 0L, SEEK_END);
size = ftell(f);
fseek(f, 0L, SEEK_SET);
if (size==SIDESIZE) {
for (track=0;track<NBTRACK;track++)
for (sector=0;sector<NBSECT;sector++)
{
fread(disk[0][track][sector],sizeof(char),256,f);
}
return 1;
} else
if (size==2*SIDESIZE) {
for (side=0;side<2;side++)
for (track=0;track<NBTRACK;track++)
for (sector=0;sector<NBSECT;sector++)
{
fread(disk[side][track][sector],sizeof(char),256,f);
}
return 2;
}else
if (size==4*SIDESIZE) {
for (side=0;side<4;side++)
for (track=0;track<NBTRACK;track++)
for (sector=0;sector<NBSECT;sector++)
{
fread(disk[side][track][sector],sizeof(char),256,f);
}
return 4;
}
fclose(f);
return 0;
}
/*
ecriture au format TDS
*/
void SaveTDS(char * name,int side)
{
FILE * f;
char descript[0xA0];
int i,j;
/* lecture du descripteur TDS */
f=fopen(name,"wb");
if (f==NULL) return;
/* construction du header */
for(i=0;i<0xA0;i++)
{
descript[i]=0;
for(j=0;j<8;j++)
{
if (disk[side][20][1+(i*8)/SECTSIZE][(i*8)%SECTSIZE]!=0xFF)
descript[i]|=(1<<j);
}
}
fwrite(descript,sizeof(char),(size_t)0xA0,f);
for (i=0;i<0xA0;i++)
for (j=0;j<8;j++)
{
if ( ( descript[i]&(1<<j) )!=0 )
{
int SEC,TRK;
SEC=(i%2)*8+j;
TRK=i/2;
fwrite(disk[side][TRK][SEC],sizeof(char),(size_t)SECTSIZE,f);
}
}
fclose(f);
}
short crcpuk_temp;
static const short magic_puk[]={
0x0000, 0x1081, 0x2102, 0x3183,
0x4204, 0x5285, 0x6306, 0x7387,
0x8408, 0x9489, 0xa50a, 0xb58b,
0xc60c, 0xd68d, 0xe70e, 0xf78f
};
char * puk_header="\x01SYSTEME D'ARCHIVAGE PUKALL S.A.P. (c) Alexandre PUKALL Avril 1998";
crc_pukall(short c)
{
register short puk;
/* on repete le code pour aller plus vite. Pas de boucle ici */
puk = (crcpuk_temp ^ c) & 0xf;
crcpuk_temp = ((crcpuk_temp>>4) & 0xfff) ^ magic_puk[puk];
c >>= 4;
puk = (crcpuk_temp ^ c) & 0xf;
crcpuk_temp = ((crcpuk_temp>>4) & 0xfff) ^ magic_puk[puk];
}
void SaveSAP(char * name,int side)
{
FILE *f;
unsigned char format,protection,piste,secteur;
char *buffer;
int fois;
format=0;
protection=0; /* variables de test */
f=fopen(name,"wb");
if (f==NULL) return;
/*
* Ecriture du header
*/
fwrite(puk_header,strlen(puk_header),sizeof(char),f);
/*
* Ecriture des donnees
*/
for (piste=0;piste<80;piste++)
for (secteur=1;secteur<=16;secteur++)
{
crcpuk_temp = 0xffff; /* toujours remettre cette variable a 0xffff */
/* pour calculer un nouveau CRC */
crc_pukall(format); /* calcul du CRC d'un secteur */
crc_pukall(protection);
crc_pukall(piste);
crc_pukall(secteur);
buffer=disk[side][piste][secteur-1];
for (fois=0;fois<=255;fois++) /* on admet que buffer contient les */
{ /* donnees d'un secteur S.A.P. */
crc_pukall(buffer[fois]);
buffer[fois]=buffer[fois]^0xb3;
}
fputc(format & 0xFF,f);
fputc(protection & 0xFF,f);
fputc(piste & 0xFF,f);
fputc(secteur & 0xFF,f);
fwrite(buffer,256,sizeof(char),f);
fputc((crcpuk_temp >> 8) & 0xFF,f);
fputc(crcpuk_temp & 0xFF,f);
}
fclose(f);
}
int main(int argc,char * argv[])
{
char str[1024];
char str2[1024];
char str3[32];
int i,nb_side;
if (argc!=3)
{
fprintf(stderr,"syntaxe : %s <fichier fd source> <fichier SAP dest>\n",argv[0]);
exit (-1);
}
nb_side=LoadFD(argv[1]);
if (nb_side<=0) {
fprintf(stderr,"Bad FD file");
exit(-1);
}
strcpy(str,argv[2]);
if (strlen(str)>4)
if (strcmp(&str[strlen(str)-4],".sap")==0) str[strlen(str)-4]='\0';
for (i=0;i<nb_side;i++) {
strcpy(str2,str);
strcat(str2,"_side");
sprintf(str3,"%d",i);
strcat(str2,str3);
strcat(str2,".sap");
SaveSAP(str2,i);
}
}