diff options
| author | 2022-11-01 15:03:04 -0400 | |
|---|---|---|
| committer | 2022-11-01 15:06:47 -0400 | |
| commit | 4df2f9d2f904073cd31d4d5db65cdb0d23270aac (patch) | |
| tree | b5daa04126fe177061506e467cd312873509b748 | |
| parent | 7d9ccfa4261a4a836890b9aac9fa81109fd68598 (diff) | |
coretmpl.h: Add utility function for sign-extending values of arbitrary width
* cpu/ccpu: Simplify code for right-shifting 12-bit values arithmetically
* konami/3dom2_te.cpp: Fix probable copy-and-paste error
36 files changed, 291 insertions, 305 deletions
diff --git a/src/devices/bus/gio64/newport.cpp b/src/devices/bus/gio64/newport.cpp index ab796ba3645..12cba5ef611 100644 --- a/src/devices/bus/gio64/newport.cpp +++ b/src/devices/bus/gio64/newport.cpp @@ -2718,10 +2718,10 @@ uint8_t newport_base_device::get_octant(int32_t x1, int32_t y1, int32_t x2, int3 void newport_base_device::do_fline(uint32_t color) { - const int32_t x1 = (int32_t)((m_rex3.m_x_start >> 7) << 12) >> 12; - const int32_t y1 = (int32_t)((m_rex3.m_y_start >> 7) << 12) >> 12; - const int32_t x2 = (int32_t)((m_rex3.m_x_end >> 7) << 12) >> 12; - const int32_t y2 = (int32_t)((m_rex3.m_y_end >> 7) << 12) >> 12; + const int32_t x1 = util::sext(m_rex3.m_x_start >> 7, 20); + const int32_t y1 = util::sext(m_rex3.m_y_start >> 7, 20); + const int32_t x2 = util::sext(m_rex3.m_x_end >> 7, 20); + const int32_t y2 = util::sext(m_rex3.m_y_end >> 7, 20); const int32_t x10 = x1 & ~0xf; const int32_t y10 = y1 & ~0xf; @@ -3191,13 +3191,13 @@ uint64_t newport_base_device::do_pixel_word_read() void newport_base_device::iterate_shade() { if (m_rex3.m_slope_red & 0x7fffff) - m_rex3.m_curr_color_red += (m_rex3.m_slope_red << 8) >> 8; + m_rex3.m_curr_color_red += util::sext(m_rex3.m_slope_red, 24); if (m_rex3.m_slope_green & 0x7ffff) - m_rex3.m_curr_color_green += (m_rex3.m_slope_green << 12) >> 12; + m_rex3.m_curr_color_green += util::sext(m_rex3.m_slope_green, 20); if (m_rex3.m_slope_blue & 0x7ffff) - m_rex3.m_curr_color_blue += (m_rex3.m_slope_blue << 12) >> 12; + m_rex3.m_curr_color_blue += util::sext(m_rex3.m_slope_blue, 20); if (m_rex3.m_slope_alpha & 0x7ffff) - m_rex3.m_curr_color_alpha += (m_rex3.m_slope_alpha << 12) >> 12; + m_rex3.m_curr_color_alpha += util::sext(m_rex3.m_slope_alpha, 20); if (BIT(m_rex3.m_draw_mode0, 21)) // CIClamp { diff --git a/src/devices/cpu/adsp2100/2100ops.hxx b/src/devices/cpu/adsp2100/2100ops.hxx index ba5925e197e..c5bc2bc90cc 100644 --- a/src/devices/cpu/adsp2100/2100ops.hxx +++ b/src/devices/cpu/adsp2100/2100ops.hxx @@ -377,7 +377,7 @@ void adsp21xx_device::write_reg1(int regnum, int32_t val) break; case 1: - m_m[index] = (int32_t)(val << 18) >> 18; + m_m[index] = util::sext(val, 14); break; case 2: @@ -420,7 +420,7 @@ void adsp21xx_device::write_reg2(int regnum, int32_t val) break; case 1: - m_m[index] = (int32_t)(val << 18) >> 18; + m_m[index] = util::sext(val, 14); break; case 2: @@ -443,7 +443,7 @@ void adsp21xx_device::write_reg3(int regnum, int32_t val) case 0x03: m_imask = val & m_imask_mask; check_irqs(); break; case 0x04: m_icntl = val & 0x001f; check_irqs(); break; case 0x05: cntr_stack_push(); m_cntr = val & 0x3fff; break; - case 0x06: m_core.sb.s = (int32_t)(val << 27) >> 27; break; + case 0x06: m_core.sb.s = util::sext(val, 5); break; case 0x07: m_px = val; break; case 0x09: if (!m_sport_tx_cb.isnull()) m_sport_tx_cb(0, val, 0xffff); break; case 0x0b: if (!m_sport_tx_cb.isnull()) m_sport_tx_cb(1, val, 0xffff); break; diff --git a/src/devices/cpu/alpha/common.h b/src/devices/cpu/alpha/common.h index 0c9668f304a..61daeccdcbc 100644 --- a/src/devices/cpu/alpha/common.h +++ b/src/devices/cpu/alpha/common.h @@ -13,7 +13,7 @@ #define Im(x) (u64(u8(x >> 13))) // literal immediate field #define Disp_M(x) (s64(s16(x))) // memory instruction 16-bit signed offset -#define Disp_P(x) (s64(s16(x << 4)) >> 4) // hardware load/store 12-bit signed offset -#define Disp_B(x) (s64(s32(x << 11)) >> 9) // branch instruction offset +#define Disp_P(x) (s64(util::sext(x, 12))) // hardware load/store 12-bit signed offset +#define Disp_B(x) (s64(util::sext(x << 2, 23))) // branch instruction offset #endif // MAME_CPU_ALPHA_COMMON_H diff --git a/src/devices/cpu/asap/asap.cpp b/src/devices/cpu/asap/asap.cpp index 045819aa4ae..6fb1ab12592 100644 --- a/src/devices/cpu/asap/asap.cpp +++ b/src/devices/cpu/asap/asap.cpp @@ -612,7 +612,7 @@ void asap_device::bsp() { if ((int32_t)m_znflag > 0) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -627,7 +627,7 @@ void asap_device::bmz() { if ((int32_t)m_znflag <= 0) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -642,7 +642,7 @@ void asap_device::bgt() { if (m_znflag != 0 && (int32_t)(m_znflag ^ m_vflag) >= 0) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -657,7 +657,7 @@ void asap_device::ble() { if (m_znflag == 0 || (int32_t)(m_znflag ^ m_vflag) < 0) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -672,7 +672,7 @@ void asap_device::bge() { if ((int32_t)(m_znflag ^ m_vflag) >= 0) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -687,7 +687,7 @@ void asap_device::blt() { if ((int32_t)(m_znflag ^ m_vflag) < 0) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -702,7 +702,7 @@ void asap_device::bhi() { if (m_znflag != 0 && m_cflag) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -717,7 +717,7 @@ void asap_device::bls() { if (m_znflag == 0 || !m_cflag) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -732,7 +732,7 @@ void asap_device::bcc() { if (!m_cflag) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -747,7 +747,7 @@ void asap_device::bcs() { if (m_cflag) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -762,7 +762,7 @@ void asap_device::bpl() { if ((int32_t)m_znflag >= 0) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -777,7 +777,7 @@ void asap_device::bmi() { if ((int32_t)m_znflag < 0) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -792,7 +792,7 @@ void asap_device::bne() { if (m_znflag != 0) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -807,7 +807,7 @@ void asap_device::beq() { if (m_znflag == 0) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -822,7 +822,7 @@ void asap_device::bvc() { if ((int32_t)m_vflag >= 0) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -837,7 +837,7 @@ void asap_device::bvs() { if ((int32_t)m_vflag < 0) { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -853,7 +853,7 @@ void asap_device::bvs() void asap_device::bsr() { DSTVAL = m_pc + 4; - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; @@ -865,7 +865,7 @@ void asap_device::bsr() void asap_device::bsr_0() { - m_nextpc = m_ppc + ((int32_t)(m_op << 10) >> 8); + m_nextpc = m_ppc + util::sext(m_op << 2, 24); fetch_instruction_debug(); m_pc = m_nextpc; diff --git a/src/devices/cpu/asap/asapdasm.cpp b/src/devices/cpu/asap/asapdasm.cpp index 6744ad9a754..c5181f325c5 100644 --- a/src/devices/cpu/asap/asapdasm.cpp +++ b/src/devices/cpu/asap/asapdasm.cpp @@ -57,7 +57,7 @@ offs_t asap_disassembler::disassemble(std::ostream &stream, offs_t pc, const dat switch (opcode) { case 0x00: util::stream_format(stream, "trap $00"); flags = STEP_OVER; break; - case 0x01: util::stream_format(stream, "b%s $%08x", condition[rdst & 15], pc + ((int32_t)(op << 10) >> 8)); flags = STEP_COND | step_over_extra(1); break; + case 0x01: util::stream_format(stream, "b%s $%08x", condition[rdst & 15], pc + util::sext(op << 2, 24)); flags = STEP_COND | step_over_extra(1); break; case 0x02: if ((op & 0x003fffff) == 3) { uint32_t nextop = opcodes.r32(pc+4); @@ -71,10 +71,10 @@ offs_t asap_disassembler::disassemble(std::ostream &stream, offs_t pc, const dat if (rdst) { flags = STEP_OVER | step_over_extra(1); - util::stream_format(stream, "bsr %s,$%08x", reg[rdst], pc + ((int32_t)(op << 10) >> 8)); + util::stream_format(stream, "bsr %s,$%08x", reg[rdst], pc + util::sext(op << 2, 24)); } else - util::stream_format(stream, "bra $%08x", pc + ((int32_t)(op << 10) >> 8)); + util::stream_format(stream, "bra $%08x", pc + util::sext(op << 2, 24)); break; case 0x03: util::stream_format(stream, "lea%s %s[%s],%s", setcond[cond], reg[rsrc1], src2(op,2), reg[rdst]); break; case 0x04: util::stream_format(stream, "leah%s %s[%s],%s", setcond[cond], reg[rsrc1], src2(op,1), reg[rdst]); break; diff --git a/src/devices/cpu/avr8/avr8ops.hxx b/src/devices/cpu/avr8/avr8ops.hxx index 366a60769d3..eb23e7d6a29 100644 --- a/src/devices/cpu/avr8/avr8ops.hxx +++ b/src/devices/cpu/avr8/avr8ops.hxx @@ -1300,7 +1300,7 @@ void avr8_device::op_brset(uint16_t op) { if (SREG_R(op & 0x0007)) { - m_pc += (((int32_t)(KCONST7(op)) << 25) >> 25); + m_pc += util::sext(KCONST7(op), 7); m_opcycles++; } } @@ -1309,7 +1309,7 @@ void avr8_device::op_brclr(uint16_t op) { if (SREG_R(op & 0x0007) == 0) { - m_pc += (((int32_t)(KCONST7(op)) << 25) >> 25); + m_pc += util::sext(KCONST7(op), 7); m_opcycles++; } } diff --git a/src/devices/cpu/ccpu/ccpu.cpp b/src/devices/cpu/ccpu/ccpu.cpp index d13c272b21a..f39de3fe1fe 100644 --- a/src/devices/cpu/ccpu/ccpu.cpp +++ b/src/devices/cpu/ccpu/ccpu.cpp @@ -45,7 +45,9 @@ DEFINE_DEVICE_TYPE(CCPU, ccpu_cpu_device, "ccpu", "Cinematronics CPU") #define NEXT_ACC_A do { SET_MI(*m_acc); m_acc = &m_A; } while (0) #define NEXT_ACC_B do { SET_MI(*m_acc); if (m_acc == &m_A) m_acc = &m_B; else m_acc = &m_A; } while (0) -#define CYCLES(x) do { m_icount -= (x); } while (0) +#define CYCLES(x) do { m_icount -= (x); } while (0) + +#define ASR(x) (((x) >> 1) | ((x) & 0x800)) #define STANDARD_ACC_OP(resexp,cmpval) \ do { \ @@ -478,8 +480,8 @@ void ccpu_cpu_device::execute_run() /* DV */ case 0xe0: { - int16_t stopX = (int16_t)(m_A << 4) >> 4; - int16_t stopY = (int16_t)(m_B << 4) >> 4; + int16_t stopX = util::sext(m_A, 12); + int16_t stopY = util::sext(m_B, 12); stopX = ((int16_t)(stopX - m_X) >> m_T) + m_X; stopY = ((int16_t)(stopY - m_Y) >> m_T) + m_Y; @@ -527,7 +529,7 @@ void ccpu_cpu_device::execute_run() uint16_t result; m_cmpacc = m_B; m_A = (m_A >> 1) | ((m_B << 11) & 0x800); - m_B = ((int16_t)(m_B << 4) >> 5) & 0xfff; + m_B = ASR(m_B); result = m_B + tempval; SET_NC(result); SET_MI(result); @@ -539,7 +541,7 @@ void ccpu_cpu_device::execute_run() m_cmpacc = m_A; result = m_A + tempval; m_A = (m_A >> 1) | ((m_B << 11) & 0x800); - m_B = ((int16_t)(m_B << 4) >> 5) & 0xfff; + m_B = ASR(m_B); SET_NC(result); SET_MI(result); } @@ -548,7 +550,7 @@ void ccpu_cpu_device::execute_run() { uint16_t result; m_cmpacc = m_B; - m_B = ((int16_t)(m_B << 4) >> 5) & 0xfff; + m_B = ASR(m_B); result = m_B + tempval; SET_NC(result); SET_MI(result); @@ -633,7 +635,7 @@ void ccpu_cpu_device::execute_run() /* SHR */ case 0xeb: case 0xfb: - tempval = ((m_acc == &m_A) ? (m_A >> 1) : ((int16_t)(m_B << 4) >> 5)) & 0xfff; + tempval = (m_acc == &m_A) ? (m_A >> 1) : ASR(m_B); tempval |= (*m_acc + (0xb0b | (opcode & 0xf0))) & 0x1000; STANDARD_ACC_OP(tempval, 0xb0b | (opcode & 0xf0)); NEXT_ACC_A; CYCLES(1); @@ -651,7 +653,7 @@ void ccpu_cpu_device::execute_run() /* ASR */ case 0xed: case 0xfd: - tempval = ((int16_t)(*m_acc << 4) >> 5) & 0xfff; + tempval = ASR(*m_acc); STANDARD_ACC_OP(tempval, 0xd0d | (opcode & 0xf0)); NEXT_ACC_A; CYCLES(1); break; @@ -662,10 +664,10 @@ void ccpu_cpu_device::execute_run() if (m_acc == &m_A) { tempval = (m_A >> 1) | ((m_B << 11) & 0x800); - m_B = ((int16_t)(m_B << 4) >> 5) & 0xfff; + m_B = ASR(m_B); } else - tempval = ((int16_t)(m_B << 4) >> 5) & 0xfff; + tempval = ASR(m_B); tempval |= (*m_acc + (0xe0e | (opcode & 0xf0))) & 0x1000; STANDARD_ACC_OP(tempval, 0xe0e | (opcode & 0xf0)); NEXT_ACC_A; CYCLES(1); @@ -688,8 +690,8 @@ void ccpu_cpu_device::execute_run() /* IV */ case 0xf0: - m_X = (int16_t)(m_A << 4) >> 4; - m_Y = (int16_t)(m_B << 4) >> 4; + m_X = util::sext(m_A, 12); + m_Y = util::sext(m_B, 12); NEXT_ACC_A; CYCLES(1); break; } diff --git a/src/devices/cpu/dsp32/dsp32ops.hxx b/src/devices/cpu/dsp32/dsp32ops.hxx index 10195d7adc3..f213b8b2d93 100644 --- a/src/devices/cpu/dsp32/dsp32ops.hxx +++ b/src/devices/cpu/dsp32/dsp32ops.hxx @@ -261,7 +261,7 @@ inline void dsp32c_device::cau_write_pi_4byte(int pi, uint32_t val) int i = (pi >> 0) & 0x1f; if (p) { - WLONG(m_r[p], (int32_t)(val << 8) >> 8); + WLONG(m_r[p], util::sext(val, 24)); if (i < 22 || i > 23) m_r[p] = TRUNCATE24(m_r[p] + m_r[i]); else @@ -1844,7 +1844,7 @@ void dsp32c_device::store_i(uint32_t op) void dsp32c_device::store_ei(uint32_t op) { - WLONG(EXTEND16_TO_24(op), (int32_t)(REG24((op >> 16) & 0x1f) << 8) >> 8); + WLONG(EXTEND16_TO_24(op), util::sext(REG24((op >> 16) & 0x1f), 24)); } @@ -2431,7 +2431,7 @@ void dsp32c_device::d5_ifagt(uint32_t op) void dsp32c_device::d5_float24(uint32_t op) { - double res = (double)((int32_t)(dau_read_pi_4bytes(op >> 7) << 8) >> 8); + double res = (double)util::sext(dau_read_pi_4bytes(op >> 7), 24); int zpi = (op >> 0) & 0x7f; if (zpi != 7) dau_write_pi_double(zpi, res); diff --git a/src/devices/cpu/i960/i960dis.cpp b/src/devices/cpu/i960/i960dis.cpp index 42b36125da1..24b735a8de1 100644 --- a/src/devices/cpu/i960/i960dis.cpp +++ b/src/devices/cpu/i960/i960dis.cpp @@ -216,7 +216,7 @@ offs_t i960_disassembler::dis_decode_ctrl(std::ostream &stream, u32 iCode, u32 i util::stream_format(stream, "%s", mnemonic[op].mnem); break; case 1: // 1 operand - util::stream_format(stream, "%-8s%08lx", mnemonic[op].mnem, ((((s32)disp) << 8) >> 8) + (ip)); + util::stream_format(stream, "%-8s%08lx", mnemonic[op].mnem, util::sext(disp, 24) + (ip)); break; default: return dis_decode_invalid(stream, iCode); @@ -250,7 +250,7 @@ offs_t i960_disassembler::dis_decode_cobr(std::ostream &stream, u32 iCode, u32 i else op1 = util::string_format("%s", regnames[src1]); if (s2) op2 = util::string_format("sf%d", src2); else op2 = util::string_format("%s", regnames[src2]); - op3 = util::string_format("0x%lx", ((((s32)disp) << 19) >> 19) + (ip)); + op3 = util::string_format("0x%lx", util::sext(disp, 13) + (ip)); util::stream_format(stream, "%-8s%s,%s,%s", mnemonic[op].mnem, op1, op2, op3); break; diff --git a/src/devices/cpu/m68000/m68kdasm.cpp b/src/devices/cpu/m68000/m68kdasm.cpp index 74f7eade3fd..9370720f24c 100644 --- a/src/devices/cpu/m68000/m68kdasm.cpp +++ b/src/devices/cpu/m68000/m68kdasm.cpp @@ -1515,7 +1515,7 @@ std::string m68k_disassembler::d68040_fpu() switch ((w2>>10)&7) { case 3: // packed decimal w/fixed k-factor - return util::string_format("fmove%s FP%d, %s {#%d}", float_data_format[(w2>>10)&7], dst_reg, get_ea_mode_str_32(m_cpu_ir), sext_7bit_int(w2&0x7f)); + return util::string_format("fmove%s FP%d, %s {#%d}", float_data_format[(w2>>10)&7], dst_reg, get_ea_mode_str_32(m_cpu_ir), util::sext(w2&0x7f, 7)); case 7: // packed decimal w/dynamic k-factor (register) return util::string_format("fmove%s FP%d, %s {D%d}", float_data_format[(w2>>10)&7], dst_reg, get_ea_mode_str_32(m_cpu_ir), (w2>>4)&7); diff --git a/src/devices/cpu/m68000/m68kdasm.h b/src/devices/cpu/m68000/m68kdasm.h index b40c02c381c..88022b9d15d 100644 --- a/src/devices/cpu/m68000/m68kdasm.h +++ b/src/devices/cpu/m68000/m68kdasm.h @@ -81,7 +81,6 @@ protected: static inline u32 ext_outer_displacement_word(u32 A) { return (((A)&3) == 2 && ((A)&0x47) < 0x44); } static inline u32 ext_outer_displacement_long(u32 A) { return (((A)&3) == 3 && ((A)&0x47) < 0x44); } - static inline s32 sext_7bit_int(u32 value) { return (value & 0x40) ? (value | 0xffffff80) : (value & 0x7f); } static inline s32 make_int_8(u8 value) { return s8(value); } static inline s32 make_int_16(u16 value) { return s16(value); } static inline s32 make_int_32(u32 value) { return s32(value); } diff --git a/src/devices/cpu/ns32000/ns32000.cpp b/src/devices/cpu/ns32000/ns32000.cpp index d3f04bbd5d3..3ae8d57bc15 100644 --- a/src/devices/cpu/ns32000/ns32000.cpp +++ b/src/devices/cpu/ns32000/ns32000.cpp @@ -1232,7 +1232,7 @@ template <int Width> void ns32000_device<Width>::execute_run() mode[0].rmw_i(size); decode(mode, bytes); - u32 const src1 = s32(quick << 28) >> 28; + u32 const src1 = util::sext(quick, 4); u32 const src2 = gen_read(mode[0]); u32 const dst = src1 + src2; @@ -1251,7 +1251,7 @@ template <int Width> void ns32000_device<Width>::execute_run() mode[0].read_i(size); decode(mode, bytes); - u32 const src1 = (s32(quick << 28) >> 28) & size_mask[size]; + u32 const src1 = util::sext(quick, 4) & size_mask[size]; u32 const src2 = gen_read(mode[0]); m_psr &= ~(PSR_N | PSR_Z | PSR_L); @@ -1335,7 +1335,7 @@ template <int Width> void ns32000_device<Width>::execute_run() mode[0].rmw_i(size); decode(mode, bytes); - s32 const inc = s32(quick << 28) >> 28; + s32 const inc = util::sext(quick, 4); u32 index = gen_read(mode[0]); s32 const dst = displacement(bytes); @@ -1360,7 +1360,7 @@ template <int Width> void ns32000_device<Width>::execute_run() mode[0].write_i(size); decode(mode, bytes); - gen_write(mode[0], s32(quick << 28) >> 28); + gen_write(mode[0], util::sext(quick, 4)); tex = (mode[0].type == REG) ? 3 : mode[0].tea + 2; break; diff --git a/src/devices/cpu/ns32000/ns32000dasm.cpp b/src/devices/cpu/ns32000/ns32000dasm.cpp index 9d1dd6c850a..d269a27b7ef 100644 --- a/src/devices/cpu/ns32000/ns32000dasm.cpp +++ b/src/devices/cpu/ns32000/ns32000dasm.cpp @@ -256,12 +256,12 @@ offs_t ns32000_disassembler::disassemble(std::ostream &stream, offs_t pc, data_b switch (BIT(opbyte, 4, 3)) { - case 0: util::stream_format(stream, "ADDQ%c %d, %s", size_char[size], s32(quick << 28) >> 28, mode[0].mode); break; - case 1: util::stream_format(stream, "CMPQ%c %d, %s", size_char[size], s32(quick << 28) >> 28, mode[0].mode); break; + case 0: util::stream_format(stream, "ADDQ%c %d, %s", size_char[size], util::sext(quick, 4), mode[0].mode); break; + case 1: util::stream_format(stream, "CMPQ%c %d, %s", size_char[size], util::sext(quick, 4), mode[0].mode); break; case 2: util::stream_format(stream, "SPR%c %s, %s", size_char[size], procreg[quick], mode[0].mode); break; case 3: util::stream_format(stream, "S%s%c %s", cond_code[quick], size_char[size], mode[0].mode); break; - case 4: util::stream_format(stream, "ACB%c %d, %s, 0x%X", size_char[size], s32(quick << 28) >> 28, mode[0].mode, pc + displacement(pc, opcodes, bytes)); flags |= STEP_COND; break; - case 5: util::stream_format(stream, "MOVQ%c %d, %s", size_char[size], s32(quick << 28) >> 28, mode[0].mode); break; + case 4: util::stream_format(stream, "ACB%c %d, %s, 0x%X", size_char[size], util::sext(quick, 4), mode[0].mode, pc + displacement(pc, opcodes, bytes)); flags |= STEP_COND; break; + case 5: util::stream_format(stream, "MOVQ%c %d, %s", size_char[size], util::sext(quick, 4), mode[0].mode); break; case 6: util::stream_format(stream, "LPR%c %s, %s", size_char[size], procreg[quick], mode[0].mode); break; case 7: // format 3: gggg gooo o111 11ii diff --git a/src/devices/cpu/psx/gte.h b/src/devices/cpu/psx/gte.h index 33755043704..01f16cde383 100644 --- a/src/devices/cpu/psx/gte.h +++ b/src/devices/cpu/psx/gte.h @@ -56,7 +56,7 @@ protected: int44 operator+( int64_t add ) { - int64_t value = ( ( m_value + add ) << 20 ) >> 20; + int64_t value = util::sext( m_value + add, 44 ); return int44( value, m_positive_overflow || ( value < 0 && m_value >= 0 && add >= 0 ), diff --git a/src/devices/cpu/psx/mdec.cpp b/src/devices/cpu/psx/mdec.cpp index 8b4421e4062..ef4e2090225 100644 --- a/src/devices/cpu/psx/mdec.cpp +++ b/src/devices/cpu/psx/mdec.cpp @@ -168,7 +168,7 @@ static inline uint16_t mdec_unpack_run( uint16_t n_packed ) static inline int32_t mdec_unpack_val( uint16_t n_packed ) { - return ( ( (int32_t)n_packed ) << 22 ) >> 22; + return util::sext<int32_t>( n_packed, 10 ); } uint32_t psxmdec_device::mdec_unpack( uint32_t *p_n_psxram, uint32_t n_address ) diff --git a/src/devices/cpu/rsp/rsp.cpp b/src/devices/cpu/rsp/rsp.cpp index 6e280b7003c..a91c764da16 100644 --- a/src/devices/cpu/rsp/rsp.cpp +++ b/src/devices/cpu/rsp/rsp.cpp @@ -2244,8 +2244,7 @@ void rsp_device::handle_lwc2(uint32_t op) int base = (op >> 21) & 0x1f; int dest = (op >> 16) & 0x1f; int index = (op >> 7) & 0xf; - int offset = (op & 0x7f); - offset = (offset << 25) >> 25; + int offset = util::sext(op & 0x7f, 7); switch ((op >> 11) & 0x1f) { @@ -2518,8 +2517,7 @@ void rsp_device::handle_swc2(uint32_t op) int base = (op >> 21) & 0x1f; int dest = (op >> 16) & 0x1f; int index = (op >> 7) & 0xf; - int offset = (op & 0x7f); - offset = (offset << 25) >> 25; + int offset = util::sext(op & 0x7f, 7); switch ((op >> 11) & 0x1f) { diff --git a/src/devices/cpu/sh/sh.cpp b/src/devices/cpu/sh/sh.cpp index 591e7e24a61..97c2c8a6903 100644 --- a/src/devices/cpu/sh/sh.cpp +++ b/src/devices/cpu/sh/sh.cpp @@ -265,7 +265,7 @@ void sh_common_execution::BF(uint32_t d) { if ((m_sh2_state->sr & SH_T) == 0) { - int32_t disp = ((int32_t)d << 24) >> 24; + int32_t disp = util::sext(d, 8); m_sh2_state->pc = m_sh2_state->ea = m_sh2_state->pc + disp * 2 + 2; m_sh2_state->icount -= 2; } @@ -279,7 +279,7 @@ void sh_common_execution::BFS(uint32_t d) { if ((m_sh2_state->sr & SH_T) == 0) { - int32_t disp = ((int32_t)d << 24) >> 24; + int32_t disp = util::sext(d, 8); m_sh2_state->m_delay = m_sh2_state->ea = m_sh2_state->pc + disp * 2 + 2; m_sh2_state->icount--; } @@ -291,7 +291,7 @@ void sh_common_execution::BFS(uint32_t d) */ void sh_common_execution::BRA(uint32_t d) { - int32_t disp = ((int32_t)d << 20) >> 20; + int32_t disp = util::sext(d, 12); #if BUSY_LOOP_HACKS if (disp == -2) @@ -324,7 +324,7 @@ void sh_common_execution::BRAF(uint32_t m) */ void sh_common_execution::BSR(uint32_t d) { - int32_t disp = ((int32_t)d << 20) >> 20; + int32_t disp = util::sext(d, 12); m_sh2_state->pr = m_sh2_state->pc + 2; m_sh2_state->m_delay = m_sh2_state->ea = m_sh2_state->pc + disp * 2 + 2; @@ -350,7 +350,7 @@ void sh_common_execution::BT(uint32_t d) { if ((m_sh2_state->sr & SH_T) != 0) { - int32_t disp = ((int32_t)d << 24) >> 24; + int32_t disp = util::sext(d, 8); m_sh2_state->pc = m_sh2_state->ea = m_sh2_state->pc + disp * 2 + 2; m_sh2_state->icount -= 2; } @@ -364,7 +364,7 @@ void sh_common_execution::BTS(uint32_t d) { if ((m_sh2_state->sr & SH_T) != 0) { - int32_t disp = ((int32_t)d << 24) >> 24; + int32_t disp = util::sext(d, 8); m_sh2_state->m_delay = m_sh2_state->ea = m_sh2_state->pc + disp * 2 + 2; m_sh2_state->icount--; } @@ -736,13 +736,13 @@ void sh_common_execution::DT(uint32_t n) /* EXTS.B Rm,Rn */ void sh_common_execution::EXTSB(uint32_t m, uint32_t n) { - m_sh2_state->r[n] = ((int32_t)m_sh2_state->r[m] << 24) >> 24; + m_sh2_state->r[n] = util::sext(m_sh2_state->r[m], 8); } /* EXTS.W Rm,Rn */ void sh_common_execution::EXTSW(uint32_t m, uint32_t n) { - m_sh2_state->r[n] = ((int32_t)m_sh2_state->r[m] << 16) >> 16; + m_sh2_state->r[n] = util::sext(m_sh2_state->r[m], 16); } /* EXTU.B Rm,Rn */ @@ -2853,7 +2853,7 @@ bool sh_common_execution::generate_opcode(drcuml_block &block, compiler_state &c return true; case 10: // BRA - disp = ((int32_t)opcode << 20) >> 20; + disp = util::sext(opcode, 12); m_sh2_state->ea = (desc->pc + 2) + disp * 2 + 2; // m_sh2_state->ea = pc+4 + disp*2 + 2 generate_delay_slot(block, compiler, desc, m_sh2_state->ea-2); @@ -2867,7 +2867,7 @@ bool sh_common_execution::generate_opcode(drcuml_block &block, compiler_state &c // do this before running the delay slot UML_ADD(block, mem(&m_sh2_state->pr), desc->pc, 4); // add m_pr, desc->pc, #4 (skip the current insn & delay slot) - disp = ((int32_t)opcode << 20) >> 20; + disp = util::sext(opcode, 12); m_sh2_state->ea = (desc->pc + 2) + disp * 2 + 2; // m_sh2_state->ea = pc+4 + disp*2 + 2 generate_delay_slot(block, compiler, desc, m_sh2_state->ea-2); @@ -3401,7 +3401,7 @@ bool sh_common_execution::generate_group_8(drcuml_block &block, compiler_state & UML_TEST(block, mem(&m_sh2_state->sr), SH_T); // test m_sh2_state->sr, T UML_JMPc(block, COND_Z, compiler.labelnum); // jz compiler.labelnum - disp = ((int32_t)opcode << 24) >> 24; + disp = util::sext(opcode, 8); m_sh2_state->ea = (desc->pc + 2) + disp * 2 + 2; // m_sh2_state->ea = destination generate_update_cycles(block, compiler, m_sh2_state->ea, true); // <subtract cycles> @@ -3414,7 +3414,7 @@ bool sh_common_execution::generate_group_8(drcuml_block &block, compiler_state & UML_TEST(block, mem(&m_sh2_state->sr), SH_T); // test m_sh2_state->sr, T UML_JMPc(block, COND_NZ, compiler.labelnum); // jnz compiler.labelnum - disp = ((int32_t)opcode << 24) >> 24; + disp = util::sext(opcode, 8); m_sh2_state->ea = (desc->pc + 2) + disp * 2 + 2; // m_sh2_state->ea = destination generate_update_cycles(block, compiler, m_sh2_state->ea, true); // <subtract cycles> @@ -3429,7 +3429,7 @@ bool sh_common_execution::generate_group_8(drcuml_block &block, compiler_state & UML_TEST(block, mem(&m_sh2_state->sr), SH_T); // test m_sh2_state->sr, T UML_JMPc(block, COND_Z, compiler.labelnum); // jz compiler.labelnum - disp = ((int32_t)opcode << 24) >> 24; + disp = util::sext(opcode, 8); m_sh2_state->ea = (desc->pc + 2) + disp * 2 + 2; // m_sh2_state->ea = destination templabel = compiler.labelnum; // save our label @@ -3450,7 +3450,7 @@ bool sh_common_execution::generate_group_8(drcuml_block &block, compiler_state & UML_TEST(block, mem(&m_sh2_state->sr), SH_T); // test m_sh2_state->sr, T UML_JMPc(block, COND_NZ, compiler.labelnum); // jnz compiler.labelnum - disp = ((int32_t)opcode << 24) >> 24; + disp = util::sext(opcode, 8); m_sh2_state->ea = (desc->pc + 2) + disp * 2 + 2; // m_sh2_state->ea = destination templabel = compiler.labelnum; // save our label diff --git a/src/devices/cpu/sh/sh_dasm.cpp b/src/devices/cpu/sh/sh_dasm.cpp index c7e972385f2..d504be32eab 100644 --- a/src/devices/cpu/sh/sh_dasm.cpp +++ b/src/devices/cpu/sh/sh_dasm.cpp @@ -3,8 +3,6 @@ #include "emu.h" #include "sh_dasm.h" -#define SIGNX8(x) (((int32_t)(x) << 24) >> 24) -#define SIGNX12(x) (((int32_t)(x) << 20) >> 20) #define Rn ((opcode>>8)&15) #define Rm ((opcode>>4)&15) @@ -466,16 +464,16 @@ uint32_t sh_disassembler::op1000(std::ostream &stream, uint32_t pc, uint16_t opc util::stream_format(stream, "CMP/EQ #$%02X,R0", (opcode & 0xff)); break; case 9: - util::stream_format(stream, "BT $%08X", pc + SIGNX8(opcode & 0xff) * 2 + 2); + util::stream_format(stream, "BT $%08X", pc + int8_t(opcode & 0xff) * 2 + 2); return STEP_COND; case 11: - util::stream_format(stream, "BF $%08X", pc + SIGNX8(opcode & 0xff) * 2 + 2); + util::stream_format(stream, "BF $%08X", pc + int8_t(opcode & 0xff) * 2 + 2); return STEP_COND; case 13: - util::stream_format(stream, "BTS $%08X", pc + SIGNX8(opcode & 0xff) * 2 + 2); + util::stream_format(stream, "BTS $%08X", pc + int8_t(opcode & 0xff) * 2 + 2); return STEP_COND | step_over_extra(1); case 15: - util::stream_format(stream, "BFS $%08X", pc + SIGNX8(opcode & 0xff) * 2 + 2); + util::stream_format(stream, "BFS $%08X", pc + int8_t(opcode & 0xff) * 2 + 2); return STEP_COND | step_over_extra(1); default : util::stream_format(stream, "invalid $%04X", opcode); @@ -491,13 +489,13 @@ uint32_t sh_disassembler::op1001(std::ostream &stream, uint32_t pc, uint16_t opc uint32_t sh_disassembler::op1010(std::ostream &stream, uint32_t pc, uint16_t opcode) { - util::stream_format(stream, "BRA $%08X", SIGNX12(opcode & 0xfff) * 2 + pc + 2); + util::stream_format(stream, "BRA $%08X", util::sext(opcode & 0xfff, 12) * 2 + pc + 2); return 0; } uint32_t sh_disassembler::op1011(std::ostream &stream, uint32_t pc, uint16_t opcode) { - util::stream_format(stream, "BSR $%08X", SIGNX12(opcode & 0xfff) * 2 + pc + 2); + util::stream_format(stream, "BSR $%08X", util::sext(opcode & 0xfff, 12) * 2 + pc + 2); return STEP_OVER | step_over_extra(1); } diff --git a/src/devices/cpu/sh/sh_fe.cpp b/src/devices/cpu/sh/sh_fe.cpp index 45f85f46732..6a808429200 100644 --- a/src/devices/cpu/sh/sh_fe.cpp +++ b/src/devices/cpu/sh/sh_fe.cpp @@ -91,7 +91,7 @@ bool sh_frontend::describe(opcode_desc &desc, const opcode_desc *prev) [[fallthrough]]; // BSR is BRA with the addition of PR = the return address case 10: // BRA { - int32_t disp = ((int32_t)opcode << 20) >> 20; + int32_t disp = util::sext(opcode, 12); desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; desc.targetpc = (desc.pc + 2) + disp * 2 + 2; @@ -297,7 +297,7 @@ bool sh_frontend::describe_group_8(opcode_desc &desc, const opcode_desc *prev, u case 11<< 8: // BF(opcode & 0xff); desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH; desc.cycles = 3; - disp = ((int32_t)opcode << 24) >> 24; + disp = util::sext(opcode, 8); desc.targetpc = (desc.pc + 2) + disp * 2 + 2; return true; @@ -305,7 +305,7 @@ bool sh_frontend::describe_group_8(opcode_desc &desc, const opcode_desc *prev, u case 15<< 8: // BFS(opcode & 0xff); desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH; desc.cycles = 2; - disp = ((int32_t)opcode << 24) >> 24; + disp = util::sext(opcode, 8); desc.targetpc = (desc.pc + 2) + disp * 2 + 2; desc.delayslots = 1; return true; diff --git a/src/devices/cpu/sparc/sparcdefs.h b/src/devices/cpu/sparc/sparcdefs.h index fd90b065ed8..12f5aba1937 100644 --- a/src/devices/cpu/sparc/sparcdefs.h +++ b/src/devices/cpu/sparc/sparcdefs.h @@ -97,17 +97,17 @@ #define OPFLOW ((op >> 5) & 0x3f) #define DISP30 (int32_t(op << 2)) -#define DISP22 (int32_t(op << 10) >> 8) -#define DISP19 (int32_t(op << 13) >> 11) +#define DISP22 util::sext(op << 2, 24) +#define DISP19 util::sext(op << 2, 21) #define DISP16 (int32_t(((op << 10) & 0xc0000000) | ((op << 16) & 0x3fff0000)) >> 14) #define IMM22 (op << 10) #define CONST22 (op & 0x3fffff) -#define SIMM13 (int32_t(op << 19) >> 19) -#define SIMM11 (int32_t(op << 21) >> 21) -#define SIMM10 (int32_t(op << 22) >> 22) -#define SIMM8 (int32_t(op << 24) >> 24) +#define SIMM13 util::sext(op, 13) +#define SIMM11 util::sext(op, 11) +#define SIMM10 util::sext(op, 10) +#define SIMM8 util::sext(op, 8) #define IMM7 (op & 0x7f) -#define SIMM7 (int32_t(op << 25) >> 25) +#define SIMM7 util::sext(op, 7) #define SHCNT32 (op & 31) #define SHCNT64 (op & 63) #define IAMODE (op & 0x7) diff --git a/src/devices/cpu/tms32031/32031ops.hxx b/src/devices/cpu/tms32031/32031ops.hxx index db994cb26c2..b9ae91e762c 100644 --- a/src/devices/cpu/tms32031/32031ops.hxx +++ b/src/devices/cpu/tms32031/32031ops.hxx @@ -1734,7 +1734,7 @@ void tms3203x_device::andn_imm(uint32_t op) #define ASH(dreg, src, count) \ { \ uint32_t _res; \ - int32_t _count = (int16_t)(count << 9) >> 9; /* 7 LSBs */ \ + int32_t _count = util::sext(count, 7); /* 7 LSBs */ \ if (_count < 0) \ { \ if (_count >= -31) \ @@ -2117,7 +2117,7 @@ void tms3203x_device::ldm_imm(uint32_t op) #define LSH(dreg, src, count) \ { \ uint32_t _res; \ - int32_t _count = (int16_t)(count << 9) >> 9; /* 7 LSBs */ \ + int32_t _count = util::sext(count, 7); /* 7 LSBs */ \ if (_count < 0) \ { \ if (_count >= -31) \ @@ -2219,7 +2219,7 @@ void tms3203x_device::mpyf_imm(uint32_t op) #define MPYI(dreg, src1, src2) \ { \ - int64_t _res = (int64_t)((int32_t)(src1 << 8) >> 8) * (int64_t)((int32_t)(src2 << 8) >> 8);\ + int64_t _res = mul_32x32(util::sext(src1, 24), util::sext(src2, 24));\ if (!OVM() || (_res >= -(int64_t)0x80000000 && _res <= (int64_t)0x7fffffff)) \ IREG(dreg) = _res; \ else \ @@ -5828,14 +5828,13 @@ void tms3203x_device::mpyaddi_0(uint32_t op) uint32_t src2 = IREG((op >> 16) & 7); uint32_t src3 = RMEM(INDIRECT_1_DEF(op, op >> 8)); uint32_t src4 = RMEM(INDIRECT_1(op, op)); - int64_t mres = (int64_t)((int32_t)(src3 << 8) >> 8) * (int64_t)((int32_t)(src4 << 8) >> 8); + int64_t mres = mul_32x32(util::sext(src3, 24), util::sext(src4, 24)); uint32_t ares = src1 + src2; CLR_NZVUF(); if (OVM()) { - if (mres < -(int64_t)0x80000000 || mres > (int64_t)0x7fffffff) - mres = (mres < 0) ? 0x80000000 : 0x7fffffff; + mres = std::clamp(mres, -(int64_t)0x80000000, (int64_t)0x7fffffff); if (OVERFLOW_ADD(src1,src2,ares)) ares = ((int32_t)src1 < 0) ? 0x80000000 : 0x7fffffff; } @@ -5852,14 +5851,13 @@ void tms3203x_device::mpyaddi_1(uint32_t op) uint32_t src2 = IREG((op >> 16) & 7); uint32_t src3 = RMEM(INDIRECT_1_DEF(op, op >> 8)); uint32_t src4 = RMEM(INDIRECT_1(op, op)); - int64_t mres = (int64_t)((int32_t)(src3 << 8) >> 8) * (int64_t)((int32_t)(src1 << 8) >> 8); + int64_t mres = mul_32x32(util::sext(src3, 24), util::sext(src1, 24)); uint32_t ares = src4 + src2; CLR_NZVUF(); if (OVM()) { - if (mres < -(int64_t)0x80000000 || mres > (int64_t)0x7fffffff) - mres = (mres < 0) ? 0x80000000 : 0x7fffffff; + mres = std::clamp(mres, -(int64_t)0x80000000, (int64_t)0x7fffffff); if (OVERFLOW_ADD(src4,src2,ares)) ares = ((int32_t)src4 < 0) ? 0x80000000 : 0x7fffffff; } @@ -5876,14 +5874,13 @@ void tms3203x_device::mpyaddi_2(uint32_t op) uint32_t src2 = IREG((op >> 16) & 7); uint32_t src3 = RMEM(INDIRECT_1_DEF(op, op >> 8)); uint32_t src4 = RMEM(INDIRECT_1(op, op)); - int64_t mres = (int64_t)((int32_t)(src1 << 8) >> 8) * (int64_t)((int32_t)(src2 << 8) >> 8); + int64_t mres = mul_32x32(util::sext(src1, 24), util::sext(src2, 24)); uint32_t ares = src3 + src4; CLR_NZVUF(); if (OVM()) { - if (mres < -(int64_t)0x80000000 || mres > (int64_t)0x7fffffff) - mres = (mres < 0) ? 0x80000000 : 0x7fffffff; + mres = std::clamp(mres, -(int64_t)0x80000000, (int64_t)0x7fffffff); if (OVERFLOW_ADD(src3,src4,ares)) ares = ((int32_t)src3 < 0) ? 0x80000000 : 0x7fffffff; } @@ -5900,14 +5897,13 @@ void tms3203x_device::mpyaddi_3(uint32_t op) uint32_t src2 = IREG((op >> 16) & 7); uint32_t src3 = RMEM(INDIRECT_1_DEF(op, op >> 8)); uint32_t src4 = RMEM(INDIRECT_1(op, op)); - int64_t mres = (int64_t)((int32_t)(src3 << 8) >> 8) * (int64_t)((int32_t)(src1 << 8) >> 8); + int64_t mres = mul_32x32(util::sext(src3, 24), util::sext(src1, 24)); uint32_t ares = src2 + src4; CLR_NZVUF(); if (OVM()) { - if (mres < -(int64_t)0x80000000 || mres > (int64_t)0x7fffffff) - mres = (mres < 0) ? 0x80000000 : 0x7fffffff; + mres = std::clamp(mres, -(int64_t)0x80000000, (int64_t)0x7fffffff); if (OVERFLOW_ADD(src2,src4,ares)) ares = ((int32_t)src2 < 0) ? 0x80000000 : 0x7fffffff; } @@ -5926,14 +5922,13 @@ void tms3203x_device::mpysubi_0(uint32_t op) uint32_t src2 = IREG((op >> 16) & 7); uint32_t src3 = RMEM(INDIRECT_1_DEF(op, op >> 8)); uint32_t src4 = RMEM(INDIRECT_1(op, op)); - int64_t mres = (int64_t)((int32_t)(src3 << 8) >> 8) * (int64_t)((int32_t)(src4 << 8) >> 8); + int64_t mres = mul_32x32(util::sext(src3, 24), util::sext(src4, 24)); uint32_t ares = src1 - src2; CLR_NZVUF(); if (OVM()) { - if (mres < -(int64_t)0x80000000 || mres > (int64_t)0x7fffffff) - mres = (mres < 0) ? 0x80000000 : 0x7fffffff; + mres = std::clamp(mres, -(int64_t)0x80000000, (int64_t)0x7fffffff); if (OVERFLOW_SUB(src1,src2,ares)) ares = ((int32_t)src1 < 0) ? 0x80000000 : 0x7fffffff; } @@ -5950,14 +5945,13 @@ void tms3203x_device::mpysubi_1(uint32_t op) uint32_t src2 = IREG((op >> 16) & 7); uint32_t src3 = RMEM(INDIRECT_1_DEF(op, op >> 8)); uint32_t src4 = RMEM(INDIRECT_1(op, op)); - int64_t mres = (int64_t)((int32_t)(src3 << 8) >> 8) * (int64_t)((int32_t)(src1 << 8) >> 8); + int64_t mres = mul_32x32(util::sext(src3, 24), util::sext(src1, 24)); uint32_t ares = src4 - src2; CLR_NZVUF(); if (OVM()) { - if (mres < -(int64_t)0x80000000 || mres > (int64_t)0x7fffffff) - mres = (mres < 0) ? 0x80000000 : 0x7fffffff; + mres = std::clamp(mres, -(int64_t)0x80000000, (int64_t)0x7fffffff); if (OVERFLOW_SUB(src4,src2,ares)) ares = ((int32_t)src4 < 0) ? 0x80000000 : 0x7fffffff; } @@ -5974,14 +5968,13 @@ void tms3203x_device::mpysubi_2(uint32_t op) uint32_t src2 = IREG((op >> 16) & 7); uint32_t src3 = RMEM(INDIRECT_1_DEF(op, op >> 8)); uint32_t src4 = RMEM(INDIRECT_1(op, op)); - int64_t mres = (int64_t)((int32_t)(src1 << 8) >> 8) * (int64_t)((int32_t)(src2 << 8) >> 8); + int64_t mres = mul_32x32(util::sext(src1, 24), util::sext(src2, 24)); uint32_t ares = src3 - src4; CLR_NZVUF(); if (OVM()) { - if (mres < -(int64_t)0x80000000 || mres > (int64_t)0x7fffffff) - mres = (mres < 0) ? 0x80000000 : 0x7fffffff; + mres = std::clamp(mres, -(int64_t)0x80000000, (int64_t)0x7fffffff); if (OVERFLOW_SUB(src3,src4,ares)) ares = ((int32_t)src3 < 0) ? 0x80000000 : 0x7fffffff; } @@ -5998,14 +5991,13 @@ void tms3203x_device::mpysubi_3(uint32_t op) uint32_t src2 = IREG((op >> 16) & 7); uint32_t src3 = RMEM(INDIRECT_1_DEF(op, op >> 8)); uint32_t src4 = RMEM(INDIRECT_1(op, op)); - int64_t mres = (int64_t)((int32_t)(src3 << 8) >> 8) * (int64_t)((int32_t)(src1 << 8) >> 8); + int64_t mres = mul_32x32(util::sext(src3, 24), util::sext(src1, 24)); uint32_t ares = src2 - src4; CLR_NZVUF(); if (OVM()) { - if (mres < -(int64_t)0x80000000 || mres > (int64_t)0x7fffffff) - mres = (mres < 0) ? 0x80000000 : 0x7fffffff; + mres = std::clamp(mres, -(int64_t)0x80000000, (int64_t)0x7fffffff); if (OVERFLOW_SUB(src2,src4,ares)) ares = ((int32_t)src2 < 0) ? 0x80000000 : 0x7fffffff; } diff --git a/src/devices/cpu/tms34010/34010fld.hxx b/src/devices/cpu/tms34010/34010fld.hxx index 5df7ebafa65..887be7c2a5f 100644 --- a/src/devices/cpu/tms34010/34010fld.hxx +++ b/src/devices/cpu/tms34010/34010fld.hxx @@ -436,49 +436,49 @@ uint32_t tms340x0_device::rfield_s_01(offs_t offset) { uint32_t ret; RFIELDMAC(0x01,16); - return ((int32_t)(ret << 31)) >> 31; + return util::sext(ret, 1); } uint32_t tms340x0_device::rfield_s_02(offs_t offset) { uint32_t ret; RFIELDMAC(0x03,15); - return ((int32_t)(ret << 30)) >> 30; + return util::sext(ret, 2); } uint32_t tms340x0_device::rfield_s_03(offs_t offset) { uint32_t ret; RFIELDMAC(0x07,14); - return ((int32_t)(ret << 29)) >> 29; + return util::sext(ret, 3); } uint32_t tms340x0_device::rfield_s_04(offs_t offset) { uint32_t ret; RFIELDMAC(0x0f,13); - return ((int32_t)(ret << 28)) >> 28; + return util::sext(ret, 4); } uint32_t tms340x0_device::rfield_s_05(offs_t offset) { uint32_t ret; RFIELDMAC(0x1f,12); - return ((int32_t)(ret << 27)) >> 27; + return util::sext(ret, 5); } uint32_t tms340x0_device::rfield_s_06(offs_t offset) { uint32_t ret; RFIELDMAC(0x3f,11); - return ((int32_t)(ret << 26)) >> 26; + return util::sext(ret, 6); } uint32_t tms340x0_device::rfield_s_07(offs_t offset) { uint32_t ret; RFIELDMAC(0x7f,10); - return ((int32_t)(ret << 25)) >> 25; + return util::sext(ret, 7); } uint32_t tms340x0_device::rfield_s_08(offs_t offset) @@ -492,49 +492,49 @@ uint32_t tms340x0_device::rfield_s_09(offs_t offset) { uint32_t ret; RFIELDMAC(0x1ff,8); - return ((int32_t)(ret << 23)) >> 23; + return util::sext(ret, 9); } uint32_t tms340x0_device::rfield_s_10(offs_t offset) { uint32_t ret; RFIELDMAC(0x3ff,7); - return ((int32_t)(ret << 22)) >> 22; + return util::sext(ret, 10); } uint32_t tms340x0_device::rfield_s_11(offs_t offset) { uint32_t ret; RFIELDMAC(0x7ff,6); - return ((int32_t)(ret << 21)) >> 21; + return util::sext(ret, 11); } uint32_t tms340x0_device::rfield_s_12(offs_t offset) { uint32_t ret; RFIELDMAC(0xfff,5); - return ((int32_t)(ret << 20)) >> 20; + return util::sext(ret, 12); } uint32_t tms340x0_device::rfield_s_13(offs_t offset) { uint32_t ret; RFIELDMAC(0x1fff,4); - return ((int32_t)(ret << 19)) >> 19; + return util::sext(ret, 13); } uint32_t tms340x0_device::rfield_s_14(offs_t offset) { uint32_t ret; RFIELDMAC(0x3fff,3); - return ((int32_t)(ret << 18)) >> 18; + return util::sext(ret, 14); } uint32_t tms340x0_device::rfield_s_15(offs_t offset) { uint32_t ret; RFIELDMAC(0x7fff,2); - return ((int32_t)(ret << 17)) >> 17; + return util::sext(ret, 15); } uint32_t tms340x0_device::rfield_s_16(offs_t offset) @@ -557,105 +557,105 @@ uint32_t tms340x0_device::rfield_s_17(offs_t offset) { uint32_t ret; RFIELDMAC(0x1ffff,0); - return ((int32_t)(ret << 15)) >> 15; + return util::sext(ret, 17); } uint32_t tms340x0_device::rfield_s_18(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0x3ffff,15); - return ((int32_t)(ret << 14)) >> 14; + return util::sext(ret, 18); } uint32_t tms340x0_device::rfield_s_19(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0x7ffff,14); - return ((int32_t)(ret << 13)) >> 13; + return util::sext(ret, 19); } uint32_t tms340x0_device::rfield_s_20(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0xfffff,13); - return ((int32_t)(ret << 12)) >> 12; + return util::sext(ret, 20); } uint32_t tms340x0_device::rfield_s_21(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0x1fffff,12); - return ((int32_t)(ret << 11)) >> 11; + return util::sext(ret, 21); } uint32_t tms340x0_device::rfield_s_22(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0x3fffff,11); - return ((int32_t)(ret << 10)) >> 10; + return util::sext(ret, 22); } uint32_t tms340x0_device::rfield_s_23(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0x7fffff,10); - return ((int32_t)(ret << 9)) >> 9; + return util::sext(ret, 23); } uint32_t tms340x0_device::rfield_s_24(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0xffffff,9); - return ((int32_t)(ret << 8)) >> 8; + return util::sext(ret, 24); } uint32_t tms340x0_device::rfield_s_25(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0x1ffffff,8); - return ((int32_t)(ret << 7)) >> 7; + return util::sext(ret, 25); } uint32_t tms340x0_device::rfield_s_26(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0x3ffffff,7); - return ((int32_t)(ret << 6)) >> 6; + return util::sext(ret, 26); } uint32_t tms340x0_device::rfield_s_27(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0x7ffffff,6); - return ((int32_t)(ret << 5)) >> 5; + return util::sext(ret, 27); } uint32_t tms340x0_device::rfield_s_28(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0xfffffff,5); - return ((int32_t)(ret << 4)) >> 4; + return util::sext(ret, 28); } uint32_t tms340x0_device::rfield_s_29(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0x1fffffff,4); - return ((int32_t)(ret << 3)) >> 3; + return util::sext(ret, 29); } uint32_t tms340x0_device::rfield_s_30(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0x3fffffff,3); - return ((int32_t)(ret << 2)) >> 2; + return util::sext(ret, 30); } uint32_t tms340x0_device::rfield_s_31(offs_t offset) { uint32_t ret; RFIELDMAC_BIG(0x7fffffff,2); - return ((int32_t)(ret << 1)) >> 1; + return util::sext(ret, 31); } const tms340x0_device::rfield_func tms340x0_device::s_rfield_functions[64] = diff --git a/src/devices/machine/wtl3132.cpp b/src/devices/machine/wtl3132.cpp index 2e86798b878..94f448654f2 100644 --- a/src/devices/machine/wtl3132.cpp +++ b/src/devices/machine/wtl3132.cpp @@ -342,8 +342,8 @@ void wtl3132_device::stage3(unsigned const index) if ((m_mode & MODE_RTN) && OPF(code, ENCN) == 1) m_cr = f32_lt(m_aa_in[1], i32_to_f32(-4194304)) || f32_lt(i32_to_f32(4194304), m_aa_in[1]); - m_a_out.v = (f32_to_i32(m_aa_in[1], (m_mode & MODE_RTN) ? - softfloat_round_near_even : softfloat_round_min, false) << 8) >> 8; + m_a_out.v = util::sext(f32_to_i32(m_aa_in[1], (m_mode & MODE_RTN) ? + softfloat_round_near_even : softfloat_round_min, false), 24); LOG("slot %d stage 3 fix %f == 0x%08x\n", index, u2f(m_aa_in[1].v), m_a_out.v); break; case MF_FLUT: diff --git a/src/devices/sound/es5506.cpp b/src/devices/sound/es5506.cpp index 3ea90a97261..479fbbad48b 100644 --- a/src/devices/sound/es5506.cpp +++ b/src/devices/sound/es5506.cpp @@ -1208,32 +1208,32 @@ inline void es5506_device::reg_write_high(es550x_voice *voice, offs_t offset, u3 break; case 0x20/8: /* O4(n-1) */ - voice->o4n1 = (s32)(data << 14) >> 14; + voice->o4n1 = util::sext(data, 18); LOG("voice %d, O4(n-1)=%05x\n", m_current_page & 0x1f, voice->o4n1 & 0x3ffff); break; case 0x28/8: /* O3(n-1) */ - voice->o3n1 = (s32)(data << 14) >> 14; + voice->o3n1 = util::sext(data, 18); LOG("voice %d, O3(n-1)=%05x\n", m_current_page & 0x1f, voice->o3n1 & 0x3ffff); break; case 0x30/8: /* O3(n-2) */ - voice->o3n2 = (s32)(data << 14) >> 14; + voice->o3n2 = util::sext(data, 18); LOG("voice %d, O3(n-2)=%05x\n", m_current_page & 0x1f, voice->o3n2 & 0x3ffff); break; case 0x38/8: /* O2(n-1) */ - voice->o2n1 = (s32)(data << 14) >> 14; + voice->o2n1 = util::sext(data, 18); LOG("voice %d, O2(n-1)=%05x\n", m_current_page & 0x1f, voice->o2n1 & 0x3ffff); break; case 0x40/8: /* O2(n-2) */ - voice->o2n2 = (s32)(data << 14) >> 14; + voice->o2n2 = util::sext(data, 18); LOG("voice %d, O2(n-2)=%05x\n", m_current_page & 0x1f, voice->o2n2 & 0x3ffff); break; case 0x48/8: /* O1(n-1) */ - voice->o1n1 = (s32)(data << 14) >> 14; + voice->o1n1 = util::sext(data, 18); LOG("voice %d, O1(n-1)=%05x\n", m_current_page & 0x1f, voice->o1n1 & 0x3ffff); break; diff --git a/src/devices/video/psx.cpp b/src/devices/video/psx.cpp index 448d384f1fe..1256c8df4fe 100644 --- a/src/devices/video/psx.cpp +++ b/src/devices/video/psx.cpp @@ -142,10 +142,10 @@ static const int m_p_n_prevpointlist4b[] = { 0, 2, 3, 1 }; static const int m_p_n_nextpointlist3[] = { 1, 2, 0 }; static const int m_p_n_prevpointlist3[] = { 2, 0, 1 }; -#define SINT11( x ) ( ( (int32_t)( x ) << 21 ) >> 21 ) - #define COORD_X( a ) ( a.sw.l ) #define COORD_Y( a ) ( a.sw.h ) +#define S11_COORD_X( a ) util::sext( a.sw.l, 11 ) +#define S11_COORD_Y( a ) util::sext( a.sw.h, 11 ) #define SIZE_W( a ) ( a.w.l ) #define SIZE_H( a ) ( a.w.h ) #define BGR_C( a ) ( a.b.h3 ) @@ -1331,8 +1331,8 @@ void psxgpu_device::decode_tpage( uint32_t tpage ) } #define GET_COORD( a ) \ - a.sw.l = SINT11( COORD_X( a ) ); \ - a.sw.h = SINT11( COORD_Y( a ) ); + a.sw.l = S11_COORD_X( a ); \ + a.sw.h = S11_COORD_Y( a ); static inline int CullVertex( int a, int b ) { @@ -1420,7 +1420,7 @@ void psxgpu_device::FlatPolygon( int n_points ) } for( int n_point = 0; n_point < n_points; n_point++ ) { - DebugMesh( SINT11( COORD_X( m_packet.FlatPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.FlatPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.FlatPolygon.vertex[ n_point ].n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.FlatPolygon.vertex[ n_point ].n_coord ) + n_drawoffset_y ); } DebugMeshEnd(); #endif @@ -1535,7 +1535,7 @@ void psxgpu_device::FlatTexturedPolygon( int n_points ) } for( int n_point = 0; n_point < n_points; n_point++ ) { - DebugMesh( SINT11( COORD_X( m_packet.FlatTexturedPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.FlatTexturedPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.FlatTexturedPolygon.vertex[ n_point ].n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.FlatTexturedPolygon.vertex[ n_point ].n_coord ) + n_drawoffset_y ); } DebugMeshEnd(); #endif @@ -1690,7 +1690,7 @@ void psxgpu_device::GouraudPolygon( int n_points ) } for( int n_point = 0; n_point < n_points; n_point++ ) { - DebugMesh( SINT11( COORD_X( m_packet.GouraudPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.GouraudPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.GouraudPolygon.vertex[ n_point ].n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.GouraudPolygon.vertex[ n_point ].n_coord ) + n_drawoffset_y ); } DebugMeshEnd(); #endif @@ -1854,7 +1854,7 @@ void psxgpu_device::GouraudTexturedPolygon( int n_points ) } for( int n_point = 0; n_point < n_points; n_point++ ) { - DebugMesh( SINT11( COORD_X( m_packet.GouraudTexturedPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.GouraudTexturedPolygon.vertex[ n_point ].n_coord ) ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.GouraudTexturedPolygon.vertex[ n_point ].n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.GouraudTexturedPolygon.vertex[ n_point ].n_coord ) + n_drawoffset_y ); } DebugMeshEnd(); #endif @@ -2054,15 +2054,15 @@ void psxgpu_device::MonochromeLine() { return; } - DebugMesh( SINT11( COORD_X( m_packet.MonochromeLine.vertex[ 0 ].n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.MonochromeLine.vertex[ 0 ].n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.MonochromeLine.vertex[ 1 ].n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.MonochromeLine.vertex[ 1 ].n_coord ) ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.MonochromeLine.vertex[ 0 ].n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.MonochromeLine.vertex[ 0 ].n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.MonochromeLine.vertex[ 1 ].n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.MonochromeLine.vertex[ 1 ].n_coord ) + n_drawoffset_y ); DebugMeshEnd(); #endif - int32_t n_xstart = SINT11( COORD_X( m_packet.MonochromeLine.vertex[ 0 ].n_coord ) ); - int32_t n_xend = SINT11( COORD_X( m_packet.MonochromeLine.vertex[ 1 ].n_coord ) ); - int32_t n_ystart = SINT11( COORD_Y( m_packet.MonochromeLine.vertex[ 0 ].n_coord ) ); - int32_t n_yend = SINT11( COORD_Y( m_packet.MonochromeLine.vertex[ 1 ].n_coord ) ); + int32_t n_xstart = S11_COORD_X( m_packet.MonochromeLine.vertex[ 0 ].n_coord ); + int32_t n_xend = S11_COORD_X( m_packet.MonochromeLine.vertex[ 1 ].n_coord ); + int32_t n_ystart = S11_COORD_Y( m_packet.MonochromeLine.vertex[ 0 ].n_coord ); + int32_t n_yend = S11_COORD_Y( m_packet.MonochromeLine.vertex[ 1 ].n_coord ); uint8_t n_cmd = BGR_C( m_packet.MonochromeLine.n_bgr ); uint8_t n_r = BGR_R( m_packet.MonochromeLine.n_bgr ); @@ -2154,8 +2154,8 @@ void psxgpu_device::GouraudLine() { return; } - DebugMesh( SINT11( COORD_X( m_packet.GouraudLine.vertex[ 0 ].n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.GouraudLine.vertex[ 0 ].n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.GouraudLine.vertex[ 1 ].n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.GouraudLine.vertex[ 1 ].n_coord ) ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.GouraudLine.vertex[ 0 ].n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.GouraudLine.vertex[ 0 ].n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.GouraudLine.vertex[ 1 ].n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.GouraudLine.vertex[ 1 ].n_coord ) + n_drawoffset_y ); DebugMeshEnd(); #endif @@ -2163,14 +2163,14 @@ void psxgpu_device::GouraudLine() TRANSPARENCYSETUP - int32_t n_xstart = SINT11( COORD_X( m_packet.GouraudLine.vertex[ 0 ].n_coord ) ); - int32_t n_ystart = SINT11( COORD_Y( m_packet.GouraudLine.vertex[ 0 ].n_coord ) ); + int32_t n_xstart = S11_COORD_X( m_packet.GouraudLine.vertex[ 0 ].n_coord ); + int32_t n_ystart = S11_COORD_Y( m_packet.GouraudLine.vertex[ 0 ].n_coord ); PAIR n_cr1; n_cr1.w.h = BGR_R( m_packet.GouraudLine.vertex[ 0 ].n_bgr ); n_cr1.w.l = 0; PAIR n_cg1; n_cg1.w.h = BGR_G( m_packet.GouraudLine.vertex[ 0 ].n_bgr ); n_cg1.w.l = 0; PAIR n_cb1; n_cb1.w.h = BGR_B( m_packet.GouraudLine.vertex[ 0 ].n_bgr ); n_cb1.w.l = 0; - int32_t n_xend = SINT11( COORD_X( m_packet.GouraudLine.vertex[ 1 ].n_coord ) ); - int32_t n_yend = SINT11( COORD_Y( m_packet.GouraudLine.vertex[ 1 ].n_coord ) ); + int32_t n_xend = S11_COORD_X( m_packet.GouraudLine.vertex[ 1 ].n_coord ); + int32_t n_yend = S11_COORD_Y( m_packet.GouraudLine.vertex[ 1 ].n_coord ); PAIR n_cr2; n_cr2.w.h = BGR_R( m_packet.GouraudLine.vertex[ 1 ].n_bgr ); n_cr2.w.l = 0; PAIR n_cg2; n_cg2.w.h = BGR_G( m_packet.GouraudLine.vertex[ 1 ].n_bgr ); n_cg2.w.l = 0; PAIR n_cb2; n_cb2.w.h = BGR_B( m_packet.GouraudLine.vertex[ 1 ].n_bgr ); n_cb2.w.l = 0; @@ -2268,10 +2268,10 @@ void psxgpu_device::FrameBufferRectangleDraw() { return; } - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle.n_coord ) ), SINT11( COORD_Y( m_packet.FlatRectangle.n_coord ) ) ); - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle.n_coord ) ) + SIZE_W( m_packet.FlatRectangle.n_size ), SINT11( COORD_Y( m_packet.FlatRectangle.n_coord ) ) ); - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle.n_coord ) ), SINT11( COORD_Y( m_packet.FlatRectangle.n_coord ) ) + SIZE_H( m_packet.FlatRectangle.n_size ) ); - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle.n_coord ) ) + SIZE_W( m_packet.FlatRectangle.n_size ), SINT11( COORD_Y( m_packet.FlatRectangle.n_coord ) ) + SIZE_H( m_packet.FlatRectangle.n_size ) ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle.n_coord ), S11_COORD_Y( m_packet.FlatRectangle.n_coord ) ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle.n_coord ) + SIZE_W( m_packet.FlatRectangle.n_size ), S11_COORD_Y( m_packet.FlatRectangle.n_coord ) ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle.n_coord ), S11_COORD_Y( m_packet.FlatRectangle.n_coord ) + SIZE_H( m_packet.FlatRectangle.n_size ) ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle.n_coord ) + SIZE_W( m_packet.FlatRectangle.n_size ), S11_COORD_Y( m_packet.FlatRectangle.n_coord ) + SIZE_H( m_packet.FlatRectangle.n_size ) ); DebugMeshEnd(); #endif @@ -2309,10 +2309,10 @@ void psxgpu_device::FlatRectangle() { return; } - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.FlatRectangle.n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle.n_coord ) ) + n_drawoffset_x + SIZE_W( m_packet.FlatRectangle.n_size ), SINT11( COORD_Y( m_packet.FlatRectangle.n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.FlatRectangle.n_coord ) ) + n_drawoffset_y + SIZE_H( m_packet.FlatRectangle.n_size ) ); - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle.n_coord ) ) + n_drawoffset_x + SIZE_W( m_packet.FlatRectangle.n_size ), SINT11( COORD_Y( m_packet.FlatRectangle.n_coord ) ) + n_drawoffset_y + SIZE_H( m_packet.FlatRectangle.n_size ) ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.FlatRectangle.n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle.n_coord ) + n_drawoffset_x + SIZE_W( m_packet.FlatRectangle.n_size ), S11_COORD_Y( m_packet.FlatRectangle.n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.FlatRectangle.n_coord ) + n_drawoffset_y + SIZE_H( m_packet.FlatRectangle.n_size ) ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle.n_coord ) + n_drawoffset_x + SIZE_W( m_packet.FlatRectangle.n_size ), S11_COORD_Y( m_packet.FlatRectangle.n_coord ) + n_drawoffset_y + SIZE_H( m_packet.FlatRectangle.n_size ) ); DebugMeshEnd(); #endif @@ -2324,8 +2324,8 @@ void psxgpu_device::FlatRectangle() PAIR n_g; n_g.w.h = BGR_G( m_packet.FlatRectangle.n_bgr ); n_g.w.l = 0; PAIR n_b; n_b.w.h = BGR_B( m_packet.FlatRectangle.n_bgr ); n_b.w.l = 0; - int16_t n_x = SINT11( COORD_X( m_packet.FlatRectangle.n_coord ) ); - int16_t n_y = SINT11( COORD_Y( m_packet.FlatRectangle.n_coord ) ); + int16_t n_x = S11_COORD_X( m_packet.FlatRectangle.n_coord ); + int16_t n_y = S11_COORD_Y( m_packet.FlatRectangle.n_coord ); int32_t n_h = SIZE_H( m_packet.FlatRectangle.n_size ); while( n_h > 0 ) @@ -2358,10 +2358,10 @@ void psxgpu_device::FlatRectangle8x8() { return; } - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle8x8.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.FlatRectangle8x8.n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle8x8.n_coord ) ) + n_drawoffset_x + 8, SINT11( COORD_Y( m_packet.FlatRectangle8x8.n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle8x8.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.FlatRectangle8x8.n_coord ) ) + n_drawoffset_y + 8 ); - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle8x8.n_coord ) ) + n_drawoffset_x + 8, SINT11( COORD_Y( m_packet.FlatRectangle8x8.n_coord ) ) + n_drawoffset_y + 8 ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle8x8.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.FlatRectangle8x8.n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle8x8.n_coord ) + n_drawoffset_x + 8, S11_COORD_Y( m_packet.FlatRectangle8x8.n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle8x8.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.FlatRectangle8x8.n_coord ) + n_drawoffset_y + 8 ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle8x8.n_coord ) + n_drawoffset_x + 8, S11_COORD_Y( m_packet.FlatRectangle8x8.n_coord ) + n_drawoffset_y + 8 ); DebugMeshEnd(); #endif @@ -2373,8 +2373,8 @@ void psxgpu_device::FlatRectangle8x8() PAIR n_g; n_g.w.h = BGR_G( m_packet.FlatRectangle8x8.n_bgr ); n_g.w.l = 0; PAIR n_b; n_b.w.h = BGR_B( m_packet.FlatRectangle8x8.n_bgr ); n_b.w.l = 0; - int16_t n_x = SINT11( COORD_X( m_packet.FlatRectangle8x8.n_coord ) ); - int16_t n_y = SINT11( COORD_Y( m_packet.FlatRectangle8x8.n_coord ) ); + int16_t n_x = S11_COORD_X( m_packet.FlatRectangle8x8.n_coord ); + int16_t n_y = S11_COORD_Y( m_packet.FlatRectangle8x8.n_coord ); int32_t n_h = 8; while( n_h > 0 ) @@ -2407,10 +2407,10 @@ void psxgpu_device::FlatRectangle16x16() { return; } - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle16x16.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.FlatRectangle16x16.n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle16x16.n_coord ) ) + n_drawoffset_x + 16, SINT11( COORD_Y( m_packet.FlatRectangle16x16.n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle16x16.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.FlatRectangle16x16.n_coord ) ) + n_drawoffset_y + 16 ); - DebugMesh( SINT11( COORD_X( m_packet.FlatRectangle16x16.n_coord ) ) + n_drawoffset_x + 16, SINT11( COORD_Y( m_packet.FlatRectangle16x16.n_coord ) ) + n_drawoffset_y + 16 ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle16x16.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.FlatRectangle16x16.n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle16x16.n_coord ) + n_drawoffset_x + 16, S11_COORD_Y( m_packet.FlatRectangle16x16.n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle16x16.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.FlatRectangle16x16.n_coord ) + n_drawoffset_y + 16 ); + DebugMesh( S11_COORD_X( m_packet.FlatRectangle16x16.n_coord ) + n_drawoffset_x + 16, S11_COORD_Y( m_packet.FlatRectangle16x16.n_coord ) + n_drawoffset_y + 16 ); DebugMeshEnd(); #endif @@ -2422,8 +2422,8 @@ void psxgpu_device::FlatRectangle16x16() PAIR n_g; n_g.w.h = BGR_G( m_packet.FlatRectangle16x16.n_bgr ); n_g.w.l = 0; PAIR n_b; n_b.w.h = BGR_B( m_packet.FlatRectangle16x16.n_bgr ); n_b.w.l = 0; - int16_t n_x = SINT11( COORD_X( m_packet.FlatRectangle16x16.n_coord ) ); - int16_t n_y = SINT11( COORD_Y( m_packet.FlatRectangle16x16.n_coord ) ); + int16_t n_x = S11_COORD_X( m_packet.FlatRectangle16x16.n_coord ); + int16_t n_y = S11_COORD_Y( m_packet.FlatRectangle16x16.n_coord ); int32_t n_h = 16; while( n_h > 0 ) @@ -2456,10 +2456,10 @@ void psxgpu_device::FlatTexturedRectangle() { return; } - DebugMesh( SINT11( COORD_X( m_packet.FlatTexturedRectangle.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.FlatTexturedRectangle.n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.FlatTexturedRectangle.n_coord ) ) + n_drawoffset_x + SIZE_W( m_packet.FlatTexturedRectangle.n_size ), SINT11( COORD_Y( m_packet.FlatTexturedRectangle.n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.FlatTexturedRectangle.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.FlatTexturedRectangle.n_coord ) ) + n_drawoffset_y + SIZE_H( m_packet.FlatTexturedRectangle.n_size ) ); - DebugMesh( SINT11( COORD_X( m_packet.FlatTexturedRectangle.n_coord ) ) + n_drawoffset_x + SIZE_W( m_packet.FlatTexturedRectangle.n_size ), SINT11( COORD_Y( m_packet.FlatTexturedRectangle.n_coord ) ) + n_drawoffset_y + SIZE_H( m_packet.FlatTexturedRectangle.n_size ) ); + DebugMesh( S11_COORD_X( m_packet.FlatTexturedRectangle.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.FlatTexturedRectangle.n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.FlatTexturedRectangle.n_coord ) + n_drawoffset_x + SIZE_W( m_packet.FlatTexturedRectangle.n_size ), S11_COORD_Y( m_packet.FlatTexturedRectangle.n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.FlatTexturedRectangle.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.FlatTexturedRectangle.n_coord ) + n_drawoffset_y + SIZE_H( m_packet.FlatTexturedRectangle.n_size ) ); + DebugMesh( S11_COORD_X( m_packet.FlatTexturedRectangle.n_coord ) + n_drawoffset_x + SIZE_W( m_packet.FlatTexturedRectangle.n_size ), S11_COORD_Y( m_packet.FlatTexturedRectangle.n_coord ) + n_drawoffset_y + SIZE_H( m_packet.FlatTexturedRectangle.n_size ) ); DebugMeshEnd(); #endif @@ -2475,8 +2475,8 @@ void psxgpu_device::FlatTexturedRectangle() PAIR n_g; n_g.w.h = n_cmd & 0x01 ? 0x80 : BGR_G( m_packet.FlatTexturedRectangle.n_bgr ); n_g.w.l = 0; PAIR n_b; n_b.w.h = n_cmd & 0x01 ? 0x80 : BGR_B( m_packet.FlatTexturedRectangle.n_bgr ); n_b.w.l = 0; - int16_t n_x = SINT11( COORD_X( m_packet.FlatTexturedRectangle.n_coord ) ); - int16_t n_y = SINT11( COORD_Y( m_packet.FlatTexturedRectangle.n_coord ) ); + int16_t n_x = S11_COORD_X( m_packet.FlatTexturedRectangle.n_coord ); + int16_t n_y = S11_COORD_Y( m_packet.FlatTexturedRectangle.n_coord ); uint8_t n_v = TEXTURE_V( m_packet.FlatTexturedRectangle.n_texture ); uint32_t n_h = SIZE_H( m_packet.FlatTexturedRectangle.n_size ); @@ -2513,10 +2513,10 @@ void psxgpu_device::Sprite8x8() { return; } - DebugMesh( SINT11( COORD_X( m_packet.Sprite8x8.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.Sprite8x8.n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.Sprite8x8.n_coord ) ) + n_drawoffset_x + 7, SINT11( COORD_Y( m_packet.Sprite8x8.n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.Sprite8x8.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.Sprite8x8.n_coord ) ) + n_drawoffset_y + 7 ); - DebugMesh( SINT11( COORD_X( m_packet.Sprite8x8.n_coord ) ) + n_drawoffset_x + 7, SINT11( COORD_Y( m_packet.Sprite8x8.n_coord ) ) + n_drawoffset_y + 7 ); + DebugMesh( S11_COORD_X( m_packet.Sprite8x8.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.Sprite8x8.n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.Sprite8x8.n_coord ) + n_drawoffset_x + 7, S11_COORD_Y( m_packet.Sprite8x8.n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.Sprite8x8.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.Sprite8x8.n_coord ) + n_drawoffset_y + 7 ); + DebugMesh( S11_COORD_X( m_packet.Sprite8x8.n_coord ) + n_drawoffset_x + 7, S11_COORD_Y( m_packet.Sprite8x8.n_coord ) + n_drawoffset_y + 7 ); DebugMeshEnd(); #endif @@ -2532,8 +2532,8 @@ void psxgpu_device::Sprite8x8() PAIR n_g; n_g.w.h = n_cmd & 0x01 ? 0x80 : BGR_G( m_packet.Sprite8x8.n_bgr ); n_g.w.l = 0; PAIR n_b; n_b.w.h = n_cmd & 0x01 ? 0x80 : BGR_B( m_packet.Sprite8x8.n_bgr ); n_b.w.l = 0; - int16_t n_x = SINT11( COORD_X( m_packet.Sprite8x8.n_coord ) ); - int16_t n_y = SINT11( COORD_Y( m_packet.Sprite8x8.n_coord ) ); + int16_t n_x = S11_COORD_X( m_packet.Sprite8x8.n_coord ); + int16_t n_y = S11_COORD_Y( m_packet.Sprite8x8.n_coord ); uint8_t n_v = TEXTURE_V( m_packet.Sprite8x8.n_texture ); uint32_t n_h = 8; @@ -2571,10 +2571,10 @@ void psxgpu_device::Sprite16x16() { return; } - DebugMesh( SINT11( COORD_X( m_packet.Sprite16x16.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.Sprite16x16.n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.Sprite16x16.n_coord ) ) + n_drawoffset_x + 7, SINT11( COORD_Y( m_packet.Sprite16x16.n_coord ) ) + n_drawoffset_y ); - DebugMesh( SINT11( COORD_X( m_packet.Sprite16x16.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.Sprite16x16.n_coord ) ) + n_drawoffset_y + 7 ); - DebugMesh( SINT11( COORD_X( m_packet.Sprite16x16.n_coord ) ) + n_drawoffset_x + 7, SINT11( COORD_Y( m_packet.Sprite16x16.n_coord ) ) + n_drawoffset_y + 7 ); + DebugMesh( S11_COORD_X( m_packet.Sprite16x16.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.Sprite16x16.n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.Sprite16x16.n_coord ) + n_drawoffset_x + 7, S11_COORD_Y( m_packet.Sprite16x16.n_coord ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.Sprite16x16.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.Sprite16x16.n_coord ) + n_drawoffset_y + 7 ); + DebugMesh( S11_COORD_X( m_packet.Sprite16x16.n_coord ) + n_drawoffset_x + 7, S11_COORD_Y( m_packet.Sprite16x16.n_coord ) + n_drawoffset_y + 7 ); DebugMeshEnd(); #endif @@ -2590,8 +2590,8 @@ void psxgpu_device::Sprite16x16() PAIR n_g; n_g.w.h = n_cmd & 0x01 ? 0x80 : BGR_G( m_packet.Sprite16x16.n_bgr ); n_g.w.l = 0; PAIR n_b; n_b.w.h = n_cmd & 0x01 ? 0x80 : BGR_B( m_packet.Sprite16x16.n_bgr ); n_b.w.l = 0; - int16_t n_x = SINT11( COORD_X( m_packet.Sprite16x16.n_coord ) ); - int16_t n_y = SINT11( COORD_Y( m_packet.Sprite16x16.n_coord ) ); + int16_t n_x = S11_COORD_X( m_packet.Sprite16x16.n_coord ); + int16_t n_y = S11_COORD_Y( m_packet.Sprite16x16.n_coord ); uint8_t n_v = TEXTURE_V( m_packet.Sprite16x16.n_texture ); uint32_t n_h = 16; @@ -2629,7 +2629,7 @@ void psxgpu_device::Dot() { return; } - DebugMesh( SINT11( COORD_X( m_packet.Dot.vertex.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.Dot.vertex.n_coord ) ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.Dot.vertex.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.Dot.vertex.n_coord ) + n_drawoffset_y ); DebugMeshEnd(); #endif @@ -2637,8 +2637,8 @@ void psxgpu_device::Dot() uint8_t n_r = BGR_R( m_packet.Dot.n_bgr ); uint8_t n_g = BGR_G( m_packet.Dot.n_bgr ); uint8_t n_b = BGR_B( m_packet.Dot.n_bgr ); - int32_t n_x = SINT11( COORD_X( m_packet.Dot.vertex.n_coord ) ); - int32_t n_y = SINT11( COORD_Y( m_packet.Dot.vertex.n_coord ) ); + int32_t n_x = S11_COORD_X( m_packet.Dot.vertex.n_coord ); + int32_t n_y = S11_COORD_Y( m_packet.Dot.vertex.n_coord ); TRANSPARENCYSETUP @@ -2677,7 +2677,7 @@ void psxgpu_device::TexturedDot() { return; } - DebugMesh( SINT11( COORD_X( m_packet.TexturedDot.vertex.n_coord ) ) + n_drawoffset_x, SINT11( COORD_Y( m_packet.TexturedDot.vertex.n_coord ) ) + n_drawoffset_y ); + DebugMesh( S11_COORD_X( m_packet.TexturedDot.vertex.n_coord ) + n_drawoffset_x, S11_COORD_Y( m_packet.TexturedDot.vertex.n_coord ) + n_drawoffset_y ); DebugMeshEnd(); #endif @@ -2687,8 +2687,8 @@ void psxgpu_device::TexturedDot() PAIR n_g; n_g.w.h = n_cmd & 0x01 ? 0x80 : BGR_G( m_packet.TexturedDot.n_bgr ); n_g.w.l = 0; PAIR n_b; n_b.w.h = n_cmd & 0x01 ? 0x80 : BGR_B( m_packet.TexturedDot.n_bgr ); n_b.w.l = 0; - int32_t n_x = SINT11( COORD_X( m_packet.TexturedDot.vertex.n_coord ) ); - int32_t n_y = SINT11( COORD_Y( m_packet.TexturedDot.vertex.n_coord ) ); + int32_t n_x = S11_COORD_X( m_packet.TexturedDot.vertex.n_coord ); + int32_t n_y = S11_COORD_Y( m_packet.TexturedDot.vertex.n_coord ); uint8_t n_u = TEXTURE_U(m_packet.TexturedDot.vertex.n_texture ); uint8_t n_v = TEXTURE_V(m_packet.TexturedDot.vertex.n_texture ); uint32_t n_clutx = ( m_packet.TexturedDot.vertex.n_texture.w.h & 0x3f ) << 4; @@ -2715,10 +2715,10 @@ void psxgpu_device::MoveImage() { return; } - DebugMesh( SINT11( COORD_X( m_packet.MoveImage.vertex[ 1 ].n_coord ) ), SINT11( COORD_Y( m_packet.MoveImage.vertex[ 1 ].n_coord ) ) ); - DebugMesh( SINT11( COORD_X( m_packet.MoveImage.vertex[ 1 ].n_coord ) ) + SIZE_W( m_packet.MoveImage.n_size ), SINT11( COORD_Y( m_packet.MoveImage.vertex[ 1 ].n_coord ) ) ); - DebugMesh( SINT11( COORD_X( m_packet.MoveImage.vertex[ 1 ].n_coord ) ), SINT11( COORD_Y( m_packet.MoveImage.vertex[ 1 ].n_coord ) ) + SIZE_H( m_packet.MoveImage.n_size ) ); - DebugMesh( SINT11( COORD_X( m_packet.MoveImage.vertex[ 1 ].n_coord ) ) + SIZE_W( m_packet.MoveImage.n_size ), SINT11( COORD_Y( m_packet.MoveImage.vertex[ 1 ].n_coord ) ) + SIZE_H( m_packet.MoveImage.n_size ) ); + DebugMesh( S11_COORD_X( m_packet.MoveImage.vertex[ 1 ].n_coord ), S11_COORD_Y( m_packet.MoveImage.vertex[ 1 ].n_coord ) ); + DebugMesh( S11_COORD_X( m_packet.MoveImage.vertex[ 1 ].n_coord ) + SIZE_W( m_packet.MoveImage.n_size ), S11_COORD_Y( m_packet.MoveImage.vertex[ 1 ].n_coord ) ); + DebugMesh( S11_COORD_X( m_packet.MoveImage.vertex[ 1 ].n_coord ), S11_COORD_Y( m_packet.MoveImage.vertex[ 1 ].n_coord ) ) + SIZE_H( m_packet.MoveImage.n_size ) ); + DebugMesh( S11_COORD_X( m_packet.MoveImage.vertex[ 1 ].n_coord ) + SIZE_W( m_packet.MoveImage.n_size ), S11_COORD_Y( m_packet.MoveImage.vertex[ 1 ].n_coord ) + SIZE_H( m_packet.MoveImage.n_size ) ); DebugMeshEnd(); #endif @@ -3222,14 +3222,14 @@ void psxgpu_device::gpu_write( uint32_t *p_ram, int32_t n_size ) n_drawarea_x2, n_drawarea_y2 ); break; case 0xe5: - n_drawoffset_x = SINT11( m_packet.n_entry[ 0 ] & 2047 ); + n_drawoffset_x = util::sext( m_packet.n_entry[ 0 ] & 2047, 11 ); if( m_n_gputype == 2 ) { - n_drawoffset_y = SINT11( ( m_packet.n_entry[ 0 ] >> 11 ) & 2047 ); + n_drawoffset_y = util::sext( ( m_packet.n_entry[ 0 ] >> 11 ) & 2047, 11 ); } else { - n_drawoffset_y = SINT11( ( m_packet.n_entry[ 0 ] >> 12 ) & 2047 ); + n_drawoffset_y = util::sext( ( m_packet.n_entry[ 0 ] >> 12 ) & 2047, 11 ); } LOGMASKED(LOG_WRITE, "%s: %02x: drawing offset %d,%d\n", machine().describe_context(), m_packet.n_entry[ 0 ] >> 24, n_drawoffset_x, n_drawoffset_y ); diff --git a/src/devices/video/snes_ppu.cpp b/src/devices/video/snes_ppu.cpp index 9fddaa1b8d1..a05ae16ea38 100644 --- a/src/devices/video/snes_ppu.cpp +++ b/src/devices/video/snes_ppu.cpp @@ -796,10 +796,10 @@ void snes_ppu_device::update_line_mode7( uint16_t curline, uint8_t layer_idx ) int b = m_mode7.matrix_b; int c = m_mode7.matrix_c; int d = m_mode7.matrix_d; - int hcenter = (m_mode7.origin_x << 19) >> 19; - int vcenter = (m_mode7.origin_y << 19) >> 19; - int hoffset = (m_mode7.hor_offset << 19) >> 19; - int voffset = (m_mode7.ver_offset << 19) >> 19; + int hcenter = util::sext(m_mode7.origin_x, 13); + int vcenter = util::sext(m_mode7.origin_y, 13); + int hoffset = util::sext(m_mode7.hor_offset, 13); + int voffset = util::sext(m_mode7.ver_offset, 13); uint32_t mosaic_counter = 1; uint32_t mosaic_palette = 0; diff --git a/src/devices/video/voodoo_regs.h b/src/devices/video/voodoo_regs.h index 539991553eb..373e6d0c66b 100644 --- a/src/devices/video/voodoo_regs.h +++ b/src/devices/video/voodoo_regs.h @@ -806,8 +806,6 @@ private: class voodoo_regs { public: - static constexpr s32 s24(s32 value) { return s32(value << 8) >> 8; } - // 0x000 static constexpr u32 reg_vdstatus = 0x000/4; // R P static constexpr u32 reg_intrCtrl = 0x004/4; // RW P -- Voodoo2/Banshee only @@ -1028,26 +1026,26 @@ public: s32 by() const { return s16(m_regs[reg_vertexBy].u); } s32 cx() const { return s16(m_regs[reg_vertexCx].u); } s32 cy() const { return s16(m_regs[reg_vertexCy].u); } - s32 start_r() const { return s24(m_regs[reg_startR].u); } - s32 start_g() const { return s24(m_regs[reg_startG].u); } - s32 start_b() const { return s24(m_regs[reg_startB].u); } - s32 start_a() const { return s24(m_regs[reg_startA].u); } + s32 start_r() const { return util::sext(m_regs[reg_startR].u, 24); } + s32 start_g() const { return util::sext(m_regs[reg_startG].u, 24); } + s32 start_b() const { return util::sext(m_regs[reg_startB].u, 24); } + s32 start_a() const { return util::sext(m_regs[reg_startA].u, 24); } s32 start_z() const { return m_regs[reg_startZ].u; } s64 start_s() const { return m_starts; } s64 start_t() const { return m_startt; } s64 start_w() const { return m_startw; } - s32 dr_dx() const { return s24(m_regs[reg_dRdX].u); } - s32 dg_dx() const { return s24(m_regs[reg_dGdX].u); } - s32 db_dx() const { return s24(m_regs[reg_dBdX].u); } - s32 da_dx() const { return s24(m_regs[reg_dAdX].u); } + s32 dr_dx() const { return util::sext(m_regs[reg_dRdX].u, 24); } + s32 dg_dx() const { return util::sext(m_regs[reg_dGdX].u, 24); } + s32 db_dx() const { return util::sext(m_regs[reg_dBdX].u, 24); } + s32 da_dx() const { return util::sext(m_regs[reg_dAdX].u, 24); } s32 dz_dx() const { return m_regs[reg_dZdX].u; } s64 ds_dx() const { return m_dsdx; } s64 dt_dx() const { return m_dtdx; } s64 dw_dx() const { return m_dwdx; } - s32 dr_dy() const { return s24(m_regs[reg_dRdY].u); } - s32 dg_dy() const { return s24(m_regs[reg_dGdY].u); } - s32 db_dy() const { return s24(m_regs[reg_dBdY].u); } - s32 da_dy() const { return s24(m_regs[reg_dAdY].u); } + s32 dr_dy() const { return util::sext(m_regs[reg_dRdY].u, 24); } + s32 dg_dy() const { return util::sext(m_regs[reg_dGdY].u, 24); } + s32 db_dy() const { return util::sext(m_regs[reg_dBdY].u, 24); } + s32 da_dy() const { return util::sext(m_regs[reg_dAdY].u, 24); } s32 dz_dy() const { return m_regs[reg_dZdY].u; } s64 ds_dy() const { return m_dsdy; } s64 dt_dy() const { return m_dtdy; } diff --git a/src/devices/video/zeus2.cpp b/src/devices/video/zeus2.cpp index 300b5ad2d0c..d7a91138f8c 100644 --- a/src/devices/video/zeus2.cpp +++ b/src/devices/video/zeus2.cpp @@ -1784,8 +1784,7 @@ void zeus2_renderer::zeus2_draw_quad(const uint32_t *databuffer, uint32_t texdat extra.transcolor = (texmode & 0x180) ? 0 : 0x100; extra.texbase = WAVERAM_BLOCK0_EXT(m_state->zeus_texbase); extra.depth_min_enable = true;// (m_state->m_renderRegs[0x14] & 0x008000); - extra.zbuf_min = int32_t((m_state->m_renderRegs[0x15]) << 8) >> 8; - //extra.zbuf_min = m_state->m_renderRegs[0x15]; + extra.zbuf_min = util::sext(m_state->m_renderRegs[0x15], 24); extra.depth_test_enable = !(m_state->m_renderRegs[0x14] & 0x000020); //extra.depth_test_enable &= !(m_state->m_renderRegs[0x14] & 0x008000); extra.depth_write_enable = !(m_state->m_renderRegs[0x14] & 0x001000); diff --git a/src/lib/util/coretmpl.h b/src/lib/util/coretmpl.h index 9d033f72d26..55313a4a0f5 100644 --- a/src/lib/util/coretmpl.h +++ b/src/lib/util/coretmpl.h @@ -664,6 +664,14 @@ template <unsigned B, typename T, typename... U> T bitswap(T val, U... b) noexce /// \} +// utility function for sign-extending values of arbitrary width +template <typename T, typename U> +constexpr std::make_signed_t<T> sext(T value, U width) noexcept +{ + return std::make_signed_t<T>(value << (8 * sizeof(value) - width)) >> (8 * sizeof(value) - width); +} + + // constexpr absolute value of an integer template <typename T> constexpr std::enable_if_t<std::is_signed<T>::value, T> iabs(T v) noexcept diff --git a/src/mame/atari/jagobj.ipp b/src/mame/atari/jagobj.ipp index ffa8e7cdd8c..519cb923b3a 100644 --- a/src/mame/atari/jagobj.ipp +++ b/src/mame/atari/jagobj.ipp @@ -577,7 +577,7 @@ uint32_t *jaguar_state::process_bitmap(uint16_t *scanline, uint32_t *objdata, in uint32_t lower2 = objdata[3]; /* extract data */ - int32_t xpos = (int32_t)(lower2 << 20) >> 20; + int32_t xpos = util::sext(lower2, 12); uint8_t depth = 1 << ((lower2 >> 12) & 7); uint8_t pitch = (lower2 >> 15) & 7; uint32_t dwidth = (lower2 >> 18) & 0x3ff; @@ -598,7 +598,7 @@ uint32_t *jaguar_state::process_bitmap(uint16_t *scanline, uint32_t *objdata, in uint32_t lower2 = objdata[3]; /* extract data */ - int32_t xpos = (int32_t)(lower2 << 20) >> 20; + int32_t xpos = util::sext(lower2, 12); uint8_t depthlog = (lower2 >> 12) & 7; uint8_t pitch = (lower2 >> 15) & 7; uint32_t dwidth = (lower2 >> 18) & 0x3ff; @@ -759,7 +759,7 @@ uint32_t *jaguar_state::process_scaled_bitmap(uint16_t *scanline, uint32_t *objd uint32_t lower2 = objdata[3]; /* extract data */ - int32_t xpos = (int32_t)(lower2 << 20) >> 20; + int32_t xpos = util::sext(lower2, 12); uint8_t depth = 1 << ((lower2 >> 12) & 7); uint8_t pitch = (lower2 >> 15) & 7; uint32_t dwidth = (lower2 >> 18) & 0x3ff; @@ -784,7 +784,7 @@ uint32_t *jaguar_state::process_scaled_bitmap(uint16_t *scanline, uint32_t *objd uint32_t lower2 = objdata[3]; /* extract data */ - int32_t xpos = (int32_t)(lower2 << 20) >> 20; + int32_t xpos = util::sext(lower2, 12); uint8_t depthlog = (lower2 >> 12) & 7; uint8_t pitch = (lower2 >> 15) & 7; uint32_t dwidth = (lower2 >> 18) & 0x3ff; diff --git a/src/mame/konami/3dom2_te.cpp b/src/mame/konami/3dom2_te.cpp index 863e6bfd279..06f0e780039 100644 --- a/src/mame/konami/3dom2_te.cpp +++ b/src/mame/konami/3dom2_te.cpp @@ -2538,12 +2538,8 @@ void m2_te_device::destination_blend(uint32_t x, uint32_t y, uint32_t w, const r if (!(m_gc.te_master_mode & TEMASTER_MODE_DZBUF) && (m_db.usergen_ctrl & DBUSERGENCTL_ZBUFEN)) { - int32_t x_offs = (m_db.z_offset & DBZOFFS_XOFFS_MASK) >> DBZOFFS_XOFFS_SHIFT; - int32_t y_offs = (m_db.z_offset & DBZOFFS_YOFFS_MASK) >> DBZOFFS_YOFFS_SHIFT; - - // Sign extend - x_offs = (x_offs << 20) >> 20; - y_offs = (x_offs << 20) >> 20; + int32_t x_offs = util::sext((m_db.z_offset & DBZOFFS_XOFFS_MASK) >> DBZOFFS_XOFFS_SHIFT, 12); + int32_t y_offs = util::sext((m_db.z_offset & DBZOFFS_YOFFS_MASK) >> DBZOFFS_YOFFS_SHIFT, 12); x_offs += m_dbstate.x; y_offs += m_dbstate.y; @@ -2736,12 +2732,8 @@ void m2_te_device::select_src_pixel() && (m_db.usergen_ctrl & DBUSERGENCTL_BLENDEN) && !(m_gc.te_master_mode & TEMASTER_MODE_DBLEND)) { - int32_t x_offs = (m_db.src_offset & DBSRCOFFS_XOFFS_MASK) >> DBSRCOFFS_YOFFS_SHIFT; - int32_t y_offs = (m_db.src_offset & DBSRCOFFS_YOFFS_MASK) >> DBSRCOFFS_YOFFS_SHIFT; - - // Sign extend - x_offs = (x_offs << 20) >> 20; - y_offs = (y_offs << 20) >> 20; + int32_t x_offs = util::sext((m_db.src_offset & DBSRCOFFS_XOFFS_MASK) >> DBSRCOFFS_XOFFS_SHIFT, 12); + int32_t y_offs = util::sext((m_db.src_offset & DBSRCOFFS_YOFFS_MASK) >> DBSRCOFFS_YOFFS_SHIFT, 12); x_offs += m_dbstate.x; y_offs += m_dbstate.y; diff --git a/src/mame/midway/midzeus_v.cpp b/src/mame/midway/midzeus_v.cpp index d9e488a4857..a066734e776 100644 --- a/src/mame/midway/midzeus_v.cpp +++ b/src/mame/midway/midzeus_v.cpp @@ -1107,9 +1107,9 @@ void midzeus_renderer::zeus_draw_quad(int long_fmt, const uint32_t *databuffer, #if 0 // TODO: Lighting uint32_t inormal = databuffer[10 + i]; - int32_t xn = (int32_t)(((inormal >> 0) & 0x3ff) << 22) >> 22; - int32_t yn = (int32_t)(((inormal >> 10) & 0x3ff) << 22) >> 22; - int32_t zn = (int32_t)(((inormal >> 20) & 0x3ff) << 22) >> 22; + int32_t xn = util::sext((inormal >> 0) & 0x3ff, 10); + int32_t yn = util::sext((inormal >> 10) & 0x3ff, 10); + int32_t zn = util::sext((inormal >> 20) & 0x3ff, 10); #endif } diff --git a/src/mame/misc/dcheese_v.cpp b/src/mame/misc/dcheese_v.cpp index bbcfe4825a2..7f3f08ddacc 100644 --- a/src/mame/misc/dcheese_v.cpp +++ b/src/mame/misc/dcheese_v.cpp @@ -146,10 +146,10 @@ void dcheese_state::do_blit() s32 const srcmaxy = m_blitter_yparam[1] << 12; s32 const srcx = ((m_blitter_xparam[2] & 0x0fff) | ((m_blitter_xparam[3] & 0x0fff) << 12)) << 7; s32 const srcy = ((m_blitter_yparam[2] & 0x0fff) | ((m_blitter_yparam[3] & 0x0fff) << 12)) << 7; - s32 const dxdx = s32(((m_blitter_xparam[4] & 0x0fff) | ((m_blitter_xparam[5] & 0x0fff) << 12)) << 12) >> 12; - s32 const dxdy = s32(((m_blitter_xparam[6] & 0x0fff) | ((m_blitter_xparam[7] & 0x0fff) << 12)) << 12) >> 12; - s32 const dydx = s32(((m_blitter_yparam[4] & 0x0fff) | ((m_blitter_yparam[5] & 0x0fff) << 12)) << 12) >> 12; - s32 const dydy = s32(((m_blitter_yparam[6] & 0x0fff) | ((m_blitter_yparam[7] & 0x0fff) << 12)) << 12) >> 12; + s32 const dxdx = util::sext((m_blitter_xparam[4] & 0x0fff) | ((m_blitter_xparam[5] & 0x0fff) << 12), 20); + s32 const dxdy = util::sext((m_blitter_xparam[6] & 0x0fff) | ((m_blitter_xparam[7] & 0x0fff) << 12), 20); + s32 const dydx = util::sext((m_blitter_yparam[4] & 0x0fff) | ((m_blitter_yparam[5] & 0x0fff) << 12), 20); + s32 const dydy = util::sext((m_blitter_yparam[6] & 0x0fff) | ((m_blitter_yparam[7] & 0x0fff) << 12), 20); u32 const pagemask = (m_gfxrom.length() - 1) >> 18; int const xstart = m_blitter_xparam[14]; int const xend = m_blitter_xparam[15] + 1; diff --git a/src/mame/sega/sega16sp.cpp b/src/mame/sega/sega16sp.cpp index 7be766369ec..6d2186559a7 100644 --- a/src/mame/sega/sega16sp.cpp +++ b/src/mame/sega/sega16sp.cpp @@ -338,7 +338,7 @@ void sega_sharrier_sprite_device::draw(bitmap_ind16 &bitmap, const rectangle &cl int bank = m_bank[(data[1] >> 12) & 0x7]; int xpos = data[1] & 0x1ff; int colpri = ((data[2] >> 8) & 0xff) << 4; - int pitch = int16_t(data[2] << 9) >> 9; + int pitch = util::sext(data[2], 7); uint16_t addr = data[3]; int hzoom = ((data[4] >> 8) & 0x3f) << 1; int vzoom = (data[4] >> 0) & 0x3f; diff --git a/src/mame/sega/segas32_v.cpp b/src/mame/sega/segas32_v.cpp index 643587aabec..1b7167ddfaa 100644 --- a/src/mame/sega/segas32_v.cpp +++ b/src/mame/sega/segas32_v.cpp @@ -744,8 +744,8 @@ void segas32_state::update_tilemap_zoom(screen_device &screen, segas32_state::la srcy += (m_videoram[0x1ff14/2 + 4 * bgnum] & 0xfe00) << 4; /* then account for the destination center coordinates */ - srcx_start -= ((int16_t)(m_videoram[0x1ff30/2 + 2 * bgnum] << 6) >> 6) * srcxstep; - srcy -= ((int16_t)(m_videoram[0x1ff32/2 + 2 * bgnum] << 7) >> 7) * srcystep; + srcx_start -= util::sext(m_videoram[0x1ff30/2 + 2 * bgnum], 10) * srcxstep; + srcy -= util::sext(m_videoram[0x1ff32/2 + 2 * bgnum], 9) * srcystep; /* finally, account for destination top,left coordinates */ srcx_start += cliprect.min_x * srcxstep; @@ -1469,8 +1469,8 @@ int segas32_state::draw_one_sprite(uint16_t const *data, int xoffs, int yoffs, c ((data[3] & 0x0800) >> 11) | ((data[3] & 0x4000) >> 13); int dsth = data[2] & 0x3ff; int dstw = data[3] & 0x3ff; - int ypos = (int16_t)(data[4] << 4) >> 4; - int xpos = (int16_t)(data[5] << 4) >> 4; + int ypos = util::sext(data[4], 12); + int xpos = util::sext(data[5], 12); uint32_t addr = data[6] | ((data[2] & 0xf000) << 4); int color = 0x8000 | (data[7] & (bpp8 ? 0x7f00 : 0x7ff0)); int hzoom, vzoom; @@ -1676,20 +1676,20 @@ void segas32_state::sprite_render_list() /* set the inclusive cliprect */ if (sprite[0] & 0x1000) { - clipin.min_y = (int16_t)(sprite[0] << 4) >> 4; - clipin.max_y = (int16_t)(sprite[1] << 4) >> 4; - clipin.min_x = (int16_t)(sprite[2] << 4) >> 4; - clipin.max_x = (int16_t)(sprite[3] << 4) >> 4; + clipin.min_y = util::sext(sprite[0], 12); + clipin.max_y = util::sext(sprite[1], 12); + clipin.min_x = util::sext(sprite[2], 12); + clipin.max_x = util::sext(sprite[3], 12); clipin &= outerclip; } /* set the exclusive cliprect */ if (sprite[0] & 0x2000) { - clipout.min_y = (int16_t)(sprite[4] << 4) >> 4; - clipout.max_y = (int16_t)(sprite[5] << 4) >> 4; - clipout.min_x = (int16_t)(sprite[6] << 4) >> 4; - clipout.max_x = (int16_t)(sprite[7] << 4) >> 4; + clipout.min_y = util::sext(sprite[4], 12); + clipout.max_y = util::sext(sprite[5], 12); + clipout.min_x = util::sext(sprite[6], 12); + clipout.max_x = util::sext(sprite[7], 12); } /* advance to the next entry */ @@ -1702,8 +1702,8 @@ void segas32_state::sprite_render_list() /* set the global offset */ if (sprite[0] & 0x2000) { - yoffs = (int16_t)(sprite[1] << 4) >> 4; - xoffs = (int16_t)(sprite[2] << 4) >> 4; + yoffs = util::sext(sprite[1], 12); + xoffs = util::sext(sprite[2], 12); } spritenum = sprite[0] & 0x1fff; break; @@ -1799,12 +1799,12 @@ void segas32_state::mix_all_layers(int which, int xoffs, bitmap_rgb32 &bitmap, c /* extract the RGB offsets */ int rgboffs[3][3]; - rgboffs[0][0] = (int8_t)(m_mixer_control[which][0x40/2] << 2) >> 2; - rgboffs[0][1] = (int8_t)(m_mixer_control[which][0x42/2] << 2) >> 2; - rgboffs[0][2] = (int8_t)(m_mixer_control[which][0x44/2] << 2) >> 2; - rgboffs[1][0] = (int8_t)(m_mixer_control[which][0x46/2] << 2) >> 2; - rgboffs[1][1] = (int8_t)(m_mixer_control[which][0x48/2] << 2) >> 2; - rgboffs[1][2] = (int8_t)(m_mixer_control[which][0x4a/2] << 2) >> 2; + rgboffs[0][0] = util::sext(m_mixer_control[which][0x40/2], 6); + rgboffs[0][1] = util::sext(m_mixer_control[which][0x42/2], 6); + rgboffs[0][2] = util::sext(m_mixer_control[which][0x44/2], 6); + rgboffs[1][0] = util::sext(m_mixer_control[which][0x46/2], 6); + rgboffs[1][1] = util::sext(m_mixer_control[which][0x48/2], 6); + rgboffs[1][2] = util::sext(m_mixer_control[which][0x4a/2], 6); rgboffs[2][0] = 0; rgboffs[2][1] = 0; rgboffs[2][2] = 0; diff --git a/src/mame/sgi/sgi_re2.cpp b/src/mame/sgi/sgi_re2.cpp index 3a831608884..6b973c5fc34 100644 --- a/src/mame/sgi/sgi_re2.cpp +++ b/src/mame/sgi/sgi_re2.cpp @@ -231,9 +231,9 @@ void sgi_re2_device::execute() m_pupdata = m_reg[REG_PUPDATA]; m_pat = (m_reg[REG_PATH] << 16) | m_reg[REG_PATL]; m_dz = (s64(u64(m_reg[REG_DZI]) << 40) >> 26) | m_reg[REG_DZF]; - m_dr = s32(m_reg[REG_DR] << 8) >> 8; - m_dg = s32(m_reg[REG_DG] << 12) >> 12; - m_db = s32(m_reg[REG_DB] << 12) >> 12; + m_dr = util::sext(m_reg[REG_DR], 24); + m_dg = util::sext(m_reg[REG_DG], 20); + m_db = util::sext(m_reg[REG_DB], 20); m_z = s64(u64(m_reg[REG_Z]) << 40) >> 26; m_r = m_reg[REG_R]; m_g = m_reg[REG_G]; |
