コード例 #1
0
ファイル: codecs.c プロジェクト: BackupTheBerlios/bimmerbox
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;
}
コード例 #2
0
ファイル: sndboard.cpp プロジェクト: Blonder/WinUAE
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);
	}
}