trunk/src/mame/video/jagblit.c
| r20899 | r20900 | |
| 38 | 38 | #define READ_RDATA_1(r,a,p) ((p) ? (((((UINT8 *)&m_blitter_regs[r])[BYTE4_XOR_BE(((UINT32)a##_x >> 19) & 7)]) >> PIXEL_SHIFT_1(a)) & 0x01) : (m_blitter_regs[r] & 0x01)) |
| 39 | 39 | #define READ_PIXEL_1(a) (((((UINT8 *)a##_base_mem)[PIXEL_OFFSET_1(a)]) >> PIXEL_SHIFT_1(a)) & 0x01) |
| 40 | 40 | #define READ_ZDATA_1(a) 0 /* huh? */ |
| 41 | | #define WRITE_PIXEL_1(a,d) do { UINT8 *pix = &((UINT8 *)a##_base_mem)[PIXEL_OFFSET_1(a)]; *pix = (*pix & ~(0x01 << PIXEL_SHIFT_1(a))) | ((d) << PIXEL_SHIFT_1(a)); } while (0) |
| 42 | | #define WRITE_ZDATA_1(a,d) /* huh? */ |
| 43 | 41 | |
| 44 | 42 | #define PIXEL_SHIFT_2(a) ((~a##_x >> 15) & 6) |
| 45 | 43 | #define PIXEL_OFFSET_2(a) BYTE4_XOR_BE(((UINT32)a##_y >> 16) * a##_width / 4 + (((UINT32)a##_x >> 18) & ~7) * (1 + a##_pitch) + (((UINT32)a##_x >> 18) & 7)) |
| r20899 | r20900 | |
| 47 | 45 | #define READ_RDATA_2(r,a,p) ((p) ? (((((UINT8 *)&m_blitter_regs[r])[BYTE4_XOR_BE(((UINT32)a##_x >> 18) & 7)]) >> PIXEL_SHIFT_2(a)) & 0x03) : (m_blitter_regs[r] & 0x03)) |
| 48 | 46 | #define READ_PIXEL_2(a) (((((UINT8 *)a##_base_mem)[PIXEL_OFFSET_2(a)]) >> PIXEL_SHIFT_2(a)) & 0x03) |
| 49 | 47 | #define READ_ZDATA_2(a) 0 /* huh? */ |
| 50 | | #define WRITE_PIXEL_2(a,d) do { UINT8 *pix = &((UINT8 *)a##_base_mem)[PIXEL_OFFSET_2(a)]; *pix = (*pix & ~(0x03 << PIXEL_SHIFT_2(a))) | ((d) << PIXEL_SHIFT_2(a)); } while (0) |
| 51 | | #define WRITE_ZDATA_2(a,d) /* huh? */ |
| 52 | 48 | |
| 53 | 49 | #define PIXEL_SHIFT_4(a) ((~a##_x >> 14) & 4) |
| 54 | 50 | #define PIXEL_OFFSET_4(a) BYTE4_XOR_BE(((UINT32)a##_y >> 16) * a##_width / 2 + (((UINT32)a##_x >> 17) & ~7) * (1 + a##_pitch) + (((UINT32)a##_x >> 17) & 7)) |
| r20899 | r20900 | |
| 56 | 52 | #define READ_RDATA_4(r,a,p) ((p) ? (((((UINT8 *)&m_blitter_regs[r])[BYTE4_XOR_BE(((UINT32)a##_x >> 17) & 7)]) >> PIXEL_SHIFT_4(a)) & 0x0f) : (m_blitter_regs[r] & 0x0f)) |
| 57 | 53 | #define READ_PIXEL_4(a) (((((UINT8 *)a##_base_mem)[PIXEL_OFFSET_4(a)]) >> PIXEL_SHIFT_4(a)) & 0x0f) |
| 58 | 54 | #define READ_ZDATA_4(a) 0 /* huh? */ |
| 59 | | #define WRITE_PIXEL_4(a,d) do { UINT8 *pix = &((UINT8 *)a##_base_mem)[PIXEL_OFFSET_4(a)]; *pix = (*pix & ~(0x0f << PIXEL_SHIFT_4(a))) | ((d) << PIXEL_SHIFT_4(a)); } while (0) |
| 60 | | #define WRITE_ZDATA_4(a,d) /* huh? */ |
| 61 | 55 | |
| 62 | 56 | #define PIXEL_OFFSET_8(a) BYTE4_XOR_BE(((UINT32)a##_y >> 16) * a##_width + (((UINT32)a##_x >> 16) & ~7) * (1 + a##_pitch) + (((UINT32)a##_x >> 16) & 7)) |
| 63 | 57 | #define ZDATA_OFFSET_8(a) (PIXEL_OFFSET_8(a) + a##_zoffs * 8) |
| 64 | 58 | #define READ_RDATA_8(r,a,p) ((p) ? (((UINT8 *)&m_blitter_regs[r])[BYTE4_XOR_BE(((UINT32)a##_x >> 16) & 7)]) : (m_blitter_regs[r] & 0xff)) |
| 65 | 59 | #define READ_PIXEL_8(a) (((UINT8 *)a##_base_mem)[PIXEL_OFFSET_8(a)]) |
| 66 | 60 | #define READ_ZDATA_8(a) (((UINT8 *)a##_base_mem)[ZDATA_OFFSET_8(a)]) |
| 67 | | #define WRITE_PIXEL_8(a,d) do { ((UINT8 *)a##_base_mem)[PIXEL_OFFSET_8(a)] = (d); } while (0) |
| 68 | | #define WRITE_ZDATA_8(a,d) do { ((UINT8 *)a##_base_mem)[ZDATA_OFFSET_8(a)] = (d); } while (0) |
| 69 | 61 | |
| 70 | 62 | #define PIXEL_OFFSET_16(a) BYTE_XOR_BE(((UINT32)a##_y >> 16) * a##_width + (((UINT32)a##_x >> 16) & ~3) * (1 + a##_pitch) + (((UINT32)a##_x >> 16) & 3)) |
| 71 | 63 | #define ZDATA_OFFSET_16(a) (PIXEL_OFFSET_16(a) + a##_zoffs * 4) |
| 72 | 64 | #define READ_RDATA_16(r,a,p) ((p) ? (((UINT16 *)&m_blitter_regs[r])[BYTE_XOR_BE(((UINT32)a##_x >> 16) & 3)]) : (m_blitter_regs[r] & 0xffff)) |
| 73 | 65 | #define READ_PIXEL_16(a) (((UINT16 *)a##_base_mem)[PIXEL_OFFSET_16(a)]) |
| 74 | 66 | #define READ_ZDATA_16(a) (((UINT16 *)a##_base_mem)[ZDATA_OFFSET_16(a)]) |
| 75 | | #define WRITE_PIXEL_16(a,d) do { ((UINT16 *)a##_base_mem)[PIXEL_OFFSET_16(a)] = (d); } while (0) |
| 76 | | #define WRITE_ZDATA_16(a,d) do { ((UINT16 *)a##_base_mem)[ZDATA_OFFSET_16(a)] = (d); } while (0) |
| 77 | 67 | |
| 78 | 68 | #define PIXEL_OFFSET_32(a) (((UINT32)a##_y >> 16) * a##_width + (((UINT32)a##_x >> 16) & ~1) * (1 + a##_pitch) + (((UINT32)a##_x >> 16) & 1)) |
| 79 | 69 | #define ZDATA_OFFSET_32(a) (PIXEL_OFFSET_32(a) + a##_zoffs * 2) |
| 80 | 70 | #define READ_RDATA_32(r,a,p) ((p) ? (m_blitter_regs[r + (((UINT32)a##_x >> 16) & 1)]) : m_blitter_regs[r]) |
| 81 | 71 | #define READ_PIXEL_32(a) (((UINT32 *)a##_base_mem)[PIXEL_OFFSET_32(a)]) |
| 82 | 72 | #define READ_ZDATA_32(a) (((UINT32 *)a##_base_mem)[ZDATA_OFFSET_32(a)]) |
| 83 | | #define WRITE_PIXEL_32(a,d) do { ((UINT32 *)a##_base_mem)[PIXEL_OFFSET_32(a)] = (d); } while (0) |
| 84 | | #define WRITE_ZDATA_32(a,d) do { ((UINT32 *)a##_base_mem)[ZDATA_OFFSET_32(a)] = (d); } while (0) |
| 85 | 73 | |
| 86 | 74 | #define READ_RDATA(r,a,f,p) \ |
| 87 | 75 | ((((f) & 0x38) == (0 << 3)) ? (READ_RDATA_1(r,a,p)) : \ |
| r20899 | r20900 | |
| 107 | 95 | (((f) & 0x38) == (4 << 3)) ? (READ_ZDATA_16(a)) : \ |
| 108 | 96 | (((f) & 0x38) == (5 << 3)) ? (READ_ZDATA_32(a)) : 0) |
| 109 | 97 | |
| 110 | | #define WRITE_PIXEL(a,f,d) \ |
| 98 | #define PIXEL_SHIFT_WRITE_1 ((~adest_x >> 16) & 7) |
| 99 | #define PIXEL_SHIFT_WRITE_2 ((~adest_x >> 15) & 6) |
| 100 | #define PIXEL_SHIFT_WRITE_4 ((~adest_x >> 14) & 4) |
| 101 | |
| 102 | #define PIXEL_OFFSET_WRITE_1 (((UINT32)adest_y >> 16) * adest_width / 8 + (((UINT32)adest_x >> 19) & ~7) * (1 + adest_pitch) + (((UINT32)adest_x >> 19) & 7)) |
| 103 | #define PIXEL_OFFSET_WRITE_2 (((UINT32)adest_y >> 16) * adest_width / 4 + (((UINT32)adest_x >> 18) & ~7) * (1 + adest_pitch) + (((UINT32)adest_x >> 18) & 7)) |
| 104 | #define PIXEL_OFFSET_WRITE_4 (((UINT32)adest_y >> 16) * adest_width / 2 + (((UINT32)adest_x >> 17) & ~7) * (1 + adest_pitch) + (((UINT32)adest_x >> 17) & 7)) |
| 105 | #define PIXEL_OFFSET_WRITE_8 (((UINT32)adest_y >> 16) * adest_width + (((UINT32)adest_x >> 16) & ~7) * (1 + adest_pitch) + (((UINT32)adest_x >> 16) & 7)) |
| 106 | #define PIXEL_OFFSET_WRITE_16 (((UINT32)adest_y >> 16) * adest_width + (((UINT32)adest_x >> 16) & ~3) * (1 + adest_pitch) + (((UINT32)adest_x >> 16) & 3)) |
| 107 | #define PIXEL_OFFSET_WRITE_32 (((UINT32)adest_y >> 16) * adest_width + (((UINT32)adest_x >> 16) & ~1) * (1 + adest_pitch) + (((UINT32)adest_x >> 16) & 1)) |
| 108 | |
| 109 | #define ZDATA_OFFSET_WRITE_1 0 /* huh? */ |
| 110 | #define ZDATA_OFFSET_WRITE_2 0 /* huh? */ |
| 111 | #define ZDATA_OFFSET_WRITE_4 0 /* huh? */ |
| 112 | #define ZDATA_OFFSET_WRITE_8 (PIXEL_OFFSET_WRITE_8 + adest_zoffs * 8) |
| 113 | #define ZDATA_OFFSET_WRITE_16 (PIXEL_OFFSET_WRITE_16 + adest_zoffs * 4) |
| 114 | #define ZDATA_OFFSET_WRITE_32 (PIXEL_OFFSET_WRITE_32 + adest_zoffs * 2) |
| 115 | |
| 116 | |
| 117 | #define WRITE_PIXEL_1(d) do { int writeoffs = PIXEL_OFFSET_WRITE_1; int shift = PIXEL_SHIFT_WRITE_1; UINT8 pix = m_gpu->space(AS_PROGRAM).read_byte(adest_base + (writeoffs)); pix = (pix & ~(0x01 << shift)) | ((d) << shift); m_gpu->space(AS_PROGRAM).write_byte(adest_base + (writeoffs), pix); } while (0) |
| 118 | #define WRITE_ZDATA_1(d) /* huh? */ |
| 119 | #define WRITE_PIXEL_2(d) do { int writeoffs = PIXEL_OFFSET_WRITE_2; int shift = PIXEL_SHIFT_WRITE_2; UINT8 pix = m_gpu->space(AS_PROGRAM).read_byte(adest_base + (writeoffs)); pix = (pix & ~(0x03 << shift)) | ((d) << shift); m_gpu->space(AS_PROGRAM).write_byte(adest_base + (writeoffs), pix); } while (0) |
| 120 | #define WRITE_ZDATA_2(d) /* huh? */ |
| 121 | #define WRITE_PIXEL_4(d) do { int writeoffs = PIXEL_OFFSET_WRITE_4; int shift = PIXEL_SHIFT_WRITE_4; UINT8 pix = m_gpu->space(AS_PROGRAM).read_byte(adest_base + (writeoffs)); pix = (pix & ~(0x0f << shift)) | ((d) << shift); m_gpu->space(AS_PROGRAM).write_byte(adest_base + (writeoffs), pix); } while (0) |
| 122 | #define WRITE_ZDATA_4(d) /* huh? */ |
| 123 | #define WRITE_PIXEL_8(d) do { int writeoffs = PIXEL_OFFSET_WRITE_8; m_gpu->space(AS_PROGRAM).write_byte(adest_base + (writeoffs), (d)); } while (0) |
| 124 | #define WRITE_ZDATA_8(d) do { int writeoffs = ZDATA_OFFSET_WRITE_8; m_gpu->space(AS_PROGRAM).write_byte(adest_base + (writeoffs), (d)); } while (0) |
| 125 | #define WRITE_PIXEL_16(d) do { int writeoffs = PIXEL_OFFSET_WRITE_16; m_gpu->space(AS_PROGRAM).write_word(adest_base + (writeoffs<<1), (d)); } while (0) |
| 126 | #define WRITE_ZDATA_16(d) do { int writeoffs = ZDATA_OFFSET_WRITE_16; m_gpu->space(AS_PROGRAM).write_word(adest_base + (writeoffs<<1), (d)); } while (0) |
| 127 | #define WRITE_PIXEL_32(d) do { int writeoffs = PIXEL_OFFSET_WRITE_32; m_gpu->space(AS_PROGRAM).write_dword(adest_base + (writeoffs<<2), (d)); } while (0) |
| 128 | #define WRITE_ZDATA_32(d) do { int writeoffs = ZDATA_OFFSET_WRITE_32; m_gpu->space(AS_PROGRAM).write_dword(adest_base + (writeoffs<<2), (d)); } while (0) |
| 129 | |
| 130 | |
| 131 | |
| 132 | #define WRITE_PIXEL(f,d) \ |
| 111 | 133 | do \ |
| 112 | 134 | { \ |
| 113 | | if (((f) & 0x38) == (0 << 3)) WRITE_PIXEL_1(a,d); \ |
| 114 | | else if (((f) & 0x38) == (1 << 3)) WRITE_PIXEL_2(a,d); \ |
| 115 | | else if (((f) & 0x38) == (2 << 3)) WRITE_PIXEL_4(a,d); \ |
| 116 | | else if (((f) & 0x38) == (3 << 3)) WRITE_PIXEL_8(a,d); \ |
| 117 | | else if (((f) & 0x38) == (4 << 3)) WRITE_PIXEL_16(a,d); \ |
| 118 | | else if (((f) & 0x38) == (5 << 3)) WRITE_PIXEL_32(a,d); \ |
| 135 | if (((f) & 0x38) == (0 << 3)) WRITE_PIXEL_1(d); \ |
| 136 | else if (((f) & 0x38) == (1 << 3)) WRITE_PIXEL_2(d); \ |
| 137 | else if (((f) & 0x38) == (2 << 3)) WRITE_PIXEL_4(d); \ |
| 138 | else if (((f) & 0x38) == (3 << 3)) WRITE_PIXEL_8(d); \ |
| 139 | else if (((f) & 0x38) == (4 << 3)) WRITE_PIXEL_16(d); \ |
| 140 | else if (((f) & 0x38) == (5 << 3)) WRITE_PIXEL_32(d); \ |
| 119 | 141 | } while (0) |
| 120 | 142 | |
| 121 | | #define WRITE_ZDATA(a,f,d) \ |
| 143 | #define WRITE_ZDATA(f,d) \ |
| 122 | 144 | do \ |
| 123 | 145 | { \ |
| 124 | | if (((f) & 0x38) == (0 << 3)) WRITE_ZDATA_1(a,d); \ |
| 125 | | else if (((f) & 0x38) == (1 << 3)) WRITE_ZDATA_2(a,d); \ |
| 126 | | else if (((f) & 0x38) == (2 << 3)) WRITE_ZDATA_4(a,d); \ |
| 127 | | else if (((f) & 0x38) == (3 << 3)) WRITE_ZDATA_8(a,d); \ |
| 128 | | else if (((f) & 0x38) == (4 << 3)) WRITE_ZDATA_16(a,d); \ |
| 129 | | else if (((f) & 0x38) == (5 << 3)) WRITE_ZDATA_32(a,d); \ |
| 146 | if (((f) & 0x38) == (0 << 3)) WRITE_ZDATA_1(d); \ |
| 147 | else if (((f) & 0x38) == (1 << 3)) WRITE_ZDATA_2(d); \ |
| 148 | else if (((f) & 0x38) == (2 << 3)) WRITE_ZDATA_4(d); \ |
| 149 | else if (((f) & 0x38) == (3 << 3)) WRITE_ZDATA_8(d); \ |
| 150 | else if (((f) & 0x38) == (4 << 3)) WRITE_ZDATA_16(d); \ |
| 151 | else if (((f) & 0x38) == (5 << 3)) WRITE_ZDATA_32(d); \ |
| 130 | 152 | } while (0) |
| 131 | 153 | #endif |
| 132 | 154 | |
| r20899 | r20900 | |
| 169 | 191 | void *a2_base_mem = memory_base(a2_base); |
| 170 | 192 | |
| 171 | 193 | void *asrc_base_mem = (COMMAND & 0x00000800) ? a1_base_mem : a2_base_mem; |
| 194 | void *adest_base_mem = (COMMAND & 0x00000800) ? a2_base_mem : a1_base_mem; |
| 172 | 195 | UINT32 asrcflags = (COMMAND & 0x00000800) ? A1FIXED : A2FIXED; |
| 173 | 196 | INT32 asrc_x = (COMMAND & 0x00000800) ? a1_x : a2_x; |
| 174 | 197 | INT32 asrc_y = (COMMAND & 0x00000800) ? a1_y : a2_y; |
| r20899 | r20900 | |
| 179 | 202 | INT32 asrc_xadd, asrc_xstep, asrc_yadd, asrc_ystep; |
| 180 | 203 | UINT32 asrc_xmask, asrc_ymask; |
| 181 | 204 | |
| 182 | | void *adest_base_mem = (COMMAND & 0x00000800) ? a2_base_mem : a1_base_mem; |
| 205 | UINT32 adest_base = (COMMAND & 0x00000800) ? a2_base : a1_base; |
| 183 | 206 | UINT32 adestflags = (COMMAND & 0x00000800) ? A2FIXED : A1FIXED; |
| 184 | 207 | INT32 adest_x = (COMMAND & 0x00000800) ? a2_x : a1_x; |
| 185 | 208 | INT32 adest_y = (COMMAND & 0x00000800) ? a2_y : a1_y; |
| r20899 | r20900 | |
| 431 | 454 | if (adest_phrase_mode || (command & 0x10000000) || !inhibit) |
| 432 | 455 | { |
| 433 | 456 | /* write to the destination */ |
| 434 | | WRITE_PIXEL(adest, adestflags, writedata); |
| 457 | WRITE_PIXEL(adestflags, writedata); |
| 435 | 458 | if (COMMAND & 0x00000020) |
| 436 | | WRITE_ZDATA(adest, adestflags, srczdata); |
| 459 | WRITE_ZDATA(adestflags, srczdata); |
| 437 | 460 | } |
| 438 | 461 | |
| 439 | 462 | /* update X/Y */ |