void *qsf_start(const char *path, uint8 *buffer, uint32 length) { qsf_synth_t *s = malloc (sizeof (qsf_synth_t)); memset (s, 0, sizeof (qsf_synth_t)); uint8 *file = NULL, *lib_decoded = NULL, *lib_raw_file = NULL; uint64 file_len, lib_len, lib_raw_length; corlett_t *lib; s->z80 = z80_init(); s->z80->userdata = s; s->Z80ROM = malloc(512*1024); s->QSamples = malloc(8*1024*1024); s->skey1 = s->skey2 = 0; s->akey = 0; s->xkey = 0; s->cur_bank = 0; // Decode the current QSF if (corlett_decode(buffer, length, &file, &file_len, &s->c) != AO_SUCCESS) { return AO_FAIL; } // Get the library file if (s->c->lib[0] != 0) { uint64 tmp_length; char libpath[PATH_MAX]; ao_getlibpath (path, s->c->lib, libpath, sizeof (libpath)); #if DEBUG_LOADER printf("Loading library: %s\n", libpath); #endif if (ao_get_lib(libpath, &lib_raw_file, &tmp_length) != AO_SUCCESS) { free (file); qsf_stop (s); return NULL; } lib_raw_length = tmp_length; if (corlett_decode(lib_raw_file, lib_raw_length, &lib_decoded, &lib_len, &lib) != AO_SUCCESS) { free(lib_raw_file); free (file); qsf_stop (s); return NULL; } // Free up raw file free(lib_raw_file); // use the contents qsf_walktags(s, lib_decoded, lib_decoded+lib_len); // Dispose the corlett structure for the lib - we don't use it free(lib); if (lib_decoded) { free (lib_decoded); lib_decoded = NULL; } } // now patch the file into RAM OVER the libraries qsf_walktags(s, file, file+file_len); free(file); if ((s->skey1 != 0) && (s->skey2 != 0)) { #if DEBUG_LOADER printf("Decoding Kabuki: skey1 %08x skey2 %08x akey %04x xkey %02x\n", skey1, skey2, akey, xkey); #endif s->uses_kabuki = 1; cps1_decode((unsigned char *)s->Z80ROM, s->skey1, s->skey2, s->akey, s->xkey); } // set qsfby tag strcpy(s->qsfby, "n/a"); if (s->c) { int i; for (i = 0; i < MAX_UNKNOWN_TAGS; i++) { if (!strcasecmp(s->c->tag_name[i], "qsfby")) { strcpy(s->qsfby, s->c->tag_data[i]); } } } memcpy (s->initRAM, s->RAM, 0x1000); memcpy (s->initRAM2, s->RAM2, 0x1000); if (s->z80) { z80_reset(s->z80, NULL); z80_set_irq_callback(s->z80, qsf_irq_cb); } qsintf.sample_rom = s->QSamples; s->qs = qsound_sh_start(&qsintf); s->samples_to_next_tick = samples_per_tick; return s; }
int32 qsf_start(uint8 *buffer, uint32 length) { uint8 *file, *lib_decoded, *lib_raw_file; uint64 file_len, lib_len, lib_raw_length; corlett_t *lib; z80_init(); Z80ROM = malloc(512*1024); QSamples = malloc(8*1024*1024); skey1 = skey2 = 0; akey = 0; xkey = 0; cur_bank = 0; memset(RAM, 0, 0x1000); memset(RAM2, 0, 0x1000); // Decode the current QSF if (corlett_decode(buffer, length, &file, &file_len, &c) != AO_SUCCESS) { return AO_FAIL; } // Get the library file if (c->lib[0] != 0) { uint64 tmp_length; #if DEBUG_LOADER printf("Loading library: %s\n", c->lib); #endif if (ao_get_lib(c->lib, &lib_raw_file, &tmp_length) != AO_SUCCESS) { return AO_FAIL; } lib_raw_length = tmp_length; if (corlett_decode(lib_raw_file, lib_raw_length, &lib_decoded, &lib_len, &lib) != AO_SUCCESS) { free(lib_raw_file); return AO_FAIL; } // Free up raw file free(lib_raw_file); // use the contents qsf_walktags(lib_decoded, lib_decoded+lib_len); // Dispose the corlett structure for the lib - we don't use it free(lib); } // now patch the file into RAM OVER the libraries qsf_walktags(file, file+file_len); free(file); if ((skey1 != 0) && (skey2 != 0)) { #if DEBUG_LOADER printf("Decoding Kabuki: skey1 %08x skey2 %08x akey %04x xkey %02x\n", skey1, skey2, akey, xkey); #endif uses_kabuki = 1; cps1_decode((unsigned char *)Z80ROM, skey1, skey2, akey, xkey); } // set qsfby tag strcpy(qsfby, "n/a"); if (c) { int i; for (i = 0; i < MAX_UNKNOWN_TAGS; i++) { if (!strcasecmp(c->tag_name[i], "qsfby")) { strcpy(qsfby, c->tag_data[i]); } } } z80_reset(NULL); z80_set_irq_callback(qsf_irq_cb); qsintf.sample_rom = QSamples; qsound_sh_start(&qsintf); return AO_SUCCESS; }