makewav4.1.osx004075500017500000024000000000000753272572700125375ustar00chrisstaffmakewav4.1.osx/find.c010064400017500000024000000035610733775407400137040ustar00chrisstaff/* FFIND.C: This program uses the 32-bit _find functions to print * a list of all files (and their attributes) with a .C extension * in the current directory. */ #include #include #include #include #include #include "queue.h" #include "find.h" int myGlob( char *globString, struct qnode **fileNameQ, int *fileCount ) { struct FINDDATA_TYPE c_file; long hFile; char full_path_buffer[_MAX_DRIVE+_MAX_DIR+_MAX_FNAME+_MAX_EXT]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; if (strchr(globString,'+') != NULL) { *fileNameQ = addq(*fileNameQ, globString, fileCount); return 0; } _splitpath( globString, drive, dir, fname, ext ); #ifdef _WIN32 if( (hFile = _findfirst( globString, &c_file )) == -1L ) #else if( (hFile = findfirst( globString, &c_file, 0 )) == -1L ) #endif printf( "No files matching %s in current directory!\n", globString ); else { if (!(c_file.FFATTRIB & FA_DIREC)) sprintf(full_path_buffer,"%s%s%s",drive,dir,c_file.FFNAME); *fileNameQ = addq(*fileNameQ, full_path_buffer, fileCount); /* printf( " %-12s\n", c_file.FFNAME); */ /* Find the rest of the .c files */ #ifdef _WIN32 while( _findnext( hFile, &c_file ) == 0 ) #else while( findnext( &c_file ) == 0 ) #endif { if (!(c_file.FFATTRIB & FA_DIREC)) sprintf(full_path_buffer,"%s%s%s",drive,dir,c_file.FFNAME); *fileNameQ = addq(*fileNameQ, full_path_buffer, fileCount); /* printf( " %-12s\n", c_file.FFNAME);*/ } #ifdef _WIN32 _findclose( hFile ); #endif /* qprint(fileNameQ); */ } return 0; }makewav4.1.osx/find.h010064400017500000024000000012000733775407400136750ustar00chrisstaff#ifdef _WIN32 #define FINDDATA_TYPE _finddata_t #define FFATTRIB attrib #define FFNAME name #define FA_DIREC _A_SUBDIR #else #include #define FINDDATA_TYPE ffblk #define FFATTRIB ff_attrib #define _findfirst findfirst #define _makepath fnmerge #define _splitpath fnsplit #define FFNAME ff_name #define _MAX_DRIVE MAXDRIVE #define _MAX_PATH MAXPATH #define _MAX_DIR MAXDIR #define _MAX_FNAME MAXFILE #define _MAX_EXT MAXEXT #endif int myGlob( char *globString, struct qnode **fileNameQ, int *fileCount );makewav4.1.osx/Makefile010064400017500000024000000002010753272571100142350ustar00chrisstaff.SUFFIXES: .exe .o .c .pc all:makewav queue.o: cc -c queue.c makewav: queue.o cc -lm -DUNIX -O queue.o -o makewav makewav.c makewav4.1.osx/makewav.c010064400017500000024000001073730753272544600144230ustar00chrisstaff/* makewav.c version 4.1*/ /* Written by Bob Colbert released to the public domain The author assumes no responsibility for any damage caused by the use or posession of this program. USE AT YOUR OWN RISK!!! */ #include #include #include #include #include "queue.h" #ifndef UNIX #include "find.h" #endif #include "makewav.h" #define WAV_MODE 0 #define RAW_MODE 1 #ifndef _WIN32 #define _stricmp stricmp #endif FILE *binFile, *wavFile; unsigned char buffer[260], fileBuffer[0x10000], pageList[24], emptyPage[256]; float flength, wavFlength; void putZeroBit() { fwrite(zeroBit,zeroBitLength,1,wavFile); flength = flength + zeroBitLength; } void putOneBit() { fwrite(oneBit,oneBitLength,1,wavFile); flength = flength + oneBitLength; } void putByte(unsigned char currByte) { fputc(currByte,wavFile); flength = flength + 1; } void processByte(unsigned char pByte, int mode) { int p; if (mode == WAV_MODE) for(p=0;p<8;p++) { if (pByte > 127) putOneBit(); else putZeroBit(); pByte = pByte<<1; } else putByte(pByte); } void getPage(unsigned int page, int display) { if (display) printf("%0.2x\b\b",page); fseek(binFile,(long) page * 256,SEEK_SET); fread(buffer,256,1,binFile); } unsigned char setVolume(unsigned int amplitude, int volume) { unsigned int tempval; if (amplitude > 128) tempval = (unsigned int)floor(((amplitude - 128) * volume)/10 + 128); else tempval = (unsigned int)floor(128 - ((128 - amplitude) * volume/10)); return tempval; } void make16BitStereo(char *sineWave, int *sineWaveLength) { char oldSineWave[256]; int i; for (i=0; i<*sineWaveLength; i++) oldSineWave[i] = sineWave[i]; for (i=0; i<*sineWaveLength; i++) { sineWave[i*4] = 0; sineWave[i*4+1] = (oldSineWave[i]+0x80); sineWave[i*4+2] = 0; sineWave[i*4+3] = (oldSineWave[i]+0x80); } (*sineWaveLength) *= 4; } void setBankSwitchMode(char *pBankSwitch, int *bankSwitchMode) { int i; for (i=0; bankSwitchList[i][0] != '\0'; i++) if (!_stricmp(pBankSwitch,bankSwitchList[i])) { *bankSwitchMode = i; break; } if (controlByteList[i] == 0) { printf("Illegal bankswitch type!\n"); exit(1); } } void createSineWave(unsigned char *bit, int bitLength, double volume, int wavType) { int i; int isOdd; int halfBitLength; if (volume < 0.10) volume = 0.98; else volume /= 10; if (wavType == SQUARE_WAVE) { halfBitLength = (int)(floor((float)bitLength)/2.0); isOdd = (int)(ceil((float)bitLength/2.0) - halfBitLength); for (i=0;icontrol = 0; parms->sflag = 0; parms->kflag = 1; parms->wflag = SQUARE_WAVE; parms->stereoFlag = 0; parms->fflag = 1; parms->zeroBitLength = 0; parms->oneBitLength = 0; parms->dflag = DISPLAY_FILENAME; parms->mflag = 0; parms->pflag = 0; parms->vflag = 0; parms->volume = 0; parms->tflag = 'c'; parms->multi = 0; parms->headerSeconds = (float)1.0; parms->clearingSeconds = (float)0.1; parms->hlength = 0; parms->bankSwitchMode = -1; parms->createMode = WAV_MODE; strcpy(parms->fullPath,""); strcpy(parms->wavFileName,""); while (--argc > 0 && (*++argv)[0] == '-') { char flag, cflag; cflag = 0; flag = *++argv[0]; switch (flag) { case 'd': if (sscanf(*argv,"d%1d",&parms->dflag) == EOF) { printf("Illegal detail level!\n"); exit(1); } break; case 'p': parms->pflag = 1; break; case 'f': if (sscanf(*argv,"f%1d",&parms->fflag) == EOF) { printf("Illegal .wav speed!\n"); exit(1); } if (parms->fflag > 4) parms->fflag = 4; break; case 'b': if (!cflag) { setBankSwitchMode(*argv+1, &parms->bankSwitchMode); break; } case 'c': cflag = 1; if (strlen(*argv) != 3) { printf("Illegal control byte value!\n"); exit(1); } if (sscanf(*argv,"c%2x",&parms->control) == EOF) { printf("Illegal control byte value!\n"); exit(1); } printf("Control byte set to %0.2x\n",parms->control); break; case 'h': if (sscanf(*argv,"h%f",&parms->headerSeconds) == EOF) { printf("Illegal header length!\n"); exit(1); } if (parms->headerSeconds > 10 || parms->headerSeconds <=0) { printf("Bad header length!\n"); exit(1); } break; case '0': if (sscanf(*argv,"0%d",&parms->zeroBitLength) == EOF) { printf("Zero-bit length must be provided for 0 flag!\n"); exit(1); } if (parms->zeroBitLength > 80 || parms->zeroBitLength <1) { printf("Bad zero-bit length!\n"); exit(1); } break; case '1': if (sscanf(*argv,"1%d",&parms->oneBitLength) == EOF) { printf("One-bit length must be provided for 0 flag!\n"); exit(1); } if (parms->oneBitLength > 80 || parms->oneBitLength <1) { printf("Bad one-bit length!\n"); exit(1); } break; case 'i': if (sscanf(*argv,"i%f",&parms->clearingSeconds) == EOF) { printf("Illegal clearing tone length!\n"); exit(1); } if (parms->clearingSeconds > 10 || parms->clearingSeconds <=0.1) { printf("Bad clearing tone length!\n"); exit(1); } break; case 's': if (strlen(*argv) !=5) { printf("Illegal start address!\n"); exit(1); } if (sscanf(*argv,"s%2x%2x",&parms->startHi,&parms->startLo) == EOF) { printf("Illegal start address!\n"); exit(1); } parms->sflag = 1; break; case 't': { int noValue = 0; if (sscanf(*argv,"t%c",&parms->tflag) == EOF) noValue = 1; if (noValue || (parms->tflag != 's' && parms->tflag != 'c')) { printf("Type flag 't' must be 's' for Supercharger or 'c' for Cuttle Cart\n"); exit(1); } } break; case 'w': if (sscanf(*argv,"w%1d",&parms->wflag) == EOF) { printf("Illegal wave form type\n"); exit(1); } if (parms->wflag > 1) { printf("Illegal wave form type\n"); exit(1); } break; case 'k': parms->kflag = 0; if (sscanf(*argv,"k%1d",&parms->kflag) == EOF) { printf("Illegal .wav format!\n"); exit(1); } if (parms->kflag < 0) { printf("Illegal .wav format!\n"); exit(1); } if (parms->kflag >= 2) { parms->kflag = 1; parms->stereoFlag = 1; } break; case 'o': if (sscanf(*argv,"o%s", &parms->wavFileName) == EOF) { printf("Output filename required for o flag\n"); exit(1); } break; case 'm': if (strlen(*argv) != 3) { printf("Illegal multi-byte value!\n"); exit(1); } if (sscanf(*argv,"m%2x",&parms->multi) == EOF) { printf("Illegal multi-byte value!\n"); exit(1); } printf("Multi-load byte is $%0.2x\n",parms->multi); parms->mflag = 1; break; case 'r': parms->createMode = RAW_MODE; break; case 'v': if ((strlen(*argv) == 1) || (strlen(*argv)>3)) { printf("Illegal volume value, must be 1-10\n"); exit(1); } parms->vflag = 1; if (sscanf(*argv,"v%2i",&parms->volume) == EOF) { printf("Illegal volume value, must be 1-10\n"); exit(1); } if ((((int)parms->volume < 1)) || ((int)parms->volume > 10)) { printf("Illegal volume value, must be 1-10\n"); exit(1); } break; default : printf("Unknown flag %c\n",flag); exit(1); break; } } parms->binFileCount = 0; parms->binFileQ = NULL; while (argc) { char tempFileName[256], extension[256], *tempPtr; strcpy(tempFileName, argv[0]); strtok(argv[0],"."); tempPtr = strtok(NULL,"\0"); if (tempPtr != 0) strcpy(extension,tempPtr); #ifdef UNIX parms->binFileQ = addq(parms->binFileQ, tempFileName, &parms->binFileCount); #else myGlob(tempFileName, &parms->binFileQ, &parms->binFileCount); #endif (*++argv); argc--; } #ifndef UNIX if (parms->binFileCount > 1 && strcmp(parms->wavFileName,"")) { _makepath(parms->fullPath, "", parms->wavFileName, "", "" ); } #endif if (!parms->binFileCount) { printf("\nMakewav 4.1 - August 18, 2001\n"); printf(" Written By: Bob Colbert (rcolbert1@home.com)\n"); printf(" Usage: makewav [flags] singleLd.bin [multiLd1[+multiLd2...+multiLdn]] \n"); printf(" Flags:\n"); printf(" -b Set bankswitch mode:\n"); printf(" 2K,CV,4K,F8SC,F8,FE,3F,E0,FANR,FA,F6SC,F6,E7,E7NR,F4SC,F4,MB\n"); printf(" -cxx Set control byte (2 digit hex, overrides control byte\n"); printf(" determined by -b)\n"); printf(" -d# Diagnostics detail level (0 - 3)\n"); printf(" -f# Speed of load (0 - 4, Default=1)\n"); printf(" -h# Set header tone length in seconds (default = 1.0)\n"); printf(" -i# Set clearing tone length in seconds (default = 0.1)\n"); printf(" -k Frequency: 0=22khz, 1(Default)=44khz, 2=16-bit stereo 44khz\n"); printf(" -mxx Set multiload byte (2 digit hex)\n"); printf(" -o Output File (Default = or )\n"); printf(" -p Force \"blank pages\" to be transferred\n"); printf(" -r Create raw data file instead of a .wav file\n"); printf(" -sxxxx Set start address (4 digit hex)\n"); printf(" -t c=Cuttle Cart (Default) or s=Supercharger\n"); printf(" -v# Set volume level of .wav file (0.10-10 Default=0.98)\n"); printf(" -w# Wave form type: 0 (Default) for square or 1 for sine\n"); printf(" -0# Length of zero bit sine wave in bytes (overrides -f)\n"); printf(" -1# Length of one bit sine wave in bytes (overrides -f)\n"); exit(0); } return 0; } /* ** used for generating the CRC lookup table */ dd crcrevhware(dd data, dd genpoly, dd accum) { int i; data <<= 1; for (i=8;i>0;i--) { data >>= 1; if ((data ^ accum) & 1) accum = (accum >> 1) ^ genpoly; else accum >>= 1; } return(accum); } /* ** init the CRC lookup table */ void init_crc(void) { int i; for (i=0;i<256;i++) crctab[i] = crcrevhware(i,CRC32_REV,0); } /* ** update CRC */ void ucrc(unsigned char data) { crc = (crc >> 8) ^ crctab[(crc ^ data) & 0xff]; } db Lookup(dd *table) { // dd t; int i = 0; while(table[i] != -1) { if (table[i] == crc) return i; i++; } return -1; /* while(1) { t = *table++; if (t == -1) return(0); if (t == crc) { if (table == BS_3) printf("- %s",BS_3_DESC[i]); return(1); } i++; } */ } void clearMeter(meterMax) { int i; printf("%*s",meterMax+2," "); for (i=0; i 4) { char answer; fprintf(stderr,"Warning! %d .wav files will be created, Continue? (Y/N)", parms.binFileCount); scanf("%c",&answer); if (answer != 'y' && answer != 'Y') exit(1); } if (parms.dflag >= DISPLAY_FILENAME) { printf("Converting %d file%s for use with the %s:\n", parms.binFileCount, (parms.binFileCount > 1)?"s":"", (parms.tflag == 's')?"Supercharger":"Cuttle Cart"); printf(" Using %s %skhz .wav format",(parms.stereoFlag)?"16-bit stereo":"8-bit mono",(parms.kflag == 0)?"22":"44"); printf(" with a %0.2f second header tone\n",parms.headerSeconds); printf(" (zero bit/one bit) lengths = (%d/%d)", zeroBitLength/((parms.stereoFlag)?4:1), oneBitLength/((parms.stereoFlag)?4:1)); printf(" implemented with %s wave forms\n",(parms.wflag == 0)?"square":"sine"); } while (parms.binFileQ != NULL) { int bankSwitchMode; char *sourceFileName; char parmEntry[256]; char baseFileName[256]; int multiLoad; if (parms.dflag >= DISPLAY_FILENAME) printf("%s -> ",parms.binFileQ->fileName); filecount = 0; flength = 0; wavFlength = 0; strcpy(parmEntry, parms.binFileQ->fileName); strcpy(baseFileName, strtok(parms.binFileQ->fileName,".+")); if (!strcmp(parms.wavFileName,"")) sprintf(parms.wavFileName, "%s.wav", baseFileName); sourceFileName = strtok(parmEntry,"+"); wavFile = 0; multiLoad = 0; while (sourceFileName != NULL) { page = 0; if ((binFile = fopen(sourceFileName,"rb")) == NULL) { printf("ERROR: unable to open .bin file %s\n",sourceFileName); exit(1); } fseek(binFile,0,SEEK_END); fsize = ftell(binFile); fseek(binFile,0,SEEK_SET); fread(fileBuffer,fsize,1,binFile); if (parms.tflag == 's' && fsize != 8448 && fsize != 6144 && fsize != 2048 && fsize != 4096 && fsize != 32767) { printf("Invalid file size for Supercharger, skipping\n"); break; } if (!wavFile) { #ifndef UNIX if (parms.binFileCount > 1) { char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; _splitpath(baseFileName, drive, dir, fname, ext ); sprintf(full_path_buffer,"%s%s.wav",parms.fullPath,fname); } else #endif strcpy(full_path_buffer, parms.wavFileName); if ((wavFile = fopen(full_path_buffer,"wb")) == NULL) { printf("ERROR: unable to create wavFile %s\n",full_path_buffer); exit(1); } if (parms.dflag >= DISPLAY_FILENAME) printf("%s",full_path_buffer); } /* Write .wav header */ if (parms.createMode == WAV_MODE && !multiLoad) for(k=0;k<44;k++) fputc(header[parms.kflag + parms.stereoFlag][k],wavFile); multiByte = 0; init_bank = 0; /* For original supercharger only */ if (parms.tflag == 's') if (fsize == 2048) init_bank = 2; else if (fsize == 4096) init_bank = 1; scflag = 0; /* Check for 32k Supercharger games */ if (fsize == 0x7FFF) scflag = 1; if (fsize == 6144 || fsize == 8448 || scflag) { /* This is the control byte, it determines the bankswitching mode of the SC Bits Function ------ -------- D7-D5 Write Pulse Delay (Set to 0) D4-D2 RAM/ROM Configuration Value $f000 $f800 ----- ----- ----- 000 3 ROM 001 1 ROM 010 3 1 011 1 3 100 3 ROM 101 2 ROM 110 3 2 111 2 3 */ if (!parms.control) controlByte = 0x0d; speedLow = 0x42; speedHi = 0x02; file_page_count = 24; if (fsize >= 8448) { getPage(32,0); if (!parms.sflag) { parms.startLo=buffer[0]; parms.startHi=buffer[1]; } // parms.sflag = 1; if (!parms.control) controlByte = buffer[2]; file_page_count = buffer[3]; scflag = 1; for (i=0;i<0x18;i++) pageList[i] = buffer[0x10+i]; multiByte = buffer[5]; } } else { int i; /* Find file size in list */ for (i=0; fileSizeList[i] != 0; i++) { if (fsize == fileSizeList[i]) { /* if the bank-switch mode wasn't set in the parms, use default */ if (parms.bankSwitchMode < 0) bankSwitchMode = i; else if (fileSizeList[parms.bankSwitchMode] != fsize) { fprintf(stderr,"Bankswitch scheme %s is not legal for a %dK ROM\n", bankSwitchList[parms.bankSwitchMode], (int)(fsize/1024)); exit(1); } else /* bank-switch mode was set in the parms */ bankSwitchMode = parms.bankSwitchMode; break; } } if (fileSizeList[i] == 0) { fprintf(stderr, "ERROR! Source .bin file must be 2048, 4096, 6144, 8192, 8448, 12228, 16384, 32768, or 65536 bytes\n"); exit(1); } file_page_count = fileSizeList[bankSwitchMode] / 256; } gamePageCount = 0; for(i=0;i= 0) { bankSwitchMode = BSM_CV; /* CommaVid */ if (parms.dflag >= DISPLAY_FILENAME) printf("- %s",BS_1_DESC[i]); } break; case 0x2000: for (i=0; i<2; i++) for (j=0; j<256; j++) if (fileBuffer[0] != fileBuffer[i * 0x1000 + j]) bankSwitchMode = BSM_F8; if ((i=Lookup(BS_3)) >= 0) { bankSwitchMode = BSM_E0; /* Parker Brothers */ if (parms.dflag >= DISPLAY_FILENAME) printf("- %s",BS_3_DESC[i]); } if ((i=Lookup(BS_4)) >= 0) { bankSwitchMode = BSM_3F; /* Tigervision */ if (parms.dflag >= DISPLAY_FILENAME) printf("- %s",BS_4_DESC[i]); } if ((i=Lookup(BS_5)) >= 0) { bankSwitchMode = BSM_FE; /* Activision 8K flat model */ if (parms.dflag >= DISPLAY_FILENAME) printf("- %s",BS_5_DESC[i]); } break; case 0x4000: for (i=0; i<4; i++) for (j=0; j<256; j++) if (fileBuffer[0] != fileBuffer[i * 0x1000 + j]) bankSwitchMode = BSM_F6 ; if ((i=Lookup(BS_6)) >= 0) { bankSwitchMode = BSM_F6SC; /* 16K Superchip that can't be recognized automatically */ if (parms.dflag >= DISPLAY_FILENAME) printf("- %s",BS_6_DESC[i]); } if ((i=Lookup(BS_7)) >= 0) { bankSwitchMode = BSM_E7; /* M Network 16K */ if (parms.dflag >= DISPLAY_FILENAME) printf("- %s",BS_7_DESC[i]); } break; case 0x8000: for (i=0; i<8; i++) for (j=0; j<256; j++) if (fileBuffer[0] != fileBuffer[i * 0x1000 + j]) bankSwitchMode = BSM_F4; break; case 0x10000: if (bankSwitchMode == BSM_MB) { parms.pflag = 1; printf("Forcing blank pages to be transferred for\n"); printf("bankswitch mode MB\n"); } break; } } if (parms.pflag) gamePageCount = file_page_count; if (parms.control) controlByte = parms.control; else if (parms.tflag == 's') { if (!scflag) controlByte = 0x1d; if (fsize == 2048) { getPage(startPageList[bankSwitchMode],0); if (buffer[0xfd] < 0xf8) controlByte = 0x09; } } else if (!scflag) controlByte = controlByteList[bankSwitchMode]; /* The first two bytes of data indicate the beginning address of the code */ if ((!parms.sflag) && !scflag) { getPage(startPageList[bankSwitchMode],0); parms.startLo = buffer[0xfc]; parms.startHi = buffer[0xfd]; } processByte(parms.startLo,parms.createMode); processByte(parms.startHi,parms.createMode); processByte(controlByte,parms.createMode); /* Number of pages to load */ processByte((unsigned char)(gamePageCount),parms.createMode); /* Game header checksum -- first 8 bytes must add up to 0x55 */ if (parms.mflag) multiByte = parms.multi; processByte((unsigned char) (0x55 - parms.startLo - parms.startHi - multiByte - controlByte - gamePageCount - speedLow - speedHi),parms.createMode); processByte(multiByte,parms.createMode); processByte(speedLow,parms.createMode); processByte(speedHi,parms.createMode); if (parms.dflag >= DISPLAY_FILENAME) printf("\n"); if (parms.dflag >= DISPLAY_SUMMARY) { printf(" Bankswitch type = "); if (scflag) printf("Supercharger\n"); else printf("%s\n",bankSwitchList[bankSwitchMode]); printf(" File size = %-5.0d",fsize); printf(" Start address = $%0.2x%0.2x\n",parms.startHi,parms.startLo); printf(" Multi-Load byte = $%2.2x Page count = $%2.2x\n",(unsigned char) multiByte,(unsigned char) gamePageCount); printf(" Control-byte = $%2.2x Blank pages = $%2.2x\n",(unsigned char) controlByte,(unsigned char) (file_page_count - gamePageCount)); } while ((int)page < file_page_count) { int j; /* Get appropriate page */ if (!emptyPage[page] || parms.pflag) { getPage(page,0); if (parms.dflag >= DISPLAY_FILENAME && parms.dflag < DISPLAY_DETAILS) drawMeter(page, gamePageCount, METER_LENGTH); } /* If we just got the page, put the page header which consists of two bytes. The first byte */ /* is a counter that begins at zero for the first page and is incremented by 4 for each */ /* subsequent page. If the value is greater than 0x1f, then 0x1f is subtracted from it. */ if (scflag) pg_bank_byte = pageList[page]; else pg_bank_byte = (page % 8) * 4 + init_bank + (int)floor((page-(int)floor(page/32)*32)/8) + (int)floor(page/32) * 32; sum = 0; /* Get the sum of all 256 bytes of the current page */ for(j=0;j<256;j++) sum += (char) buffer[j]; /* The second byte of the page header is 0x55 - the first byte - the sum of the 256 bytes of */ /* program data. */ in_byte = (char) (0x55 - pg_bank_byte - sum); /* Put the program data */ if (!emptyPage[page] || parms.pflag) { if (parms.dflag >= DISPLAY_DETAILS) printf(" - bank %2.2d, page %2.2d, page&bank byte %2.2x, checksum %2.2x\n",(int)(pg_bank_byte&0x3) + (int)(pg_bank_byte&0xE0)/8, (int)((pg_bank_byte & 0x1c)/4),(unsigned char)pg_bank_byte, (unsigned char)in_byte); processByte(pg_bank_byte,parms.createMode); processByte(in_byte,parms.createMode); for(j=0;j<256;j++) processByte(buffer[j],parms.createMode); } /* Done with this page, increment page counter */ page++; /* printf("\nPage is = %d",page); */ } /* We are done, put a tone at the end of the game, unnecessary, but a nice touch */ fclose(binFile); filecount++; sourceFileName = strtok(NULL,"+"); if (sourceFileName != NULL) { for(k=1;k 16777216) { length_lword[3] = (int)floor(flength / 16777216); flength -= length_lword[3] * 16777216; } if (flength > 65535) { length_lword[2] = (int)floor(flength / 65536); flength -= length_lword[2] * 65536; } if (flength > 255) { length_lword[1] = (int)floor(flength / 256); flength -= length_lword[1] * 256; } length_lword[0] = (unsigned int)flength; for(i=0;i<4;i++) fputc(length_lword[i],wavFile); /* The file length for the RIFF chunk of the .wav file is in wavFlength */ /* Write the file length in hi-byte/lo-byte, hi-word/lo-word format to the .wav file */ fseek(wavFile,0x04,SEEK_SET); length_lword[3] = 0; if (wavFlength > 65535) { length_lword[2] = (unsigned int)floor(wavFlength / 65536); wavFlength -= length_lword[2] * 65536; } if (wavFlength > 256) { length_lword[1] = (unsigned int)floor(wavFlength / 256); wavFlength -= length_lword[1] * 256; } length_lword[0] = (unsigned int)wavFlength; for(i=0;i<4;i++) fputc(length_lword[i],wavFile); } if (wavFile) fclose(wavFile); strcpy(parms.wavFileName,""); currentBinFile++; parms.binFileQ = delq(parms.binFileQ); if (parms.dflag >= DISPLAY_FILENAME && parms.dflag < DISPLAY_DETAILS) clearMeter(METER_LENGTH); } return 0; } makewav4.1.osx/makewav.h010064400017500000024000000217050753272546300144210ustar00chrisstaff#define BSM_2K 0 #define BSM_CV 1 #define BSM_4K 2 #define BSM_F8SC 3 #define BSM_F8 4 #define BSM_FE 5 #define BSM_3F 6 #define BSM_E0 7 #define BSM_FANR 8 #define BSM_FA 9 #define BSM_F6SC 10 #define BSM_F6 11 #define BSM_E7 12 #define BSM_E7NR 13 #define BSM_F4SC 14 #define BSM_F4 15 #define BSM_MB 16 #define FMT_22KHZ_8BIT_MONO 0 #define FMT_44KHZ_8BIT_MONO 1 #define FMT_44KHZ_16BIT_STEREO 2 #define METER_LENGTH 32 #define DISPLAY_NOTHING 0 #define DISPLAY_FILENAME 1 #define DISPLAY_SUMMARY 2 #define DISPLAY_DETAILS 3 #ifdef UNIX #define _MAX_FNAME 256 #define _MAX_PATH 256 #define _MAX_DIR 256 #define _MAX_DRIVE 256 #define _MAX_EXT 256 #else #include "find.h" #endif typedef unsigned long int dd; typedef unsigned short int dw; typedef int db; struct parmFlags { int dflag; int fflag; int kflag; int wflag; int stereoFlag; int mflag; int pflag; int sflag; int vflag; char tflag; int zeroBitLength; int oneBitLength; int control; int createMode; int binFileCount; int bankSwitchMode; float headerSeconds; float clearingSeconds; float hlength; char wavFileName[_MAX_FNAME]; char fullPath[_MAX_PATH]; struct qnode *binFileQ; unsigned int multi; unsigned int volume; unsigned char startHi; unsigned char startLo; }; char bankSwitchList[][5] = {"2K", "CV", "4K", "F8SC", "F8", "FE", "3F", "E0", "FANR", "FA", "F6SC", "F6", "E7", "E7NR", "F4SC", "F4", "MB", ""}; unsigned int controlByteList[] = {0xCa, 0xEa, 0xC8, 0xE6, 0xC6, 0xCC, 0xCE, 0xC1, 0xC0, 0xE0, 0xE4, 0xC4, 0xE3, 0xC3, 0xE2, 0xC2, 0xC9, 0x00}; int fileSizeList[] = {2048, 2048, 4096, 8192, 8192, 8192, 8192, 8192, 8192, 12288, 16384, 16384, 16384, 16384, 32768, 32768, 65536, 0}; int startPageList[] = {7, 7, 15, 15, 15, 15, 31, 31, 15, 15, 15, 15, 63, 63, 15, 15, 15, 0}; int clearingToneLength[2] = {26, 51}; unsigned char clearingTone[256]; int zeroBitLength, oneBitLength; unsigned char zeroBit[256], oneBit[256]; /* speed, khz, bit */ int bitLength[5][2][2] = { {{5,9},{15,21}}, {{3,7},{ 6,10}}, {{3,5},{ 5, 8}}, {{3,5},{ 4, 8}}, {{3,5},{ 4, 7}} }; unsigned char header[3][80]= { {'R','I','F','F',0x80,0x80,0x80,0x80, /* RIFF TAG */ 'W','A','V','E', /* WAV TAG */ 'f','m','t',' ',0x10,0,0,0, /* FMT TAG */ 1,0, /* format (WAVE_FORMAT_PCM) */ 1,0, /* CHANNELS */ 0x22,0x56,0,0, /* SamplesPerSec */ 0x22,0x56,0,0, /* BytesPerSec */ 1,0, /* Block align */ 8,0, /* Bits per sample */ 'd','a','t','a',0,0,0,0,'\0'/* DATA TAG */ }, {'R','I','F','F',0x80,0x80,0x80,0x80, /* RIFF TAG */ 'W','A','V','E', /* WAV TAG */ 'f','m','t',' ',0x10,0,0,0, /* FMT TAG */ 1,0, /* format (WAVE_FORMAT_PCM) */ 1,0, /* CHANNELS */ 0x44,0xac,0,0, /* SamplesPerSec */ 0x44,0xac,0,0, /* BytesPerSec */ 1,0, /* Block align */ 8,0, /* Bits per sample */ 'd','a','t','a',0,0,0,0,'\0'/* DATA TAG */ }, {'R','I','F','F',0x80,0x80,0x80,0x80, /* RIFF TAG */ 'W','A','V','E', /* WAV TAG */ 'f','m','t',' ',0x10,0,0,0, /* FMT TAG */ 1,0, /* format (WAVE_FORMAT_PCM) */ 2,0, /* CHANNELS */ 0x44,0xac,0,0, /* SamplesPerSec */ 0x10,0xb1,2,0, /* BytesPerSec */ 4,0, /* Block align */ 0x10,0, /* Bits per sample */ 'd','a','t','a',0,0,0,0,'\0'/* DATA TAG */ } }; dd BS_1[] = { 0x34ae2945, /* Magicard (CommaVid).bin */ /* 0x30eb4f7a, Video Life (4K).BIN */ /* 0x9afa761f, Magicard (Life).bin */ 0x266bd1b6, /* Video Life (CommaVid).bin */ -1 }; char BS_1_DESC[][25] = { "Magicard (CommaVid)", "Video Life (CommaVid)", -1 }; dd BS_3[] = { 0x2843d776, /* Frogger II - Threedeep!.bin */ 0x690ada72, /* Gyruss [b].bin */ 0x525ee7e9, /* Gyruss.bin */ 0x95da4070, /* James Bond 007 [b].bin */ 0x3216c1bb, /* James Bond 007.bin */ 0xae4114d8, /* Montezuma's Revenge.bin */ 0x00e44527, /* Mr. Do!'s Castle.bin */ 0xf723b8a6, /* Popeye.bin */ 0xe44c244e, /* Q-bert's Qubes [a].bin */ 0xb8f2dca6, /* Q-bert's Qubes.bin */ 0xe77f6742, /* Star Wars - Death Star Battle (Parker Bros).bin */ 0xce09fcd4, /* Star Wars - The Arcade Game (Parker Bros).bin */ 0xdd85f0e7, /* Super Cobra [b].bin */ 0x8d372730, /* Super Cobra.bin */ 0xd9088807, /* Tooth Protectors (DSD-Camelot).bin */ 0x7eed7362, /* Tutankham.bin */ 0xc87fc312, /* Popeye_(eks).bin */ 0xef3ec01e, /* Super Cobra_(eks).bin */ 0x84a101d4, /* Star Wars - Death Star Battle_(eks).bin */ 0x2fc06cb0, /* Tutankham_(eks).bin */ 0xab50bf11, /* Star Wars - The Arcade Game (proto).BIN */ 0x549a1b6b, /* Star Wars - The Arcade Game (PAL) */ 0x36910e4d, /* Frogger II - Threedeep! (PAL) */ 0xb8bb2361, /* Gyruss (PAL) */ -1 }; char BS_3_DESC[][50] = { "Frogger II - Threedeep!", "Gyruss [b]", "Gyruss", "James Bond 007 [b]", "James Bond 007", "Montezuma's Revenge", "Mr. Do!'s Castle", "Popeye", "Q-bert's Qubes [a]", "Q-bert's Qubes", "Star Wars - Death Star Battle (Parker Bros)", "Star Wars - The Arcade Game (Parker Bros)", "Super Cobra [b]", "Super Cobra", "Tooth Protectors (DSD-Camelot)", "Tutankham", "Popeye_(eks)", "Super Cobra_(eks)", "Star Wars - Death Star Battle_(eks)", "Tutankham_(eks)", "Star Wars - The Arcade Game (proto)", "Star Wars - The Arcade Game (PAL)", "Frogger II - Threedeep! (PAL)", "Gyruss (PAL)", "" }; dd BS_4[] = { 0x584f6777, /* Espial [b].bin */ 0x8d70fa42, /* Espial.bin */ 0x8beb03d4, /* Miner 2049er [b1].bin */ 0x33f2856f, /* Miner 2049er [b2].bin */ 0xf859122e, /* Miner 2049er Vol. 2 [b1].bin */ 0x281a1ca1, /* Miner 2049er Vol. 2 [b2].bin */ 0x350c63ba, /* Miner 2049er Vol. 2.bin */ 0x728b941c, /* Miner 2049er.bin */ 0x13bf2da3, /* Polaris [b].bin */ 0x7ce5312e, /* Polaris.bin */ 0x40706361, /* River Patrol (Tigervision).bin */ 0x2c34898f, /* Springer.bin */ -1 }; char BS_4_DESC[][30] = { "Espial [b]", "Espial", "Miner 2049er [b1]", "Miner 2049er [b2]", "Miner 2049er Vol. 2 [b1]", "Miner 2049er Vol. 2 [b2]", "Miner 2049er Vol. 2", "Miner 2049er", "Polaris [b]", "Polaris", "River Patrol (Tigervision)", "Springer", -1 }; dd BS_5[] = { 0x7d23e780, /* Decathlon.bin */ 0xa51c0236, /* Robot Tank.bin */ 0xd8ecf576, /* Decathlon (PAL) */ 0x0e8757b0, /* Robot Tank (PAL) */ 0x94e8df6b, /* Space Shuttle (PAL) */ -1 }; char BS_5_DESC[][25] = { "Decathlon", "Robot Tank", "Decathlon (PAL)", "Robot Tank (PAL)", "Space Shuttle (PAL)", -1 }; /* dd BS_9[] = { 0x6a31beac, Private Eye (CCE).bin 0x3fa749c0, Private Eye [b].bin 0x33242242, Private Eye.bin -1 }; */ dd BS_6[] = { 0xa972c32b, /* Dig Dug.bin */ 0x66cdb94b, /* Off the Wall [o].bin */ 0xbd75d92b, /* Off the Wall.bin */ -1 }; char BS_6_DESC[][20] = { "Dig Dug.bin", "Off the Wall [o]", "Off the Wall", -1 }; dd BS_7[] = { 0x8eed6b02, /* Bump n Jump [b].bin */ 0xd523e776, /* Bump n Jump.bin */ 0x24c35820, /* Burgertime.bin */ 0x5c161fe4, /* Masters of the Universe - The Power of He-Man.bin */ -1 }; char BS_7_DESC[][50] = { "Bump n Jump [b].bin", "Bump n Jump.bin", "Burgertime.bin", "Masters of the Universe - The Power of He-Man", -1 }; /* dd BS_8[] = { 0xbe1047cf, Fatal Run (PAL).bin -1 }; */ dd crc; /* holds accumulated CRC */ dd crctab[256]; /* table to help CRC calculation */ #define CRC16_REV 0xA001 /* CRC-16 polynomial reversed */ #define CRC32_REV 0xA0000001 /* CRC-32 polynomial reversed */ #define SQUARE_WAVE 0 #define SINE_WAVE 1 void make16BitStereo(char *sineWave, int *sineWaveLength); makewav4.1.osx/queue.c010064400017500000024000000037230752576363300141100ustar00chrisstaff/* queue.c */ #include #include #include #include #include "queue.h" /* allocates enough memory to store 1 q node */ struct qnode *qalloc(void) { return (struct qnode *) malloc(sizeof(struct qnode)); } /* returns pointer to duplicate of s */ struct qnode *qdup(struct qnode *s, int *fileCount) { struct qnode *temp, *p; p = NULL; temp = s; while (temp != NULL) { p = addq(p,temp->fileName, fileCount); temp = temp->next; } return p; } /* adds q node to tail of p - use form 'p = addq(p,w,t)' */ struct qnode *addq(struct qnode *p, char *fileName, int *fileCount) { if (p == NULL) { p = qalloc(); strcpy(p->fileName, fileName); p->next = NULL; (*fileCount)++; } else if (strcmp(p->fileName, fileName)) p->next = addq(p->next, fileName, fileCount); return p; } /* remove node from head of p - use form 'p = delq(p)' */ /* frees memory previously used by node deleted */ struct qnode *delq(struct qnode *p) { struct qnode *t; t = p; if (p != NULL) { t = p->next; free(p); } return t; } /* deletes all nodes from queue pointed to by p */ void clearq(struct qnode *p) { while (p != NULL) p = delq(p); } /* prints all bursts in a q - used for debugging */ void qprint(struct qnode *p) { if (p != NULL) { printf("FileName: %s\n",p->fileName); qprint(p->next); } } /* main() { struct qnode *addresses; addresses = NULL; addresses = addq(addresses,0xfeac); addresses = addq(addresses,0xfbba); qprint(addresses); printf("--\n"); printf("%0.4X\n",addresses->address); addresses = delq(addresses); printf("%0.4x\n",addresses->address); } */ makewav4.1.osx/queue.h010064400017500000024000000003450752576362200141100ustar00chrisstaff/* structure to hold list of fileNames */ struct qnode { char fileName[256]; struct qnode *next; }; struct qnode *addq(struct qnode *, char *, int *); struct qnode *delq(struct qnode *); void qprint(struct qnode *);