int codec_load_ram(char* codecptr, int size, void* ptr2, int bufwrap, struct codec_api *api) { enum codec_status (*codec_start)(const struct codec_api* api); int status; #ifndef SIMULATOR int copy_n; if ((char *)&codecbuf[0] != codecptr) { /* zero out codec buffer to ensure a properly zeroed bss area */ memset(codecbuf, 0, CODEC_SIZE); size = MIN(size, CODEC_SIZE); copy_n = MIN(size, bufwrap); memcpy(codecbuf, codecptr, copy_n); size -= copy_n; if (size > 0) { memcpy(&codecbuf[copy_n], ptr2, size); } } codec_start = (void*)&codecbuf; #else /* SIMULATOR */ int pd; codec_start = sim_codec_load_ram(codecptr, size, ptr2, bufwrap, &pd); if (pd < 0) return CODEC_ERROR; #endif /* SIMULATOR */ invalidate_icache(); status = codec_start(api); #ifdef SIMULATOR sim_codec_close(pd); #endif return status; }
static void toccata_put(uaecptr addr, uae_u8 v) { struct toccata_data *data = &toccata; int idx = data->ad1848_index & 15; #if DEBUG_TOCCATA > 2 if (addr & 0x4000) write_log(_T("TOCCATA PUT %08x %02x %d PC=%08X\n"), addr, v, idx, M68K_GETPC); #endif if ((addr & 0x6801) == 0x6001) { // AD1848 register 0 data->ad1848_index = v; } else if ((addr & 0x6801) == 0x6801) { // AD1848 register 1 uae_u8 old = data->ad1848_regs[idx]; data->ad1848_regs[idx] = v; #if DEBUG_TOCCATA > 0 write_log(_T("TOCCATA PUT reg %d = %02x PC=%08x\n"), idx, v, M68K_GETPC); #endif switch(idx) { case 9: if (v & 8) // ACI enabled data->autocalibration = 50; if (!(old & 3) && (v & 3)) codec_start(); else if ((old & 3) && !(v & 3)) codec_stop(); break; case 2: case 3: case 4: case 5: case 6: case 7: case 8: calculate_volume_toccata(); break; } } else if ((addr & 0x6800) == 0x2000) { // FIFO input if (data->toccata_status & STATUS_FIFO_PLAY) { // 7202LA datasheet says fifo can't overflow if (((data->fifo_write_index + 1) % FIFO_SIZE) != data->fifo_read_index) { data->fifo[data->fifo_write_index] = v; data->fifo_write_index++; data->fifo_write_index %= FIFO_SIZE; data->data_in_fifo++; } } data->toccata_irq &= ~STATUS_READ_PLAY_HALF; data->fifo_half &= ~STATUS_FIFO_PLAY; } else if ((addr & 0x6800) == 0x0000) { // Board status if (v & STATUS_RESET) { codec_stop(); data->toccata_status = 0; data->toccata_irq = 0; v = 0; } if (v == STATUS_ACTIVE) { data->fifo_write_index = 0; data->fifo_read_index = 0; data->data_in_fifo = 0; data->toccata_status = 0; data->toccata_irq = 0; data->fifo_half = 0; } data->toccata_status = v; #if DEBUG_TOCCATA > 0 write_log(_T("TOCCATA PUT STATUS %08x %02x %d PC=%08X\n"), addr, v, idx, M68K_GETPC); #endif } else { write_log(_T("TOCCATA PUT UNKNOWN %08x\n"), addr); } }