Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

iDSK: Added parameter to skip Amsdos header check #155

Open
wants to merge 6 commits into
base: development
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 30 additions & 27 deletions cpctelera/tools/iDSK-0.13/src/GestDsk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ bool CheckAmsdos( unsigned char * Buf ) {
}

//
// Cr�e un nom AMSDOS a partir d'un nom Linux/Mac
// Crée un nom AMSDOS a partir d'un nom Linux/Mac
//
char * FiltrerNom(const char* NomFic)
{
Expand Down Expand Up @@ -70,7 +70,7 @@ char * FiltrerNom(const char* NomFic)


//
// Cr�e une en-t�te AMSDOS par d�faut
// Crée une en-tête AMSDOS par défaut
//
StAmsdos * CreeEnteteAmsdos( char * NomFic, unsigned short Longueur ) {
static StAmsdos Entete;
Expand All @@ -79,7 +79,7 @@ StAmsdos * CreeEnteteAmsdos( char * NomFic, unsigned short Longueur ) {
memset( &Entete, 0, sizeof( Entete ) );

memcpy( Entete.FileName, FiltrerNom(NomFic), 11 );
Entete.Length = 0; //Non renseign� par AMSDos !!
Entete.Length = 0; //Non renseigné par AMSDos !!
Entete.RealLength = Entete.LogicalLength = Longueur;
Entete.FileType = 2; //Fichier binaire

Expand Down Expand Up @@ -175,7 +175,7 @@ int DSK::RechercheBlocLibre( int MaxBloc ) {


//
// Recherche une entr�e de r�pertoire libre
// Recherche une entrŽe de rŽpertoire libre
//
int DSK::RechercheDirLibre( void ) {
for ( int i = 0; i < 64; i++ ) {
Expand All @@ -188,15 +188,15 @@ int DSK::RechercheDirLibre( void ) {


//
// Retourne les donn�es "brutes" de l'image disquette
// Retourne les donnŽes "brutes" de l'image disquette
//
unsigned char * DSK::GetRawData( int Pos ) {
return( &ImgDsk[ Pos ] );
}


//
// Ecriture de donn�es "brutes" dans l'image disquette
// Ecriture de donnŽes "brutes" dans l'image disquette
//
void DSK::WriteRawData( int Pos, unsigned char * Data, int Longueur ) {
memcpy( &ImgDsk[ Pos ], Data, Longueur );
Expand Down Expand Up @@ -316,7 +316,7 @@ void DSK::WriteBloc( int bloc, unsigned char BufBloc[ SECTSIZE * 2 ] ) {
track++;

//
// Ajuste le nombre de pistes si d�passement capacit�
// Ajuste le nombre de pistes si dŽpassement capacitŽ
//
CPCEMUEnt * Entete = ( CPCEMUEnt * )ImgDsk;
if ( track > Entete->NbTracks - 1 ) {
Expand Down Expand Up @@ -387,8 +387,8 @@ CPCEMUTrack * DSK::GetInfoTrack( int Track ) {
}

//
// Remplit un "bitmap" pour savoir o il y a des fichiers sur la disquette
// Retourne �galement le nombre de Ko utilis�s sur la disquette
// Remplit un "bitmap" pour savoir o il y a des fichiers sur la disquette
// Retourne Žgalement le nombre de Ko utilisŽs sur la disquette
//
int DSK::FillBitmap( void ) {
int NbKo = 0;
Expand All @@ -412,7 +412,7 @@ int DSK::FillBitmap( void ) {


//
// Positionne une entr�e dans le r�pertoire
// Positionne une entrŽe dans le rŽpertoire
//
void DSK::SetInfoDirEntry( int NumDir, StDirEntry * Dir ) {
int MinSect = GetMinSect();
Expand All @@ -430,7 +430,7 @@ void DSK::SetInfoDirEntry( int NumDir, StDirEntry * Dir ) {


//
// V�rifie l'existente d'un fichier, retourne l'indice du fichier si existe,
// VŽrifie l'existente d'un fichier, retourne l'indice du fichier si existe,
// -1 sinon
//
int DSK::FileExist( char * Nom ) {
Expand Down Expand Up @@ -475,13 +475,13 @@ int DSK::FileIsIn( string FileName ) {
int DSK::CopieFichier( unsigned char * BufFile, char * NomFic, int TailleFic, int MaxBloc ) {
int j, l, Bloc, PosFile, NbPages = 0, PosDir, TaillePage;
FillBitmap();
StDirEntry * DirLoc = GetNomDir( NomFic ); //Construit l'entr�e pour mettre dans le catalogue
StDirEntry * DirLoc = GetNomDir( NomFic ); //Construit l'entrée pour mettre dans le catalogue

for ( PosFile = 0; PosFile < TailleFic; ) { //Pour chaque bloc du fichier
PosDir = RechercheDirLibre(); //Trouve une entr�e libre dans le CAT
PosDir = RechercheDirLibre(); //Trouve une entrée libre dans le CAT
if ( PosDir != -1 ) {
DirLoc->User = 0; //Remplit l'entr�e : User 0
DirLoc->NumPage = ( unsigned char )NbPages++; // Num�ro de l'entr�e dans le fichier
DirLoc->User = 0; //Remplit l'entrée : User 0
DirLoc->NumPage = ( unsigned char )NbPages++; // Numéro de l'entrée dans le fichier
TaillePage = (TailleFic - PosFile + 127) >> 7 ; // Taille de la page (on arrondit par le haut)
if ( TaillePage > 128 ) // Si y'a plus de 16k il faut plusieurs pages
TaillePage = 128;
Expand Down Expand Up @@ -511,7 +511,7 @@ int DSK::CopieFichier( unsigned char * BufFile, char * NomFic, int TailleFic, in


//
// Retourne une entr�e du r�pertoire
// Retourne une entrŽe du rŽpertoire
//
StDirEntry * DSK::GetInfoDirEntry( int NumDir ) {
static StDirEntry Dir;
Expand All @@ -530,7 +530,7 @@ StDirEntry * DSK::GetInfoDirEntry( int NumDir ) {


//
// V�rifier si DSK est "standard" (DATA ou VENDOR)
// VŽrifier si DSK est "standard" (DATA ou VENDOR)
//
bool DSK::CheckDsk( void ) {
CPCEMUEnt * Infos = ( CPCEMUEnt * )ImgDsk;
Expand Down Expand Up @@ -855,11 +855,11 @@ bool DSK::GetFileInDsk( char* path, int Indice ){
return true;
}

bool DSK::PutFileInDsk( string Masque ,int TypeModeImport ,int loadAdress, int exeAdress ) {
bool DSK::PutFileInDsk( string Masque ,int TypeModeImport ,int loadAdress, int exeAdress, bool SkipHeaderCheck ) {
static unsigned char Buff[ 0x20000 ];
static char *cFileName;
unsigned long Lg;
bool ret;
bool ret,IsAmsdos;
FILE* Hfile;

// Unrequired!
Expand All @@ -886,14 +886,17 @@ bool DSK::PutFileInDsk( string Masque ,int TypeModeImport ,int loadAdress, int e
return false;
}

//
// Regarde si le fichier contient une en-tete ou non
//
bool IsAmsdos = CheckAmsdos( Buff );
if (SkipHeaderCheck) {
IsAmsdos = false;
}
else {
// Regarde si le fichier contient une en-tete ou non
IsAmsdos = CheckAmsdos( Buff );
}

if ( ! IsAmsdos ) {
// Creer une en-tete amsdos par defaut
cout << "Cr�ation automatique d'une en-t�te pour le fichier ...\n";
cout << "Création automatique d'une en-tête pour le fichier ...\n";
e = CreeEnteteAmsdos( cFileName, ( unsigned short )Lg );
if ( loadAdress != 0)
{
Expand All @@ -912,7 +915,7 @@ bool DSK::PutFileInDsk( string Masque ,int TypeModeImport ,int loadAdress, int e
if ( isBigEndian() ) e = StAmsdosEndian(e);
}
else
cout << "Le fichier a d�j� une en-t�te\n";
cout << "Le fichier a déjà une en-tête\n";

//
// En fonction du mode d'importation...
Expand Down Expand Up @@ -953,7 +956,7 @@ bool DSK::PutFileInDsk( string Masque ,int TypeModeImport ,int loadAdress, int e
Lg += sizeof( StAmsdos );
}

//if (MODE_BINAIRE) ClearAmsdos(Buff); //Remplace les octets inutilis�s par des 0 dans l'en-t�te
//if (MODE_BINAIRE) ClearAmsdos(Buff); //Remplace les octets inutilisés par des 0 dans l'en-tête

if ( CopieFichier( Buff,cFileName,Lg,256) != ERR_NO_ERR )
ret = false;
Expand Down Expand Up @@ -1133,7 +1136,7 @@ std::string DSK::ReadDskDir( void ) {
for ( int i = 0; i < 64; i++ ) {
SetInfoDirEntry( i, &TabDir[ i ] );
//
// Afficher les fichiers non effac�s
// Afficher les fichiers non effacés
//
if ( TabDir[ i ].User != USER_DELETED && ! TabDir[ i ].NumPage ) {
char Nom[ 13 ];
Expand Down
14 changes: 7 additions & 7 deletions cpctelera/tools/iDSK-0.13/src/GestDsk.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,26 @@ extern unsigned char BufFile[ 0x10000 ];

extern int TailleFic, CurLigne;

#pragma pack(push,1) //�vite le padding des structures qui sont utilis�es dans des memcpy par la suite
#pragma pack(push,1) //évite le padding des structures qui sont utilisées dans des memcpy par la suite

//
// Structure d'une entr�e AMSDOS
// Structure d'une entr�e AMSDOS
//
typedef struct
{
unsigned char UserNumber; // 00 User
unsigned char FileName[ 15 ]; // 01-0F Nom + extension
unsigned char BlockNum; // 10 Num�ro du bloc (disquette)
unsigned char BlockNum; // 10 Num�ro du bloc (disquette)
unsigned char LastBlock; // 11 Flag "dernier bloc" bloc (disquette)
unsigned char FileType; // 12 Type de fichier
unsigned short Length; // 13-14 Longueur
unsigned short Adress; // 15-16 Adresse
unsigned char FirstBlock; // 17 Flag premier bloc de fichier (disquette)
unsigned short LogicalLength; // 18-19 Longueur logique
unsigned short EntryAdress; // 1A-1B Point d'entr�e
unsigned short EntryAdress; // 1A-1B Point d'entr�e
unsigned char Unused[ 0x24 ];
unsigned short RealLength; // 40-42 Longueur r�elle
unsigned char BigLength; // Longueur r�elle (3 octets)
unsigned short RealLength; // 40-42 Longueur r�elle
unsigned char BigLength; // Longueur r�elle (3 octets)
unsigned short CheckSum; // 43-44 CheckSum Amsdos
unsigned char Unused2[ 0x3B ];
} StAmsdos;
Expand Down Expand Up @@ -148,7 +148,7 @@ class DSK {
char * GetEntryNameInCatalogue ( int num , char* Nom );
char * GetEntrySizeInCatalogue ( int num , char* Size );
bool GetFileInDsk( char* path, int Indice );
bool PutFileInDsk( std::string Masque ,int TypeModeImport ,int loadAdress, int exeAdress );
bool PutFileInDsk( std::string Masque ,int TypeModeImport ,int loadAdress, int exeAdress, bool SkipHeaderCheck );
bool OnViewFic(int nItem);
bool Hexdecimal();
void RemoveFile ( int item );
Expand Down
23 changes: 13 additions & 10 deletions cpctelera/tools/iDSK-0.13/src/Main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@ int main(int argc, char** argv) {
ModeRemoveFile,
ModeDisaFile, ModeListBasic,
ModeListDams,ModeListHex,
ModeGetFile, ModeNewDsk, Force_Overwrite;
ModeGetFile, ModeNewDsk, Force_Overwrite, SkipHeaderDetection;

ModeListDsk = ModeImportFile =
ModeRemoveFile = ModeDisaFile =
ModeListBasic = ModeListDams = ModeListHex = ModeNewDsk =
ModeGetFile = IsDskLoc = IsDskSet = Force_Overwrite = false ;
ModeGetFile = IsDskLoc = IsDskSet = Force_Overwrite = SkipHeaderDetection = false ;

string DskFile, AmsdosFile;
vector<string> AmsdosFileList;
Expand All @@ -41,7 +41,7 @@ int main(int argc, char** argv) {
IsDsk = IsDskValid = false;
IsDskSaved = true;

// R�cup�ration des arguments avec getopt_pp
// Récupération des arguments avec getopt_pp
{using namespace GetOpt;
GetOpt_pp opts(argc,argv);

Expand Down Expand Up @@ -78,6 +78,8 @@ int main(int argc, char** argv) {
>> Option('g',"get",AmsdosFileList)

>> OptionPresent('f',"force",Force_Overwrite)

>> OptionPresent('m',"skipheadercheck",SkipHeaderDetection)
;

if(opts.options_remain())
Expand All @@ -89,7 +91,7 @@ int main(int argc, char** argv) {
}//namespace getopt

if ( ! IsDskSet ) {
cerr << "Vous n'avez pas selectionn� de fichier image DSK" << endl;
cerr << "Vous n'avez pas selectionné de fichier image DSK" << endl;
help();
}
else cerr << "DSK : " << DskFile << endl;
Expand All @@ -102,7 +104,7 @@ int main(int argc, char** argv) {
exit(EXIT_FAILURE);
}
if ( ! MyDsk.CheckDsk() ) {
cerr <<"Fichier image non support� ("<< DskFile << ")."<<endl;
cerr <<"Fichier image non supporté ("<< DskFile << ")."<<endl;
exit(EXIT_FAILURE);
}
int Indice;
Expand All @@ -119,7 +121,7 @@ int main(int argc, char** argv) {
if ( ModeListBasic )
cout << ViewBasic( ) << endl;
else if ( ModeListDams )
cout << "Pas implement� pour le moment."<<endl;
cout << "Pas implementé pour le moment."<<endl;
else if ( ModeListHex ) {
MyDsk.Hexdecimal();
cout << Listing << endl;
Expand Down Expand Up @@ -161,7 +163,7 @@ int main(int argc, char** argv) {
}

if ( ! MyDsk.CheckDsk() ) {
cerr <<"Fichier image non support� ("<< DskFile << ")."<<endl;
cerr <<"Fichier image non supporté ("<< DskFile << ")."<<endl;
exit(EXIT_FAILURE);
}

Expand Down Expand Up @@ -194,7 +196,7 @@ int main(int argc, char** argv) {

cerr << "Fichier Amsdos : "<< nomBase << endl;

MyDsk.PutFileInDsk(*iter,AmsdosType,loadAdress,exeAdress);
MyDsk.PutFileInDsk(*iter,AmsdosType,loadAdress,exeAdress,SkipHeaderDetection);
}
if ( MyDsk.WriteDsk (DskFile) )
cout << MyDsk.ReadDskDir();
Expand All @@ -208,7 +210,7 @@ int main(int argc, char** argv) {
exit(EXIT_FAILURE);
}
if ( ! MyDsk.CheckDsk() ) {
cerr <<"Fichier image non support� ("<< DskFile << ")."<<endl;
cerr <<"Fichier image non supporté ("<< DskFile << ")."<<endl;
exit(EXIT_FAILURE);
}
int Indice;
Expand All @@ -217,7 +219,7 @@ int main(int argc, char** argv) {
char* amsdosF = GetNomAmsdos(basename( (char*)(*iter).c_str()));
cerr << "Fichier Amsdos : " << amsdosF << endl;
if ( (Indice= MyDsk.FileIsIn( amsdosF ))<0) {
cerr << "Erreur Fichier : "<< amsdosF << " non trouv�."<< endl;
cerr << "Erreur Fichier : "<< amsdosF << " non trouvé."<< endl;
exit(EXIT_FAILURE);
}
MyDsk.RemoveFile(Indice);
Expand Down Expand Up @@ -286,6 +288,7 @@ void help(void)
cout << " -e : hex Execute address of file ... -e C000 -t 1" << endl;
cout << " -c : hex loading address of file ... -e C000 -c 4000 -t 1" << endl;
cout << " -f : Force overwriting if file exists ... -f" << endl
<< " -m : Skip Amsdos header detection ... -m" << endl
<< " -o : insert a read-Only file ... -o" << endl
<< " -s : insert a System file ... -s" << endl
<< " -u : insert file with User number ... -u 3" << endl;
Expand Down