bool NSFLoad(const char *name, MDFNFILE *fp, NESGameType *gt) { char magic[5]; int x; if(!(NSFInfo = (NSFINFO *)MDFN_malloc(sizeof(NSFINFO), _("NSF header")))) { return(0); } memset(NSFInfo, 0, sizeof(NSFINFO)); fp->rewind(); fp->fread(magic, 1, 5); if(!memcmp(magic, "NESM\x1a", 5)) { if(!LoadNSF(fp)) { FreeNSF(); return(0); } } else if(!memcmp(magic, "NSFE", 4)) { if(!LoadNSFE(NSFInfo, fp->data, fp->Size(), 0)) { FreeNSF(); return(0); } } else { FreeNSF(); return(FALSE); } if(NSFInfo->LoadAddr < 0x6000) { MDFNI_printf(_("Load address is invalid!")); FreeNSF(); return(0); } if(NSFInfo->TotalSongs < 1) { MDFNI_printf(_("Total number of songs is less than 1!")); FreeNSF(); return(0); } BSon = 0; for(x=0;x<8;x++) BSon |= NSFInfo->BankSwitch[x]; MDFNGameInfo->GameType = GMT_PLAYER; if(NSFInfo->GameName) MDFNGameInfo->name = (UTF8*)strdup((char*)NSFInfo->GameName); for(x=0;;x++) { if(NSFROM[x]==0x20) { NSFROM[x+1]=NSFInfo->InitAddr&0xFF; NSFROM[x+2]=NSFInfo->InitAddr>>8; NSFROM[x+8]=NSFInfo->PlayAddr&0xFF; NSFROM[x+9]=NSFInfo->PlayAddr>>8; break; } }
void NSFLoad(Stream *fp, NESGameType *gt) { try { char magic[5]; int x; NSFInfo = new NSFINFO(); fp->rewind(); fp->read(magic, 5); if(!memcmp(magic, "NESM\x1a", 5)) { fp->rewind(); LoadNSF(fp); } else if(!memcmp(magic, "NSFE", 4)) { fp->rewind(); LoadNSFE(NSFInfo, fp, 0); } if(NSFInfo->LoadAddr < 0x6000) throw MDFN_Error(0, _("Load address is invalid!")); if(NSFInfo->TotalSongs < 1) throw MDFN_Error(0, _("Total number of songs is less than 1!")); BSon = 0; for(x=0;x<8;x++) BSon |= NSFInfo->BankSwitch[x]; MDFNGameInfo->GameType = GMT_PLAYER; if(NSFInfo->GameName.size()) MDFNGameInfo->name = NSFInfo->GameName; for(x=0;;x++) { if(NSFROM[x]==0x20) { NSFROM[x+1]=NSFInfo->InitAddr&0xFF; NSFROM[x+2]=NSFInfo->InitAddr>>8; NSFROM[x+8]=NSFInfo->PlayAddr&0xFF; NSFROM[x+9]=NSFInfo->PlayAddr>>8; break; } } if(NSFInfo->VideoSystem == 0) MDFNGameInfo->VideoSystem = VIDSYS_NTSC; else if(NSFInfo->VideoSystem == 1) MDFNGameInfo->VideoSystem = VIDSYS_PAL; MDFN_printf(_("NSF Loaded. File information:\n\n")); MDFN_indent(1); if(NSFInfo->GameName.size()) MDFN_printf(_("Game/Album Name:\t%s\n"), NSFInfo->GameName.c_str()); if(NSFInfo->Artist.size()) MDFN_printf(_("Music Artist:\t%s\n"), NSFInfo->Artist.c_str()); if(NSFInfo->Copyright.size()) MDFN_printf(_("Copyright:\t\t%s\n"), NSFInfo->Copyright.c_str()); if(NSFInfo->Ripper.size()) MDFN_printf(_("Ripper:\t\t%s\n"), NSFInfo->Ripper.c_str()); if(NSFInfo->SoundChip) { static const char *tab[6]={"Konami VRCVI","Konami VRCVII","Nintendo FDS","Nintendo MMC5","Namco 106","Sunsoft FME-07"}; for(x=0;x<6;x++) if(NSFInfo->SoundChip&(1<<x)) { MDFN_printf(_("Expansion hardware: %s\n"), tab[x]); //NSFInfo->SoundChip=1<<x; /* Prevent confusing weirdness if more than one bit is set. */ //break; } } if(BSon) MDFN_printf(_("Bank-switched\n")); MDFN_printf(_("Load address: $%04x\nInit address: $%04x\nPlay address: $%04x\n"),NSFInfo->LoadAddr,NSFInfo->InitAddr,NSFInfo->PlayAddr); MDFN_printf("%s\n",(NSFInfo->VideoSystem&1)?"PAL":"NTSC"); MDFN_printf(_("Starting song: %d / %d\n\n"),NSFInfo->StartingSong + 1,NSFInfo->TotalSongs); if(NSFInfo->SoundChip&4) ExWRAM = new uint8[32768+8192]; else ExWRAM = new uint8[8192]; MDFN_indent(-1); gt->Power = NSF_Power; gt->Reset = NSF_Reset; gt->SaveNV = NULL; gt->Kill = NSF_Kill; gt->StateAction = NSF_StateAction; Player_Init(NSFInfo->TotalSongs, NSFInfo->GameName, NSFInfo->Artist, NSFInfo->Copyright, NSFInfo->SongNames); MDFNGameInfo->DesiredInput.push_back("gamepad"); MDFNGameInfo->DesiredInput.push_back("none"); MDFNGameInfo->DesiredInput.push_back("none"); MDFNGameInfo->DesiredInput.push_back("none"); MDFNGameInfo->DesiredInput.push_back("none"); }