--- hatari/src/falcon/dsp_cpu.c 2019/04/09 08:55:50 1.1.1.11 +++ hatari/src/falcon/dsp_cpu.c 2019/04/09 08:57:02 1.1.1.12 @@ -278,7 +278,6 @@ static void dsp_add_x1_b(void); static void dsp_add_y1_a(void); static void dsp_add_y1_b(void); static void dsp_addl_b_a(void); -static void dsp_addl_b_a(void); static void dsp_addl_a_b(void); static void dsp_addr_b_a(void); static void dsp_addr_a_b(void); @@ -733,7 +732,7 @@ Uint16 dsp56k_execute_one_disasm_instruc dsp_core.pc = pc; /* Disasm instruction */ - instruction_length = dsp56k_disasm(DSP_DISASM_MODE) - 1; + instruction_length = dsp56k_disasm(DSP_DISASM_MODE, out) - 1; /* Execute instruction at address given in parameter to get the number of cycles it takes */ dsp56k_execute_instruction(); @@ -772,7 +771,7 @@ void dsp56k_execute_instruction(void) if (LOG_TRACE_LEVEL(TRACE_DSP_DISASM)) { /* Call dsp56k_disasm only when DSP is called in trace mode */ if (isDsp_in_disasm_mode == false) { - disasm_return = dsp56k_disasm(DSP_TRACE_MODE); + disasm_return = dsp56k_disasm(DSP_TRACE_MODE, TraceFile); if (disasm_return != 0 && LOG_TRACE_LEVEL(TRACE_DSP_DISASM_REG)) { /* DSP regs trace enabled only if DSP DISASM is enabled */ @@ -806,20 +805,20 @@ void dsp56k_execute_instruction(void) /* Display only when DSP is called in trace mode */ if (isDsp_in_disasm_mode == false) { if (disasm_return != 0) { - fprintf(stderr, "%s", dsp56k_getInstructionText()); + fprintf(TraceFile, "%s", dsp56k_getInstructionText()); /* DSP regs trace enabled only if DSP DISASM is enabled */ if (LOG_TRACE_LEVEL(TRACE_DSP_DISASM_REG)) - dsp56k_disasm_reg_compare(); + dsp56k_disasm_reg_compare(TraceFile); if (LOG_TRACE_LEVEL(TRACE_DSP_DISASM_MEM)) { /* 1 memory change to display ? */ if (disasm_memory_ptr == 1) - fprintf(stderr, "\t%s\n", str_disasm_memory[0]); + fprintf(TraceFile, "\t%s\n", str_disasm_memory[0]); /* 2 memory changes to display ? */ else if (disasm_memory_ptr == 2) { - fprintf(stderr, "\t%s\n", str_disasm_memory[0]); - fprintf(stderr, "\t%s\n", str_disasm_memory[1]); + fprintf(TraceFile, "\t%s\n", str_disasm_memory[0]); + fprintf(TraceFile, "\t%s\n", str_disasm_memory[1]); } } } @@ -1268,7 +1267,7 @@ static Uint32 read_memory(int space, Uin static inline void write_memory(int space, Uint16 address, Uint32 value) { - if (unlikely(LOG_TRACE_LEVEL(TRACE_DSP_DISASM_MEM))) + if (LOG_TRACE_LEVEL(TRACE_DSP_DISASM_MEM)) write_memory_disasm(space, address, value); else write_memory_raw(space, address, value); @@ -1564,15 +1563,15 @@ static void dsp_compute_ssh_ssl(void) static void dsp_update_rn(Uint32 numreg, Sint16 modifier) { - Sint16 value; + Uint32 value; Uint16 m_reg; m_reg = (Uint16) dsp_core.registers[DSP_REG_M0+numreg]; if (m_reg == 65535) { /* Linear addressing mode */ - value = (Sint16) dsp_core.registers[DSP_REG_R0+numreg]; + value = dsp_core.registers[DSP_REG_R0+numreg]|0x10000; value += modifier; - dsp_core.registers[DSP_REG_R0+numreg] = ((Uint32) value) & BITMASK(16); + dsp_core.registers[DSP_REG_R0+numreg] = value & BITMASK(16); } else if (m_reg == 0) { /* Bit reversed carry update */ dsp_update_rn_bitreverse(numreg); @@ -1627,36 +1626,41 @@ static void dsp_update_rn_bitreverse(Uin static void dsp_update_rn_modulo(Uint32 numreg, Sint16 modifier) { - Uint16 bufsize, modulo, lobound, hibound, bufmask; - Sint16 r_reg, orig_modifier=modifier; + Uint16 bufsize, bufmask, modulo, abs_modifier; + Uint32 r_reg, lobound, hibound; + r_reg = dsp_core.registers[DSP_REG_R0+numreg]|0x10000; modulo = dsp_core.registers[DSP_REG_M0+numreg]+1; + + bufsize = 1; - bufmask = BITMASK(16); while (bufsize < modulo) { bufsize <<= 1; - bufmask <<= 1; } + bufmask = bufsize - 1; - lobound = dsp_core.registers[DSP_REG_R0+numreg] & bufmask; + + lobound = r_reg - (r_reg&bufmask); hibound = lobound + modulo - 1; - r_reg = (Sint16) dsp_core.registers[DSP_REG_R0+numreg]; - if (orig_modifier>modulo) { - while (modifier>bufsize) { - r_reg += bufsize; - modifier -= bufsize; - } - while (modifier<-bufsize) { - r_reg -= bufsize; - modifier += bufsize; - } + if (modifier<0) { + abs_modifier = -modifier; + } else { + abs_modifier = modifier; } - r_reg += modifier; - if (orig_modifier!=modulo) { + if (abs_modifier>modulo) { + if (abs_modifier&bufmask) { + fprintf(stderr,"Dsp: Modulo addressing result unpredictable\n"); + } else { + r_reg += modifier; + } + } else { + r_reg += modifier; + + if (r_reg>hibound) { r_reg -= modulo; } else if (r_reg