OSDN Git Service

[VM][FM7][VRAM] Split around vram from display.cpp to vram.cpp .
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sat, 26 Sep 2015 16:26:15 +0000 (01:26 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sat, 26 Sep 2015 16:26:15 +0000 (01:26 +0900)
source/src/vm/fm7/CMakeLists.txt
source/src/vm/fm7/display.cpp
source/src/vm/fm7/vram.cpp [new file with mode: 0644]

index e6273d8..7941ebe 100644 (file)
@@ -4,6 +4,7 @@ message("* vm/fm7")
 
 set(VM_FM7_LIB_SRCS
        display.cpp
+       vram.cpp
        keyboard.cpp
        joystick.cpp
        sound.cpp
index 0a26714..c6e8542 100644 (file)
@@ -202,576 +202,9 @@ void DISPLAY::update_config()
        enter_display();
 }
 
-inline void DISPLAY::GETVRAM_8_200L(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
-{
-       register uint8 b, r, g;
-       register uint32 dot;
-       uint32 yoff_d;
-#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       int dpage = vram_display_block;
-#endif
-#if defined(_FM77AV_VARIANTS)
-       if(display_page == 1) { // Is this dirty?
-               yoff_d = offset_point_bank1;
-       } else {
-               yoff_d = offset_point;
-       }
-#else
-       yoff_d = offset_point;
-#endif 
-       yoff_d = (yoff + yoff_d) & 0x3fff;
-#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       if(window_inv) {
-               if(dpage == 0) {
-                       dpage = 1;
-               } else {
-                       dpage = 0;
-               }
-       }
-       if(dpage != 0) yoff_d += 0x18000;
-#endif
-       b = r = g = 0;
-#if defined(_FM77AV_VARIANTS)
-       if(display_page == 1) {
-               if(mask & 0x01) b = gvram[yoff_d + 0x0c000];
-               if(mask & 0x02) r = gvram[yoff_d + 0x10000];
-               if(mask & 0x04) g = gvram[yoff_d + 0x14000];
-       } else {
-               if(mask & 0x01) b = gvram[yoff_d + 0x00000];
-               if(mask & 0x02) r = gvram[yoff_d + 0x04000];
-               if(mask & 0x04) g = gvram[yoff_d + 0x08000];
-       }
-#else
-       if(mask & 0x01) b = gvram[yoff_d + 0x00000];
-       if(mask & 0x02) r = gvram[yoff_d + 0x04000];
-       if(mask & 0x04) g = gvram[yoff_d + 0x08000];
-#endif 
-       dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7);
-       p[0] = dpalette_pixel[dot];
-       dot = ((g & 0x40) >> 4) | ((r & 0x40) >> 5) | ((b & 0x40) >> 6);
-       p[1] = dpalette_pixel[dot];
-       dot = ((g & 0x20) >> 3) | ((r & 0x20) >> 4) | ((b & 0x20) >> 5);
-       p[2] = dpalette_pixel[dot];
-       dot = ((g & 0x10) >> 2) | ((r & 0x10) >> 3) | ((b & 0x10) >> 4);
-       p[3] = dpalette_pixel[dot];
-                                       
-       dot = ((g & 0x8) >> 1) | ((r & 0x8) >> 2) | ((b & 0x8) >> 3);
-       p[4] = dpalette_pixel[dot];
-       dot = (g & 0x4) | ((r & 0x4) >> 1) | ((b & 0x4) >> 2);
-       p[5] = dpalette_pixel[dot];
-       dot = ((g & 0x2) << 1) | (r & 0x2) | ((b & 0x2) >> 1);
-       p[6] = dpalette_pixel[dot];
-       dot = ((g & 0x1) << 2) | ((r & 0x1) << 1) | (b & 0x1);
-       p[7] = dpalette_pixel[dot];
-}
-
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
-inline void DISPLAY::GETVRAM_8_400L(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
-{
-       register uint8 b, r, g;
-       register uint32 dot;
-       uint32 yoff_d;
-# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       int dpage = vram_display_block;
-# endif
-       
-       if(display_page == 1) { // Is this dirty?
-               yoff_d = offset_point_bank1;
-       } else {
-               yoff_d = offset_point;
-       }
-       yoff_d = (yoff + (yoff_d << 1)) & 0x7fff;
-# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       if(window_inv) {
-               if(dpage == 0) {
-                       dpage = 1;
-               } else {
-                       dpage = 0;
-               }
-       }
-       if(dpage != 0) yoff_d += 0x18000;
-# endif
-       b = r = g = 0;
-       if(mask & 0x01) b = gvram[yoff_d + 0x00000];
-       if(mask & 0x02) r = gvram[yoff_d + 0x08000];
-       if(mask & 0x04) g = gvram[yoff_d + 0x10000];
-
-       dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7);
-       p[0] = dpalette_pixel[dot];
-       dot = ((g & 0x40) >> 4) | ((r & 0x40) >> 5) | ((b & 0x40) >> 6);
-       p[1] = dpalette_pixel[dot];
-       dot = ((g & 0x20) >> 3) | ((r & 0x20) >> 4) | ((b & 0x20) >> 5);
-       p[2] = dpalette_pixel[dot];
-       dot = ((g & 0x10) >> 2) | ((r & 0x10) >> 3) | ((b & 0x10) >> 4);
-       p[3] = dpalette_pixel[dot];
-                                       
-       dot = ((g & 0x8) >> 1) | ((r & 0x8) >> 2) | ((b & 0x8) >> 3);
-       p[4] = dpalette_pixel[dot];
-       dot = (g & 0x4) | ((r & 0x4) >> 1) | ((b & 0x4) >> 2);
-       p[5] = dpalette_pixel[dot];
-       dot = ((g & 0x2) << 1) | (r & 0x2) | ((b & 0x2) >> 1);
-       p[6] = dpalette_pixel[dot];
-       dot = ((g & 0x1) << 2) | ((r & 0x1) << 1) | (b & 0x1);
-       p[7] = dpalette_pixel[dot];
-}
-
-inline void DISPLAY::GETVRAM_256k(int yoff, scrntype *p, uint32 mask)
-{
-       register uint32 b3, r3, g3;
-       register uint32 b4, r4, g4;
-       register uint32 btmp, rtmp, gtmp;
-       
-       register scrntype b, r, g;
-       scrntype pixel;
-       uint32 yoff_d1, yoff_d2;
-       uint32 _bit;
-       int _shift;
-       int cp;
-       
-       r3 = g3 = b3 = 0;
-       r4 = g4 = b4 = 0;
-       r = g = b = 0;
-       
-       yoff_d1 = offset_point;
-       yoff_d2 = offset_point_bank1;
-       yoff_d1 = (yoff + yoff_d1) & 0x1fff;
-       yoff_d2 = (yoff + yoff_d2) & 0x1fff;
-       if(mask & 0x01) {
-               b3  = gvram[yoff_d1] << 24;
-               b3 |= gvram[yoff_d1 + 0x02000] << 16;
-               
-               b3 |= gvram[yoff_d2 + 0x0c000] << 8;
-               b3 |= gvram[yoff_d2 + 0x0e000] << 0;
-       
-               b4  = gvram[yoff_d1 + 0x18000] << 8;
-               b4 |= gvram[yoff_d1 + 0x1a000] << 0;
-       }
-       if(mask & 0x02) {
-               r3  = gvram[yoff_d1 + 0x04000] << 24;
-               r3 |= gvram[yoff_d1 + 0x06000] << 16;
-               r3 |= gvram[yoff_d2 + 0x10000] << 8;
-               r3 |= gvram[yoff_d2 + 0x12000] << 0;
-               r4  = gvram[yoff_d1 + 0x1c000] << 8;
-               r4 |= gvram[yoff_d1 + 0x1e000] << 0;
-       }
-
-       if(mask & 0x04) {
-               g3  = gvram[yoff_d1 + 0x08000] << 24;
-               g3 |= gvram[yoff_d1 + 0x0a000] << 16;
-               g3 |= gvram[yoff_d2 + 0x14000] << 8;
-               g3 |= gvram[yoff_d2 + 0x16000] << 0;
-               
-               g4  = gvram[yoff_d1 + 0x20000] << 8;
-               g4 |= gvram[yoff_d1 + 0x22000] << 0;
-       }
-       
-       cp = 0;
-       for(_shift = 7; _shift >= 0; _shift--) {
-               _bit = 0x01010101 << _shift;
-               r = g = b = 0;
-               if(mask & 0x01) {
-                       btmp = (b3 & _bit) >> _shift;
-                       b = (((btmp & (0x01 << 24)) != 0) ? 0x80 : 0) | (((btmp & (0x01 << 16)) != 0)? 0x40 : 0)
-                               | (((btmp & (0x01 << 8)) != 0) ? 0x20 : 0) | (((btmp & 0x01) != 0) ? 0x10   : 0);
-                       btmp = (b4 & _bit) >> _shift;
-                       b = b | (((btmp & (0x01 << 8)) != 0) ? 0x08 : 0) | (((btmp & 0x01) != 0) ? 0x04 : 0);
-               }
-               if(mask & 0x02) {
-                       rtmp = (r3 & _bit) >> _shift;
-                       r = ((rtmp & (0x01 << 24)) ? 0x80 : 0) | ((rtmp & (0x01 << 16)) ? 0x40 : 0)
-                               | ((rtmp & (0x01 << 8)) ? 0x20 : 0) | ((rtmp & 0x01) ? 0x10   : 0);
-                       rtmp = (r4 & _bit) >> _shift;
-                       r = r | ((rtmp & (0x01 << 8)) ? 0x08 : 0) | ((rtmp & 0x01) ? 0x04 : 0);
-               }
-               if(mask & 0x04) {
-                       gtmp = (g3 & _bit) >> _shift;
-                       g = ((gtmp & (0x01 << 24)) ? 0x80 : 0) | ((gtmp & (0x01 << 16)) ? 0x40 : 0)
-                               | ((gtmp & (0x01 << 8)) ? 0x20 : 0) | ((gtmp & 0x01) ? 0x10   : 0);
-                       gtmp = (g4 & _bit) >> _shift;
-                       g = g | ((gtmp & (0x01 << 8)) ? 0x08 : 0) | ((gtmp & 0x01) ? 0x04 : 0);
-               }
-       
-               pixel = RGB_COLOR(r, g, b);
-               p[cp] = pixel;
-               p[cp + 1] = pixel;
-               cp += 2;
-       }
-       
-}
-#endif
-
-#if defined(_FM77AV_VARIANTS)
-inline void DISPLAY::GETVRAM_4096(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
-{
-       register uint32 b3, r3, g3;
-       register scrntype b, r, g;
-       uint32 idx;;
-       scrntype pixel;
-       uint32 yoff_d1, yoff_d2;
-# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       int dpage = vram_display_block;
-# endif
-       
-       yoff_d1 = offset_point;
-       yoff_d2 = offset_point_bank1;
-       yoff_d1 = (yoff + yoff_d1) & 0x1fff;
-       yoff_d2 = (yoff + yoff_d2) & 0x1fff;
-# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       if(window_inv) {
-               if(dpage == 0) {
-                       dpage = 1;
-               } else {
-                       dpage = 0;
-               }
-       }
-       if(dpage != 0) {
-               yoff_d1 += 0x18000;
-               yoff_d2 += 0x18000;
-       }
-# endif
-
-       b3  = gvram[yoff_d1] << 24;
-       b3 |= gvram[yoff_d1 + 0x02000] << 16;
-       r3  = gvram[yoff_d1 + 0x04000] << 24;
-       r3 |= gvram[yoff_d1 + 0x06000] << 16;
-               
-       g3  = gvram[yoff_d1 + 0x08000] << 24;
-       g3 |= gvram[yoff_d1 + 0x0a000] << 16;
-               
-       b3 |= gvram[yoff_d2 + 0x0c000] << 8;
-       b3 |= gvram[yoff_d2 + 0x0e000] << 0;
-               
-       r3 |= gvram[yoff_d2 + 0x10000] << 8;
-       r3 |= gvram[yoff_d2 + 0x12000] << 0;
-       g3 |= gvram[yoff_d2 + 0x14000] << 8;
-       g3 |= gvram[yoff_d2 + 0x16000] << 0;
-   
-       g = ((g3 & (0x80 << 24)) ? 0x800 : 0) | ((g3 & (0x80 << 16)) ? 0x400 : 0) | ((g3 & (0x80 << 8)) ? 0x200 : 0) | ((g3 & 0x80) ? 0x100 : 0);
-       r = ((r3 & (0x80 << 24)) ? 0x80  : 0) | ((r3 & (0x80 << 16)) ? 0x40  : 0) | ((r3 & (0x80 << 8)) ? 0x20  : 0) | ((r3 & 0x80) ? 0x10  : 0);
-       b = ((b3 & (0x80 << 24)) ? 0x8   : 0) | ((b3 & (0x80 << 16)) ? 0x4   : 0) | ((b3 & (0x80 << 8)) ? 0x2   : 0) | ((b3 & 0x80) ? 0x1   : 0);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[0] = pixel;
-       p[1] = pixel;
-
-       
-       g = ((g3 & (0x40 << 24)) ? 0x800 : 0) | ((g3 & (0x40 << 16)) ? 0x400 : 0) | ((g3 & (0x40 << 8)) ? 0x200 : 0) | ((g3 & 0x40) ? 0x100 : 0);
-       r = ((r3 & (0x40 << 24)) ? 0x80  : 0) | ((r3 & (0x40 << 16)) ? 0x40  : 0) | ((r3 & (0x40 << 8)) ? 0x20  : 0) | ((r3 & 0x40) ? 0x10  : 0);
-       b = ((b3 & (0x40 << 24)) ? 0x8   : 0) | ((b3 & (0x40 << 16)) ? 0x4   : 0) | ((b3 & (0x40 << 8)) ? 0x2   : 0) | ((b3 & 0x40) ? 0x1   : 0);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[2] = pixel;
-       p[3] = pixel;
-
-       g = ((g3 & (0x20 << 24)) ? 0x800 : 0) | ((g3 & (0x20 << 16)) ? 0x400 : 0) | ((g3 & (0x20 << 8)) ? 0x200 : 0) | ((g3 & 0x20) ? 0x100 : 0);
-       r = ((r3 & (0x20 << 24)) ? 0x80  : 0) | ((r3 & (0x20 << 16)) ? 0x40  : 0) | ((r3 & (0x20 << 8)) ? 0x20  : 0) | ((r3 & 0x20) ? 0x10  : 0);
-       b = ((b3 & (0x20 << 24)) ? 0x8   : 0) | ((b3 & (0x20 << 16)) ? 0x4   : 0) | ((b3 & (0x20 << 8)) ? 0x2   : 0) | ((b3 & 0x20) ? 0x1   : 0);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[4] = pixel;
-       p[5] = pixel;
-
-       g = ((g3 & (0x10 << 24)) ? 0x800 : 0) | ((g3 & (0x10 << 16)) ? 0x400 : 0) | ((g3 & (0x10 << 8)) ? 0x200 : 0) | ((g3 & 0x10) ? 0x100 : 0);
-       r = ((r3 & (0x10 << 24)) ? 0x80  : 0) | ((r3 & (0x10 << 16)) ? 0x40  : 0) | ((r3 & (0x10 << 8)) ? 0x20  : 0) | ((r3 & 0x10) ? 0x10  : 0);
-       b = ((b3 & (0x10 << 24)) ? 0x8   : 0) | ((b3 & (0x10 << 16)) ? 0x4   : 0) | ((b3 & (0x10 << 8)) ? 0x2   : 0) | ((b3 & 0x10) ? 0x1   : 0);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[6] = pixel;
-       p[7] = pixel;
-
-
-       g = ((g3 & (0x8 << 24)) ? 0x800 : 0) | ((g3 & (0x8 << 16)) ? 0x400 : 0) | ((g3 & (0x8 << 8)) ? 0x200 : 0) | ((g3 & 0x8) ? 0x100 : 0);
-       r = ((r3 & (0x8 << 24)) ? 0x80  : 0) | ((r3 & (0x8 << 16)) ? 0x40  : 0) | ((r3 & (0x8 << 8)) ? 0x20  : 0) | ((r3 & 0x8) ? 0x10  : 0);
-       b = ((b3 & (0x8 << 24)) ? 0x8   : 0) | ((b3 & (0x8 << 16)) ? 0x4   : 0) | ((b3 & (0x8 << 8)) ? 0x2   : 0) | ((b3 & 0x8) ? 0x1   : 0);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[8] = pixel;
-       p[9] = pixel;
-
-       
-       g = ((g3 & (0x4 << 24)) ? 0x800 : 0) | ((g3 & (0x4 << 16)) ? 0x400 : 0) | ((g3 & (0x4 << 8)) ? 0x200 : 0) | ((g3 & 0x4) ? 0x100 : 0);
-       r = ((r3 & (0x4 << 24)) ? 0x80  : 0) | ((r3 & (0x4 << 16)) ? 0x40  : 0) | ((r3 & (0x4 << 8)) ? 0x20  : 0) | ((r3 & 0x4) ? 0x10  : 0);
-       b = ((b3 & (0x4 << 24)) ? 0x8   : 0) | ((b3 & (0x4 << 16)) ? 0x4   : 0) | ((b3 & (0x4 << 8)) ? 0x2   : 0) | ((b3 & 0x4) ? 0x1   : 0);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[10] = pixel;
-       p[11] = pixel;
-
-       g = ((g3 & (0x2 << 24)) ? 0x800 : 0) | ((g3 & (0x2 << 16)) ? 0x400 : 0) | ((g3 & (0x2 << 8)) ? 0x200 : 0) | ((g3 & 0x2) ? 0x100 : 0);
-       r = ((r3 & (0x2 << 24)) ? 0x80  : 0) | ((r3 & (0x2 << 16)) ? 0x40  : 0) | ((r3 & (0x2 << 8)) ? 0x20  : 0) | ((r3 & 0x2) ? 0x10  : 0);
-       b = ((b3 & (0x2 << 24)) ? 0x8   : 0) | ((b3 & (0x2 << 16)) ? 0x4   : 0) | ((b3 & (0x2 << 8)) ? 0x2   : 0) | ((b3 & 0x2) ? 0x1   : 0);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[12] = pixel;
-       p[13] = pixel;
-
-       g = ((g3 & (0x1 << 24)) ? 0x800 : 0) | ((g3 & (0x1 << 16)) ? 0x400 : 0) | ((g3 & (0x1 << 8)) ? 0x200 : 0) | ((g3 & 0x1) ? 0x100 : 0);
-       r = ((r3 & (0x1 << 24)) ? 0x80  : 0) | ((r3 & (0x1 << 16)) ? 0x40  : 0) | ((r3 & (0x1 << 8)) ? 0x20  : 0) | ((r3 & 0x1) ? 0x10  : 0);
-       b = ((b3 & (0x1 << 24)) ? 0x8   : 0) | ((b3 & (0x1 << 16)) ? 0x4   : 0) | ((b3 & (0x1 << 8)) ? 0x2   : 0) | ((b3 & 0x1) ? 0x1   : 0);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[14] = pixel;
-       p[15] = pixel;
-}
-#endif
-
-void DISPLAY::draw_screen()
-{
-       int y;
-       int x;
-       scrntype *p, *pp;
-       register int yoff;
-       register uint32 rgbmask;
-       uint16 wx_begin, wx_end, wy_low, wy_high;
-#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       {
-               wx_begin = window_xbegin;
-               wx_end   = window_xend;
-               wy_low   = window_low;
-               wy_high  = window_high;
-               bool _flag = window_opened; 
-               if((wx_begin < wx_end) && (wy_low < wy_high)) {
-                       window_opened = true;
-               } else {
-                       window_opened = false;
-               }
-               if(_flag != window_opened) vram_wrote = true;
-       }
-#endif 
-       if(!vram_wrote) return;
-       vram_wrote = false; 
-       if((display_mode == DISPLAY_MODE_8_400L) || (display_mode == DISPLAY_MODE_8_400L_TEXT) ||
-          (display_mode == DISPLAY_MODE_8_200L) || (display_mode == DISPLAY_MODE_8_200L_TEXT) ||
-          (display_mode == DISPLAY_MODE_4096) || (display_mode == DISPLAY_MODE_256k)) {
-       } else {
-               return;
-       }
-         // Set blank
-       if(!crt_flag) {
-               for(y = 0; y < 400; y++) {
-                       memset(emu->screen_buffer(y), 0x00, 640 * sizeof(scrntype));
-               }
-               return;
-       }
-       if(display_mode == DISPLAY_MODE_8_200L) {
-               yoff = 0;
-               rgbmask = ~multimode_dispmask;
-               for(y = 0; y < 400; y += 2) {
-                       p = emu->screen_buffer(y);
-                       pp = p;
-                       yoff = (y / 2) * 80;
-#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-                       if(window_opened && (wy_low <= y) && (wy_high > y)) {
-                                       for(x = 0; x < 80; x++) {
-                                               if((x >= wx_begin) && (x < wx_end)) {
-                                                       GETVRAM_8_200L(yoff, p, rgbmask, true);
-                                               } else {
-                                                       GETVRAM_8_200L(yoff, p, rgbmask, false);
-                                               }
-                                               p += 8;
-                                               yoff++;
-                                       }
-                       } else
-#endif
-                       {
-                               for(x = 0; x < 10; x++) {
-                                       GETVRAM_8_200L(yoff + 0, p, rgbmask, false);
-                                       p += 8;
-                                       
-                                       GETVRAM_8_200L(yoff + 1, p, rgbmask, false);
-                                       p += 8;
-                                       
-                                       GETVRAM_8_200L(yoff + 2, p, rgbmask, false);
-                                       p += 8;
-                                       
-                                       GETVRAM_8_200L(yoff + 3, p, rgbmask, false);
-                                       p += 8;
-                                       
-                                       GETVRAM_8_200L(yoff + 4, p, rgbmask, false);
-                                       p += 8;
-                                       
-                                       GETVRAM_8_200L(yoff + 5, p, rgbmask, false);
-                                       p += 8;
-                                               
-                                       GETVRAM_8_200L(yoff + 6, p, rgbmask, false);
-                                       p += 8;
-                         
-                                       GETVRAM_8_200L(yoff + 7, p, rgbmask, false);
-                                       p += 8;
-                                       yoff += 8;
-                               }
-                       }
-                       if(config.scan_line == 0) {
-                               memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
-                       } else {
-                               memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
-                       }
-               }
-               return;
-       }
-#if defined(_FM77AV_VARIANTS)
-       if(display_mode == DISPLAY_MODE_4096) {
-               uint32 mask = 0;
-               yoff = 0;
-               rgbmask = multimode_dispmask;
-               if((rgbmask & 0x01) == 0) mask = 0x00f;
-               if((rgbmask & 0x02) == 0) mask = mask | 0x0f0;
-               if((rgbmask & 0x04) == 0) mask = mask | 0xf00;
-               for(y = 0; y < 400; y += 2) {
-                       p = emu->screen_buffer(y);
-                       pp = p;
-                       yoff = y * (40 / 2);
-# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-                       if(window_opened && (wy_low <= y) && (wy_high > y)) {
-                                       for(x = 0; x < 40; x++) {
-                                               if((x >= wx_begin) && (x < wx_end)) {
-                                                       GETVRAM_4096(yoff, p, mask, true);
-                                               } else {
-                                                       GETVRAM_4096(yoff, p, mask, false);
-                                               }
-                                               p += 16;
-                                               yoff++;
-                                       }
-                       } else
-# endif
-                       {
-                               for(x = 0; x < 5; x++) {
-                                       GETVRAM_4096(yoff + 0, p, mask);
-                                       p += 16;
-                                       
-                                       GETVRAM_4096(yoff + 1, p, mask);
-                                       p += 16;
-                                       
-                                       GETVRAM_4096(yoff + 2, p, mask);
-                                       p += 16;
-                                       
-                                       GETVRAM_4096(yoff + 3, p, mask);
-                                       p += 16;
-                                       
-                                       GETVRAM_4096(yoff + 4, p, mask);
-                                       p += 16;
-                         
-                                       GETVRAM_4096(yoff + 5, p, mask);
-                                       p += 16;
-                                       
-                                       GETVRAM_4096(yoff + 6, p, mask);
-                                       p += 16;
-                                       
-                                       GETVRAM_4096(yoff + 7, p, mask);
-                                       p += 16;
-                                       yoff += 8;
-                               }
-                       }
-                       if(config.scan_line == 0) {
-                               memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
-                       } else {
-                               memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
-                       }
-               }
-               return;
-       }
-# if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       else if(display_mode == DISPLAY_MODE_8_400L) {
-               yoff = 0;
-               rgbmask = ~multimode_dispmask;
-               for(y = 0; y < 400; y++) {
-                       p = emu->screen_buffer(y);
-                       pp = p;
-                       yoff = y  * 80;
-#  if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-                       if(window_opened && (wy_low <= y) && (wy_high  > y)) {
-                               for(x = 0; x < 80; x++) {
-                                       if((x >= wx_begin) && (x < wx_end)) {
-                                               GETVRAM_8_400L(yoff, p, rgbmask, true);
-                                       } else {
-                                               GETVRAM_8_400L(yoff, p, rgbmask, false);
-                                       }
-                                       p += 8;
-                                       yoff++;
-                               }
-                       } else
-#  endif
-                       for(x = 0; x < 10; x++) {
-                         GETVRAM_8_400L(yoff + 0, p, rgbmask);
-                         p += 8;
-                         
-                         GETVRAM_8_400L(yoff + 1, p, rgbmask);
-                         p += 8;
-
-                         GETVRAM_8_400L(yoff + 2, p, rgbmask);
-                         p += 8;
-
-                         GETVRAM_8_400L(yoff + 3, p, rgbmask);
-                         p += 8;
-
-                         GETVRAM_8_400L(yoff + 4, p, rgbmask);
-                         p += 8;
-                         
-                         GETVRAM_8_400L(yoff + 5, p, rgbmask);
-                         p += 8;
-                         
-                         GETVRAM_8_400L(yoff + 6, p, rgbmask);
-                         p += 8;
-                         
-                         GETVRAM_8_400L(yoff + 7, p, rgbmask);
-                         p += 8;
-                         yoff += 8;
-                       }
-               }
-               return;
-       } else if(display_mode == DISPLAY_MODE_256k) {
-               rgbmask = ~multimode_dispmask;
-               for(y = 0; y < 400; y += 2) {
-                       p = emu->screen_buffer(y);
-                       pp = p;
-                       yoff = y * (40 / 2);
-                       {
-                               for(x = 0; x < 5; x++) {
-                                       GETVRAM_256k(yoff + 0, p, rgbmask);
-                                       p += 16;
-                                       
-                                       GETVRAM_256k(yoff + 1, p, rgbmask);
-                                       p += 16;
-                                       
-                                       GETVRAM_256k(yoff + 2, p, rgbmask);
-                                       p += 16;
-                                       
-                                       GETVRAM_256k(yoff + 3, p, rgbmask);
-                                       p += 16;
-                                       
-                                       GETVRAM_256k(yoff + 4, p, rgbmask);
-                                       p += 16;
-                         
-                                       GETVRAM_256k(yoff + 5, p, rgbmask);
-                                       p += 16;
-                                       
-                                       GETVRAM_256k(yoff + 6, p, rgbmask);
-                                       p += 16;
-                                       
-                                       GETVRAM_256k(yoff + 7, p, rgbmask);
-                                       p += 16;
-                                       yoff += 8;
-                               }
-                       }
-                       if(config.scan_line == 0) {
-                               memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
-                       } else {
-                               memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
-                       }
-               }
-               return;
-       }
-# endif // _FM77AV40
-#endif //_FM77AV_VARIANTS
-}
+/*
+ * Vram accessing functions moved to vram.cpp .
+ */
 
 void DISPLAY::do_irq(bool flag)
 {
@@ -1560,110 +993,9 @@ void DISPLAY::write_signal(int id, uint32 data, uint32 mask)
        }
 }
    
-
-
-uint8 DISPLAY::read_vram_8_200l(uint32 addr, uint32 offset)
-{
-       uint32 page_offset = 0;
-       uint32 pagemod;
-#if defined(_FM77AV_VARIANTS)
-       if(active_page != 0) {
-               page_offset = 0xc000;
-       }
-#endif
-# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       if(vram_active_block != 0) page_offset += 0x18000;
-# endif
-       pagemod = addr & 0xc000;
-       return gvram[(((addr + offset) & 0x3fff) | pagemod) + page_offset];
-}
-
-uint8 DISPLAY::read_vram_l4_400l(uint32 addr, uint32 offset)
-{
-#if defined(_FM77L4)
-       if(addr < 0x8000) {
-               if(workram) {
-                       raddr = addr & 0x3fff;
-                       if((multimode_accessmask & 0x04) == 0) {
-                               return gvram[0x8000 + (raddr + offset) & 0x7fff];
-                       }
-                       return 0xff;
-               }
-               pagemod = addr & 0x4000;
-               return gvram[((addr + offset) & mask) | pagemod];
-       } else if(addr < 0x9800) {
-               return textvram[addr & 0x0fff];
-       } else { // $9800-$bfff
-               return subrom_l4[addr - 0x9800];
-       }
-#endif
-       return 0xff;
-}
-
-uint8 DISPLAY::read_vram_8_400l(uint32 addr, uint32 offset)
-{
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       uint32 color = vram_bank & 0x03;
-       uint32 pagemod;
-       uint32 page_offset = 0;
-       uint32 raddr;
-       if(addr >= 0x8000) return 0xff;
-# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       if(vram_active_block != 0) page_offset += 0x18000;
-# endif
-       if(color > 2) color = 0;
-       pagemod = 0x8000 * color;
-       return gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset];
-#endif
-       return 0xff;
-}
-
-uint8 DISPLAY::read_vram_8_400l_direct(uint32 addr, uint32 offset)
-{
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       uint32 pagemod;
-       uint32 page_offset = 0;
-       uint32 raddr;
-       pagemod = addr & 0x18000;
-# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       //addr = addr % 0x18000;
-       if(vram_active_block != 0) page_offset += 0x18000;
-# endif
-       return gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset];
-#endif
-       return 0xff;
-}
-
-uint8 DISPLAY::read_vram_4096(uint32 addr, uint32 offset)
-{
-#if defined(_FM77AV_VARIANTS)
-       uint32 page_offset = 0;
-       uint32 pagemod;
-       uint32 color;
-       if(active_page != 0) {
-               page_offset = 0xc000;
-       }
-       pagemod = addr & 0xe000;
-# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       if(vram_active_block != 0) page_offset += 0x18000;
-# endif
-       return gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset];
-#endif
-       return 0xff;
-}
-
-uint8 DISPLAY::read_vram_256k(uint32 addr, uint32 offset)
-{
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       uint32 page_offset;
-       uint32 pagemod;
-       page_offset = 0xc000 * (vram_bank & 0x03);
-       pagemod = addr & 0xe000;
-       return gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset];
-#endif
-       return 0xff;
-}
-
+/*
+ * Vram accessing functions moved to vram.cpp .
+ */
 
 uint8 DISPLAY::read_mmio(uint32 addr)
 {
@@ -1914,115 +1246,9 @@ uint32 DISPLAY::read_data8(uint32 addr)
        return 0xff;
 }      
 
-
-void DISPLAY::write_vram_8_200l(uint32 addr, uint32 offset, uint32 data)
-{
-       uint32 page_offset = 0;
-       uint32 pagemod;
-       uint8 val8 = data & 0xff;
-#if defined(_FM77AV_VARIANTS)
-       if(active_page != 0) {
-               page_offset = 0xc000;
-       }
-#endif
-#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       if(vram_active_block) page_offset += 0x18000;
-#endif
-       pagemod = addr & 0xc000;
-       gvram[(((addr + offset) & 0x3fff) | pagemod) + page_offset] = val8;
-       vram_wrote = true;
-}
-
-void DISPLAY::write_vram_l4_400l(uint32 addr, uint32 offset, uint32 data)
-{
-#if defined(_FM77L4)
-       if(addr < 0x8000) {
-               if(workram) {
-                       raddr = addr & 0x3fff;
-                       if((multimode_accessmask & 0x04) == 0) {
-                               gvram[0x8000 + (raddr + offset) & 0x7fff] = (uint8)data;
-                       }
-                       return;
-               }
-               pagemod = addr & 0x4000;
-               gvram[((addr + offset) & mask) | pagemod] = (uint8)data;
-       } else if(addr < 0x9800) {
-         textvram[addr & 0x0fff] = (uint8)data;
-       } else { // $9800-$bfff
-               //return subrom_l4[addr - 0x9800];
-       }
-       return;
-#endif 
-}
-
-void DISPLAY::write_vram_8_400l(uint32 addr, uint32 offset, uint32 data)
-{
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       uint32 color = vram_bank & 0x03;
-       uint32 pagemod;
-       uint32 page_offset = 0;
-       uint32 raddr;
-       uint8 val8 = (uint8)(data & 0x00ff);
-       if(addr >= 0x8000) return;
-# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       if(vram_active_block != 0) page_offset += 0x18000;
-# endif   
-       if(color > 2) color = 0;
-       pagemod = 0x8000 * color;
-       //offset = (offset & 0x3fff) << 1;
-       gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset] = val8;
-       vram_wrote = true;
-#endif
-}
-
-void DISPLAY::write_vram_8_400l_direct(uint32 addr, uint32 offset, uint32 data)
-{
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       uint32 pagemod;
-       uint32 page_offset = 0;
-       uint32 raddr;
-       uint8 val8 = (uint8)(data & 0x00ff);
-       //offset = offset & 0x7fff;
-       pagemod = addr & 0x18000;
-# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       //addr = addr % 0x18000;
-       if(vram_active_block != 0) page_offset += 0x18000;
-# endif 
-       gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset] = val8;
-       vram_wrote = true;
-#endif
-}
-
-void DISPLAY::write_vram_4096(uint32 addr, uint32 offset, uint32 data)
-{
-#if defined(_FM77AV_VARIANTS)
-       uint32 page_offset = 0;
-       uint32 pagemod;
-       uint32 color;
-       if(active_page != 0) {
-               page_offset = 0xc000;
-       }
-       pagemod = addr & 0xe000;
-#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       if(vram_active_block != 0) page_offset += 0x18000;
-#endif
-       gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset] = (uint8)data;
-       vram_wrote = true;
-#endif
-}
-
-void DISPLAY::write_vram_256k(uint32 addr, uint32 offset, uint32 data)
-{
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       uint32 page_offset = 0;
-       uint32 pagemod;
-       page_offset = 0xc000 * (vram_bank & 0x03);
-       pagemod = addr & 0xe000;
-       gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset] = (uint8)(data & 0xff);
-       vram_wrote = true;
-       return;
-#endif
-}
+/*
+ * Vram accessing functions moved to vram.cpp .
+ */
 
 void DISPLAY::write_mmio(uint32 addr, uint32 data)
 {
diff --git a/source/src/vm/fm7/vram.cpp b/source/src/vm/fm7/vram.cpp
new file mode 100644 (file)
index 0000000..1099c8c
--- /dev/null
@@ -0,0 +1,791 @@
+/*
+ * Common source code project -> FM-7 -> Display -> Vram access
+ * (C) 2015 K.Ohta <whatisthis.sowhat _at_ gmail.com>
+ * History:
+ *  Sep 27, 2015 : Split from display.cpp .
+ */
+
+#include "fm7_display.h"
+
+uint8 DISPLAY::read_vram_8_200l(uint32 addr, uint32 offset)
+{
+       uint32 page_offset = 0;
+       uint32 pagemod;
+#if defined(_FM77AV_VARIANTS)
+       if(active_page != 0) {
+               page_offset = 0xc000;
+       }
+#endif
+# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       if(vram_active_block != 0) page_offset += 0x18000;
+# endif
+       pagemod = addr & 0xc000;
+       return gvram[(((addr + offset) & 0x3fff) | pagemod) + page_offset];
+}
+
+uint8 DISPLAY::read_vram_l4_400l(uint32 addr, uint32 offset)
+{
+#if defined(_FM77L4)
+       if(addr < 0x8000) {
+               if(workram) {
+                       raddr = addr & 0x3fff;
+                       if((multimode_accessmask & 0x04) == 0) {
+                               return gvram[0x8000 + (raddr + offset) & 0x7fff];
+                       }
+                       return 0xff;
+               }
+               pagemod = addr & 0x4000;
+               return gvram[((addr + offset) & mask) | pagemod];
+       } else if(addr < 0x9800) {
+               return textvram[addr & 0x0fff];
+       } else { // $9800-$bfff
+               return subrom_l4[addr - 0x9800];
+       }
+#endif
+       return 0xff;
+}
+
+uint8 DISPLAY::read_vram_8_400l(uint32 addr, uint32 offset)
+{
+#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       uint32 color = vram_bank & 0x03;
+       uint32 pagemod;
+       uint32 page_offset = 0;
+       uint32 raddr;
+       if(addr >= 0x8000) return 0xff;
+# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       if(vram_active_block != 0) page_offset += 0x18000;
+# endif
+       if(color > 2) color = 0;
+       pagemod = 0x8000 * color;
+       return gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset];
+#endif
+       return 0xff;
+}
+
+uint8 DISPLAY::read_vram_8_400l_direct(uint32 addr, uint32 offset)
+{
+#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       uint32 pagemod;
+       uint32 page_offset = 0;
+       uint32 raddr;
+       pagemod = addr & 0x18000;
+# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       //addr = addr % 0x18000;
+       if(vram_active_block != 0) page_offset += 0x18000;
+# endif
+       return gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset];
+#endif
+       return 0xff;
+}
+
+uint8 DISPLAY::read_vram_4096(uint32 addr, uint32 offset)
+{
+#if defined(_FM77AV_VARIANTS)
+       uint32 page_offset = 0;
+       uint32 pagemod;
+       uint32 color;
+       if(active_page != 0) {
+               page_offset = 0xc000;
+       }
+       pagemod = addr & 0xe000;
+# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       if(vram_active_block != 0) page_offset += 0x18000;
+# endif
+       return gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset];
+#endif
+       return 0xff;
+}
+
+uint8 DISPLAY::read_vram_256k(uint32 addr, uint32 offset)
+{
+#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       uint32 page_offset;
+       uint32 pagemod;
+       page_offset = 0xc000 * (vram_bank & 0x03);
+       pagemod = addr & 0xe000;
+       return gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset];
+#endif
+       return 0xff;
+}
+
+
+void DISPLAY::write_vram_8_200l(uint32 addr, uint32 offset, uint32 data)
+{
+       uint32 page_offset = 0;
+       uint32 pagemod;
+       uint8 val8 = data & 0xff;
+#if defined(_FM77AV_VARIANTS)
+       if(active_page != 0) {
+               page_offset = 0xc000;
+       }
+#endif
+#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       if(vram_active_block) page_offset += 0x18000;
+#endif
+       pagemod = addr & 0xc000;
+       gvram[(((addr + offset) & 0x3fff) | pagemod) + page_offset] = val8;
+       vram_wrote = true;
+}
+
+void DISPLAY::write_vram_l4_400l(uint32 addr, uint32 offset, uint32 data)
+{
+#if defined(_FM77L4)
+       if(addr < 0x8000) {
+               if(workram) {
+                       raddr = addr & 0x3fff;
+                       if((multimode_accessmask & 0x04) == 0) {
+                               gvram[0x8000 + (raddr + offset) & 0x7fff] = (uint8)data;
+                       }
+                       return;
+               }
+               pagemod = addr & 0x4000;
+               gvram[((addr + offset) & mask) | pagemod] = (uint8)data;
+       } else if(addr < 0x9800) {
+         textvram[addr & 0x0fff] = (uint8)data;
+       } else { // $9800-$bfff
+               //return subrom_l4[addr - 0x9800];
+       }
+       return;
+#endif 
+}
+
+void DISPLAY::write_vram_8_400l(uint32 addr, uint32 offset, uint32 data)
+{
+#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       uint32 color = vram_bank & 0x03;
+       uint32 pagemod;
+       uint32 page_offset = 0;
+       uint32 raddr;
+       uint8 val8 = (uint8)(data & 0x00ff);
+       if(addr >= 0x8000) return;
+# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       if(vram_active_block != 0) page_offset += 0x18000;
+# endif   
+       if(color > 2) color = 0;
+       pagemod = 0x8000 * color;
+       //offset = (offset & 0x3fff) << 1;
+       gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset] = val8;
+       vram_wrote = true;
+#endif
+}
+
+void DISPLAY::write_vram_8_400l_direct(uint32 addr, uint32 offset, uint32 data)
+{
+#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       uint32 pagemod;
+       uint32 page_offset = 0;
+       uint32 raddr;
+       uint8 val8 = (uint8)(data & 0x00ff);
+       //offset = offset & 0x7fff;
+       pagemod = addr & 0x18000;
+# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       //addr = addr % 0x18000;
+       if(vram_active_block != 0) page_offset += 0x18000;
+# endif 
+       gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset] = val8;
+       vram_wrote = true;
+#endif
+}
+
+void DISPLAY::write_vram_4096(uint32 addr, uint32 offset, uint32 data)
+{
+#if defined(_FM77AV_VARIANTS)
+       uint32 page_offset = 0;
+       uint32 pagemod;
+       uint32 color;
+       if(active_page != 0) {
+               page_offset = 0xc000;
+       }
+       pagemod = addr & 0xe000;
+#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       if(vram_active_block != 0) page_offset += 0x18000;
+#endif
+       gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset] = (uint8)data;
+       vram_wrote = true;
+#endif
+}
+
+void DISPLAY::write_vram_256k(uint32 addr, uint32 offset, uint32 data)
+{
+#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       uint32 page_offset = 0;
+       uint32 pagemod;
+       page_offset = 0xc000 * (vram_bank & 0x03);
+       pagemod = addr & 0xe000;
+       gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset] = (uint8)(data & 0xff);
+       vram_wrote = true;
+       return;
+#endif
+}
+
+inline void DISPLAY::GETVRAM_8_200L(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
+{
+       register uint8 b, r, g;
+       register uint32 dot;
+       uint32 yoff_d;
+#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       int dpage = vram_display_block;
+#endif
+#if defined(_FM77AV_VARIANTS)
+       if(display_page == 1) { // Is this dirty?
+               yoff_d = offset_point_bank1;
+       } else {
+               yoff_d = offset_point;
+       }
+#else
+       yoff_d = offset_point;
+#endif 
+       yoff_d = (yoff + yoff_d) & 0x3fff;
+#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       if(window_inv) {
+               if(dpage == 0) {
+                       dpage = 1;
+               } else {
+                       dpage = 0;
+               }
+       }
+       if(dpage != 0) yoff_d += 0x18000;
+#endif
+       b = r = g = 0;
+#if defined(_FM77AV_VARIANTS)
+       if(display_page == 1) {
+               if(mask & 0x01) b = gvram[yoff_d + 0x0c000];
+               if(mask & 0x02) r = gvram[yoff_d + 0x10000];
+               if(mask & 0x04) g = gvram[yoff_d + 0x14000];
+       } else {
+               if(mask & 0x01) b = gvram[yoff_d + 0x00000];
+               if(mask & 0x02) r = gvram[yoff_d + 0x04000];
+               if(mask & 0x04) g = gvram[yoff_d + 0x08000];
+       }
+#else
+       if(mask & 0x01) b = gvram[yoff_d + 0x00000];
+       if(mask & 0x02) r = gvram[yoff_d + 0x04000];
+       if(mask & 0x04) g = gvram[yoff_d + 0x08000];
+#endif 
+       dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7);
+       p[0] = dpalette_pixel[dot];
+       dot = ((g & 0x40) >> 4) | ((r & 0x40) >> 5) | ((b & 0x40) >> 6);
+       p[1] = dpalette_pixel[dot];
+       dot = ((g & 0x20) >> 3) | ((r & 0x20) >> 4) | ((b & 0x20) >> 5);
+       p[2] = dpalette_pixel[dot];
+       dot = ((g & 0x10) >> 2) | ((r & 0x10) >> 3) | ((b & 0x10) >> 4);
+       p[3] = dpalette_pixel[dot];
+                                       
+       dot = ((g & 0x8) >> 1) | ((r & 0x8) >> 2) | ((b & 0x8) >> 3);
+       p[4] = dpalette_pixel[dot];
+       dot = (g & 0x4) | ((r & 0x4) >> 1) | ((b & 0x4) >> 2);
+       p[5] = dpalette_pixel[dot];
+       dot = ((g & 0x2) << 1) | (r & 0x2) | ((b & 0x2) >> 1);
+       p[6] = dpalette_pixel[dot];
+       dot = ((g & 0x1) << 2) | ((r & 0x1) << 1) | (b & 0x1);
+       p[7] = dpalette_pixel[dot];
+}
+
+#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
+inline void DISPLAY::GETVRAM_8_400L(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
+{
+       register uint8 b, r, g;
+       register uint32 dot;
+       uint32 yoff_d;
+# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       int dpage = vram_display_block;
+# endif
+       
+       if(display_page == 1) { // Is this dirty?
+               yoff_d = offset_point_bank1;
+       } else {
+               yoff_d = offset_point;
+       }
+       yoff_d = (yoff + (yoff_d << 1)) & 0x7fff;
+# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       if(window_inv) {
+               if(dpage == 0) {
+                       dpage = 1;
+               } else {
+                       dpage = 0;
+               }
+       }
+       if(dpage != 0) yoff_d += 0x18000;
+# endif
+       b = r = g = 0;
+       if(mask & 0x01) b = gvram[yoff_d + 0x00000];
+       if(mask & 0x02) r = gvram[yoff_d + 0x08000];
+       if(mask & 0x04) g = gvram[yoff_d + 0x10000];
+
+       dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7);
+       p[0] = dpalette_pixel[dot];
+       dot = ((g & 0x40) >> 4) | ((r & 0x40) >> 5) | ((b & 0x40) >> 6);
+       p[1] = dpalette_pixel[dot];
+       dot = ((g & 0x20) >> 3) | ((r & 0x20) >> 4) | ((b & 0x20) >> 5);
+       p[2] = dpalette_pixel[dot];
+       dot = ((g & 0x10) >> 2) | ((r & 0x10) >> 3) | ((b & 0x10) >> 4);
+       p[3] = dpalette_pixel[dot];
+                                       
+       dot = ((g & 0x8) >> 1) | ((r & 0x8) >> 2) | ((b & 0x8) >> 3);
+       p[4] = dpalette_pixel[dot];
+       dot = (g & 0x4) | ((r & 0x4) >> 1) | ((b & 0x4) >> 2);
+       p[5] = dpalette_pixel[dot];
+       dot = ((g & 0x2) << 1) | (r & 0x2) | ((b & 0x2) >> 1);
+       p[6] = dpalette_pixel[dot];
+       dot = ((g & 0x1) << 2) | ((r & 0x1) << 1) | (b & 0x1);
+       p[7] = dpalette_pixel[dot];
+}
+
+inline void DISPLAY::GETVRAM_256k(int yoff, scrntype *p, uint32 mask)
+{
+       register uint32 b3, r3, g3;
+       register uint32 b4, r4, g4;
+       register uint32 btmp, rtmp, gtmp;
+       
+       register scrntype b, r, g;
+       scrntype pixel;
+       uint32 yoff_d1, yoff_d2;
+       uint32 _bit;
+       int _shift;
+       int cp;
+       
+       r3 = g3 = b3 = 0;
+       r4 = g4 = b4 = 0;
+       r = g = b = 0;
+       
+       yoff_d1 = offset_point;
+       yoff_d2 = offset_point_bank1;
+       yoff_d1 = (yoff + yoff_d1) & 0x1fff;
+       yoff_d2 = (yoff + yoff_d2) & 0x1fff;
+       if(mask & 0x01) {
+               b3  = gvram[yoff_d1] << 24;
+               b3 |= gvram[yoff_d1 + 0x02000] << 16;
+               
+               b3 |= gvram[yoff_d2 + 0x0c000] << 8;
+               b3 |= gvram[yoff_d2 + 0x0e000] << 0;
+       
+               b4  = gvram[yoff_d1 + 0x18000] << 8;
+               b4 |= gvram[yoff_d1 + 0x1a000] << 0;
+       }
+       if(mask & 0x02) {
+               r3  = gvram[yoff_d1 + 0x04000] << 24;
+               r3 |= gvram[yoff_d1 + 0x06000] << 16;
+               r3 |= gvram[yoff_d2 + 0x10000] << 8;
+               r3 |= gvram[yoff_d2 + 0x12000] << 0;
+               r4  = gvram[yoff_d1 + 0x1c000] << 8;
+               r4 |= gvram[yoff_d1 + 0x1e000] << 0;
+       }
+
+       if(mask & 0x04) {
+               g3  = gvram[yoff_d1 + 0x08000] << 24;
+               g3 |= gvram[yoff_d1 + 0x0a000] << 16;
+               g3 |= gvram[yoff_d2 + 0x14000] << 8;
+               g3 |= gvram[yoff_d2 + 0x16000] << 0;
+               
+               g4  = gvram[yoff_d1 + 0x20000] << 8;
+               g4 |= gvram[yoff_d1 + 0x22000] << 0;
+       }
+       
+       cp = 0;
+       for(_shift = 7; _shift >= 0; _shift--) {
+               _bit = 0x01010101 << _shift;
+               r = g = b = 0;
+               if(mask & 0x01) {
+                       btmp = (b3 & _bit) >> _shift;
+                       b = (((btmp & (0x01 << 24)) != 0) ? 0x80 : 0) | (((btmp & (0x01 << 16)) != 0)? 0x40 : 0)
+                               | (((btmp & (0x01 << 8)) != 0) ? 0x20 : 0) | (((btmp & 0x01) != 0) ? 0x10   : 0);
+                       btmp = (b4 & _bit) >> _shift;
+                       b = b | (((btmp & (0x01 << 8)) != 0) ? 0x08 : 0) | (((btmp & 0x01) != 0) ? 0x04 : 0);
+               }
+               if(mask & 0x02) {
+                       rtmp = (r3 & _bit) >> _shift;
+                       r = ((rtmp & (0x01 << 24)) ? 0x80 : 0) | ((rtmp & (0x01 << 16)) ? 0x40 : 0)
+                               | ((rtmp & (0x01 << 8)) ? 0x20 : 0) | ((rtmp & 0x01) ? 0x10   : 0);
+                       rtmp = (r4 & _bit) >> _shift;
+                       r = r | ((rtmp & (0x01 << 8)) ? 0x08 : 0) | ((rtmp & 0x01) ? 0x04 : 0);
+               }
+               if(mask & 0x04) {
+                       gtmp = (g3 & _bit) >> _shift;
+                       g = ((gtmp & (0x01 << 24)) ? 0x80 : 0) | ((gtmp & (0x01 << 16)) ? 0x40 : 0)
+                               | ((gtmp & (0x01 << 8)) ? 0x20 : 0) | ((gtmp & 0x01) ? 0x10   : 0);
+                       gtmp = (g4 & _bit) >> _shift;
+                       g = g | ((gtmp & (0x01 << 8)) ? 0x08 : 0) | ((gtmp & 0x01) ? 0x04 : 0);
+               }
+       
+               pixel = RGB_COLOR(r, g, b);
+               p[cp] = pixel;
+               p[cp + 1] = pixel;
+               cp += 2;
+       }
+       
+}
+#endif
+
+#if defined(_FM77AV_VARIANTS)
+inline void DISPLAY::GETVRAM_4096(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
+{
+       register uint32 b3, r3, g3;
+       register scrntype b, r, g;
+       uint32 idx;;
+       scrntype pixel;
+       uint32 yoff_d1, yoff_d2;
+# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       int dpage = vram_display_block;
+# endif
+       
+       yoff_d1 = offset_point;
+       yoff_d2 = offset_point_bank1;
+       yoff_d1 = (yoff + yoff_d1) & 0x1fff;
+       yoff_d2 = (yoff + yoff_d2) & 0x1fff;
+# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       if(window_inv) {
+               if(dpage == 0) {
+                       dpage = 1;
+               } else {
+                       dpage = 0;
+               }
+       }
+       if(dpage != 0) {
+               yoff_d1 += 0x18000;
+               yoff_d2 += 0x18000;
+       }
+# endif
+
+       b3  = gvram[yoff_d1] << 24;
+       b3 |= gvram[yoff_d1 + 0x02000] << 16;
+       r3  = gvram[yoff_d1 + 0x04000] << 24;
+       r3 |= gvram[yoff_d1 + 0x06000] << 16;
+               
+       g3  = gvram[yoff_d1 + 0x08000] << 24;
+       g3 |= gvram[yoff_d1 + 0x0a000] << 16;
+               
+       b3 |= gvram[yoff_d2 + 0x0c000] << 8;
+       b3 |= gvram[yoff_d2 + 0x0e000] << 0;
+               
+       r3 |= gvram[yoff_d2 + 0x10000] << 8;
+       r3 |= gvram[yoff_d2 + 0x12000] << 0;
+       g3 |= gvram[yoff_d2 + 0x14000] << 8;
+       g3 |= gvram[yoff_d2 + 0x16000] << 0;
+   
+       g = ((g3 & (0x80 << 24)) ? 0x800 : 0) | ((g3 & (0x80 << 16)) ? 0x400 : 0) | ((g3 & (0x80 << 8)) ? 0x200 : 0) | ((g3 & 0x80) ? 0x100 : 0);
+       r = ((r3 & (0x80 << 24)) ? 0x80  : 0) | ((r3 & (0x80 << 16)) ? 0x40  : 0) | ((r3 & (0x80 << 8)) ? 0x20  : 0) | ((r3 & 0x80) ? 0x10  : 0);
+       b = ((b3 & (0x80 << 24)) ? 0x8   : 0) | ((b3 & (0x80 << 16)) ? 0x4   : 0) | ((b3 & (0x80 << 8)) ? 0x2   : 0) | ((b3 & 0x80) ? 0x1   : 0);
+          
+       idx = (g  | b | r ) & mask;
+       pixel = analog_palette_pixel[idx];
+       p[0] = pixel;
+       p[1] = pixel;
+
+       
+       g = ((g3 & (0x40 << 24)) ? 0x800 : 0) | ((g3 & (0x40 << 16)) ? 0x400 : 0) | ((g3 & (0x40 << 8)) ? 0x200 : 0) | ((g3 & 0x40) ? 0x100 : 0);
+       r = ((r3 & (0x40 << 24)) ? 0x80  : 0) | ((r3 & (0x40 << 16)) ? 0x40  : 0) | ((r3 & (0x40 << 8)) ? 0x20  : 0) | ((r3 & 0x40) ? 0x10  : 0);
+       b = ((b3 & (0x40 << 24)) ? 0x8   : 0) | ((b3 & (0x40 << 16)) ? 0x4   : 0) | ((b3 & (0x40 << 8)) ? 0x2   : 0) | ((b3 & 0x40) ? 0x1   : 0);
+          
+       idx = (g  | b | r ) & mask;
+       pixel = analog_palette_pixel[idx];
+       p[2] = pixel;
+       p[3] = pixel;
+
+       g = ((g3 & (0x20 << 24)) ? 0x800 : 0) | ((g3 & (0x20 << 16)) ? 0x400 : 0) | ((g3 & (0x20 << 8)) ? 0x200 : 0) | ((g3 & 0x20) ? 0x100 : 0);
+       r = ((r3 & (0x20 << 24)) ? 0x80  : 0) | ((r3 & (0x20 << 16)) ? 0x40  : 0) | ((r3 & (0x20 << 8)) ? 0x20  : 0) | ((r3 & 0x20) ? 0x10  : 0);
+       b = ((b3 & (0x20 << 24)) ? 0x8   : 0) | ((b3 & (0x20 << 16)) ? 0x4   : 0) | ((b3 & (0x20 << 8)) ? 0x2   : 0) | ((b3 & 0x20) ? 0x1   : 0);
+          
+       idx = (g  | b | r ) & mask;
+       pixel = analog_palette_pixel[idx];
+       p[4] = pixel;
+       p[5] = pixel;
+
+       g = ((g3 & (0x10 << 24)) ? 0x800 : 0) | ((g3 & (0x10 << 16)) ? 0x400 : 0) | ((g3 & (0x10 << 8)) ? 0x200 : 0) | ((g3 & 0x10) ? 0x100 : 0);
+       r = ((r3 & (0x10 << 24)) ? 0x80  : 0) | ((r3 & (0x10 << 16)) ? 0x40  : 0) | ((r3 & (0x10 << 8)) ? 0x20  : 0) | ((r3 & 0x10) ? 0x10  : 0);
+       b = ((b3 & (0x10 << 24)) ? 0x8   : 0) | ((b3 & (0x10 << 16)) ? 0x4   : 0) | ((b3 & (0x10 << 8)) ? 0x2   : 0) | ((b3 & 0x10) ? 0x1   : 0);
+          
+       idx = (g  | b | r ) & mask;
+       pixel = analog_palette_pixel[idx];
+       p[6] = pixel;
+       p[7] = pixel;
+
+
+       g = ((g3 & (0x8 << 24)) ? 0x800 : 0) | ((g3 & (0x8 << 16)) ? 0x400 : 0) | ((g3 & (0x8 << 8)) ? 0x200 : 0) | ((g3 & 0x8) ? 0x100 : 0);
+       r = ((r3 & (0x8 << 24)) ? 0x80  : 0) | ((r3 & (0x8 << 16)) ? 0x40  : 0) | ((r3 & (0x8 << 8)) ? 0x20  : 0) | ((r3 & 0x8) ? 0x10  : 0);
+       b = ((b3 & (0x8 << 24)) ? 0x8   : 0) | ((b3 & (0x8 << 16)) ? 0x4   : 0) | ((b3 & (0x8 << 8)) ? 0x2   : 0) | ((b3 & 0x8) ? 0x1   : 0);
+          
+       idx = (g  | b | r ) & mask;
+       pixel = analog_palette_pixel[idx];
+       p[8] = pixel;
+       p[9] = pixel;
+
+       
+       g = ((g3 & (0x4 << 24)) ? 0x800 : 0) | ((g3 & (0x4 << 16)) ? 0x400 : 0) | ((g3 & (0x4 << 8)) ? 0x200 : 0) | ((g3 & 0x4) ? 0x100 : 0);
+       r = ((r3 & (0x4 << 24)) ? 0x80  : 0) | ((r3 & (0x4 << 16)) ? 0x40  : 0) | ((r3 & (0x4 << 8)) ? 0x20  : 0) | ((r3 & 0x4) ? 0x10  : 0);
+       b = ((b3 & (0x4 << 24)) ? 0x8   : 0) | ((b3 & (0x4 << 16)) ? 0x4   : 0) | ((b3 & (0x4 << 8)) ? 0x2   : 0) | ((b3 & 0x4) ? 0x1   : 0);
+          
+       idx = (g  | b | r ) & mask;
+       pixel = analog_palette_pixel[idx];
+       p[10] = pixel;
+       p[11] = pixel;
+
+       g = ((g3 & (0x2 << 24)) ? 0x800 : 0) | ((g3 & (0x2 << 16)) ? 0x400 : 0) | ((g3 & (0x2 << 8)) ? 0x200 : 0) | ((g3 & 0x2) ? 0x100 : 0);
+       r = ((r3 & (0x2 << 24)) ? 0x80  : 0) | ((r3 & (0x2 << 16)) ? 0x40  : 0) | ((r3 & (0x2 << 8)) ? 0x20  : 0) | ((r3 & 0x2) ? 0x10  : 0);
+       b = ((b3 & (0x2 << 24)) ? 0x8   : 0) | ((b3 & (0x2 << 16)) ? 0x4   : 0) | ((b3 & (0x2 << 8)) ? 0x2   : 0) | ((b3 & 0x2) ? 0x1   : 0);
+          
+       idx = (g  | b | r ) & mask;
+       pixel = analog_palette_pixel[idx];
+       p[12] = pixel;
+       p[13] = pixel;
+
+       g = ((g3 & (0x1 << 24)) ? 0x800 : 0) | ((g3 & (0x1 << 16)) ? 0x400 : 0) | ((g3 & (0x1 << 8)) ? 0x200 : 0) | ((g3 & 0x1) ? 0x100 : 0);
+       r = ((r3 & (0x1 << 24)) ? 0x80  : 0) | ((r3 & (0x1 << 16)) ? 0x40  : 0) | ((r3 & (0x1 << 8)) ? 0x20  : 0) | ((r3 & 0x1) ? 0x10  : 0);
+       b = ((b3 & (0x1 << 24)) ? 0x8   : 0) | ((b3 & (0x1 << 16)) ? 0x4   : 0) | ((b3 & (0x1 << 8)) ? 0x2   : 0) | ((b3 & 0x1) ? 0x1   : 0);
+          
+       idx = (g  | b | r ) & mask;
+       pixel = analog_palette_pixel[idx];
+       p[14] = pixel;
+       p[15] = pixel;
+}
+#endif
+
+void DISPLAY::draw_screen()
+{
+       int y;
+       int x;
+       scrntype *p, *pp;
+       register int yoff;
+       register uint32 rgbmask;
+       uint16 wx_begin, wx_end, wy_low, wy_high;
+#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       {
+               wx_begin = window_xbegin;
+               wx_end   = window_xend;
+               wy_low   = window_low;
+               wy_high  = window_high;
+               bool _flag = window_opened; 
+               if((wx_begin < wx_end) && (wy_low < wy_high)) {
+                       window_opened = true;
+               } else {
+                       window_opened = false;
+               }
+               if(_flag != window_opened) vram_wrote = true;
+       }
+#endif 
+       if(!vram_wrote) return;
+       vram_wrote = false; 
+       if((display_mode == DISPLAY_MODE_8_400L) || (display_mode == DISPLAY_MODE_8_400L_TEXT) ||
+          (display_mode == DISPLAY_MODE_8_200L) || (display_mode == DISPLAY_MODE_8_200L_TEXT) ||
+          (display_mode == DISPLAY_MODE_4096) || (display_mode == DISPLAY_MODE_256k)) {
+       } else {
+               return;
+       }
+         // Set blank
+       if(!crt_flag) {
+               for(y = 0; y < 400; y++) {
+                       memset(emu->screen_buffer(y), 0x00, 640 * sizeof(scrntype));
+               }
+               return;
+       }
+       if(display_mode == DISPLAY_MODE_8_200L) {
+               yoff = 0;
+               rgbmask = ~multimode_dispmask;
+               for(y = 0; y < 400; y += 2) {
+                       p = emu->screen_buffer(y);
+                       pp = p;
+                       yoff = (y / 2) * 80;
+#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+                       if(window_opened && (wy_low <= y) && (wy_high > y)) {
+                                       for(x = 0; x < 80; x++) {
+                                               if((x >= wx_begin) && (x < wx_end)) {
+                                                       GETVRAM_8_200L(yoff, p, rgbmask, true);
+                                               } else {
+                                                       GETVRAM_8_200L(yoff, p, rgbmask, false);
+                                               }
+                                               p += 8;
+                                               yoff++;
+                                       }
+                       } else
+#endif
+                       {
+                               for(x = 0; x < 10; x++) {
+                                       GETVRAM_8_200L(yoff + 0, p, rgbmask, false);
+                                       p += 8;
+                                       
+                                       GETVRAM_8_200L(yoff + 1, p, rgbmask, false);
+                                       p += 8;
+                                       
+                                       GETVRAM_8_200L(yoff + 2, p, rgbmask, false);
+                                       p += 8;
+                                       
+                                       GETVRAM_8_200L(yoff + 3, p, rgbmask, false);
+                                       p += 8;
+                                       
+                                       GETVRAM_8_200L(yoff + 4, p, rgbmask, false);
+                                       p += 8;
+                                       
+                                       GETVRAM_8_200L(yoff + 5, p, rgbmask, false);
+                                       p += 8;
+                                               
+                                       GETVRAM_8_200L(yoff + 6, p, rgbmask, false);
+                                       p += 8;
+                         
+                                       GETVRAM_8_200L(yoff + 7, p, rgbmask, false);
+                                       p += 8;
+                                       yoff += 8;
+                               }
+                       }
+                       if(config.scan_line == 0) {
+                               memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
+                       } else {
+                               memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
+                       }
+               }
+               return;
+       }
+#if defined(_FM77AV_VARIANTS)
+       if(display_mode == DISPLAY_MODE_4096) {
+               uint32 mask = 0;
+               yoff = 0;
+               rgbmask = multimode_dispmask;
+               if((rgbmask & 0x01) == 0) mask = 0x00f;
+               if((rgbmask & 0x02) == 0) mask = mask | 0x0f0;
+               if((rgbmask & 0x04) == 0) mask = mask | 0xf00;
+               for(y = 0; y < 400; y += 2) {
+                       p = emu->screen_buffer(y);
+                       pp = p;
+                       yoff = y * (40 / 2);
+# if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+                       if(window_opened && (wy_low <= y) && (wy_high > y)) {
+                                       for(x = 0; x < 40; x++) {
+                                               if((x >= wx_begin) && (x < wx_end)) {
+                                                       GETVRAM_4096(yoff, p, mask, true);
+                                               } else {
+                                                       GETVRAM_4096(yoff, p, mask, false);
+                                               }
+                                               p += 16;
+                                               yoff++;
+                                       }
+                       } else
+# endif
+                       {
+                               for(x = 0; x < 5; x++) {
+                                       GETVRAM_4096(yoff + 0, p, mask);
+                                       p += 16;
+                                       
+                                       GETVRAM_4096(yoff + 1, p, mask);
+                                       p += 16;
+                                       
+                                       GETVRAM_4096(yoff + 2, p, mask);
+                                       p += 16;
+                                       
+                                       GETVRAM_4096(yoff + 3, p, mask);
+                                       p += 16;
+                                       
+                                       GETVRAM_4096(yoff + 4, p, mask);
+                                       p += 16;
+                         
+                                       GETVRAM_4096(yoff + 5, p, mask);
+                                       p += 16;
+                                       
+                                       GETVRAM_4096(yoff + 6, p, mask);
+                                       p += 16;
+                                       
+                                       GETVRAM_4096(yoff + 7, p, mask);
+                                       p += 16;
+                                       yoff += 8;
+                               }
+                       }
+                       if(config.scan_line == 0) {
+                               memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
+                       } else {
+                               memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
+                       }
+               }
+               return;
+       }
+# if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
+       else if(display_mode == DISPLAY_MODE_8_400L) {
+               yoff = 0;
+               rgbmask = ~multimode_dispmask;
+               for(y = 0; y < 400; y++) {
+                       p = emu->screen_buffer(y);
+                       pp = p;
+                       yoff = y  * 80;
+#  if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+                       if(window_opened && (wy_low <= y) && (wy_high  > y)) {
+                               for(x = 0; x < 80; x++) {
+                                       if((x >= wx_begin) && (x < wx_end)) {
+                                               GETVRAM_8_400L(yoff, p, rgbmask, true);
+                                       } else {
+                                               GETVRAM_8_400L(yoff, p, rgbmask, false);
+                                       }
+                                       p += 8;
+                                       yoff++;
+                               }
+                       } else
+#  endif
+                       for(x = 0; x < 10; x++) {
+                         GETVRAM_8_400L(yoff + 0, p, rgbmask);
+                         p += 8;
+                         
+                         GETVRAM_8_400L(yoff + 1, p, rgbmask);
+                         p += 8;
+
+                         GETVRAM_8_400L(yoff + 2, p, rgbmask);
+                         p += 8;
+
+                         GETVRAM_8_400L(yoff + 3, p, rgbmask);
+                         p += 8;
+
+                         GETVRAM_8_400L(yoff + 4, p, rgbmask);
+                         p += 8;
+                         
+                         GETVRAM_8_400L(yoff + 5, p, rgbmask);
+                         p += 8;
+                         
+                         GETVRAM_8_400L(yoff + 6, p, rgbmask);
+                         p += 8;
+                         
+                         GETVRAM_8_400L(yoff + 7, p, rgbmask);
+                         p += 8;
+                         yoff += 8;
+                       }
+               }
+               return;
+       } else if(display_mode == DISPLAY_MODE_256k) {
+               rgbmask = ~multimode_dispmask;
+               for(y = 0; y < 400; y += 2) {
+                       p = emu->screen_buffer(y);
+                       pp = p;
+                       yoff = y * (40 / 2);
+                       {
+                               for(x = 0; x < 5; x++) {
+                                       GETVRAM_256k(yoff + 0, p, rgbmask);
+                                       p += 16;
+                                       
+                                       GETVRAM_256k(yoff + 1, p, rgbmask);
+                                       p += 16;
+                                       
+                                       GETVRAM_256k(yoff + 2, p, rgbmask);
+                                       p += 16;
+                                       
+                                       GETVRAM_256k(yoff + 3, p, rgbmask);
+                                       p += 16;
+                                       
+                                       GETVRAM_256k(yoff + 4, p, rgbmask);
+                                       p += 16;
+                         
+                                       GETVRAM_256k(yoff + 5, p, rgbmask);
+                                       p += 16;
+                                       
+                                       GETVRAM_256k(yoff + 6, p, rgbmask);
+                                       p += 16;
+                                       
+                                       GETVRAM_256k(yoff + 7, p, rgbmask);
+                                       p += 16;
+                                       yoff += 8;
+                               }
+                       }
+                       if(config.scan_line == 0) {
+                               memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
+                       } else {
+                               memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
+                       }
+               }
+               return;
+       }
+# endif // _FM77AV40
+#endif //_FM77AV_VARIANTS
+}