--- np2/i286c/Attic/egcmem.c 2003/10/16 17:57:49 1.1 +++ np2/i286c/Attic/egcmem.c 2004/02/18 03:56:57 1.10 @@ -1,24 +1,26 @@ #include "compiler.h" -#include "memory.h" +#include "cpucore.h" #include "egcmem.h" #include "pccore.h" #include "iocore.h" #include "vram.h" -// エンディアン修正しる! +enum { + EGCADDR_L = 0, + EGCADDR_H = 1 +}; +#define EGCADDR(a) (a) -// C版EGCのみ ROPの回数を記録する -// #define LOG_EGCROP -static QWORD_P egc_src; -static QWORD_P data; +static EGCQUAD egc_src; +static EGCQUAD egc_data; static const UINT planead[4] = {VRAM_B, VRAM_R, VRAM_G, VRAM_E}; -static const BYTE bytemask_u0[64] = // dir:right by startbit + (len-1)*8 +static const UINT8 bytemask_u0[64] = // dir:right by startbit + (len-1)*8 {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x01, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x07, 0x03, 0x01, @@ -28,10 +30,10 @@ static const BYTE bytemask_u0[64] = // 0xfe, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01}; -static const BYTE bytemask_u1[8] = // dir:right by length +static const UINT8 bytemask_u1[8] = // dir:right by length {0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff}; -static const BYTE bytemask_d0[64] = // dir:left by startbit + (len-1)*8 +static const UINT8 bytemask_d0[64] = // dir:left by startbit + (len-1)*8 {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xc0, 0x80, @@ -41,19 +43,15 @@ static const BYTE bytemask_d0[64] = // 0x7f, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80}; -static const BYTE bytemask_d1[8] = // dir:left by length +static const UINT8 bytemask_d1[8] = // dir:left by length {0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff}; -#ifdef LOG_EGCROP -static int egcropcnt[256]; -#endif - void egcshift(void) { BYTE src8, dst8; - egc.remain = (egc.leng & 0xfff) + 1; + egc.remain = LOW12(egc.leng) + 1; egc.func = (egc.sft >> 12) & 1; if (!egc.func) { egc.inptr = egc.buf; @@ -108,21 +106,22 @@ void egcshift(void) { } -static void egcsftb_upn_sub(DWORD ext) { +static void MEMCALL egcsftb_upn_sub(UINT ext) { if (egc.dstbit >= 8) { egc.dstbit -= 8; - egc.srcmask.b[ext] = 0; + egc.srcmask._b[ext] = 0; return; } if (egc.dstbit) { if ((egc.dstbit + egc.remain) >= 8) { - egc.srcmask.b[ext] = bytemask_u0[egc.dstbit + (7*8)]; + egc.srcmask._b[ext] = bytemask_u0[egc.dstbit + (7*8)]; egc.remain -= (8 - egc.dstbit); egc.dstbit = 0; } else { - egc.srcmask.b[ext] = bytemask_u0[egc.dstbit + (egc.remain - 1)*8]; + egc.srcmask._b[ext] = bytemask_u0[egc.dstbit + + (egc.remain - 1) * 8]; egc.remain = 0; egc.dstbit = 0; } @@ -132,33 +131,33 @@ static void egcsftb_upn_sub(DWORD ext) { egc.remain -= 8; } else { - egc.srcmask.b[ext] = bytemask_u1[egc.remain - 1]; + egc.srcmask._b[ext] = bytemask_u1[egc.remain - 1]; egc.remain = 0; } } - egc_src.b[0][ext] = egc.outptr[0]; - egc_src.b[1][ext] = egc.outptr[4]; - egc_src.b[2][ext] = egc.outptr[8]; - egc_src.b[3][ext] = egc.outptr[12]; + egc_src._b[0][ext] = egc.outptr[0]; + egc_src._b[1][ext] = egc.outptr[4]; + egc_src._b[2][ext] = egc.outptr[8]; + egc_src._b[3][ext] = egc.outptr[12]; egc.outptr++; } - -static void egcsftb_dnn_sub(DWORD ext) { +static void MEMCALL egcsftb_dnn_sub(UINT ext) { if (egc.dstbit >= 8) { egc.dstbit -= 8; - egc.srcmask.b[ext] = 0; + egc.srcmask._b[ext] = 0; return; } if (egc.dstbit) { if ((egc.dstbit + egc.remain) >= 8) { - egc.srcmask.b[ext] = bytemask_d0[egc.dstbit + (7*8)]; + egc.srcmask._b[ext] = bytemask_d0[egc.dstbit + (7*8)]; egc.remain -= (8 - egc.dstbit); egc.dstbit = 0; } else { - egc.srcmask.b[ext] = bytemask_d0[egc.dstbit + (egc.remain - 1)*8]; + egc.srcmask._b[ext] = bytemask_d0[egc.dstbit + + (egc.remain - 1) * 8]; egc.remain = 0; egc.dstbit = 0; } @@ -168,14 +167,14 @@ static void egcsftb_dnn_sub(DWORD ext) { egc.remain -= 8; } else { - egc.srcmask.b[ext] = bytemask_d1[egc.remain - 1]; + egc.srcmask._b[ext] = bytemask_d1[egc.remain - 1]; egc.remain = 0; } } - egc_src.b[0][ext] = egc.outptr[0]; - egc_src.b[1][ext] = egc.outptr[4]; - egc_src.b[2][ext] = egc.outptr[8]; - egc_src.b[3][ext] = egc.outptr[12]; + egc_src._b[0][ext] = egc.outptr[0]; + egc_src._b[1][ext] = egc.outptr[4]; + egc_src._b[2][ext] = egc.outptr[8]; + egc_src._b[3][ext] = egc.outptr[12]; egc.outptr--; } @@ -185,43 +184,44 @@ static void egcsftb_dnn_sub(DWORD ext) { // 1st -> data[0] >> (dst - src) // 2nd -> (data[0] << (8 - (dst - src))) | (data[1] >> (dst - src)) -static void egcsftb_upr_sub(DWORD ext) { +static void MEMCALL egcsftb_upr_sub(UINT ext) { if (egc.dstbit >= 8) { egc.dstbit -= 8; - egc.srcmask.b[ext] = 0; + egc.srcmask._b[ext] = 0; return; } if (egc.dstbit) { if ((egc.dstbit + egc.remain) >= 8) { - egc.srcmask.b[ext] = bytemask_u0[egc.dstbit + (7*8)]; + egc.srcmask._b[ext] = bytemask_u0[egc.dstbit + (7*8)]; egc.remain -= (8 - egc.dstbit); } else { - egc.srcmask.b[ext] = bytemask_u0[egc.dstbit + (egc.remain - 1)*8]; + egc.srcmask._b[ext] = bytemask_u0[egc.dstbit + + (egc.remain - 1) * 8]; egc.remain = 0; } egc.dstbit = 0; - egc_src.b[0][ext] = (egc.outptr[0] >> egc.sft8bitr); - egc_src.b[1][ext] = (egc.outptr[4] >> egc.sft8bitr); - egc_src.b[2][ext] = (egc.outptr[8] >> egc.sft8bitr); - egc_src.b[3][ext] = (egc.outptr[12] >> egc.sft8bitr); + egc_src._b[0][ext] = (egc.outptr[0] >> egc.sft8bitr); + egc_src._b[1][ext] = (egc.outptr[4] >> egc.sft8bitr); + egc_src._b[2][ext] = (egc.outptr[8] >> egc.sft8bitr); + egc_src._b[3][ext] = (egc.outptr[12] >> egc.sft8bitr); } else { if (egc.remain >= 8) { egc.remain -= 8; } else { - egc.srcmask.b[ext] = bytemask_u1[egc.remain - 1]; + egc.srcmask._b[ext] = bytemask_u1[egc.remain - 1]; egc.remain = 0; } - egc_src.b[0][ext] = (egc.outptr[0] << egc.sft8bitl) | + egc_src._b[0][ext] = (egc.outptr[0] << egc.sft8bitl) | (egc.outptr[1] >> egc.sft8bitr); - egc_src.b[1][ext] = (egc.outptr[4] << egc.sft8bitl) | + egc_src._b[1][ext] = (egc.outptr[4] << egc.sft8bitl) | (egc.outptr[5] >> egc.sft8bitr); - egc_src.b[2][ext] = (egc.outptr[8] << egc.sft8bitl) | + egc_src._b[2][ext] = (egc.outptr[8] << egc.sft8bitl) | (egc.outptr[9] >> egc.sft8bitr); - egc_src.b[3][ext] = (egc.outptr[12] << egc.sft8bitl) | + egc_src._b[3][ext] = (egc.outptr[12] << egc.sft8bitl) | (egc.outptr[13] >> egc.sft8bitr); egc.outptr++; } @@ -233,44 +233,45 @@ static void egcsftb_upr_sub(DWORD ext) { // 1st -> data[0] << (dst - src) // 2nd -> (data[0] >> (8 - (dst - src))) | (data[-1] << (dst - src)) -static void egcsftb_dnr_sub(DWORD ext) { +static void MEMCALL egcsftb_dnr_sub(UINT ext) { if (egc.dstbit >= 8) { egc.dstbit -= 8; - egc.srcmask.b[ext] = 0; + egc.srcmask._b[ext] = 0; return; } if (egc.dstbit) { if ((egc.dstbit + egc.remain) >= 8) { - egc.srcmask.b[ext] = bytemask_d0[egc.dstbit + (7*8)]; + egc.srcmask._b[ext] = bytemask_d0[egc.dstbit + (7*8)]; egc.remain -= (8 - egc.dstbit); } else { - egc.srcmask.b[ext] = bytemask_d0[egc.dstbit + (egc.remain - 1)*8]; + egc.srcmask._b[ext] = bytemask_d0[egc.dstbit + + (egc.remain - 1) * 8]; egc.remain = 0; } egc.dstbit = 0; - egc_src.b[0][ext] = (egc.outptr[0] << egc.sft8bitr); - egc_src.b[1][ext] = (egc.outptr[4] << egc.sft8bitr); - egc_src.b[2][ext] = (egc.outptr[8] << egc.sft8bitr); - egc_src.b[3][ext] = (egc.outptr[12] << egc.sft8bitr); + egc_src._b[0][ext] = (egc.outptr[0] << egc.sft8bitr); + egc_src._b[1][ext] = (egc.outptr[4] << egc.sft8bitr); + egc_src._b[2][ext] = (egc.outptr[8] << egc.sft8bitr); + egc_src._b[3][ext] = (egc.outptr[12] << egc.sft8bitr); } else { if (egc.remain >= 8) { egc.remain -= 8; } else { - egc.srcmask.b[ext] = bytemask_d1[egc.remain - 1]; + egc.srcmask._b[ext] = bytemask_d1[egc.remain - 1]; egc.remain = 0; } egc.outptr--; - egc_src.b[0][ext] = (egc.outptr[1] >> egc.sft8bitl) | + egc_src._b[0][ext] = (egc.outptr[1] >> egc.sft8bitl) | (egc.outptr[0] << egc.sft8bitr); - egc_src.b[1][ext] = (egc.outptr[5] >> egc.sft8bitl) | + egc_src._b[1][ext] = (egc.outptr[5] >> egc.sft8bitl) | (egc.outptr[4] << egc.sft8bitr); - egc_src.b[2][ext] = (egc.outptr[9] >> egc.sft8bitl) | + egc_src._b[2][ext] = (egc.outptr[9] >> egc.sft8bitl) | (egc.outptr[8] << egc.sft8bitr); - egc_src.b[3][ext] = (egc.outptr[13] >> egc.sft8bitl) | + egc_src._b[3][ext] = (egc.outptr[13] >> egc.sft8bitl) | (egc.outptr[12] << egc.sft8bitr); } } @@ -281,21 +282,22 @@ static void egcsftb_dnr_sub(DWORD ext) { // 1st -> (data[0] << (src - dst)) | (data[1] >> (8 - (src - dst)) // 2nd -> (data[0] << (src - dst)) | (data[1] >> (8 - (src - dst)) -static void egcsftb_upl_sub(DWORD ext) { +static void MEMCALL egcsftb_upl_sub(UINT ext) { if (egc.dstbit >= 8) { egc.dstbit -= 8; - egc.srcmask.b[ext] = 0; + egc.srcmask._b[ext] = 0; return; } if (egc.dstbit) { if ((egc.dstbit + egc.remain) >= 8) { - egc.srcmask.b[ext] = bytemask_u0[egc.dstbit + (7*8)]; + egc.srcmask._b[ext] = bytemask_u0[egc.dstbit + (7*8)]; egc.remain -= (8 - egc.dstbit); egc.dstbit = 0; } else { - egc.srcmask.b[ext] = bytemask_u0[egc.dstbit + (egc.remain - 1)*8]; + egc.srcmask._b[ext] = bytemask_u0[egc.dstbit + + (egc.remain - 1) * 8]; egc.remain = 0; egc.dstbit = 0; } @@ -305,17 +307,17 @@ static void egcsftb_upl_sub(DWORD ext) { egc.remain -= 8; } else { - egc.srcmask.b[ext] = bytemask_u1[egc.remain - 1]; + egc.srcmask._b[ext] = bytemask_u1[egc.remain - 1]; egc.remain = 0; } } - egc_src.b[0][ext] = (egc.outptr[0] << egc.sft8bitl) | + egc_src._b[0][ext] = (egc.outptr[0] << egc.sft8bitl) | (egc.outptr[1] >> egc.sft8bitr); - egc_src.b[1][ext] = (egc.outptr[4] << egc.sft8bitl) | + egc_src._b[1][ext] = (egc.outptr[4] << egc.sft8bitl) | (egc.outptr[5] >> egc.sft8bitr); - egc_src.b[2][ext] = (egc.outptr[8] << egc.sft8bitl) | + egc_src._b[2][ext] = (egc.outptr[8] << egc.sft8bitl) | (egc.outptr[9] >> egc.sft8bitr); - egc_src.b[3][ext] = (egc.outptr[12] << egc.sft8bitl) | + egc_src._b[3][ext] = (egc.outptr[12] << egc.sft8bitl) | (egc.outptr[13] >> egc.sft8bitr); egc.outptr++; } @@ -326,21 +328,22 @@ static void egcsftb_upl_sub(DWORD ext) { // 1st -> (data[0] >> (dst - src)) | (data[-1] << (8 - (src - dst)) // 2nd -> (data[0] >> (dst - src)) | (data[-1] << (8 - (src - dst)) -static void egcsftb_dnl_sub(DWORD ext) { +static void MEMCALL egcsftb_dnl_sub(UINT ext) { if (egc.dstbit >= 8) { egc.dstbit -= 8; - egc.srcmask.b[ext] = 0; + egc.srcmask._b[ext] = 0; return; } if (egc.dstbit) { if ((egc.dstbit + egc.remain) >= 8) { - egc.srcmask.b[ext] = bytemask_d0[egc.dstbit + (7*8)]; + egc.srcmask._b[ext] = bytemask_d0[egc.dstbit + (7*8)]; egc.remain -= (8 - egc.dstbit); egc.dstbit = 0; } else { - egc.srcmask.b[ext] = bytemask_d0[egc.dstbit + (egc.remain - 1)*8]; + egc.srcmask._b[ext] = bytemask_d0[egc.dstbit + + (egc.remain - 1) * 8]; egc.remain = 0; egc.dstbit = 0; } @@ -350,29 +353,26 @@ static void egcsftb_dnl_sub(DWORD ext) { egc.remain -= 8; } else { - egc.srcmask.b[ext] = bytemask_d1[egc.remain - 1]; + egc.srcmask._b[ext] = bytemask_d1[egc.remain - 1]; egc.remain = 0; } } egc.outptr--; - egc_src.b[0][ext] = (egc.outptr[1] >> egc.sft8bitl) | + egc_src._b[0][ext] = (egc.outptr[1] >> egc.sft8bitl) | (egc.outptr[0] << egc.sft8bitr); - egc_src.b[1][ext] = (egc.outptr[5] >> egc.sft8bitl) | + egc_src._b[1][ext] = (egc.outptr[5] >> egc.sft8bitl) | (egc.outptr[4] << egc.sft8bitr); - egc_src.b[2][ext] = (egc.outptr[9] >> egc.sft8bitl) | + egc_src._b[2][ext] = (egc.outptr[9] >> egc.sft8bitl) | (egc.outptr[8] << egc.sft8bitr); - egc_src.b[3][ext] = (egc.outptr[13] >> egc.sft8bitl) | + egc_src._b[3][ext] = (egc.outptr[13] >> egc.sft8bitl) | (egc.outptr[12] << egc.sft8bitr); } -static void egcsftb_upn0(DWORD adrs) { - - int ext; +static void MEMCALL egcsftb_upn0(UINT ext) { - ext = adrs & 1; - if (egc.stack < (DWORD)(8 - egc.dstbit)) { - egc.srcmask.b[ext] = 0; + if (egc.stack < (UINT)(8 - egc.dstbit)) { + egc.srcmask._b[ext] = 0; return; } egc.stack -= (8 - egc.dstbit); @@ -382,35 +382,30 @@ static void egcsftb_upn0(DWORD adrs) { } } -static void egcsftw_upn0(DWORD adrs) { +static void MEMCALL egcsftw_upn0(void) { - if (egc.stack < (DWORD)(16 - egc.dstbit)) { + if (egc.stack < (UINT)(16 - egc.dstbit)) { egc.srcmask.w = 0; return; } egc.stack -= (16 - egc.dstbit); - egcsftb_upn_sub(0); + egcsftb_upn_sub(EGCADDR_L); if (egc.remain) { - egcsftb_upn_sub(1); + egcsftb_upn_sub(EGCADDR_H); if (egc.remain) { return; } } else { - egc.srcmask.b[1] = 0; + egc.srcmask._b[EGCADDR_H] = 0; } egcshift(); - (void)adrs; } +static void MEMCALL egcsftb_dnn0(UINT ext) { -static void egcsftb_dnn0(DWORD adrs) { - - int ext; - - ext = adrs & 1; - if (egc.stack < (DWORD)(8 - egc.dstbit)) { - egc.srcmask.b[ext] = 0; + if (egc.stack < (UINT)(8 - egc.dstbit)) { + egc.srcmask._b[ext] = 0; return; } egc.stack -= (8 - egc.dstbit); @@ -420,35 +415,31 @@ static void egcsftb_dnn0(DWORD adrs) { } } -static void egcsftw_dnn0(DWORD adrs) { +static void MEMCALL egcsftw_dnn0(void) { - if (egc.stack < (DWORD)(16 - egc.dstbit)) { + if (egc.stack < (UINT)(16 - egc.dstbit)) { egc.srcmask.w = 0; return; } egc.stack -= (16 - egc.dstbit); - egcsftb_dnn_sub(1); + egcsftb_dnn_sub(EGCADDR_H); if (egc.remain) { - egcsftb_dnn_sub(0); + egcsftb_dnn_sub(EGCADDR_L); if (egc.remain) { return; } } else { - egc.srcmask.b[0] = 0; + egc.srcmask._b[EGCADDR_L] = 0; } egcshift(); - (void)adrs; } -static void egcsftb_upr0(DWORD adrs) { // dir:up srcbit < dstbit +static void MEMCALL egcsftb_upr0(UINT ext) { // dir:up srcbit < dstbit - int ext; - - ext = adrs & 1; - if (egc.stack < (DWORD)(8 - egc.dstbit)) { - egc.srcmask.b[ext] = 0; + if (egc.stack < (UINT)(8 - egc.dstbit)) { + egc.srcmask._b[ext] = 0; return; } egc.stack -= (8 - egc.dstbit); @@ -458,35 +449,30 @@ static void egcsftb_upr0(DWORD adrs) { } } -static void egcsftw_upr0(DWORD adrs) { // dir:up srcbit < dstbit +static void MEMCALL egcsftw_upr0(void) { // dir:up srcbit < dstbit - if (egc.stack < (DWORD)(16 - egc.dstbit)) { + if (egc.stack < (UINT)(16 - egc.dstbit)) { egc.srcmask.w = 0; return; } egc.stack -= (16 - egc.dstbit); - egcsftb_upr_sub(0); + egcsftb_upr_sub(EGCADDR_L); if (egc.remain) { - egcsftb_upr_sub(1); + egcsftb_upr_sub(EGCADDR_H); if (egc.remain) { return; } } else { - egc.srcmask.b[1] = 0; + egc.srcmask._b[EGCADDR_H] = 0; } egcshift(); - (void)adrs; } +static void MEMCALL egcsftb_dnr0(UINT ext) { // dir:up srcbit < dstbit -static void egcsftb_dnr0(DWORD adrs) { // dir:up srcbit < dstbit - - int ext; - - ext = adrs & 1; - if (egc.stack < (DWORD)(8 - egc.dstbit)) { - egc.srcmask.b[ext] = 0; + if (egc.stack < (UINT)(8 - egc.dstbit)) { + egc.srcmask._b[ext] = 0; return; } egc.stack -= (8 - egc.dstbit); @@ -496,35 +482,31 @@ static void egcsftb_dnr0(DWORD adrs) { } } -static void egcsftw_dnr0(DWORD adrs) { // dir:up srcbit < dstbit +static void MEMCALL egcsftw_dnr0(void) { // dir:up srcbit < dstbit - if (egc.stack < (DWORD)(16 - egc.dstbit)) { + if (egc.stack < (UINT)(16 - egc.dstbit)) { egc.srcmask.w = 0; return; } egc.stack -= (16 - egc.dstbit); - egcsftb_dnr_sub(1); + egcsftb_dnr_sub(EGCADDR_H); if (egc.remain) { - egcsftb_dnr_sub(0); + egcsftb_dnr_sub(EGCADDR_L); if (egc.remain) { return; } } else { - egc.srcmask.b[0] = 0; + egc.srcmask._b[EGCADDR_L] = 0; } egcshift(); - (void)adrs; } -static void egcsftb_upl0(DWORD adrs) { // dir:up srcbit > dstbit - - int ext; +static void MEMCALL egcsftb_upl0(UINT ext) { // dir:up srcbit > dstbit - ext = adrs & 1; - if (egc.stack < (DWORD)(8 - egc.dstbit)) { - egc.srcmask.b[ext] = 0; + if (egc.stack < (UINT)(8 - egc.dstbit)) { + egc.srcmask._b[ext] = 0; return; } egc.stack -= (8 - egc.dstbit); @@ -534,35 +516,30 @@ static void egcsftb_upl0(DWORD adrs) { } } -static void egcsftw_upl0(DWORD adrs) { // dir:up srcbit > dstbit +static void MEMCALL egcsftw_upl0(void) { // dir:up srcbit > dstbit - if (egc.stack < (DWORD)(16 - egc.dstbit)) { + if (egc.stack < (UINT)(16 - egc.dstbit)) { egc.srcmask.w = 0; return; } egc.stack -= (16 - egc.dstbit); - egcsftb_upl_sub(0); + egcsftb_upl_sub(EGCADDR_L); if (egc.remain) { - egcsftb_upl_sub(1); + egcsftb_upl_sub(EGCADDR_H); if (egc.remain) { return; } } else { - egc.srcmask.b[1] = 0; + egc.srcmask._b[EGCADDR_H] = 0; } egcshift(); - (void)adrs; } +static void MEMCALL egcsftb_dnl0(UINT ext) { // dir:up srcbit > dstbit -static void egcsftb_dnl0(DWORD adrs) { // dir:up srcbit > dstbit - - int ext; - - ext = adrs & 1; - if (egc.stack < (DWORD)(8 - egc.dstbit)) { - egc.srcmask.b[ext] = 0; + if (egc.stack < (UINT)(8 - egc.dstbit)) { + egc.srcmask._b[ext] = 0; return; } egc.stack -= (8 - egc.dstbit); @@ -572,40 +549,45 @@ static void egcsftb_dnl0(DWORD adrs) { } } -static void egcsftw_dnl0(DWORD adrs) { // dir:up srcbit > dstbit +static void MEMCALL egcsftw_dnl0(void) { // dir:up srcbit > dstbit - if (egc.stack < (DWORD)(16 - egc.dstbit)) { + if (egc.stack < (UINT)(16 - egc.dstbit)) { egc.srcmask.w = 0; return; } egc.stack -= (16 - egc.dstbit); - egcsftb_dnl_sub(1); + egcsftb_dnl_sub(EGCADDR_H); if (egc.remain) { - egcsftb_dnl_sub(0); + egcsftb_dnl_sub(EGCADDR_L); if (egc.remain) { return; } } else { - egc.srcmask.b[0] = 0; + egc.srcmask._b[EGCADDR_L] = 0; } egcshift(); - (void)adrs; } -static void (*egcsft_proc[])(DWORD adrs) = { - egcsftw_upn0, egcsftw_dnn0, - egcsftw_upr0, egcsftw_dnr0, - egcsftw_upl0, egcsftw_dnl0, +typedef void (MEMCALL * EGCSFTB)(UINT ext); +typedef void (MEMCALL * EGCSFTW)(void); +static const EGCSFTB egcsftb[6] = { egcsftb_upn0, egcsftb_dnn0, egcsftb_upr0, egcsftb_dnr0, egcsftb_upl0, egcsftb_dnl0}; +static const EGCSFTW egcsftw[6] = { + egcsftw_upn0, egcsftw_dnn0, + egcsftw_upr0, egcsftw_dnr0, + egcsftw_upl0, egcsftw_dnl0}; + + + // --------------------------------------------------------------------------- -static void shiftinput_byte(DWORD ext) { +static void MEMCALL shiftinput_byte(UINT ext) { if (egc.stack <= 16) { if (egc.srcbit >= 8) { @@ -622,11 +604,11 @@ static void shiftinput_byte(DWORD ext) { egc.inptr--; } } - egc.srcmask.b[ext] = 0xff; - egcsft_proc[egc.func + 6](ext); + egc.srcmask._b[ext] = 0xff; + (*egcsftb[egc.func])(ext); } -static void shiftinput_incw(void) { +static void MEMCALL shiftinput_incw(void) { if (egc.stack <= 16) { egc.inptr += 2; @@ -637,10 +619,10 @@ static void shiftinput_incw(void) { egc.srcbit = 0; } egc.srcmask.w = 0xffff; - egcsft_proc[egc.func](0); + (*egcsftw[egc.func])(); } -static void shiftinput_decw(void) { +static void MEMCALL shiftinput_decw(void) { if (egc.stack <= 16) { egc.inptr -= 2; @@ -651,182 +633,413 @@ static void shiftinput_decw(void) { egc.srcbit = 0; } egc.srcmask.w = 0xffff; - egcsft_proc[egc.func](0); + (*egcsftw[egc.func])(); } +#define EGCOPE_SHIFTB \ + if (egc.ope & 0x400) { \ + egc.inptr[ 0] = (BYTE)value; \ + egc.inptr[ 4] = (BYTE)value; \ + egc.inptr[ 8] = (BYTE)value; \ + egc.inptr[12] = (BYTE)value; \ + shiftinput_byte(EGCADDR(ad & 1)); \ + } \ + +#define EGCOPE_SHIFTW \ + if (egc.ope & 0x400) { \ + if (!(egc.sft & 0x1000)) { \ + egc.inptr[ 0] = (BYTE)value; \ + egc.inptr[ 1] = (BYTE)(value >> 8); \ + egc.inptr[ 4] = (BYTE)value; \ + egc.inptr[ 5] = (BYTE)(value >> 8); \ + egc.inptr[ 8] = (BYTE)value; \ + egc.inptr[ 9] = (BYTE)(value >> 8); \ + egc.inptr[12] = (BYTE)value; \ + egc.inptr[13] = (BYTE)(value >> 8); \ + shiftinput_incw(); \ + } \ + else { \ + egc.inptr[-1] = (BYTE)value; \ + egc.inptr[ 0] = (BYTE)(value >> 8); \ + egc.inptr[ 3] = (BYTE)value; \ + egc.inptr[ 4] = (BYTE)(value >> 8); \ + egc.inptr[ 7] = (BYTE)value; \ + egc.inptr[ 8] = (BYTE)(value >> 8); \ + egc.inptr[11] = (BYTE)value; \ + egc.inptr[12] = (BYTE)(value >> 8); \ + shiftinput_decw(); \ + } \ + } + + +// ---- + +static const UINT8 data_00[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; +static const UINT8 data_ff[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; -#define EGCOPE_SHIFT { \ - if (egc.ope & 0x400) { \ - if (func < 6) { \ - if (!(egc.sft & 0x1000)) { \ - *(WORD *)(egc.inptr + 0) = value; \ - *(WORD *)(egc.inptr + 4) = value; \ - *(WORD *)(egc.inptr + 8) = value; \ - *(WORD *)(egc.inptr +12) = value; \ - shiftinput_incw(); \ - } \ - else { \ - *(WORD *)(egc.inptr - 1) = value; \ - *(WORD *)(egc.inptr + 3) = value; \ - *(WORD *)(egc.inptr + 7) = value; \ - *(WORD *)(egc.inptr +11) = value; \ - shiftinput_decw(); \ - } \ - } \ - else { \ - *(egc.inptr + 0) = (BYTE)value; \ - *(egc.inptr + 4) = (BYTE)value; \ - *(egc.inptr + 8) = (BYTE)value; \ - *(egc.inptr +12) = (BYTE)value; \ - shiftinput_byte(ad & 1); \ - } \ - } \ +static const EGCQUAD * MEMCALL ope_00(REG8 ope, UINT32 ad) { + + (void)ope; + (void)ad; + return((EGCQUAD *)data_00); } +static const EGCQUAD * MEMCALL ope_0f(REG8 ope, UINT32 ad) { + + egc_data.d[0] = ~egc_src.d[0]; + egc_data.d[1] = ~egc_src.d[1]; -static void gdc_ope(DWORD ad, WORD value, int func) { + (void)ope; + (void)ad; + return(&egc_data); +} - QWORD_P pat; - QWORD_P dst; +static const EGCQUAD * MEMCALL ope_c0(REG8 ope, UINT32 ad) { - egc.mask2.w = egc.mask.w; + EGCQUAD dst; + + dst.w[0] = *(UINT16 *)(&mem[ad + VRAM_B]); + dst.w[1] = *(UINT16 *)(&mem[ad + VRAM_R]); + dst.w[2] = *(UINT16 *)(&mem[ad + VRAM_G]); + dst.w[3] = *(UINT16 *)(&mem[ad + VRAM_E]); + egc_data.d[0] = (egc_src.d[0] & dst.d[0]); + egc_data.d[1] = (egc_src.d[1] & dst.d[1]); + + (void)ope; + (void)ad; + return(&egc_data); +} + +static const EGCQUAD * MEMCALL ope_f0(REG8 ope, UINT32 ad) { + + (void)ope; + (void)ad; + return(&egc_src); +} + +static const EGCQUAD * MEMCALL ope_fc(REG8 ope, UINT32 ad) { + + EGCQUAD dst; + + dst.w[0] = *(UINT16 *)(&mem[ad + VRAM_B]); + dst.w[1] = *(UINT16 *)(&mem[ad + VRAM_R]); + dst.w[2] = *(UINT16 *)(&mem[ad + VRAM_G]); + dst.w[3] = *(UINT16 *)(&mem[ad + VRAM_E]); + egc_data.d[0] = egc_src.d[0]; + egc_data.d[0] |= ((~egc_src.d[0]) & dst.d[0]); + egc_data.d[1] = egc_src.d[1]; + egc_data.d[1] |= ((~egc_src.d[1]) & dst.d[1]); + + (void)ope; + (void)ad; + return(&egc_data); +} + +static const EGCQUAD * MEMCALL ope_ff(REG8 ope, UINT32 ad) { + + (void)ope; + (void)ad; + return((EGCQUAD *)data_ff); +} + +static const EGCQUAD * MEMCALL ope_nd(REG8 ope, UINT32 ad) { + + EGCQUAD pat; + + switch(egc.fgbg & 0x6000) { + case 0x2000: + pat.d[0] = egc.bgc.d[0]; + pat.d[1] = egc.bgc.d[1]; + break; + + case 0x4000: + pat.d[0] = egc.fgc.d[0]; + pat.d[1] = egc.fgc.d[1]; + break; + + default: + if ((egc.ope & 0x0300) == 0x0100) { + pat.d[0] = egc_src.d[0]; + pat.d[1] = egc_src.d[1]; + } + else { + pat.d[0] = egc.patreg.d[0]; + pat.d[1] = egc.patreg.d[1]; + } + break; + } + + egc_data.d[0] = 0; + egc_data.d[1] = 0; + if (ope & 0x80) { + egc_data.d[0] |= (pat.d[0] & egc_src.d[0]); + egc_data.d[1] |= (pat.d[1] & egc_src.d[1]); + } + if (ope & 0x40) { + egc_data.d[0] |= ((~pat.d[0]) & egc_src.d[0]); + egc_data.d[1] |= ((~pat.d[1]) & egc_src.d[1]); + } + if (ope & 0x08) { + egc_data.d[0] |= (pat.d[0] & (~egc_src.d[0])); + egc_data.d[1] |= (pat.d[1] & (~egc_src.d[1])); + } + if (ope & 0x04) { + egc_data.d[0] |= ((~pat.d[0]) & (~egc_src.d[0])); + egc_data.d[1] |= ((~pat.d[1]) & (~egc_src.d[1])); + } + (void)ad; + return(&egc_data); +} + +static const EGCQUAD * MEMCALL ope_np(REG8 ope, UINT32 ad) { + EGCQUAD dst; + + dst.w[0] = *(UINT16 *)(&mem[ad + VRAM_B]); + dst.w[1] = *(UINT16 *)(&mem[ad + VRAM_R]); + dst.w[2] = *(UINT16 *)(&mem[ad + VRAM_G]); + dst.w[3] = *(UINT16 *)(&mem[ad + VRAM_E]); + + egc_data.d[0] = 0; + egc_data.d[1] = 0; + if (ope & 0x80) { + egc_data.d[0] |= (egc_src.d[0] & dst.d[0]); + egc_data.d[1] |= (egc_src.d[1] & dst.d[1]); + } + if (ope & 0x20) { + egc_data.d[0] |= (egc_src.d[0] & (~dst.d[0])); + egc_data.d[1] |= (egc_src.d[1] & (~dst.d[1])); + } + if (ope & 0x08) { + egc_data.d[0] |= ((~egc_src.d[0]) & dst.d[0]); + egc_data.d[1] |= ((~egc_src.d[1]) & dst.d[1]); + } + if (ope & 0x02) { + egc_data.d[0] |= ((~egc_src.d[0]) & (~dst.d[0])); + egc_data.d[1] |= ((~egc_src.d[1]) & (~dst.d[1])); + } + return(&egc_data); +} + +static const EGCQUAD * MEMCALL ope_xx(REG8 ope, UINT32 ad) { + + EGCQUAD pat; + EGCQUAD dst; + + switch(egc.fgbg & 0x6000) { + case 0x2000: + pat.d[0] = egc.bgc.d[0]; + pat.d[1] = egc.bgc.d[1]; + break; + + case 0x4000: + pat.d[0] = egc.fgc.d[0]; + pat.d[1] = egc.fgc.d[1]; + break; + + default: + if ((egc.ope & 0x0300) == 0x0100) { + pat.d[0] = egc_src.d[0]; + pat.d[1] = egc_src.d[1]; + } + else { + pat.d[0] = egc.patreg.d[0]; + pat.d[1] = egc.patreg.d[1]; + } + break; + } + dst.w[0] = *(UINT16 *)(&mem[ad + VRAM_B]); + dst.w[1] = *(UINT16 *)(&mem[ad + VRAM_R]); + dst.w[2] = *(UINT16 *)(&mem[ad + VRAM_G]); + dst.w[3] = *(UINT16 *)(&mem[ad + VRAM_E]); + + egc_data.d[0] = 0; + egc_data.d[1] = 0; + if (ope & 0x80) { + egc_data.d[0] |= (pat.d[0] & egc_src.d[0] & dst.d[0]); + egc_data.d[1] |= (pat.d[1] & egc_src.d[1] & dst.d[1]); + } + if (ope & 0x40) { + egc_data.d[0] |= ((~pat.d[0]) & egc_src.d[0] & dst.d[0]); + egc_data.d[1] |= ((~pat.d[1]) & egc_src.d[1] & dst.d[1]); + } + if (ope & 0x20) { + egc_data.d[0] |= (pat.d[0] & egc_src.d[0] & (~dst.d[0])); + egc_data.d[1] |= (pat.d[1] & egc_src.d[1] & (~dst.d[1])); + } + if (ope & 0x10) { + egc_data.d[0] |= ((~pat.d[0]) & egc_src.d[0] & (~dst.d[0])); + egc_data.d[1] |= ((~pat.d[1]) & egc_src.d[1] & (~dst.d[1])); + } + if (ope & 0x08) { + egc_data.d[0] |= (pat.d[0] & (~egc_src.d[0]) & dst.d[0]); + egc_data.d[1] |= (pat.d[1] & (~egc_src.d[1]) & dst.d[1]); + } + if (ope & 0x04) { + egc_data.d[0] |= ((~pat.d[0]) & (~egc_src.d[0]) & dst.d[0]); + egc_data.d[1] |= ((~pat.d[1]) & (~egc_src.d[1]) & dst.d[1]); + } + if (ope & 0x02) { + egc_data.d[0] |= (pat.d[0] & (~egc_src.d[0]) & (~dst.d[0])); + egc_data.d[1] |= (pat.d[1] & (~egc_src.d[1]) & (~dst.d[1])); + } + if (ope & 0x01) { + egc_data.d[0] |= ((~pat.d[0]) & (~egc_src.d[0]) & (~dst.d[0])); + egc_data.d[1] |= ((~pat.d[1]) & (~egc_src.d[1]) & (~dst.d[1])); + } + return(&egc_data); +} + +typedef const EGCQUAD * (MEMCALL * OPEFN)(REG8 ope, UINT32 ad); + +static const OPEFN opefn[256] = { + ope_00, ope_xx, ope_xx, ope_np, ope_xx, ope_nd, ope_xx, ope_xx, + ope_xx, ope_xx, ope_nd, ope_xx, ope_np, ope_xx, ope_xx, ope_0f, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_np, ope_xx, ope_xx, ope_np, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_np, ope_xx, ope_xx, ope_np, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_nd, ope_xx, ope_xx, ope_xx, ope_xx, ope_nd, ope_xx, ope_xx, + ope_xx, ope_xx, ope_nd, ope_xx, ope_xx, ope_xx, ope_xx, ope_nd, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_nd, ope_xx, ope_xx, ope_xx, ope_xx, ope_nd, ope_xx, ope_xx, + ope_xx, ope_xx, ope_nd, ope_xx, ope_xx, ope_xx, ope_xx, ope_nd, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_c0, ope_xx, ope_xx, ope_np, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_np, ope_xx, ope_xx, ope_np, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, ope_xx, + ope_f0, ope_xx, ope_xx, ope_np, ope_xx, ope_nd, ope_xx, ope_xx, + ope_xx, ope_xx, ope_nd, ope_xx, ope_fc, ope_xx, ope_xx, ope_ff}; + + +// ---- + +static const EGCQUAD * MEMCALL egc_opeb(UINT32 ad, REG8 value) { + + UINT tmp; + + egc.mask2.w = egc.mask.w; switch(egc.ope & 0x1800) { case 0x0800: - EGCOPE_SHIFT; + EGCOPE_SHIFTB; + egc.mask2.w &= egc.srcmask.w; + tmp = egc.ope & 0xff; + return((*opefn[tmp])((REG8)tmp, ad & (~1))); + + case 0x1000: switch(egc.fgbg & 0x6000) { case 0x2000: - pat.d[0] = egc.bgc.d[0]; - pat.d[1] = egc.bgc.d[1]; - break; + return(&egc.bgc); + case 0x4000: - pat.d[0] = egc.fgc.d[0]; - pat.d[1] = egc.fgc.d[1]; - break; - default: - if ((egc.ope & 0x0300) == 0x0100) { // ver0.29 - pat.d[0] = egc_src.d[0]; - pat.d[1] = egc_src.d[1]; - } - else { - pat.d[0] = egc.patreg.d[0]; - pat.d[1] = egc.patreg.d[1]; - } - break; - } - ad &= ~1; - dst.w[0] = *(WORD *)(&mem[ad + VRAM_B]); - dst.w[1] = *(WORD *)(&mem[ad + VRAM_R]); - dst.w[2] = *(WORD *)(&mem[ad + VRAM_G]); - dst.w[3] = *(WORD *)(&mem[ad + VRAM_E]); + return(&egc.fgc); -#ifdef LOG_EGCROP - egcropcnt[egc.ope & 0xff]++; -#endif - data.d[0] = 0; - data.d[1] = 0; - if (egc.ope & 0x80) { - data.d[0] |= (pat.d[0] & egc_src.d[0] & dst.d[0]); - data.d[1] |= (pat.d[1] & egc_src.d[1] & dst.d[1]); - } - if (egc.ope & 0x40) { - data.d[0] |= ((~pat.d[0]) & egc_src.d[0] & dst.d[0]); - data.d[1] |= ((~pat.d[1]) & egc_src.d[1] & dst.d[1]); - } - if (egc.ope & 0x20) { - data.d[0] |= (pat.d[0] & egc_src.d[0] & (~dst.d[0])); - data.d[1] |= (pat.d[1] & egc_src.d[1] & (~dst.d[1])); - } - if (egc.ope & 0x10) { - data.d[0] |= ((~pat.d[0]) & egc_src.d[0] & (~dst.d[0])); - data.d[1] |= ((~pat.d[1]) & egc_src.d[1] & (~dst.d[1])); - } - if (egc.ope & 0x08) { - data.d[0] |= (pat.d[0] & (~egc_src.d[0]) & dst.d[0]); - data.d[1] |= (pat.d[1] & (~egc_src.d[1]) & dst.d[1]); - } - if (egc.ope & 0x04) { - data.d[0] |= ((~pat.d[0]) & (~egc_src.d[0]) & dst.d[0]); - data.d[1] |= ((~pat.d[1]) & (~egc_src.d[1]) & dst.d[1]); - } - if (egc.ope & 0x02) { - data.d[0] |= (pat.d[0] & (~egc_src.d[0]) & (~dst.d[0])); - data.d[1] |= (pat.d[1] & (~egc_src.d[1]) & (~dst.d[1])); - } - if (egc.ope & 0x01) { - data.d[0] |= ((~pat.d[0]) & (~egc_src.d[0]) & (~dst.d[0])); - data.d[1] |= ((~pat.d[1]) & (~egc_src.d[1]) & (~dst.d[1])); + default: + EGCOPE_SHIFTB; + egc.mask2.w &= egc.srcmask.w; + return(&egc_src); } - egc.mask2.w &= egc.srcmask.w; break; + + default: + tmp = value & 0xff; + tmp = tmp | (tmp << 8); + egc_data.w[0] = (UINT16)tmp; + egc_data.w[1] = (UINT16)tmp; + egc_data.w[2] = (UINT16)tmp; + egc_data.w[3] = (UINT16)tmp; + return(&egc_data); + } +} + +static const EGCQUAD * MEMCALL egc_opew(UINT32 ad, REG16 value) { + + UINT tmp; + + egc.mask2.w = egc.mask.w; + switch(egc.ope & 0x1800) { + case 0x0800: + EGCOPE_SHIFTW; + egc.mask2.w &= egc.srcmask.w; + tmp = egc.ope & 0xff; + return((*opefn[tmp])((REG8)tmp, ad)); + case 0x1000: switch(egc.fgbg & 0x6000) { - case 0x2000: // ver0.29 - data.d[0] = egc.bgc.d[0]; - data.d[1] = egc.bgc.d[1]; - break; - case 0x4000: // ver0.29 - data.d[0] = egc.fgc.d[0]; - data.d[1] = egc.fgc.d[1]; - break; + case 0x2000: + return(&egc.bgc); + + case 0x4000: + return(&egc.fgc); + default: -#if 0 - data.d[0] = egc.patreg.d[0]; - data.d[1] = egc.patreg.d[1]; -#else - EGCOPE_SHIFT; - data.d[0] = egc_src.d[0]; - data.d[1] = egc_src.d[1]; + EGCOPE_SHIFTW; egc.mask2.w &= egc.srcmask.w; -#endif - break; + return(&egc_src); } break; + default: - data.w[0] = value; - data.w[1] = value; - data.w[2] = value; - data.w[3] = value; - break; +#if defined(BYTESEX_BIG) + value = ((value >> 8) & 0xff) | ((value & 0xff) << 8); +#endif + egc_data.w[0] = (UINT16)value; + egc_data.w[1] = (UINT16)value; + egc_data.w[2] = (UINT16)value; + egc_data.w[3] = (UINT16)value; + return(&egc_data); } } -BYTE MEMCALL egc_read(UINT32 addr) { - - DWORD ad; - DWORD ext; +REG8 MEMCALL egc_read(UINT32 addr) { -// TRACE_("EGC read_byte", (WORD)(addr & 0x7fff)); + UINT32 ad; + UINT ext; if (gdcs.access) { addr += VRAM_STEP; } - ad = VRAM_POS(addr); - ext = addr & 1; - egc.lastvram.b[0][ext] = mem[ad + VRAM_B]; - egc.lastvram.b[1][ext] = mem[ad + VRAM_R]; - egc.lastvram.b[2][ext] = mem[ad + VRAM_G]; - egc.lastvram.b[3][ext] = mem[ad + VRAM_E]; + ad = VRAMADDRMASKEX(addr); + ext = EGCADDR(addr & 1); + egc.lastvram._b[0][ext] = mem[ad + VRAM_B]; + egc.lastvram._b[1][ext] = mem[ad + VRAM_R]; + egc.lastvram._b[2][ext] = mem[ad + VRAM_G]; + egc.lastvram._b[3][ext] = mem[ad + VRAM_E]; // shift input if (!(egc.ope & 0x400)) { - egc.inptr[0] = egc.lastvram.b[0][ext]; - egc.inptr[4] = egc.lastvram.b[1][ext]; - egc.inptr[8] = egc.lastvram.b[2][ext]; - egc.inptr[12] = egc.lastvram.b[3][ext]; + egc.inptr[0] = egc.lastvram._b[0][ext]; + egc.inptr[4] = egc.lastvram._b[1][ext]; + egc.inptr[8] = egc.lastvram._b[2][ext]; + egc.inptr[12] = egc.lastvram._b[3][ext]; shiftinput_byte(ext); } if ((egc.ope & 0x0300) == 0x0100) { - egc.patreg.b[0][ext] = mem[ad + VRAM_B]; - egc.patreg.b[1][ext] = mem[ad + VRAM_R]; - egc.patreg.b[2][ext] = mem[ad + VRAM_G]; - egc.patreg.b[3][ext] = mem[ad + VRAM_E]; + egc.patreg._b[0][ext] = mem[ad + VRAM_B]; + egc.patreg._b[1][ext] = mem[ad + VRAM_R]; + egc.patreg._b[2][ext] = mem[ad + VRAM_G]; + egc.patreg._b[3][ext] = mem[ad + VRAM_E]; } if (!(egc.ope & 0x2000)) { int pl = (egc.fgbg >> 8) & 3; if (!(egc.ope & 0x400)) { - return(egc_src.b[pl][ext]); + return(egc_src._b[pl][ext]); } else { return(mem[ad + planead[pl]]); @@ -836,15 +1049,13 @@ BYTE MEMCALL egc_read(UINT32 addr) { } -void MEMCALL egc_write(UINT32 addr, BYTE value) { +void MEMCALL egc_write(UINT32 addr, REG8 value) { - DWORD ext; - WORD wvalue; + UINT ext; +const EGCQUAD *data; -// TRACE_("EGC write_byte", (WORD)(addr & 0x7fff)); - - addr &= 0x7fff; - ext = addr & 1; + addr = LOW15(addr); + ext = EGCADDR(addr & 1); if (!gdcs.access) { gdcs.grphdisp |= 1; vramupdate[addr] |= 0x01; @@ -855,69 +1066,69 @@ void MEMCALL egc_write(UINT32 addr, BYTE addr += VRAM_STEP; } if ((egc.ope & 0x0300) == 0x0200) { - egc.patreg.b[0][ext] = mem[addr + VRAM_B]; - egc.patreg.b[1][ext] = mem[addr + VRAM_R]; - egc.patreg.b[2][ext] = mem[addr + VRAM_G]; - egc.patreg.b[3][ext] = mem[addr + VRAM_E]; + egc.patreg._b[0][ext] = mem[addr + VRAM_B]; + egc.patreg._b[1][ext] = mem[addr + VRAM_R]; + egc.patreg._b[2][ext] = mem[addr + VRAM_G]; + egc.patreg._b[3][ext] = mem[addr + VRAM_E]; } - wvalue = (value << 8) | (value); // ver0.28/pr4 - if (!ext) { - gdc_ope(addr, wvalue, egc.func + 6); - } - else { - gdc_ope(addr, wvalue, egc.func + 6); - } - if (egc.mask2.b[ext]) { + data = egc_opeb(addr, value); + if (egc.mask2._b[ext]) { if (!(egc.access & 1)) { - mem[addr + VRAM_B] &= ~egc.mask2.b[ext]; - mem[addr + VRAM_B] |= data.b[0][ext] & egc.mask2.b[ext]; + mem[addr + VRAM_B] &= ~egc.mask2._b[ext]; + mem[addr + VRAM_B] |= data->_b[0][ext] & egc.mask2._b[ext]; } if (!(egc.access & 2)) { - mem[addr + VRAM_R] &= ~egc.mask2.b[ext]; - mem[addr + VRAM_R] |= data.b[1][ext] & egc.mask2.b[ext]; + mem[addr + VRAM_R] &= ~egc.mask2._b[ext]; + mem[addr + VRAM_R] |= data->_b[1][ext] & egc.mask2._b[ext]; } if (!(egc.access & 4)) { - mem[addr + VRAM_G] &= ~egc.mask2.b[ext]; - mem[addr + VRAM_G] |= data.b[2][ext] & egc.mask2.b[ext]; + mem[addr + VRAM_G] &= ~egc.mask2._b[ext]; + mem[addr + VRAM_G] |= data->_b[2][ext] & egc.mask2._b[ext]; } if (!(egc.access & 8)) { - mem[addr + VRAM_E] &= ~egc.mask2.b[ext]; - mem[addr + VRAM_E] |= data.b[3][ext] & egc.mask2.b[ext]; + mem[addr + VRAM_E] &= ~egc.mask2._b[ext]; + mem[addr + VRAM_E] |= data->_b[3][ext] & egc.mask2._b[ext]; } } } -UINT16 MEMCALL egc_read_w(UINT32 addr) { - - DWORD ad; +REG16 MEMCALL egc_read_w(UINT32 addr) { -// TRACE_("EGC read_word", (WORD)(addr & 0x7fff)); + UINT32 ad; if (!(addr & 1)) { if (gdcs.access) { addr += VRAM_STEP; } - ad = VRAM_POS(addr); - egc.lastvram.w[0] = *(WORD *)(&mem[ad + VRAM_B]); - egc.lastvram.w[1] = *(WORD *)(&mem[ad + VRAM_R]); - egc.lastvram.w[2] = *(WORD *)(&mem[ad + VRAM_G]); - egc.lastvram.w[3] = *(WORD *)(&mem[ad + VRAM_E]); + ad = VRAMADDRMASKEX(addr); + egc.lastvram.w[0] = *(UINT16 *)(&mem[ad + VRAM_B]); + egc.lastvram.w[1] = *(UINT16 *)(&mem[ad + VRAM_R]); + egc.lastvram.w[2] = *(UINT16 *)(&mem[ad + VRAM_G]); + egc.lastvram.w[3] = *(UINT16 *)(&mem[ad + VRAM_E]); // shift input if (!(egc.ope & 0x400)) { if (!(egc.sft & 0x1000)) { - *(WORD *)(egc.inptr + 0) = egc.lastvram.w[0]; - *(WORD *)(egc.inptr + 4) = egc.lastvram.w[1]; - *(WORD *)(egc.inptr + 8) = egc.lastvram.w[2]; - *(WORD *)(egc.inptr +12) = egc.lastvram.w[3]; + egc.inptr[ 0] = egc.lastvram._b[0][EGCADDR_L]; + egc.inptr[ 1] = egc.lastvram._b[0][EGCADDR_H]; + egc.inptr[ 4] = egc.lastvram._b[1][EGCADDR_L]; + egc.inptr[ 5] = egc.lastvram._b[1][EGCADDR_H]; + egc.inptr[ 8] = egc.lastvram._b[2][EGCADDR_L]; + egc.inptr[ 9] = egc.lastvram._b[2][EGCADDR_H]; + egc.inptr[12] = egc.lastvram._b[3][EGCADDR_L]; + egc.inptr[13] = egc.lastvram._b[3][EGCADDR_H]; shiftinput_incw(); } else { - *(WORD *)(egc.inptr - 1) = egc.lastvram.w[0]; - *(WORD *)(egc.inptr + 3) = egc.lastvram.w[1]; - *(WORD *)(egc.inptr + 7) = egc.lastvram.w[2]; - *(WORD *)(egc.inptr +11) = egc.lastvram.w[3]; + egc.inptr[-1] = egc.lastvram._b[0][EGCADDR_L]; + egc.inptr[ 0] = egc.lastvram._b[0][EGCADDR_H]; + egc.inptr[ 3] = egc.lastvram._b[1][EGCADDR_L]; + egc.inptr[ 4] = egc.lastvram._b[1][EGCADDR_H]; + egc.inptr[ 7] = egc.lastvram._b[2][EGCADDR_L]; + egc.inptr[ 8] = egc.lastvram._b[2][EGCADDR_H]; + egc.inptr[11] = egc.lastvram._b[3][EGCADDR_L]; + egc.inptr[12] = egc.lastvram._b[3][EGCADDR_H]; shiftinput_decw(); } } @@ -929,76 +1140,76 @@ UINT16 MEMCALL egc_read_w(UINT32 addr) { if (!(egc.ope & 0x2000)) { int pl = (egc.fgbg >> 8) & 3; if (!(egc.ope & 0x400)) { - return(egc_src.w[pl]); + return(LOADINTELWORD(egc_src._b[pl])); } else { - return(*(WORD *)(&mem[ad + planead[pl]])); + return(LOADINTELWORD(mem + ad + planead[pl])); } } - return(*(WORD *)(&mem[addr])); + return(LOADINTELWORD(mem + addr)); } else if (!(egc.sft & 0x1000)) { - WORD ret; + REG16 ret; ret = egc_read(addr); ret |= egc_read(addr+1) << 8; return(ret); } else { - WORD ret; + REG16 ret; ret = egc_read(addr+1) << 8; ret |= egc_read(addr); return(ret); } } -void MEMCALL egc_write_w(UINT32 addr, UINT16 value) { +void MEMCALL egc_write_w(UINT32 addr, REG16 value) { -// TRACE_("EGC write_word", (WORD)(addr & 0x7fff)); +const EGCQUAD *data; if (!(addr & 1)) { // word access - addr &= 0x7ffe; + addr = LOW15(addr); if (!gdcs.access) { gdcs.grphdisp |= 1; - *(WORD *)(&vramupdate[addr]) |= 0x0101; + *(UINT16 *)(vramupdate + addr) |= 0x0101; } else { gdcs.grphdisp |= 2; - *(WORD *)(&vramupdate[addr]) |= 0x0202; + *(UINT16 *)(vramupdate + addr) |= 0x0202; addr += VRAM_STEP; } if ((egc.ope & 0x0300) == 0x0200) { - egc.patreg.w[0] = *(WORD *)(&mem[addr + VRAM_B]); - egc.patreg.w[1] = *(WORD *)(&mem[addr + VRAM_R]); - egc.patreg.w[2] = *(WORD *)(&mem[addr + VRAM_G]); - egc.patreg.w[3] = *(WORD *)(&mem[addr + VRAM_E]); + egc.patreg.w[0] = *(UINT16 *)(&mem[addr + VRAM_B]); + egc.patreg.w[1] = *(UINT16 *)(&mem[addr + VRAM_R]); + egc.patreg.w[2] = *(UINT16 *)(&mem[addr + VRAM_G]); + egc.patreg.w[3] = *(UINT16 *)(&mem[addr + VRAM_E]); } - gdc_ope(addr, value, egc.func); + data = egc_opew(addr, value); if (egc.mask2.w) { if (!(egc.access & 1)) { - *(WORD *)(&mem[addr + VRAM_B]) &= ~egc.mask2.w; - *(WORD *)(&mem[addr + VRAM_B]) |= data.w[0] & egc.mask2.w; + *(UINT16 *)(&mem[addr + VRAM_B]) &= ~egc.mask2.w; + *(UINT16 *)(&mem[addr + VRAM_B]) |= data->w[0] & egc.mask2.w; } if (!(egc.access & 2)) { - *(WORD *)(&mem[addr + VRAM_R]) &= ~egc.mask2.w; - *(WORD *)(&mem[addr + VRAM_R]) |= data.w[1] & egc.mask2.w; + *(UINT16 *)(&mem[addr + VRAM_R]) &= ~egc.mask2.w; + *(UINT16 *)(&mem[addr + VRAM_R]) |= data->w[1] & egc.mask2.w; } if (!(egc.access & 4)) { - *(WORD *)(&mem[addr + VRAM_G]) &= ~egc.mask2.w; - *(WORD *)(&mem[addr + VRAM_G]) |= data.w[2] & egc.mask2.w; + *(UINT16 *)(&mem[addr + VRAM_G]) &= ~egc.mask2.w; + *(UINT16 *)(&mem[addr + VRAM_G]) |= data->w[2] & egc.mask2.w; } if (!(egc.access & 8)) { - *(WORD *)(&mem[addr + VRAM_E]) &= ~egc.mask2.w; - *(WORD *)(&mem[addr + VRAM_E]) |= data.w[3] & egc.mask2.w; + *(UINT16 *)(&mem[addr + VRAM_E]) &= ~egc.mask2.w; + *(UINT16 *)(&mem[addr + VRAM_E]) |= data->w[3] & egc.mask2.w; } } } else if (!(egc.sft & 0x1000)) { - egc_write(addr, (BYTE)value); - egc_write(addr+1, (BYTE)(value >> 8)); + egc_write(addr, (REG8)value); + egc_write(addr+1, (REG8)(value >> 8)); } else { - egc_write(addr+1, (BYTE)(value >> 8)); - egc_write(addr, (BYTE)value); + egc_write(addr+1, (REG8)(value >> 8)); + egc_write(addr, (REG8)value); } }