| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | /*====================================================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  |    filename:     gdsp_opcodes_helper.h | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  |    project:      GameCube DSP Tool (gcdsp) | 
					
						
							|  |  |  |    created:      2005.03.04 | 
					
						
							|  |  |  |    mail:		  duddie@walla.com | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Copyright (c) 2005 Duddie | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |    modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |    as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  |    of the License, or (at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |    GNU General Public License for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |    along with this program; if not, write to the Free Software | 
					
						
							|  |  |  |    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    ====================================================================*/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-28 10:00:25 +00:00
										 |  |  | #ifndef _DSP_INT_UTIL_H
 | 
					
						
							|  |  |  | #define _DSP_INT_UTIL_H
 | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-12 10:21:40 +00:00
										 |  |  | #include "Common.h"
 | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-01 20:22:43 +00:00
										 |  |  | #include "DSPInterpreter.h"
 | 
					
						
							| 
									
										
										
										
											2009-05-01 20:06:24 +00:00
										 |  |  | #include "DSPCore.h"
 | 
					
						
							| 
									
										
										
										
											2009-06-28 10:00:25 +00:00
										 |  |  | #include "DSPMemoryMap.h"
 | 
					
						
							| 
									
										
										
										
											2009-06-28 10:24:44 +00:00
										 |  |  | #include "DSPStacks.h"
 | 
					
						
							| 
									
										
										
										
											2009-05-01 20:06:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 19:19:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | // ---------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | // --- SR
 | 
					
						
							|  |  |  | // ---------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2010-03-08 21:25:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-05 16:58:15 +00:00
										 |  |  | inline void dsp_SR_set_flag(int flag) | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-07-02 21:20:47 +00:00
										 |  |  | 	g_dsp.r[DSP_REG_SR] |= flag; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-05 16:58:15 +00:00
										 |  |  | inline bool dsp_SR_is_flag_set(int flag) | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-07-02 21:20:47 +00:00
										 |  |  | 	return (g_dsp.r[DSP_REG_SR] & flag) != 0; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 21:25:35 +00:00
										 |  |  | // ---------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | // --- AR increments, decrements
 | 
					
						
							|  |  |  | // ---------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2009-05-01 22:17:22 +00:00
										 |  |  | // HORRIBLE UGLINESS, someone please fix.
 | 
					
						
							|  |  |  | // See http://code.google.com/p/dolphin-emu/source/detail?r=3125
 | 
					
						
							| 
									
										
										
										
											2010-03-08 21:25:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-01 22:17:22 +00:00
										 |  |  | inline u16 ToMask(u16 a) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	a = a | (a >> 8); | 
					
						
							|  |  |  | 	a = a | (a >> 4); | 
					
						
							|  |  |  | 	a = a | (a >> 2); | 
					
						
							|  |  |  | 	return a | (a >> 1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-15 20:01:44 +00:00
										 |  |  | inline s16 dsp_increment_addr_reg(int reg, s16 value) | 
					
						
							| 
									
										
										
										
											2009-05-01 22:17:22 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	u16 tmb = ToMask(g_dsp.r[DSP_REG_WR0 + reg]); | 
					
						
							| 
									
										
										
										
											2009-08-19 21:37:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-15 20:01:44 +00:00
										 |  |  | 	if ((value & tmb) == tmb) | 
					
						
							|  |  |  | 		value ^= g_dsp.r[DSP_REG_WR0 + reg]; | 
					
						
							| 
									
										
										
										
											2009-08-19 21:37:24 +00:00
										 |  |  | 	else | 
					
						
							| 
									
										
										
										
											2010-04-15 20:01:44 +00:00
										 |  |  | 		value++; | 
					
						
							| 
									
										
										
										
											2009-08-19 21:37:24 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2010-04-15 20:01:44 +00:00
										 |  |  | 	return value; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | inline s16 dsp_increment_addr_reg(int reg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return dsp_increment_addr_reg(reg, g_dsp.r[reg]); | 
					
						
							| 
									
										
										
										
											2009-05-01 22:17:22 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-28 10:00:25 +00:00
										 |  |  | // See http://code.google.com/p/dolphin-emu/source/detail?r=3125
 | 
					
						
							| 
									
										
										
										
											2010-04-15 20:01:44 +00:00
										 |  |  | inline s16 dsp_decrement_addr_reg(int reg, s16 value) | 
					
						
							| 
									
										
										
										
											2009-06-28 10:00:25 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	// This one is easy. Looks like a hw implementation. Increment is worse...
 | 
					
						
							| 
									
										
										
										
											2010-04-15 20:01:44 +00:00
										 |  |  | 	if ((value & g_dsp.r[DSP_REG_WR0 + reg]) == 0) | 
					
						
							|  |  |  | 		value |= g_dsp.r[DSP_REG_WR0 + reg]; | 
					
						
							| 
									
										
										
										
											2009-06-28 10:00:25 +00:00
										 |  |  | 	else | 
					
						
							| 
									
										
										
										
											2010-04-15 20:01:44 +00:00
										 |  |  | 		value--; | 
					
						
							| 
									
										
										
										
											2009-08-19 21:37:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-15 20:01:44 +00:00
										 |  |  | 	return value; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | inline s16 dsp_decrement_addr_reg(int reg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return dsp_decrement_addr_reg(reg, g_dsp.r[reg]); | 
					
						
							| 
									
										
										
										
											2009-06-28 10:00:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-20 22:09:54 +00:00
										 |  |  | inline s16 dsp_increase_addr_reg(int reg, s16 value) | 
					
						
							| 
									
										
										
										
											2009-06-21 06:56:44 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-04-15 20:01:44 +00:00
										 |  |  | 	s16 tmp = g_dsp.r[reg]; | 
					
						
							| 
									
										
										
										
											2009-08-19 21:37:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-21 06:56:44 +00:00
										 |  |  | 	// TODO: DO RIGHT!
 | 
					
						
							|  |  |  | 	if (value > 0) { | 
					
						
							|  |  |  | 		for (int i = 0; i < value; i++) { | 
					
						
							| 
									
										
										
										
											2009-08-19 21:37:24 +00:00
										 |  |  | 			tmp = dsp_increment_addr_reg(reg, tmp); | 
					
						
							| 
									
										
										
										
											2009-06-21 06:56:44 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} else if (value < 0) { | 
					
						
							|  |  |  | 		for (int i = 0; i < (int)(-value); i++) { | 
					
						
							| 
									
										
										
										
											2009-08-19 21:37:24 +00:00
										 |  |  | 			tmp = dsp_decrement_addr_reg(reg, tmp); | 
					
						
							| 
									
										
										
										
											2009-06-21 06:56:44 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-04-15 20:01:44 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-08-19 21:37:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return tmp; | 
					
						
							| 
									
										
										
										
											2009-06-21 06:56:44 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 21:25:35 +00:00
										 |  |  | inline s16 dsp_decrease_addr_reg(int reg, s16 value) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-04-15 20:01:44 +00:00
										 |  |  | 	s16 tmp = g_dsp.r[reg]; | 
					
						
							| 
									
										
										
										
											2010-03-08 21:25:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// TODO: DO RIGHT!
 | 
					
						
							|  |  |  | 	if (value > 0) { | 
					
						
							|  |  |  | 		for (int i = 0; i < value; i++) { | 
					
						
							|  |  |  | 			tmp = dsp_decrement_addr_reg(reg, tmp); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else if (value < 0) { | 
					
						
							|  |  |  | 		for (int i = 0; i < (int)(-value); i++) { | 
					
						
							|  |  |  | 			tmp = dsp_increment_addr_reg(reg, tmp); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-04-15 20:01:44 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-03-08 21:25:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return tmp; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-05-01 22:17:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | // ---------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | // --- reg
 | 
					
						
							|  |  |  | // ---------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-18 17:53:15 +00:00
										 |  |  | inline u16 dsp_op_read_reg(int reg) | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-21 08:53:36 +00:00
										 |  |  | 	switch (reg & 0x1f) { | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | 	case DSP_REG_ST0: | 
					
						
							|  |  |  | 	case DSP_REG_ST1: | 
					
						
							|  |  |  | 	case DSP_REG_ST2: | 
					
						
							|  |  |  | 	case DSP_REG_ST3: | 
					
						
							| 
									
										
										
										
											2009-05-01 20:06:24 +00:00
										 |  |  | 		return dsp_reg_load_stack(reg - 0x0c); | 
					
						
							| 
									
										
										
										
											2009-04-21 08:53:36 +00:00
										 |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2009-05-01 20:06:24 +00:00
										 |  |  | 		return g_dsp.r[reg]; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-18 17:53:15 +00:00
										 |  |  | inline void dsp_op_write_reg(int reg, u16 val) | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-21 08:53:36 +00:00
										 |  |  | 	switch (reg & 0x1f) { | 
					
						
							| 
									
										
										
										
											2009-05-01 20:06:24 +00:00
										 |  |  | 	// 8-bit sign extended registers. Should look at prod.h too...
 | 
					
						
							| 
									
										
										
										
											2009-05-01 19:07:29 +00:00
										 |  |  | 	case DSP_REG_ACH0: | 
					
						
							|  |  |  | 	case DSP_REG_ACH1: | 
					
						
							|  |  |  | 		// sign extend from the bottom 8 bits.
 | 
					
						
							|  |  |  | 		g_dsp.r[reg] = (u16)(s16)(s8)(u8)val; | 
					
						
							|  |  |  | 		break; | 
					
						
							| 
									
										
										
										
											2009-05-01 20:06:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-12 00:38:54 +00:00
										 |  |  | 	case DSP_REG_ACM0: | 
					
						
							|  |  |  | 	case DSP_REG_ACM1: | 
					
						
							|  |  |  | 		g_dsp.r[reg] = val; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-01 20:06:24 +00:00
										 |  |  | 	// Stack registers.
 | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | 	case DSP_REG_ST0: | 
					
						
							|  |  |  | 	case DSP_REG_ST1: | 
					
						
							|  |  |  | 	case DSP_REG_ST2: | 
					
						
							|  |  |  | 	case DSP_REG_ST3: | 
					
						
							| 
									
										
										
										
											2009-04-21 08:53:36 +00:00
										 |  |  | 		dsp_reg_store_stack(reg - 0x0c, val); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-01 19:07:29 +00:00
										 |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2009-04-21 08:53:36 +00:00
										 |  |  | 		g_dsp.r[reg] = val; | 
					
						
							|  |  |  | 		break; | 
					
						
							| 
									
										
										
										
											2009-05-01 19:07:29 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-04-21 08:53:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-18 17:53:15 +00:00
										 |  |  | inline void dsp_conditional_extend_accum(int reg)  | 
					
						
							| 
									
										
										
										
											2009-05-01 19:07:29 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	switch (reg)  | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	case DSP_REG_ACM0: | 
					
						
							|  |  |  | 	case DSP_REG_ACM1: | 
					
						
							|  |  |  | 		if (g_dsp.r[DSP_REG_SR] & SR_40_MODE_BIT) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			// Sign extend into whole accum.
 | 
					
						
							|  |  |  | 			u16 val = g_dsp.r[reg]; | 
					
						
							|  |  |  | 			g_dsp.r[reg - DSP_REG_ACM0 + DSP_REG_ACH0] = (val & 0x8000) ? 0xFFFF : 0x0000; | 
					
						
							|  |  |  | 			g_dsp.r[reg - DSP_REG_ACM0 + DSP_REG_ACL0] = 0; | 
					
						
							| 
									
										
										
										
											2009-04-21 08:53:36 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ---------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | // --- prod
 | 
					
						
							|  |  |  | // ---------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-30 03:27:31 +00:00
										 |  |  | inline s64 dsp_get_long_prod() | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | #if PROFILE
 | 
					
						
							|  |  |  | 	ProfilerAddDelta(g_dsp.err_pc, 1); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 19:39:11 +00:00
										 |  |  | 	s64 val   = (s8)g_dsp.r[DSP_REG_PRODH]; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | 	val <<= 32; | 
					
						
							| 
									
										
										
										
											2009-08-26 19:39:11 +00:00
										 |  |  | 	s64 low_prod  = g_dsp.r[DSP_REG_PRODM]; | 
					
						
							|  |  |  | 	low_prod += g_dsp.r[DSP_REG_PRODM2]; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | 	low_prod <<= 16; | 
					
						
							| 
									
										
										
										
											2009-08-26 19:39:11 +00:00
										 |  |  | 	low_prod |= g_dsp.r[DSP_REG_PRODL]; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | 	val += low_prod; | 
					
						
							| 
									
										
										
										
											2009-04-05 21:04:46 +00:00
										 |  |  | 	return val; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-19 21:53:41 +00:00
										 |  |  | inline s64 dsp_get_long_prod_round_prodl() | 
					
						
							| 
									
										
										
										
											2010-03-18 00:18:36 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-03-28 17:10:36 +00:00
										 |  |  | 	return (dsp_get_long_prod() + 0x7fff) & ~0xffff; | 
					
						
							| 
									
										
										
										
											2010-03-18 00:18:36 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | // For accurate emulation, this is wrong - but the real prod registers behave
 | 
					
						
							|  |  |  | // in completely bizarre ways. Probably not meaningful to emulate them accurately.
 | 
					
						
							| 
									
										
										
										
											2009-03-30 03:27:31 +00:00
										 |  |  | inline void dsp_set_long_prod(s64 val) | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | #if PROFILE
 | 
					
						
							|  |  |  | 	ProfilerAddDelta(g_dsp.err_pc, 1); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 19:39:11 +00:00
										 |  |  | 	g_dsp.r[DSP_REG_PRODL] = (u16)val; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | 	val >>= 16; | 
					
						
							| 
									
										
										
										
											2009-08-26 19:39:11 +00:00
										 |  |  | 	g_dsp.r[DSP_REG_PRODM] = (u16)val; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | 	val >>= 16; | 
					
						
							| 
									
										
										
										
											2009-08-26 19:39:11 +00:00
										 |  |  | 	g_dsp.r[DSP_REG_PRODH] = (u16)val; | 
					
						
							|  |  |  | 	g_dsp.r[DSP_REG_PRODM2] = 0; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ---------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2009-05-01 20:06:24 +00:00
										 |  |  | // --- ACC - main accumulators (40-bit)
 | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | // ---------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-05 16:58:15 +00:00
										 |  |  | inline s64 dsp_get_long_acc(int reg) | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | #if PROFILE
 | 
					
						
							|  |  |  | 	ProfilerAddDelta(g_dsp.err_pc, 1); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_assert_(reg < 2); | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | 	s64 high = (s64)(s8)g_dsp.r[DSP_REG_ACH0 + reg] << 32; | 
					
						
							|  |  |  | 	u32 mid_low = ((u32)g_dsp.r[DSP_REG_ACM0 + reg] << 16) | g_dsp.r[DSP_REG_ACL0 + reg]; | 
					
						
							| 
									
										
										
										
											2009-04-05 21:04:46 +00:00
										 |  |  | 	return high | mid_low; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-05 16:58:15 +00:00
										 |  |  | inline void dsp_set_long_acc(int _reg, s64 val) | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | #if PROFILE
 | 
					
						
							|  |  |  | 	ProfilerAddDelta(g_dsp.err_pc, 1); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_assert_(_reg < 2); | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | 	g_dsp.r[DSP_REG_ACL0 + _reg] = (u16)val; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | 	val >>= 16; | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | 	g_dsp.r[DSP_REG_ACM0 + _reg] = (u16)val; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | 	val >>= 16; | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | 	g_dsp.r[DSP_REG_ACH0 + _reg] = (u16)(s16)(s8)(u8)val; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-21 10:35:28 +00:00
										 |  |  | inline s64 dsp_convert_long_acc(s64 val) // s64 -> s40
 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return ((s64)(s8)(val >> 32))<<32 | (u32)val; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-05 16:58:15 +00:00
										 |  |  | inline s16 dsp_get_acc_l(int _reg) | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	_assert_(_reg < 2); | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | 	return g_dsp.r[DSP_REG_ACL0 + _reg]; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-05 16:58:15 +00:00
										 |  |  | inline s16 dsp_get_acc_m(int _reg) | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	_assert_(_reg < 2); | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | 	return g_dsp.r[DSP_REG_ACM0 + _reg]; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-05 16:58:15 +00:00
										 |  |  | inline s16 dsp_get_acc_h(int _reg) | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	_assert_(_reg < 2); | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | 	return g_dsp.r[DSP_REG_ACH0 + _reg]; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ---------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2009-05-01 20:06:24 +00:00
										 |  |  | // --- AX - extra accumulators (32-bit)
 | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | // ---------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | inline s32 dsp_get_long_acx(int _reg) | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | #if PROFILE
 | 
					
						
							|  |  |  | 	ProfilerAddDelta(g_dsp.err_pc, 1); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_assert_(_reg < 2); | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | 	return ((u32)g_dsp.r[DSP_REG_AXH0 + _reg] << 16) | g_dsp.r[DSP_REG_AXL0 + _reg]; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-05 16:58:15 +00:00
										 |  |  | inline s16 dsp_get_ax_l(int _reg) | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	_assert_(_reg < 2); | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | 	return (s16)g_dsp.r[DSP_REG_AXL0 + _reg]; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-05 16:58:15 +00:00
										 |  |  | inline s16 dsp_get_ax_h(int _reg) | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	_assert_(_reg < 2); | 
					
						
							| 
									
										
										
										
											2009-05-02 16:15:52 +00:00
										 |  |  | 	return (s16)g_dsp.r[DSP_REG_AXH0 + _reg]; | 
					
						
							| 
									
										
										
										
											2009-03-23 09:10:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |