From 9915533c3cc8a99de1ff1d3d89ae0301e1a44970 Mon Sep 17 00:00:00 2001 From: "XTra.KrazzY" Date: Wed, 1 Apr 2009 22:03:52 +0000 Subject: [PATCH] LLE-WIP: Indentation and small fixes to coding style. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2821 8ced0084-cf51-0410-be5f-012b33b47a6e --- .../Src/DSPInterpreter.cpp | 2426 ++++++++--------- .../Src/DSPInterpreter.h | 193 +- .../Plugin_DSP_LLE-testing/Src/DSPJit.h | 3 +- .../Plugin_DSP_LLE-testing/Src/DSPTables.cpp | 4 +- .../Plugin_DSP_LLE-testing/Src/DSPTables.h | 10 +- .../Src/disassemble.cpp | 10 +- 6 files changed, 1324 insertions(+), 1322 deletions(-) diff --git a/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.cpp b/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.cpp index 79f0f84000..2445757273 100644 --- a/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.cpp +++ b/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.cpp @@ -28,1346 +28,1346 @@ namespace DSPInterpreter { - // HELPER FUNCTIONS +// HELPER FUNCTIONS - void Update_SR_Register(s64 _Value) +void Update_SR_Register(s64 _Value) +{ + g_dsp.r[R_SR] &= ~SR_CMP_MASK; + + if (_Value < 0) { - g_dsp.r[R_SR] &= ~SR_CMP_MASK; - - if (_Value < 0) - { - g_dsp.r[R_SR] |= 0x8; - } - - if (_Value == 0) - { - g_dsp.r[R_SR] |= 0x4; - } - - // logic - if ((_Value >> 62) == 0) - { - g_dsp.r[R_SR] |= 0x20; - } + g_dsp.r[R_SR] |= 0x8; } - void Update_SR_Register(s16 _Value) + if (_Value == 0) { - g_dsp.r[R_SR] &= ~SR_CMP_MASK; - - if (_Value < 0) - { - g_dsp.r[R_SR] |= 0x8; - } - - if (_Value == 0) - { - g_dsp.r[R_SR] |= 0x4; - } - - // logic - if ((_Value >> 14) == 0) - { - g_dsp.r[R_SR] |= 0x20; - } + g_dsp.r[R_SR] |= 0x4; } - s8 GetMultiplyModifier() + // logic + if ((_Value >> 62) == 0) { - if (g_dsp.r[R_SR] & (1 << 13)) - { - return(1); - } + g_dsp.r[R_SR] |= 0x20; + } +} - return(2); +void Update_SR_Register(s16 _Value) +{ + g_dsp.r[R_SR] &= ~SR_CMP_MASK; + + if (_Value < 0) + { + g_dsp.r[R_SR] |= 0x8; } - bool CheckCondition(u8 _Condition) + if (_Value == 0) { - bool taken = false; + g_dsp.r[R_SR] |= 0x4; + } - switch (_Condition & 0xf) + // logic + if ((_Value >> 14) == 0) + { + g_dsp.r[R_SR] |= 0x20; + } +} + +s8 GetMultiplyModifier() +{ + if (g_dsp.r[R_SR] & (1 << 13)) + { + return(1); + } + + return(2); +} + +bool CheckCondition(u8 _Condition) +{ + bool taken = false; + + switch (_Condition & 0xf) + { + case 0x0: + + if ((!(g_dsp.r[R_SR] & 0x02)) && (!(g_dsp.r[R_SR] & 0x08))) { - case 0x0: - - if ((!(g_dsp.r[R_SR] & 0x02)) && (!(g_dsp.r[R_SR] & 0x08))) - { - taken = true; - } - - break; - - case 0x3: - - if ((g_dsp.r[R_SR] & 0x02) || (g_dsp.r[R_SR] & 0x04) || (g_dsp.r[R_SR] & 0x08)) - { - taken = true; - } - - break; - - // old from duddie - case 0x1: // seems okay - - if ((!(g_dsp.r[R_SR] & 0x02)) && (g_dsp.r[R_SR] & 0x08)) - { - taken = true; - } - - break; - - case 0x2: - - if (!(g_dsp.r[R_SR] & 0x08)) - { - taken = true; - } - - break; - - case 0x4: - - if (!(g_dsp.r[R_SR] & 0x04)) - { - taken = true; - } - - break; - - case 0x5: - - if (g_dsp.r[R_SR] & 0x04) - { - taken = true; - } - - break; - - case 0xc: - - if (!(g_dsp.r[R_SR] & 0x40)) - { - taken = true; - } - - break; - - case 0xd: - - if (g_dsp.r[R_SR] & 0x40) - { - taken = true; - } - - break; - - case 0xf: taken = true; - break; - - default: - // DEBUG_LOG(DSPHLE, "Unknown condition check: 0x%04x\n", _Condition & 0xf); - break; } - return(taken); + break; + + case 0x3: + + if ((g_dsp.r[R_SR] & 0x02) || (g_dsp.r[R_SR] & 0x04) || (g_dsp.r[R_SR] & 0x08)) + { + taken = true; + } + + break; + + // old from duddie + case 0x1: // seems okay + + if ((!(g_dsp.r[R_SR] & 0x02)) && (g_dsp.r[R_SR] & 0x08)) + { + taken = true; + } + + break; + + case 0x2: + + if (!(g_dsp.r[R_SR] & 0x08)) + { + taken = true; + } + + break; + + case 0x4: + + if (!(g_dsp.r[R_SR] & 0x04)) + { + taken = true; + } + + break; + + case 0x5: + + if (g_dsp.r[R_SR] & 0x04) + { + taken = true; + } + + break; + + case 0xc: + + if (!(g_dsp.r[R_SR] & 0x40)) + { + taken = true; + } + + break; + + case 0xd: + + if (g_dsp.r[R_SR] & 0x40) + { + taken = true; + } + + break; + + case 0xf: + taken = true; + break; + + default: + // DEBUG_LOG(DSPHLE, "Unknown condition check: 0x%04x\n", _Condition & 0xf); + break; } - // END OF HELPER FUNCTIONS + return(taken); +} - void unknown(const UDSPInstruction& opc) +// END OF HELPER FUNCTIONS + +void unknown(const UDSPInstruction& opc) +{ + _assert_msg_(MASTER_LOG, !g_dsp.exception_in_progress_hack, "assert while exception"); + ERROR_LOG(DSPHLE, "unknown opcode %d", opc.hex); + g_dsp.pc = g_dsp.err_pc; +} + +void call(const UDSPInstruction& opc) +{ + u16 dest = dsp_fetch_code(); + + if (CheckCondition(opc.hex & 0xf)) { - _assert_msg_(MASTER_LOG, !g_dsp.exception_in_progress_hack, "assert while exception"); - ERROR_LOG(DSPHLE, "unknown opcode %d", opc.hex); - g_dsp.pc = g_dsp.err_pc; + dsp_reg_store_stack(DSP_STACK_C, g_dsp.pc); + g_dsp.pc = dest; + } +} + +void ifcc(const UDSPInstruction& opc) +{ + if (!CheckCondition(opc.hex & 0xf)) + { + dsp_fetch_code(); // skip the next opcode + } +} + +void jcc(const UDSPInstruction& opc) +{ + u16 dest = dsp_fetch_code(); + + if (CheckCondition(opc.hex & 0xf)) + { + g_dsp.pc = dest; + } +} + +// FIXME inside +void jmpa(const UDSPInstruction& opc) +{ + u8 reg; + u16 addr; + + if ((opc.hex & 0xf) != 0xf) + { + // FIXME: Implement + ERROR_LOG(DSPHLE, "dsp jmpa opcode"); } - void call(const UDSPInstruction& opc) - { - u16 dest = dsp_fetch_code(); + reg = (opc.hex >> 5) & 0x7; + addr = dsp_op_read_reg(reg); - if (CheckCondition(opc.hex & 0xf)) - { - dsp_reg_store_stack(DSP_STACK_C, g_dsp.pc); - g_dsp.pc = dest; - } + if (opc.hex & 0x0010) + { + // CALLA + dsp_reg_store_stack(DSP_STACK_C, g_dsp.pc); } - void ifcc(const UDSPInstruction& opc) + g_dsp.pc = addr; +} + +void ret(const UDSPInstruction& opc) +{ + if (CheckCondition(opc.hex & 0xf)) { - if (!CheckCondition(opc.hex & 0xf)) - { - dsp_fetch_code(); // skip the next opcode - } - } - - void jcc(const UDSPInstruction& opc) - { - u16 dest = dsp_fetch_code(); - - if (CheckCondition(opc.hex & 0xf)) - { - g_dsp.pc = dest; - } - } - - // FIXME inside - void jmpa(const UDSPInstruction& opc) - { - u8 reg; - u16 addr; - - if ((opc.hex & 0xf) != 0xf) - { - // FIXME: Implement - ERROR_LOG(DSPHLE, "dsp jmpa opcode"); - } - - reg = (opc.hex >> 5) & 0x7; - addr = dsp_op_read_reg(reg); - - if (opc.hex & 0x0010) - { - // CALLA - dsp_reg_store_stack(DSP_STACK_C, g_dsp.pc); - } - - g_dsp.pc = addr; - } - - void ret(const UDSPInstruction& opc) - { - if (CheckCondition(opc.hex & 0xf)) - { - g_dsp.pc = dsp_reg_load_stack(DSP_STACK_C); - } - } - - // FIXME inside - void rti(const UDSPInstruction& opc) - { - if ((opc.hex & 0xf) != 0xf) - { - // FIXME: Implement - ERROR_LOG(DSPHLE, "dsp rti opcode"); - } - - g_dsp.r[R_SR] = dsp_reg_load_stack(DSP_STACK_D); g_dsp.pc = dsp_reg_load_stack(DSP_STACK_C); + } +} - g_dsp.exception_in_progress_hack = false; +// FIXME inside +void rti(const UDSPInstruction& opc) +{ + if ((opc.hex & 0xf) != 0xf) + { + // FIXME: Implement + ERROR_LOG(DSPHLE, "dsp rti opcode"); } - void halt(const UDSPInstruction& opc) + g_dsp.r[R_SR] = dsp_reg_load_stack(DSP_STACK_D); + g_dsp.pc = dsp_reg_load_stack(DSP_STACK_C); + + g_dsp.exception_in_progress_hack = false; +} + +void halt(const UDSPInstruction& opc) +{ + g_dsp.cr |= 0x4; + g_dsp.pc = g_dsp.err_pc; +} + +void loop(const UDSPInstruction& opc) +{ + u16 reg = opc.hex & 0x1f; + u16 cnt = g_dsp.r[reg]; + u16 loop_pc = g_dsp.pc; + + while (cnt--) { - g_dsp.cr |= 0x4; - g_dsp.pc = g_dsp.err_pc; + gdsp_loop_step(); + g_dsp.pc = loop_pc; } - void loop(const UDSPInstruction& opc) + g_dsp.pc = loop_pc + 1; +} + +void loopi(const UDSPInstruction& opc) +{ + u16 cnt = opc.hex & 0xff; + u16 loop_pc = g_dsp.pc; + + while (cnt--) { - u16 reg = opc.hex & 0x1f; - u16 cnt = g_dsp.r[reg]; - u16 loop_pc = g_dsp.pc; + gdsp_loop_step(); + g_dsp.pc = loop_pc; + } - while (cnt--) - { - gdsp_loop_step(); - g_dsp.pc = loop_pc; - } + g_dsp.pc = loop_pc + 1; +} +void bloop(const UDSPInstruction& opc) +{ + u16 reg = opc.hex & 0x1f; + u16 cnt = g_dsp.r[reg]; + u16 loop_pc = dsp_fetch_code(); + + if (cnt) + { + dsp_reg_store_stack(0, g_dsp.pc); + dsp_reg_store_stack(2, loop_pc); + dsp_reg_store_stack(3, cnt); + } + else + { g_dsp.pc = loop_pc + 1; } +} - void loopi(const UDSPInstruction& opc) +void bloopi(const UDSPInstruction& opc) +{ + u16 cnt = opc.hex & 0xff; + u16 loop_pc = dsp_fetch_code(); + + if (cnt) + { + dsp_reg_store_stack(0, g_dsp.pc); + dsp_reg_store_stack(2, loop_pc); + dsp_reg_store_stack(3, cnt); + } + else { - u16 cnt = opc.hex & 0xff; - u16 loop_pc = g_dsp.pc; - - while (cnt--) - { - gdsp_loop_step(); - g_dsp.pc = loop_pc; - } - g_dsp.pc = loop_pc + 1; } +} - void bloop(const UDSPInstruction& opc) +//------------------------------------------------------------- + +void mrr(const UDSPInstruction& opc) +{ + u8 sreg = opc.hex & 0x1f; + u8 dreg = (opc.hex >> 5) & 0x1f; + + u16 val = dsp_op_read_reg(sreg); + dsp_op_write_reg(dreg, val); +} + +void lrr(const UDSPInstruction& opc) +{ + u8 sreg = (opc.hex >> 5) & 0x3; + u8 dreg = opc.hex & 0x1f; + + u16 val = dsp_dmem_read(g_dsp.r[sreg]); + dsp_op_write_reg(dreg, val); + + // post processing of source reg + switch ((opc.hex >> 7) & 0x3) { - u16 reg = opc.hex & 0x1f; - u16 cnt = g_dsp.r[reg]; - u16 loop_pc = dsp_fetch_code(); + case 0x0: // LRR + break; - if (cnt) + case 0x1: // LRRD + g_dsp.r[sreg]--; + break; + + case 0x2: // LRRI + g_dsp.r[sreg]++; + break; + + case 0x3: + g_dsp.r[sreg] += g_dsp.r[sreg + 4]; + break; + } +} + +void srr(const UDSPInstruction& opc) +{ + u8 dreg = (opc.hex >> 5) & 0x3; + u8 sreg = opc.hex & 0x1f; + + u16 val = dsp_op_read_reg(sreg); + dsp_dmem_write(g_dsp.r[dreg], val); + + // post processing of dest reg + switch ((opc.hex >> 7) & 0x3) + { + case 0x0: // SRR + break; + + case 0x1: // SRRD + g_dsp.r[dreg]--; + break; + + case 0x2: // SRRI + g_dsp.r[dreg]++; + break; + + case 0x3: // SRRX + g_dsp.r[dreg] += g_dsp.r[dreg + 4]; + break; + } +} + +// FIXME inside +void ilrr(const UDSPInstruction& opc) +{ + u16 reg = opc.hex & 0x3; + u16 dreg = 0x1e + ((opc.hex >> 8) & 1); + + // always to acc0 ? + g_dsp.r[dreg] = dsp_imem_read(g_dsp.r[reg]); + + switch ((opc.hex >> 2) & 0x3) + { + case 0x0: // no change + break; + + case 0x1: // post decrement + g_dsp.r[reg]--; + break; + + case 0x2: // post increment + g_dsp.r[reg]++; + break; + + default: + // FIXME: Implement + ERROR_LOG(DSPHLE, "dsp_opc.hex_ilrr"); + } +} + + +void lri(const UDSPInstruction& opc) +{ + u8 reg = opc.hex & DSP_REG_MASK; + u16 imm = dsp_fetch_code(); + dsp_op_write_reg(reg, imm); +} + +void lris(const UDSPInstruction& opc) +{ + u8 reg = ((opc.hex >> 8) & 0x7) + 0x18; + u16 imm = (s8)opc.hex; + dsp_op_write_reg(reg, imm); +} + +void lr(const UDSPInstruction& opc) +{ + u8 reg = opc.hex & DSP_REG_MASK; + u16 addr = dsp_fetch_code(); + u16 val = dsp_dmem_read(addr); + dsp_op_write_reg(reg, val); +} + +void sr(const UDSPInstruction& opc) +{ + u8 reg = opc.hex & DSP_REG_MASK; + u16 addr = dsp_fetch_code(); + u16 val = dsp_op_read_reg(reg); + dsp_dmem_write(addr, val); +} + +void si(const UDSPInstruction& opc) +{ + u16 addr = (s8)opc.hex; + u16 imm = dsp_fetch_code(); + dsp_dmem_write(addr, imm); +} + +void tstaxh(const UDSPInstruction& opc) +{ + u8 reg = (opc.hex >> 8) & 0x1; + s16 val = dsp_get_ax_h(reg); + + Update_SR_Register(val); +} + +void clr(const UDSPInstruction& opc) +{ + u8 reg = (opc.hex >> 11) & 0x1; + + dsp_set_long_acc(reg, 0); + + Update_SR_Register((s64)0); +} + +void clrp(const UDSPInstruction& opc) +{ + g_dsp.r[0x14] = 0x0000; + g_dsp.r[0x15] = 0xfff0; + g_dsp.r[0x16] = 0x00ff; + g_dsp.r[0x17] = 0x0010; +} + +void mulc(const UDSPInstruction& opc) +{ + // math new prod + u8 sreg = (opc.hex >> 11) & 0x1; + u8 treg = (opc.hex >> 12) & 0x1; + + s64 prod = dsp_get_acc_m(sreg) * dsp_get_ax_h(treg) * GetMultiplyModifier(); + dsp_set_long_prod(prod); + + Update_SR_Register(prod); +} + +// TODO: Implement +void mulcmvz(const UDSPInstruction& opc) +{ + ERROR_LOG(DSPHLE, "dsp_opc.hex_mulcmvz ni"); +} + +// TODO: Implement +void mulcmv(const UDSPInstruction& opc) +{ + ERROR_LOG(DSPHLE, "dsp_opc.hex_mulcmv ni"); +} + +void cmpar(const UDSPInstruction& opc) +{ + u8 rreg = ((opc.hex >> 12) & 0x1) + 0x1a; + u8 areg = (opc.hex >> 11) & 0x1; + + // we compare + s64 rr = (s16)g_dsp.r[rreg]; + rr <<= 16; + + s64 ar = dsp_get_long_acc(areg); + + Update_SR_Register(ar - rr); +} + +void cmp(const UDSPInstruction& opc) +{ + s64 acc0 = dsp_get_long_acc(0); + s64 acc1 = dsp_get_long_acc(1); + + Update_SR_Register(acc0 - acc1); +} + +void tsta(const UDSPInstruction& opc) +{ + u8 reg = (opc.hex >> 11) & 0x1; + s64 acc = dsp_get_long_acc(reg); + + Update_SR_Register(acc); +} + +void addaxl(const UDSPInstruction& opc) +{ + u8 sreg = (opc.hex >> 9) & 0x1; + u8 dreg = (opc.hex >> 8) & 0x1; + + s64 acc = dsp_get_long_acc(dreg); + s64 acx = dsp_get_ax_l(sreg); + + acc += acx; + + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + +void addarn(const UDSPInstruction& opc) +{ + u8 dreg = opc.hex & 0x3; + u8 sreg = (opc.hex >> 2) & 0x3; + + g_dsp.r[dreg] += (s16)g_dsp.r[0x04 + sreg]; +} + +void mulcac(const UDSPInstruction& opc) +{ + s64 TempProd = dsp_get_long_prod(); + + // update prod + u8 sreg = (opc.hex >> 12) & 0x1; + s64 Prod = (s64)dsp_get_acc_m(sreg) * (s64)dsp_get_acc_h(sreg) * GetMultiplyModifier(); + dsp_set_long_prod(Prod); + + // update acc + u8 rreg = (opc.hex >> 8) & 0x1; + dsp_set_long_acc(rreg, TempProd); +} + +void movr(const UDSPInstruction& opc) +{ + u8 areg = (opc.hex >> 8) & 0x1; + u8 sreg = ((opc.hex >> 9) & 0x3) + 0x18; + + s64 acc = (s16)g_dsp.r[sreg]; + acc <<= 16; + acc &= ~0xffff; + + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + +void movax(const UDSPInstruction& opc) +{ + u8 sreg = (opc.hex >> 9) & 0x1; + u8 dreg = (opc.hex >> 8) & 0x1; + + g_dsp.r[0x1c + dreg] = g_dsp.r[0x18 + sreg]; + g_dsp.r[0x1e + dreg] = g_dsp.r[0x1a + sreg]; + + if ((s16)g_dsp.r[0x1a + sreg] < 0) + { + g_dsp.r[0x10 + dreg] = 0xffff; + } + else + { + g_dsp.r[0x10 + dreg] = 0; + } + + tsta(UDSPInstruction(dreg << 11)); +} + +void xorr(const UDSPInstruction& opc) +{ + u8 sreg = (opc.hex >> 9) & 0x1; + u8 dreg = (opc.hex >> 8) & 0x1; + + g_dsp.r[0x1e + dreg] ^= g_dsp.r[0x1a + sreg]; + + tsta(UDSPInstruction(dreg << 11)); +} + +void andr(const UDSPInstruction& opc) +{ + u8 sreg = (opc.hex >> 9) & 0x1; + u8 dreg = (opc.hex >> 8) & 0x1; + + g_dsp.r[0x1e + dreg] &= g_dsp.r[0x1a + sreg]; + + tsta(UDSPInstruction(dreg << 11)); +} + +void orr(const UDSPInstruction& opc) +{ + u8 sreg = (opc.hex >> 9) & 0x1; + u8 dreg = (opc.hex >> 8) & 0x1; + + g_dsp.r[0x1e + dreg] |= g_dsp.r[0x1a + sreg]; + + tsta(UDSPInstruction(dreg << 11)); +} + +void andc(const UDSPInstruction& opc) +{ + u8 D = (opc.hex >> 8) & 0x1; + + u16 ac1 = dsp_get_acc_m(D); + u16 ac2 = dsp_get_acc_m(1 - D); + + dsp_set_long_acc(D, ac1 & ac2); + + if ((ac1 & ac2) == 0) + { + g_dsp.r[R_SR] |= 0x20; + } + else + { + g_dsp.r[R_SR] &= ~0x20; + } +} + + +//------------------------------------------------------------- + +// TODO: Implement +void nx(const UDSPInstruction& opc) +{} + + +// FIXME inside +void andfc(const UDSPInstruction& opc) +{ + if (opc.hex & 0xf) + { + // FIXME: Implement + ERROR_LOG(DSPHLE, "dsp_opc.hex_andfc"); + } + + u8 reg = (opc.hex >> 8) & 0x1; + u16 imm = dsp_fetch_code(); + u16 val = dsp_get_acc_m(reg); + + if ((val & imm) == imm) + { + g_dsp.r[R_SR] |= 0x40; + } + else + { + g_dsp.r[R_SR] &= ~0x40; + } +} + +// FIXME inside +void andf(const UDSPInstruction& opc) +{ + u8 reg; + u16 imm; + u16 val; + + if (opc.hex & 0xf) + { + // FIXME: Implement + ERROR_LOG(DSPHLE, "dsp andf opcode"); + } + + reg = 0x1e + ((opc.hex >> 8) & 0x1); + imm = dsp_fetch_code(); + val = g_dsp.r[reg]; + + if ((val & imm) == 0) + { + g_dsp.r[R_SR] |= 0x40; + } + else + { + g_dsp.r[R_SR] &= ~0x40; + } +} + +// FIXME inside +void subf(const UDSPInstruction& opc) +{ + if (opc.hex & 0xf) + { + // FIXME: Implement + ERROR_LOG(DSPHLE, "dsp subf opcode"); + } + + u8 reg = 0x1e + ((opc.hex >> 8) & 0x1); + s64 imm = (s16)dsp_fetch_code(); + + s64 val = (s16)g_dsp.r[reg]; + s64 res = val - imm; + + Update_SR_Register(res); +} + +// FIXME inside +void xori(const UDSPInstruction& opc) +{ + if (opc.hex & 0xf) + { + // FIXME: Implement + ERROR_LOG(DSPHLE, "dsp xori opcode"); + } + + u8 reg = 0x1e + ((opc.hex >> 8) & 0x1); + u16 imm = dsp_fetch_code(); + g_dsp.r[reg] ^= imm; + + Update_SR_Register((s16)g_dsp.r[reg]); +} + +//FIXME inside +void andi(const UDSPInstruction& opc) +{ + if (opc.hex & 0xf) + { + // FIXME: Implement + ERROR_LOG(DSPHLE, "dsp andi opcode"); + } + + u8 reg = 0x1e + ((opc.hex >> 8) & 0x1); + u16 imm = dsp_fetch_code(); + g_dsp.r[reg] &= imm; + + Update_SR_Register((s16)g_dsp.r[reg]); +} + + +// F|RES: i am not sure if this shouldnt be the whole ACC +// +//FIXME inside +void ori(const UDSPInstruction& opc) +{ + if (opc.hex & 0xf) + { + // FIXME: Implement + ERROR_LOG(DSPHLE, "dsp ori opcode"); + return; + } + + u8 reg = 0x1e + ((opc.hex >> 8) & 0x1); + u16 imm = dsp_fetch_code(); + g_dsp.r[reg] |= imm; + + Update_SR_Register((s16)g_dsp.r[reg]); +} + +//------------------------------------------------------------- + +void add(const UDSPInstruction& opc) +{ + u8 areg = (opc.hex >> 8) & 0x1; + s64 acc0 = dsp_get_long_acc(0); + s64 acc1 = dsp_get_long_acc(1); + + s64 res = acc0 + acc1; + + dsp_set_long_acc(areg, res); + + Update_SR_Register(res); +} + +//------------------------------------------------------------- + +void addp(const UDSPInstruction& opc) +{ + u8 dreg = (opc.hex >> 8) & 0x1; + s64 acc = dsp_get_long_acc(dreg); + acc = acc + dsp_get_long_prod(); + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + +void cmpis(const UDSPInstruction& opc) +{ + u8 areg = (opc.hex >> 8) & 0x1; + + s64 acc = dsp_get_long_acc(areg); + s64 val = (s8)opc.hex; + val <<= 16; + + s64 res = acc - val; + + Update_SR_Register(res); +} + +void addpaxz(const UDSPInstruction& opc) +{ + u8 dreg = (opc.hex >> 8) & 0x1; + u8 sreg = (opc.hex >> 9) & 0x1; + + s64 prod = dsp_get_long_prod() & ~0x0ffff; + s64 ax_h = dsp_get_long_acx(sreg); + s64 acc = (prod + ax_h) & ~0x0ffff; + + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + +void movpz(const UDSPInstruction& opc) +{ + u8 dreg = (opc.hex >> 8) & 0x01; + + // overwrite acc and clear low part + s64 prod = dsp_get_long_prod(); + s64 acc = prod & ~0xffff; + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + +void decm(const UDSPInstruction& opc) +{ + u8 dreg = (opc.hex >> 8) & 0x01; + + s64 sub = 0x10000; + s64 acc = dsp_get_long_acc(dreg); + acc -= sub; + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + +void dec(const UDSPInstruction& opc) +{ + u8 dreg = (opc.hex >> 8) & 0x01; + + s64 acc = dsp_get_long_acc(dreg) - 1; + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + +void incm(const UDSPInstruction& opc) +{ + u8 dreg = (opc.hex >> 8) & 0x1; + + s64 sub = 0x10000; + s64 acc = dsp_get_long_acc(dreg); + acc += sub; + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + +void inc(const UDSPInstruction& opc) +{ + u8 dreg = (opc.hex >> 8) & 0x1; + + s64 acc = dsp_get_long_acc(dreg); + acc++; + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + +void neg(const UDSPInstruction& opc) +{ + u8 areg = (opc.hex >> 8) & 0x1; + + s64 acc = dsp_get_long_acc(areg); + acc = 0 - acc; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + +// TODO: Implement +void movnp(const UDSPInstruction& opc) +{ + // UNIMPLEMENTED + ERROR_LOG(DSPHLE, "dsp_opc.hex_movnp\n"); +} + +void addax(const UDSPInstruction& opc) +{ + u8 areg = (opc.hex >> 8) & 0x1; + u8 sreg = (opc.hex >> 9) & 0x1; + + s64 ax = dsp_get_long_acx(sreg); + s64 acc = dsp_get_long_acc(areg); + acc += ax; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + +void addr(const UDSPInstruction& opc) +{ + u8 areg = (opc.hex >> 8) & 0x1; + u8 sreg = ((opc.hex >> 9) & 0x3) + 0x18; + + s64 ax = (s16)g_dsp.r[sreg]; + ax <<= 16; + + s64 acc = dsp_get_long_acc(areg); + acc += ax; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + +void subr(const UDSPInstruction& opc) +{ + u8 areg = (opc.hex >> 8) & 0x1; + u8 sreg = ((opc.hex >> 9) & 0x3) + 0x18; + + s64 ax = (s16)g_dsp.r[sreg]; + ax <<= 16; + + s64 acc = dsp_get_long_acc(areg); + acc -= ax; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + +void subax(const UDSPInstruction& opc) +{ + int regD = (opc.hex >> 8) & 0x1; + int regT = (opc.hex >> 9) & 0x1; + + s64 Acc = dsp_get_long_acc(regD) - dsp_get_long_acx(regT); + + dsp_set_long_acc(regD, Acc); + Update_SR_Register(Acc); +} + +void addis(const UDSPInstruction& opc) +{ + u8 areg = (opc.hex >> 8) & 0x1; + + s64 Imm = (s8)opc.hex; + Imm <<= 16; + s64 acc = dsp_get_long_acc(areg); + acc += Imm; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + +void addi(const UDSPInstruction& opc) +{ + u8 areg = (opc.hex >> 8) & 0x1; + + s64 sub = (s16)dsp_fetch_code(); + sub <<= 16; + s64 acc = dsp_get_long_acc(areg); + acc += sub; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + +void lsl16(const UDSPInstruction& opc) +{ + u8 areg = (opc.hex >> 8) & 0x1; + + s64 acc = dsp_get_long_acc(areg); + acc <<= 16; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + +void madd(const UDSPInstruction& opc) +{ + u8 sreg = (opc.hex >> 8) & 0x1; + + s64 prod = dsp_get_long_prod(); + prod += (s64)dsp_get_ax_l(sreg) * (s64)dsp_get_ax_h(sreg) * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} + +void lsr16(const UDSPInstruction& opc) +{ + u8 areg = (opc.hex >> 8) & 0x1; + + s64 acc = dsp_get_long_acc(areg); + acc >>= 16; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + +void asr16(const UDSPInstruction& opc) +{ + u8 areg = (opc.hex >> 11) & 0x1; + + s64 acc = dsp_get_long_acc(areg); + acc >>= 16; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + +void shifti(const UDSPInstruction& opc) +{ + // direction: left + bool ShiftLeft = true; + u16 shift = opc.ushift; + + if ((opc.negating) && (opc.shift < 0)) + { + ShiftLeft = false; + shift = -opc.shift; + } + + s64 acc; + u64 uacc; + + if (opc.arithmetic) + { + // arithmetic shift + uacc = dsp_get_long_acc(opc.areg); + + if (!ShiftLeft) { - dsp_reg_store_stack(0, g_dsp.pc); - dsp_reg_store_stack(2, loop_pc); - dsp_reg_store_stack(3, cnt); + uacc >>= shift; } else { - g_dsp.pc = loop_pc + 1; + uacc <<= shift; } + + acc = uacc; } - - void bloopi(const UDSPInstruction& opc) + else { - u16 cnt = opc.hex & 0xff; - u16 loop_pc = dsp_fetch_code(); + acc = dsp_get_long_acc(opc.areg); - if (cnt) + if (!ShiftLeft) { - dsp_reg_store_stack(0, g_dsp.pc); - dsp_reg_store_stack(2, loop_pc); - dsp_reg_store_stack(3, cnt); + acc >>= shift; } else { - g_dsp.pc = loop_pc + 1; + acc <<= shift; } } - //------------------------------------------------------------- + dsp_set_long_acc(opc.areg, acc); - void mrr(const UDSPInstruction& opc) - { - u8 sreg = opc.hex & 0x1f; - u8 dreg = (opc.hex >> 5) & 0x1f; - - u16 val = dsp_op_read_reg(sreg); - dsp_op_write_reg(dreg, val); - } - - void lrr(const UDSPInstruction& opc) - { - u8 sreg = (opc.hex >> 5) & 0x3; - u8 dreg = opc.hex & 0x1f; - - u16 val = dsp_dmem_read(g_dsp.r[sreg]); - dsp_op_write_reg(dreg, val); - - // post processing of source reg - switch ((opc.hex >> 7) & 0x3) - { - case 0x0: // LRR - break; - - case 0x1: // LRRD - g_dsp.r[sreg]--; - break; - - case 0x2: // LRRI - g_dsp.r[sreg]++; - break; - - case 0x3: - g_dsp.r[sreg] += g_dsp.r[sreg + 4]; - break; - } - } - - void srr(const UDSPInstruction& opc) - { - u8 dreg = (opc.hex >> 5) & 0x3; - u8 sreg = opc.hex & 0x1f; - - u16 val = dsp_op_read_reg(sreg); - dsp_dmem_write(g_dsp.r[dreg], val); - - // post processing of dest reg - switch ((opc.hex >> 7) & 0x3) - { - case 0x0: // SRR - break; - - case 0x1: // SRRD - g_dsp.r[dreg]--; - break; - - case 0x2: // SRRI - g_dsp.r[dreg]++; - break; - - case 0x3: // SRRX - g_dsp.r[dreg] += g_dsp.r[dreg + 4]; - break; - } - } - - // FIXME inside - void ilrr(const UDSPInstruction& opc) - { - u16 reg = opc.hex & 0x3; - u16 dreg = 0x1e + ((opc.hex >> 8) & 1); - - // always to acc0 ? - g_dsp.r[dreg] = dsp_imem_read(g_dsp.r[reg]); - - switch ((opc.hex >> 2) & 0x3) - { - case 0x0: // no change - break; - - case 0x1: // post decrement - g_dsp.r[reg]--; - break; - - case 0x2: // post increment - g_dsp.r[reg]++; - break; - - default: - // FIXME: Implement - ERROR_LOG(DSPHLE, "dsp_opc.hex_ilrr"); - } - } - - - void lri(const UDSPInstruction& opc) - { - u8 reg = opc.hex & DSP_REG_MASK; - u16 imm = dsp_fetch_code(); - dsp_op_write_reg(reg, imm); - } - - void lris(const UDSPInstruction& opc) - { - u8 reg = ((opc.hex >> 8) & 0x7) + 0x18; - u16 imm = (s8)opc.hex; - dsp_op_write_reg(reg, imm); - } - - void lr(const UDSPInstruction& opc) - { - u8 reg = opc.hex & DSP_REG_MASK; - u16 addr = dsp_fetch_code(); - u16 val = dsp_dmem_read(addr); - dsp_op_write_reg(reg, val); - } - - void sr(const UDSPInstruction& opc) - { - u8 reg = opc.hex & DSP_REG_MASK; - u16 addr = dsp_fetch_code(); - u16 val = dsp_op_read_reg(reg); - dsp_dmem_write(addr, val); - } - - void si(const UDSPInstruction& opc) - { - u16 addr = (s8)opc.hex; - u16 imm = dsp_fetch_code(); - dsp_dmem_write(addr, imm); - } - - void tstaxh(const UDSPInstruction& opc) - { - u8 reg = (opc.hex >> 8) & 0x1; - s16 val = dsp_get_ax_h(reg); - - Update_SR_Register(val); - } - - void clr(const UDSPInstruction& opc) - { - u8 reg = (opc.hex >> 11) & 0x1; - - dsp_set_long_acc(reg, 0); - - Update_SR_Register((s64)0); - } - - void clrp(const UDSPInstruction& opc) - { - g_dsp.r[0x14] = 0x0000; - g_dsp.r[0x15] = 0xfff0; - g_dsp.r[0x16] = 0x00ff; - g_dsp.r[0x17] = 0x0010; - } - - void mulc(const UDSPInstruction& opc) - { - // math new prod - u8 sreg = (opc.hex >> 11) & 0x1; - u8 treg = (opc.hex >> 12) & 0x1; - - s64 prod = dsp_get_acc_m(sreg) * dsp_get_ax_h(treg) * GetMultiplyModifier(); - dsp_set_long_prod(prod); - - Update_SR_Register(prod); - } - - // TODO: Implement - void mulcmvz(const UDSPInstruction& opc) - { - ERROR_LOG(DSPHLE, "dsp_opc.hex_mulcmvz ni"); - } - - // TODO: Implement - void mulcmv(const UDSPInstruction& opc) - { - ERROR_LOG(DSPHLE, "dsp_opc.hex_mulcmv ni"); - } - - void cmpar(const UDSPInstruction& opc) - { - u8 rreg = ((opc.hex >> 12) & 0x1) + 0x1a; - u8 areg = (opc.hex >> 11) & 0x1; - - // we compare - s64 rr = (s16)g_dsp.r[rreg]; - rr <<= 16; - - s64 ar = dsp_get_long_acc(areg); - - Update_SR_Register(ar - rr); - } - - void cmp(const UDSPInstruction& opc) - { - s64 acc0 = dsp_get_long_acc(0); - s64 acc1 = dsp_get_long_acc(1); - - Update_SR_Register(acc0 - acc1); - } - - void tsta(const UDSPInstruction& opc) - { - u8 reg = (opc.hex >> 11) & 0x1; - s64 acc = dsp_get_long_acc(reg); - - Update_SR_Register(acc); - } - - void addaxl(const UDSPInstruction& opc) - { - u8 sreg = (opc.hex >> 9) & 0x1; - u8 dreg = (opc.hex >> 8) & 0x1; - - s64 acc = dsp_get_long_acc(dreg); - s64 acx = dsp_get_ax_l(sreg); - - acc += acx; - - dsp_set_long_acc(dreg, acc); - - Update_SR_Register(acc); - } - - void addarn(const UDSPInstruction& opc) - { - u8 dreg = opc.hex & 0x3; - u8 sreg = (opc.hex >> 2) & 0x3; - - g_dsp.r[dreg] += (s16)g_dsp.r[0x04 + sreg]; - } - - void mulcac(const UDSPInstruction& opc) - { - s64 TempProd = dsp_get_long_prod(); - - // update prod - u8 sreg = (opc.hex >> 12) & 0x1; - s64 Prod = (s64)dsp_get_acc_m(sreg) * (s64)dsp_get_acc_h(sreg) * GetMultiplyModifier(); - dsp_set_long_prod(Prod); - - // update acc - u8 rreg = (opc.hex >> 8) & 0x1; - dsp_set_long_acc(rreg, TempProd); - } - - void movr(const UDSPInstruction& opc) - { - u8 areg = (opc.hex >> 8) & 0x1; - u8 sreg = ((opc.hex >> 9) & 0x3) + 0x18; - - s64 acc = (s16)g_dsp.r[sreg]; - acc <<= 16; - acc &= ~0xffff; - - dsp_set_long_acc(areg, acc); - - Update_SR_Register(acc); - } - - void movax(const UDSPInstruction& opc) - { - u8 sreg = (opc.hex >> 9) & 0x1; - u8 dreg = (opc.hex >> 8) & 0x1; - - g_dsp.r[0x1c + dreg] = g_dsp.r[0x18 + sreg]; - g_dsp.r[0x1e + dreg] = g_dsp.r[0x1a + sreg]; - - if ((s16)g_dsp.r[0x1a + sreg] < 0) - { - g_dsp.r[0x10 + dreg] = 0xffff; - } - else - { - g_dsp.r[0x10 + dreg] = 0; - } - - tsta(UDSPInstruction(dreg << 11)); - } - - void xorr(const UDSPInstruction& opc) - { - u8 sreg = (opc.hex >> 9) & 0x1; - u8 dreg = (opc.hex >> 8) & 0x1; - - g_dsp.r[0x1e + dreg] ^= g_dsp.r[0x1a + sreg]; - - tsta(UDSPInstruction(dreg << 11)); - } - - void andr(const UDSPInstruction& opc) - { - u8 sreg = (opc.hex >> 9) & 0x1; - u8 dreg = (opc.hex >> 8) & 0x1; - - g_dsp.r[0x1e + dreg] &= g_dsp.r[0x1a + sreg]; - - tsta(UDSPInstruction(dreg << 11)); - } - - void orr(const UDSPInstruction& opc) - { - u8 sreg = (opc.hex >> 9) & 0x1; - u8 dreg = (opc.hex >> 8) & 0x1; - - g_dsp.r[0x1e + dreg] |= g_dsp.r[0x1a + sreg]; - - tsta(UDSPInstruction(dreg << 11)); - } - - void andc(const UDSPInstruction& opc) - { - u8 D = (opc.hex >> 8) & 0x1; - - u16 ac1 = dsp_get_acc_m(D); - u16 ac2 = dsp_get_acc_m(1 - D); - - dsp_set_long_acc(D, ac1 & ac2); - - if ((ac1 & ac2) == 0) - { - g_dsp.r[R_SR] |= 0x20; - } - else - { - g_dsp.r[R_SR] &= ~0x20; - } - } - - - //------------------------------------------------------------- - - // TODO: Implement - void nx(const UDSPInstruction& opc) - {} - - - // FIXME inside - void andfc(const UDSPInstruction& opc) - { - if (opc.hex & 0xf) - { - // FIXME: Implement - ERROR_LOG(DSPHLE, "dsp_opc.hex_andfc"); - } - - u8 reg = (opc.hex >> 8) & 0x1; - u16 imm = dsp_fetch_code(); - u16 val = dsp_get_acc_m(reg); - - if ((val & imm) == imm) - { - g_dsp.r[R_SR] |= 0x40; - } - else - { - g_dsp.r[R_SR] &= ~0x40; - } - } - - // FIXME inside - void andf(const UDSPInstruction& opc) - { - u8 reg; - u16 imm; - u16 val; - - if (opc.hex & 0xf) - { - // FIXME: Implement - ERROR_LOG(DSPHLE, "dsp andf opcode"); - } - - reg = 0x1e + ((opc.hex >> 8) & 0x1); - imm = dsp_fetch_code(); - val = g_dsp.r[reg]; - - if ((val & imm) == 0) - { - g_dsp.r[R_SR] |= 0x40; - } - else - { - g_dsp.r[R_SR] &= ~0x40; - } - } - - // FIXME inside - void subf(const UDSPInstruction& opc) - { - if (opc.hex & 0xf) - { - // FIXME: Implement - ERROR_LOG(DSPHLE, "dsp subf opcode"); - } - - u8 reg = 0x1e + ((opc.hex >> 8) & 0x1); - s64 imm = (s16)dsp_fetch_code(); - - s64 val = (s16)g_dsp.r[reg]; - s64 res = val - imm; - - Update_SR_Register(res); - } - - // FIXME inside - void xori(const UDSPInstruction& opc) - { - if (opc.hex & 0xf) - { - // FIXME: Implement - ERROR_LOG(DSPHLE, "dsp xori opcode"); - } - - u8 reg = 0x1e + ((opc.hex >> 8) & 0x1); - u16 imm = dsp_fetch_code(); - g_dsp.r[reg] ^= imm; - - Update_SR_Register((s16)g_dsp.r[reg]); - } - - //FIXME inside - void andi(const UDSPInstruction& opc) - { - if (opc.hex & 0xf) - { - // FIXME: Implement - ERROR_LOG(DSPHLE, "dsp andi opcode"); - } - - u8 reg = 0x1e + ((opc.hex >> 8) & 0x1); - u16 imm = dsp_fetch_code(); - g_dsp.r[reg] &= imm; - - Update_SR_Register((s16)g_dsp.r[reg]); - } - - - // F|RES: i am not sure if this shouldnt be the whole ACC - // - //FIXME inside - void ori(const UDSPInstruction& opc) - { - if (opc.hex & 0xf) - { - // FIXME: Implement - ERROR_LOG(DSPHLE, "dsp ori opcode"); - return; - } - - u8 reg = 0x1e + ((opc.hex >> 8) & 0x1); - u16 imm = dsp_fetch_code(); - g_dsp.r[reg] |= imm; - - Update_SR_Register((s16)g_dsp.r[reg]); - } - - //------------------------------------------------------------- - - void add(const UDSPInstruction& opc) - { - u8 areg = (opc.hex >> 8) & 0x1; - s64 acc0 = dsp_get_long_acc(0); - s64 acc1 = dsp_get_long_acc(1); + Update_SR_Register(acc); +} - s64 res = acc0 + acc1; +//------------------------------------------------------------- - dsp_set_long_acc(areg, res); - - Update_SR_Register(res); - } - - //------------------------------------------------------------- - - void addp(const UDSPInstruction& opc) - { - u8 dreg = (opc.hex >> 8) & 0x1; - s64 acc = dsp_get_long_acc(dreg); - acc = acc + dsp_get_long_prod(); - dsp_set_long_acc(dreg, acc); - - Update_SR_Register(acc); - } - - void cmpis(const UDSPInstruction& opc) - { - u8 areg = (opc.hex >> 8) & 0x1; - - s64 acc = dsp_get_long_acc(areg); - s64 val = (s8)opc.hex; - val <<= 16; - - s64 res = acc - val; - - Update_SR_Register(res); - } - - void addpaxz(const UDSPInstruction& opc) - { - u8 dreg = (opc.hex >> 8) & 0x1; - u8 sreg = (opc.hex >> 9) & 0x1; - - s64 prod = dsp_get_long_prod() & ~0x0ffff; - s64 ax_h = dsp_get_long_acx(sreg); - s64 acc = (prod + ax_h) & ~0x0ffff; - - dsp_set_long_acc(dreg, acc); - - Update_SR_Register(acc); - } - - void movpz(const UDSPInstruction& opc) - { - u8 dreg = (opc.hex >> 8) & 0x01; - - // overwrite acc and clear low part - s64 prod = dsp_get_long_prod(); - s64 acc = prod & ~0xffff; - dsp_set_long_acc(dreg, acc); - - Update_SR_Register(acc); - } - - void decm(const UDSPInstruction& opc) - { - u8 dreg = (opc.hex >> 8) & 0x01; - - s64 sub = 0x10000; - s64 acc = dsp_get_long_acc(dreg); - acc -= sub; - dsp_set_long_acc(dreg, acc); - - Update_SR_Register(acc); - } - - void dec(const UDSPInstruction& opc) - { - u8 dreg = (opc.hex >> 8) & 0x01; - - s64 acc = dsp_get_long_acc(dreg) - 1; - dsp_set_long_acc(dreg, acc); - - Update_SR_Register(acc); - } - - void incm(const UDSPInstruction& opc) - { - u8 dreg = (opc.hex >> 8) & 0x1; - - s64 sub = 0x10000; - s64 acc = dsp_get_long_acc(dreg); - acc += sub; - dsp_set_long_acc(dreg, acc); - - Update_SR_Register(acc); - } - - void inc(const UDSPInstruction& opc) - { - u8 dreg = (opc.hex >> 8) & 0x1; - - s64 acc = dsp_get_long_acc(dreg); - acc++; - dsp_set_long_acc(dreg, acc); - - Update_SR_Register(acc); - } - - void neg(const UDSPInstruction& opc) - { - u8 areg = (opc.hex >> 8) & 0x1; - - s64 acc = dsp_get_long_acc(areg); - acc = 0 - acc; - dsp_set_long_acc(areg, acc); - - Update_SR_Register(acc); - } - - // TODO: Implement - void movnp(const UDSPInstruction& opc) - { - // UNIMPLEMENTED - ERROR_LOG(DSPHLE, "dsp_opc.hex_movnp\n"); - } - - void addax(const UDSPInstruction& opc) - { - u8 areg = (opc.hex >> 8) & 0x1; - u8 sreg = (opc.hex >> 9) & 0x1; - - s64 ax = dsp_get_long_acx(sreg); - s64 acc = dsp_get_long_acc(areg); - acc += ax; - dsp_set_long_acc(areg, acc); - - Update_SR_Register(acc); - } - - void addr(const UDSPInstruction& opc) - { - u8 areg = (opc.hex >> 8) & 0x1; - u8 sreg = ((opc.hex >> 9) & 0x3) + 0x18; - - s64 ax = (s16)g_dsp.r[sreg]; - ax <<= 16; - - s64 acc = dsp_get_long_acc(areg); - acc += ax; - dsp_set_long_acc(areg, acc); - - Update_SR_Register(acc); - } - - void subr(const UDSPInstruction& opc) - { - u8 areg = (opc.hex >> 8) & 0x1; - u8 sreg = ((opc.hex >> 9) & 0x3) + 0x18; - - s64 ax = (s16)g_dsp.r[sreg]; - ax <<= 16; - - s64 acc = dsp_get_long_acc(areg); - acc -= ax; - dsp_set_long_acc(areg, acc); - - Update_SR_Register(acc); - } - - void subax(const UDSPInstruction& opc) - { - int regD = (opc.hex >> 8) & 0x1; - int regT = (opc.hex >> 9) & 0x1; - - s64 Acc = dsp_get_long_acc(regD) - dsp_get_long_acx(regT); - - dsp_set_long_acc(regD, Acc); - Update_SR_Register(Acc); - } - - void addis(const UDSPInstruction& opc) - { - u8 areg = (opc.hex >> 8) & 0x1; - - s64 Imm = (s8)opc.hex; - Imm <<= 16; - s64 acc = dsp_get_long_acc(areg); - acc += Imm; - dsp_set_long_acc(areg, acc); - - Update_SR_Register(acc); - } - - void addi(const UDSPInstruction& opc) - { - u8 areg = (opc.hex >> 8) & 0x1; - - s64 sub = (s16)dsp_fetch_code(); - sub <<= 16; - s64 acc = dsp_get_long_acc(areg); - acc += sub; - dsp_set_long_acc(areg, acc); - - Update_SR_Register(acc); - } - - void lsl16(const UDSPInstruction& opc) - { - u8 areg = (opc.hex >> 8) & 0x1; - - s64 acc = dsp_get_long_acc(areg); - acc <<= 16; - dsp_set_long_acc(areg, acc); - - Update_SR_Register(acc); - } - - void madd(const UDSPInstruction& opc) - { - u8 sreg = (opc.hex >> 8) & 0x1; - - s64 prod = dsp_get_long_prod(); - prod += (s64)dsp_get_ax_l(sreg) * (s64)dsp_get_ax_h(sreg) * GetMultiplyModifier(); - dsp_set_long_prod(prod); - } - - void lsr16(const UDSPInstruction& opc) - { - u8 areg = (opc.hex >> 8) & 0x1; - - s64 acc = dsp_get_long_acc(areg); - acc >>= 16; - dsp_set_long_acc(areg, acc); - - Update_SR_Register(acc); - } - - void asr16(const UDSPInstruction& opc) - { - u8 areg = (opc.hex >> 11) & 0x1; - - s64 acc = dsp_get_long_acc(areg); - acc >>= 16; - dsp_set_long_acc(areg, acc); - - Update_SR_Register(acc); - } - - void shifti(const UDSPInstruction& opc) - { - // direction: left - bool ShiftLeft = true; - u16 shift = opc.ushift; - - if ((opc.negating) && (opc.shift < 0)) - { - ShiftLeft = false; - shift = -opc.shift; - } - - s64 acc; - u64 uacc; - - if (opc.arithmetic) - { - // arithmetic shift - uacc = dsp_get_long_acc(opc.areg); - - if (!ShiftLeft) - { - uacc >>= shift; - } - else - { - uacc <<= shift; - } - - acc = uacc; - } - else - { - acc = dsp_get_long_acc(opc.areg); - - if (!ShiftLeft) - { - acc >>= shift; - } - else - { - acc <<= shift; - } - } - - dsp_set_long_acc(opc.areg, acc); - - Update_SR_Register(acc); - } - - //------------------------------------------------------------- - - // hcs give me this code!! - void dar(const UDSPInstruction& opc) - { - u8 reg = opc.hex & 0x3; - - int temp = g_dsp.r[reg] + g_dsp.r[8]; - - if (temp <= 0x7ff){g_dsp.r[reg] = temp;} - else {g_dsp.r[reg]--;} - } +// hcs give me this code!! +void dar(const UDSPInstruction& opc) +{ + u8 reg = opc.hex & 0x3; + int temp = g_dsp.r[reg] + g_dsp.r[8]; - // hcs give me this code!! - void iar(const UDSPInstruction& opc) - { - u8 reg = opc.hex & 0x3; + if (temp <= 0x7ff){g_dsp.r[reg] = temp;} + else {g_dsp.r[reg]--;} +} - int temp = g_dsp.r[reg] + g_dsp.r[8]; - if (temp <= 0x7ff){g_dsp.r[reg] = temp;} - else {g_dsp.r[reg]++;} - } +// hcs give me this code!! +void iar(const UDSPInstruction& opc) +{ + u8 reg = opc.hex & 0x3; - //------------------------------------------------------------- + int temp = g_dsp.r[reg] + g_dsp.r[8]; - void sbclr(const UDSPInstruction& opc) - { - u8 bit = (opc.hex & 0xff) + 6; - g_dsp.r[R_SR] &= ~(1 << bit); - } + if (temp <= 0x7ff){g_dsp.r[reg] = temp;} + else {g_dsp.r[reg]++;} +} +//------------------------------------------------------------- - void sbset(const UDSPInstruction& opc) - { - u8 bit = (opc.hex & 0xff) + 6; - g_dsp.r[R_SR] |= (1 << bit); - } +void sbclr(const UDSPInstruction& opc) +{ + u8 bit = (opc.hex & 0xff) + 6; + g_dsp.r[R_SR] &= ~(1 << bit); +} - // FIXME inside - void srbith(const UDSPInstruction& opc) - { - switch ((opc.hex >> 8) & 0xf) - { - case 0xe: // SET40 - g_dsp.r[R_SR] &= ~(1 << 14); - break; - - // FIXME: Both of these appear in the beginning of the Wind Waker - //case 0xb: - //case 0xc: - - /* case 0xf: // SET16 // that doesnt happen on a real console - g_dsp.r[R_SR] |= (1 << 14); - break;*/ - - default: - break; - } - } +void sbset(const UDSPInstruction& opc) +{ + u8 bit = (opc.hex & 0xff) + 6; + g_dsp.r[R_SR] |= (1 << bit); +} - //------------------------------------------------------------- - void movp(const UDSPInstruction& opc) +// FIXME inside +void srbith(const UDSPInstruction& opc) +{ + switch ((opc.hex >> 8) & 0xf) { - u8 dreg = (opc.hex >> 8) & 0x1; + case 0xe: // SET40 + g_dsp.r[R_SR] &= ~(1 << 14); + break; - s64 prod = dsp_get_long_prod(); - s64 acc = prod; - dsp_set_long_acc(dreg, acc); - } + // FIXME: Both of these appear in the beginning of the Wind Waker + //case 0xb: + //case 0xc: - void mul(const UDSPInstruction& opc) - { - u8 sreg = (opc.hex >> 11) & 0x1; - s64 prod = (s64)dsp_get_ax_h(sreg) * (s64)dsp_get_ax_l(sreg) * GetMultiplyModifier(); + /* case 0xf: // SET16 // that doesnt happen on a real console + g_dsp.r[R_SR] |= (1 << 14); + break;*/ - dsp_set_long_prod(prod); - - Update_SR_Register(prod); + default: + break; } +} - void mulac(const UDSPInstruction& opc) - { - // add old prod to acc - u8 rreg = (opc.hex >> 8) & 0x1; - s64 acR = dsp_get_long_acc(rreg) + dsp_get_long_prod(); - dsp_set_long_acc(rreg, acR); +//------------------------------------------------------------- - // math new prod - u8 sreg = (opc.hex >> 11) & 0x1; - s64 prod = dsp_get_ax_l(sreg) * dsp_get_ax_h(sreg) * GetMultiplyModifier(); - dsp_set_long_prod(prod); +void movp(const UDSPInstruction& opc) +{ + u8 dreg = (opc.hex >> 8) & 0x1; - Update_SR_Register(prod); - } + s64 prod = dsp_get_long_prod(); + s64 acc = prod; + dsp_set_long_acc(dreg, acc); +} - void mulmv(const UDSPInstruction& opc) - { - u8 rreg = (opc.hex >> 8) & 0x1; - s64 prod = dsp_get_long_prod(); - s64 acc = prod; - dsp_set_long_acc(rreg, acc); +void mul(const UDSPInstruction& opc) +{ + u8 sreg = (opc.hex >> 11) & 0x1; + s64 prod = (s64)dsp_get_ax_h(sreg) * (s64)dsp_get_ax_l(sreg) * GetMultiplyModifier(); - u8 areg = ((opc.hex >> 11) & 0x1) + 0x18; - u8 breg = ((opc.hex >> 11) & 0x1) + 0x1a; - s64 val1 = (s16)g_dsp.r[areg]; - s64 val2 = (s16)g_dsp.r[breg]; + dsp_set_long_prod(prod); - prod = val1 * val2 * GetMultiplyModifier(); + Update_SR_Register(prod); +} - dsp_set_long_prod(prod); +void mulac(const UDSPInstruction& opc) +{ + // add old prod to acc + u8 rreg = (opc.hex >> 8) & 0x1; + s64 acR = dsp_get_long_acc(rreg) + dsp_get_long_prod(); + dsp_set_long_acc(rreg, acR); - Update_SR_Register(prod); - } + // math new prod + u8 sreg = (opc.hex >> 11) & 0x1; + s64 prod = dsp_get_ax_l(sreg) * dsp_get_ax_h(sreg) * GetMultiplyModifier(); + dsp_set_long_prod(prod); - void mulmvz(const UDSPInstruction& opc) - { - u8 sreg = (opc.hex >> 11) & 0x1; - u8 rreg = (opc.hex >> 8) & 0x1; + Update_SR_Register(prod); +} - // overwrite acc and clear low part - s64 prod = dsp_get_long_prod(); - s64 acc = prod & ~0xffff; - dsp_set_long_acc(rreg, acc); +void mulmv(const UDSPInstruction& opc) +{ + u8 rreg = (opc.hex >> 8) & 0x1; + s64 prod = dsp_get_long_prod(); + s64 acc = prod; + dsp_set_long_acc(rreg, acc); - // math prod - prod = (s64)g_dsp.r[0x18 + sreg] * (s64)g_dsp.r[0x1a + sreg] * GetMultiplyModifier(); - dsp_set_long_prod(prod); + u8 areg = ((opc.hex >> 11) & 0x1) + 0x18; + u8 breg = ((opc.hex >> 11) & 0x1) + 0x1a; + s64 val1 = (s16)g_dsp.r[areg]; + s64 val2 = (s16)g_dsp.r[breg]; - Update_SR_Register(prod); - } + prod = val1 * val2 * GetMultiplyModifier(); - void mulx(const UDSPInstruction& opc) - { - u8 sreg = ((opc.hex >> 12) & 0x1); - u8 treg = ((opc.hex >> 11) & 0x1); + dsp_set_long_prod(prod); - s64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); - s64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); + Update_SR_Register(prod); +} - s64 prod = val1 * val2 * GetMultiplyModifier(); - dsp_set_long_prod(prod); +void mulmvz(const UDSPInstruction& opc) +{ + u8 sreg = (opc.hex >> 11) & 0x1; + u8 rreg = (opc.hex >> 8) & 0x1; - Update_SR_Register(prod); - } + // overwrite acc and clear low part + s64 prod = dsp_get_long_prod(); + s64 acc = prod & ~0xffff; + dsp_set_long_acc(rreg, acc); - void mulxac(const UDSPInstruction& opc) - { - // add old prod to acc - u8 rreg = (opc.hex >> 8) & 0x1; - s64 acR = dsp_get_long_acc(rreg) + dsp_get_long_prod(); - dsp_set_long_acc(rreg, acR); + // math prod + prod = (s64)g_dsp.r[0x18 + sreg] * (s64)g_dsp.r[0x1a + sreg] * GetMultiplyModifier(); + dsp_set_long_prod(prod); - // math new prod - u8 sreg = (opc.hex >> 12) & 0x1; - u8 treg = (opc.hex >> 11) & 0x1; + Update_SR_Register(prod); +} - s64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); - s64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); +void mulx(const UDSPInstruction& opc) +{ + u8 sreg = ((opc.hex >> 12) & 0x1); + u8 treg = ((opc.hex >> 11) & 0x1); - s64 prod = val1 * val2 * GetMultiplyModifier(); - dsp_set_long_prod(prod); + s64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); + s64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); - Update_SR_Register(prod); - } + s64 prod = val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); - void mulxmv(const UDSPInstruction& opc) - { - // add old prod to acc - u8 rreg = ((opc.hex >> 8) & 0x1); - s64 acR = dsp_get_long_prod(); - dsp_set_long_acc(rreg, acR); + Update_SR_Register(prod); +} - // math new prod - u8 sreg = (opc.hex >> 12) & 0x1; - u8 treg = (opc.hex >> 11) & 0x1; +void mulxac(const UDSPInstruction& opc) +{ + // add old prod to acc + u8 rreg = (opc.hex >> 8) & 0x1; + s64 acR = dsp_get_long_acc(rreg) + dsp_get_long_prod(); + dsp_set_long_acc(rreg, acR); - s64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); - s64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); + // math new prod + u8 sreg = (opc.hex >> 12) & 0x1; + u8 treg = (opc.hex >> 11) & 0x1; - s64 prod = val1 * val2 * GetMultiplyModifier(); - dsp_set_long_prod(prod); + s64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); + s64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); - Update_SR_Register(prod); - } + s64 prod = val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); + + Update_SR_Register(prod); +} - void mulxmvz(const UDSPInstruction& opc) - { - // overwrite acc and clear low part - u8 rreg = (opc.hex >> 8) & 0x1; - s64 prod = dsp_get_long_prod(); - s64 acc = prod & ~0xffff; - dsp_set_long_acc(rreg, acc); +void mulxmv(const UDSPInstruction& opc) +{ + // add old prod to acc + u8 rreg = ((opc.hex >> 8) & 0x1); + s64 acR = dsp_get_long_prod(); + dsp_set_long_acc(rreg, acR); - // math prod - u8 sreg = (opc.hex >> 12) & 0x1; - u8 treg = (opc.hex >> 11) & 0x1; + // math new prod + u8 sreg = (opc.hex >> 12) & 0x1; + u8 treg = (opc.hex >> 11) & 0x1; + + s64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); + s64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); + + s64 prod = val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); + + Update_SR_Register(prod); +} - s64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); - s64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); +void mulxmvz(const UDSPInstruction& opc) +{ + // overwrite acc and clear low part + u8 rreg = (opc.hex >> 8) & 0x1; + s64 prod = dsp_get_long_prod(); + s64 acc = prod & ~0xffff; + dsp_set_long_acc(rreg, acc); - prod = val1 * val2 * GetMultiplyModifier(); - dsp_set_long_prod(prod); - - Update_SR_Register(prod); - } - - void sub(const UDSPInstruction& opc) - { - u8 D = (opc.hex >> 8) & 0x1; - s64 Acc1 = dsp_get_long_acc(D); - s64 Acc2 = dsp_get_long_acc(1 - D); + // math prod + u8 sreg = (opc.hex >> 12) & 0x1; + u8 treg = (opc.hex >> 11) & 0x1; - Acc1 -= Acc2; + s64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); + s64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); - dsp_set_long_acc(D, Acc1); - } + prod = val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); + Update_SR_Register(prod); +} - //------------------------------------------------------------- - // - // --- Table E - // - //------------------------------------------------------------- +void sub(const UDSPInstruction& opc) +{ + u8 D = (opc.hex >> 8) & 0x1; + s64 Acc1 = dsp_get_long_acc(D); + s64 Acc2 = dsp_get_long_acc(1 - D); + + Acc1 -= Acc2; - void maddx(const UDSPInstruction& opc) - { - u8 sreg = (opc.hex >> 9) & 0x1; - u8 treg = (opc.hex >> 8) & 0x1; + dsp_set_long_acc(D, Acc1); +} - s64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); - s64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); - s64 prod = dsp_get_long_prod(); - prod += val1 * val2 * GetMultiplyModifier(); - dsp_set_long_prod(prod); - } +//------------------------------------------------------------- +// +// --- Table E +// +//------------------------------------------------------------- - void msubx(const UDSPInstruction& opc) - { - u8 sreg = (opc.hex >> 9) & 0x1; - u8 treg = (opc.hex >> 8) & 0x1; +void maddx(const UDSPInstruction& opc) +{ + u8 sreg = (opc.hex >> 9) & 0x1; + u8 treg = (opc.hex >> 8) & 0x1; - s64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); - s64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); + s64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); + s64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); + + s64 prod = dsp_get_long_prod(); + prod += val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} - s64 prod = dsp_get_long_prod(); - prod -= val1 * val2 * GetMultiplyModifier(); - dsp_set_long_prod(prod); - } +void msubx(const UDSPInstruction& opc) +{ + u8 sreg = (opc.hex >> 9) & 0x1; + u8 treg = (opc.hex >> 8) & 0x1; - void maddc(const UDSPInstruction& opc) - { - u32 sreg = (opc.hex >> 9) & 0x1; - u32 treg = (opc.hex >> 8) & 0x1; + s64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); + s64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); - s64 val1 = dsp_get_acc_m(sreg); - s64 val2 = dsp_get_ax_h(treg); + s64 prod = dsp_get_long_prod(); + prod -= val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} - s64 prod = dsp_get_long_prod(); - prod += val1 * val2 * GetMultiplyModifier(); - dsp_set_long_prod(prod); - } +void maddc(const UDSPInstruction& opc) +{ + u32 sreg = (opc.hex >> 9) & 0x1; + u32 treg = (opc.hex >> 8) & 0x1; - void msubc(const UDSPInstruction& opc) - { - u32 sreg = (opc.hex >> 9) & 0x1; - u32 treg = (opc.hex >> 8) & 0x1; + s64 val1 = dsp_get_acc_m(sreg); + s64 val2 = dsp_get_ax_h(treg); - s64 val1 = dsp_get_acc_m(sreg); - s64 val2 = dsp_get_ax_h(treg); + s64 prod = dsp_get_long_prod(); + prod += val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} + +void msubc(const UDSPInstruction& opc) +{ + u32 sreg = (opc.hex >> 9) & 0x1; + u32 treg = (opc.hex >> 8) & 0x1; + + s64 val1 = dsp_get_acc_m(sreg); + s64 val2 = dsp_get_ax_h(treg); - s64 prod = dsp_get_long_prod(); - prod -= val1 * val2 * GetMultiplyModifier(); - dsp_set_long_prod(prod); - } + s64 prod = dsp_get_long_prod(); + prod -= val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} diff --git a/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.h b/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.h index 958c5df418..ce3a3f9370 100644 --- a/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.h +++ b/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.h @@ -28,106 +28,107 @@ namespace DSPInterpreter { - // GLOBAL HELPER FUNCTIONS - void Update_SR_Register(s64 _Value); - s8 GetMultiplyModifier(); - // END OF HELPER FUNCTIONS +// GLOBAL HELPER FUNCTIONS +void Update_SR_Register(s64 _Value); +s8 GetMultiplyModifier(); +// END OF HELPER FUNCTIONS - void unknown(const UDSPInstruction& opc); - void call(const UDSPInstruction& opc); - void ifcc(const UDSPInstruction& opc); - void jcc(const UDSPInstruction& opc); - void ret(const UDSPInstruction& opc); - void halt(const UDSPInstruction& opc); - void loop(const UDSPInstruction& opc); - void loopi(const UDSPInstruction& opc); - void bloop(const UDSPInstruction& opc); - void bloopi(const UDSPInstruction& opc); - void mrr(const UDSPInstruction& opc); - void lrr(const UDSPInstruction& opc); - void srr(const UDSPInstruction& opc); - void lri(const UDSPInstruction& opc); - void lris(const UDSPInstruction& opc); - void lr(const UDSPInstruction& opc); - void sr(const UDSPInstruction& opc); - void si(const UDSPInstruction& opc); - void tstaxh(const UDSPInstruction& opc); - void clr(const UDSPInstruction& opc); - void clrp(const UDSPInstruction& opc); - void mulc(const UDSPInstruction& opc); - void cmpar(const UDSPInstruction& opc); - void cmp(const UDSPInstruction& opc); - void tsta(const UDSPInstruction& opc); - void addaxl(const UDSPInstruction& opc); - void addarn(const UDSPInstruction& opc); - void mulcac(const UDSPInstruction& opc); - void movr(const UDSPInstruction& opc); - void movax(const UDSPInstruction& opc); - void xorr(const UDSPInstruction& opc); - void andr(const UDSPInstruction& opc); - void orr(const UDSPInstruction& opc); - void andc(const UDSPInstruction& opc); - void add(const UDSPInstruction& opc); - void addp(const UDSPInstruction& opc); - void cmpis(const UDSPInstruction& opc); - void addpaxz(const UDSPInstruction& opc); - void movpz(const UDSPInstruction& opc); - void decm(const UDSPInstruction& opc); - void dec(const UDSPInstruction& opc); - void inc(const UDSPInstruction& opc); - void incm(const UDSPInstruction& opc); - void neg(const UDSPInstruction& opc); - void addax(const UDSPInstruction& opc); - void addr(const UDSPInstruction& opc); - void subr(const UDSPInstruction& opc); - void subax(const UDSPInstruction& opc); - void addis(const UDSPInstruction& opc); - void addi(const UDSPInstruction& opc); - void lsl16(const UDSPInstruction& opc); - void madd(const UDSPInstruction& opc); - void lsr16(const UDSPInstruction& opc); - void asr16(const UDSPInstruction& opc); - void shifti(const UDSPInstruction& opc); - void dar(const UDSPInstruction& opc); - void iar(const UDSPInstruction& opc); - void sbclr(const UDSPInstruction& opc); - void sbset(const UDSPInstruction& opc); - void movp(const UDSPInstruction& opc); - void mul(const UDSPInstruction& opc); - void mulac(const UDSPInstruction& opc); - void mulmv(const UDSPInstruction& opc); - void mulmvz(const UDSPInstruction& opc); - void mulx(const UDSPInstruction& opc); - void mulxac(const UDSPInstruction& opc); - void mulxmv(const UDSPInstruction& opc); - void mulxmvz(const UDSPInstruction& opc); - void sub(const UDSPInstruction& opc); - void maddx(const UDSPInstruction& opc); - void msubx(const UDSPInstruction& opc); - void maddc(const UDSPInstruction& opc); - void msubc(const UDSPInstruction& opc); +void unknown(const UDSPInstruction& opc); +void call(const UDSPInstruction& opc); +void ifcc(const UDSPInstruction& opc); +void jcc(const UDSPInstruction& opc); +void ret(const UDSPInstruction& opc); +void halt(const UDSPInstruction& opc); +void loop(const UDSPInstruction& opc); +void loopi(const UDSPInstruction& opc); +void bloop(const UDSPInstruction& opc); +void bloopi(const UDSPInstruction& opc); +void mrr(const UDSPInstruction& opc); +void lrr(const UDSPInstruction& opc); +void srr(const UDSPInstruction& opc); +void lri(const UDSPInstruction& opc); +void lris(const UDSPInstruction& opc); +void lr(const UDSPInstruction& opc); +void sr(const UDSPInstruction& opc); +void si(const UDSPInstruction& opc); +void tstaxh(const UDSPInstruction& opc); +void clr(const UDSPInstruction& opc); +void clrp(const UDSPInstruction& opc); +void mulc(const UDSPInstruction& opc); +void cmpar(const UDSPInstruction& opc); +void cmp(const UDSPInstruction& opc); +void tsta(const UDSPInstruction& opc); +void addaxl(const UDSPInstruction& opc); +void addarn(const UDSPInstruction& opc); +void mulcac(const UDSPInstruction& opc); +void movr(const UDSPInstruction& opc); +void movax(const UDSPInstruction& opc); +void xorr(const UDSPInstruction& opc); +void andr(const UDSPInstruction& opc); +void orr(const UDSPInstruction& opc); +void andc(const UDSPInstruction& opc); +void add(const UDSPInstruction& opc); +void addp(const UDSPInstruction& opc); +void cmpis(const UDSPInstruction& opc); +void addpaxz(const UDSPInstruction& opc); +void movpz(const UDSPInstruction& opc); +void decm(const UDSPInstruction& opc); +void dec(const UDSPInstruction& opc); +void inc(const UDSPInstruction& opc); +void incm(const UDSPInstruction& opc); +void neg(const UDSPInstruction& opc); +void addax(const UDSPInstruction& opc); +void addr(const UDSPInstruction& opc); +void subr(const UDSPInstruction& opc); +void subax(const UDSPInstruction& opc); +void addis(const UDSPInstruction& opc); +void addi(const UDSPInstruction& opc); +void lsl16(const UDSPInstruction& opc); +void madd(const UDSPInstruction& opc); +void lsr16(const UDSPInstruction& opc); +void asr16(const UDSPInstruction& opc); +void shifti(const UDSPInstruction& opc); +void dar(const UDSPInstruction& opc); +void iar(const UDSPInstruction& opc); +void sbclr(const UDSPInstruction& opc); +void sbset(const UDSPInstruction& opc); +void movp(const UDSPInstruction& opc); +void mul(const UDSPInstruction& opc); +void mulac(const UDSPInstruction& opc); +void mulmv(const UDSPInstruction& opc); +void mulmvz(const UDSPInstruction& opc); +void mulx(const UDSPInstruction& opc); +void mulxac(const UDSPInstruction& opc); +void mulxmv(const UDSPInstruction& opc); +void mulxmvz(const UDSPInstruction& opc); +void sub(const UDSPInstruction& opc); +void maddx(const UDSPInstruction& opc); +void msubx(const UDSPInstruction& opc); +void maddc(const UDSPInstruction& opc); +void msubc(const UDSPInstruction& opc); - // FIXME inside - void jmpa(const UDSPInstruction& opc); - void rti(const UDSPInstruction& opc); - void ilrr(const UDSPInstruction& opc); - void srbith(const UDSPInstruction& opc); - - void andfc(const UDSPInstruction& opc); - void andf(const UDSPInstruction& opc); - void subf(const UDSPInstruction& opc); - void xori(const UDSPInstruction& opc); - void andi(const UDSPInstruction& opc); - void ori(const UDSPInstruction& opc); - // END OF FIXMEs +// FIXME inside +void jmpa(const UDSPInstruction& opc); +void rti(const UDSPInstruction& opc); +void ilrr(const UDSPInstruction& opc); +void srbith(const UDSPInstruction& opc); + +void andfc(const UDSPInstruction& opc); +void andf(const UDSPInstruction& opc); +void subf(const UDSPInstruction& opc); +void xori(const UDSPInstruction& opc); +void andi(const UDSPInstruction& opc); +void ori(const UDSPInstruction& opc); +// END OF FIXMEs + +// TODO: PENDING IMPLEMENTATION / UNIMPLEMENTED +void mulcmvz(const UDSPInstruction& opc); +void mulcmv(const UDSPInstruction& opc); +void nx(const UDSPInstruction& opc); +void movnp(const UDSPInstruction& opc); +// END OF UNIMPLEMENTED - // TODO: PENDING IMPLEMENTATION / UNIMPLEMENTED - void mulcmvz(const UDSPInstruction& opc); - void mulcmv(const UDSPInstruction& opc); - void nx(const UDSPInstruction& opc); - void movnp(const UDSPInstruction& opc); - // END OF UNIMPLEMENTED }; #endif // _DSPINTERPRETER_H diff --git a/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPJit.h b/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPJit.h index 93564925eb..eac1386a02 100644 --- a/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPJit.h +++ b/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPJit.h @@ -19,7 +19,8 @@ #define _DSPJIT_H namespace DSPJit { - // TODO(XK): Fill + +// TODO(XK): Fill }; diff --git a/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPTables.cpp b/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPTables.cpp index ad27c41b48..646e8aa151 100644 --- a/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPTables.cpp +++ b/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPTables.cpp @@ -236,8 +236,8 @@ DSPOPCTemplate opcodes_ext[] = {"XXX", 0x0000, 0x0000, nop, nop, 1, 1, {{P_VAL, 1, 0, 0, 0x00ff}},}, }; -const u32 opcodes_size = sizeof(opcodes) / sizeof(opc_t); -const u32 opcodes_ext_size = sizeof(opcodes_ext) / sizeof(opc_t); +const u32 opcodes_size = sizeof(opcodes) / sizeof(DSPOPCTemplate); +const u32 opcodes_ext_size = sizeof(opcodes_ext) / sizeof(DSPOPCTemplate); void InitInstructionTable() { // TODO(XK): Fill diff --git a/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPTables.h b/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPTables.h index f540071939..f9202873d5 100644 --- a/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPTables.h +++ b/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPTables.h @@ -73,16 +73,16 @@ union UDSPInstruction typedef void (*dspInstFunc)(const UDSPInstruction&); -typedef struct DSPOParams +typedef struct { parameterType type; u8 size; u8 loc; s8 lshift; u16 mask; -} opcpar_t; +} DSPOParams; -typedef struct DSPOPCTemplate +typedef struct { const char *name; u16 opcode; @@ -94,11 +94,11 @@ typedef struct DSPOPCTemplate u8 size; u8 param_count; DSPOParams params[8]; -} opc_t; +} DSPOPCTemplate; extern DSPOPCTemplate opcodes[]; extern const u32 opcodes_size; -extern opc_t opcodes_ext[]; +extern DSPOPCTemplate opcodes_ext[]; extern const u32 opcodes_ext_size; void InitInstructionTable(); diff --git a/Source/Plugins/Plugin_DSP_LLE-testing/Src/disassemble.cpp b/Source/Plugins/Plugin_DSP_LLE-testing/Src/disassemble.cpp index b28fb7c274..4d9b0df2ee 100644 --- a/Source/Plugins/Plugin_DSP_LLE-testing/Src/disassemble.cpp +++ b/Source/Plugins/Plugin_DSP_LLE-testing/Src/disassemble.cpp @@ -153,7 +153,7 @@ const char* pdname(u16 val) } -char* gd_dis_params(gd_globals_t* gdg, opc_t* opc, u16 op1, u16 op2, char* strbuf) +char* gd_dis_params(gd_globals_t* gdg, DSPOPCTemplate* opc, u16 op1, u16 op2, char* strbuf) { char* buf = strbuf; u32 val; @@ -278,8 +278,8 @@ gd_globals_t* gd_init() u16 gd_dis_get_opcode_size(gd_globals_t* gdg) { - opc_t* opc = 0; - opc_t* opc_ext = 0; + DSPOPCTemplate* opc = 0; + DSPOPCTemplate* opc_ext = 0; bool extended; if ((gdg->pc & 0x7fff) >= 0x1000) @@ -353,8 +353,8 @@ char* gd_dis_opcode(gd_globals_t* gdg) { u32 j; u32 op1, op2; - opc_t* opc = NULL; - opc_t* opc_ext = NULL; + DSPOPCTemplate *opc = NULL; + DSPOPCTemplate *opc_ext = NULL; u16 pc; char* buf = gdg->buffer; bool extended;