#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;
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);
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
//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;
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
//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;
}
//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 {
//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;
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;
}
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;
void MB61VH010::do_compare(uint32_t addr)
{
- uint32_t offset = 0x4000;
uint8_t r, g, b;
uint8_t disables = ~bank_disable_reg;
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;
}
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) {
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++;
}
}
{
- updated = put_dot(cpx_t, cpy_t);
+ put_dot(cpx_t, cpy_t);
cpx_t++;
left--;
if((cpx_t & 0x07) == 7) total_bytes++;
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++;
}
{
if((cpx_t & 7) == 0) total_bytes++;
- updated = put_dot(cpx_t, cpy_t);
+ put_dot(cpx_t, cpy_t);
left--;
cpx_t--;
}
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++;
}
}
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;
} 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;
}
}
}
- updated = put_dot(cpx_t, cpy_t);
+ put_dot(cpx_t, cpy_t);
count += diff;
if(count > 16384) {
if(ay < 0) {
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;
} 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) {
_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;
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;
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;
}
}
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;
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;
}
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;
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)
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)
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;
}