MCPcopy Create free account
hub / github.com/TASEmulators/fceux / NSFLoad

Function NSFLoad

src/nsf.cpp:174–299  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

172}
173
174int NSFLoad(const char *name, FCEUFILE *fp)
175{
176 int x;
177
178 FCEU_fseek(fp,0,SEEK_SET);
179 FCEU_fread(&NSFHeader,1,0x80,fp);
180 if(memcmp(NSFHeader.ID,"NESM\x1a",5))
181 return LOADER_INVALID_FORMAT;
182 NSFHeader.SongName[31]=NSFHeader.Artist[31]=NSFHeader.Copyright[31]=0;
183
184 LoadAddr=NSFHeader.LoadAddressLow;
185 LoadAddr|=NSFHeader.LoadAddressHigh<<8;
186
187 if(LoadAddr<0x6000)
188 {
189 FCEUD_PrintError("Invalid load address.");
190 return LOADER_HANDLED_ERROR;
191 }
192 InitAddr=NSFHeader.InitAddressLow;
193 InitAddr|=NSFHeader.InitAddressHigh<<8;
194
195 PlayAddr=NSFHeader.PlayAddressLow;
196 PlayAddr|=NSFHeader.PlayAddressHigh<<8;
197
198 NSFSize=FCEU_fgetsize(fp)-0x80;
199
200 NSFMaxBank=((NSFSize+(LoadAddr&0xfff)+4095)/4096);
201 NSFMaxBank=PRGsize[0]=uppow2(NSFMaxBank);
202
203 if (!(NSFDATA = (uint8 *)FCEU_malloc(NSFMaxBank * 4096)))
204 {
205 FCEU_PrintError("Unable to allocate memory.");
206 return LOADER_HANDLED_ERROR;
207 }
208
209 FCEU_fseek(fp,0x80,SEEK_SET);
210 memset(NSFDATA,0x00,NSFMaxBank*4096);
211 FCEU_fread(NSFDATA+(LoadAddr&0xfff),1,NSFSize,fp);
212
213 NSFMaxBank--;
214
215 BSon=0;
216 for(x=0;x<8;x++)
217 {
218 BSon|=NSFHeader.BankSwitch[x];
219 }
220
221 if(BSon==0)
222 {
223 BankCounter=0x00;
224
225 if ((NSFHeader.LoadAddressHigh & 0x70) >= 0x70)
226 {
227 //Ice Climber, and other F000 base address tunes need this
228 BSon=0xFF;
229 }
230 else {
231 for(x=(NSFHeader.LoadAddressHigh & 0x70) / 0x10;x<8;x++)

Callers 1

FCEUI_LoadGameVirtualFunction · 0.85

Calls 10

FCEU_fseekFunction · 0.85
FCEU_freadFunction · 0.85
FCEU_fgetsizeFunction · 0.85
uppow2Function · 0.85
FCEU_mallocFunction · 0.85
FCEU_PrintErrorFunction · 0.85
FCEU_printfFunction · 0.85
FCEU_gmallocFunction · 0.85
FCEUI_SetVidSystemFunction · 0.85
FCEUD_PrintErrorFunction · 0.50

Tested by

no test coverage detected