#include "cache_wrapper.h"\r
extern Uint32 *rgbTTLGDI;\r
\r
-void SetVram_200l(Uint8 *p)\r
-{\r
- vram_pb = p + 0;\r
- vram_pg = p + 0x10000;\r
- vram_pr = p + 0x8000;\r
-}\r
\r
-void SetVram_400l(Uint8 *p)\r
-{\r
- vram_pb = p + 0;\r
- vram_pg = p + 0x10000;\r
- vram_pr = p + 0x8000;\r
-}\r
-\r
-\r
-void CalcPalette_8colors(Uint32 index, Uint8 r, Uint8 g, Uint8 b, Uint8 a)\r
+void CalcPalette_8colors(uint32 *p, uint32 index, uint8 r, uint8 g, uint8 b, uint8 a)\r
{\r
Uint32 ds;\r
\r
ds = r<<24 + g<<16 + b<<8 + 255<<0;\r
#endif\r
_prefetch_data_write_permanent(rgbTTLGDI, sizeof(Uint32) * 8);\r
- rgbTTLGDI[index] = ds;\r
+ p[index] = ds;\r
}\r
\r
#if (__GNUC__ >= 4)\r
-static void getvram_8_vec(Uint32 addr, v8hi_t *cbuf)\r
+static void getvram_8_vec(uint8 *vram, Uint32 addr, v8hi_t *cbuf, uint32 offset, uint8 mask)\r
{\r
- uint8_t r, g, b;\r
-// volatile v4hi cbuf __attribute__((aligned(32)));\r
- /*\r
- * R,G,Bについて8bit単位で描画する。\r
- * 高速化…キャッシュヒット率の向上とVector演算(MMXetc)の速度効果を考慮して、\r
- * ループの廃止を同時に行う\r
- */\r
+ uint8 r = 0;\r
+ uint8 g = 0;\r
+ uint8 b = 0\r
+\r
+ g = vram[addr + offset * 2];\r
+ r = vram[addr + offset];\r
+ b = vram[addr];\r
+ cbuf->v = aPlanes[B0 + b] |\r
+ aPlanes[B1 + r] |\r
+ aPlanes[B2 + g];\r
+ return;\r
+}\r
\r
- g = vram_pg[addr];\r
- r = vram_pr[addr];\r
- b = vram_pb[addr];\r
+static inline scrntype putword8_vec_r(uint32 dat, uint8 *pal_r)\r
+{\r
+ scrntype d = 0;\r
\r
- cbuf->v = aPlanes[B0 + b] |\r
- aPlanes[B1 + r] |\r
- aPlanes[B2 + g];\r
- return;\r
+ d = pal_r[dat];\r
+ return d;\r
}\r
\r
-static inline void putword8_vec(Uint32 *disp, volatile v8hi_t c, Uint32 *pal)\r
+static inline scrntype putword8_vec_b(uint32 dat, uint8 *pal_b)\r
{\r
+ scrntype d = 0;\r
\r
- v8hi_t *dst = (v8hi_t *)disp;\r
- v8hi_t r1;\r
- \r
-// if(disp == NULL) return;\r
- //c.v = c.v & (v8si){7, 7, 7, 7, 7, 7, 7, 7};\r
- r1.i[0] = pal[c.i[0] & 7]; // ?!\r
- r1.i[1] = pal[c.i[1] & 7];\r
- r1.i[2] = pal[c.i[2] & 7];\r
- r1.i[3] = pal[c.i[3] & 7];\r
- r1.i[4] = pal[c.i[4] & 7];\r
- r1.i[5] = pal[c.i[5] & 7];\r
- r1.i[6] = pal[c.i[6] & 7];\r
- r1.i[7] = pal[c.i[7] & 7];\r
- dst->v = r1.v;\r
+ d = pal_b[dat];\r
+ return d;\r
}\r
\r
+static inline scrntype putword8_vec_g(uint32 dat, uint8 *pal_g)\r
+{\r
+ scrntype d = 0;\r
+\r
+ d = pal_g[dat];\r
+ return d;\r
+}\r
+\r
+\r
+static inline scrntype *putword8_vec(scrntype *disp, v8hi_t *c, Uint8 *pal_r, Uint8 *pal_g, Uint8 *pal_b, Uint8 *pal_l, uint8 mask)\r
+{\r
+ scrntype r[8], g[8], b[8];\r
+ int i;\r
+ uint32 *dat = (uint32 *)c;\r
+\r
+ *c = *c & (v8hi_t) {0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f};\r
+ \r
+ if((mask & 0x01) != 0) {\r
+ for(i = 0; i < 8; i++) b[i] = 0x00;\r
+ } else {\r
+ for(i = 0; i < 8; i++) b[i] = putword_vec_b(dat[i], pal_b);\r
+ }\r
+ \r
+ if((mask & 0x02) != 0) {\r
+ for(i = 0; i < 8; i++) r[i] = 0x00;\r
+ } else {\r
+ for(i = 0; i < 8; i++) r[i] = putword_vec_r(dat[i], pal_r);\r
+ }\r
+ \r
+ if((mask & 0x04) != 0) {\r
+ for(i = 0; i < 8; i++) g[i] = 0x00;\r
+ } else {\r
+ for(i = 0; i < 8; i++) g[i] = putword_vec_g(dat[i], pal_g);\r
+ }\r
+ \r
+ for(i = 0; i < 8; i++) disp[i] = RGB_COLOR(r[i], g[i], b[i]);\r
+ \r
+ return disp;\r
+} \r
#else\r
static inline void planeto8(Uint32 *c, uint8_t r, unit8_t g, uint8_t b)\r
{\r
mask >>= 1;\r
}\r
\r
-static void getvram_8(Uint32 addr, Uint32 *cbuf)\r
+static void getvram_8(uint32 addr, uint32 *cbuf, uint32 offset, uint8 mask)\r
{\r
- uint8_t r, g, b;\r
- /*\r
- * R,G,Bについて8bit単位で描画する。\r
- * 高速化…キャッシュヒット率の向上とVector演算(MMXetc)の速度効果を考慮して、\r
- * ループの廃止を同時に行う\r
- */\r
+ uint8 r = 0;\r
+ uint8 g = 0;\r
+ uint8 b = 0;\r
\r
- g = vram_pg[addr];\r
- r = vram_pr[addr];\r
- b = vram_pb[addr];\r
- planeto8(cbuf, r, g, b);\r
+ if((mask & 0x04) == 0) g = vram[addr + offset * 2];\r
+ if((mask & 0x02) == 0) r = vram[addr + offset];\r
+ if((mask & 0x01) == 0) b = vram[addr];\r
+ planeto8(cbuf, r, g, b);\r
\r
- return;\r
+ return;\r
}\r
\r
static inline void putword8(Uint32 *disp, Uint32 *c, Uint32 *pal)\r
\r
#endif // __GNUC__ >= 4\r
\r
-\r
-\r
-/*\r
- * 8x8のピースをVRAMから作成する:VramLockしない事に注意\r
- */\r
-void CreateVirtualVram8_1Pcs(Uint32 *p, int x, int y, int pitch, int mode)\r
-{\r
-#if (__GNUC__ >= 4) \r
- v8hi_t c;\r
- Uint32 *pal = (Uint32 *)rgbTTLGDI;\r
- Uint32 *disp = p;\r
- Uint32 addr;\r
-\r
- if((p == NULL) || (pal == NULL)) return;\r
- addr = y * 80 + x;\r
-\r
- // Loop廃止(高速化)\r
- if(aPlanes == NULL) {\r
- c.v = (v8si){0,0,0,0,0,0,0,0};\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
-// disp += pitch;\r
- return;\r
- } else {\r
- getvram_8_vec(addr, &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
-\r
- getvram_8_vec(addr , &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
-\r
- getvram_8_vec(addr, &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
-\r
- getvram_8_vec(addr , &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
-\r
- getvram_8_vec(addr, &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
-\r
- getvram_8_vec(addr, &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
-\r
- getvram_8_vec(addr, &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
-\r
- getvram_8_vec(addr, &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
-// addr += 80;\r
-// disp += pitch;\r
- }\r
-#else \r
- Uint32 c[8];\r
- Uint32 *pal = (Uint32 *)rgbTTLGDI;\r
- Uint8 *disp =(Uint8 *) p;\r
-\r
- if((p == NULL) || (pal == NULL)) return;\r
- addr = y * 80 + x;\r
-\r
- // Loop廃止(高速化)\r
- getvram_8(addr, c);\r
- putword8((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
- \r
- getvram_8(addr , c);\r
- putword8((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
- \r
- getvram_8(addr, c);\r
- putword8((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
- \r
- getvram_8(addr , c);\r
- putword8((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
- \r
- getvram_8(addr, c);\r
- putword8((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
- \r
- getvram_8(addr, c);\r
- putword8((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
- \r
- getvram_8(addr, c);\r
- putword8((Uint32 *)disp, c, pal);\r
- addr += 80;\r
- disp += pitch;\r
- \r
- getvram_8(addr, c);\r
- putword8((Uint32 *)disp, c, pal);\r
- // addr += 80;\r
- // disp += pitch;\r
- \r
-#endif \r
-}\r
-\r
/*\r
* ybegin - yendの行を変換する\r
*/\r
-void CreateVirtualVram8_Line(Uint32 *p, int ybegin, int yend, int mode)\r
+void CreateVirtualVram8_Line(uint8 *src, scrntype *p, int ybegin, uint32 offset, uint8 mask, uint8 *pal_r, uint8 *pal_g, uint8 *pal_b, uint8 *pal_l)\r
{\r
v8hi_t c;\r
- Uint32 *pal = (Uint32 *)rgbTTLGDI;\r
- Uint8 *disp =(Uint8 *) p;\r
+ uint8 *disp = (uint8 *)p;\r
Uint32 addr;\r
int pitch;\r
int xx;\r
int yy = ybegin;\r
\r
if((p == NULL) || (pal == NULL)) return;\r
- pitch = sizeof(Uint32) * 8;\r
+ pitch = sizeof(scrntype) * 8;\r
\r
// Loop廃止(高速化)\r
if(aPlanes == NULL) {\r
addr = yy * 80;\r
// disp = (Uint8 *)(&p[yy * 640]);\r
for(xx = 0; xx < (80 / 8); xx ++) { \r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
disp += pitch;\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
disp += pitch;\r
}\r
// }\r
addr = yy * 80;\r
// disp = (Uint8 *)(&p[yy * 640]);\r
for(xx = 0; xx < (80 / 8); xx++) { \r
- getvram_8_vec(addr, &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
- addr++;\r
+ getvram_8_vec(src, addr, &c, offset, mask);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
+ addr++;\r
disp += pitch;\r
\r
- getvram_8_vec(addr , &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ getvram_8_vec(src, addr , &c, offset, mask);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
addr++;\r
disp += pitch;\r
\r
- getvram_8_vec(addr, &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ getvram_8_vec(src, addr, &c, offset, mask);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
addr++;\r
disp += pitch;\r
\r
- getvram_8_vec(addr , &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ getvram_8_vec(src, addr , &c, offset, mask);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l); \r
addr++;\r
disp += pitch;\r
\r
- getvram_8_vec(addr, &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ getvram_8_vec(src, addr, &c, offset, mask);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
addr++;\r
disp += pitch;\r
\r
- getvram_8_vec(addr, &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ getvram_8_vec(src, addr, &c, offset, mask);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
addr++;\r
disp += pitch;\r
\r
- getvram_8_vec(addr, &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ getvram_8_vec(src, addr, &c, offset, mask);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
addr++;\r
disp += pitch;\r
\r
- getvram_8_vec(addr, &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ getvram_8_vec(src, addr, &c, offset, mask);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
addr++;\r
disp += pitch;\r
}\r
/*\r
* ybegin - yendの行を変換する\r
*/\r
-void CreateVirtualVram8_WindowedLine(Uint32 *p, int ybegin, int yend, int xbegin, int xend, int mode)\r
+void CreateVirtualVram8_WindowedLine(uint8 *vram_1, uint8 *vram_w, scrntype *p, int ybegin, int xbegin, int xend, uint32 offset, uint8 mask, uint8 *pal_r, uint8 *pal_g, uint8 *pal_b, uint8 *pal_l))\r
{\r
-#if (__GNUC__ >= 4) \r
v8hi_t c;\r
- Uint32 *pal = (Uint32 *)rgbTTLGDI;\r
Uint8 *disp =(Uint8 *) p;\r
Uint32 addr;\r
int pitch;\r
int yy = ybegin;\r
\r
if((p == NULL) || (pal == NULL)) return;\r
- pitch = sizeof(Uint32) * 8;\r
+ pitch = sizeof(scrntype) * 8;\r
xbegin = xbegin % 80;\r
xend = xend % 80;\r
ybegin = ybegin % 400;\r
addr = yy * 80 + xbegin;\r
disp = (Uint8 *)(&p[xbegin * 8]);\r
for(xx = xbegin; xx < xend; xx ++) { \r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
disp += pitch;\r
}\r
return;\r
} else {\r
+\r
addr = yy * 80 + xbegin;\r
- disp = (Uint8 *)(&p[xbegin * 8]);\r
+ disp = (uint8 *)p;\r
+ for(xx = 0; xx < xbegin; xx++) { \r
+ getvram_8_vec(vram_1, addr, &c, offset, mask);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
+ addr++;\r
+ disp += pitch;\r
+ }\r
+\r
+ disp = (uint8 *)(&p[xbegin * 8]);\r
for(xx = xbegin; xx < xend; xx++) { \r
- getvram_8_vec(addr, &c);\r
- putword8_vec((Uint32 *)disp, c, pal);\r
+ getvram_8_vec(vram_w, addr, &c, offset, mask);\r
+ putword8_vec((scrntype *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
+ addr++;\r
+ disp += pitch;\r
+ }\r
+ \r
+ disp = (uint8 *)(&p[xend * 8]);\r
+ for(xx = xend; xx < 80; xx++) { \r
+ getvram_8_vec(vram_1, addr, &c, offset, mask);\r
+ putword8_vec((Uint32 *)disp, &c, pal_r, pal_g, pal_b, pal_l);\r
addr++;\r
disp += pitch;\r
}\r
return;\r
}\r
- #else \r
- Uint32 c[8];\r
- Uint32 *pal = (Uint32 *)rgbTTLGDI;\r
- Uint8 *disp =(Uint8 *) p;\r
- int xx;\r
- int yy;\r
-\r
- if((p == NULL) || (pal == NULL)) return;\r
- pitch = sizeof(Uint32) * 8;\r
- for(yy = ybegin; yy < yend; yy++) { \r
- addr = y * 80 + xbegin;\r
- disp = (Uint8 *)(&p[yy * 640 + xbegin]);\r
- for(xx = xbegin; xx < xend; xx++) {\r
- getvram_8(addr, c);\r
- putword8((Uint32 *)disp, c, pal);\r
- addr++;\r
- disp += pitch;\r
- }\r
- }\r
-#endif \r
}\r
\r
-Api_Vram_FuncList api_vram8_generic = {\r
- CreateVirtualVram8_1Pcs,\r
- CreateVirtualVram8_Line,\r
- CreateVirtualVram8_WindowedLine\r
-};\r