--- np2/io/gdc_pset.c 2003/10/16 17:57:55 1.1 +++ np2/io/gdc_pset.c 2005/03/11 15:12:57 1.12 @@ -1,177 +1,174 @@ #include "compiler.h" -#include "memory.h" +#include "cpucore.h" #include "pccore.h" #include "iocore.h" +#include "memegc.h" +#include "gdc_sub.h" #include "gdc_pset.h" #include "vram.h" static void MEMCALL _nop(GDCPSET pset, UINT addr, UINT bit) { - pset->pattern = (pset->pattern << 1) + (pset->pattern >> 15); + (void)pset; (void)addr; (void)bit; } -static void MEMCALL _replace(GDCPSET pset, UINT addr, UINT bit) { +static void MEMCALL _replace0(GDCPSET pset, UINT addr, UINT bit) { - vramupdate[addr] |= pset->update; - if (pset->pattern & 0x8000) { - pset->pattern <<= 1; - pset->pattern++; - pset->base[addr] |= (0x80 >> bit); - } - else { - pset->pattern <<= 1; - pset->base[addr] &= ~(0x80 >> bit); - } + vramupdate[addr] |= pset->update.b[0]; + pset->base.ptr[addr] &= ~(0x80 >> bit); +} + +static void MEMCALL _replace1(GDCPSET pset, UINT addr, UINT bit) { + + vramupdate[addr] |= pset->update.b[0]; + pset->base.ptr[addr] |= (0x80 >> bit); } static void MEMCALL _complemnt(GDCPSET pset, UINT addr, UINT bit) { - if (pset->pattern & 0x8000) { - pset->pattern <<= 1; - pset->pattern++; - vramupdate[addr] |= pset->update; - pset->base[addr] ^= (0x80 >> bit); - } - else { - pset->pattern <<= 1; - } + vramupdate[addr] |= pset->update.b[0]; + pset->base.ptr[addr] ^= (0x80 >> bit); } static void MEMCALL _clear(GDCPSET pset, UINT addr, UINT bit) { - if (pset->pattern & 0x8000) { - pset->pattern <<= 1; - pset->pattern++; - vramupdate[addr] |= pset->update; - pset->base[addr] &= ~(0x80 >> bit); - } - else { - pset->pattern <<= 1; - } + vramupdate[addr] |= pset->update.b[0]; + pset->base.ptr[addr] &= ~(0x80 >> bit); } static void MEMCALL _set(GDCPSET pset, UINT addr, UINT bit) { - if (pset->pattern & 0x8000) { - pset->pattern <<= 1; - pset->pattern++; - vramupdate[addr] |= pset->update; - pset->base[addr] |= (0x80 >> bit); - } - else { - pset->pattern <<= 1; - } + vramupdate[addr] |= pset->update.b[0]; + pset->base.ptr[addr] |= (0x80 >> bit); } -static void MEMCALL _tdw(GDCPSET pset, UINT addr, UINT bit) { - BYTE *ptr; +// ---- grcg - if (pset->pattern & 0x8000) { - pset->pattern <<= 1; - pset->pattern++; - vramupdate[addr] |= pset->update; - ptr = pset->base + addr; - ptr[VRAM_B] = grcg.tile[0].b[0]; - ptr[VRAM_R] = grcg.tile[1].b[0]; - ptr[VRAM_G] = grcg.tile[2].b[0]; - ptr[VRAM_E] = grcg.tile[3].b[0]; - } - else { - pset->pattern <<= 1; - } +static void MEMCALL withtdw(GDCPSET pset, UINT addr, UINT bit) { + + UINT8 *ptr; + + addr &= ~1; + *(UINT16 *)(vramupdate + addr) |= pset->update.w; + ptr = pset->base.ptr + addr; + *(UINT16 *)(ptr + VRAM_B) = grcg.tile[0].w; + *(UINT16 *)(ptr + VRAM_R) = grcg.tile[1].w; + *(UINT16 *)(ptr + VRAM_G) = grcg.tile[2].w; + *(UINT16 *)(ptr + VRAM_E) = grcg.tile[3].w; (void)bit; } -static void MEMCALL _rmw(GDCPSET pset, UINT addr, UINT bit) { +static void MEMCALL withrmw(GDCPSET pset, UINT addr, UINT bit) { - BYTE *ptr; - BYTE data; - BYTE mask; - - if (pset->pattern & 0x8000) { - pset->pattern <<= 1; - pset->pattern++; - vramupdate[addr] |= pset->update; - ptr = pset->base + addr; - data = (0x80 >> bit); - mask = ~bit; - ptr[VRAM_B] &= mask; - ptr[VRAM_B] |= bit & grcg.tile[0].b[0]; - ptr[VRAM_R] &= mask; - ptr[VRAM_R] |= bit & grcg.tile[1].b[0]; - ptr[VRAM_G] &= mask; - ptr[VRAM_G] |= bit & grcg.tile[2].b[0]; - ptr[VRAM_E] &= mask; - ptr[VRAM_E] |= bit & grcg.tile[3].b[0]; - } - else { - pset->pattern <<= 1; + UINT8 *ptr; + UINT8 data; + UINT8 mask; + + vramupdate[addr] |= pset->update.b[0]; + ptr = pset->base.ptr + addr; + data = (0x80 >> bit); + mask = ~data; + ptr[VRAM_B] &= mask; + ptr[VRAM_B] |= data & grcg.tile[0].b[0]; + ptr[VRAM_R] &= mask; + ptr[VRAM_R] |= data & grcg.tile[1].b[0]; + ptr[VRAM_G] &= mask; + ptr[VRAM_G] |= data & grcg.tile[2].b[0]; + ptr[VRAM_E] &= mask; + ptr[VRAM_E] |= data & grcg.tile[3].b[0]; +} + + +// ---- egc + +static void MEMCALL withegc(GDCPSET pset, UINT addr, UINT bit) { + + REG16 data; + + data = (0x80 >> bit); + if (addr & 1) { + addr &= ~1; + data <<= 8; } + egc_writeword(pset->base.addr + addr, data); } -static const GDCPSFN psettbl[] = { - _replace, _complemnt, _clear, _set, - _replace, _complemnt, _clear, _set, - _tdw, _tdw, _nop, _tdw, - _rmw, _rmw, _nop, _rmw}; + +static const GDCPFN psettbl[4][2] = { + {_replace0, _replace1}, + {_nop, _complemnt}, + {_nop, _clear}, + {_nop, _set}}; // ---- -void MEMCALL gdcpset_prepare(GDCPSET pset, UINT32 csrw, UINT16 pat, BYTE op) { +void MEMCALL gdcpset_prepare(GDCPSET pset, UINT32 csrw, REG16 pat, REG8 op) { - BYTE *base; - BYTE update; + UINT8 *base; + UINT8 update; - base = mem; - if (!gdcs.access) { - update = 1; + if (vramop.operate & (1 << VOPBIT_EGC)) { + pset->func[0] = _nop; + pset->func[1] = withegc; + pset->base.addr = gdcplaneseg[(csrw >> 14) & 3]; } else { - base += VRAM_STEP; - update = 2; - } - op &= 3; - if (!(grcg.gdcwithgrcg & 0x8)) { - base += vramplaneseg[(csrw >> 14) & 3]; - } - else { - op += grcg.gdcwithgrcg; + base = mem; + if (!gdcs.access) { + update = 1; + } + else { + base += VRAM_STEP; + update = 2; + } + op &= 3; + if (!(grcg.gdcwithgrcg & 0x8)) { + pset->func[0] = psettbl[op][0]; + pset->func[1] = psettbl[op][1]; + pset->base.ptr = base + gdcplaneseg[(csrw >> 14) & 3]; + } + else { + pset->func[0] = _nop; + pset->func[1] = (grcg.gdcwithgrcg & 0x4)?withrmw:withtdw; + pset->base.ptr = base; + } + gdcs.grphdisp |= update; + pset->update.b[0] = update; + pset->update.b[1] = update; } - gdcs.grphdisp |= update; - pset->func = psettbl[op]; - pset->base = base; pset->pattern = pat; - pset->update = update; pset->x = (UINT16)((((csrw & 0x3fff) % 40) << 4) + ((csrw >> 20) & 0x0f)); pset->y = (UINT16)((csrw & 0x3fff) / 40); pset->dots = 0; } -void MEMCALL gdcpset(GDCPSET pset, UINT16 x, UINT16 y) { +void MEMCALL gdcpset(GDCPSET pset, REG16 x, REG16 y) { + UINT dot; + + dot = pset->pattern & 1; + pset->pattern = (pset->pattern >> 1) + (dot << 15); pset->dots++; + x = LOW16(x); + y = LOW16(y); if (y > 409) { - goto nopset; + return; } else if (y == 409) { if (x >= 384) { - goto nopset; + return; } } else { if (x >= 640) { - goto nopset; + return; } } - (*pset->func)(pset, (y * 80) + (x >> 3), x & 7); - return; - -nopset: - pset->pattern = (pset->pattern << 1) + (pset->pattern >> 15); + (*pset->func[dot])(pset, (y * 80) + (x >> 3), x & 7); }