Пример #1
0
bool Record::load(const char* filename, int number) {

	// check suffix
	const char* dot = strrchr(filename, '.');
	if (dot && strcmp(dot, ".txt") == 0) {

		// load log file

		snprintf(title, sizeof(title), "%s\n", filename);

		FILE* f = fopen(filename, "r");
		if (!f) return false;

		int n = 1;

		unsigned int dt, addr, val;
		while (fscanf(f, "%d [%d] = %x ", &dt, &addr, &val) == 3) {

			int idle = 0;
			while (idle++ < 10 && dt > 17000) {
				dt -= 17000;
				if (++n >= RECORD_LENGTH) goto END;
				memcpy(&data[n], &data[n - 1], 25);
			}
			data[n][addr] = val;
		}
END:
		fclose(f);
		return true;
	}


	// load sid tune

	unsigned short init_addr;
	unsigned short play_addr;
	unsigned char speed;
	unsigned char song;
	unsigned char max_songs;
	char name[32];
	char author[32];
	char copyright[32];

	c64Init();
	int ret = c64SidLoad(filename, &init_addr, &play_addr, &song, &max_songs,
		&speed, name, author, copyright);
	if (!ret) return false;

	if (number > 0 && number <= max_songs + 1) song = number - 1;

	cpuJSR(init_addr, song);
	snprintf(title, sizeof(title), "%s - %s - %s - %d/%d\n",
		name, author, copyright, song + 1, max_songs + 1);

	for (int i = 0; i < RECORD_LENGTH; i++) {
		cpuJSR(play_addr, 0);
		memcpy(&data[i][0], &memory[0xd400], 25);
	}
	return true;
}
Пример #2
0
unsigned short LoadSIDFromMemory(void *pSidData, unsigned short *load_addr,
		unsigned short *init_addr, unsigned short *play_addr,
		unsigned char *subsongs, unsigned char *startsong, unsigned char *speed,
		unsigned short size) {

	unsigned char *pData = (unsigned char*)pSidData;
	unsigned char data_file_offset = pData[7];

	*load_addr = pData[8]<<8;
	*load_addr|= pData[9];

	*init_addr = pData[10]<<8;
	*init_addr|= pData[11];

	*play_addr = pData[12]<<8;
	*play_addr|= pData[13];

	*subsongs = pData[0xf]-1;
	*startsong = pData[0x11]-1;

	*load_addr = pData[data_file_offset];
	*load_addr|= pData[data_file_offset+1]<<8;

	*speed = pData[0x15];

	memset(memory, 0, sizeof(memory));
	memcpy(&memory[*load_addr], &pData[data_file_offset+2], size-(data_file_offset+2));

	if(!*play_addr) {
		cpuJSR(*init_addr, 0);
		*play_addr = (memory[0x0315]<<8)+memory[0x0314];
	}

	return *load_addr;
}