diff --git a/hw/xbox/mcpx/dsp/dsp.c b/hw/xbox/mcpx/dsp/dsp.c index 20f01a85a2..ae0826d79c 100644 --- a/hw/xbox/mcpx/dsp/dsp.c +++ b/hw/xbox/mcpx/dsp/dsp.c @@ -38,7 +38,6 @@ /* Defines */ #define BITMASK(x) ((1<<(x))-1) -#define ARRAYSIZE(x) (int)(sizeof(x)/sizeof(x[0])) #define INTERRUPT_ABORT_FRAME (1 << 0) #define INTERRUPT_START_FRAME (1 << 1) @@ -133,7 +132,6 @@ static void write_peripheral(dsp_core_t* core, uint32_t address, uint32_t value) case 0xFFFFC4: if (value & 1) { core->is_idle = true; - break; } break; case 0xFFFFC5: @@ -154,8 +152,6 @@ static void write_peripheral(dsp_core_t* core, uint32_t address, uint32_t value) case 0xFFFFD7: dsp_dma_write(&dsp->dma, DMA_CONFIGURATION, value); break; - default: - break; } } @@ -249,6 +245,7 @@ uint32_t dsp_read_memory(DSPState* dsp, char space, uint32_t address) break; default: assert(false); + return 0; } return dsp56k_read_memory(&dsp->core, space_id, address); @@ -270,6 +267,7 @@ void dsp_write_memory(DSPState* dsp, char space, uint32_t address, uint32_t valu break; default: assert(false); + return; } dsp56k_write_memory(&dsp->core, space_id, address, value); @@ -301,22 +299,22 @@ void dsp_info(DSPState* dsp) printf("DSP core information:\n"); - for (i = 0; i < ARRAYSIZE(stackname); i++) { + for (i = 0; i < ARRAY_SIZE(stackname); i++) { printf("- %s stack:", stackname[i]); - for (j = 0; j < ARRAYSIZE(dsp->core.stack[0]); j++) { + for (j = 0; j < ARRAY_SIZE(dsp->core.stack[0]); j++) { printf(" %04x", dsp->core.stack[i][j]); } printf("\n"); } printf("- Interrupt IPL:"); - for (i = 0; i < ARRAYSIZE(dsp->core.interrupt_ipl); i++) { + for (i = 0; i < ARRAY_SIZE(dsp->core.interrupt_ipl); i++) { printf(" %04x", dsp->core.interrupt_ipl[i]); } printf("\n"); printf("- Pending ints: "); - for (i = 0; i < ARRAYSIZE(dsp->core.interrupt_is_pending); i++) { + for (i = 0; i < ARRAY_SIZE(dsp->core.interrupt_is_pending); i++) { printf(" %04hx", dsp->core.interrupt_is_pending[i]); } printf("\n"); @@ -451,7 +449,7 @@ int dsp_get_register_address(DSPState* dsp, const char *regname, uint32_t **addr /* bisect */ l = 0; - r = ARRAYSIZE(registers) - 1; + r = ARRAY_SIZE(registers) - 1; do { m = (l+r) >> 1; for (i = 0; i < len; i++) { diff --git a/hw/xbox/mcpx/dsp/dsp_cpu.c b/hw/xbox/mcpx/dsp/dsp_cpu.c index b54ea82b90..874dd494ce 100644 --- a/hw/xbox/mcpx/dsp/dsp_cpu.c +++ b/hw/xbox/mcpx/dsp/dsp_cpu.c @@ -22,14 +22,15 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "qemu/osdep.h" + #include #include #include -#include "qemu/osdep.h" #include "qemu/bswap.h" -#include "dsp_cpu.h" +#include "dsp_cpu.h" #define TRACE_DSP_DISASM 0 #define TRACE_DSP_DISASM_REG 0 @@ -38,7 +39,6 @@ #define DPRINTF(s, ...) printf(s, ## __VA_ARGS__) #define BITMASK(x) ((1<<(x))-1) -#define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0])) // #define DSP_COUNT_IPS /* Count instruction per seconds */ @@ -353,7 +353,7 @@ static const OpcodeEntry nonparallel_opcodes[] = { }; static bool matches_initialised; -static uint32_t nonparallel_matches[ARRAYSIZE(nonparallel_opcodes)][2]; +static uint32_t nonparallel_matches[ARRAY_SIZE(nonparallel_opcodes)][2]; /********************************** * Emulator kernel @@ -364,7 +364,7 @@ void dsp56k_reset_cpu(dsp_core_t* dsp) int i; if (!matches_initialised) { matches_initialised = true; - for (i=0; idisasm_str_instr); + // const int len = sizeof(dsp->disasm_str_instr); // uint64_t count, cycles; // uint16_t cycle_diff; // float percentage; - int offset; + // int offset; if (dsp->disasm_is_looping) { dsp->disasm_str_instr2[0] = 0; } - if (dsp->disasm_cur_inst_len == 1) { - offset = sprintf(dsp->disasm_str_instr2, "p:%04x %06x (%02d cyc) %-*s\n", dsp->disasm_prev_inst_pc, dsp->disasm_cur_inst, dsp->instr_cycle, len, dsp->disasm_str_instr); - } else { - offset = sprintf(dsp->disasm_str_instr2, "p:%04x %06x %06x (%02d cyc) %-*s\n", dsp->disasm_prev_inst_pc, dsp->disasm_cur_inst, read_memory_p(dsp, dsp->disasm_prev_inst_pc + 1), dsp->instr_cycle, len, dsp->disasm_str_instr); - } + // if (dsp->disasm_cur_inst_len == 1) { + // offset = sprintf(dsp->disasm_str_instr2, "p:%04x %06x (%02d cyc) %-*s\n", dsp->disasm_prev_inst_pc, dsp->disasm_cur_inst, dsp->instr_cycle, len, dsp->disasm_str_instr); + // } else { + // offset = sprintf(dsp->disasm_str_instr2, "p:%04x %06x %06x (%02d cyc) %-*s\n", dsp->disasm_prev_inst_pc, dsp->disasm_cur_inst, read_memory_p(dsp, dsp->disasm_prev_inst_pc + 1), dsp->instr_cycle, len, dsp->disasm_str_instr); + // } // if (offset > 2 && Profile_DspAddressData(dsp->disasm_prev_inst_pc, &percentage, &count, &cycles, &cycle_diff)) { // offset -= 2; // sprintf(str_instr2+offset, "%5.2f%% (%"PRId64", %"PRId64", %d)\n", @@ -1089,7 +1089,7 @@ static void write_memory_disasm(dsp_core_t* dsp, int space, uint32_t address, ui } curvalue = read_memory_disasm(dsp, space, address); - if (dsp->disasm_memory_ptr < ARRAYSIZE(dsp->str_disasm_memory)) { + if (dsp->disasm_memory_ptr < ARRAY_SIZE(dsp->str_disasm_memory)) { sprintf(dsp->str_disasm_memory[dsp->disasm_memory_ptr], "Mem: %c:0x%04x 0x%06x -> 0x%06x", space_c, address, oldvalue, curvalue); dsp->disasm_memory_ptr ++; } diff --git a/hw/xbox/mcpx/dsp/dsp_dis.inl b/hw/xbox/mcpx/dsp/dsp_dis.inl index ea9385f2bb..0cc0a98a20 100644 --- a/hw/xbox/mcpx/dsp/dsp_dis.inl +++ b/hw/xbox/mcpx/dsp/dsp_dis.inl @@ -30,7 +30,7 @@ static const char *registers_name[64]={ "x0","x1","y0","y1", "a0","b0","a2","b2", "a1","b1","a","b", - + "r0","r1","r2","r3", "r4","r5","r6","r7", "n0","n1","n2","n3", @@ -58,7 +58,7 @@ static const char* disasm_opcodes_alu[256] = { "add x,b" , "adc x,b", "asr b" , "lsr b", "sub x,b" , "sbc x,b" , "abs b" , "ror b", "add y,a" , "adc y,a", "asl a" , "lsl a", "sub y,a" , "sbc y,a" , "neg a" , "rol a", "add y,b" , "adc y,b", "asl b" , "lsl b", "sub y,b" , "sbc y,b" , "neg b" , "rol b", - + /* 0x40 - 0x7f */ "add x0,a", "tfr x0,a", "or x0,a", "eor x0,a", "sub x0,a", "cmp x0,a", "and x0,a", "cmpm x0,a", "add x0,b", "tfr x0,b", "or x0,b", "eor x0,b", "sub x0,b", "cmp x0,b", "and x0,b", "cmpm x0,b", @@ -148,7 +148,7 @@ static const char *cc_name[16] = { "ec", "lc", "gt", - + "cs", "lt", "eq", @@ -341,7 +341,7 @@ static void dis_bcc_imm(dsp_core_t* dsp) { uint32_t xxx = (dsp->disasm_cur_inst & BITMASK(5)) + ((dsp->disasm_cur_inst & (BITMASK(4) << 6)) >> 1); - dis_calc_cc(dsp, cc_code, cond_name); + dis_calc_cc(dsp, cc_code, cond_name); sprintf(dsp->disasm_str_instr,"b%s p:$%06x", cond_name, (dsp->pc + dsp_signextend(9, xxx)) & BITMASK(24) ); @@ -353,7 +353,7 @@ static void dis_bchg_aa(dsp_core_t* dsp) /* bchg #n,y:aa */ char name[16]; uint32_t memspace, value, numbit; - + memspace = (dsp->disasm_cur_inst>>6) & 1; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -371,9 +371,9 @@ static void dis_bchg_ea(dsp_core_t* dsp) { /* bchg #n,x:ea */ /* bchg #n,y:ea */ - char name[16], addr_name[16]; + char name[16], addr_name[12]; uint32_t memspace, value, numbit; - + memspace = (dsp->disasm_cur_inst>>6) & 1; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -394,7 +394,7 @@ static void dis_bchg_pp(dsp_core_t* dsp) /* bchg #n,y:pp */ char name[16]; uint32_t memspace, value, numbit; - + memspace = (dsp->disasm_cur_inst>>6) & 1; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -412,7 +412,7 @@ static void dis_bchg_reg(dsp_core_t* dsp) { /* bchg #n,R */ uint32_t value, numbit; - + value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -425,7 +425,7 @@ static void dis_bclr_aa(dsp_core_t* dsp) /* bclr #n,y:aa */ char name[16]; uint32_t memspace, value, numbit; - + memspace = (dsp->disasm_cur_inst>>6) & 1; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -443,9 +443,9 @@ static void dis_bclr_ea(dsp_core_t* dsp) { /* bclr #n,x:ea */ /* bclr #n,y:ea */ - char name[16], addr_name[16]; + char name[16], addr_name[12]; uint32_t memspace, value, numbit; - + memspace = (dsp->disasm_cur_inst>>6) & 1; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -466,7 +466,7 @@ static void dis_bclr_pp(dsp_core_t* dsp) /* bclr #n,y:pp */ char name[16]; uint32_t memspace, value, numbit; - + memspace = (dsp->disasm_cur_inst>>6) & 1; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -484,7 +484,7 @@ static void dis_bclr_reg(dsp_core_t* dsp) { /* bclr #n,R */ uint32_t value, numbit; - + value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -511,7 +511,7 @@ static void dis_brclr_pp(dsp_core_t* dsp) { uint32_t xxxx = read_memory_p(dsp, dsp->pc+1); dsp->disasm_cur_inst_len++; - + uint32_t memspace = (dsp->disasm_cur_inst>>6) & 1; uint32_t value = (dsp->disasm_cur_inst>>8) & BITMASK(6); uint32_t numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -543,7 +543,7 @@ static void dis_brset_pp(dsp_core_t* dsp) { uint32_t xxxx = read_memory_p(dsp, dsp->pc+1); dsp->disasm_cur_inst_len++; - + uint32_t memspace = (dsp->disasm_cur_inst>>6) & 1; uint32_t value = (dsp->disasm_cur_inst>>8) & BITMASK(6); uint32_t numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -577,7 +577,7 @@ static void dis_bset_aa(dsp_core_t* dsp) /* bset #n,y:aa */ char name[16]; uint32_t memspace, value, numbit; - + memspace = (dsp->disasm_cur_inst>>6) & 1; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -595,9 +595,9 @@ static void dis_bset_ea(dsp_core_t* dsp) { /* bset #n,x:ea */ /* bset #n,y:ea */ - char name[16], addr_name[16]; + char name[16], addr_name[12]; uint32_t memspace, value, numbit; - + memspace = (dsp->disasm_cur_inst>>6) & 1; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -618,7 +618,7 @@ static void dis_bset_pp(dsp_core_t* dsp) /* bset #n,y:pp */ char name[16]; uint32_t memspace, value, numbit; - + memspace = (dsp->disasm_cur_inst>>6) & 1; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -636,7 +636,7 @@ static void dis_bset_reg(dsp_core_t* dsp) { /* bset #n,R */ uint32_t value, numbit; - + value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -665,7 +665,7 @@ static void dis_btst_aa(dsp_core_t* dsp) /* btst #n,y:aa */ char name[16]; uint32_t memspace, value, numbit; - + memspace = (dsp->disasm_cur_inst>>6) & 1; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -683,9 +683,9 @@ static void dis_btst_ea(dsp_core_t* dsp) { /* btst #n,x:ea */ /* btst #n,y:ea */ - char name[16], addr_name[16]; + char name[16], addr_name[12]; uint32_t memspace, value, numbit; - + memspace = (dsp->disasm_cur_inst>>6) & 1; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -706,7 +706,7 @@ static void dis_btst_pp(dsp_core_t* dsp) /* btst #n,y:pp */ char name[16]; uint32_t memspace, value, numbit; - + memspace = (dsp->disasm_cur_inst>>6) & 1; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -724,7 +724,7 @@ static void dis_btst_reg(dsp_core_t* dsp) { /* btst #n,R */ uint32_t value, numbit; - + value = (dsp->disasm_cur_inst>>8) & BITMASK(6); numbit = dsp->disasm_cur_inst & BITMASK(5); @@ -768,7 +768,7 @@ static void dis_cmpu(dsp_core_t* dsp) { static void dis_div(dsp_core_t* dsp) { uint32_t srcreg=DSP_REG_NULL, destreg; - + switch((dsp->disasm_cur_inst>>4) & BITMASK(2)) { case 0: srcreg = DSP_REG_X0; break; case 1: srcreg = DSP_REG_Y0; break; @@ -810,9 +810,9 @@ static void dis_do_imm(dsp_core_t* dsp) static void dis_do_ea(dsp_core_t* dsp) { - char addr_name[16], name[16]; + char addr_name[12], name[16]; uint32_t ea_mode; - + dsp->disasm_cur_inst_len++; ea_mode = (dsp->disasm_cur_inst>>8) & BITMASK(6); @@ -824,7 +824,7 @@ static void dis_do_ea(dsp_core_t* dsp) sprintf(name, "x:%s", addr_name); } - sprintf(dsp->disasm_str_instr,"do %s,p:$%04x", + sprintf(dsp->disasm_str_instr,"do %s,p:$%04x", name, read_memory_p(dsp, dsp->pc+1) ); @@ -864,24 +864,24 @@ static void dis_dor_reg(dsp_core_t* dsp) static void dis_jcc_ea(dsp_core_t* dsp) { - char cond_name[16], addr_name[16]; + char cond_name[16], addr_name[12]; uint32_t cc_code=0; - + dis_calc_ea(dsp, (dsp->disasm_cur_inst >>8) & BITMASK(6), addr_name); cc_code=dsp->disasm_cur_inst & BITMASK(4); - dis_calc_cc(dsp, cc_code, cond_name); + dis_calc_cc(dsp, cc_code, cond_name); sprintf(dsp->disasm_str_instr,"j%s p:%s", cond_name, addr_name); } static void dis_jcc_imm(dsp_core_t* dsp) { - char cond_name[16], addr_name[16]; + char cond_name[16], addr_name[12]; uint32_t cc_code=0; - + sprintf(addr_name, "$%04x", dsp->disasm_cur_inst & BITMASK(12)); cc_code=(dsp->disasm_cur_inst>>12) & BITMASK(4); - dis_calc_cc(dsp, cc_code, cond_name); + dis_calc_cc(dsp, cc_code, cond_name); sprintf(dsp->disasm_str_instr,"j%s p:%s", cond_name, addr_name); } @@ -892,7 +892,7 @@ static void dis_jclr_aa(dsp_core_t* dsp) /* jclr #n,y:aa,p:xx */ char srcname[16]; uint32_t memspace, value, numbit; - + dsp->disasm_cur_inst_len++; memspace = (dsp->disasm_cur_inst>>6) & 1; @@ -916,9 +916,9 @@ static void dis_jclr_ea(dsp_core_t* dsp) { /* jclr #n,x:ea,p:xx */ /* jclr #n,y:ea,p:xx */ - char srcname[16], addr_name[16]; + char srcname[16], addr_name[12]; uint32_t memspace, value, numbit; - + dsp->disasm_cur_inst_len++; memspace = (dsp->disasm_cur_inst>>6) & 1; @@ -945,7 +945,7 @@ static void dis_jclr_pp(dsp_core_t* dsp) /* jclr #n,y:pp,p:xx */ char srcname[16]; uint32_t memspace, value, numbit; - + dsp->disasm_cur_inst_len++; memspace = (dsp->disasm_cur_inst>>6) & 1; @@ -970,7 +970,7 @@ static void dis_jclr_reg(dsp_core_t* dsp) { /* jclr #n,R,p:xx */ uint32_t value, numbit; - + dsp->disasm_cur_inst_len++; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); @@ -999,24 +999,24 @@ static void dis_jmp_ea(dsp_core_t* dsp) static void dis_jscc_ea(dsp_core_t* dsp) { - char cond_name[16], addr_name[16]; + char cond_name[16], addr_name[12]; uint32_t cc_code=0; - + dis_calc_ea(dsp, (dsp->disasm_cur_inst>>8) & BITMASK(6), addr_name); cc_code=dsp->disasm_cur_inst & BITMASK(4); - dis_calc_cc(dsp, cc_code, cond_name); + dis_calc_cc(dsp, cc_code, cond_name); sprintf(dsp->disasm_str_instr,"js%s p:%s", cond_name, addr_name); } - + static void dis_jscc_imm(dsp_core_t* dsp) { - char cond_name[16], addr_name[16]; + char cond_name[16], addr_name[12]; uint32_t cc_code=0; - + sprintf(addr_name, "$%04x", dsp->disasm_cur_inst & BITMASK(12)); cc_code=(dsp->disasm_cur_inst>>12) & BITMASK(4); - dis_calc_cc(dsp, cc_code, cond_name); + dis_calc_cc(dsp, cc_code, cond_name); sprintf(dsp->disasm_str_instr,"js%s p:%s", cond_name, addr_name); } @@ -1027,7 +1027,7 @@ static void dis_jsclr_aa(dsp_core_t* dsp) /* jsclr #n,y:aa,p:xx */ char srcname[16]; uint32_t memspace, value, numbit; - + dsp->disasm_cur_inst_len++; memspace = (dsp->disasm_cur_inst>>6) & 1; @@ -1051,9 +1051,9 @@ static void dis_jsclr_ea(dsp_core_t* dsp) { /* jsclr #n,x:ea,p:xx */ /* jsclr #n,y:ea,p:xx */ - char srcname[16], addr_name[16]; + char srcname[16], addr_name[12]; uint32_t memspace, value, numbit; - + dsp->disasm_cur_inst_len++; memspace = (dsp->disasm_cur_inst>>6) & 1; @@ -1080,7 +1080,7 @@ static void dis_jsclr_pp(dsp_core_t* dsp) /* jsclr #n,y:pp,p:xx */ char srcname[16]; uint32_t memspace, value, numbit; - + dsp->disasm_cur_inst_len++; memspace = (dsp->disasm_cur_inst>>6) & 1; @@ -1105,7 +1105,7 @@ static void dis_jsclr_reg(dsp_core_t* dsp) { /* jsclr #n,R,p:xx */ uint32_t value, numbit; - + dsp->disasm_cur_inst_len++; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); @@ -1124,7 +1124,7 @@ static void dis_jset_aa(dsp_core_t* dsp) /* jset #n,y:aa,p:xx */ char srcname[16]; uint32_t memspace, value, numbit; - + dsp->disasm_cur_inst_len++; memspace = (dsp->disasm_cur_inst>>6) & 1; @@ -1148,9 +1148,9 @@ static void dis_jset_ea(dsp_core_t* dsp) { /* jset #n,x:ea,p:xx */ /* jset #n,y:ea,p:xx */ - char srcname[16], addr_name[16]; + char srcname[16], addr_name[12]; uint32_t memspace, value, numbit; - + dsp->disasm_cur_inst_len++; memspace = (dsp->disasm_cur_inst>>6) & 1; @@ -1177,7 +1177,7 @@ static void dis_jset_pp(dsp_core_t* dsp) /* jset #n,y:pp,p:xx */ char srcname[16]; uint32_t memspace, value, numbit; - + dsp->disasm_cur_inst_len++; memspace = (dsp->disasm_cur_inst>>6) & 1; @@ -1202,7 +1202,7 @@ static void dis_jset_reg(dsp_core_t* dsp) { /* jset #n,R,p:xx */ uint32_t value, numbit; - + dsp->disasm_cur_inst_len++; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); @@ -1235,7 +1235,7 @@ static void dis_jsset_aa(dsp_core_t* dsp) /* jsset #n,y:aa,p:xx */ char srcname[16]; uint32_t memspace, value, numbit; - + dsp->disasm_cur_inst_len++; memspace = (dsp->disasm_cur_inst>>6) & 1; @@ -1259,9 +1259,9 @@ static void dis_jsset_ea(dsp_core_t* dsp) { /* jsset #n,x:ea,p:xx */ /* jsset #n,y:ea,p:xx */ - char srcname[16], addr_name[16]; + char srcname[16], addr_name[12]; uint32_t memspace, value, numbit; - + dsp->disasm_cur_inst_len++; memspace = (dsp->disasm_cur_inst>>6) & 1; @@ -1288,7 +1288,7 @@ static void dis_jsset_pp(dsp_core_t* dsp) /* jsset #n,y:pp,p:xx */ char srcname[16]; uint32_t memspace, value, numbit; - + dsp->disasm_cur_inst_len++; memspace = (dsp->disasm_cur_inst>>6) & 1; @@ -1313,7 +1313,7 @@ static void dis_jsset_reg(dsp_core_t* dsp) { /* jsset #n,r,p:xx */ uint32_t value, numbit; - + dsp->disasm_cur_inst_len++; value = (dsp->disasm_cur_inst>>8) & BITMASK(6); @@ -1328,11 +1328,11 @@ static void dis_jsset_reg(dsp_core_t* dsp) static void dis_lua(dsp_core_t* dsp) { - char addr_name[16]; + char addr_name[12]; dis_calc_ea(dsp, (dsp->disasm_cur_inst>>8) & BITMASK(5), addr_name); uint32_t numreg = dsp->disasm_cur_inst & BITMASK(4); - + sprintf(dsp->disasm_str_instr,"lua %s,%s", addr_name, registers_name[numreg]); } @@ -1421,7 +1421,7 @@ static void dis_movec_imm(dsp_core_t* dsp) static void dis_movec_ea(dsp_core_t* dsp) { const char *spacename; - char srcname[16], dstname[16], addr_name[16]; + char srcname[16], dstname[16], addr_name[12]; uint32_t numreg, ea_mode; int retour; @@ -1462,7 +1462,7 @@ static void dis_movem_aa(dsp_core_t* dsp) { /* S,p:aa */ /* p:aa,D */ - char addr_name[16], srcname[16], dstname[16]; + char addr_name[12], srcname[16], dstname[16]; uint32_t numreg; sprintf(addr_name, "$%04x",(dsp->disasm_cur_inst>>8) & BITMASK(6)); @@ -1484,7 +1484,7 @@ static void dis_movem_ea(dsp_core_t* dsp) { /* S,p:ea */ /* p:ea,D */ - char addr_name[16], srcname[16], dstname[16]; + char addr_name[12], srcname[16], dstname[16]; uint32_t ea_mode, numreg; ea_mode = (dsp->disasm_cur_inst>>8) & BITMASK(6); @@ -1544,8 +1544,8 @@ static void dis_movep_0(dsp_core_t* dsp) static void dis_movep_1(dsp_core_t* dsp) { - char srcname[16]="",dstname[16]="",name[16]=""; - uint32_t addr, memspace; + char srcname[16]="",dstname[16]="",addr_name[12]=""; + uint32_t addr, memspace; /* p:ea,x:pp */ /* x:pp,p:ea */ @@ -1553,13 +1553,13 @@ static void dis_movep_1(dsp_core_t* dsp) /* y:pp,p:ea */ addr = 0xffffc0 + (dsp->disasm_cur_inst & BITMASK(6)); - dis_calc_ea(dsp, (dsp->disasm_cur_inst>>8) & BITMASK(6), name); + dis_calc_ea(dsp, (dsp->disasm_cur_inst>>8) & BITMASK(6), addr_name); memspace = (dsp->disasm_cur_inst>>16) & 1; if (dsp->disasm_cur_inst & (1<<15)) { /* Write pp */ - sprintf(srcname, "p:%s", name); + sprintf(srcname, "p:%s", addr_name); if (memspace) { sprintf(dstname, "y:$%06x", addr); @@ -1575,7 +1575,7 @@ static void dis_movep_1(dsp_core_t* dsp) sprintf(srcname, "x:$%06x", addr); } - sprintf(dstname, "p:%s", name); + sprintf(dstname, "p:%s", addr_name); } sprintf(dsp->disasm_str_instr,"movep %s,%s", srcname, dstname); @@ -1583,8 +1583,8 @@ static void dis_movep_1(dsp_core_t* dsp) static void dis_movep_23(dsp_core_t* dsp) { - char srcname[16]="",dstname[16]="",name[16]=""; - uint32_t addr, memspace, easpace, retour; + char srcname[16]="",dstname[16]="",addr_name[12]=""; + uint32_t addr, memspace, easpace, retour; /* x:ea,x:pp */ /* y:ea,x:pp */ @@ -1599,7 +1599,7 @@ static void dis_movep_23(dsp_core_t* dsp) /* y:pp,x:ea */ addr = 0xffffc0 + (dsp->disasm_cur_inst & BITMASK(6)); - retour = dis_calc_ea(dsp, (dsp->disasm_cur_inst>>8) & BITMASK(6), name); + retour = dis_calc_ea(dsp, (dsp->disasm_cur_inst>>8) & BITMASK(6), addr_name); memspace = (dsp->disasm_cur_inst>>16) & 1; easpace = (dsp->disasm_cur_inst>>6) & 1; @@ -1607,12 +1607,12 @@ static void dis_movep_23(dsp_core_t* dsp) /* Write pp */ if (retour) { - sprintf(srcname, "#%s", name); + sprintf(srcname, "#%s", addr_name); } else { if (easpace) { - sprintf(srcname, "y:%s", name); + sprintf(srcname, "y:%s", addr_name); } else { - sprintf(srcname, "x:%s", name); + sprintf(srcname, "x:%s", addr_name); } } @@ -1631,9 +1631,9 @@ static void dis_movep_23(dsp_core_t* dsp) } if (easpace) { - sprintf(dstname, "y:%s", name); + sprintf(dstname, "y:%s", addr_name); } else { - sprintf(dstname, "x:%s", name); + sprintf(dstname, "x:%s", addr_name); } } @@ -1643,23 +1643,23 @@ static void dis_movep_23(dsp_core_t* dsp) static void dis_movep_x_qq(dsp_core_t* dsp) { // 00000111W1MMMRRR0Sqqqqqq - char srcname[16]="",dstname[16]="",name[16]=""; + char srcname[16]="",dstname[16]="",addr_name[12]=""; uint32_t addr = 0xffff80 + (dsp->disasm_cur_inst & BITMASK(6)); uint32_t ea_mode = (dsp->disasm_cur_inst>>8) & BITMASK(6); uint32_t easpace = (dsp->disasm_cur_inst>>6) & 1; - int retour = dis_calc_ea(dsp, ea_mode, name); + int retour = dis_calc_ea(dsp, ea_mode, addr_name); if (dsp->disasm_cur_inst & (1<<15)) { /* Write qq */ if (retour) { - sprintf(srcname, "#%s", name); + sprintf(srcname, "#%s", addr_name); } else { if (easpace) { - sprintf(srcname, "y:%s", name); + sprintf(srcname, "y:%s", addr_name); } else { - sprintf(srcname, "x:%s", name); + sprintf(srcname, "x:%s", addr_name); } } @@ -1670,9 +1670,9 @@ static void dis_movep_x_qq(dsp_core_t* dsp) { sprintf(srcname, "x:$%04x", addr); if (easpace) { - sprintf(dstname, "y:%s", name); + sprintf(dstname, "y:%s", addr_name); } else { - sprintf(dstname, "x:%s", name); + sprintf(dstname, "x:%s", addr_name); } } @@ -1707,7 +1707,7 @@ static void dis_move_xy_imm(dsp_core_t* dsp, int space) + ((dsp->disasm_cur_inst >> 6) & 1); uint32_t offreg = DSP_REG_R0 + ((dsp->disasm_cur_inst >> 8) & BITMASK(3)); uint32_t numreg = dsp->disasm_cur_inst & BITMASK(4); - + int32_t xxx_s = dsp_signextend(7, xxx); if (W) { sprintf(dsp->disasm_str_instr, "move %c:(%s + %d), %s", @@ -1812,7 +1812,7 @@ static void dis_rep_imm(dsp_core_t* dsp) static void dis_rep_ea(dsp_core_t* dsp) { - char name[16],addr_name[16]; + char name[16],addr_name[12]; /* x:ea */ /* y:ea */ @@ -1893,7 +1893,7 @@ static void dis_pm(dsp_core_t* dsp) static void dis_pm_0(dsp_core_t* dsp) { - char space_name[16], addr_name[16]; + char space_name[16], addr_name[12]; uint32_t memspace, numreg1, numreg2; /* 0000 100d 00mm mrrr S,x:ea x0,D @@ -1932,7 +1932,7 @@ static void dis_pm_1(dsp_core_t* dsp) S1,D1 #xxxxxx,D2 */ - char addr_name[16]; + char addr_name[12]; uint32_t memspace, write_flag, retour, s1reg, s2reg, d1reg, d2reg; memspace = (dsp->disasm_cur_inst>>14) & 1; @@ -1977,7 +1977,7 @@ static void dis_pm_1(dsp_core_t* dsp) registers_name[s2reg], addr_name ); - } + } } else { s1reg = d1reg = DSP_REG_X0; @@ -2017,14 +2017,14 @@ static void dis_pm_1(dsp_core_t* dsp) registers_name[s2reg], registers_name[d2reg] ); - } - + } + } } static void dis_pm_2(dsp_core_t* dsp) { - char addr_name[16]; + char addr_name[12]; uint32_t numreg1, numreg2; /* 0010 0000 0000 0000 nop @@ -2045,7 +2045,7 @@ static void dis_pm_2(dsp_core_t* dsp) if (((dsp->disasm_cur_inst >> 8) & 0xfc00) == 0x2000) { numreg1 = (dsp->disasm_cur_inst>>13) & BITMASK(5); numreg2 = (dsp->disasm_cur_inst>>8) & BITMASK(5); - sprintf(dsp->disasm_parallelmove_name, "%s,%s", registers_name[numreg1], registers_name[numreg2]); + sprintf(dsp->disasm_parallelmove_name, "%s,%s", registers_name[numreg1], registers_name[numreg2]); return; } @@ -2055,7 +2055,7 @@ static void dis_pm_2(dsp_core_t* dsp) static void dis_pm_4(dsp_core_t* dsp) { - char addr_name[16]; + char addr_name[12]; uint32_t value, retour, ea_mode, memspace; /* 0100 l0ll w0aa aaaa l:aa,D @@ -2081,7 +2081,7 @@ static void dis_pm_4(dsp_core_t* dsp) if ((value>>2)==0) { /* L: memory move */ if (dsp->disasm_cur_inst & (1<<14)) { - retour = dis_calc_ea(dsp, ea_mode, addr_name); + retour = dis_calc_ea(dsp, ea_mode, addr_name); } else { sprintf(addr_name,"$%04x", ea_mode); retour = 0; @@ -2108,7 +2108,7 @@ static void dis_pm_4(dsp_core_t* dsp) memspace = (dsp->disasm_cur_inst>>19) & 1; if (dsp->disasm_cur_inst & (1<<14)) { - retour = dis_calc_ea(dsp, ea_mode, addr_name); + retour = dis_calc_ea(dsp, ea_mode, addr_name); } else { sprintf(addr_name,"$%04x", ea_mode); retour = 0; @@ -2153,7 +2153,7 @@ static void dis_pm_8(dsp_core_t* dsp) char addr1_name[16], addr2_name[16]; uint32_t ea_mode1, ea_mode2, numreg1, numreg2; /* - 1wmm eeff WrrM MRRR x:ea,D1 y:ea,D2 + 1wmm eeff WrrM MRRR x:ea,D1 y:ea,D2 x:ea,D1 S2,y:ea S1,x:ea y:ea,D2 S1,x:ea S2,y:ea @@ -2189,7 +2189,7 @@ static void dis_pm_8(dsp_core_t* dsp) dis_calc_ea(dsp, ea_mode1, addr1_name); dis_calc_ea(dsp, ea_mode2, addr2_name); - + if (dsp->disasm_cur_inst & (1<<15)) { if (dsp->disasm_cur_inst & (1<<22)) { sprintf(dsp->disasm_parallelmove_name, "x:%s,%s y:%s,%s", @@ -2222,5 +2222,5 @@ static void dis_pm_8(dsp_core_t* dsp) addr2_name ); } - } + } } diff --git a/hw/xbox/mcpx/dsp/dsp_dma.c b/hw/xbox/mcpx/dsp/dsp_dma.c index 84ec4ffe99..377475fb76 100644 --- a/hw/xbox/mcpx/dsp/dsp_dma.c +++ b/hw/xbox/mcpx/dsp/dsp_dma.c @@ -146,11 +146,9 @@ static void dsp_dma_run(DSPDMAState *s) while (!(s->next_block & NODE_POINTER_EOL)) { uint32_t addr = s->next_block & NODE_POINTER_VAL; + uint32_t block_addr = 0; + int block_space = DSP_SPACE_X; - // FIXME: Are these block addresses BYTE addresses or WORD addresses? - // Need to understand this DMA engine better. - uint32_t block_addr; - int block_space; if (addr < 0x1800) { assert(addr+6 < 0x1800); block_space = DSP_SPACE_X; @@ -199,19 +197,19 @@ static void dsp_dma_run(DSPDMAState *s) uint32_t channel_count = (count & 0xF) + 1; uint32_t block_count = count >> 4; - unsigned int item_size; + unsigned int item_size = 4; uint32_t item_mask = 0xffffffff; // bool lsb = (format == 6); // FIXME switch(format) { case 1: item_size = 2; - item_mask = 0x0000FFFF; + item_mask = 0x0000ffff; break; case 2: case 6: item_size = 4; - item_mask = 0x00FFFFFF; + item_mask = 0x00ffffff; break; default: fprintf(stderr, "Unknown dsp dma format: 0x%x\n", format); @@ -220,9 +218,9 @@ static void dsp_dma_run(DSPDMAState *s) } size_t scratch_addr = scratch_base + scratch_offset; + uint32_t mem_address = 0; + int mem_space = DSP_SPACE_X; - uint32_t mem_address; - int mem_space; if (dsp_offset < 0x1800) { assert(dsp_offset+count < 0x1800); mem_space = DSP_SPACE_X; @@ -274,7 +272,6 @@ static void dsp_dma_run(DSPDMAState *s) } } } - } else { for (int i = 0; i < count; i++) { uint32_t v = dsp56k_read_memory(s->core, mem_space, mem_address+i); @@ -334,6 +331,7 @@ static void dsp_dma_run(DSPDMAState *s) v = (*(uint32_t*)(scratch_buf + i*4)) & item_mask; break; default: + v = 0; assert(false); break; } diff --git a/hw/xbox/mcpx/dsp/dsp_emu.inl b/hw/xbox/mcpx/dsp/dsp_emu.inl index aa67a20dad..e509baa2d7 100644 --- a/hw/xbox/mcpx/dsp/dsp_emu.inl +++ b/hw/xbox/mcpx/dsp/dsp_emu.inl @@ -58,9 +58,9 @@ static void emu_update_rn_bitreverse(dsp_core_t* dsp, uint32_t numreg) if (value & (1<registers[DSP_REG_R0+numreg]; value = r_reg & (BITMASK(16)-BITMASK(revbits)); @@ -100,7 +100,7 @@ static void emu_update_rn_modulo(dsp_core_t* dsp, uint32_t numreg, int16_t modif bufsize <<= 1; bufmask <<= 1; } - + lobound = dsp->registers[DSP_REG_R0+numreg] & bufmask; hibound = lobound + modulo - 1; @@ -124,7 +124,7 @@ static void emu_update_rn_modulo(dsp_core_t* dsp, uint32_t numreg, int16_t modif r_reg -= modulo; } else if (r_regregisters[DSP_REG_R0+numreg] = ((uint32_t) r_reg) & BITMASK(16); @@ -244,7 +244,7 @@ static int emu_calc_cc(dsp_core_t* dsp, uint32_t cc_code) case 6: /* LC */ value1 = dsp->registers[DSP_REG_SR] & (1<registers[DSP_REG_SR] >> DSP_SR_N) & 1; value2 = (dsp->registers[DSP_REG_SR] >> DSP_SR_V) & 1; value3 = (dsp->registers[DSP_REG_SR] >> DSP_SR_Z) & 1; @@ -290,7 +290,7 @@ static int emu_calc_cc(dsp_core_t* dsp, uint32_t cc_code) /* reg1 has bits 47..24 */ /* reg2 has bits 23..0 */ -static void emu_ccr_update_e_u_n_z(dsp_core_t* dsp, uint32_t reg0, uint32_t reg1, uint32_t reg2) +static void emu_ccr_update_e_u_n_z(dsp_core_t* dsp, uint32_t reg0, uint32_t reg1, uint32_t reg2) { uint32_t scaling, value_e, value_u; @@ -306,7 +306,7 @@ static void emu_ccr_update_e_u_n_z(dsp_core_t* dsp, uint32_t reg0, uint32_t reg1 dsp->registers[DSP_REG_SR] |= 1 << DSP_SR_E; /* Unnormalized bit (U) */ - if ((reg1 & 0xc00000) == 0 || (reg1 & 0xc00000) == 0xc00000) + if ((reg1 & 0xc00000) == 0 || (reg1 & 0xc00000) == 0xc00000) dsp->registers[DSP_REG_SR] |= 1 << DSP_SR_U; break; case 1: @@ -316,7 +316,7 @@ static void emu_ccr_update_e_u_n_z(dsp_core_t* dsp, uint32_t reg0, uint32_t reg1 /* Unnormalized bit (U) */ value_u = ((reg0<<1) + (reg1>>23)) & 3; - if (value_u == 0 || value_u == 3) + if (value_u == 0 || value_u == 3) dsp->registers[DSP_REG_SR] |= 1 << DSP_SR_U; break; case 2: @@ -326,7 +326,7 @@ static void emu_ccr_update_e_u_n_z(dsp_core_t* dsp, uint32_t reg0, uint32_t reg1 dsp->registers[DSP_REG_SR] |= 1 << DSP_SR_E; /* Unnormalized bit (U) */ - if ((reg1 & 0x600000) == 0 || (reg1 & 0x600000) == 0x600000) + if ((reg1 & 0x600000) == 0 || (reg1 & 0x600000) == 0x600000) dsp->registers[DSP_REG_SR] |= 1 << DSP_SR_U; break; default: @@ -406,7 +406,7 @@ static void emu_adc_x_a(dsp_core_t* dsp) source[0] = source[1] & (1<<23) ? 0xff : 0x0; newsr = dsp_add56(source, dest); - + if (curcarry) { source[0]=0; source[1]=0; source[2]=1; newsr |= dsp_add56(source, dest); @@ -438,7 +438,7 @@ static void emu_adc_x_b(dsp_core_t* dsp) source[0] = source[1] & (1<<23) ? 0xff : 0x0; newsr = dsp_add56(source, dest); - + if (curcarry) { source[0]=0; source[1]=0; source[2]=1; newsr |= dsp_add56(source, dest); @@ -470,7 +470,7 @@ static void emu_adc_y_a(dsp_core_t* dsp) source[0] = source[1] & (1<<23) ? 0xff : 0x0; newsr = dsp_add56(source, dest); - + if (curcarry) { source[0]=0; source[1]=0; source[2]=1; newsr |= dsp_add56(source, dest); @@ -502,7 +502,7 @@ static void emu_adc_y_b(dsp_core_t* dsp) source[0] = source[1] & (1<<23) ? 0xff : 0x0; newsr = dsp_add56(source, dest); - + if (curcarry) { source[0]=0; source[1]=0; source[2]=1; newsr |= dsp_add56(source, dest); @@ -4389,7 +4389,7 @@ static void emu_sbc_x_a(dsp_core_t* dsp) source[0] = source[1] & (1<<23) ? 0xff : 0x0; newsr = dsp_sub56(source, dest); - + if (curcarry) { source[0]=0; source[1]=0; source[2]=1; newsr |= dsp_sub56(source, dest); @@ -4421,7 +4421,7 @@ static void emu_sbc_x_b(dsp_core_t* dsp) source[0] = source[1] & (1<<23) ? 0xff : 0x0; newsr = dsp_sub56(source, dest); - + if (curcarry) { source[0]=0; source[1]=0; source[2]=1; newsr |= dsp_sub56(source, dest); @@ -4453,7 +4453,7 @@ static void emu_sbc_y_a(dsp_core_t* dsp) source[0] = source[1] & (1<<23) ? 0xff : 0x0; newsr = dsp_sub56(source, dest); - + if (curcarry) { source[0]=0; source[1]=0; source[2]=1; newsr |= dsp_sub56(source, dest); @@ -4485,7 +4485,7 @@ static void emu_sbc_y_b(dsp_core_t* dsp) source[0] = source[1] & (1<<23) ? 0xff : 0x0; newsr = dsp_sub56(source, dest); - + if (curcarry) { source[0]=0; source[1]=0; source[2]=1; newsr |= dsp_sub56(source, dest); @@ -4909,13 +4909,13 @@ static void emu_subr_a(dsp_core_t* dsp) dest[0] = dsp->registers[DSP_REG_A2]; dest[1] = dsp->registers[DSP_REG_A1]; dest[2] = dsp->registers[DSP_REG_A0]; - + newsr = dsp_asr56(dest, 1); source[0] = dsp->registers[DSP_REG_B2]; source[1] = dsp->registers[DSP_REG_B1]; source[2] = dsp->registers[DSP_REG_B0]; - + newsr |= dsp_sub56(source, dest); dsp->registers[DSP_REG_A2] = dest[0]; @@ -4936,13 +4936,13 @@ static void emu_subr_b(dsp_core_t* dsp) dest[0] = dsp->registers[DSP_REG_B2]; dest[1] = dsp->registers[DSP_REG_B1]; dest[2] = dsp->registers[DSP_REG_B0]; - + newsr = dsp_asr56(dest, 1); source[0] = dsp->registers[DSP_REG_A2]; source[1] = dsp->registers[DSP_REG_A1]; source[2] = dsp->registers[DSP_REG_A0]; - + newsr |= dsp_sub56(source, dest); dsp->registers[DSP_REG_B2] = dest[0]; @@ -5104,7 +5104,7 @@ static const emu_func_t opcodes_alu[256] = { emu_add_x_b, emu_adc_x_b, emu_asr_b, emu_lsr_b, emu_sub_x_b, emu_sbc_x_b, emu_abs_b, emu_ror_b, emu_add_y_a, emu_adc_y_a, emu_asl_a, emu_lsl_a, emu_sub_y_a, emu_sbc_y_a, emu_neg_a, emu_rol_a, emu_add_y_b, emu_adc_y_b, emu_asl_b, emu_lsl_b, emu_sub_y_b, emu_sbc_y_b, emu_neg_b, emu_rol_b, - + /* 0x40 - 0x7f */ emu_add_x0_a, emu_tfr_x0_a, emu_or_x0_a, emu_eor_x0_a, emu_sub_x0_a, emu_cmp_x0_a, emu_and_x0_a, emu_cmpm_x0_a, emu_add_x0_b, emu_tfr_x0_b, emu_or_x0_b, emu_eor_x0_b, emu_sub_x0_b, emu_cmp_x0_b, emu_and_x0_b, emu_cmpm_x0_b, @@ -5178,7 +5178,7 @@ static int emu_pm_read_accu24(dsp_core_t* dsp, int numreg, uint32_t *dest) value |= (dsp->registers[DSP_REG_A0+reg]>>23) & 1; break; /* indeterminate */ - case 3: + case 3: break; } @@ -5190,7 +5190,7 @@ static int emu_pm_read_accu24(dsp_core_t* dsp, int numreg, uint32_t *dest) /* No limiting */ *dest=value; return 0; - } + } } if (dsp->registers[DSP_REG_A2+reg] == 0xff) { @@ -5198,7 +5198,7 @@ static int emu_pm_read_accu24(dsp_core_t* dsp, int numreg, uint32_t *dest) /* No limiting */ *dest=value; return 0; - } + } } if (dsp->registers[DSP_REG_A2+reg] & (1<<7)) { @@ -5211,7 +5211,7 @@ static int emu_pm_read_accu24(dsp_core_t* dsp, int numreg, uint32_t *dest) *dest=0x007fffff; dsp->registers[DSP_REG_SR] |= (1<cur_inst>>16) & 1; emu_calc_ea(dsp, (dsp->cur_inst>>8) & BITMASK(6), &addr); - /* Save A or B */ + /* Save A or B */ emu_pm_read_accu24(dsp, numreg, &save_accu); /* Save X0 or Y0 */ @@ -5236,7 +5236,7 @@ static void emu_pm_0(dsp_core_t* dsp) /* Execute parallel instruction */ opcodes_alu[dsp->cur_inst & BITMASK(8)](dsp); - /* Move [A|B] to [x|y]:ea */ + /* Move [A|B] to [x|y]:ea */ dsp56k_write_memory(dsp, memspace, addr, save_accu); /* Move [x|y]0 to [A|B] */ @@ -5257,7 +5257,7 @@ static void emu_pm_1(dsp_core_t* dsp) S1,D1 #xxxxxx,D2 */ value = (dsp->cur_inst>>8) & BITMASK(6); - retour = emu_calc_ea(dsp, value, &xy_addr); + retour = emu_calc_ea(dsp, value, &xy_addr); memspace = (dsp->cur_inst>>14) & 1; numreg1 = numreg2 = DSP_REG_NULL; @@ -5292,7 +5292,7 @@ static void emu_pm_1(dsp_core_t* dsp) else save_1 = dsp->registers[numreg1]; } - + /* S2 */ if (memspace) { /* Y: */ @@ -5300,9 +5300,9 @@ static void emu_pm_1(dsp_core_t* dsp) } else { /* X: */ numreg2 = DSP_REG_A + ((dsp->cur_inst>>17) & 1); - } + } emu_pm_read_accu24(dsp, numreg2, &save_2); - + /* Execute parallel instruction */ opcodes_alu[dsp->cur_inst & BITMASK(8)](dsp); @@ -5335,12 +5335,10 @@ static void emu_pm_1(dsp_core_t* dsp) } else { /* X: */ numreg2 = DSP_REG_Y0 + ((dsp->cur_inst>>16) & 1); - } + } dsp->registers[numreg2] = save_2; } -static void emu_pm_2_2(dsp_core_t* dsp); - static void emu_pm_2(dsp_core_t* dsp) { uint32_t dummy; @@ -5377,7 +5375,7 @@ static void emu_pm_2_2(dsp_core_t* dsp) 0010 00ee eeed dddd S,D */ uint32_t srcreg, dstreg, save_reg; - + srcreg = (dsp->cur_inst >> 13) & BITMASK(5); dstreg = (dsp->cur_inst >> 8) & BITMASK(5); @@ -5483,7 +5481,7 @@ static void emu_pm_4x(dsp_core_t* dsp) */ value = (dsp->cur_inst>>8) & BITMASK(6); if (dsp->cur_inst & (1<<14)) { - emu_calc_ea(dsp, value, &l_addr); + emu_calc_ea(dsp, value, &l_addr); } else { l_addr = value; } @@ -5541,13 +5539,13 @@ static void emu_pm_4x(dsp_core_t* dsp) break; case 6: /* AB */ - emu_pm_read_accu24(dsp, DSP_REG_A, &save_lx); - emu_pm_read_accu24(dsp, DSP_REG_B, &save_ly); + emu_pm_read_accu24(dsp, DSP_REG_A, &save_lx); + emu_pm_read_accu24(dsp, DSP_REG_B, &save_ly); break; case 7: /* BA */ - emu_pm_read_accu24(dsp, DSP_REG_B, &save_lx); - emu_pm_read_accu24(dsp, DSP_REG_A, &save_ly); + emu_pm_read_accu24(dsp, DSP_REG_B, &save_lx); + emu_pm_read_accu24(dsp, DSP_REG_A, &save_ly); break; } } @@ -5629,7 +5627,7 @@ static void emu_pm_5(dsp_core_t* dsp) value = (dsp->cur_inst>>8) & BITMASK(6); if (dsp->cur_inst & (1<<14)) { - retour = emu_calc_ea(dsp, value, &xy_addr); + retour = emu_calc_ea(dsp, value, &xy_addr); } else { xy_addr = value; retour = 0; @@ -5686,7 +5684,7 @@ static void emu_pm_8(dsp_core_t* dsp) uint32_t numreg1, numreg2; uint32_t save_reg1, save_reg2, x_addr, y_addr; /* - 1wmm eeff WrrM MRRR x:ea,D1 y:ea,D2 + 1wmm eeff WrrM MRRR x:ea,D1 y:ea,D2 x:ea,D1 S2,y:ea S1,x:ea y:ea,D2 S1,x:ea S2,y:ea @@ -5721,7 +5719,7 @@ static void emu_pm_8(dsp_core_t* dsp) case 2: numreg2=DSP_REG_A; break; case 3: numreg2=DSP_REG_B; break; } - + if (dsp->cur_inst & (1<<15)) { /* Write D1 */ save_reg1 = dsp56k_read_memory(dsp, DSP_SPACE_X, x_addr); @@ -6009,7 +6007,7 @@ static void emu_bcc_imm(dsp_core_t* dsp) static void emu_bchg_aa(dsp_core_t* dsp) { uint32_t memspace, addr, value, newcarry, numbit; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6034,7 +6032,7 @@ static void emu_bchg_aa(dsp_core_t* dsp) static void emu_bchg_ea(dsp_core_t* dsp) { uint32_t memspace, addr, value, newcarry, numbit; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6059,7 +6057,7 @@ static void emu_bchg_ea(dsp_core_t* dsp) static void emu_bchg_pp(dsp_core_t* dsp) { uint32_t memspace, addr, value, newcarry, numbit; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6084,7 +6082,7 @@ static void emu_bchg_pp(dsp_core_t* dsp) static void emu_bchg_reg(dsp_core_t* dsp) { uint32_t value, numreg, newcarry, numbit; - + numreg = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6113,7 +6111,7 @@ static void emu_bchg_reg(dsp_core_t* dsp) static void emu_bclr_aa(dsp_core_t* dsp) { uint32_t memspace, addr, value, newcarry, numbit; - + memspace = (dsp->cur_inst>>6) & 1; addr = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6133,7 +6131,7 @@ static void emu_bclr_aa(dsp_core_t* dsp) static void emu_bclr_ea(dsp_core_t* dsp) { uint32_t memspace, addr, value, newcarry, numbit; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6154,7 +6152,7 @@ static void emu_bclr_ea(dsp_core_t* dsp) static void emu_bclr_pp(dsp_core_t* dsp) { uint32_t memspace, addr, value, newcarry, numbit; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6175,7 +6173,7 @@ static void emu_bclr_pp(dsp_core_t* dsp) static void emu_bclr_reg(dsp_core_t* dsp) { uint32_t value, numreg, newcarry, numbit; - + numreg = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6253,7 +6251,7 @@ static void emu_brclr_reg(dsp_core_t* dsp) } dsp->instr_cycle += 4; - + if ((value & (1<pc += xxxx; dsp->pc &= BITMASK(24); @@ -6297,7 +6295,7 @@ static void emu_brset_reg(dsp_core_t* dsp) } dsp->instr_cycle += 4; - + if (value & (1<pc += xxxx; dsp->pc &= BITMASK(24); @@ -6308,7 +6306,7 @@ static void emu_brset_reg(dsp_core_t* dsp) static void emu_bset_aa(dsp_core_t* dsp) { uint32_t memspace, addr, value, newcarry, numbit; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6365,7 +6363,7 @@ static void emu_bsr_imm(dsp_core_t* dsp) static void emu_bset_ea(dsp_core_t* dsp) { uint32_t memspace, addr, value, newcarry, numbit; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6386,7 +6384,7 @@ static void emu_bset_ea(dsp_core_t* dsp) static void emu_bset_pp(dsp_core_t* dsp) { uint32_t memspace, addr, value, newcarry, numbit; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6406,7 +6404,7 @@ static void emu_bset_pp(dsp_core_t* dsp) static void emu_bset_reg(dsp_core_t* dsp) { uint32_t value, numreg, newcarry, numbit; - + numreg = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6431,7 +6429,7 @@ static void emu_bset_reg(dsp_core_t* dsp) static void emu_btst_aa(dsp_core_t* dsp) { uint32_t memspace, addr, value, newcarry, numbit; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6450,7 +6448,7 @@ static void emu_btst_aa(dsp_core_t* dsp) static void emu_btst_ea(dsp_core_t* dsp) { uint32_t memspace, addr, value, newcarry, numbit; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6469,7 +6467,7 @@ static void emu_btst_ea(dsp_core_t* dsp) static void emu_btst_pp(dsp_core_t* dsp) { uint32_t memspace, addr, value, newcarry, numbit; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6488,7 +6486,7 @@ static void emu_btst_pp(dsp_core_t* dsp) static void emu_btst_reg(dsp_core_t* dsp) { uint32_t value, numreg, newcarry, numbit; - + numreg = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6702,7 +6700,7 @@ static void emu_div(dsp_core_t* dsp) dsp->registers[DSP_REG_B1] = dest[1]; dsp->registers[DSP_REG_B0] = dest[2]; } - + dsp->registers[DSP_REG_SR] &= BITMASK(16)-((1<registers[DSP_REG_SR] |= (1-((dest[0]>>7) & 1))<registers[DSP_REG_SR] |= newsr & (1<cur_inst>>8) & BITMASK(6); if ((numreg == DSP_REG_A) || (numreg == DSP_REG_B)) { - emu_pm_read_accu24(dsp, numreg, &dsp->registers[DSP_REG_LC]); + emu_pm_read_accu24(dsp, numreg, &dsp->registers[DSP_REG_LC]); } else { dsp->registers[DSP_REG_LC] = dsp->registers[numreg]; } @@ -6806,7 +6804,7 @@ static void emu_dor_imm(dsp_core_t* dsp) dsp_stack_push(dsp, dsp->registers[DSP_REG_LA], dsp->registers[DSP_REG_LC], 0); dsp->registers[DSP_REG_LA] = (dsp->pc + xxxx) & BITMASK(16); - + dsp_stack_push(dsp, dsp->pc+dsp->cur_inst_len, dsp->registers[DSP_REG_SR], 0); dsp->registers[DSP_REG_SR] |= (1<registers[DSP_REG_LA], dsp->registers[DSP_REG_LC], 0); dsp->registers[DSP_REG_LA] = (dsp->pc + xxxx) & BITMASK(16); - + dsp_stack_push(dsp, dsp->pc+dsp->cur_inst_len, dsp->registers[DSP_REG_SR], 0); dsp->registers[DSP_REG_SR] |= (1<cur_inst>>8) & BITMASK(6); if ((numreg == DSP_REG_A) || (numreg == DSP_REG_B)) { - emu_pm_read_accu24(dsp, numreg, &dsp->registers[DSP_REG_LC]); + emu_pm_read_accu24(dsp, numreg, &dsp->registers[DSP_REG_LC]); } else { dsp->registers[DSP_REG_LC] = dsp->registers[numreg]; } @@ -6927,7 +6925,7 @@ static void emu_jcc_ea(dsp_core_t* dsp) static void emu_jclr_aa(dsp_core_t* dsp) { uint32_t memspace, addr, value, numbit, newaddr; - + memspace = (dsp->cur_inst>>6) & 1; addr = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6940,19 +6938,19 @@ static void emu_jclr_aa(dsp_core_t* dsp) dsp->pc = newaddr; dsp->cur_inst_len = 0; return; - } + } ++dsp->cur_inst_len; } static void emu_jclr_ea(dsp_core_t* dsp) { uint32_t memspace, addr, value, numbit, newaddr; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); newaddr = read_memory_p(dsp, dsp->pc+1); - + emu_calc_ea(dsp, value, &addr); value = dsp56k_read_memory(dsp, memspace, addr); @@ -6962,14 +6960,14 @@ static void emu_jclr_ea(dsp_core_t* dsp) dsp->pc = newaddr; dsp->cur_inst_len = 0; return; - } + } ++dsp->cur_inst_len; } static void emu_jclr_pp(dsp_core_t* dsp) { uint32_t memspace, addr, value, numbit, newaddr; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -6983,14 +6981,14 @@ static void emu_jclr_pp(dsp_core_t* dsp) dsp->pc = newaddr; dsp->cur_inst_len = 0; return; - } + } ++dsp->cur_inst_len; } static void emu_jclr_reg(dsp_core_t* dsp) { uint32_t value, numreg, numbit, newaddr; - + numreg = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); newaddr = read_memory_p(dsp, dsp->pc+1); @@ -7007,7 +7005,7 @@ static void emu_jclr_reg(dsp_core_t* dsp) dsp->pc = newaddr; dsp->cur_inst_len = 0; return; - } + } ++dsp->cur_inst_len; } @@ -7044,7 +7042,7 @@ static void emu_jscc_ea(dsp_core_t* dsp) dsp_stack_push(dsp, dsp->pc+dsp->cur_inst_len, dsp->registers[DSP_REG_SR], 0); dsp->pc = newpc; dsp->cur_inst_len = 0; - } + } dsp->instr_cycle += 2; } @@ -7059,7 +7057,7 @@ static void emu_jscc_imm(dsp_core_t* dsp) dsp_stack_push(dsp, dsp->pc+dsp->cur_inst_len, dsp->registers[DSP_REG_SR], 0); dsp->pc = newpc; dsp->cur_inst_len = 0; - } + } dsp->instr_cycle += 2; } @@ -7067,29 +7065,29 @@ static void emu_jscc_imm(dsp_core_t* dsp) static void emu_jsclr_aa(dsp_core_t* dsp) { uint32_t memspace, addr, value, newpc, numbit, newaddr; - + memspace = (dsp->cur_inst>>6) & 1; addr = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); value = dsp56k_read_memory(dsp, memspace, addr); newaddr = read_memory_p(dsp, dsp->pc+1); - + dsp->instr_cycle += 4; - + if ((value & (1<pc+2, dsp->registers[DSP_REG_SR], 0); newpc = newaddr; dsp->pc = newpc; dsp->cur_inst_len = 0; return; - } + } ++dsp->cur_inst_len; } static void emu_jsclr_ea(dsp_core_t* dsp) { uint32_t memspace, addr, value, newpc, numbit, newaddr; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -7098,21 +7096,21 @@ static void emu_jsclr_ea(dsp_core_t* dsp) newaddr = read_memory_p(dsp, dsp->pc+1); dsp->instr_cycle += 4; - + if ((value & (1<pc+2, dsp->registers[DSP_REG_SR], 0); newpc = newaddr; dsp->pc = newpc; dsp->cur_inst_len = 0; return; - } + } ++dsp->cur_inst_len; } static void emu_jsclr_pp(dsp_core_t* dsp) { uint32_t memspace, addr, value, newpc, numbit, newaddr; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -7121,21 +7119,21 @@ static void emu_jsclr_pp(dsp_core_t* dsp) newaddr = read_memory_p(dsp, dsp->pc+1); dsp->instr_cycle += 4; - + if ((value & (1<pc+2, dsp->registers[DSP_REG_SR], 0); newpc = newaddr; dsp->pc = newpc; dsp->cur_inst_len = 0; return; - } + } ++dsp->cur_inst_len; } static void emu_jsclr_reg(dsp_core_t* dsp) { uint32_t value, numreg, newpc, numbit, newaddr; - + numreg = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); newaddr = read_memory_p(dsp, dsp->pc+1); @@ -7147,21 +7145,21 @@ static void emu_jsclr_reg(dsp_core_t* dsp) } dsp->instr_cycle += 4; - + if ((value & (1<pc+2, dsp->registers[DSP_REG_SR], 0); newpc = newaddr; dsp->pc = newpc; dsp->cur_inst_len = 0; return; - } + } ++dsp->cur_inst_len; } static void emu_jset_aa(dsp_core_t* dsp) { uint32_t memspace, addr, value, numbit, newpc, newaddr; - + memspace = (dsp->cur_inst>>6) & 1; addr = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -7169,20 +7167,20 @@ static void emu_jset_aa(dsp_core_t* dsp) newaddr = read_memory_p(dsp, dsp->pc+1); dsp->instr_cycle += 4; - + if (value & (1<pc = newpc; dsp->cur_inst_len=0; return; - } + } ++dsp->cur_inst_len; } static void emu_jset_ea(dsp_core_t* dsp) { uint32_t memspace, addr, value, numbit, newpc, newaddr; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -7197,14 +7195,14 @@ static void emu_jset_ea(dsp_core_t* dsp) dsp->pc = newpc; dsp->cur_inst_len=0; return; - } + } ++dsp->cur_inst_len; } static void emu_jset_pp(dsp_core_t* dsp) { uint32_t memspace, addr, value, numbit, newpc, newaddr; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -7213,24 +7211,24 @@ static void emu_jset_pp(dsp_core_t* dsp) newaddr = read_memory_p(dsp, dsp->pc+1); dsp->instr_cycle += 4; - + if (value & (1<pc = newpc; dsp->cur_inst_len=0; return; - } + } ++dsp->cur_inst_len; } static void emu_jset_reg(dsp_core_t* dsp) { uint32_t value, numreg, numbit, newpc, newaddr; - + numreg = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); newaddr = read_memory_p(dsp, dsp->pc+1); - + if ((numreg==DSP_REG_A) || (numreg==DSP_REG_B)) { emu_pm_read_accu24(dsp, numreg, &value); } else { @@ -7238,13 +7236,13 @@ static void emu_jset_reg(dsp_core_t* dsp) } dsp->instr_cycle += 4; - + if (value & (1<pc = newpc; dsp->cur_inst_len=0; return; - } + } ++dsp->cur_inst_len; } @@ -7289,13 +7287,13 @@ static void emu_jsr_ea(dsp_core_t* dsp) static void emu_jsset_aa(dsp_core_t* dsp) { uint32_t memspace, addr, value, newpc, numbit, newaddr; - + memspace = (dsp->cur_inst>>6) & 1; addr = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); value = dsp56k_read_memory(dsp, memspace, addr); newaddr = read_memory_p(dsp, dsp->pc+1); - + dsp->instr_cycle += 4; if (value & (1<pc = newpc; dsp->cur_inst_len = 0; return; - } + } ++dsp->cur_inst_len; } static void emu_jsset_ea(dsp_core_t* dsp) { uint32_t memspace, addr, value, newpc, numbit, newaddr; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); emu_calc_ea(dsp, value, &addr); value = dsp56k_read_memory(dsp, memspace, addr); newaddr = read_memory_p(dsp, dsp->pc+1); - + dsp->instr_cycle += 4; if (value & (1<pc = newpc; dsp->cur_inst_len = 0; return; - } + } ++dsp->cur_inst_len; } static void emu_jsset_pp(dsp_core_t* dsp) { uint32_t memspace, addr, value, newpc, numbit, newaddr; - + memspace = (dsp->cur_inst>>6) & 1; value = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); @@ -7350,18 +7348,18 @@ static void emu_jsset_pp(dsp_core_t* dsp) dsp->pc = newpc; dsp->cur_inst_len = 0; return; - } + } ++dsp->cur_inst_len; } static void emu_jsset_reg(dsp_core_t* dsp) { uint32_t value, numreg, newpc, numbit, newaddr; - + numreg = (dsp->cur_inst>>8) & BITMASK(6); numbit = dsp->cur_inst & BITMASK(5); newaddr = read_memory_p(dsp, dsp->pc+1); - + if ((numreg==DSP_REG_A) || (numreg==DSP_REG_B)) { emu_pm_read_accu24(dsp, numreg, &value); } else { @@ -7376,7 +7374,7 @@ static void emu_jsset_reg(dsp_core_t* dsp) dsp->pc = newpc; dsp->cur_inst_len = 0; return; - } + } ++dsp->cur_inst_len; } @@ -7394,7 +7392,7 @@ static void emu_lua(dsp_core_t* dsp) dsp->registers[DSP_REG_R0+srcreg] = srcsave; dstreg = dsp->cur_inst & BITMASK(3); - + if (dsp->cur_inst & (1<<3)) { dsp->registers[DSP_REG_N0+dstreg] = srcnew; } else { @@ -7410,7 +7408,7 @@ static void emu_lua_rel(dsp_core_t* dsp) + (((dsp->cur_inst >> 11) & BITMASK(3)) << 4); uint32_t addrreg = (dsp->cur_inst>>8) & BITMASK(3); uint32_t dstreg = dsp->cur_inst & BITMASK(3); - + uint32_t v = (dsp->registers[DSP_REG_R0+addrreg] + dsp_signextend(7, aa)) & BITMASK(24); @@ -7437,7 +7435,7 @@ static void emu_movec_reg(dsp_core_t* dsp) /* Write D1 */ if ((numreg2 == DSP_REG_A) || (numreg2 == DSP_REG_B)) { - emu_pm_read_accu24(dsp, numreg2, &value); + emu_pm_read_accu24(dsp, numreg2, &value); } else { value = dsp->registers[numreg2]; } @@ -7447,7 +7445,7 @@ static void emu_movec_reg(dsp_core_t* dsp) /* Read S1 */ if (numreg1 == DSP_REG_SSH) { dsp_stack_pop(dsp, &value, &dummy); - } + } else { value = dsp->registers[numreg1]; } @@ -7490,7 +7488,7 @@ static void emu_movec_aa(dsp_core_t* dsp) /* Read S1 */ if (numreg == DSP_REG_SSH) { dsp_stack_pop(dsp, &value, &dummy); - } + } else { value = dsp->registers[numreg]; } @@ -7539,7 +7537,7 @@ static void emu_movec_ea(dsp_core_t* dsp) emu_calc_ea(dsp, ea_mode, &addr); if (numreg == DSP_REG_SSH) { dsp_stack_pop(dsp, &value, &dummy); - } + } else { value = dsp->registers[numreg]; } @@ -7563,10 +7561,10 @@ static void emu_movem_aa(dsp_core_t* dsp) /* Read S */ if (numreg == DSP_REG_SSH) { dsp_stack_pop(dsp, &value, &dummy); - } + } else if ((numreg == DSP_REG_A) || (numreg == DSP_REG_B)) { - emu_pm_read_accu24(dsp, numreg, &value); - } + emu_pm_read_accu24(dsp, numreg, &value); + } else { value = dsp->registers[numreg]; } @@ -7593,10 +7591,10 @@ static void emu_movem_ea(dsp_core_t* dsp) /* Read S */ if (numreg == DSP_REG_SSH) { dsp_stack_pop(dsp, &value, &dummy); - } + } else if ((numreg == DSP_REG_A) || (numreg == DSP_REG_B)) { - emu_pm_read_accu24(dsp, numreg, &value); - } + emu_pm_read_accu24(dsp, numreg, &value); + } else { value = dsp->registers[numreg]; } @@ -7612,7 +7610,7 @@ static void emu_movep_0(dsp_core_t* dsp) /* x:pp,D */ /* S,y:pp */ /* y:pp,D */ - + uint32_t addr, memspace, numreg, value, dummy; addr = 0xffffc0 + (dsp->cur_inst & BITMASK(6)); @@ -7622,7 +7620,7 @@ static void emu_movep_0(dsp_core_t* dsp) if (dsp->cur_inst & (1<<15)) { /* Write pp */ if ((numreg == DSP_REG_A) || (numreg == DSP_REG_B)) { - emu_pm_read_accu24(dsp, numreg, &value); + emu_pm_read_accu24(dsp, numreg, &value); } else if (numreg == DSP_REG_SSH) { dsp_stack_pop(dsp, &value, &dummy); @@ -7686,14 +7684,14 @@ static void emu_movep_23(dsp_core_t* dsp) peraddr = 0xffffc0 + (dsp->cur_inst & BITMASK(6)); perspace = (dsp->cur_inst>>16) & 1; - + ea_mode = (dsp->cur_inst>>8) & BITMASK(6); easpace = (dsp->cur_inst>>6) & 1; retour = emu_calc_ea(dsp, ea_mode, &addr); if (dsp->cur_inst & (1<<15)) { /* Write pp */ - + if (retour) { dsp56k_write_memory(dsp, perspace, peraddr, addr); } else { @@ -7719,7 +7717,7 @@ static void emu_movep_x_qq(dsp_core_t* dsp) if (dsp->cur_inst & (1<<15)) { /* Write qq */ - + if (retour) { dsp56k_write_memory(dsp, DSP_SPACE_X, x_addr, ea_addr); } else { @@ -7739,7 +7737,7 @@ static void emu_move_x_long(dsp_core_t* dsp) { uint32_t xxxx = read_memory_p(dsp, dsp->pc+1); dsp->cur_inst_len++; - + int W = (dsp->cur_inst >> 6) & 1; uint32_t offreg = DSP_REG_R0 + ((dsp->cur_inst >> 8) & BITMASK(3)); uint32_t numreg = dsp->cur_inst & BITMASK(6); @@ -7768,7 +7766,7 @@ static void emu_move_xy_imm(dsp_core_t* dsp, int space) uint32_t offreg = DSP_REG_R0 + ((dsp->cur_inst >> 8) & BITMASK(3)); uint32_t numreg = dsp->cur_inst & BITMASK(4); uint32_t addr = (dsp->registers[offreg] + dsp_signextend(7, xxx)) & BITMASK(24); - + if (!W) { uint32_t value; if (numreg == DSP_REG_A || numreg == DSP_REG_B) { @@ -7976,7 +7974,7 @@ static void emu_rep_reg(dsp_core_t* dsp) numreg = (dsp->cur_inst>>8) & BITMASK(6); if ((numreg == DSP_REG_A) || (numreg == DSP_REG_B)) { - emu_pm_read_accu24(dsp, numreg, &dsp->registers[DSP_REG_LC]); + emu_pm_read_accu24(dsp, numreg, &dsp->registers[DSP_REG_LC]); } else { dsp->registers[DSP_REG_LC] = dsp->registers[numreg]; } @@ -8076,7 +8074,7 @@ static void emu_tcc(dsp_core_t* dsp) uint32_t cc_code, regsrc1, regdest1; uint32_t regsrc2, regdest2; uint32_t val0, val1, val2; - + cc_code = (dsp->cur_inst>>12) & BITMASK(4); if (emu_calc_cc(dsp, cc_code)) { @@ -8099,7 +8097,7 @@ static void emu_tcc(dsp_core_t* dsp) val1 = dsp->registers[regsrc1]; val2 = val1 & (1<<23) ? 0xff : 0x0; } - + /* Write D1 */ if (regdest1 == DSP_REG_A) { dsp->registers[DSP_REG_A2] = val2;