📄 spc7110.cpp
字号:
{ char binname[PATH_MAX];#ifndef _XBOX sprintf(binname,"%06X.bin",decompack->tableEnts[i].table);#else sprintf(binname,"%s%06X.bin",filename,decompack->tableEnts[i].table);#endif struct stat buf; if(-1!=stat(binname, &buf)) decompack->binfiles[i]=new uint8[buf.st_size]; FILE* fp=fopen(binname, "rb"); if(fp) { fread(decompack->binfiles[i],buf.st_size,1,fp); fclose(fp); } } }#ifndef _XBOX chdir(temp_path);#endif Copy7110=&MovePackData; CleanUp7110=&Del7110Gfx;#ifdef __WIN32__ #ifndef _XBOX EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_ENABLED); #endif#endif}//Cache 2 load functionvoid SPC7110Open(char* dirname){ char temp_path[PATH_MAX]; int i=0; decompack=new Pack7110;#ifndef _XBOX getcwd(temp_path,PATH_MAX);#endif ZeroMemory(decompack, sizeof(Pack7110)); #ifndef _XBOX if(-1==chdir(dirname)) { S9xMessage(0,0,"Graphics Pack not found!"); }#endif#ifndef _XBOX Load7110Index("index.bin");#else // D:\\ is always app.path in Xbox Load7110Index("d:\\index.bin");#endif for (i=0; i<MAX_TABLES; i++) decompack->binfiles[i]=NULL; ReadPackData();#ifndef _XBOX chdir(temp_path);#endif Copy7110=&ReadPackData; CleanUp7110=&Close7110Gfx;#ifdef __WIN32__ #ifndef _XBOX EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_ENABLED); #endif#endif}//Cache 3's load functionvoid SPC7110Grab(char* dirname){ char temp_path[PATH_MAX]; int i=0; decompack=new Pack7110;#ifndef _XBOX getcwd(temp_path,PATH_MAX);#endif int32 buffer_size=1024*1024*cacheMegs;//*some setting ZeroMemory(decompack, sizeof(Pack7110));#ifndef _XBOX if(-1==chdir(dirname)) { S9xMessage(0,0,"Graphics Pack not found!"); }#endif#ifndef _XBOX Load7110Index("index.bin");#else // D:\\ is always app.path in Xbox Load7110Index("d:\\index.bin");#endif for(i=0;i<MAX_TABLES;i++) { if(decompack->tableEnts[i].table!=0) { char binname[PATH_MAX];#ifndef _XBOX sprintf(binname,"%06X.bin",decompack->tableEnts[i].table);#else sprintf(binname,"%s%06X.bin",filename,decompack->tableEnts[i].table);#endif struct stat buf;//add load/no load calculations here if(-1!=stat(binname, &buf)) { if(buf.st_size<buffer_size) decompack->binfiles[i]=new uint8[buf.st_size]; FILE* fp=fopen(binname, "rb"); //use them here if(fp) { if(buf.st_size<buffer_size) { fread(decompack->binfiles[i],buf.st_size,1,fp); fclose(fp); buffer_size-=buf.st_size; decompack->tableEnts[i].is_file=false; } else { decompack->binfiles[i]=(uint8*)fp; decompack->tableEnts[i].is_file=true; } } } } }#ifndef _XBOX chdir(temp_path);#endif Copy7110=&GetPackData; CleanUp7110=&Drop7110Gfx;#ifdef __WIN32__ #ifndef _XBOX EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_ENABLED); #endif#endif}//Cache 1 clean up functionvoid Del7110Gfx(){ int i; if(Settings.SPC7110) {#ifdef __WIN32__ #ifndef _XBOX EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_GRAYED); #endif#endif Do7110Logging(); } for(i=0;i<MAX_TABLES;i++) { if(decompack->binfiles[i]!=NULL) { delete []decompack->binfiles[i]; decompack->binfiles[i]=NULL; } } Settings.SPC7110=false; Settings.SPC7110RTC=false; if(NULL!=decompack) delete decompack; decompack=NULL; CleanUp7110=NULL; Copy7110=NULL;}//Cache2 cleanup functionvoid Close7110Gfx(){ int i; if(Settings.SPC7110) {#ifdef __WIN32__ #ifndef _XBOX EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_GRAYED); #endif#endif Do7110Logging(); } for(i=0;i<MAX_TABLES;i++) { if(decompack->binfiles[i]!=NULL) { fclose((FILE*)decompack->binfiles[i]); decompack->binfiles[i]=NULL; } } Settings.SPC7110=false; Settings.SPC7110RTC=false; if(NULL!=decompack) delete decompack; decompack=NULL; CleanUp7110=NULL; Copy7110=NULL;}//cache 3's clean-up codevoid Drop7110Gfx(){ int i; if(Settings.SPC7110) {#ifdef __WIN32__ #ifndef _XBOX EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_GRAYED); #endif#endif Do7110Logging(); } for(i=0;i<MAX_TABLES;i++) { if(decompack->binfiles[i]!=NULL) { if(decompack->tableEnts[i].is_file) { fclose((FILE*)decompack->binfiles[i]); decompack->binfiles[i]=NULL; } else { delete []decompack->binfiles[i]; decompack->binfiles[i]=NULL; } } } Settings.SPC7110=false; Settings.SPC7110RTC=false; if(NULL!=decompack) delete decompack; decompack=NULL; CleanUp7110=NULL; Copy7110=NULL;}//emulate a reset.void S9xSpc7110Reset(){ s7r.reg4800=0; s7r.reg4801=0; s7r.reg4802=0; s7r.reg4803=0; s7r.reg4804=0; s7r.reg4805=0; s7r.reg4806=0; s7r.reg4807=0; s7r.reg4808=0; s7r.reg4809=0; s7r.reg480A=0; s7r.reg480B=0; s7r.reg480C=0; s7r.reg4811=0; s7r.reg4812=0; s7r.reg4813=0; s7r.reg4814=0; s7r.reg4815=0; s7r.reg4816=0; s7r.reg4817=0; s7r.reg4818=0; s7r.reg4820=0; s7r.reg4821=0; s7r.reg4822=0; s7r.reg4823=0; s7r.reg4824=0; s7r.reg4825=0; s7r.reg4826=0; s7r.reg4827=0; s7r.reg4828=0; s7r.reg4829=0; s7r.reg482A=0; s7r.reg482B=0; s7r.reg482C=0; s7r.reg482D=0; s7r.reg482E=0; s7r.reg482F=0; s7r.reg4830=0; s7r.reg4831=0; s7r.reg4832=1; s7r.reg4833=2; s7r.reg4834=0; s7r.reg4840=0; s7r.reg4841=0; s7r.reg4842=0; s7r.written=0; s7r.offset_add=0; s7r.AlignBy=1; s7r.bank50Internal=0; memset(s7r.bank50,0x00,DECOMP_BUFFER_SIZE);}//outputs a cumulative log for the game.//there's nothing really weird here, just//reading the old log, and writing a new one.//note the logs are explicitly little-endian, not host byte order.void Do7110Logging(){ uint8 ent_temp; FILE* flog; int entries=0; if(Settings.SPC7110) { //flush last read into logging (*Copy7110)(); // zones: mac specific begin char name[PATH_MAX + 1]; strcpy(name, S9xGetFilename(".dat")); flog = fopen(name, "rb");/* if(!strncmp((char*)&Memory.ROM [0xffc0], "SUPER POWER LEAG 4 ", 21)) {#ifdef _XBOX flog=fopen("T:\\spl4-sp7.dat","rb");#else flog=fopen("spl4-sp7.dat","rb");#endif } else if(!strncmp((char*)&Memory.ROM [0xffc0], "MOMOTETSU HAPPY ",21)) {#ifdef _XBOX flog=fopen("T:\\smht-sp7.dat","rb");#else flog=fopen("smht-sp7.dat","rb");#endif } else if(!strncmp((char*)&Memory.ROM [0xffc0], "HU TENGAI MAKYO ZERO ", 21)) {#ifdef _XBOX flog=fopen("T:\\feoezsp7.dat","rb");#else flog=fopen("feoezsp7.dat","rb");#endif } else if(!strncmp((char*)&Memory.ROM [0xffc0], "JUMP TENGAIMAKYO ZERO",21)) {#ifdef _XBOX flog=fopen("T:\\sjumpsp7.dat","rb");#else flog=fopen("sjumpsp7.dat","rb");#endif } else {#ifdef _XBOX flog=fopen("T:\\misc-sp7.dat","rb");#else flog=fopen("misc-sp7.dat","rb");#endif }*/// zones: end if(flog) { uint8 buffer[8]; int table=0; uint16 offset=0; uint16 length=0; fseek(flog, 35,0); do { int i=0; Data7110 *log=NULL; fread(buffer, 1, 8, flog); table=buffer[0]|(buffer[1]<<8)|(buffer[2]<<16); offset=buffer[6]|(buffer[7]<<8); length=buffer[4]|(buffer[5]<<8); while(i<MAX_TABLES&&log==NULL) { if(decompack->tableEnts[i].table==table) { log=&(decompack->tableEnts[i].location[(buffer[3])]); if((log->used_offset+log->used_len)<(offset+length)) { log->used_offset=offset; log->used_len=length; } } i++; } } while(!feof(flog)); fclose(flog); }// zones: mac specific begin flog = fopen(name, "wb");/* if(!strncmp((char*)&Memory.ROM [0xffc0], "SUPER POWER LEAG 4 ", 21)) {#ifdef _XBOX // cwd could be the dvd-rom, so write to T:\\ which is storage region for each title flog=fopen("T:\\spl4-sp7.dat","wb");#else flog=fopen("spl4-sp7.dat","wb");#endif } else if(!strncmp((char*)&Memory.ROM [0xffc0], "MOMOTETSU HAPPY ",21)) {#ifdef _XBOX flog=fopen("T:\\smht-sp7.dat","wb");#else flog=fopen("smht-sp7.dat","wb");#endif } else if(!strncmp((char*)&Memory.ROM [0xffc0], "HU TENGAI MAKYO ZERO ", 21)) {#ifdef _XBOX flog=fopen("T:\\feoezsp7.dat","wb");#else flog=fopen("feoezsp7.dat","wb");#endif } else if(!strncmp((char*)&Memory.ROM [0xffc0], "JUMP TENGAIMAKYO ZERO",21)) {#ifdef _XBOX flog=fopen("T:\\sjumpsp7.dat","wb");#else flog=fopen("sjumpsp7.dat","wb");#endif } else {#ifdef _XBOX flog=fopen("T:\\misc-sp7.dat","wb");#else flog=fopen("misc-sp7.dat","wb");#endif }*/// zones: end //count entries if(flog) { int j=0; int temp=0; for(j=0;j<MAX_TABLES;j++) { for(int k=0;k<256;k++) { if(decompack->tableEnts[j].location[k].used_len!=0) entries++; } } ent_temp=entries&0xFF; fwrite(&ent_temp,1,1,flog); ent_temp=(entries>>8)&0xFF; fwrite(&ent_temp,1,1,flog); ent_temp=(entries>>16)&0xFF; fwrite(&ent_temp,1,1,flog); ent_temp=(entries>>24)&0xFF; fwrite(&ent_temp,1,1,flog); fwrite(&temp,1,4,flog); fwrite(&temp,1,4,flog); fwrite(&temp,1,4,flog); fwrite(&temp,1,4,flog); fwrite(&temp,1,4,flog); fwrite(&temp,1,4,flog); fwrite(&temp,1,4,flog); ent_temp=0; fwrite(&ent_temp,1,1,flog); ent_temp=0; fwrite(&ent_temp,1,1,flog); ent_temp=0; fwrite(&ent_temp,1,1,flog); for(j=0;j<MAX_TABLES;j++) { for(int k=0;k<256;k++) { if(decompack->tableEnts[j].location[k].used_len!=0) { ent_temp=decompack->tableEnts[j].table&0xFF; fwrite(&ent_temp,1,1,flog);//801 ent_temp=(decompack->tableEnts[j].table>>8)&0xFF;; fwrite(&ent_temp,1,1,flog);//802 ent_temp=(decompack->tableEnts[j].table>>16)&0xFF;; fwrite(&ent_temp,1,1,flog);//803 ent_temp=k&0xFF; fwrite(&ent_temp,1,1,flog);//804 ent_temp=decompack->tableEnts[j].location[k].used_len&0xFF; fwrite(&ent_temp,1,1,flog);//lsb of ent_temp=(decompack->tableEnts[j].location[k].used_len>>8)&0xFF; fwrite(&ent_temp,1,1,flog);//msb of ent_temp=(decompack->tableEnts[j].location[k].used_offset)&0xFF; fwrite(&ent_temp,1,1,flog);//lsb of ent_temp=(decompack->tableEnts[j].location[k].used_offset>>8)&0xFF; fwrite(&ent_temp,1,1,flog);//msb of } } } fwrite(&temp,1,4,flog); fwrite(&temp,1,4,flog); fclose(flog); } }}bool8 S9xSaveSPC7110RTC (S7RTC *rtc_f9){ FILE* fp; if((fp=fopen(S9xGetFilename(".rtc"), "wb"))==NULL) return (FALSE); int i=0; uint8 temp=0; for (i=0;i<16;i++) fwrite(&rtc_f9->reg[i],1,1,fp); temp=rtc_f9->index&0x00FF; fwrite(&temp,1,1,fp); temp=(rtc_f9->index)>>8; fwrite(&temp,1,1,fp); temp=(uint8)rtc_f9->control; fwrite(&temp,1,1,fp); temp=(uint8)rtc_f9->init; fwrite(&temp,1,1,fp); temp=rtc_f9->last_used&0x00FF; fwrite(&temp,1,1,fp); temp=(rtc_f9->last_used>>8)&0x00FF; fwrite(&temp,1,1,fp); temp=(rtc_f9->last_used>>16)&0x00FF; fwrite(&temp,1,1,fp); temp=(rtc_f9->last_used>>24)&0x00FF;; fwrite(&temp,1,1,fp); fclose(fp); return (TRUE);}bool8 S9xLoadSPC7110RTC (S7RTC *rtc_f9){ FILE* fp; if((fp=fopen(S9xGetFilename(".rtc"), "rb"))==NULL) return (FALSE); for (int i=0; i<16;i++) { fread(&(rtc_f9->reg[i]),1,1,fp); } uint8 temp=0; fread(&temp,1,1,fp); rtc_f9->index=temp; fread(&temp,1,1,fp); rtc_f9->index|=(temp<<8); fread(&rtc_f9->control,1,1,fp); fread(&rtc_f9->init,1,1,fp); fread(&temp,1,1,fp); rtc_f9->last_used=temp; fread(&temp,1,1,fp); rtc_f9->last_used|=(temp<<8); fread(&temp,1,1,fp); rtc_f9->last_used|=(temp<<16); fread(&temp,1,1,fp); rtc_f9->last_used|=(temp<<24); fclose(fp); return (TRUE);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -