summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2022-11-01 15:03:04 -0400
committer AJR <ajrhacker@users.noreply.github.com>2022-11-01 15:06:47 -0400
commit4df2f9d2f904073cd31d4d5db65cdb0d23270aac (patch)
treeb5daa04126fe177061506e467cd312873509b748 /src
parent7d9ccfa4261a4a836890b9aac9fa81109fd68598 (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
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/gio64/newport.cpp16
-rw-r--r--src/devices/cpu/adsp2100/2100ops.hxx6
-rw-r--r--src/devices/cpu/alpha/common.h4
-rw-r--r--src/devices/cpu/asap/asap.cpp36
-rw-r--r--src/devices/cpu/asap/asapdasm.cpp6
-rw-r--r--src/devices/cpu/avr8/avr8ops.hxx4
-rw-r--r--src/devices/cpu/ccpu/ccpu.cpp26
-rw-r--r--src/devices/cpu/dsp32/dsp32ops.hxx6
-rw-r--r--src/devices/cpu/i960/i960dis.cpp4
-rw-r--r--src/devices/cpu/m68000/m68kdasm.cpp2
-rw-r--r--src/devices/cpu/m68000/m68kdasm.h1
-rw-r--r--src/devices/cpu/ns32000/ns32000.cpp8
-rw-r--r--src/devices/cpu/ns32000/ns32000dasm.cpp8
-rw-r--r--src/devices/cpu/psx/gte.h2
-rw-r--r--src/devices/cpu/psx/mdec.cpp2
-rw-r--r--src/devices/cpu/rsp/rsp.cpp6
-rw-r--r--src/devices/cpu/sh/sh.cpp28
-rw-r--r--src/devices/cpu/sh/sh_dasm.cpp14
-rw-r--r--src/devices/cpu/sh/sh_fe.cpp6
-rw-r--r--src/devices/cpu/sparc/sparcdefs.h14
-rw-r--r--src/devices/cpu/tms32031/32031ops.hxx46
-rw-r--r--src/devices/cpu/tms34010/34010fld.hxx58
-rw-r--r--src/devices/machine/wtl3132.cpp4
-rw-r--r--src/devices/sound/es5506.cpp12
-rw-r--r--src/devices/video/psx.cpp146
-rw-r--r--src/devices/video/snes_ppu.cpp8
-rw-r--r--src/devices/video/voodoo_regs.h26
-rw-r--r--src/devices/video/zeus2.cpp3
-rw-r--r--src/lib/util/coretmpl.h8
-rw-r--r--src/mame/atari/jagobj.ipp8
-rw-r--r--src/mame/konami/3dom2_te.cpp16
-rw-r--r--src/mame/midway/midzeus_v.cpp6
-rw-r--r--src/mame/misc/dcheese_v.cpp8
-rw-r--r--src/mame/sega/sega16sp.cpp2
-rw-r--r--src/mame/sega/segas32_v.cpp40
-rw-r--r--src/mame/sgi/sgi_re2.cpp6
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];