OSDN Git Service

[VM][FM7][Draw] Implement 8colors mode.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Mon, 23 Feb 2015 15:42:31 +0000 (00:42 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Mon, 23 Feb 2015 15:42:31 +0000 (00:42 +0900)
source/src/vm/fm7/display.cpp
source/src/vm/fm7/fm7_display.h
source/src/vm/fm7/vram/generic/api_vram8.c

index e6a81f1..8bcc691 100644 (file)
@@ -7,3 +7,87 @@
 
 #include "fm7_display.h"
 
+extern "C" {
+
+  extern void initvramtbl_4096_vec(void);
+  extern void detachvramtbl_4096_vec(void);
+
+  extern void CreateVirtualVram8_Line(uint8 *src, uint32 *p, int ybegin, uint32 *pal);
+  extern void CreateVirtualVram8_WindowedLine(uint8 *vram_1, uint8 *vram_w, Uint32 *p, int ybegin, int xbegin, int xend, uint32 *pal);
+}
+
+DISPLAY::DISPLAY()
+{
+  initvramtbl_4096_vec();
+}
+
+void DISPLAY::getvram(uint32 *pvram, uint32 pitch)
+{
+  int y;
+  int height = (display_mode == DISPLAY_MODE_8_400L)? 400 : 200;
+  Uint32 *p;
+  Uint32 offset = 0x4000;
+  if(display_mode == DISPLAY_MODE_8_400L) offset = 0x8000;
+  
+  if((display_mode == DISPLAY_MODE_8_400L) || (display_mode == DISPLAY_MODE_8_200L)) {
+    for(y = 0; y < height; y++) {
+      p = &pvram[y * pitch];
+      if(((y < window_low) && (y > window_high)) || (!window_opened)) {
+       CreateVirtualVram8_Line(p, y, digital_palette, offset, multimode_dispmask);
+      } else {
+       CreateVirtualVram8_WindowedLine(p, y, window_xbegin, window_xbegin, digital_palette, offset, multimode_dispmask);
+      }
+    }
+  } else if(display_mode == DISPLAY_MODE_4096) {
+    for(y = 0; y < height; y++) {
+      p = &pvram[y * pitch];
+      if(((y < window_low) && (y > window_high)) || (!window_opened)) {
+       CreateVirtualVram4096_Line(p, y, analog_palette, multimode_dispmask);
+      } else {
+       CreateVirtualVram4096_WindowedLine(p, y, window_xbegin, window_xbegin, analog_palette, multimode_dispmask);
+      }
+    }
+  } else { // 256k
+    for(y = 0; y < height; y++) {
+      p = &pvram[y * pitch];
+      if(((y < window_low) && (y > window_high)) || (!window_opened)) {
+       CreateVirtualVram256k_Line(p, y, multimode_dispmask);
+      } else {
+       CreateVirtualVram256k_WindowedLine(p, y, window_xbegin, window_xbegin, multimode_dispmask);
+      }
+    }
+  }      
+}
+
+void set_multimode(uint8 val)
+{
+  multimode_accessmask = val & 0x0f;
+  multimode_dispmask = (val & 0xf0) >> 4;
+}
+
+uint8 get_multimode(void)
+{
+  uint8 val = multimode_acdcessmask & 0x0f;
+  val |= ((multimode_dispmask << 4) & 0xf0);
+  return val;
+}
+
+void set_dpalette(uint32 addr, uint8 val)
+{
+  addr &= 7;
+
+  dpalet[addr][0] = ((val & 0x01) != 0x00)? 0x01 : 0x00;
+  dpalet[addr][1] = ((val & 0x02) != 0x00)? 0x01 : 0x00;
+  dpalet[addr][2] = ((val & 0x04) != 0x00)? 0x01 : 0x00;
+  dpalet[addr][3] = ((val & 0x08) != 0x00)? 0x01 : 0x00;
+}
+
+uint8 get_dpalette(uint32 addr)
+{
+  uint8 data;
+  addr = addr & 7;
+
+  data = (dpalet[addr][0] & 0x01) | ((dpalet[addr][1] & 0x01) << 1) |
+         ((dpalet[addr][2] & 0x01) << 2) | ((dpalet[addr][3] & 0x01) << 3);
+  return data;
+}
index 8ad73b3..022e491 100644 (file)
@@ -47,18 +47,17 @@ class DISPLAY: public DEVICE
        
   
        uint32  disp_mode;
-       uint8 digital_palette[8];
+       uint8 digital_palette[8][4];
        uint8 multimode_dispmask;
        uint8 multimode_accessmask;
 #if defined(_FM77AV) || defined(_FM77AV40) || defined(_FM77AV40SX)|| defined(_FM77AV40SX)
-       uint8 analog_palette_r[4096];
-       uint8 analog_palette_g[4096];
-       uint8 analog_palette_b[4096];
+       uint8 analog_palette[4096][3];
 #endif // FM77AV etc...
 
        uint8 *vram_ptr;
        uint8 *tvram_ptr;
-
+       uint32 offset_point;
+       bool offset_77av;
  public:
        uint32 read_data8(uint32 addr){
          
index 6655df5..15db1ae 100644 (file)
 #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
@@ -36,49 +22,80 @@ void CalcPalette_8colors(Uint32 index, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
        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
@@ -103,21 +120,18 @@ static inline void planeto8(Uint32 *c, uint8_t r, unit8_t g, uint8_t b)
    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
@@ -137,150 +151,20 @@ static inline void  putword8(Uint32 *disp, Uint32 *c, Uint32 *pal)
 \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
@@ -289,21 +173,21 @@ void CreateVirtualVram8_Line(Uint32 *p, int ybegin, int yend, int mode)
            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
@@ -313,43 +197,43 @@ void CreateVirtualVram8_Line(Uint32 *p, int ybegin, int yend, int mode)
            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
@@ -362,11 +246,9 @@ void CreateVirtualVram8_Line(Uint32 *p, int ybegin, int yend, int mode)
 /*\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
@@ -374,7 +256,7 @@ void CreateVirtualVram8_WindowedLine(Uint32 *p, int ybegin, int yend, int xbegin
     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
@@ -385,45 +267,37 @@ void CreateVirtualVram8_WindowedLine(Uint32 *p, int ybegin, int yend, int xbegin
        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