unsigned short c64SidLoad(const char* filename, unsigned short* init_addr, unsigned short* play_addr, unsigned char* sub_song_start, unsigned char* max_sub_songs, unsigned char* speed, char* name, char* author, char* copyright) { FILE* f = fopen(filename, "rb"); if(!f) return 0; // check header char PSID[4]; if(!fread(PSID, 4, 1, f) && strncmp(PSID, "PSID", 4)) return 0; fseek(f, 0x16, 0); fread(name, 1, 32, f); fread(author, 1, 32, f); fread(copyright, 1, 32, f); unsigned char sidmem[65536]; unsigned short load_addr; rewind(f); int len = fread(sidmem, 1, 65536, f); fclose(f); return LoadSIDFromMemory(sidmem, &load_addr, init_addr, play_addr, max_sub_songs, sub_song_start, speed, len); }
static int EMSCRIPTEN_KEEPALIVE loadSidFile(void * inBuffer, int inBufSize) { sSampleRate= 44100; // TODO: extend API & use actual target sample rate sInitAddr= 0; sPlayAddr= 0; sLoadEndAddr= 0; sActualSubsong= 0; sMaxSubsong= 0; sPlaySpeed= 0; sNtscMode= 0; unsigned char sidmem[65536]; unsigned char *buffer = sidmem; memcpy(buffer, inBuffer, inBufSize); sIsPSID= (buffer[0x00]==0x50?1:0); sSidVersion= buffer[0x05]; sIsC64compatible= (sSidVersion & 0x2) && ((buffer[0x77] & 0x2) == 0); sNtscMode= (sSidVersion == 2) && !isRsid() && (buffer[0x77] & 0x8); // NTSC bit int i; for (i=0;i<32;i++) song_name[i] = buffer[0x16+i]; for (i=0;i<32;i++) song_author[i] = buffer[0x36+i]; for (i=0;i<32;i++) song_copyright[i] = buffer[0x56+i]; unsigned short load_addr; LoadSIDFromMemory(sidmem, &load_addr, &sLoadEndAddr, &sInitAddr, &sPlayAddr, &sMaxSubsong, &sActualSubsong, &sPlaySpeed, inBufSize); memcpy(sMemorySnapshot, memory, MEMORY_SIZE); loadResult[0]= &load_addr; loadResult[1]= &sPlaySpeed; loadResult[2]= &sMaxSubsong; loadResult[3]= &sActualSubsong; loadResult[4]= song_name; loadResult[5]= song_author; loadResult[6]= song_copyright; return 0; }