OSDN Git Service

[VM}[FM7][PC8801][X1] At least enable to build FM7,PC8801 and X1 (excepts X!Twin).
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / mb61vh010.cpp
index 493b221..f330e15 100644 (file)
 
 #include "mb61vh010.h"
 
-uint8_t MB61VH010::do_read(uint32_t addr, uint32_t bank)
-{
-       uint32_t raddr;
-       
-       if(((1 << bank) & multi_page) != 0) return 0xff;
-       if(is_400line) {
-               if((addr & 0xffff) < 0x8000) {
-                       raddr = (addr  & 0x7fff) | (0x8000 * bank);
-                       return target->read_data8(raddr + direct_access_offset);
-               }
-       } else {
-               raddr = (addr & 0x3fff) | (0x4000 * bank);
-               return target->read_data8(raddr + direct_access_offset);
-       }
-       return 0xff;
-}
-
-void MB61VH010::do_write(uint32_t addr, uint32_t bank, uint8_t data)
-{
-       uint32_t raddr;
-       uint8_t readdata;
-
-       if(((1 << bank) & multi_page) != 0) return;
-       if((command_reg & 0x40) != 0) { // Calculate before writing
-               readdata = do_read(addr, bank);
-               //readdata = data;
-               if((command_reg & 0x20) != 0) { // NAND
-                       readdata = readdata & cmp_status_reg;
-                       data = data & (~cmp_status_reg);
-               } else { // AND
-                       readdata = readdata & (~cmp_status_reg);
-                       data = data & cmp_status_reg;
-               }
-               readdata = readdata | data;
-       } else {
-               readdata = data;
-       }
-       if(is_400line) {
-               if((addr & 0xffff) < 0x8000) {
-                       raddr = (addr & 0x7fff) | (0x8000 * bank);
-                       target->write_data8(raddr + direct_access_offset, readdata);
-               }
-       } else {
-               raddr = (addr & 0x3fff) | (0x4000 * bank);
-               target->write_data8(raddr + direct_access_offset, readdata);
-       }
-       return;
-}
-
 
 void MB61VH010::do_pset(uint32_t addr)
 {
        int i;
-       uint32_t raddr = addr;  // Use banked ram.
        uint8_t bitmask[4] = {0};
        uint8_t srcdata[4] = {0};
-       uint8_t mask_p[4] = {mask_reg, mask_reg, mask_reg, mask_reg};
-       int planes_b = planes;
+       const uint8_t mask_p[4] = {mask_reg, mask_reg, mask_reg, mask_reg};
+       uint32_t *pbm = (uint32_t *)bitmask;
+       uint32_t *pmp = (uint32_t *)mask_p;
+       uint32_t *psd = (uint32_t *)srcdata;
        
-       if(planes_b >= 4) planes_b = 4;
-       for(i = 0; i < planes_b; i++) {
-               if((bank_disable_reg & (1 << i)) != 0) {
-                       continue;
-               }
+       for(i = 0; i < 4; i++) { // planes
+               //if((bank_disable_reg & (1 << i)) != 0) {
+               if(disable_flags[i]) continue;
+               //}
                if((color_reg & (1 << i)) == 0) {
                        bitmask[i] = 0x00;
                } else {
                        bitmask[i] = ~mask_reg;
                }
-               //srcdata[i] = do_read(addr, i) & mask_reg;
                srcdata[i] = do_read(addr, i);
        }
-       srcdata[0] = (srcdata[0] & mask_p[0]) | bitmask[0];
-       srcdata[1] = (srcdata[1] & mask_p[1]) | bitmask[1];
-       srcdata[2] = (srcdata[2] & mask_p[2]) | bitmask[2];
-       srcdata[3] = (srcdata[3] & mask_p[3]) | bitmask[3];
-
-       for(i = 0; i < planes_b; i++) {
-               if((bank_disable_reg & (1 << i)) != 0) {
-                       continue;
-               }
+       *psd = (*psd & *pmp) | *pbm;
+       //srcdata[0] = (srcdata[0] & mask_p[0]) | bitmask[0];
+       //srcdata[1] = (srcdata[1] & mask_p[1]) | bitmask[1];
+       //srcdata[2] = (srcdata[2] & mask_p[2]) | bitmask[2];
+       //srcdata[3] = (srcdata[3] & mask_p[3]) | bitmask[3];
+
+       for(i = 0; i < 4; i++) {
+               if(disable_flags[i]) continue;
+               //if((bank_disable_reg & (1 << i)) != 0) {
+               //      continue;
+               //}
                do_write(addr, i, srcdata[i]);
        }
        return;
@@ -102,11 +54,12 @@ void MB61VH010::do_blank(uint32_t addr)
        uint32_t i;
        uint8_t srcdata;
 
-       if(planes >= 4) planes = 4;
-       for(i = 0; i < planes; i++) {
-               if((bank_disable_reg & (1 << i)) != 0) {
-                       continue;
-               }
+       //if(planes >= 4) planes = 4;
+       for(i = 0; i < 4; i++) {
+               if(disable_flags[i]) continue;
+               //if((bank_disable_reg & (1 << i)) != 0) {
+               //      continue;
+               //}
                srcdata = do_read(addr, i);
                srcdata = srcdata & mask_reg;
                do_write(addr, i, srcdata);
@@ -119,14 +72,19 @@ void MB61VH010::do_or(uint32_t addr)
        uint32_t i;
        uint8_t bitmask[4] = {0};
        uint8_t srcdata[4] = {0};
-       uint8_t mask_p[4] = {mask_reg, mask_reg, mask_reg, mask_reg};
-       uint8_t mask_n[4] = {(uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg};
+       const uint8_t mask_p[4] = {mask_reg, mask_reg, mask_reg, mask_reg};
+       const uint8_t mask_n[4] = {(uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg};
+       uint32_t *pbm = (uint32_t *)bitmask;
+       uint32_t *pmp = (uint32_t *)mask_p;
+       uint32_t *pmn = (uint32_t *)mask_n;
+       uint32_t *psd = (uint32_t *)srcdata;
        
-       if(planes >= 4) planes = 4;
-       for(i = 0; i < planes; i++) {
-               if((bank_disable_reg & (1 << i)) != 0) {
-                       continue;
-               }
+       //if(planes >= 4) planes = 4;
+       for(i = 0; i < 4; i++) {
+               if(disable_flags[i]) continue;
+               //if((bank_disable_reg & (1 << i)) != 0) {
+               //      continue;
+               //}
                srcdata[i] = do_read(addr, i);
                if((color_reg & (1 << i)) == 0) {
                        bitmask[i] = srcdata[i]; // srcdata | 0x00
@@ -137,14 +95,16 @@ void MB61VH010::do_or(uint32_t addr)
                //srcdata = (srcdata & mask_reg) | bitmask;
                //do_write(addr, i, srcdata);
        }
-       srcdata[0] = (srcdata[0] & mask_p[0]) | (bitmask[0] & mask_n[0]);
-       srcdata[1] = (srcdata[1] & mask_p[1]) | (bitmask[1] & mask_n[1]);
-       srcdata[2] = (srcdata[2] & mask_p[2]) | (bitmask[2] & mask_n[2]);
-       srcdata[3] = (srcdata[3] & mask_p[3]) | (bitmask[3] & mask_n[3]);
-       for(i = 0; i < planes; i++) {
-               if((bank_disable_reg & (1 << i)) != 0) {
-                       continue;
-               }
+       *psd = (*psd & *pmp) | (*pbm & *pmn);
+       //srcdata[0] = (srcdata[0] & mask_p[0]) | (bitmask[0] & mask_n[0]);
+       //srcdata[1] = (srcdata[1] & mask_p[1]) | (bitmask[1] & mask_n[1]);
+       //srcdata[2] = (srcdata[2] & mask_p[2]) | (bitmask[2] & mask_n[2]);
+       //srcdata[3] = (srcdata[3] & mask_p[3]) | (bitmask[3] & mask_n[3]);
+       for(i = 0; i < 4; i++) {
+               if(disable_flags[i]) continue;
+               //if((bank_disable_reg & (1 << i)) != 0) {
+               //      continue;
+               //}
                do_write(addr, i, srcdata[i]);
        }
        return;
@@ -155,14 +115,19 @@ void MB61VH010::do_and(uint32_t addr)
        uint32_t i;
        uint8_t bitmask[4] = {0};
        uint8_t srcdata[4] = {0};
-       uint8_t mask_p[4] = {mask_reg, mask_reg, mask_reg, mask_reg};
-       uint8_t mask_n[4] = {(uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg};
-
-       if(planes >= 4) planes = 4;
-       for(i = 0; i < planes; i++) {
-               if((bank_disable_reg & (1 << i)) != 0) {
-                       continue;
-               }
+       const uint8_t mask_p[4] = {mask_reg, mask_reg, mask_reg, mask_reg};
+       const uint8_t mask_n[4] = {(uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg};
+       uint32_t *pbm = (uint32_t *)bitmask;
+       uint32_t *pmp = (uint32_t *)mask_p;
+       uint32_t *pmn = (uint32_t *)mask_n;
+       uint32_t *psd = (uint32_t *)srcdata;
+
+       //if(planes >= 4) planes = 4;
+       for(i = 0; i < 4; i++) {
+               if(disable_flags[i]) continue;
+               //if((bank_disable_reg & (1 << i)) != 0) {
+               //      continue;
+               //}
                srcdata[i] = do_read(addr, i);
                if((color_reg & (1 << i)) == 0) {
                        bitmask[i] = 0x00; // srcdata & 0x00
@@ -173,11 +138,12 @@ void MB61VH010::do_and(uint32_t addr)
                //srcdata = (srcdata & mask_reg) | bitmask;
                //do_write(addr, i, srcdata);
        }
-       srcdata[0] = (srcdata[0] & mask_p[0]) | (bitmask[0] & mask_n[0]);
-       srcdata[1] = (srcdata[1] & mask_p[1]) | (bitmask[1] & mask_n[1]);
-       srcdata[2] = (srcdata[2] & mask_p[2]) | (bitmask[2] & mask_n[2]);
-       srcdata[3] = (srcdata[3] & mask_p[3]) | (bitmask[3] & mask_n[3]);
-       for(i = 0; i < planes; i++) {
+       *psd = (*psd & *pmp) | (*pbm & *pmn);
+       //srcdata[0] = (srcdata[0] & mask_p[0]) | (bitmask[0] & mask_n[0]);
+       //srcdata[1] = (srcdata[1] & mask_p[1]) | (bitmask[1] & mask_n[1]);
+       //srcdata[2] = (srcdata[2] & mask_p[2]) | (bitmask[2] & mask_n[2]);
+       //srcdata[3] = (srcdata[3] & mask_p[3]) | (bitmask[3] & mask_n[3]);
+       for(i = 0; i < 4; i++) {
                if((bank_disable_reg & (1 << i)) != 0) {
                        continue;
                }
@@ -193,14 +159,19 @@ void MB61VH010::do_xor(uint32_t addr)
        //uint8_t srcdata;
        uint8_t bitmask[4] = {0};
        uint8_t srcdata[4] = {0};
-       uint8_t mask_p[4] = {mask_reg, mask_reg, mask_reg, mask_reg};
-       uint8_t mask_n[4] = {(uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg};
-
-       if(planes >= 4) planes = 4;
-       for(i = 0; i < planes; i++) {
-               if((bank_disable_reg & (1 << i)) != 0) {
-                       continue;
-               }
+       const uint8_t mask_p[4] = {mask_reg, mask_reg, mask_reg, mask_reg};
+       const uint8_t mask_n[4] = {(uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg};
+       uint32_t *pbm = (uint32_t *)bitmask;
+       uint32_t *pmp = (uint32_t *)mask_p;
+       uint32_t *pmn = (uint32_t *)mask_n;
+       uint32_t *psd = (uint32_t *)srcdata;
+
+       //if(planes >= 4) planes = 4;
+       for(i = 0; i < 4; i++) {
+               if(disable_flags[i]) continue;
+               //if((bank_disable_reg & (1 << i)) != 0) {
+               //      continue;
+               //}
                if((color_reg & (1 << i)) == 0) {
                        bitmask[i] = 0x00;
                } else {
@@ -214,19 +185,22 @@ void MB61VH010::do_xor(uint32_t addr)
                //srcdata = srcdata | bitmask;
                //do_write(addr, i, srcdata);
        }
-       bitmask[0] = bitmask[0] ^ srcdata[0];
-       bitmask[1] = bitmask[1] ^ srcdata[1];
-       bitmask[2] = bitmask[2] ^ srcdata[2];
-       bitmask[3] = bitmask[3] ^ srcdata[3];
+       *pbm = *pbm ^ *psd;
+       //bitmask[0] = bitmask[0] ^ srcdata[0];
+       //bitmask[1] = bitmask[1] ^ srcdata[1];
+       //bitmask[2] = bitmask[2] ^ srcdata[2];
+       //bitmask[3] = bitmask[3] ^ srcdata[3];
        
-       srcdata[0] = (srcdata[0] & mask_p[0]) | (bitmask[0] & mask_n[0]);
-       srcdata[1] = (srcdata[1] & mask_p[1]) | (bitmask[1] & mask_n[1]);
-       srcdata[2] = (srcdata[2] & mask_p[2]) | (bitmask[2] & mask_n[2]);
-       srcdata[3] = (srcdata[3] & mask_p[3]) | (bitmask[3] & mask_n[3]);
-       for(i = 0; i < planes; i++) {
-               if((bank_disable_reg & (1 << i)) != 0) {
-                       continue;
-               }
+       *psd = (*psd & *pmp) | (*pbm & *pmn);
+       //srcdata[0] = (srcdata[0] & mask_p[0]) | (bitmask[0] & mask_n[0]);
+       //srcdata[1] = (srcdata[1] & mask_p[1]) | (bitmask[1] & mask_n[1]);
+       //srcdata[2] = (srcdata[2] & mask_p[2]) | (bitmask[2] & mask_n[2]);
+       //srcdata[3] = (srcdata[3] & mask_p[3]) | (bitmask[3] & mask_n[3]);
+       for(i = 0; i < 4; i++) {
+               if(disable_flags[i]) continue;
+               //if((bank_disable_reg & (1 << i)) != 0) {
+               //      continue;
+               //}
                do_write(addr, i, srcdata[i]);
        }
        return;
@@ -237,25 +211,31 @@ void MB61VH010::do_not(uint32_t addr)
        uint32_t i;
        uint8_t bitmask[4] = {0};
        uint8_t srcdata[4] = {0};
-       uint8_t mask_p[4] = {mask_reg, mask_reg, mask_reg, mask_reg};
-       uint8_t mask_n[4] = {(uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg};
-
-       if(planes >= 4) planes = 4;
-       for(i = 0; i < planes; i++) {
-               if((bank_disable_reg & (1 << i)) != 0) {
-                       continue;
-               }
+       const uint8_t mask_p[4] = {mask_reg, mask_reg, mask_reg, mask_reg};
+       const uint8_t mask_n[4] = {(uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg};
+       uint32_t *pbm = (uint32_t *)bitmask;
+       uint32_t *pmp = (uint32_t *)mask_p;
+       uint32_t *pmn = (uint32_t *)mask_n;
+       uint32_t *psd = (uint32_t *)srcdata;
+
+       //if(planes >= 4) planes = 4;
+       for(i = 0; i < 4; i++) {
+               if(disable_flags[i]) continue;
+               //if((bank_disable_reg & (1 << i)) != 0) {
+               //      continue;
+               //}
                srcdata[i] = do_read(addr, i);
                bitmask[i] = ~srcdata[i];
                //bitmask = bitmask & ~mask_reg;
                //srcdata = (srcdata & mask_reg) | bitmask;
                //do_write(addr, i, srcdata);
        }
-       srcdata[0] = (srcdata[0] & mask_p[0]) | (bitmask[0] & mask_n[0]);
-       srcdata[1] = (srcdata[1] & mask_p[1]) | (bitmask[1] & mask_n[1]);
-       srcdata[2] = (srcdata[2] & mask_p[2]) | (bitmask[2] & mask_n[2]);
-       srcdata[3] = (srcdata[3] & mask_p[3]) | (bitmask[3] & mask_n[3]);
-       for(i = 0; i < planes; i++) {
+       *psd = (*psd & *pmp) | (*pbm & *pmn);
+       //srcdata[0] = (srcdata[0] & mask_p[0]) | (bitmask[0] & mask_n[0]);
+       //srcdata[1] = (srcdata[1] & mask_p[1]) | (bitmask[1] & mask_n[1]);
+       //srcdata[2] = (srcdata[2] & mask_p[2]) | (bitmask[2] & mask_n[2]);
+       //srcdata[3] = (srcdata[3] & mask_p[3]) | (bitmask[3] & mask_n[3]);
+       for(i = 0; i < 4; i++) {
                if((bank_disable_reg & (1 << i)) != 0) {
                        continue;
                }
@@ -270,28 +250,35 @@ void MB61VH010::do_tilepaint(uint32_t addr)
        uint32_t i;
        uint8_t bitmask[4] = {0};
        uint8_t srcdata[4] = {0};
-       uint8_t mask_p[4] = {mask_reg, mask_reg, mask_reg, mask_reg};
-       uint8_t mask_n[4] = {(uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg};
-
-       if(planes > 4) planes = 4;
-       for(i = 0; i < planes; i++) {
-               if((bank_disable_reg & (1 << i)) != 0) {
-                       continue;
-               }
+       const uint8_t mask_p[4] = {mask_reg, mask_reg, mask_reg, mask_reg};
+       const uint8_t mask_n[4] = {(uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg, (uint8_t)~mask_reg};
+       uint32_t *pbm = (uint32_t *)bitmask;
+       uint32_t *pmp = (uint32_t *)mask_p;
+       uint32_t *pmn = (uint32_t *)mask_n;
+       uint32_t *psd = (uint32_t *)srcdata;
+
+       //if(planes > 4) planes = 4;
+       for(i = 0; i < 4; i++) {
+               if(disable_flags[i]) continue;
+               //if((bank_disable_reg & (1 << i)) != 0) {
+               //      continue;
+               //}
                srcdata[i] = do_read(addr, i);
                bitmask[i] = tile_reg[i];
                //bitmask = tile_reg[i] & (~mask_reg);
                //srcdata = (srcdata & mask_reg) | bitmask;
                //do_write(addr, i, srcdata);
        }
-       srcdata[0] = (srcdata[0] & mask_p[0]) | (bitmask[0] & mask_n[0]);
-       srcdata[1] = (srcdata[1] & mask_p[1]) | (bitmask[1] & mask_n[1]);
-       srcdata[2] = (srcdata[2] & mask_p[2]) | (bitmask[2] & mask_n[2]);
-       srcdata[3] = (srcdata[3] & mask_p[3]) | (bitmask[3] & mask_n[3]);
-       for(i = 0; i < planes; i++) {
-               if((bank_disable_reg & (1 << i)) != 0) {
-                       continue;
-               }
+       *psd = (*psd & *pmp) | (*pbm & *pmn);
+       //srcdata[0] = (srcdata[0] & mask_p[0]) | (bitmask[0] & mask_n[0]);
+       //srcdata[1] = (srcdata[1] & mask_p[1]) | (bitmask[1] & mask_n[1]);
+       //srcdata[2] = (srcdata[2] & mask_p[2]) | (bitmask[2] & mask_n[2]);
+       //srcdata[3] = (srcdata[3] & mask_p[3]) | (bitmask[3] & mask_n[3]);
+       for(i = 0; i < 4; i++) {
+               if(disable_flags[i]) continue;
+               //if((bank_disable_reg & (1 << i)) != 0) {
+               //      continue;
+               //}
                do_write(addr, i, srcdata[i]);
        }
        return;
@@ -299,7 +286,6 @@ void MB61VH010::do_tilepaint(uint32_t addr)
 
 void MB61VH010::do_compare(uint32_t addr)
 {
-       uint32_t offset = 0x4000;
        uint8_t r, g, b;
        uint8_t disables = ~bank_disable_reg;
 
@@ -446,9 +432,8 @@ void MB61VH010::do_line(void)
        int count = 0;
        int xcount;
        int ycount;
-       bool updated = false;
-       uint16_t tmp8a;
-       uint8_t vmask[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
+       //bool updated = false;
+       static const uint8_t vmask[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
        double usec;
        oldaddr = 0xffffffff;
        alu_addr = 0xffffffff;
@@ -462,11 +447,11 @@ void MB61VH010::do_line(void)
        }
        xcount = abs(ax);
        ycount = abs(ay);
-       //this->out_debug_log("LINE: (%d,%d)-(%d,%d) CMD=%02x STYLE=%04x, \n", x_begin, y_begin, x_end , y_end, command_reg, line_style.w.l); 
+       //this->out_debug_log(_T("LINE: (%d,%d)-(%d,%d) CMD=%02x STYLE=%04x, \n"), x_begin, y_begin, x_end , y_end, command_reg, line_style.w.l); 
        if(ycount == 0) {
                if((cpy_t < 0) || (cpy_t >= 512)) goto _finish;
                if(xcount == 0) {
-                       updated = put_dot(cpx_t, cpy_t);
+                       put_dot(cpx_t, cpy_t);
                        goto _finish;
                }
                if(ax > 0) {
@@ -475,7 +460,7 @@ void MB61VH010::do_line(void)
                        for(; cpx_t <= (int)x_end;) {
                                if((cpx_t & 7) == 0) {
                                        if(left >= 8) {
-                                               updated = put_dot8(cpx_t, cpy_t);
+                                               put_dot8(cpx_t, cpy_t);
                                                cpx_t += 8;
                                                left -= 8;
                                                total_bytes++;
@@ -483,7 +468,7 @@ void MB61VH010::do_line(void)
                                        }
                                }
                                {
-                                       updated = put_dot(cpx_t, cpy_t);
+                                       put_dot(cpx_t, cpy_t);
                                        cpx_t++;
                                        left--;
                                        if((cpx_t & 0x07) == 7) total_bytes++;
@@ -496,7 +481,7 @@ void MB61VH010::do_line(void)
                                if(cpx_t < 0) break; // Comment out for Amnork.
                                if((cpx_t & 7) == 7) {
                                        if(left >= 8) {
-                                               updated = put_dot8(cpx_t, cpy_t);
+                                               put_dot8(cpx_t, cpy_t);
                                                cpx_t -= 8;
                                                left -= 8;
                                                total_bytes++;
@@ -505,7 +490,7 @@ void MB61VH010::do_line(void)
                                }
                                {
                                        if((cpx_t & 7) == 0) total_bytes++;
-                                       updated = put_dot(cpx_t, cpy_t);
+                                       put_dot(cpx_t, cpy_t);
                                        left--;
                                        cpx_t--;
                                }
@@ -517,13 +502,13 @@ void MB61VH010::do_line(void)
                if(ay > 0) {
                        for(; cpy_t <= (int)y_end; cpy_t++) {
                                if(cpy_t >= 512) break;
-                               updated = put_dot(cpx_t, cpy_t);
+                               put_dot(cpx_t, cpy_t);
                                total_bytes++;
                        }
                } else {
                        for(; cpy_t  >= (int)y_end; cpy_t--) {
                                if(cpy_t < 0) break;
-                               updated = put_dot(cpx_t, cpy_t);
+                               put_dot(cpx_t, cpy_t);
                                total_bytes++;
                        }
                }
@@ -540,7 +525,7 @@ void MB61VH010::do_line(void)
                                if(ax > 0) {
                                        if((cpx_t & 0x07) == 0) {
                                                if(xcount >= 8) {
-                                                       updated = put_dot8(cpx_t, cpy_t);
+                                                       put_dot8(cpx_t, cpy_t);
                                                        total_bytes++;
                                                        count += diff8;
                                                        xcount -= 8;
@@ -551,7 +536,7 @@ void MB61VH010::do_line(void)
                                } else { // ax < 0
                                        if((cpx_t & 0x07) == 7) {
                                                if(xcount >= 8) {
-                                                       updated = put_dot8(cpx_t, cpy_t);
+                                                       put_dot8(cpx_t, cpy_t);
                                                        total_bytes++;
                                                        count += diff8;
                                                        xcount -= 8;
@@ -562,7 +547,7 @@ void MB61VH010::do_line(void)
                                        }
                                }
                        }
-                       updated = put_dot(cpx_t, cpy_t);
+                       put_dot(cpx_t, cpy_t);
                        count += diff;
                        if(count > 16384) {
                                if(ay < 0) {
@@ -593,7 +578,7 @@ void MB61VH010::do_line(void)
                        if((cpx_t & 0x07) == 0) total_bytes = 1;
                }
                for(; xcount >= 0; xcount-- ) {
-                       updated = put_dot(cpx_t, cpy_t);
+                       put_dot(cpx_t, cpy_t);
                        if(ay < 0) {
                                cpy_t--;
                                if(cpy_t < 0) break;
@@ -612,7 +597,7 @@ void MB61VH010::do_line(void)
        } else { // (abs(ax) < abs(ay)
                diff = (xcount  * 32768) / ycount;
                for(; ycount >= 0; ycount--) {
-                       updated = put_dot(cpx_t, cpy_t);
+                       put_dot(cpx_t, cpy_t);
                        total_bytes++;
                        count += diff;
                        if(count > 16384) {
@@ -643,114 +628,33 @@ void MB61VH010::do_line(void)
 _finish:   
        //if(total_bytes == 0) total_bytes = 1;
        mask_reg = 0xff;
-       if(total_bytes >= 8) { // Only greater than 8bytes.
-               usec = (double)total_bytes / 16.0;
+       //if(total_bytes >= 8) { // Only greater than 8bytes.
+       usec = (double)total_bytes / 16.0;
+       if(usec < 1.0) {
+               busy_flag = false; // ToDo
+       } else {
                if(eventid_busy >= 0) cancel_event(this, eventid_busy) ;
                register_event(this, EVENT_MB61VH010_BUSY_OFF, usec, false, &eventid_busy);
-       } else {
-               busy_flag = false;
        }
 }
 
-inline bool MB61VH010::put_dot(int x, int y)
-{
-       uint8_t vmask[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
-       uint16_t tmp16a;
-       uint8_t tmp8a;
-       uint8_t mask8;
-       
-       bool updated;
-   
-       if((command_reg & 0x80) == 0) return false; // Not compare.
-       if((x < 0) || (y < 0)) {
-               return false; // Lower address
-       }
-   
-       //if(y >= (int)screen_height) return; // Workaround of overflow
-       
-       alu_addr = (y * screen_width + x)  >> 3;
-       alu_addr = alu_addr + line_addr_offset.w.l;
-       if(!is_400line) {
-               alu_addr = alu_addr & 0x3fff;
-       } else {
-               alu_addr = alu_addr & 0x7fff;
-       }
-       
-       mask8 = ~vmask[x & 7];
-       updated = false;
-       tmp8a = line_style.b.h & 0x80;
-       
-       if(oldaddr != alu_addr) {
-               if(oldaddr == 0xffffffff) {
-                       if(tmp8a != 0) {
-                               mask_reg &= mask8;
-                       }
-                       oldaddr = alu_addr;
-               }
-               do_alucmds(oldaddr);
-               mask_reg = 0xff;
-               oldaddr = alu_addr;
-               updated = true;
-       }
-       if(tmp8a != 0) {
-               mask_reg &= mask8;
-       }
-       line_style.w.l <<= 1;
-       if(tmp8a != 0) line_style.w.l |= 0x01; 
-       return updated;
-}
-
-inline bool MB61VH010::put_dot8(int x, int y)
-{
-       uint8_t vmask[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
-       uint8_t tmp8a;
-       int xx;
-       uint16_t tmp16a;
-       bool updated;
-   
-       if((command_reg & 0x80) == 0) return false; // Not compare.
-       if((x < 0) || (y < 0)) {
-               return false; // Lower address
-       }
-   
-       //if(y >= (int)screen_height) return; // Workaround of overflow
-       
-       alu_addr = (y * screen_width + x)  >> 3;
-       alu_addr = alu_addr + line_addr_offset.w.l;
-       if(!is_400line) {
-               alu_addr = alu_addr & 0x3fff;
-       } else {
-               alu_addr = alu_addr & 0x7fff;
-       }
-       updated = false;
-       if(oldaddr != alu_addr) {
-               if(oldaddr == 0xffffffff) {
-                       if((line_style.b.h & 0x80) != 0) {
-                               mask_reg &= ~vmask[x & 7];
-                       }
-                       oldaddr = alu_addr;
-               }
-               do_alucmds(oldaddr);
-               mask_reg = 0xff;
-               oldaddr = alu_addr;
-               updated = true;
-       }
-       tmp8a = line_style.b.h;
-       mask_reg = mask_reg & ~tmp8a;
-       tmp8a = line_style.b.l;
-       line_style.b.l = line_style.b.h;
-       line_style.b.h = tmp8a;
-       return updated;
-}
 
 void MB61VH010::write_data8(uint32_t id, uint32_t data)
 {
-       //this->out_debug_log("ALU: ADDR=%02x DATA=%02x\n", id, data);
-       if(id == ALU_CMDREG) {
-               command_reg = data;
-               return;
+       //this->out_debug_log(_T("ALU: ADDR=%02x DATA=%02x\n"), id, data);
+       if(id < 0xc000) {
+               uint32_t raddr = id;
+               if(is_400line) {
+                       if(raddr >= 0x8000) return;
+               } else {
+                       raddr = raddr & 0x3fff;
+               }
+               do_alucmds_dmyread(raddr);
        }
        switch(id) {
+               case ALU_CMDREG:
+                       command_reg = data;
+                       break;
                case ALU_LOGICAL_COLOR:
                        color_reg = data;
                        break;
@@ -758,7 +662,27 @@ void MB61VH010::write_data8(uint32_t id, uint32_t data)
                        mask_reg = data;
                        break;
                case ALU_BANK_DISABLE:
+                       switch(planes) {    // D41B (RW)
+                       case 1:
+                               data |= 0xfe;
+                               break;
+                       case 2:
+                               data |= 0xfc;
+                               break;
+                       case 3:
+                               data |= 0xf8;
+                               break;
+                       case 4:
+                               data |= 0xf0;
+                               break;
+                       default:
+                           data |= 0xff;
+                               break;
+                       }
                        bank_disable_reg = data;
+                       for(int i = 0; i < 4; i++) {
+                               disable_flags[i] = ((bank_disable_reg & (1 << i)) != 0) ? true : false;
+                       }
                        break;
                case ALU_TILEPAINT_B:
                        tile_reg[0] = data;
@@ -812,18 +736,17 @@ void MB61VH010::write_data8(uint32_t id, uint32_t data)
                        line_yend.b.l = data;
                        do_line();
                        break;
+               case ALU_CMPDATA_REG + 0:
+               case ALU_CMPDATA_REG + 1:
+               case ALU_CMPDATA_REG + 2:
+               case ALU_CMPDATA_REG + 3:
+               case ALU_CMPDATA_REG + 4:
+               case ALU_CMPDATA_REG + 5:
+               case ALU_CMPDATA_REG + 6:
+               case ALU_CMPDATA_REG + 7:
+                       cmp_color_data[id - ALU_CMPDATA_REG] = data;
+                       break;
                default:
-                       if((id >= (ALU_CMPDATA_REG + 0)) && (id < (ALU_CMPDATA_REG + 8))) {
-                               cmp_color_data[id - ALU_CMPDATA_REG] = data;
-                       } else  if((id >= ALU_WRITE_PROXY) && (id < (ALU_WRITE_PROXY + 0xc000))) {
-                               uint32_t raddr = id - ALU_WRITE_PROXY;
-                               if(is_400line) {
-                                       if(raddr >= 0x8000) return;
-                               } else {
-                                       raddr = raddr & 0x3fff;
-                               }
-                               do_alucmds_dmyread(raddr);
-                       }
                        break;
        }
 }
@@ -831,6 +754,19 @@ void MB61VH010::write_data8(uint32_t id, uint32_t data)
 uint32_t MB61VH010::read_data8(uint32_t id)
 {
        uint32_t raddr;  
+       if(id < 0xc000) {
+               uint32_t dmydata;
+               raddr = id;
+               if(is_400line) {
+                       if(raddr >= 0x8000) return 0xffffffff;
+               } else {
+                       raddr = raddr & 0x3fff;
+               }
+               do_alucmds_dmyread(raddr);
+               //raddr = id & 0xffff;
+               dmydata = target->read_data8(raddr + direct_access_offset);
+               return dmydata;
+       }
        switch(id) {
                case ALU_CMDREG:
                        return (uint32_t)command_reg;
@@ -848,19 +784,7 @@ uint32_t MB61VH010::read_data8(uint32_t id)
                        return (uint32_t)bank_disable_reg;
                        break;
                default:
-                       if((id >= ALU_WRITE_PROXY) && (id < (ALU_WRITE_PROXY + 0xc000))) {
-                               uint32_t dmydata;
-                               raddr = id - ALU_WRITE_PROXY;
-                               if(is_400line) {
-                                       if(raddr >= 0x8000) return 0xffffffff;
-                               } else {
-                                       raddr = raddr & 0x3fff;
-                               }
-                               do_alucmds_dmyread(raddr);
-                               raddr = (id - ALU_WRITE_PROXY) % 0xc000;
-                               dmydata = target->read_data8(raddr + direct_access_offset);
-                               return dmydata;
-                       }
+//                     if((id >= ALU_WRITE_PROXY) && (id < (ALU_WRITE_PROXY + 0xc000))) {
                        return 0xffffffff;
                        break;
        }
@@ -889,6 +813,9 @@ void MB61VH010::write_signal(int id, uint32_t data, uint32_t mask)
                        break;
                case SIG_ALU_MULTIPAGE:
                        multi_page = (data & mask) & 0x07;
+                       for(int i = 0; i < 4; i++) {
+                               multi_flags[i] = (((1 << i) & multi_page) != 0) ? true : false;
+                       }
                        break;
                case SIG_ALU_PLANES:
                        planes = (data & mask) & 0x07;
@@ -925,15 +852,21 @@ void MB61VH010::initialize(void)
        is_400line = false;
        eventid_busy = -1;
        multi_page = 0x00;
+       for(i = 0; i < 4; i++) {
+               multi_flags[i] = (((1 << i) & multi_page) != 0) ? true : false;
+       }
        planes = 3;
        screen_width = 640;
        screen_height = 200;
        command_reg = 0;        // D410 (RW)
        color_reg = 0;          // D411 (RW)
-       mask_reg = 0;           // D412 (RW)
+       mask_reg = 0x00;        // D412 (RW)
        cmp_status_reg = 0;     // D413 (RO)
        for(i = 0; i < 8; i++) cmp_color_data[i] = 0x80; // D413-D41A (WO)
-       bank_disable_reg = 0;   // D41B (RW)
+       bank_disable_reg = 0xf8;// D41B (RW)
+       for(i = 0; i < 4; i++) {
+               disable_flags[i] = ((bank_disable_reg & (1 << i)) != 0) ? true : false;
+       }
        for(i = 0; i < 4; i++) tile_reg[i] = 0;        // D41C-D41F (WO)
        
        line_addr_offset.d = 0; // D420-D421 (WO)
@@ -955,7 +888,6 @@ void MB61VH010::reset(void)
        mask_reg = 0;           // D412 (RW)
        cmp_status_reg = 0;     // D413 (RO)
        for(i = 0; i < 8; i++) cmp_color_data[i] = 0x80; // D413-D41A (WO)
-       bank_disable_reg = 0;   // D41B (RW)
        for(i = 0; i < 4; i++) tile_reg[i] = 0;        // D41C-D41F (WO)
        
        line_addr_offset.d = 0; // D420-D421 (WO)
@@ -967,94 +899,97 @@ void MB61VH010::reset(void)
        oldaddr = 0xffffffff;
        
        if(planes >= 4) planes = 4;
+       switch(planes) {    // D41B (RW)
+       case 1:
+               bank_disable_reg = 0xfe;
+               break;
+       case 2:
+               bank_disable_reg = 0xfc;
+               break;
+       case 3:
+               bank_disable_reg = 0xf8;
+               break;
+       case 4:
+               bank_disable_reg = 0xf0;
+               break;
+       default:
+               bank_disable_reg = 0xff;
+               break;
+       }
+       for(i = 0; i < 4; i++) {
+               disable_flags[i] = ((bank_disable_reg & (1 << i)) != 0) ? true : false;
+       }
+       for(i = 0; i < 4; i++) {
+               multi_flags[i] = (((1 << i) & multi_page) != 0) ? true : false;
+       }
 }
 
-#define STATE_VERSION 1
-void MB61VH010::save_state(FILEIO *state_fio)
-{
-       int i;
-       state_fio->FputUint32(STATE_VERSION);
-       state_fio->FputInt32(this_device_id);
-       this->out_debug_log("Save State: MB61VH010 : id=%d ver=%d\n", this_device_id, STATE_VERSION);
-
-       { // V1
-               state_fio->FputUint8(command_reg);
-               state_fio->FputUint8(color_reg);
-               state_fio->FputUint8(mask_reg);
-               state_fio->FputUint8(cmp_status_reg);
-               for(i = 0; i < 8; i++)  state_fio->FputUint8(cmp_color_data[i]);
-               state_fio->FputUint8(bank_disable_reg);
-               for(i = 0; i < 4; i++)  state_fio->FputUint8(tile_reg[i]);
-               state_fio->FputUint8(multi_page);
-               
-               state_fio->FputUint32_BE(line_addr_offset.d);
-               state_fio->FputUint16_BE(line_pattern.w.l);
-               state_fio->FputUint16_BE(line_xbegin.w.l);
-               state_fio->FputUint16_BE(line_ybegin.w.l);
-               state_fio->FputUint16_BE(line_xend.w.l);
-               state_fio->FputUint16_BE(line_yend.w.l);
-               
-               state_fio->FputBool(busy_flag);
-               state_fio->FputInt32_BE(eventid_busy);
+#define STATE_VERSION 2
 
-               state_fio->FputUint32_BE(total_bytes);
-               state_fio->FputUint32_BE(oldaddr);
-               state_fio->FputUint32_BE(alu_addr);
+bool MB61VH010::decl_state(FILEIO *state_fio, bool loading)
+{
+       if(!state_fio->StateCheckUint32(STATE_VERSION)) {
+               return false;
+       }
+       if(!state_fio->StateCheckInt32(this_device_id)) {
+               return false;
+       }
+       
+       state_fio->StateValue(command_reg);
+       state_fio->StateValue(color_reg);
+       state_fio->StateValue(mask_reg);
+       state_fio->StateValue(cmp_status_reg);
+       state_fio->StateValue(bank_disable_reg);
+       state_fio->StateValue(multi_page);
+       state_fio->StateValue(direct_access_offset);
+       
+       state_fio->StateArray(cmp_color_data, sizeof(cmp_color_data), 1);
+       state_fio->StateArray(tile_reg, sizeof(tile_reg), 1);
+
+       state_fio->StateValue(line_addr_offset.d);
+       state_fio->StateValue(line_pattern.d);
+       state_fio->StateValue(line_xbegin.d);
+       state_fio->StateValue(line_ybegin.d);
+       state_fio->StateValue(line_xend.d);
+       state_fio->StateValue(line_yend.d);
+               
+       state_fio->StateValue(busy_flag);
+       state_fio->StateValue(line_style.d);
+       state_fio->StateValue(total_bytes);
+       state_fio->StateValue(oldaddr);
+       state_fio->StateValue(alu_addr);
+
+       state_fio->StateValue(planes);
+       state_fio->StateValue(is_400line);
+       state_fio->StateValue(screen_width);
+       state_fio->StateValue(screen_height);
+       state_fio->StateValue(eventid_busy);
 
-               state_fio->FputUint32_BE(planes);
-               state_fio->FputBool(is_400line);
-               state_fio->FputUint32_BE(screen_width);
-               state_fio->FputUint32_BE(screen_height);
+       return true;
+}
 
-               state_fio->FputUint16_BE(line_style.w.l);
-       }
-   
+void MB61VH010::save_state(FILEIO *state_fio)
+{
+       decl_state(state_fio, false);
+       out_debug_log(_T("Save State: MB61VH010 : id=%d ver=%d\n"), this_device_id, STATE_VERSION);
 }
 
 bool MB61VH010::load_state(FILEIO *state_fio)
 {
-       uint32_t version = state_fio->FgetUint32();
-       int i;
-       this->out_debug_log("Load State: MB61VH010 : id=%d ver=%d\n", this_device_id, version);
-       if(this_device_id != state_fio->FgetInt32()) return false;
-       if(version >= 1) {
-               command_reg = state_fio->FgetUint8();
-               color_reg = state_fio->FgetUint8();
-               mask_reg = state_fio->FgetUint8();
-               cmp_status_reg = state_fio->FgetUint8();
-               for(i = 0; i < 8; i++)  cmp_color_data[i] = state_fio->FgetUint8();
-               bank_disable_reg = state_fio->FgetUint8();
-               for(i = 0; i < 4; i++)  tile_reg[i] = state_fio->FgetUint8();
-               multi_page = state_fio->FgetUint8();
-
-               line_addr_offset.d = state_fio->FgetUint32_BE();
-               line_pattern.d = 0;
-               line_xbegin.d = 0;
-               line_ybegin.d = 0;
-               line_xend.d = 0;
-               line_yend.d = 0;
-          
-               line_pattern.w.l = state_fio->FgetUint16_BE();
-               line_xbegin.w.l = state_fio->FgetUint16_BE();
-               line_ybegin.w.l = state_fio->FgetUint16_BE();
-               line_xend.w.l = state_fio->FgetUint16_BE();
-               line_yend.w.l = state_fio->FgetUint16_BE();
-
-               busy_flag = state_fio->FgetBool();
-               eventid_busy = state_fio->FgetInt32_BE();
-               
-               total_bytes = state_fio->FgetUint32_BE();
-               oldaddr = state_fio->FgetUint32_BE();
-               alu_addr = state_fio->FgetUint32_BE();
-
-               planes = state_fio->FgetUint32_BE();
-               is_400line = state_fio->FgetBool();
-               screen_width = state_fio->FgetUint32_BE();
-               screen_height = state_fio->FgetUint32_BE();
-
-               line_style.d = 0;
-               line_style.w.l = state_fio->FgetUint16_BE();
+       bool mb = decl_state(state_fio, true);
+       out_debug_log(_T("Load State: MB61VH010 : id=%d stat=%s"), this_device_id, (mb) ? _T("OK") : _T("NG"));
+       if(!mb) return false;
+       
+       line_style.w.h = 0;
+       // Update
+       for(int i = 0; i < 4; i++) {
+               disable_flags[i] = ((bank_disable_reg & (1 << i)) != 0) ? true : false;
        }
-       if(version != STATE_VERSION) return false;
-       return true;
+       for(int i = 0; i < 4; i++) {
+               multi_flags[i] = (((1 << i) & multi_page) != 0) ? true : false;
+       }
+
+       return true;
 }