// 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); }
// 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; }
// 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)); }
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);