Beispiel #1
0
// Generic jmpr implementation
// JMPcc $R
// 0001 0111 rrr0 cccc
// Jump to address; set program counter to a value from register $R.
void jmprcc(const UDSPInstruction opc)
{
	if (CheckCondition(opc & 0xf))
	{
		u8 reg = (opc >> 5) & 0x7;
		g_dsp.pc = dsp_op_read_reg(reg);
	}
Beispiel #2
0
// Generic callr implementation
// CALLRcc $R
// 0001 0111 rrr1 cccc
// Call function if condition cc has been met. Push program counter of
// instruction following "call" to call stack $st0. Set program counter to
// register $R.
void callr(const UDSPInstruction opc)
{
	if (CheckCondition(opc & 0xf))
	{
		u8 reg  = (opc >> 5) & 0x7;
		u16 addr = dsp_op_read_reg(reg);
		dsp_reg_store_stack(DSP_STACK_C, g_dsp.pc);
		g_dsp.pc = addr;
	}
Beispiel #3
0
// SR @M, $S
// 0000 0000 111s ssss
// mmmm mmmm mmmm mmmm
// Store value from register $S to a memory pointed by address M.
void sr(const UDSPInstruction opc)
{
	u8 reg = opc & DSP_REG_MASK;
	u16 addr = dsp_fetch_code();

	if (reg >= DSP_REG_ACM0)
		dsp_dmem_write(addr, dsp_op_read_reg_and_saturate(reg - DSP_REG_ACM0));
	else
		dsp_dmem_write(addr, dsp_op_read_reg(reg));
}
Beispiel #4
0
void si(const UDSPInstruction opc)
{
	u16 addr = (s8)opc;
	u16 imm = dsp_fetch_code();
	dsp_dmem_write(addr, imm);
}

// LRR $D, @$S
// 0001 1000 0ssd dddd
// Move value from data memory pointed by addressing register $S to register $D.
void lrr(const UDSPInstruction opc)
{
	u8 sreg = (opc >> 5) & 0x3;
	u8 dreg = opc & 0x1f;

	u16 val = dsp_dmem_read(dsp_op_read_reg(sreg));
	dsp_op_write_reg(dreg, val);
	dsp_conditional_extend_accum(dreg);
}

// LRRD $D, @$S
// 0001 1000 1ssd dddd
// Move value from data memory pointed by addressing register $S toregister $D.
// Decrement register $S.
void lrrd(const UDSPInstruction opc)
{
	u8 sreg = (opc >> 5) & 0x3;
	u8 dreg = opc & 0x1f;

	u16 val = dsp_dmem_read(dsp_op_read_reg(sreg));
	dsp_op_write_reg(dreg, val);