#include unsigned char sram[0x8000]; unsigned char sram_new[0x8000]; void generate_new_sav(); int read_file(char * filename); void write_file(char * filename); #define offset(BANK,ADRESS) \ ((BANK*0x2000)+(ADRESS&0x1fff)) main(int argc, char *argv[]) { char filename[200]; if(argc!=2) { printf("use this program to patch LSDj .sav files to v2.4.4\n\n"); printf("usage: patchsav244 savfile\n"); return 0; } read_file(argv[1]); generate_new_sav(); strcpy(filename, argv[1]); strcat(filename, ".new"); write_file(filename); return 1; } void write_file(char * filename) { FILE *out; out=fopen(filename, "wb"); fwrite(sram_new,0x8000,1,out); if(ferror(out)) { printf("file error %d",ferror(out)); exit(1); } fclose(out); printf("wrote file '%s' successfully",filename); } void generate_new_sav() { int src,dst; //copy old sram for(dst=offset(0,0); dst!=offset(4,0); dst++) { sram_new[dst]=sram[dst]; } //----- clear new areas ----- //instr->names for(dst=offset(0,0xbe7a); dst!=offset(0,0xbfba); dst++) { sram_new[dst]=0; } //instr->alloc for(dst=offset(1,0xa040); dst!=offset(1,0xa080); dst++) { sram_new[dst]=0; } //instr->param for(dst=offset(1,0xb080); dst!=offset(1,0xb480); dst++) { sram_new[dst]=0; } //init new instr params #define INSTR_OFFSET offset(1,0xb080) //envelope=0xa8 for(dst=INSTR_OFFSET+0x201;dst!=INSTR_OFFSET+0x401;dst+=0x10) { sram_new[dst]=0xa8; } //sweep=0xff for(dst=INSTR_OFFSET+0x204;dst!=INSTR_OFFSET+0x404;dst+=0x10) { sram_new[dst]=0xff; } //pan on for(dst=INSTR_OFFSET+0x207;dst!=INSTR_OFFSET+0x407;dst+=0x10) { sram_new[dst]=3; } //dist=clip for(dst=INSTR_OFFSET+0x20a;dst!=INSTR_OFFSET+0x40a;dst+=0x10) { sram_new[dst]=0xd0; } //----- move stuff ----- //instr->names src=offset(0,0xaff0); for(dst=offset(0,0xbe7a); dst!=offset(0,0xbfba); dst++) { sram_new[dst]=sram[src++]; } //table->env src=offset(1,0xb280); for(dst=offset(0,0xb690); dst!=offset(0,0xb890); dst++) { sram_new[dst]=sram[src++]; } //instr->param src=offset(0,0xb690); for(dst=offset(1,0xb080); dst!=offset(1,0xb280); dst++) { sram_new[dst]=sram[src++]; } //instr->alloc src=offset(1,0xa000); for(dst=offset(1,0xa040); dst!=offset(1,0xa060); dst++) { sram_new[dst]=sram[src++]; } //change phrase->instr 0x20 to 0x40 for(dst=offset(3,0xb000); dst!=offset(3,0xbff0); dst++) { if(sram_new[dst]==0x20) { sram_new[dst]=0x40; } } } int read_file(char *filename) { FILE *in; int read; in=fopen(filename,"rb"); if(in==NULL) { printf("error: can't open file '%s'", filename); exit(1); } read=fread(sram,1,32768,in); if(ferror(in)) { printf("file error %d",ferror(in)); exit(1); } if(read!=32768) { printf("error: wrong file size! (.sav should be 32 kB)"); exit(1); } fclose(in); return 1; }