DSP Memory Region

Revision as of 16:27, 16 February 2016 by Neobrain (talk | contribs)

Some of this is known to be incorrect. I'll correct this in a few months after a bit more RE work. Merry (talk) 21:10, 28 January 2016 (CET)



The DSP communicates with userland through memory locations 0x1ff40000-0x1ff77fff. Within this region are two areas of structures that are exact duplicates of each other. The DSP alternates between the use of these two areas (much like a double-buffer). Each area has 15 structures within it. The location of these structures can be obtained by reading pipe 2.

The mixer has 24 channels, each of which are individually configurable.

Structure Number DSP memory address Size Description
5 0x8400 0x20 Status (?)
9 0x8410 0x260 Debug (?)
6 0x8540 0x280 Loopback Samples (PCM16)
2 0x8680 0x120 Channel Status (x24)
8 0x9710 0x1A40 ?
4 0x9430 0xC4 Main Configuration
7 0x9492 0x1400 ?
1 0x9e92 0x1200 Channel Config (x24)
3 0x9430 0x300 GC-ADPCM Coefficients (x24)
10 0xa912 0x200
11 0xaa12 0x180
12 0xaad2 0x300
13 0xac52 0x14
14 0xac5c 0x2476 -
0 0xbfff 0x2 Frame Counter

Channel Config

A 192 byte long structure. There are 24 of them.

Offset Type Description
0 u32 Dirty flags
4 70 bytes TODO
74 u16 Bitmap of which buffers in queue are dirty
76 Buffer[4] Buffer queue
156 u32 -
160 u16 Is Active
162 u16 Sync Count
164 8 TODO
172 u32 Physical address of current buffer
176 u32 Number of samples in current buffer
180 u16 bits[0:1]: 1 = mono, 2 = stereo; bits[2:3]: buffer format
182 u16 ADPCM predictor
184 s16 ADPCM yn1
186 s16 ADPCM yn2
188 u16 bit[0]: Has ADPCM data?; bit[1]: Is looping?
190 u16 Buffer Id of this current buffer

Buffer

Offset Type Description
0 u32 Physical Address
4 u32 Sample Count
8 u16 ADPCM P/S
10 s16[2] ADPCM yn[1,2]
14 u8 Has ADPCM?
15 u8 Looping?
16 u16 Buffer Id
18 u16 -

Dirty Bits

Bit What Changed
3 ADPCM Coefficients
5 Embedded buffer
13 Is Active
18 Interpolation Type
19 Rate
20 Buffer Queue
22 Embedded buffer
23 IRR Filter Type
25 Sync Count
26-28 Mix
30 First time init
31 Embedded Buffer