+// Check dirty and calc alpha by 8 bytes.
+bool TOWNS_VRAM::check_dirty_and_calc_alpha(uint32_t addr)
+{
+ __DECL_ALIGNED(16) uint16_t pix_cache_16[4];
+ __DECL_ALIGNED(16) uint8_t pix_cache_8[8];
+ __DECL_ALIGNED(16) uint8_t pix_cache_4[16];
+
+ __DECL_ALIGNED(4 * sizeof(scrntype_t)) scrntype_t alpha_cache_16[4];
+ __DECL_ALIGNED(16) uint16_t mask_cache_16[4];
+ __DECL_ALIGNED(16) uint16_t mask_cache_16_neg[4];
+ __DECL_ALIGNED(16) uint8_t mask_cache_4[8];
+ __DECL_ALIGNED(16) uint8_t mask_cache_4_neg[8];
+ __DECL_ALIGNED(16) scrntype_t alpha_cache_4[16];
+ bool dirty = dirty_flag[addr >> 3];
+ // If Not dirty, alpha/mask already calced.
+ if(dirty) {
+ uint32_t layer = (addr >= 0x40000) ? 1 : 0;
+ uint32_t naddr = addr & 0x3ffff;
+ // alpha32768
+ uint16_t *vptr = vram_ptr[layer];
+ uint16_t *vptr8 = (uint8_t*)vptr;
+ for(int i = 0; i < 4; i++) {
+ pix_cache_16[i] = vptr[naddr >> 1];
+ }
+ for(int i = 0; i < 4; i++) {
+ alpha_cache_16[i] = alpha_32768c[pix_cache_16[i]];
+ mask_cache_16[i] = mask_32768c[pix_cache_16[i]];
+ mask_cache_16_neg[i] = ~mask_cache_16[i];
+ }
+ scrntype_t* palpha = &(alpha_buffer_32768[addr >> 1]);
+ uint16_t* pmask16 = &(mask_buffer_32768[addr >> 1]);
+ uint16_t* pmask16_neg = &(mask_buffer_32768_neg[addr >> 1]);
+ for(int i = 0; i < 4; i++) {
+ palpha[i] = alpha_cache_16[i];
+ pmask16[i] = mask_cache_16[i];
+ pmask16_neg[i] = mask_cache_16_neg[i];
+ }
+
+ for(int i = 0; i < 8; i++) {
+ pix_cache_8[i] = vptr8[naddr];
+ }
+ // Alpha8
+
+ for(int i = 0; i < 8; i++) {
+ alpha_cache_4[i << 1] = alpha_16c[pix_cache_8[i] << 1];
+ alpha_cache_4[(i << 1) + 1] = alpha_16c[(pix_cache_8[i] << 1) + 1];
+ }
+ for(int i = 0; i < 8; i++) {
+ mask_cache_4[i] = mask_16c[pix_cache_8[i]];
+ mask_cache_4_neg[i] = ~mask_cache_4[i];
+ }
+ palpha = &(alpha_buffer_16[addr << 1]);
+ uint16_t* pmask4 = &(mask_buffer_16[addr]);
+ uint16_t* pmask4_neg = &(mask_buffer_16_neg[addr]);
+ for(int i = 0; i < 16; i++) {
+ palpha[i] = alpha_cache_4[i];
+ }
+ for(int i = 0; i < 8; i++) {
+ pmask4[i] = mask_cache_4[i];
+ pmask4_neg[i] = mask_cache_4_neg[i];
+ }
+ }
+ return dirty;
+}
+
+