OSDN Git Service

[VM][FM7][DISPLAY] Fix auto skip feature.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 15 Mar 2017 18:55:42 +0000 (03:55 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 15 Mar 2017 18:55:42 +0000 (03:55 +0900)
source/src/vm/fm7/display.cpp
source/src/vm/fm7/fm7_display.h
source/src/vm/fm7/vram.cpp

index 5ec0077..5fb6863 100644 (file)
@@ -88,6 +88,8 @@ void DISPLAY::reset_cpuonly()
        vram_wrote_shadow = true;
        for(i = 0; i < 411; i++) vram_wrote_table[i] = true;
        for(i = 0; i < 411; i++) vram_draw_table[i] = true;
+       write_access_page = 0;
+       for(i = 0; i < 411; i++) vram_wrote_pages[i] = write_access_page;
        displine = 0;
        active_page = 0;
        
@@ -168,7 +170,9 @@ void DISPLAY::reset_cpuonly()
 #endif
        vram_wrote = true;
        clr_count = 0;
-       frame_skip_count = 3;
+       frame_skip_count_draw = 3;
+       frame_skip_count_transfer = 3;
+       need_transfer_line = true;
 }
 
 
@@ -704,7 +708,6 @@ void DISPLAY::copy_vram_blank_area(void)
 {
 }
 
-
 void DISPLAY::copy_vram_per_line(void)
 {
        uint32_t src_offset;
@@ -720,6 +723,9 @@ void DISPLAY::copy_vram_per_line(void)
        uint32_t bytes_d1;
        uint32_t bytes_d2;
        uint32_t bytes_d;
+
+       uint32_t addr_d1, addr_d2;
+       
        int i, j, k;
        //int dline = (int)displine - 1;
        int dline = (int)displine;
@@ -738,38 +744,43 @@ void DISPLAY::copy_vram_per_line(void)
 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
                pages = 2;
 #endif
-               bytes_d1 = 0x2000 - ((src_offset + yoff_d1) & 0x1fff);
-               bytes_d2 = 0x2000 - ((src_offset + yoff_d2) & 0x1fff);
+               addr_d1 = (src_offset + yoff_d1) & 0x1fff;
+               addr_d2 = (src_offset + yoff_d2) & 0x1fff;
+               bytes_d1 = 0x2000 - addr_d1;
+               bytes_d2 = 0x2000 - addr_d2;
+               src_base = 0;
                for(k = 0; k < pages; k++) {
                        for(i = 0; i < 3; i++) {
                                for(j = 0; j < 2; j++) {
-                                       src_base = i * 0x4000 + j * 0x2000;
+                                       uint32_t _addr_base = src_base + src_offset + poff;
                                        if(bytes_d1 < 40) {
-                                               memcpy(&gvram_shadow[src_offset + src_base + poff],
-                                                          &gvram[((src_offset + yoff_d1) & 0x1fff) + src_base + poff],
+                                               memcpy(&gvram_shadow[_addr_base],
+                                                          &gvram[addr_d1 + src_base + poff],
                                                           bytes_d1);
-                                               memcpy(&gvram_shadow[src_offset + bytes_d1 + src_base + poff],
+                                               memcpy(&gvram_shadow[_addr_base + bytes_d1],
                                                           &gvram[src_base + poff],
                                                           40 - bytes_d1);
                                        } else {
-                                               memcpy(&gvram_shadow[src_offset + src_base + poff],
-                                                          &gvram[((src_offset + yoff_d1) & 0x1fff) + src_base + poff],
+                                               memcpy(&gvram_shadow[_addr_base],
+                                                          &gvram[addr_d1 + src_base + poff],
                                                           40);
                                        }
-                                       src_base = i * 0x4000 + j * 0x2000 + 0xc000;
+                                       _addr_base += 0xc000;
                                        if(bytes_d2 < 40) {
-                                               memcpy(&gvram_shadow[src_offset + src_base + poff],
-                                                          &gvram[((src_offset + yoff_d2) & 0x1fff) + src_base + poff],
+                                               memcpy(&gvram_shadow[_addr_base],
+                                                          &gvram[addr_d2 + src_base + poff + 0xc000],
                                                           bytes_d2);
-                                               memcpy(&gvram_shadow[src_offset + bytes_d2 + src_base + poff],
-                                                          &gvram[src_base + poff],
+                                               memcpy(&gvram_shadow[_addr_base + bytes_d2],
+                                                          &gvram[src_base + poff + 0xc000],
                                                           40 - bytes_d2);
                                        } else {
-                                               memcpy(&gvram_shadow[src_offset + src_base + poff],
-                                                          &gvram[((src_offset + yoff_d2) & 0x1fff) + src_base + poff],
+                                               memcpy(&gvram_shadow[_addr_base],
+                                                          &gvram[addr_d2 + src_base + poff + 0xc000],
                                                           40);
                                        }
+                                       src_base += 0x2000;
                                }
+                               src_base = (i + 1) * 0x4000;
                        }
                        poff += 0x18000;
                }
@@ -874,15 +885,15 @@ void DISPLAY::copy_vram_per_line(void)
                bytes_d1 = 0x4000 - ((src_offset + yoff_d1) & 0x3fff);
                bytes_d2 = 0x4000 - ((src_offset + yoff_d2) & 0x3fff);
                for(i = 0; i < pages; i++) {
+                       if((i & 1) == 0) {
+                               src_offset_d = src_offset_d1;
+                               bytes_d = bytes_d1;
+                       } else {
+                               src_offset_d = src_offset_d2;
+                               bytes_d = bytes_d2;
+                       }
+                       src_base = 0;
                        for(j = 0; j < 3; j++) {
-                               src_base = j * 0x4000;
-                               if((i & 1) == 0) {
-                                       src_offset_d = src_offset_d1;
-                                       bytes_d = bytes_d1;
-                               } else {
-                                       src_offset_d = src_offset_d2;
-                                       bytes_d = bytes_d2;
-                               }
                                if(bytes_d < 80) {
                                        memcpy(&gvram_shadow[src_offset + src_base + poff],
                                                   &gvram[src_offset_d + src_base + poff],
@@ -895,6 +906,7 @@ void DISPLAY::copy_vram_per_line(void)
                                                   &gvram[src_offset_d + src_base + poff],
                                                   80);
                                }
+                               src_base += 0x4000;
                        }
                        poff += 0xc000;
                }
@@ -1042,7 +1054,7 @@ void DISPLAY::copy_vram_all()
        }
 #endif
 }
-               
+
 // Timing values from XM7 . Thanks Ryu.
 void DISPLAY::event_callback(int event_id, int err)
 {
@@ -1083,11 +1095,11 @@ void DISPLAY::event_callback(int event_id, int err)
                                usec = 39.5;
                                if(displine < 200) f = true;
                        }
+                       if(displine == 0) register_event(this, EVENT_FM7SUB_HBLANK, usec, false, &hblank_event_id); // NEXT CYCLE_
                        if(f) {
                                if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) != 0) {
-                                       if(vram_wrote_table[displine] || vram_wrote) copy_vram_per_line();
+                                       if((vram_wrote_table[displine] || vram_wrote) && need_transfer_line/*|| vram_wrote */) copy_vram_per_line();
                                }
-                               register_event(this, EVENT_FM7SUB_HBLANK, usec, false, &hblank_event_id); // NEXT CYCLE_
                                vsync = false;
                                vblank = false;
                                enter_display();
@@ -1098,6 +1110,14 @@ void DISPLAY::event_callback(int event_id, int err)
                        hblank = true;
                        mainio->write_signal(SIG_DISPLAY_DISPLAY, 0x00, 0xff);
                        f = false;
+                       if(displine == 0) {
+                               if(display_mode == DISPLAY_MODE_8_400L) {
+                                       usec = 30.0 + 11.0;
+                               } else {
+                                       usec = 39.5 + 24.0;
+                               }
+                               register_event(this, EVENT_FM7SUB_HBLANK, usec, true, &hblank_event_id); // NEXT CYCLE_
+                       }
                        displine++;
                        if(display_mode == DISPLAY_MODE_8_400L) {
                                if((displine < 400)) f = true;
@@ -1112,7 +1132,9 @@ void DISPLAY::event_callback(int event_id, int err)
                                //}
                                //register_event(this, EVENT_FM7SUB_HDISP, usec, false, &hdisp_event_id);
                                cancel_event(this, hdisp_event_id);
+                               cancel_event(this, hblank_event_id);
                                hdisp_event_id = -1;
+                               hblank_event_id = -1;
                        }
                        //displine++;
                        break;
@@ -1122,7 +1144,6 @@ void DISPLAY::event_callback(int event_id, int err)
                        hblank = false;
                        displine = 0;
                        display_page_bak = display_page;
-                       
                        // Parameter from XM7/VM/display.c , thanks, Ryu.
                        mainio->write_signal(SIG_DISPLAY_DISPLAY, 0x00, 0xff);
                        mainio->write_signal(SIG_DISPLAY_VSYNC, 0x00, 0xff);
@@ -1157,6 +1178,7 @@ void DISPLAY::event_callback(int event_id, int err)
                vblank = true;
                hblank = false;
                vsync = true;
+               write_access_page = (write_access_page + 1) & 1;
                displine = 0;
                if(display_mode == DISPLAY_MODE_8_400L) {
                        usec = 0.33 * 1000.0; 
@@ -1167,34 +1189,40 @@ void DISPLAY::event_callback(int event_id, int err)
                mainio->write_signal(SIG_DISPLAY_DISPLAY, 0x00, 0xff);
                register_event(this, EVENT_FM7SUB_VSTART, usec, false, &vstart_event_id); // NEXT CYCLE_
                if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) == 0) {
-                       bool ff = false;
-                       if(!vram_wrote) {
-                               int lines = 200;
-                               if(display_mode == DISPLAY_MODE_8_400L) lines = 400;
-                               for(int yy = 0; yy < lines; yy++) {
-                                       if(vram_wrote_table[yy]) {
-                                               vram_wrote_table[yy] = false;
-                                               ff = true;
+                               bool ff = false;
+                               if(!vram_wrote) {
+                                       if(need_transfer_line) {
+                                               int lines = 200;
+                                               if(display_mode == DISPLAY_MODE_8_400L) lines = 400;
+                                               for(int yy = 0; yy < lines; yy++) {
+                                                       if(vram_wrote_table[yy]) {
+                                                               vram_wrote_table[yy] = false;
+                                                               ff = true;
+                                                       }
+                                               }
                                        }
+                               } else {
+                                       if(need_transfer_line) ff = true;
+                               }
+                               if(ff) {
+                                       for(int yy = 0; yy < 400; yy++) vram_draw_table[yy] = true;
+                                       copy_vram_all();
+                                       vram_wrote_shadow = true;
+                                       screen_update_flag = true;
+                                       vram_wrote = false;
                                }
-                       } else {
-                               ff = true;
-                       }
-                       if(ff) {
-                               for(int yy = 0; yy < 400; yy++) vram_draw_table[yy] = true;
-                               copy_vram_all();
-                               vram_wrote_shadow = true;
-                               screen_update_flag = true;
-                       }
                } else {
-                       if(vram_wrote) {
-                               for(int yy = 0; yy < 400; yy++) {
-                                       if(!vram_draw_table[yy]) {
-                                               displine = yy;
-                                               copy_vram_per_line();
+                       if(need_transfer_line) {
+                               if(vram_wrote) {
+                                       for(int yy = 0; yy < 400; yy++) {
+                                               if(!vram_draw_table[yy]) {
+                                                       displine = yy;
+                                                       copy_vram_per_line();
+                                               }
                                        }
+                                       displine = 0;
+                                       vram_wrote = false;
                                }
-                               displine = 0;
                        }
                        for(int yy = 0; yy < 400; yy++) {
                                if(vram_draw_table[yy]) {
@@ -1203,8 +1231,18 @@ void DISPLAY::event_callback(int event_id, int err)
                                        break;
                                }
                        }
+                       //vram_wrote = false;
+               }
+               frame_skip_count_transfer++;
+               {
+                       uint32_t factor = ((config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28) & 3;
+                       if((frame_skip_count_transfer > factor) /* || (vram_wrote) */) {
+                               frame_skip_count_transfer = 0;
+                               need_transfer_line = true;
+                       } else {
+                               need_transfer_line = false;
+                       }
                }
-               vram_wrote = false;
                break;
 #endif                 
        case EVENT_FM7SUB_CLR_BUSY:
@@ -1221,14 +1259,15 @@ void DISPLAY::event_frame()
 #if !defined(_FM77AV_VARIANTS) && !defined(_FM77L4)
        int yy;
        bool f = false;
-
-       if(vram_wrote) {
+       if(need_transfer_line && vram_wrote) {
                for(yy = 0; yy < 400; yy++) {
                        if(!vram_draw_table[yy]) {
                                displine = yy;
                                copy_vram_per_line();
                        }
                }
+               vram_wrote = false;
+               displine = 0;
        }
        {
                for(yy = 0; yy < 400; yy++) {
@@ -1242,16 +1281,27 @@ void DISPLAY::event_frame()
                        vram_wrote_shadow = true;
                }
        }
-       vram_wrote = false;
-       displine = 0;
        enter_display();
+       frame_skip_count_transfer++;
+       {
+               uint32_t factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
+               if(frame_skip_count_transfer > factor) {
+                       frame_skip_count_transfer = 0;
+                       need_transfer_line = true;
+               } else {
+                       need_transfer_line = false;
+                       displine = 0;
+                       //vram_wrote = false;
+               }
+       }
+       
 #endif 
 }
 
 void DISPLAY::event_vline(int v, int clock)
 {
 #if !defined(_FM77AV_VARIANTS) && !defined(_FM77L4)
-//     if((v >= 200) || (v < 0)) return;
+       if(need_transfer_line == false) return;
        displine = v;
        if(vram_wrote_table[displine] || vram_wrote) {
                copy_vram_per_line();
@@ -1395,7 +1445,8 @@ void DISPLAY::write_signal(int id, uint32_t data, uint32_t mask)
                                        alu->write_signal(SIG_ALU_X_WIDTH, (mode320 || mode256k) ? 40 :  80, 0xffff);
                                        alu->write_signal(SIG_ALU_Y_HEIGHT, (display_mode == DISPLAY_MODE_8_400L) ? 400 : 200, 0xffff);
                                        alu->write_signal(SIG_ALU_400LINE, (display_mode == DISPLAY_MODE_8_400L) ? 0xff : 0x00, 0xff);
-                                       frame_skip_count = 3;
+                                       frame_skip_count_draw = 3;
+                                       frame_skip_count_transfer = 3;
                                }
                        }
 #elif defined(_FM77_VARIANTS)
@@ -2413,7 +2464,10 @@ void DISPLAY::initialize()
        memset(work_ram, 0x00, sizeof(work_ram));
        memset(shared_ram, 0x00, sizeof(shared_ram));
        memset(subsys_c, 0xff, sizeof(subsys_c));
-   
+       need_transfer_line = true;
+       frame_skip_count_draw = 3;
+       frame_skip_count_transfer = 3;
+       
        diag_load_subrom_c = false;
 #if defined(_FM8)      
        if(read_bios(_T("SUBSYS_8.ROM"), subsys_c, 0x2800) >= 0x2800) diag_load_subrom_c = true;
@@ -2479,7 +2533,8 @@ void DISPLAY::initialize()
        nmi_event_id = -1;
        firq_mask = false;
        key_firq_req = false;   //firq_mask = true;
-       frame_skip_count = 3;
+       frame_skip_count_transfer = 3;
+       frame_skip_count_draw = 3;
        emu->set_vm_screen_size(640, 200, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
        palette_changed = true;
 #if !defined(_FM77AV_VARIANTS) && !defined(_FM77L4)
@@ -2493,7 +2548,7 @@ void DISPLAY::release()
 {
 }
 
-#define STATE_VERSION 7
+#define STATE_VERSION 8
 void DISPLAY::save_state(FILEIO *state_fio)
 {
        state_fio->FputUint32_BE(STATE_VERSION);
@@ -2631,7 +2686,6 @@ void DISPLAY::save_state(FILEIO *state_fio)
 #endif
                state_fio->FputBool(firq_mask);
                state_fio->FputBool(vram_accessflag);
-               state_fio->FputUint32_BE(frame_skip_count);
        }                       
 }
 
@@ -2787,7 +2841,9 @@ bool DISPLAY::load_state(FILEIO *state_fio)
 #endif
                firq_mask = state_fio->FgetBool();
                vram_accessflag = state_fio->FgetBool();
-               frame_skip_count = state_fio->FgetUint32_BE();
+               frame_skip_count_draw = 3;
+               frame_skip_count_transfer = 3;
+               need_transfer_line = true;
        }                       
        if(version == STATE_VERSION) return true;
        return false;
index 6323851..7273581 100644 (file)
 #include "fm7_common.h"
 
 
+#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
+#define __FM7_GVRAM_PAG_SIZE (0x8000 * 6)
+#elif defined(_FM77AV40)
+#define __FM7_GVRAM_PAG_SIZE (0x2000 * 18)
+#elif defined(_FM77AV_VARIANTS)
+#define __FM7_GVRAM_PAG_SIZE (0x2000 * 12)
+#else
+#define __FM7_GVRAM_PAG_SIZE (0x4000 * 3)
+#endif
+
 class DEVICE;
 class MC6809;
-
 class DISPLAY: public DEVICE
 {
 private:
@@ -104,10 +113,14 @@ protected:
        bool clock_fast;
        int display_mode;
        bool halt_flag;
-       int active_page;
+       int active_page; // GVRAM is Double-Buffer.
+       
        uint32_t prev_clock;
-       uint32_t frame_skip_count;
+       uint8_t frame_skip_count_draw;
+       uint8_t frame_skip_count_transfer;
+       bool need_transfer_line;
        bool palette_changed;
+       
        // Event handler
        int nmi_event_id;
 
@@ -205,21 +218,13 @@ protected:
 # endif
 #endif 
 
-#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
-       uint8_t gvram[0x8000 * 6];
-       uint8_t gvram_shadow[0x8000 * 6];
-       //uint8_t gvram_shadow2[0x8000 * 6];
-#elif defined(_FM77AV40)
-       uint8_t gvram[0x2000 * 18];
-       uint8_t gvram_shadow[0x2000 * 18];
-       //uint8_t gvram_shadow2[0x2000 * 18];
-#elif defined(_FM77AV_VARIANTS)
-       uint8_t gvram[0x2000 * 12];
-       uint8_t gvram_shadow[0x2000 * 12];
-#else
-       uint8_t gvram[0x4000 * 3];
-       uint8_t gvram_shadow[0x4000 * 3];
-#endif
+       // VRAM Write Page.
+       uint8_t  write_access_page;
+       
+       // ROM/RAM on Sub-System.
+       uint8_t gvram[__FM7_GVRAM_PAG_SIZE];
+       uint8_t gvram_shadow[__FM7_GVRAM_PAG_SIZE];
+       
        uint8_t console_ram[0x1000];
        uint8_t work_ram[0x380];
        uint8_t shared_ram[0x80];
@@ -249,7 +254,9 @@ protected:
        bool vram_wrote_shadow;
        bool vram_wrote_table[411];
        bool vram_draw_table[411];
-
+       uint8_t vram_wrote_pages[411];
+       uint32_t vram_wrote_addr_1[411];
+       uint32_t vram_wrote_addr_2[411];
 #if defined(_FM77AV_VARIANTS)
        bool use_alu;
        DEVICE *alu;
index eb54b5c..86f9f27 100644 (file)
@@ -355,7 +355,7 @@ void DISPLAY::GETVRAM_4096(int yoff, scrntype_t *p, uint32_t mask,
        uint32_t b3, r3, g3;
        uint8_t  bb[4], rr[4], gg[4];
        uint16_t pixels[8];
-       
+       uint16_t __masks[8] = {mask, mask, mask, mask, mask, mask, mask, mask};
        scrntype_t b, r, g;
        uint32_t idx;;
        scrntype_t pixel;
@@ -381,7 +381,6 @@ void DISPLAY::GETVRAM_4096(int yoff, scrntype_t *p, uint32_t mask,
                yoff_d2 += 0x18000;
        }
 # endif
-#if 1
        bb[0] = gvram_shadow[yoff_d1];
        bb[1] = gvram_shadow[yoff_d1 + 0x02000];
        rr[0] = gvram_shadow[yoff_d1 + 0x04000];
@@ -425,103 +424,14 @@ void DISPLAY::GETVRAM_4096(int yoff, scrntype_t *p, uint32_t mask,
                tmp_b[i]  = p0[i] | p1[i] | p2[i] | p3[i];
        }
        for(int i = 0; i < 8; i++) {
-               pixels[i] = (tmp_g[i] * 16) | tmp_r[i] | (tmp_b[i] / 16);
-       }
-       for(int i = 0; i < 8; i++) {
-               pixels[i] = pixels[i] & mask;
+               pixels[i] = ((tmp_g[i] * 16) | tmp_r[i] | (tmp_b[i] / 16)) & __masks[i];
        }
+       //for(int i = 0; i < 8; i++) {
+       //      pixels[i] = pixels[i] & mask;
+       //}
        for(int i = 0; i < 8; i++) {
                p[i] = analog_palette_pixel[pixels[i]];
        }
-#else
-       b3  = gvram_shadow[yoff_d1] << 24;
-       b3 |= gvram_shadow[yoff_d1 + 0x02000] << 16;
-       r3  = gvram_shadow[yoff_d1 + 0x04000] << 24;
-       r3 |= gvram_shadow[yoff_d1 + 0x06000] << 16;
-               
-       g3  = gvram_shadow[yoff_d1 + 0x08000] << 24;
-       g3 |= gvram_shadow[yoff_d1 + 0x0a000] << 16;
-               
-       b3 |= gvram_shadow[yoff_d2 + 0x0c000] << 8;
-       b3 |= gvram_shadow[yoff_d2 + 0x0e000] << 0;
-               
-       r3 |= gvram_shadow[yoff_d2 + 0x10000] << 8;
-       r3 |= gvram_shadow[yoff_d2 + 0x12000] << 0;
-       g3 |= gvram_shadow[yoff_d2 + 0x14000] << 8;
-       g3 |= gvram_shadow[yoff_d2 + 0x16000] << 0;
-   
-       g = ((g3 & (0x80 << 24)) >> 20) | ((g3 & (0x80 << 16)) >> 13) | ((g3 & (0x80 << 8)) >> 6)  | ((g3 & 0x80) << 1);
-       r = ((r3 & (0x80 << 24)) >> 24) | ((r3 & (0x80 << 16)) >> 17) | ((r3 & (0x80 << 8)) >> 10) | ((r3 & 0x80) >> 3);
-       b = ((b3 & (0x80 << 24)) >> 28) | ((b3 & (0x80 << 16)) >> 21) | ((b3 & (0x80 << 8)) >> 14) | ((b3 & 0x80) >> 7);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[0] = pixel;
-       //p[1] = pixel;
-
-       g = ((g3 & (0x40 << 24)) >> 19) | ((g3 & (0x40 << 16)) >> 12) | ((g3 & (0x40 << 8)) >> 5)  | ((g3 & 0x40) << 2);
-       r = ((r3 & (0x40 << 24)) >> 23) | ((r3 & (0x40 << 16)) >> 16) | ((r3 & (0x40 << 8)) >> 9)  | ((r3 & 0x40) >> 2);
-       b = ((b3 & (0x40 << 24)) >> 27) | ((b3 & (0x40 << 16)) >> 20) | ((b3 & (0x40 << 8)) >> 13) | ((b3 & 0x40) >> 6);
-       
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[1] = pixel;
-       //p[3] = pixel;
-
-       g = ((g3 & (0x20 << 24)) >> 18) | ((g3 & (0x20 << 16)) >> 11) | ((g3 & (0x20 << 8)) >> 4)  | ((g3 & 0x20) << 3);
-       r = ((r3 & (0x20 << 24)) >> 22) | ((r3 & (0x20 << 16)) >> 15) | ((r3 & (0x20 << 8)) >> 8)  | ((r3 & 0x20) >> 1);
-       b = ((b3 & (0x20 << 24)) >> 26) | ((b3 & (0x20 << 16)) >> 19) | ((b3 & (0x20 << 8)) >> 12) | ((b3 & 0x20) >> 5);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[2] = pixel;
-       //p[5] = pixel;
-
-       g = ((g3 & (0x10 << 24)) >> 17) | ((g3 & (0x10 << 16)) >> 10) | ((g3 & (0x10 << 8)) >> 3)  | ((g3 & 0x10) << 4);
-       r = ((r3 & (0x10 << 24)) >> 21) | ((r3 & (0x10 << 16)) >> 14) | ((r3 & (0x10 << 8)) >> 7)  | ((r3 & 0x10) >> 0);
-       b = ((b3 & (0x10 << 24)) >> 25) | ((b3 & (0x10 << 16)) >> 18) | ((b3 & (0x10 << 8)) >> 11) | ((b3 & 0x10) >> 4);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[3] = pixel;
-       //p[7] = pixel;
-
-       g = ((g3 & (0x8 << 24)) >> 16) | ((g3 & (0x8 << 16)) >> 9)  | ((g3 & (0x8 << 8)) >> 2)  | ((g3 & 0x8) << 5);
-       r = ((r3 & (0x8 << 24)) >> 20) | ((r3 & (0x8 << 16)) >> 13) | ((r3 & (0x8 << 8)) >> 6)  | ((r3 & 0x8) << 1);
-       b = ((b3 & (0x8 << 24)) >> 24) | ((b3 & (0x8 << 16)) >> 17) | ((b3 & (0x8 << 8)) >> 10) | ((b3 & 0x8) >> 3);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[4] = pixel;
-       //p[9] = pixel;
-
-       
-       g = ((g3 & (0x4 << 24)) >> 15) | ((g3 & (0x4 << 16)) >> 8)  | ((g3 & (0x4 << 8)) >> 1) | ((g3 & 0x4) << 6);
-       r = ((r3 & (0x4 << 24)) >> 19) | ((r3 & (0x4 << 16)) >> 12) | ((r3 & (0x4 << 8)) >> 5) | ((r3 & 0x4) << 2);
-       b = ((b3 & (0x4 << 24)) >> 23) | ((b3 & (0x4 << 16)) >> 16) | ((b3 & (0x4 << 8)) >> 9) | ((b3 & 0x4) >> 2);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[5] = pixel;
-       //p[11] = pixel;
-
-       g = ((g3 & (0x2 << 24)) >> 14) | ((g3 & (0x2 << 16)) >> 7)  | ((g3 & (0x2 << 8)) >> 0) | ((g3 & 0x2) << 7);
-       r = ((r3 & (0x2 << 24)) >> 18) | ((r3 & (0x2 << 16)) >> 11) | ((r3 & (0x2 << 8)) >> 4) | ((r3 & 0x2) << 3);
-       b = ((b3 & (0x2 << 24)) >> 22) | ((b3 & (0x2 << 16)) >> 15) | ((b3 & (0x2 << 8)) >> 8) | ((b3 & 0x2) >> 1);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[6] = pixel;
-       //p[13] = pixel;
-
-       g = ((g3 & (0x1 << 24)) >> 13) | ((g3 & (0x1 << 16)) >> 6)  | ((g3 & (0x1 << 8)) << 1) | ((g3 & 0x1) << 8);
-       r = ((r3 & (0x1 << 24)) >> 17) | ((r3 & (0x1 << 16)) >> 10) | ((r3 & (0x1 << 8)) >> 3) | ((r3 & 0x1) << 4);
-       b = ((b3 & (0x1 << 24)) >> 21) | ((b3 & (0x1 << 16)) >> 14) | ((b3 & (0x1 << 8)) >> 7) | ((b3 & 0x1) >> 0);
-          
-       idx = (g  | b | r ) & mask;
-       pixel = analog_palette_pixel[idx];
-       p[7] = pixel;
-#endif 
        //p[15] = pixel;
 }
 #endif
@@ -559,21 +469,12 @@ void DISPLAY::draw_screen2()
                if(_flag != window_opened) vram_wrote_shadow = true;
        }
 #endif
-       frame_skip_count++;
+//     frame_skip_count_draw++;
 #if defined(_FM77AV_VARIANTS)
-       {
-               uint32_t factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
-               if(frame_skip_count < factor) return;
-               frame_skip_count = 0;
-       }
        yoff_d2 = 0;
        yoff_d1 = 0;
 #else
-       {
-               uint32_t factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
-               if((frame_skip_count < factor) || !(vram_wrote_shadow)) return;
-               frame_skip_count = 0;
-       }
+       //if(!(vram_wrote_shadow)) return;
        yoff_d1 = yoff_d2 = offset_point;
 #endif
          // Set blank
@@ -604,9 +505,19 @@ void DISPLAY::draw_screen2()
                        }
                }
                crt_flag_bak = crt_flag;
+//             {
+//                     uint32_t factor = ((config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28) & 3;
+//                     if(frame_skip_count_draw < factor) return;
+//                     frame_skip_count_draw = 0;
+//             }
                return;
        }
        crt_flag_bak = crt_flag;
+//     {
+//             uint32_t factor = ((config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28) & 3;
+//             if(frame_skip_count_draw < factor) return;
+//             frame_skip_count_draw = 0;
+//     }
        if(!vram_wrote_shadow && !palette_changed) return;
        vram_wrote_shadow = false;
        if(palette_changed) {