summaryrefslogtreecommitdiff
path: root/docs/DSP/AX.c
blob: 87a30e46aa102b18e89cff2d0fad9257c40f4dfb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
//
// Pseudo C
//

//
// DSP:
//

// Memory USAGE



0x0B80 to 0x0C40			CurrentPB

0x0B87

0x0E15						SrcSelectFunction      // perhaps CMD0 setups some kind of jmp table at this addresses
0x0E16						CoefFunction
0x0E14						MixCtrlFunction

0x0e17						TmpBuffer exceptions
0x0e18						TmpBuffer exceptions
0x0e19						TmpBuffer exceptions

// instrcution memory
0x0B31 to 0x0B33			some kind of JMP-Table to handle srcSelect ???
0x0B34 to 0x0B36			some kind of JMP-Table to handle coefSelect ???
0x0B11 to 0x0B1F			some kind of JMP-Table to handle mixerCtrl ???

void CMD2()
{
// 0x1BC
	int_addrPB = (*r00 << 16) | *(r00+1)
	DMA_From_Memory(0x0B80, _addrPB, 0xC0);   // read first PB to 0x0B80
	
// 0x1C7	
	*0x0E08 = 0x0000
	*0x0E09 = 0x0140
	*0x0E0A = 0x0280
	*0x0E0B = 0x0400
	*0x0E0C = 0x0540
	*0x0E0D = 0x0680
	*0x0E0E = 0x07C0
	*0x0E0F = 0x0900
	*0x0E10 = 0x0A40

// 0x1E4
	WaitForDMATransfer()
	
// 0x1E6		
	Addr = (*0x0BA7 << 16) | *0x0BA8			
	DMA_From_Memory(0x03C0, Addr, 0x80);	// Copy Update Data to 0x03C0  (AXPBUPDATE dataHi, dataLo)
	
// 0x1F4	
	R03 = (*0x0B84) + 0x0B31		// AXPB->srcSelect + 0x0B31 ??? some kind of flag handling ??? SRCSEL can be 0x0 to 0x2
	AC0.M = *R03
	*0x0E15 = *AC0.M
	
// 0x1FD	
	R03 = (*0x0B85) + 0x0B34		// AXPB->coefSelect + 0x0B34 ??? some kind of flag handling ??? COEF can be 0x0 to 0x2
	AC0.M = *R03
	*0x0E16 = *AC0.M

// 0x206
	R03 = (*0x0B86) + 0x0B11		// AXPB->mixerCtrl + 0x0B36 ??? some kind of flag handling ???	MIXCTRL can be 0x0 to 0xE 
	AC0.M = *R03
	*0x0E14 = *AC0.M
	
// 0x20F	
	if (*0x0B9B == 0)						// AXPBITD->flag  (on or off for this voice)
	{
		// jmp to 0x23a
		*0x0E42 = 0x0CE0
		*0x0E40 = 0x0CE0
		*0x0E41 = 0x0CE0
		*0x0E43 = 0x0CE0	
		
		WaitForDMATransfer()
	}
	else
	{
		// code at 0x216
		*0x0E40 = *0x0B9E + 0x0CC0		// AXPBITD->shiftL
		*0x0E41 = *0x0B9F + 0x0CC0		// AXPBITD->shiftR
		*0x0E42 = 0xCE0
		*0x0E43 = 0xCE0
		
		WaitForDMATransfer()
		
		// 0x22a
		Addr = (*0x0B9C << 16) | *0x0B9D	
		DMA_From_Memory(0x0CC0, Addr, 0x40);		// (AXPBITD->bufferHi << 16 | AXPBITD->bufferLo) -> 0xCC0
		WaitForDMATransfer()
	}

}

void CMD0()
{
	
}


void CMD3()
{

	0x0E07 = R00
	R00 = 0x0BA2		// AXPBUPDATE->updNum
	R01 = 0x03C0
	*0x0E04 = 0x05
	
	AC1 = 0
	AC0 = 0
	AX0.H = *R00++   // AXPBUPDATE->updNum[0]
	AC1.M = 0x0B80

// 0x256
	for (i=0; i<AX0.H; i++)
	{
		AC0.M = *R01++
		AC0.M = AC0.M + AC1.M
		AX1.L = *R01++
		R02 = AC0.M
		*R02 = AX1.L
	}
	
// 0x25c
	R03 = 0x0E05
	*R03++ = R01
	*R03++ = R02
	
// 0x260
	AC0.M = *0x0B87   // AXPB->state

	if (AC0.M == 1)
	{
		// JMP 0x267 (AX_PB_STATE_RUN)
		*0x0E1C = *0x0E42
		
		CALLR *0x0E15   // Load Sample (SrcSelectFunction)
		
		// 0x270
		AC0.M = *0xBB3 	// AXPBVE->currentDelta		(.15 volume at start of frame)
		AC1.M = *0xBB2	// AXPBVE->currentVolume
		
		//  0x278
		AX0.L = AC1.M
		AC1.M = AC1.M + AC0.M
		AC0.M = AC0.M << 1
		
		SET15 // ????
		
		AX1.H = AC0.M
		AC0.M = AX0.L
		
		AX0.L = 0x8000
		R00 = 0x0E44
		
// 0x27f
		// scale volume table
		.
		.
		.
/*		for (int i=0; i<32; i++)
		{
			*R00++ = AC0.M; 			
			prod = AX0.L * AX1.H
			
			*R00++ = AC1.M; 
			AC0 = AC0 + prod
			prod = AX0.L * AX1.H

			*R00++ = AC0.M; 
			AC1 = AC1 + prod
			prod = AX0.L * AX1.H					
		}*/
				
// 0x29f
		*0xBB2 = CurrentVolume
		
		
// 0x2a1
		// mutiply volume with sample
		.
		.
		.
		
		
// 0x2ea
	// Call mixer
	
// 0x02f0

		
				
	}
	else
	{
		// JMP 0x332
		.
		.
		.
		.
	}

}

// ===============================================================
void Func_0x065D()
{
	
	
}