#include #ifndef WIN32 /* We use memory mapping in Linux. It's fast. */ #include #define USE_MMAP 1 #endif static unsigned char* ROM = NULL; static unsigned known_romsize; static void LoadROM(FILE *fp) { fprintf(stderr, "Loading ROM..."); unsigned hdrskip = 0; fseek(fp, 0, SEEK_END); unsigned romsize = ftell(fp); hdrskip = romsize & 1023; romsize &= ~1023; romsize -= hdrskip; fprintf(stderr, " $%X bytes...", romsize); ROM = NULL; #ifdef USE_MMAP /* This takes about 0.0001s on my computer over nfs */ ROM = (unsigned char *)mmap(NULL, romsize, PROT_READ, MAP_PRIVATE, fileno(fp), hdrskip); #endif /* mmap could have failed, so revert to reading */ if(ROM == NULL || ROM == (unsigned char*)(-1)) { /* This takes about 5s on my computer over nfs */ ROM = (unsigned char*)malloc(romsize); fseek(fp, hdrskip, SEEK_SET); fread(ROM, 1, romsize, fp); } else fprintf(stderr, " memmap succesful (%p),", (const void *)ROM); fprintf(stderr, " done"); known_romsize = romsize; fprintf(stderr, "\n"); } static void PokeROM() { printf("Game name: %.23s\n", ROM+0x7FC0); } int main(void) { FILE* fp = fopen("smw.smc", "rb"); if(!fp) { perror("smw.smc"); return -1; } LoadROM(fp); fclose(fp); // after the file has been mmapped, fd isn't needed anymore! PokeROM(); }