mirror of
https://github.com/holub/mame
synced 2025-04-21 07:52:35 +03:00
jaguar: Eliminate unsafe raw memory pointer usage from blitter (stops tempst2k from crashing)
This commit is contained in:
parent
a4b59223f7
commit
2a43e5f84b
@ -35,43 +35,43 @@
|
||||
|
||||
#ifndef PIXEL_SHIFT_1
|
||||
#define PIXEL_SHIFT_1(a) ((~a##_x >> 16) & 7)
|
||||
#define PIXEL_OFFSET_1(a) BYTE4_XOR_BE(((uint32_t)a##_y >> 16) * a##_width / 8 + (((uint32_t)a##_x >> 19) & ~7) * (1 + a##_pitch) + (((uint32_t)a##_x >> 19) & 7))
|
||||
#define PIXEL_OFFSET_1(a) (((uint32_t)a##_y >> 16) * a##_width / 8 + (((uint32_t)a##_x >> 19) & ~7) * (1 + a##_pitch) + (((uint32_t)a##_x >> 19) & 7))
|
||||
#define ZDATA_OFFSET_1(a) 0 /* huh? */
|
||||
#define READ_RDATA_1(r,a,p) ((p) ? (((((uint8_t *)&m_blitter_regs[r])[BYTE4_XOR_BE(((uint32_t)a##_x >> 19) & 7)]) >> PIXEL_SHIFT_1(a)) & 0x01) : (m_blitter_regs[r] & 0x01))
|
||||
#define READ_PIXEL_1(a) (((((uint8_t *)a##_base_mem)[PIXEL_OFFSET_1(a)]) >> PIXEL_SHIFT_1(a)) & 0x01)
|
||||
#define READ_PIXEL_1(a) ((m_gpu->space(AS_PROGRAM).read_byte(a##_base + PIXEL_OFFSET_1(a)) >> PIXEL_SHIFT_1(a)) & 0x01)
|
||||
#define READ_ZDATA_1(a) 0 /* huh? */
|
||||
|
||||
#define PIXEL_SHIFT_2(a) ((~a##_x >> 15) & 6)
|
||||
#define PIXEL_OFFSET_2(a) BYTE4_XOR_BE(((uint32_t)a##_y >> 16) * a##_width / 4 + (((uint32_t)a##_x >> 18) & ~7) * (1 + a##_pitch) + (((uint32_t)a##_x >> 18) & 7))
|
||||
#define PIXEL_OFFSET_2(a) (((uint32_t)a##_y >> 16) * a##_width / 4 + (((uint32_t)a##_x >> 18) & ~7) * (1 + a##_pitch) + (((uint32_t)a##_x >> 18) & 7))
|
||||
#define ZDATA_OFFSET_2(a) 0 /* huh? */
|
||||
#define READ_RDATA_2(r,a,p) ((p) ? (((((uint8_t *)&m_blitter_regs[r])[BYTE4_XOR_BE(((uint32_t)a##_x >> 18) & 7)]) >> PIXEL_SHIFT_2(a)) & 0x03) : (m_blitter_regs[r] & 0x03))
|
||||
#define READ_PIXEL_2(a) (((((uint8_t *)a##_base_mem)[PIXEL_OFFSET_2(a)]) >> PIXEL_SHIFT_2(a)) & 0x03)
|
||||
#define READ_PIXEL_2(a) ((m_gpu->space(AS_PROGRAM).read_byte(a##_base + PIXEL_OFFSET_2(a)) >> PIXEL_SHIFT_2(a)) & 0x03)
|
||||
#define READ_ZDATA_2(a) 0 /* huh? */
|
||||
|
||||
#define PIXEL_SHIFT_4(a) ((~a##_x >> 14) & 4)
|
||||
#define PIXEL_OFFSET_4(a) BYTE4_XOR_BE(((uint32_t)a##_y >> 16) * a##_width / 2 + (((uint32_t)a##_x >> 17) & ~7) * (1 + a##_pitch) + (((uint32_t)a##_x >> 17) & 7))
|
||||
#define PIXEL_OFFSET_4(a) (((uint32_t)a##_y >> 16) * a##_width / 2 + (((uint32_t)a##_x >> 17) & ~7) * (1 + a##_pitch) + (((uint32_t)a##_x >> 17) & 7))
|
||||
#define ZDATA_OFFSET_4(a) 0 /* huh? */
|
||||
#define READ_RDATA_4(r,a,p) ((p) ? (((((uint8_t *)&m_blitter_regs[r])[BYTE4_XOR_BE(((uint32_t)a##_x >> 17) & 7)]) >> PIXEL_SHIFT_4(a)) & 0x0f) : (m_blitter_regs[r] & 0x0f))
|
||||
#define READ_PIXEL_4(a) (((((uint8_t *)a##_base_mem)[PIXEL_OFFSET_4(a)]) >> PIXEL_SHIFT_4(a)) & 0x0f)
|
||||
#define READ_PIXEL_4(a) ((m_gpu->space(AS_PROGRAM).read_byte(a##_base + PIXEL_OFFSET_4(a)) >> PIXEL_SHIFT_4(a)) & 0x0f)
|
||||
#define READ_ZDATA_4(a) 0 /* huh? */
|
||||
|
||||
#define PIXEL_OFFSET_8(a) BYTE4_XOR_BE(((uint32_t)a##_y >> 16) * a##_width + (((uint32_t)a##_x >> 16) & ~7) * (1 + a##_pitch) + (((uint32_t)a##_x >> 16) & 7))
|
||||
#define PIXEL_OFFSET_8(a) (((uint32_t)a##_y >> 16) * a##_width + (((uint32_t)a##_x >> 16) & ~7) * (1 + a##_pitch) + (((uint32_t)a##_x >> 16) & 7))
|
||||
#define ZDATA_OFFSET_8(a) (PIXEL_OFFSET_8(a) + a##_zoffs * 8)
|
||||
#define READ_RDATA_8(r,a,p) ((p) ? (((uint8_t *)&m_blitter_regs[r])[BYTE4_XOR_BE(((uint32_t)a##_x >> 16) & 7)]) : (m_blitter_regs[r] & 0xff))
|
||||
#define READ_PIXEL_8(a) (((uint8_t *)a##_base_mem)[PIXEL_OFFSET_8(a)])
|
||||
#define READ_ZDATA_8(a) (((uint8_t *)a##_base_mem)[ZDATA_OFFSET_8(a)])
|
||||
#define READ_PIXEL_8(a) (m_gpu->space(AS_PROGRAM).read_byte(a##_base + PIXEL_OFFSET_8(a)))
|
||||
#define READ_ZDATA_8(a) (m_gpu->space(AS_PROGRAM).read_byte(a##_base + ZDATA_OFFSET_8(a)))
|
||||
|
||||
#define PIXEL_OFFSET_16(a) BYTE_XOR_BE(((uint32_t)a##_y >> 16) * a##_width + (((uint32_t)a##_x >> 16) & ~3) * (1 + a##_pitch) + (((uint32_t)a##_x >> 16) & 3))
|
||||
#define PIXEL_OFFSET_16(a) (((uint32_t)a##_y >> 16) * a##_width + (((uint32_t)a##_x >> 16) & ~3) * (1 + a##_pitch) + (((uint32_t)a##_x >> 16) & 3))
|
||||
#define ZDATA_OFFSET_16(a) (PIXEL_OFFSET_16(a) + a##_zoffs * 4)
|
||||
#define READ_RDATA_16(r,a,p) ((p) ? (((uint16_t *)&m_blitter_regs[r])[BYTE_XOR_BE(((uint32_t)a##_x >> 16) & 3)]) : (m_blitter_regs[r] & 0xffff))
|
||||
#define READ_PIXEL_16(a) (((uint16_t *)a##_base_mem)[PIXEL_OFFSET_16(a)])
|
||||
#define READ_ZDATA_16(a) (((uint16_t *)a##_base_mem)[ZDATA_OFFSET_16(a)])
|
||||
#define READ_PIXEL_16(a) (m_gpu->space(AS_PROGRAM).read_word(a##_base + (PIXEL_OFFSET_16(a)<<1)))
|
||||
#define READ_ZDATA_16(a) (m_gpu->space(AS_PROGRAM).read_word(a##_base + (ZDATA_OFFSET_16(a)<<1)))
|
||||
|
||||
#define PIXEL_OFFSET_32(a) (((uint32_t)a##_y >> 16) * a##_width + (((uint32_t)a##_x >> 16) & ~1) * (1 + a##_pitch) + (((uint32_t)a##_x >> 16) & 1))
|
||||
#define ZDATA_OFFSET_32(a) (PIXEL_OFFSET_32(a) + a##_zoffs * 2)
|
||||
#define READ_RDATA_32(r,a,p) ((p) ? (m_blitter_regs[r + (((uint32_t)a##_x >> 16) & 1)]) : m_blitter_regs[r])
|
||||
#define READ_PIXEL_32(a) (((uint32_t *)a##_base_mem)[PIXEL_OFFSET_32(a)])
|
||||
#define READ_ZDATA_32(a) (((uint32_t *)a##_base_mem)[ZDATA_OFFSET_32(a)])
|
||||
#define READ_PIXEL_32(a) (m_gpu->space(AS_PROGRAM).read_dword(a##_base + (PIXEL_OFFSET_32(a)<<2)))
|
||||
#define READ_ZDATA_32(a) (m_gpu->space(AS_PROGRAM).read_dword(a##_base + (ZDATA_OFFSET_32(a)<<2)))
|
||||
|
||||
#define READ_RDATA(r,a,f,p) \
|
||||
((((f) & 0x38) == (0 << 3)) ? (READ_RDATA_1(r,a,p)) : \
|
||||
@ -189,11 +189,7 @@ void jaguar_state::FUNCNAME(uint32_t command, uint32_t a1flags, uint32_t a2flags
|
||||
uint8_t a1_phrase_mode = 0;
|
||||
uint8_t a2_phrase_mode = 0;
|
||||
|
||||
void *a1_base_mem = memory_base(a1_base);
|
||||
void *a2_base_mem = memory_base(a2_base);
|
||||
|
||||
void *asrc_base_mem = (COMMAND & 0x00000800) ? a1_base_mem : a2_base_mem;
|
||||
void *adest_base_mem = (COMMAND & 0x00000800) ? a2_base_mem : a1_base_mem;
|
||||
uint32_t asrc_base = (COMMAND & 0x00000800) ? a1_base : a2_base;
|
||||
uint32_t asrcflags = (COMMAND & 0x00000800) ? A1FIXED : A2FIXED;
|
||||
int32_t asrc_x = (COMMAND & 0x00000800) ? a1_x : a2_x;
|
||||
int32_t asrc_y = (COMMAND & 0x00000800) ? a1_y : a2_y;
|
||||
@ -215,18 +211,6 @@ void jaguar_state::FUNCNAME(uint32_t command, uint32_t a1flags, uint32_t a2flags
|
||||
int32_t adest_xadd, adest_xstep, adest_yadd, adest_ystep;
|
||||
uint32_t adest_xmask, adest_ymask;
|
||||
|
||||
/* don't blit if pointer bad */
|
||||
if (!a1_base_mem || !a2_base_mem)
|
||||
{
|
||||
if (LOG_BAD_BLITS)
|
||||
{
|
||||
logerror("%s:Blit!\n", machine().describe_context());
|
||||
logerror(" a1_base = %08X\n", a1_base);
|
||||
logerror(" a2_base = %08X\n", a2_base);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* determine actual xadd/yadd for A1 */
|
||||
a1_yadd <<= 16;
|
||||
if (A1FIXED & 0x00100000)
|
||||
|
Loading…
Reference in New Issue
Block a user