static boolean ConvertMus(byte *musdata, int len, const char *filename) { MEMFILE *instream; MEMFILE *outstream; void *outbuf; size_t outbuf_len; int result; instream = mem_fopen_read(musdata, len); outstream = mem_fopen_write(); result = mus2mid(instream, outstream); if (result == 0) { mem_get_buf(outstream, &outbuf, &outbuf_len); M_WriteFile(filename, outbuf, outbuf_len); } mem_fclose(instream); mem_fclose(outstream); return result; }
void CheckStates(void) { MEMFILE *st=NULL; int ssel; if(SaveStateStatus[0]==(char)-1) for(ssel=0;ssel<10;ssel++) { st=fopen(FCEU_MakeFName(FCEUMKF_STATE,ssel,0),"rb"); if(st) { SaveStateStatus[ssel]=1; mem_fclose(st); } else SaveStateStatus[ssel]=0; } }
void SaveState(const char *fname) { MEMFILE *st=NULL; TempAddrT=TempAddr; RefreshAddrT=RefreshAddr; if(geniestage==1) { FCEU_DispMessage("Cannot save FCS in GG screen."); return; } st=mem_fopen_write(fname); if(st!=NULL) { static uint32 totalsize; static uint8 header[16]="FCS"; memset(header+4,0,13); header[3]=VERSION_NUMERIC; mem_fwrite(header,1,16,st); #ifdef ASM_6502 asmcpu_pack(); #endif totalsize=WriteStateChunk(st,1,SFCPU); totalsize+=WriteStateChunk(st,2,SFCPUC); totalsize+=WriteStateChunk(st,3,FCEUPPU_STATEINFO); totalsize+=WriteStateChunk(st,4,FCEUCTRL_STATEINFO); totalsize+=WriteStateChunk(st,5,SFSND); if(SPreSave) SPreSave(); totalsize+=WriteStateChunk(st,0x10,SFMDATA); if(SPostSave) SPostSave(); mem_fseek(st,4,SEEK_SET); mem_write32(totalsize,st); SaveStateStatus[CurrentState]=1; mem_fclose(st); } }
void LoadState(const char *fname) { MEMFILE *st=NULL; if(geniestage==1) { // FCEU_DispMessage("Cannot load FCS in GG screen."); return; } st=mem_fopen_read(fname); if (st) { FCEUSS_LoadFP(st, 0); mem_fclose(st); } else { FCEU_DispMessage("State %d load error (no file).",CurrentState); SaveStateStatus[CurrentState]=0; } }
static int LoadStateOld(MEMFILE *st) { int x; int32 nada; uint8 version; nada=0; printf("LoadStateOld\n"); StateBuffer=FCEU_malloc(59999); if(StateBuffer==NULL) return 0; if(!mem_fread(StateBuffer,59999,1,st)) { mem_fclose(st); free(StateBuffer); return 0; } intostate=0; { uint8 a[2]; afread(&a[0],1,1); afread(&a[1],1,1); X.PC=a[0]|(a[1]<<8); } afread(&X.A,1,1); afread(&X.P,1,1); afread(&X.X,1,1); afread(&X.Y,1,1); afread(&X.S,1,1); afread(&version,1,1); afread(&nada,1,1); afread(&nada,1,1); afread(&nada,1,1); afread(&nada,1,1); aread32((int8 *)&X.count); afread(&nada,1,1); afread(&nada,1,1); afread(&nada,1,1); afread(&nada,1,1); aread32((int8 *)&nada); afread(&nada,1,1); afread(&nada,1,1); afread(&nada,1,1); afread(&nada,1,1); for(x=0;x<8;x++) areadupper8of16((int8 *)&CHRBankList[x]); afread(PRGBankList,4,1); for(x=0;x<8;x++) areadlower8of16((int8 *)&CHRBankList[x]); afread(CHRRAM,1,0x2000); afread(NTARAM,1,0x400); afread(ExtraNTARAM,1,0x400); afread(NTARAM+0x400,1,0x400); afread(ExtraNTARAM+0x400,1,0x400); for(x=0;x<0xF00;x++) afread(&nada,1,1); afread(PALRAM,1,0x20); for(x=0;x<256-32;x++) afread(&nada,1,1); for(x=0x00;x<0x20;x++) PALRAM[x]&=0x3f; afread(PPU,1,4); afread(SPRAM,1,0x100); afread(WRAM,1,8192); afread(RAM,1,0x800); aread16((int8 *)&scanline); aread16((int8 *)&RefreshAddr); afread(&VRAMBuffer,1,1); afread(&IRQa,1,1); aread32((int8 *)&IRQCount); aread32((int8 *)&IRQLatch); afread(&Mirroring,1,1); afread(PSG,1,0x17); PSG[0x11]&=0x7F; afread(MapperExRAM,1,193); if(version>=31) PSG[0x17]=MapperExRAM[115]; else PSG[0x17]|=0x40; PSG[0x15]&=0xF; sqnon=PSG[0x15]; X.IRQlow=0; afread(&nada,1,1); afread(&nada,1,1); afread(&nada,1,1); afread(&nada,1,1); afread(&nada,1,1); afread(&nada,1,1); afread(&XOffset,1,1); PPUCHRRAM=0; for(x=0;x<8;x++) { nada=0; afread(&nada,1,1); PPUCHRRAM|=(nada?1:0)<<x; } afread(mapbyte1,1,8); afread(mapbyte2,1,8); afread(mapbyte3,1,8); afread(mapbyte4,1,8); for(x=0;x<4;x++) aread16((int8 *)&nada); PPUNTARAM=0; for(x=0;x<4;x++) { nada=0; aread16((int8 *)&nada); PPUNTARAM|=((nada&0x800)?0:1)<<x; } afread(MapperExRAM,1,32768); afread(&vtoggle,1,1); aread16((int8 *)&TempAddrT); aread16((int8 *)&RefreshAddrT); if(GameStateRestore) GameStateRestore(version); free(StateBuffer); FixOldSaveStateSFreq(); X.mooPI=X.P; return 1; }
int I_RegisterSong (char *data, size_t musicLen) { if(!music_initialized) return 0; // input mus memory file and midi MEMFILE *mus = mem_fopen_read(data, musicLen); MEMFILE *midi = mem_fopen_write(); I_UnRegisterSong(0); int result = mus2mid(mus, midi); switch(result) { case 1: Printf(PRINT_HIGH, "MUS is not valid\n"); break; case 0: case 2: { #ifdef OSX if (NewMusicSequence(&sequence) != noErr) return 0; cfd = CFDataCreate(NULL, (const Uint8 *)mem_fgetbuf(midi), mem_fsize(midi)); if(!cfd) { DisposeMusicSequence(sequence); return 0; } if (MusicSequenceLoadSMFData(sequence, (CFDataRef)cfd) != noErr) { DisposeMusicSequence(sequence); CFRelease(cfd); return 0; } registered_tracks[0].Track = (Mix_Music*)1; #else Mix_Music *music = 0; // older versions of sdl-mixer require a physical midi file to be read, 1.2.7+ can read from memory #ifndef TEMP_MIDI // SDL >= 1.2.7 if (result == 0) // it is a midi { registered_tracks[0].Data = SDL_RWFromMem(mem_fgetbuf(midi), mem_fsize(midi)); } else // it is another format { registered_tracks[0].Data = SDL_RWFromMem(data, musicLen); } if (!registered_tracks[0].Data) { Printf(PRINT_HIGH, "SDL_RWFromMem: %s\n", SDL_GetError()); break; } music = Mix_LoadMUS_RW(registered_tracks[0].Data); if(!music) { Printf(PRINT_HIGH, "Mix_LoadMUS_RW: %s\n", Mix_GetError()); SDL_FreeRW(registered_tracks[0].Data); registered_tracks[0].Data = NULL; break; } #else // SDL <= 1.2.6 - Create a file so it can load the midi FILE *fp = fopen(TEMP_MIDI, "wb+"); if(!fp) { Printf(PRINT_HIGH, "Could not open temporary music file %s, not playing track\n", TEMP_MIDI); break; } for(int i = 0; i < mem_fsize(midi); i++) fputc(mem_fgetbuf(midi)[i], fp); fclose(fp); music = Mix_LoadMUS(TEMP_MIDI); if(!music) { Printf(PRINT_HIGH, "Mix_LoadMUS: %s\n", Mix_GetError()); break; } #endif registered_tracks[0].Track = music; #endif // OSX break; } // case 2 } mem_fclose(mus); mem_fclose(midi); return 1; }