Beispiel #1
0
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);
}
Beispiel #2
0
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;
}