From 840ee75e628576eeba55da72c5abae8d8167dfbf Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Mon, 6 Apr 2015 00:41:01 +0900 Subject: [PATCH] [VM][FM77AV][MB61VH010] Fix line putting. --- source/src/vm/fm7/display.cpp | 77 +++++++----- source/src/vm/fm7/fm7_common.h | 4 + source/src/vm/fm7/fm7_mainio.cpp | 60 +++++++--- source/src/vm/fm7/fm7_mainio.h | 6 +- source/src/vm/fm7/fm7_mainmem.cpp | 4 +- source/src/vm/fm7/mb61vh010.cpp | 246 ++++++++++++++++++++------------------ source/src/vm/fm7/mb61vh010.h | 7 +- 7 files changed, 231 insertions(+), 173 deletions(-) diff --git a/source/src/vm/fm7/display.cpp b/source/src/vm/fm7/display.cpp index 36088c981..a5da6fa13 100644 --- a/source/src/vm/fm7/display.cpp +++ b/source/src/vm/fm7/display.cpp @@ -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 diff --git a/source/src/vm/fm7/fm7_common.h b/source/src/vm/fm7/fm7_common.h index a58363724..827a1454b 100644 --- a/source/src/vm/fm7/fm7_common.h +++ b/source/src/vm/fm7/fm7_common.h @@ -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 { diff --git a/source/src/vm/fm7/fm7_mainio.cpp b/source/src/vm/fm7/fm7_mainio.cpp index b86aea38a..8fef8b1ef 100644 --- a/source/src/vm/fm7/fm7_mainio.cpp +++ b/source/src/vm/fm7/fm7_mainio.cpp @@ -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; diff --git a/source/src/vm/fm7/fm7_mainio.h b/source/src/vm/fm7/fm7_mainio.h index 89ce48ee0..79b2b03d5 100644 --- a/source/src/vm/fm7/fm7_mainio.h +++ b/source/src/vm/fm7/fm7_mainio.h @@ -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 */ diff --git a/source/src/vm/fm7/fm7_mainmem.cpp b/source/src/vm/fm7/fm7_mainmem.cpp index 86f307d19..af32f6ff7 100644 --- a/source/src/vm/fm7/fm7_mainmem.cpp +++ b/source/src/vm/fm7/fm7_mainmem.cpp @@ -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 diff --git a/source/src/vm/fm7/mb61vh010.cpp b/source/src/vm/fm7/mb61vh010.cpp index 6ff0f673c..6270f5914 100644 --- a/source/src/vm/fm7/mb61vh010.cpp +++ b/source/src/vm/fm7/mb61vh010.cpp @@ -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; diff --git a/source/src/vm/fm7/mb61vh010.h b/source/src/vm/fm7/mb61vh010.h index cfa09a2d8..808eafb1d 100644 --- a/source/src/vm/fm7/mb61vh010.h +++ b/source/src/vm/fm7/mb61vh010.h @@ -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); -- 2.11.0