nkeynes@11: /** nkeynes@131: * $Id: aica.h,v 1.9 2006-03-30 11:27:11 nkeynes Exp $ nkeynes@11: * nkeynes@11: * MMIO definitions for the AICA sound chip. Note that the regions defined nkeynes@11: * here are relative to the SH4 memory map (0x00700000 based), rather than nkeynes@11: * the ARM addresses (0x00800000 based). nkeynes@11: * nkeynes@11: * Copyright (c) 2005 Nathan Keynes. nkeynes@11: * nkeynes@11: * This program is free software; you can redistribute it and/or modify nkeynes@11: * it under the terms of the GNU General Public License as published by nkeynes@11: * the Free Software Foundation; either version 2 of the License, or nkeynes@11: * (at your option) any later version. nkeynes@11: * nkeynes@11: * This program is distributed in the hope that it will be useful, nkeynes@11: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@11: * GNU General Public License for more details. nkeynes@11: */ nkeynes@11: nkeynes@11: #include "mmio.h" nkeynes@11: nkeynes@11: MMIO_REGION_BEGIN( 0x00700000, AICA0, "AICA Sound System 0-31" ) nkeynes@11: LONG_PORT( 0x000, AICACH0, PORT_MRW, UNDEFINED, "Channel 0" ) nkeynes@11: MMIO_REGION_END nkeynes@11: nkeynes@11: MMIO_REGION_BEGIN( 0x00701000, AICA1, "AICA Sound System 32-63" ) nkeynes@11: LONG_PORT( 0x000, AICACH32, PORT_MRW, UNDEFINED, "Channel 32" ) nkeynes@11: MMIO_REGION_END nkeynes@11: nkeynes@11: MMIO_REGION_BEGIN( 0x00702000, AICA2, "AICA Sound System Control" ) nkeynes@40: LONG_PORT( 0x040, CDDA_VOL_L, PORT_MRW, 0, "CDDA Volume left" ) nkeynes@40: LONG_PORT( 0x044, CDDA_VOL_R, PORT_MRW, 0, "CDDA Volume right" ) nkeynes@40: LONG_PORT( 0x800, VOL_MASTER, PORT_MRW, UNDEFINED, "Master volume" ) nkeynes@61: LONG_PORT( 0x808, AICA_UNK7, PORT_MRW, 0, "AICA ??? 7" ) nkeynes@66: LONG_PORT( 0x880, AICA_UNK6, PORT_MRW, 0, "AICA ??? 6" ) nkeynes@66: LONG_PORT( 0x890, AICA_TIMER, PORT_MRW, 0, "AICA Timer" ) nkeynes@46: LONG_PORT( 0x89C, AICA_UNK1, PORT_MRW, 0, "AICA ??? 1" ) nkeynes@66: LONG_PORT( 0x8A4, AICA_TCR, PORT_MRW, 0, "AICA Timer Control?" ) nkeynes@46: BYTE_PORT( 0x8A8, AICA_UNK3, PORT_MRW, 0, "AICA ??? 3" ) nkeynes@46: BYTE_PORT( 0x8AC, AICA_UNK4, PORT_MRW, 0, "AICA ??? 4" ) nkeynes@46: BYTE_PORT( 0x8B0, AICA_UNK5, PORT_MRW, 0, "AICA ??? 5" ) nkeynes@86: LONG_PORT( 0xC00, AICA_RESET,PORT_MRW, 1, "AICA reset" ) nkeynes@62: LONG_PORT( 0xD00, AICA_IRQ, PORT_MR, 0, "AICA IRQ Pending" ) nkeynes@61: LONG_PORT( 0xD04, AICA_IRQCLEAR, PORT_MRW, 0, "AICA IRQ Clear" ) nkeynes@11: MMIO_REGION_END nkeynes@11: nkeynes@131: MMIO_REGION_BEGIN( 0x00710000, AICARTC, "AICA Sound System RTC" ) nkeynes@131: LONG_PORT( 0x000, AICA_RTCHI, PORT_R, 0, "RTC High 16-bits" ) nkeynes@131: LONG_PORT( 0x004, AICA_RTCLO, PORT_R, 0, "RTC Low 16-bits" ) nkeynes@131: MMIO_REGION_END nkeynes@131: nkeynes@11: MMIO_REGION_LIST_BEGIN( spu ) nkeynes@11: MMIO_REGION( AICA0 ) nkeynes@11: MMIO_REGION( AICA1 ) nkeynes@11: MMIO_REGION( AICA2 ) nkeynes@131: MMIO_REGION( AICARTC ) nkeynes@11: MMIO_REGION_LIST_END nkeynes@11: nkeynes@11: void aica_init( void ); nkeynes@11: void aica_reset( void ); nkeynes@86: void aica_enable( void ); nkeynes@61: nkeynes@61: #define AICA_EVENT_TIMER 2 nkeynes@61: #define AICA_EVENT_OTHER 5 nkeynes@61: nkeynes@61: void aica_event( int event ); nkeynes@66: void aica_write_channel( int channel, uint32_t addr, uint32_t val ); nkeynes@66: nkeynes@66: /** nkeynes@66: * The AICA core runs at 44100 samples/second, regardless of what we're nkeynes@66: * actually outputing. nkeynes@66: */ nkeynes@66: #define AICA_SAMPLE_RATE 44100 nkeynes@66: nkeynes@66: /** nkeynes@66: * This is only used to determine number of instructions to execute nkeynes@66: * per sample, which isn't cycle accurate at the moment. nkeynes@66: */ nkeynes@66: #define AICA_SAMPLE_PERIOD (1000000000 / 44100)