OSDN Git Service

[VM][FM77AV][MB61VH010] Fix line putting.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 5 Apr 2015 15:41:01 +0000 (00:41 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 5 Apr 2015 15:41:01 +0000 (00:41 +0900)
source/src/vm/fm7/display.cpp
source/src/vm/fm7/fm7_common.h
source/src/vm/fm7/fm7_mainio.cpp
source/src/vm/fm7/fm7_mainio.h
source/src/vm/fm7/fm7_mainmem.cpp
source/src/vm/fm7/mb61vh010.cpp
source/src/vm/fm7/mb61vh010.h

index 36088c9..a5da6fa 100644 (file)
@@ -1159,7 +1159,7 @@ void DISPLAY::write_signal(int id, uint32 data, uint32 mask)
                        }
                        mode320 = flag;
                        display_mode = (mode320 == true) ? DISPLAY_MODE_4096 : DISPLAY_MODE_8_200L;
-                       printf("MODE320: %d\n", display_mode);
+                       //printf("MODE320: %d\n", display_mode);
 #endif
                        break;
 #endif // _FM77AV_VARIANTS
@@ -1322,32 +1322,34 @@ uint32 DISPLAY::read_data8(uint32 addr)
 #elif defined(_FM77AV_VARIANTS)
                page_offset = 0;
                uint32 color = 0; // b
+               uint32 dummy;
                color = (addr & 0x0c000) >> 14;
                if(active_page != 0) page_offset = 0xc000;
                if(mode320) {
                        mask = 0x1fff;
                        pagemod = addr >> 13;
+                       if((alu->read_data8(ALU_CMDREG) & 0x80) != 0) {
+                                 dummy = alu->read_data8((addr & 0x3fff) + ALU_WRITE_PROXY);
+                                 return 0xff;
+                                 //    return alu->read_data8((((addr + offset) & mask) | (pagemod << 13)) + page_offset + ALU_WRITE_PROXY);
+                       }
                        if((multimode_accessmask & (1 << color)) != 0) {
                                return 0xff;
                        } else {
-                               if(use_alu) {
-                                 return alu->read_data8(((addr & mask) | (pagemod << 13)) + page_offset + ALU_WRITE_PROXY);
-                                 //    return alu->read_data8((((addr + offset) & mask) | (pagemod << 13)) + page_offset + ALU_WRITE_PROXY);
-                               }
                                retval = gvram[(((addr + offset) & mask) | (pagemod << 13)) + page_offset];
                                return retval;
                        }
                } else {
                        mask = 0x3fff;
                        pagemod = (addr & 0xc000) >> 14;
+                       if((alu->read_data8(ALU_CMDREG) & 0x80) != 0) {
+                               dummy = alu->read_data8((addr & 0x3fff) + ALU_WRITE_PROXY); 
+                               return 0xff;
+                                 //return alu->read_data8((((addr + offset) & mask) | (pagemod << 14)) + page_offset + ALU_WRITE_PROXY);
+                       }
                        if((multimode_accessmask & (1 << pagemod)) != 0) {
                                return 0xff;
                        } else {
-                               if(use_alu) {
-                                 return alu->read_data8(((addr & mask) | (pagemod << 14)) + page_offset + ALU_WRITE_PROXY);
-
-                                 //return alu->read_data8((((addr + offset) & mask) | (pagemod << 14)) + page_offset + ALU_WRITE_PROXY);
-                               }
                                retval = gvram[(((addr + offset) & mask) | (pagemod << 14)) + page_offset];
                                return retval;
                        }
@@ -1477,6 +1479,17 @@ uint32 DISPLAY::read_data8(uint32 addr)
                        default:
                                break;
                }
+#if defined(_FM77AV_VARIANTS)
+               if((raddr >= 0x14) && (raddr < 0x1b)) {
+                 retval = 0xff;
+               } 
+               if((raddr >= 0x1c) && (raddr < 0x20)) {
+                 retval = 0xff;
+               } 
+               if((raddr >= 0x20) && (raddr < 0x2a)) {
+                 retval = 0xff;
+               } 
+#endif
                return retval;
        } else if(addr < 0x10000) {
 #if !defined(_FM77AV_VARIANTS)
@@ -1511,10 +1524,6 @@ uint32 DISPLAY::read_data8(uint32 addr)
                return dpalette_data[addr - FM7_SUBMEM_OFFSET_DPALETTE];
        }
 #if defined(_FM77AV_VARIANTS)
-# if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
-       else if((addr >= DISPLAY_VRAM_DIRECT_ACCESS) && (addr < (DISPLAY_VRAM_DIRECT_ACCESS + 0x30000))) {
-       }
-# else   
        else if((addr >= DISPLAY_VRAM_DIRECT_ACCESS) && (addr < (DISPLAY_VRAM_DIRECT_ACCESS + 0xc000))) {
                uint32 tmp_offset = 0;
                uint32 rpage;
@@ -1524,17 +1533,16 @@ uint32 DISPLAY::read_data8(uint32 addr)
                rpage = (addr & 0xc000) >> 14;
                if(((1 << rpage) & multimode_accessmask) != 0) return 0xff;
                if(mode320) {
-                       //raddr  = (addr + offset) & 0x1fff;
-                       raddr  = addr & 0x1fff;
+                       raddr  = (addr + offset) & 0x1fff;
+                       //raddr  = addr & 0x1fff;
                        rofset = addr & 0xe000;
                } else { // 640x200
-                       //raddr  = addr & 0x3fff;
+                 //raddr  = addr & 0x3fff;
                        raddr = (addr + offset) & 0x3fff;
                        rofset = addr & 0xc000;
                }                 
                return gvram[(raddr | rofset) + tmp_offset];
        }
-# endif
 #endif
        return 0xff;
 }      
@@ -1689,25 +1697,23 @@ void DISPLAY::write_data8(uint32 addr, uint32 data)
                if(mode320) {
                        mask = 0x1fff;
                        pagemod = (addr & 0xe000) >> 13;
+                       if((alu->read_data8(ALU_CMDREG) & 0x80) != 0) {
+                               dummy = alu->read_data8((addr  & 0x3fff) + ALU_WRITE_PROXY);
+                               return;
+                       }
                        if((multimode_accessmask & (1 << color)) == 0) {
-                               if(use_alu) {
-                                       dummy = alu->read_data8(((addr  & mask) | (pagemod << 13)) + page_offset + ALU_WRITE_PROXY);
-                                       return;
-                               }
-                               //gvram[(((addr + offset) & mask) | (pagemod << 13)) + page_offset] = val8;
                                gvram[(((addr + offset) & mask) | (addr & 0xe000)) + page_offset] = val8;
                        }
                        return;
                } else {
                        mask = 0x3fff;
                        pagemod = (addr & 0xc000) >> 14;
+                       if((alu->read_data8(ALU_CMDREG) & 0x80) != 0) {
+                               dummy = alu->read_data8((addr & 0x3fff) + ALU_WRITE_PROXY);
+                               return;
+                       }       
                        if((multimode_accessmask & (1 << pagemod)) == 0) {
-                               if(use_alu) {
-                                       dummy = alu->read_data8(((addr & mask) | (pagemod << 14)) + page_offset + ALU_WRITE_PROXY);
-                                 //dummy = alu->read_data8(((addr + offset) & mask) + ALU_WRITE_PROXY + page_offset);
-                                       return;
-                               }
-                               gvram[(((addr + offset) & mask) | (pagemod << 14)) + page_offset] = val8;
+                               gvram[(((addr + offset) & mask) | (pagemod << 14)) + page_offset] = val8;
                        }
                        return;
                }
@@ -1755,30 +1761,35 @@ void DISPLAY::write_data8(uint32 addr, uint32 data)
 #endif
 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
                        case 0x06:
-                         printf("KANJI HI=%02x\n", data);
 #if defined(_FM77AV40) || defined(_FM77AV40SX)|| defined(_FM77AV40SX)
                                //if(!kanjisub) break;
                                if(kanji_level2) {
                                        kanji2_addr.b.h = data;
+                                       mainio->write_signal(FM7_MAINIO_KANJI2_ADDR_HIGH, data, 0xff);
                                } else {
                                        kanji1_addr.b.h = data;
+                                       mainio->write_signal(FM7_MAINIO_KANJI1_ADDR_HIGH, data, 0xff);
                                }
-#elif defined(_FM77_VARIANTS)
+#else
                                //if(!kanjisub) break;
                                kanji1_addr.b.h = data;
+                               mainio->write_signal(FM7_MAINIO_KANJI1_ADDR_HIGH, data, 0xff);
 #endif                         
                                break;
                        case 0x07:
-                         printf("KANJI LO=%02x\n", data);
+                         //printf("KANJI LO=%02x\n", data);
 #if defined(_FM77AV40) || defined(_FM77AV40SX)|| defined(_FM77AV40SX)
                                //if(!kanjisub) break;
                                if(kanji_level2) {
                                        kanji2_addr.b.l = data;
+                                       mainio->write_signal(FM7_MAINIO_KANJI2_ADDR_LOW, data, 0xff);
                                } else {
                                        kanji1_addr.b.l = data;
+                                       mainio->write_signal(FM7_MAINIO_KANJI1_ADDR_LOW, data, 0xff);
                                }
-#elif defined(_FM77_VARIANTS)
+#else
                                kanji1_addr.b.l = data;
+                               mainio->write_signal(FM7_MAINIO_KANJI1_ADDR_LOW, data, 0xff);
 #endif
                                break;
 #endif         
index a583637..827a145 100644 (file)
@@ -174,6 +174,10 @@ enum {
        FM7_MAINIO_JOYPORTB_CHANGED, // Joystick
        FM7_MAINIO_FDC_DRQ,
        FM7_MAINIO_FDC_IRQ,
+       FM7_MAINIO_KANJI1_ADDR_HIGH,
+       FM7_MAINIO_KANJI1_ADDR_LOW,
+       FM7_MAINIO_KANJI2_ADDR_HIGH,
+       FM7_MAINIO_KANJI2_ADDR_LOW,
 };
 // SUB
 enum {
index b86aea3..8fef8b1 100644 (file)
@@ -41,8 +41,8 @@ void FM7_MAINIO::initialize(void)
        mmr_fast = false;
        window_enabled = false;
        mmr_segment = 0x00;
-       for(i = 0x10; i < 0x80; i++) mmr_table[i] = 0;
-       for(i = 0x00; i < 0x10; i++) mmr_table[i] = 0x30 + i;
+       for(i = 0x00; i < 0x80; i++) mmr_table[i] = 0;
+       //      for(i = 0x00; i < 0x10; i++) mmr_table[i] = 0x30 + i;
 #endif 
 }
 
@@ -66,11 +66,13 @@ void FM7_MAINIO::reset(void)
        }
 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
        boot_ram = false;
+       kaddress.d = 0;
 #endif 
 #if defined(_FM77AV_VARIANTS)
        mode320 = false;
        sub_monitor_type = 0x00;
 #endif
+       
 #ifdef HAS_MMR
        mmr_enabled = false;
        mmr_fast = false;
@@ -391,14 +393,14 @@ void FM7_MAINIO::set_extdet(bool flag)
 void FM7_MAINIO::write_kanjiaddr_hi(uint8 addr)
 {
        if(!connect_kanjiroml1) return;
-       kaddress_hi = addr;
+       kaddress.b.h = addr;
        return;
 }
 
 void FM7_MAINIO::write_kanjiaddr_lo(uint8 addr)
 {
        if(!connect_kanjiroml1) return;
-       kaddress_lo = addr;
+       kaddress.b.l = addr;
        return;
 }
 
@@ -407,8 +409,9 @@ uint8 FM7_MAINIO::read_kanjidata_left(void)
        uint32 addr;
     
        if(!connect_kanjiroml1) return 0xff;
-       addr = ((uint32)kaddress_hi << 8) | (uint32)kaddress_lo;
+       addr = kaddress.w.l;
        addr = addr << 1;
+       //printf("KANJI MAIN CLASS1 ADDR: %05x\n", kaddress.w.l);
        if(kanjiclass1) {
                return kanjiclass1->read_data8(addr);
        } else {
@@ -421,8 +424,8 @@ uint8 FM7_MAINIO::read_kanjidata_right(void)
        uint32 addr;
     
        if(!connect_kanjiroml1) return 0xff;
-       addr = ((uint32)kaddress_hi << 8) | (uint32)kaddress_lo;
-       addr = (addr << 1) | 1;
+       addr = kaddress.w.l;
+       addr = (addr << 1) + 1;
        if(kanjiclass1) {
                return kanjiclass1->read_data8(addr);
        } else {
@@ -435,14 +438,14 @@ uint8 FM7_MAINIO::read_kanjidata_right(void)
 void FM7_MAINIO::write_kanjiaddr_hi_l2(uint8 addr)
 {
        if(!connect_kanjiroml2) return;
-       kaddress_hi_l2 = addr;
+       kaddress_l2.b.h = addr;
        return;
 }
 
 void FM7_MAINIO::write_kanjiaddr_lo_l2(uint8 addr)
 {
        if(!connect_kanjiroml2) return;
-       kaddress_lo_l2 = addr;
+       kaddress_l2.b.l = addr;
        return;
 }
 
@@ -451,7 +454,7 @@ uint8 FM7_MAINIO::read_kanjidata_left_l2(void)
        uint32 addr;
     
        if(!connect_kanjiroml2) return 0xff;
-       addr = ((uint32)kaddress_hi_l2 << 8) | (uint32)kaddress_lo_l2;
+       addr = kaddress.w.l;
        addr = addr << 1;
        if(kanjiclass2) {
                return kanjiclass2->read_data8(addr);
@@ -465,8 +468,8 @@ uint8 FM7_MAINIO::read_kanjidata_right_l2(void)
        uint32 addr;
     
        if(!connect_kanjiroml2) return 0xff;
-       addr = ((uint32)kaddress_hi_l2 << 8) | (uint32)kaddress_lo_l2;
-       addr = (addr << 1) | 0x01;
+       addr = kaddress_l2.w.l;
+       addr = (addr << 1) + 0x01;
        if(kanjiclass2) {
                return kanjiclass2->read_data8(addr);
        } else {
@@ -593,6 +596,20 @@ void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
                case FM7_MAINIO_FDC_IRQ:
                        set_irq_mfd(val_b);
                        break;
+               case FM7_MAINIO_KANJI1_ADDR_HIGH:
+                       kaddress.b.h = data;
+                       break;
+               case FM7_MAINIO_KANJI1_ADDR_LOW:
+                       kaddress.b.l = data;
+                       break;
+#if defined(CAPABLE_KANJI_CLASS2)
+               case FM7_MAINIO_KANJI2_ADDR_HIGH:
+                       kaddress_l2.b.h = data;
+                       break;
+               case FM7_MAINIO_KANJI2_ADDR_LOW:
+                       kaddress_l2.b.l = data;
+                       break;
+#endif
        }
        
 }
@@ -733,6 +750,7 @@ uint32 FM7_MAINIO::read_data8(uint32 addr)
 #endif   
        }
 #endif
+       //      if((addr >= 0x0006) && !(addr == 0x1f) && !(addr == 0x0b)) printf("MAINIO: READ: %08x \n", addr);
        switch(addr) {
                case 0x00: // FD00
                        retval = (uint32) get_port_fd00();
@@ -761,6 +779,11 @@ uint32 FM7_MAINIO::read_data8(uint32 addr)
                case 0x09:
                case 0x0a:
                        break;
+#if defined(_FM77AV_VARIANTS)
+               case 0x0b:
+                       retval = (bootmode == 0) ? 0xfe : 0xff;
+                       break;
+#endif                 
                case 0x0e: // PSG DATA
                        retval = (uint32) get_psg();
                        //printf("PSG DATA READ val=%02x\n", retval);
@@ -982,19 +1005,19 @@ void FM7_MAINIO::write_data8(uint32 addr, uint32 data)
                        return;
                        break;
                case 0x20: // Kanji ROM
+               case 0x2c: // Kanji ROM(DUP)
                        write_kanjiaddr_hi((uint8)data);
+#if defined(CAPABLE_KANJI_CLASS2)
+                       write_kanjiaddr_hi_l2((uint8)data);
+#endif
                        break;
                case 0x21: // Kanji ROM
+               case 0x2d: // Kanji ROM(DUP)
                        write_kanjiaddr_lo((uint8)data);
-                       break;
 #if defined(CAPABLE_KANJI_CLASS2)
-               case 0x2c: // Kanji ROM
-                       write_kanjiaddr_hi_l2((uint8)data);
-                       break;
-               case 0x2d: // Kanji ROM
                        write_kanjiaddr_lo_l2((uint8)data);
-                       break;
 #endif
+                       break;
 #if defined(_FM77AV_VARIANTS)
                case 0x30:
                        display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_HI, data);
@@ -1036,6 +1059,7 @@ void FM7_MAINIO::write_data8(uint32 addr, uint32 data)
 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
                        mmr_segment = data & 7;
 #else
+                       //                      printf("MMR SEGMENT: %02x\n", data & 3);
                        mmr_segment = data & 3;
 #endif                 
                        break;
index 89ce48e..79b2b03 100644 (file)
@@ -176,12 +176,10 @@ class FM7_MAINIO : public DEVICE {
    
        /* FD20,FD21 : W */
        bool connect_kanjiroml1;
-       uint8 kaddress_hi; // FD20 : ADDRESS OF HIGH.
-       uint8 kaddress_lo; // FD21 : ADDRESS OF LOW.
+       pair kaddress; // FD20 : ADDRESS OF HIGH.
 #ifdef _FM77AV_VARIANTS
        bool connect_kanjiroml2;
-       uint8 kaddress_hi_l2; // FD20 : ADDRESS OF HIGH.
-       uint8 kaddress_lo_l2; // FD21 : ADDRESS OF LOW.
+       pair kaddress_l2; // FD20 : ADDRESS OF HIGH.
 #endif 
        /* FD20, FD21 : R */
        
index 86f307d..af32f6f 100644 (file)
@@ -62,7 +62,7 @@ int FM7_MAINMEM::window_convert(uint32 addr, uint32 *realaddr)
        uint32 raddr = addr;
 #ifdef HAS_MMR
        if((addr < 0x8000) && (addr >= 0x7c00)) {
-               raddr = ((mainio->read_data8(FM7_MAINIO_WINDOW_OFFSET) << 8) + addr) & 0xffff;
+               raddr = ((mainio->read_data8(FM7_MAINIO_WINDOW_OFFSET) * 256) + addr) & 0xffff;
                *realaddr = raddr;
 #ifdef _FM77AV_VARIANTS
                //printf("TWR hit %04x -> %04x\n", addr, raddr);
@@ -91,8 +91,10 @@ int FM7_MAINMEM::mmr_convert(uint32 addr, uint32 *realaddr)
        
 #if !defined(_FM77AV_VARIANTS)
        if(addr >= 0xfc00) return -1;
+       mmr_bank = mmr_bank & 0x3f;
 #else
        if(addr >= 0xfc00) return -1;
+       mmr_bank = mmr_bank & 0x3f;
        //      mmr_bank &= 0xff;
 #endif
        // Reallocated by MMR
index 6ff0f67..6270f59 100644 (file)
@@ -32,12 +32,12 @@ uint8 MB61VH010::do_read(uint32 addr, uint32 bank)
        
        if(is_400line) {
                if((addr & 0xffff) < 0x8000) {
-                       raddr = addr + 0x8000 * bank;
+                       raddr = (addr & 0x7fff) | (0x8000 * bank);
                        return target->read_data8(raddr + DISPLAY_VRAM_DIRECT_ACCESS);
                }
                return 0xff;
        } else {
-               raddr = addr + 0x4000 * bank;
+               raddr = (addr & 0x3fff) | (0x4000 * bank);
                return target->read_data8(raddr + DISPLAY_VRAM_DIRECT_ACCESS);
        }
        return 0xff;
@@ -50,24 +50,27 @@ uint8 MB61VH010::do_write(uint32 addr, uint32 bank, uint8 data)
 
        if(((1 << bank) & read_signal(SIG_DISPLAY_MULTIPAGE)) != 0) return 0xff;
        if((command_reg & 0x40) != 0) { // Calculate before writing
-               readdata = do_read(addr, bank);
+               readdata = do_read(addr, bank);
+               //readdata = data;
                if((command_reg & 0x20) != 0) { // NAND
                        readdata = readdata & cmp_status_reg;
-                       readdata = readdata | (data & ~cmp_status_reg);
+                       data = data & ~cmp_status_reg;
+                       readdata = readdata | data;
                } else { // AND
                        readdata = readdata & ~cmp_status_reg;
-                       readdata = readdata | (data & cmp_status_reg);
+                       data = data & cmp_status_reg;
+                       readdata = readdata | data;
                }
        } else {
                readdata = data;
        }
        if(is_400line) {
                if((addr & 0xffff) < 0x8000) {
-                       raddr = addr + 0x8000 * bank;
+                       raddr = (addr & 0x7fff) | (0x8000 * bank);
                        target->write_data8(raddr + DISPLAY_VRAM_DIRECT_ACCESS, readdata);
                }
        } else {
-               raddr = addr + 0x4000 * bank;
+               raddr = (addr & 0x3fff) | (0x4000 * bank);
                target->write_data8(raddr + DISPLAY_VRAM_DIRECT_ACCESS, readdata);
        }
        return readdata;
@@ -82,17 +85,19 @@ uint8 MB61VH010::do_pset(uint32 addr)
        uint8 srcdata;
        int planes_b = planes;
 
-       if(planes_b >= 4) planes = 4;
-       for(i = 0; i < planes; i++) {
+       if(planes_b >= 4) planes_b = 4;
+       for(i = 0; i < planes_b; i++) {
                if((bank_disable_reg & (1 << i)) != 0) {
                                continue;
                }
                if((color_reg & (1 << i)) == 0) {
                        bitmask = 0x00;
                } else {
-                       bitmask = ~mask_reg;
+                       bitmask = 0xff;
                }
+               
                srcdata = do_read(addr, i);
+               bitmask = bitmask & ~mask_reg;
                srcdata = srcdata & mask_reg;
                srcdata = srcdata | bitmask;
                do_write(addr, i, srcdata);
@@ -234,7 +239,7 @@ uint8 MB61VH010::do_compare(uint32 addr)
 {
        uint32 offset = 0x4000;
        uint8 r, g, b, t;
-       uint8 disables = ~bank_disable_reg & 0x0f;
+       uint8 disables = ~bank_disable_reg;
        uint8 tmpcol;
        int i;
        int j;
@@ -245,16 +250,17 @@ uint8 MB61VH010::do_compare(uint32 addr)
        g = do_read(addr, 2);
        if(planes >= 4) {
                t = do_read(addr, 3);
+               disables = disables & 0x0f;
        } else {
                t = 0;
                disables = disables & 0x07;
        }
        cmp_status_reg = 0x00;
        for(i = 7; i >= 0; i--) {
-               tmpcol  = (b & 0x80) ? 1 : 0;
-               tmpcol |= (r & 0x80) ? 2 : 0;
-               tmpcol |= (g & 0x80) ? 4 : 0;
-               tmpcol |= (t & 0x80) ? 8 : 0;
+               tmpcol  = ((b & 0x80) != 0) ? 1 : 0;
+               tmpcol |= ((r & 0x80) != 0) ? 2 : 0;
+               tmpcol |= ((g & 0x80) != 0) ? 4 : 0;
+               //tmpcol |= ((t & 0x80) != 0) ? 8 : 0;
                tmpcol = tmpcol & disables;
                for(j = 0; j < 8; j++) {
                        if((cmp_color_data[j] & 0x80) != 0) continue;
@@ -271,6 +277,48 @@ uint8 MB61VH010::do_compare(uint32 addr)
        return 0xff;
 }
 
+void MB61VH010::do_alucmds_dmyread(uint32 addr)
+{
+       if(!is_400line) {
+               addr = addr & 0x3fff;
+       } else {
+               if(addr >= 0x8000) {
+                       mask_reg = 0xff;
+                       return;
+               }
+               addr = addr & 0x7fff;
+       }
+       //printf("ALU DMYREAD: CMD %02x ADDR=%08x\n", command_reg, addr);
+       if((command_reg & 0x80) == 0) return;
+       if(((command_reg & 0x40) != 0) && ((command_reg & 0x07) != 7)) do_compare(addr);
+       switch(command_reg & 0x07) {
+               case 0:
+                       do_pset(addr);
+                       break;
+               case 1:
+                       do_blank(addr);
+                       break;
+               case 2:
+                       do_or(addr);
+                       break;
+               case 3:
+                       do_and(addr);
+                       break;
+               case 4:
+                       do_xor(addr);
+                       break;
+               case 5:
+                       do_not(addr);
+                       break;
+               case 6:
+                       do_tilepaint(addr);
+                       break;
+               case 7:
+                       do_compare(addr);
+                       break;
+       }
+}  
+
 uint8 MB61VH010::do_alucmds(uint32 addr)
 {
        if(!is_400line) {
@@ -282,9 +330,8 @@ uint8 MB61VH010::do_alucmds(uint32 addr)
                }
                addr = addr & 0x7fff;
        }
+       //if((command_reg & 0x07) != 0x00) printf("ALU: CMD %02x ADDR=%08x\n", command_reg, addr);
        if(((command_reg & 0x40) != 0) && ((command_reg & 0x07) != 7)) do_compare(addr);
-       //printf("ALU: ADDR=%04x, cmd = %02x\n", addr, command_reg);
-       //printf("ALU: CMD %02x ADDR=%08x\n", command_reg, addr);
        switch(command_reg & 0x07) {
                case 0:
                        return do_pset(addr);
@@ -341,102 +388,70 @@ void MB61VH010::do_line(void)
 
        //if((command_reg & 0x80) == 0) return;
        oldaddr = 0xffffffff;
+       alu_addr = 0xffffffff;
 
        
        line_style = line_pattern;
        oldaddr = 0xffff;
-       total_bytes = 0;
        busy_flag = true;
+       total_bytes = 1;
        
        mask_reg = 0xff & vmask[x_begin & 7];
        // Got from HD63484.cpp .
        if(abs(ax) >= abs(ay)) {
-               total_bytes = abs(ax) >> 3;
                if(ax != 0) {
-                       diff = (abs(ay) * 1024) / abs(ax);
-                       if(ax > 0) {
-                               for(; cpx_t != x_end; cpx_t++) {
-                                  put_dot(cpx_t, cpy_t);
-                                  count += diff;
-                                  if(ay < 0) {
-                                       if(count >= 1024) {
-                                          put_dot(cpx_t + 1, cpy_t);
-                                          cpy_t--;
-                                          count -= 1024;
+                       diff = ((abs(ay) + 1) * 1024) / abs(ax);
+                       for(; cpx_t != x_end; ) {
+                               put_dot(cpx_t, cpy_t);
+                               count += diff;
+                               if(count >= 1024) {
+                                       if(ax > 0) {
+                                               put_dot(cpx_t + 1, cpy_t);
+                                       } else {
+                                               put_dot(cpx_t - 1, cpy_t);
                                        }
-                                  } else {
-                                       if(count >= 1024) {
-                                          put_dot(cpx_t + 1, cpy_t);
-                                          cpy_t++;
-                                          count -= 1024;
+                                       if(ay < 0) {
+                                               cpy_t--;
+                                       } else {
+                                               cpy_t++;
                                        }
-                                  }
+                                       count -= 1024;
                                }
-                       } else {
-                               for(; cpx_t != x_end; cpx_t--) {
-                                  put_dot(cpx_t, cpy_t);
-                                  count += diff;
-                                  if(ay < 0) {
-                                       if(count >= 1024) {
-                                          put_dot(cpx_t - 1, cpy_t);
-                                          cpy_t--;
-                                          count -= 1024;
-                                       }
-                                  } else {
-                                       if(count >= 1024) {
-                                          put_dot(cpx_t - 1, cpy_t);
-                                          cpy_t++;
-                                          count -= 1024;
-                                       }
-                                  }
+                               if(ax > 0) {
+                                       cpx_t++;
+                               } else {
+                                       cpx_t--;
                                }
                        }
                }
-       } else {
-               if(ay != 0) {
-                       diff = (abs(ax) * 1024) / abs(ay);
-                       if(ay > 0) {
-                               for(; cpy_t != y_end; cpy_t++) {
-                                  put_dot(cpx_t, cpy_t);
-                                  count += diff;
-                                  if(ax < 0) {
-                                       if(count >= 1024) {
-                                          put_dot(cpx_t, cpy_t + 1);
-                                          cpx_t--;
-                                          count -= 1024;
-                                       }
-                                  } else {
-                                       if(count >= 1024) {
-                                          put_dot(cpx_t, cpy_t + 1);
-                                          cpx_t++;
-                                          count -= 1024;
-                                       }
-                                  }
+       } else { // (abs(ax) < abs(ay) 
+               diff = ((abs(ax) + 1)* 1024) / abs(ay);
+               for(; cpy_t != y_end; ) {
+                       put_dot(cpx_t, cpy_t);
+                       count += diff;
+                       if(count >= 1024) {
+                               if(ay > 0) {
+                                       put_dot(cpx_t, cpy_t + 1);
+                               } else {
+                                       put_dot(cpx_t, cpy_t - 1);
                                }
-                       } else {
-                               for(; cpy_t != y_end; cpy_t--) {
-                                  put_dot(cpx_t, cpy_t);
-                                  count += diff;
-                                  if(ax < 0) {
-                                       if(count >= 1024) {
-                                          put_dot(cpx_t, cpy_t - 1);
-                                          cpx_t--;
-                                          count -= 1024;
-                                       }
-                                  } else {
-                                       if(count >= 1024) {
-                                          put_dot(cpx_t, cpy_t - 1);
-                                          cpx_t++;
-                                          count -= 1024;
-                                       }
-                                  }
+                               if(ax < 0) {
+                                       cpx_t--;
+                               } else {
+                                       cpx_t++;
                                }
+                               count -= 1024;
+                       }
+                       if(ay > 0) {
+                               cpy_t++;
+                       } else {
+                               cpy_t--;
                        }
                }
        }
-       put_dot(cpx_t, cpy_t);
+       if(!put_dot(cpx_t, cpy_t)) total_bytes++;
+       do_alucmds(alu_addr);
 
-       oldaddr = addr;
        usec = (double)total_bytes / 16.0;
        if(usec >= 1.0) { // 1MHz
                register_event(this, EVENT_MB61VH010_BUSY_OFF, usec, false, &eventid_busy) ;
@@ -446,32 +461,37 @@ void MB61VH010::do_line(void)
        mask_reg = mask_bak;
 }
 
-void MB61VH010::put_dot(int x, int y)
+bool MB61VH010::put_dot(int x, int y)
 {
-       uint32 addr;
        uint8 vmask[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
        uint16 tmp8a;
        uint8 mask;
-
-       if((x < 0) || (y < 0)) return;
-       if((x >= screen_width) || (y >= screen_height)) return;
-       if((command_reg & 0x80) == 0) return;
+       bool flag = false;
+       
+       if((x < 0) || (y < 0)) return flag;
+       if((x >= screen_width) || (y >= screen_height)) return flag;
+       if((command_reg & 0x80) == 0) return flag;
+       
+       alu_addr = ((y * screen_width) >> 3) + (x >> 3);
+       alu_addr = alu_addr + (line_addr_offset.w.l << 1);
+       alu_addr = alu_addr & 0x7fff;
+       if(!is_400line) alu_addr = alu_addr & 0x3fff;
+       if(oldaddr == 0xffffffff) oldaddr = alu_addr;
+       
+       if(oldaddr != alu_addr) {
+               do_alucmds(oldaddr);
+               mask_reg = 0xff;
+               oldaddr = alu_addr;
+               flag = true;
+               total_bytes++;
+       }
        
-       addr = ((y * screen_width) >> 3) + (x >> 3);
-       addr = addr + (line_addr_offset.w.l << 1);
-       addr = addr & 0x7fff;
-       if(!is_400line) addr = addr & 0x3fff;
        if((line_style.b.h & 0x80) != 0) {
                mask_reg &= ~vmask[x & 7];
         }
-//     if(oldaddr != addr) {
-               do_alucmds(addr);
-               mask_reg = 0xff;
-               oldaddr = addr;
-//     }
-       
        tmp8a = (line_style.w.l & 0x8000) >> 15;
        line_style.w.l = (line_pattern.w.l << 1) | tmp8a;
+       return flag;
 }
 
 void MB61VH010::write_data8(uint32 id, uint32 data)
@@ -505,12 +525,7 @@ void MB61VH010::write_data8(uint32 id, uint32 data)
                        tile_reg[3] = data;
                        break;
                case ALU_OFFSET_REG_HIGH:
-                       is_400line = (target->read_signal(SIG_DISPLAY_MODE_IS_400LINE) != 0) ? true : false;
-                       if(is_400line) {
-                               line_addr_offset.b.h = data & 0x3f;
-                       } else {
-                               line_addr_offset.b.h = data & 0x1f;
-                       }
+                       line_addr_offset.b.h = data;
                        break;
                case ALU_OFFSET_REG_LO:
                        line_addr_offset.b.l = data;
@@ -551,7 +566,7 @@ void MB61VH010::write_data8(uint32 id, uint32 data)
                                cmp_color_data[id - ALU_CMPDATA_REG] = data;
                        } else  if((id >= ALU_WRITE_PROXY) && (id < (ALU_WRITE_PROXY + 0x18000))) {
                                is_400line = (target->read_signal(SIG_DISPLAY_MODE_IS_400LINE) != 0) ? true : false;
-                               do_alucmds(id - ALU_WRITE_PROXY);
+                               do_alucmds_dmyread(id - ALU_WRITE_PROXY);
                        }
                        break;
        }
@@ -578,7 +593,8 @@ uint32 MB61VH010::read_data8(uint32 id)
                        break;
                default:
                        if((id >= ALU_WRITE_PROXY) && (id < (ALU_WRITE_PROXY + 0x18000))) {
-                               return do_alucmds(id - ALU_WRITE_PROXY);
+                               is_400line = (target->read_signal(SIG_DISPLAY_MODE_IS_400LINE) != 0) ? true : false;
+                               do_alucmds_dmyread(id - ALU_WRITE_PROXY);
                        }
                        return 0xffffffff;
                        break;
index cfa09a2..808eafb 100644 (file)
@@ -83,11 +83,13 @@ class MB61VH010: public DEVICE {
        uint32 screen_width;
        uint32 screen_height;
        uint32 oldaddr;
+       uint32 alu_addr;
+
        pair line_style;
        
        // ALU COMMANDS
        uint8 do_read(uint32 addr,  uint32 bank);
-       uint8  do_write(uint32 addr, uint32 bank, uint8 data);
+       uint8 do_write(uint32 addr, uint32 bank, uint8 data);
        uint8 do_pset(uint32 addr);
        uint8 do_blank(uint32 addr);
        uint8 do_or(uint32 addr);
@@ -97,7 +99,8 @@ class MB61VH010: public DEVICE {
        uint8 do_tilepaint(uint32 addr);
        uint8 do_compare(uint32 addr);
        uint8 do_alucmds(uint32 addr);
-       void put_dot(int x, int y);
+       void do_alucmds_dmyread(uint32 addr);
+       bool put_dot(int x, int y);
 
        // LINE
        void do_line(void);