#include #include #include #include #include #include // Global variables #define true 1 #define false 0 #define MAX_PATH 2048 #define ERR_GENERIC 0L #define ERR_OPENIMAGE 0x01 #define ERR_SAVETRACK 0x02 #define ERR_READIMAGE 0x03 #define ERR_SAVEIMAGE 0x04 #define ERR_PATH 0x05 void error_exit(long errcode, char *string) { char errmessage[256]; if (errcode != ERR_GENERIC) printf("\n%s: %s\n", string, strerror(errno)); // string is used as Filename switch(errcode) { case ERR_OPENIMAGE: strcpy(errmessage, "File not found\n\nYou may have typed a wrong name or path to source CDI image"); break; case ERR_SAVETRACK: strcpy(errmessage, "Could not save track"); break; case ERR_READIMAGE: strcpy(errmessage, "Error reading image"); break; case ERR_PATH: strcpy(errmessage, "Could not find destination path"); break; case ERR_GENERIC: default: strcpy(errmessage, string); // string is used as Error message } printf(errmessage); exit(EXIT_FAILURE); } // Main function void convertlba(char *lptr,unsigned int lba) { int minutes=lba / (75 * 60); lptr[0] = minutes; lba -= minutes * (75 * 60); int seconds=(lba / 75); lptr[1] = seconds; lba -= seconds * (75); lptr[2] = lba; } unsigned int convertmsf(int min, int sec, int fra) { unsigned int lba = min * 60; lba += sec; lba *= 75; lba += fra; return lba; } int main( int argc, char **argv ) { char filename[MAX_PATH]; FILE *fcue,*fsource,*fdest; if (argc >= 2) { strcpy(filename, argv[1]); printf("Searching file: '%s'\n",filename); fcue = fopen(filename,"r"); if (fcue == NULL) { if (errno == ENOENT) // "No such file or directory" { strcat(filename, ".cue"); printf("Not found. Trying '%s' instead...\n",filename); fcue = fopen(filename,"r"); } } if (fcue == NULL) error_exit(ERR_OPENIMAGE, filename); errno = 0; printf("Found cue file. Opening...\n"); char buff[2048]; const char* result = NULL; while (result == NULL) { if (fgets(buff, 2047, fcue) == NULL) error_exit(ERR_OPENIMAGE, filename); result = strstr(buff, "FILE"); } result = strstr(result, "\""); if (result == NULL) error_exit(ERR_OPENIMAGE, filename); result++; const char* result2 = strstr(result, "\""); if (result2 == NULL) error_exit(ERR_OPENIMAGE, filename); strncpy(filename,result,result2-result); filename[result2-result] = '\0'; printf("Found. Trying '%s'...\n",filename); fsource = fopen(filename,"rb"); if (fsource == NULL) { if (errno == ENOENT) // "No such file or directory" { strcat(filename, ".bin"); printf("Not found. Trying '%s' instead...\n",filename); fsource = fopen(filename,"rb"); } } if (fsource == NULL) error_exit(ERR_OPENIMAGE, filename); errno = 0; printf("Found image file. Copying...\n"); strcat(filename, ".cdi"); fdest = fopen(filename,"wb"); size_t buffsize = 2048; while (buffsize == 2048) { buffsize = fread(buff, 1, 2048, fsource); for (int i=0;i> 8) & 0xFF; fwrite(val, 1, 2, fdest); // tracks for (track=1;track<=tracks;track++) { if (pregap[track] == -1) pregap[track] = startlba[track]; } for (track=1;track<=tracks;track++) { printf("Writing track %d...\n", track); if (track + 1 <= tracks) nextlba = pregap[track+1]; else nextlba = endlba; val[0]=0; val[1]=0; val[2]=0; val[3]=0; fwrite(val, 1, 4, fdest); // pretrack = 0 4-bytes for no extra data char TRACK_START_MARK[10] = { 0, 0, 0x01, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF }; fwrite(TRACK_START_MARK, 1, 10, fdest); fwrite(TRACK_START_MARK, 1, 10, fdest); val[0]=0x06; // ?? val[1]=0x02; // ?? val[2]=0x90; // ?? val[3]=0x0B; // ?? fwrite(val, 1, 4, fdest); // pre-filelength?? val[0]=38; fwrite(val, 1, 1, fdest); // filename must be <256 long char FILENAME_TXT[39] = "E:\\Directory01234567890123\\filename.cdi"; fwrite(FILENAME_TXT, 1, 38, fdest); // filename just hard coding; not used val[0]=0; val[1]=0; val[2]=0; val[3]=0; val[11]=0x02; // ?? val[22]=0x80; // indicates 8 extra bytes val[23]=0x40; // ?? val[24]=0x7E; // ?? val[25]=0x05; // ?? val[29]=0x98; // ?? val[31]=0x02; // ?? fwrite(val, 1, 33, fdest); // ?? for (i=1;i<128;i++) val[i]=0; lba = startlba[track] - pregap[track]; val[0] = lba & 0xFF; val[1] = (lba >> 8) & 0xFF; val[2] = (lba >> 16) & 0xFF; val[3] = (lba >> 24) & 0xFF; printf("PreGap 0x%x...\n", lba); fwrite(val, 1, 4, fdest); // pregap lba = nextlba - startlba[track]; val[0] = lba & 0xFF; val[1] = (lba >> 8) & 0xFF; val[2] = (lba >> 16) & 0xFF; val[3] = (lba >> 24) & 0xFF; printf("Length 0x%x...\n", lba); fwrite(val, 1, 4, fdest); // pregap for (i=0;i<4;i++) val[i]=0; fwrite(val, 1, 6, fdest); // ?? fwrite(val, 1, 4, fdest); // mode = 0 = Audio fwrite(val, 1, 12, fdest); // ?? lba = pregap[track]; val[0] = lba & 0xFF; val[1] = (lba >> 8) & 0xFF; val[2] = (lba >> 16) & 0xFF; val[3] = (lba >> 24) & 0xFF; printf("Start LBA 0x%x...\n", lba); fwrite(val, 1, 4, fdest); // start lba lba = nextlba - pregap[track]; val[0] = lba & 0xFF; val[1] = (lba >> 8) & 0xFF; val[2] = (lba >> 16) & 0xFF; val[3] = (lba >> 24) & 0xFF; printf("Total Length 0x%x...\n", lba); fwrite(val, 1, 4, fdest); // total length for (i=0;i<4;i++) val[i]=0; fwrite(val, 1, 16, fdest); // ?? val[0] = 2; fwrite(val, 1, 4, fdest); // sector size = 2 = 2352 val[0] = 0; val[5] = lba & 0xFF; val[6] = (lba >> 8) & 0xFF; val[7] = (lba >> 16) & 0xFF; val[8] = (lba >> 24) & 0xFF; for (i=30;i<38;i++) val[i]=0xFF; // indicates 78 more bytes fwrite(val, 1, 38, fdest); // ?? for (i=0;i<127;i++) val[i]=0x0; val[0] = 0x01; // ?? val[4] = 0x80; // ?? val[8] = 0x02; // ?? val[12] = 0x10; // ?? val[16] = 0x44; // ?? val[17] = 0xAC; // ?? for (i=62;i<66;i++) val[i]=0xFF; fwrite(val, 1, 78, fdest); // ?? } val[0] = 6; val[3] = 0x80; fwrite(val, 1, 4, fdest); // CDI V 3.5 lba = 2 + 2 + (tracks * (4 + 10 + 10 + 4 + 1 + 38 + 33 + 4 + 4 + 6 + 4 + 12 + 4 + 4 + 16 + 4 + 38 + 78)) + 4 + 4; val[0] = lba & 0xFF; val[1] = (lba >> 8) & 0xFF; val[2] = (lba >> 16) & 0xFF; val[3] = (lba >> 24) & 0xFF; fwrite(val, 1, 4, fdest); // Header start offset fclose(fdest); } return 0; }