int movie_save(char *filename) { memfile_t *file; u8 flags; if(filename) { if(nes->movie.filename) mem_free(nes->movie.filename); nes->movie.filename = mem_strdup(filename); } else if(nes->movie.filename == 0) { log_printf("movie_save: error! no filename given and movie doesnt have filename set\n"); return(0); } if(nes->movie.len == 0) { log_printf("movie_save: no movie data to save, just setting filename\n"); return(0); } if(nes->movie.mode & MOVIE_RECORD) { log_printf("movie_save: still recording, stopping...\n"); movie_stop(); } if((file = memfile_open(nes->movie.filename,"wb")) == 0) { log_printf("movie_save: error opening movie '%s'\n",filename); return(1); } memfile_seek(nes->movie.state,0,SEEK_SET); flags = (nes->movie.mode & MOVIE_TEST) ? 1 : 0; //header (just ident for now) memfile_write(movie_ident,1,4,file); memfile_write(&flags,1,sizeof(u8),file); //save input device configuration memfile_write(&nes->inputdev[0]->id,1,sizeof(int),file); memfile_write(&nes->inputdev[1]->id,1,sizeof(int),file); memfile_write(&nes->expdev->id,1,sizeof(int),file); //save movie data memfile_write(&nes->movie.startframe,1,sizeof(u32),file); memfile_write(&nes->movie.endframe,1,sizeof(u32),file); memfile_write(&nes->movie.crc32,1,sizeof(u32),file); memfile_write(&nes->movie.len,1,sizeof(u32),file); log_printf("movie_save: start, end = %d, %d :: len = %d bytes\n",nes->movie.startframe,nes->movie.endframe,nes->movie.len); memfile_write(nes->movie.data,1,nes->movie.len,file); //append savestate to end of movie memfile_copy(file,nes->movie.state,memfile_size(nes->movie.state)); memfile_close(file); return(0); }
int movie_load(char *filename) { memfile_t *file; u32 size; u8 flags; int devid[3]; char ident[5]; movie_unload(); if((file = memfile_open(filename,"rb")) == 0) { log_printf("movie_load: error opening movie '%s'\n",filename); return(1); } //need header and stuff here memfile_read(ident,1,4,file); if(memcmp(ident,movie_ident,4) != 0) { log_printf("movie_load: bad movie ident\n"); memfile_close(file); return(2); } //read movie flags memfile_read(&flags,1,sizeof(u8),file); if(flags & 1) nes->movie.mode |= MOVIE_TEST; //set required input devices memfile_read(&devid[0],1,sizeof(int),file); memfile_read(&devid[1],1,sizeof(int),file); memfile_read(&devid[2],1,sizeof(int),file); nes_set_inputdev(0,devid[0]); nes_set_inputdev(1,devid[1]); nes_set_inputdev(2,devid[2]); //read movie data memfile_read(&nes->movie.startframe,1,sizeof(u32),file); memfile_read(&nes->movie.endframe,1,sizeof(u32),file); memfile_read(&nes->movie.crc32,1,sizeof(u32),file); memfile_read(&nes->movie.len,1,sizeof(u32),file); log_printf("movie_load: start, end = %d, %d :: len = %d bytes\n",nes->movie.startframe,nes->movie.endframe,nes->movie.len); nes->movie.data = (u8*)mem_alloc(nes->movie.len); memfile_read(nes->movie.data,1,nes->movie.len,file); size = memfile_size(file) - memfile_tell(file); nes->movie.state = memfile_create(); memfile_copy(nes->movie.state,file,size); memfile_close(file); return(0); }
int cart_load_nsf(cart_t *ret,memfile_t *file) { int n = 0; char biosfile[1024]; u32 size; u32 loadaddr; u8 nobankswitch[8 + 8] = {0,0,0,0,0,0,0,0, 0,1,2,3,4,5,6,7}; //clear the string memset(biosfile,0,1024); //parse the bios path config_get_eval_string(biosfile,"path.bios"); //append the path seperator str_appendchar(biosfile,PATH_SEPERATOR); //append the bios filename strcat(biosfile,"nsfbios.bin"); //try to load bios from the bios directory if(loadbios(ret,biosfile) != 0) { //see if bios is in the current directory if(loadbios(ret,"nsfbios.bin") != 0) { return(1); } } //get length of file size = memfile_size(file); //discount for the header size -= 0x80; if(memfile_read(ret->data,1,0x80,file) != 0x80) { log_printf("cart_load_nsf: error reading header from '%s'\n",file->filename); n = 1; } else { loadaddr = ret->data[8] | (ret->data[9] << 8); //if the nsf doesnt use bankswitching if(memcmp((u8*)ret->data + 0x70,(u8*)nobankswitch,8) == 0) { memcpy((u8*)ret->data + 0x70,(u8*)nobankswitch + 8,8); ret->prg.size = (u32)size + (loadaddr & 0x7FFF); ret->prg.data = (u8*)mem_alloc(ret->prg.size); memset(ret->prg.data,0,ret->prg.size); memfile_read(ret->prg.data + (loadaddr & 0x7FFF),1,size,file); } //else the nsf is bankswitched else { ret->prg.size = (u32)size + (loadaddr & 0xFFF); ret->prg.data = (u8*)mem_alloc(ret->prg.size); memset(ret->prg.data,0,ret->prg.size); memfile_read(ret->prg.data + (loadaddr & 0xFFF),1,size,file); } //setup mapper ret->mapperid = B_NSF; log_printf("cart_load_nsf: nsf v%d loaded, %d bytes (padded to %d), %d songs.\n",ret->data[5],size,ret->prg.size,ret->data[6]); log_printf("init $%04X, play $%04X\n",ret->data[0xA] | (ret->data[0xB] << 8),ret->data[0xC] | (ret->data[0xD] << 8)); } return(n); }
int cart_load_fds(cart_t *ret,memfile_t *file) { u8 header[16]; u32 size; char biosfile[1024]; //clear the string memset(biosfile,0,1024); //parse the bios path config_get_eval_string(biosfile,"path.bios"); //append the path seperator str_appendchar(biosfile,PATH_SEPERATOR); //append the bios filename strcat(biosfile,config_get_string("nes.fds.bios")); //try to load bios from the bios directory if(loadbios(ret,biosfile) != 0) { //see if bios is in the current directory if(loadbios(ret,config_get_string("nes.fds.bios")) != 0) { return(1); } } //get length of file size = memfile_size(file); //read the header memfile_read(header,1,16,file); //check if this is raw fds disk if(memcmp(header,fdsident2,15) == 0) { //check if the file is a valid size if((size % 65500) != 0) { log_printf("cart_load_fds: fds disk image size not multiple of 65500, aborting\n"); return(1); } //set number of disk sides // ret->disksides = size / 65500; //skip back to the beginning memfile_rewind(file); } //check if this is 16-byte header fds disk else if(memcmp(header,fdsident,4) == 0) { //set number of disk sides // ret->disksides = header[4]; size -= 16; } //set mapper id to fds mapper ret->mapperid = B_FDS; //setup the disk data pointers ret->disk.size = size; ret->disk.data = (u8*)mem_alloc(size); ret->diskoriginal.size = size; ret->diskoriginal.data = (u8*)mem_alloc(size); //read disk data into pointer memfile_read(ret->disk.data,1,size,file); //copy to original disk data pointer memcpy(ret->diskoriginal.data,ret->disk.data,size); log_printf("cart_load_fds: loaded disk, %d sides (%d bytes)\n",ret->disk.size / 65500,size); return(0); }