// LRI $D, #I // 0000 0000 100d dddd // iiii iiii iiii iiii // Load immediate value I to register $D. // // DSPSpy discovery: This, and possibly other instructions that load a // register, has a different behaviour in S40 mode if loaded to AC0.M: The // value gets sign extended to the whole accumulator! This does not happen in // S16 mode. void lri(const UDSPInstruction opc) { u8 reg = opc & DSP_REG_MASK; u16 imm = dsp_fetch_code(); dsp_op_write_reg(reg, imm); dsp_conditional_extend_accum(reg); }
// LR $D, @M // 0000 0000 110d dddd // mmmm mmmm mmmm mmmm // Move value from data memory pointed by address M to register $D. void lr(const UDSPInstruction opc) { u8 reg = opc & DSP_REG_MASK; u16 addr = dsp_fetch_code(); u16 val = dsp_dmem_read(addr); dsp_op_write_reg(reg, val); dsp_conditional_extend_accum(reg); }