More ROP codes
This commit is contained in:
@@ -133,6 +133,7 @@ typedef struct chips_69000_t {
|
|||||||
|
|
||||||
/* Byte counter for BitBLT port writes. */
|
/* Byte counter for BitBLT port writes. */
|
||||||
uint8_t bytes_written;
|
uint8_t bytes_written;
|
||||||
|
uint32_t bytes_counter;
|
||||||
uint8_t bytes_port[4];
|
uint8_t bytes_port[4];
|
||||||
} bitblt_running;
|
} bitblt_running;
|
||||||
|
|
||||||
@@ -418,6 +419,18 @@ chips_69000_do_rop_8bpp_patterned(uint8_t *dst, uint8_t src, uint8_t nonpattern_
|
|||||||
case 0x0F:
|
case 0x0F:
|
||||||
*dst = ~src;
|
*dst = ~src;
|
||||||
break;
|
break;
|
||||||
|
case 0x1A:
|
||||||
|
*dst = src ^ (*dst | (src & nonpattern_src));
|
||||||
|
break;
|
||||||
|
case 0x2A:
|
||||||
|
*dst = *dst & (~(nonpattern_src & src));
|
||||||
|
break;
|
||||||
|
case 0x3A:
|
||||||
|
*dst = nonpattern_src ^ (src | (*dst ^ nonpattern_src));
|
||||||
|
break;
|
||||||
|
case 0x4A:
|
||||||
|
*dst = *dst ^ (src & (nonpattern_src | *dst));
|
||||||
|
break;
|
||||||
case 0x50:
|
case 0x50:
|
||||||
*dst = src & ~(*dst);
|
*dst = src & ~(*dst);
|
||||||
break;
|
break;
|
||||||
@@ -430,6 +443,18 @@ chips_69000_do_rop_8bpp_patterned(uint8_t *dst, uint8_t src, uint8_t nonpattern_
|
|||||||
case 0x5F:
|
case 0x5F:
|
||||||
*dst = ~src | ~(*dst);
|
*dst = ~src | ~(*dst);
|
||||||
break;
|
break;
|
||||||
|
case 0x6A:
|
||||||
|
*dst = *dst ^ (src & nonpattern_src);
|
||||||
|
break;
|
||||||
|
case 0x7A:
|
||||||
|
*dst = *dst ^ (src & (nonpattern_src | (~*dst)));
|
||||||
|
break;
|
||||||
|
case 0x8A:
|
||||||
|
*dst = *dst & (nonpattern_src | (~src));
|
||||||
|
break;
|
||||||
|
case 0x9A:
|
||||||
|
*dst = *dst ^ (src & (~nonpattern_src));
|
||||||
|
break;
|
||||||
case 0xB8:
|
case 0xB8:
|
||||||
*dst = (((src ^ *dst) & nonpattern_src) ^ src);
|
*dst = (((src ^ *dst) & nonpattern_src) ^ src);
|
||||||
break;
|
break;
|
||||||
@@ -444,6 +469,18 @@ chips_69000_do_rop_8bpp_patterned(uint8_t *dst, uint8_t src, uint8_t nonpattern_
|
|||||||
case 0xAF:
|
case 0xAF:
|
||||||
*dst |= ~src;
|
*dst |= ~src;
|
||||||
break;
|
break;
|
||||||
|
case 0xBA:
|
||||||
|
*dst |= (src & ~nonpattern_src);
|
||||||
|
break;
|
||||||
|
case 0xCA:
|
||||||
|
*dst ^= (src & (nonpattern_src ^ *dst));
|
||||||
|
break;
|
||||||
|
case 0xDA:
|
||||||
|
*dst ^= src & (~(nonpattern_src & *dst));
|
||||||
|
break;
|
||||||
|
case 0xEA:
|
||||||
|
*dst |= src & nonpattern_src;
|
||||||
|
break;
|
||||||
case 0xF0:
|
case 0xF0:
|
||||||
*dst = src;
|
*dst = src;
|
||||||
break;
|
break;
|
||||||
@@ -479,6 +516,18 @@ chips_69000_do_rop_16bpp_patterned(uint16_t *dst, uint16_t src, uint16_t nonpatt
|
|||||||
case 0x0F:
|
case 0x0F:
|
||||||
*dst = ~src;
|
*dst = ~src;
|
||||||
break;
|
break;
|
||||||
|
case 0x1A:
|
||||||
|
*dst = src ^ (*dst | (src & nonpattern_src));
|
||||||
|
break;
|
||||||
|
case 0x2A:
|
||||||
|
*dst = *dst & (~(nonpattern_src & src));
|
||||||
|
break;
|
||||||
|
case 0x3A:
|
||||||
|
*dst = nonpattern_src ^ (src | (*dst ^ nonpattern_src));
|
||||||
|
break;
|
||||||
|
case 0x4A:
|
||||||
|
*dst = *dst ^ (src & (nonpattern_src | *dst));
|
||||||
|
break;
|
||||||
case 0x50:
|
case 0x50:
|
||||||
*dst = src & ~(*dst);
|
*dst = src & ~(*dst);
|
||||||
break;
|
break;
|
||||||
@@ -491,6 +540,18 @@ chips_69000_do_rop_16bpp_patterned(uint16_t *dst, uint16_t src, uint16_t nonpatt
|
|||||||
case 0x5F:
|
case 0x5F:
|
||||||
*dst = ~src | ~(*dst);
|
*dst = ~src | ~(*dst);
|
||||||
break;
|
break;
|
||||||
|
case 0x6A:
|
||||||
|
*dst = *dst ^ (src & nonpattern_src);
|
||||||
|
break;
|
||||||
|
case 0x7A:
|
||||||
|
*dst = *dst ^ (src & (nonpattern_src | (~*dst)));
|
||||||
|
break;
|
||||||
|
case 0x8A:
|
||||||
|
*dst = *dst & (nonpattern_src | (~src));
|
||||||
|
break;
|
||||||
|
case 0x9A:
|
||||||
|
*dst = *dst ^ (src & (~nonpattern_src));
|
||||||
|
break;
|
||||||
case 0xB8:
|
case 0xB8:
|
||||||
*dst = (((src ^ *dst) & nonpattern_src) ^ src);
|
*dst = (((src ^ *dst) & nonpattern_src) ^ src);
|
||||||
break;
|
break;
|
||||||
@@ -505,6 +566,18 @@ chips_69000_do_rop_16bpp_patterned(uint16_t *dst, uint16_t src, uint16_t nonpatt
|
|||||||
case 0xAF:
|
case 0xAF:
|
||||||
*dst |= ~src;
|
*dst |= ~src;
|
||||||
break;
|
break;
|
||||||
|
case 0xBA:
|
||||||
|
*dst |= (src & ~nonpattern_src);
|
||||||
|
break;
|
||||||
|
case 0xCA:
|
||||||
|
*dst ^= (src & (nonpattern_src ^ *dst));
|
||||||
|
break;
|
||||||
|
case 0xDA:
|
||||||
|
*dst ^= src & (~(nonpattern_src & *dst));
|
||||||
|
break;
|
||||||
|
case 0xEA:
|
||||||
|
*dst |= src & nonpattern_src;
|
||||||
|
break;
|
||||||
case 0xF0:
|
case 0xF0:
|
||||||
*dst = src;
|
*dst = src;
|
||||||
break;
|
break;
|
||||||
@@ -542,6 +615,18 @@ chips_69000_do_rop_24bpp_patterned(uint32_t *dst, uint32_t src, uint32_t nonpatt
|
|||||||
case 0x0F:
|
case 0x0F:
|
||||||
*dst = ~src;
|
*dst = ~src;
|
||||||
break;
|
break;
|
||||||
|
case 0x1A:
|
||||||
|
*dst = src ^ (*dst | (src & nonpattern_src));
|
||||||
|
break;
|
||||||
|
case 0x2A:
|
||||||
|
*dst = *dst & (~(nonpattern_src & src));
|
||||||
|
break;
|
||||||
|
case 0x3A:
|
||||||
|
*dst = nonpattern_src ^ (src | (*dst ^ nonpattern_src));
|
||||||
|
break;
|
||||||
|
case 0x4A:
|
||||||
|
*dst = *dst ^ (src & (nonpattern_src | *dst));
|
||||||
|
break;
|
||||||
case 0x50:
|
case 0x50:
|
||||||
*dst = src & ~(*dst);
|
*dst = src & ~(*dst);
|
||||||
break;
|
break;
|
||||||
@@ -554,6 +639,18 @@ chips_69000_do_rop_24bpp_patterned(uint32_t *dst, uint32_t src, uint32_t nonpatt
|
|||||||
case 0x5F:
|
case 0x5F:
|
||||||
*dst = ~src | ~(*dst);
|
*dst = ~src | ~(*dst);
|
||||||
break;
|
break;
|
||||||
|
case 0x6A:
|
||||||
|
*dst = *dst ^ (src & nonpattern_src);
|
||||||
|
break;
|
||||||
|
case 0x7A:
|
||||||
|
*dst = *dst ^ (src & (nonpattern_src | (~*dst)));
|
||||||
|
break;
|
||||||
|
case 0x8A:
|
||||||
|
*dst = *dst & (nonpattern_src | (~src));
|
||||||
|
break;
|
||||||
|
case 0x9A:
|
||||||
|
*dst = *dst ^ (src & (~nonpattern_src));
|
||||||
|
break;
|
||||||
case 0xB8:
|
case 0xB8:
|
||||||
*dst = (((src ^ *dst) & nonpattern_src) ^ src);
|
*dst = (((src ^ *dst) & nonpattern_src) ^ src);
|
||||||
break;
|
break;
|
||||||
@@ -568,6 +665,18 @@ chips_69000_do_rop_24bpp_patterned(uint32_t *dst, uint32_t src, uint32_t nonpatt
|
|||||||
case 0xAF:
|
case 0xAF:
|
||||||
*dst |= ~src;
|
*dst |= ~src;
|
||||||
break;
|
break;
|
||||||
|
case 0xBA:
|
||||||
|
*dst |= (src & ~nonpattern_src);
|
||||||
|
break;
|
||||||
|
case 0xCA:
|
||||||
|
*dst ^= (src & (nonpattern_src ^ *dst));
|
||||||
|
break;
|
||||||
|
case 0xDA:
|
||||||
|
*dst ^= src & (~(nonpattern_src & *dst));
|
||||||
|
break;
|
||||||
|
case 0xEA:
|
||||||
|
*dst |= src & nonpattern_src;
|
||||||
|
break;
|
||||||
case 0xF0:
|
case 0xF0:
|
||||||
*dst = src;
|
*dst = src;
|
||||||
break;
|
break;
|
||||||
@@ -796,6 +905,7 @@ chips_69000_setup_bitblt(chips_69000_t* chips)
|
|||||||
chips->bitblt_running.actual_destination_height = chips->bitblt.destination_height;
|
chips->bitblt_running.actual_destination_height = chips->bitblt.destination_height;
|
||||||
chips->bitblt_running.count_x = chips->bitblt_running.count_y = 0;
|
chips->bitblt_running.count_x = chips->bitblt_running.count_y = 0;
|
||||||
chips->bitblt_running.bytes_written = 0;
|
chips->bitblt_running.bytes_written = 0;
|
||||||
|
chips->bitblt_running.bytes_counter = 0;
|
||||||
|
|
||||||
if (chips->bitblt.bitblt_control & (1 << 23)) {
|
if (chips->bitblt.bitblt_control & (1 << 23)) {
|
||||||
chips->bitblt_running.bytes_per_pixel = 1 + ((chips->bitblt.bitblt_control >> 24) & 3);
|
chips->bitblt_running.bytes_per_pixel = 1 + ((chips->bitblt.bitblt_control >> 24) & 3);
|
||||||
@@ -892,6 +1002,10 @@ chips_69000_bitblt_write(chips_69000_t* chips, uint8_t data) {
|
|||||||
if (!chips->engine_active)
|
if (!chips->engine_active)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
chips->bitblt_running.bytes_counter++;
|
||||||
|
if (chips->bitblt_running.bytes_counter <= (chips->bitblt_running.bitblt.source_addr & 7))
|
||||||
|
return;
|
||||||
chips->bitblt_running.bytes_port[chips->bitblt_running.bytes_written++] = data;
|
chips->bitblt_running.bytes_port[chips->bitblt_running.bytes_written++] = data;
|
||||||
if (chips->bitblt_running.bytes_written == chips->bitblt_running.bytes_per_pixel) {
|
if (chips->bitblt_running.bytes_written == chips->bitblt_running.bytes_per_pixel) {
|
||||||
uint32_t source_pixel = chips->bitblt_running.bytes_port[0];
|
uint32_t source_pixel = chips->bitblt_running.bytes_port[0];
|
||||||
|
Reference in New Issue
Block a user