4 * This module implements the AICA's IO interfaces, as well
5 * as providing the core AICA module to the system.
7 * Copyright (c) 2005 Nathan Keynes.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
20 #define MODULE aica_module
24 #include "dreamcast.h"
26 #include "aica/aica.h"
28 #include "aica/audio.h"
32 MMIO_REGION_READ_DEFFN( AICA0 )
33 MMIO_REGION_READ_DEFFN( AICA1 )
34 MMIO_REGION_READ_DEFSUBFNS(AICA0)
35 MMIO_REGION_READ_DEFSUBFNS(AICA1)
36 MMIO_REGION_READ_DEFSUBFNS(AICA2)
37 MMIO_REGION_READ_DEFSUBFNS(AICARTC)
39 void aica_init( void );
40 void aica_reset( void );
41 void aica_start( void );
42 void aica_stop( void );
43 void aica_save_state( FILE *f );
44 int aica_load_state( FILE *f );
45 uint32_t aica_run_slice( uint32_t );
47 struct dreamcast_module aica_module = { "AICA", aica_init, aica_reset,
48 aica_start, aica_run_slice, aica_stop,
49 aica_save_state, aica_load_state };
51 struct aica_state_struct {
54 * Keep track of what we've done so far this second, to try to keep the
55 * precision of samples/second.
57 uint32_t samples_done;
58 uint32_t nanosecs_done;
66 static struct aica_state_struct aica_state;
70 * Initialize the AICA subsystem. Note requires that
72 void aica_init( void )
74 register_io_regions( mmio_list_spu );
80 void aica_reset( void )
83 aica_state.time_of_day = 0x5bfc8900;
84 aica_state.samples_done = 0;
85 aica_state.nanosecs_done = 0;
86 aica_state.event_pending = 0;
87 aica_state.clear_count = 0;
88 // aica_event(2); /* Pre-deliver a timer interrupt */
91 void aica_start( void )
96 uint32_t aica_run_slice( uint32_t nanosecs )
98 /* Run arm instructions */
99 int reset = MMIO_READ( AICA2, AICA_RESET );
100 if( (reset & 1) == 0 ) { /* Running */
101 int num_samples = (int)((uint64_t)AICA_SAMPLE_RATE * (aica_state.nanosecs_done + nanosecs) / 1000000000) - aica_state.samples_done;
102 num_samples = arm_run_slice( num_samples );
103 audio_mix_samples( num_samples );
105 aica_state.samples_done += num_samples;
106 aica_state.nanosecs_done += nanosecs;
108 if( aica_state.nanosecs_done > 1000000000 ) {
109 aica_state.samples_done -= AICA_SAMPLE_RATE;
110 aica_state.nanosecs_done -= 1000000000;
111 aica_state.time_of_day++;
116 void aica_stop( void )
121 void aica_save_state( FILE *f )
123 fwrite( &aica_state, sizeof(struct aica_state_struct), 1, f );
128 int aica_load_state( FILE *f )
130 fread( &aica_state, sizeof(struct aica_state_struct), 1, f );
132 return audio_load_state(f);
135 /* Note: This is probably not necessarily technically correct but it should
136 * work in the meantime.
139 void aica_event( int event )
141 if( aica_state.event_pending == 0 )
142 armr.int_pending |= CPSR_F;
143 aica_state.event_pending |= (1<<event);
145 int pending = MMIO_READ( AICA2, AICA_IRQ );
146 if( pending == 0 || event < pending )
147 MMIO_WRITE( AICA2, AICA_IRQ, event );
150 void aica_clear_event( )
152 aica_state.clear_count++;
153 if( aica_state.clear_count == 4 ) {
155 aica_state.clear_count = 0;
157 for( i=0; i<8; i++ ) {
158 if( aica_state.event_pending & (1<<i) ) {
159 aica_state.event_pending &= ~(1<<i);
164 if( aica_state.event_pending & (1<<i) ) {
165 MMIO_WRITE( AICA2, AICA_IRQ, i );
169 if( aica_state.event_pending == 0 )
170 armr.int_pending &= ~CPSR_F;
174 void aica_enable( void )
176 mmio_region_AICA2_write( AICA_RESET, MMIO_READ(AICA2,AICA_RESET) & ~1 );
179 /** Channel register structure:
180 * 00 4 Channel config
181 * 04 4 Waveform address lo (16 bits)
182 * 08 4 Loop start address
183 * 0C 4 Loop end address
184 * 10 4 Volume envelope
186 * 18 4 Frequency (floating point)
199 /* Write to channels 0-31 */
200 MMIO_REGION_WRITE_FN( AICA0, reg, val )
203 MMIO_WRITE( AICA0, reg, val );
204 aica_write_channel( reg >> 7, reg % 128, val );
205 // DEBUG( "AICA0 Write %08X => %08X", val, reg );
208 /* Write to channels 32-64 */
209 MMIO_REGION_WRITE_FN( AICA1, reg, val )
212 MMIO_WRITE( AICA1, reg, val );
213 aica_write_channel( (reg >> 7) + 32, reg % 128, val );
214 // DEBUG( "AICA1 Write %08X => %08X", val, reg );
218 * AICA control registers
220 MMIO_REGION_WRITE_FN( AICA2, reg, val )
227 tmp = MMIO_READ( AICA2, AICA_RESET );
228 if( (tmp & 1) == 1 && (val & 1) == 0 ) {
229 /* ARM enabled - execute a core reset */
230 DEBUG( "ARM enabled" );
232 aica_state.samples_done = 0;
233 aica_state.nanosecs_done = 0;
234 } else if( (tmp&1) == 0 && (val&1) == 1 ) {
235 DEBUG( "ARM disabled" );
237 MMIO_WRITE( AICA2, AICA_RESET, val );
242 case AICA_FIFOIN: /* Read-only */
245 MMIO_WRITE( AICA2, reg, val );
250 MMIO_REGION_READ_FN( AICA2, reg )
252 audio_channel_t channel;
258 channo = (MMIO_READ( AICA2, AICA_CHANSEL ) >> 8) & 0x3F;
259 channel = audio_get_channel(channo);
260 if( channel->loop == LOOP_LOOPED ) {
262 channel->loop = LOOP_ON;
268 channo = (MMIO_READ( AICA2, AICA_CHANSEL ) >> 8) & 0x3F;
269 channel = audio_get_channel(channo);
270 return channel->posn;
272 return MMIO_READ( AICA2, reg );
276 MMIO_REGION_READ_FN( AICARTC, reg )
282 rv = (aica_state.time_of_day >> 16) & 0xFFFF;
285 rv = aica_state.time_of_day & 0xFFFF;
288 // DEBUG( "Read AICA RTC %d => %08X", reg, rv );
292 MMIO_REGION_WRITE_FN( AICARTC, reg, val )
297 MMIO_WRITE( AICARTC, reg, val&0x01 );
300 if( MMIO_READ( AICARTC, AICA_RTCEN ) & 0x01 ) {
301 aica_state.time_of_day = (aica_state.time_of_day & 0xFFFF0000) | (val & 0xFFFF);
305 if( MMIO_READ( AICARTC, AICA_RTCEN ) & 0x01 ) {
306 aica_state.time_of_day = (aica_state.time_of_day & 0xFFFF) | (val<<16);
307 MMIO_WRITE( AICARTC, AICA_RTCEN, 0 );
314 * Translate the channel frequency to a sample rate. The frequency is a
315 * 14-bit floating point number, where bits 0..9 is the mantissa,
316 * 11..14 is the signed exponent (-8 to +7). Bit 10 appears to
319 * @return sample rate in samples per second.
321 uint32_t aica_frequency_to_sample_rate( uint32_t freq )
323 uint32_t exponent = (freq & 0x3800) >> 11;
324 uint32_t mantissa = freq & 0x03FF;
326 if( freq & 0x4000 ) {
327 /* neg exponent - rate < 44100 */
328 exponent = 8 - exponent;
329 rate = (44100 >> exponent) +
330 ((44100 * mantissa) >> (10+exponent));
332 /* pos exponent - rate > 44100 */
333 rate = (44100 << exponent) +
334 ((44100 * mantissa) >> (10-exponent));
339 void aica_start_stop_channels()
342 for( i=0; i<32; i++ ) {
343 uint32_t val = MMIO_READ( AICA0, i<<7 );
344 audio_start_stop_channel(i, val&0x4000);
347 uint32_t val = MMIO_READ( AICA1, (i-32)<<7 );
348 audio_start_stop_channel(i, val&0x4000);
353 * Derived directly from Dan Potter's log table
355 uint8_t aica_volume_table[256] = {
356 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
357 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4,
358 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9,
359 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16,
360 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 22, 22, 23, 23, 24, 25,
361 25, 26, 27, 27, 28, 29, 29, 30, 31, 31, 32, 33, 34, 34, 35, 36,
362 37, 37, 38, 39, 40, 40, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49,
363 50, 51, 52, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
364 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 76, 77, 78, 79, 80, 81,
365 82, 83, 85, 86, 87, 88, 89, 90, 92, 93, 94, 95, 97, 98, 99, 100,
366 102, 103, 104, 105, 107, 108, 109, 111, 112, 113, 115, 116, 117, 119, 120, 121,
367 123, 124, 126, 127, 128, 130, 131, 133, 134, 136, 137, 139, 140, 142, 143, 145,
368 146, 148, 149, 151, 152, 154, 155, 157, 159, 160, 162, 163, 165, 167, 168, 170,
369 171, 173, 175, 176, 178, 180, 181, 183, 185, 187, 188, 190, 192, 194, 195, 197,
370 199, 201, 202, 204, 206, 208, 210, 211, 213, 215, 217, 219, 221, 223, 224, 226,
371 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 253, 254, 255 };
374 void aica_write_channel( int channelNo, uint32_t reg, uint32_t val )
377 audio_channel_t channel = audio_get_channel(channelNo);
379 case 0x00: /* Config + high address bits*/
380 channel->start = (channel->start & 0xFFFF) | ((val&0x1F) << 16);
382 channel->loop = LOOP_ON;
384 channel->loop = LOOP_OFF;
385 switch( (val >> 7) & 0x03 ) {
387 channel->sample_format = AUDIO_FMT_16BIT;
390 channel->sample_format = AUDIO_FMT_8BIT;
394 channel->sample_format = AUDIO_FMT_ADPCM;
398 aica_start_stop_channels();
401 case 0x04: /* Low 16 address bits */
402 channel->start = (channel->start & 0x001F0000) | val;
404 case 0x08: /* Loop start */
405 channel->loop_start = val;
410 case 0x10: /* Envelope register 1 */
412 case 0x14: /* Envelope register 2 */
414 case 0x18: /* Frequency */
415 channel->sample_rate = aica_frequency_to_sample_rate ( val );
419 case 0x24: /* Volume? /pan */
422 val = 0x0F - val; /* Convert to smooth pan over 0..31 */
425 case 0x28: /* Volume */
426 // This isn't remotely correct, but it will have to suffice until I have
427 // time to figure out what's actually going on here...
428 channel->vol = aica_volume_table[max((val & 0xFF),((val>>8)&0xFF))];
.