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; }
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; }