forked from dolphin-emu/dolphin
		
	
		
			
	
	
		
			213 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			213 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | //
 | ||
|  | // 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() | ||
|  | { | ||
|  | 	 | ||
|  | 	 | ||
|  | } |