}
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
#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;
}
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)
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;
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;
}
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;
}
#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
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 {
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
}
}
#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;
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;
}
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 {
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 {
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;
}
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);
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 {
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
}
}
#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();
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);
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);
#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;
/* 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 */
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);
#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
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;
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;
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);
{
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;
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;
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) {
}
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);
//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) ;
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)
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;
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;
}
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;
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);
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);