palette_changed = true;
multimode_accessmask = 0;
multimode_dispmask = 0;
+ for(i = 0; i < 4; i++) {
+ multimode_accessflags[i] = ((multimode_accessmask & (1 << i)) != 0) ? true : false;
+ multimode_dispflags[i] = ((multimode_dispmask & (1 << i)) != 0) ? true : false;
+ }
firq_mask = false;
//cancel_request = false;
switch(config.cpu_type){
#else
# if defined(_FM8)
for(i = 0; i < 8; i++) set_dpalette(i, i);
- multimode_accessmask = 0x00;
- multimode_dispmask = 0x00;
+ //multimode_accessmask = 0x00;
+ //multimode_dispmask = 0x00;
+ //for(i = 0; i < 4; i++) {
+ // multimode_accessflags[i] = ((multimode_accessmask & (1 << color)) != 0) ? true : false;
+ // multimode_dispflags[i] = ((multimode_dispmask & (1 << color)) != 0) ? true : false;
+ //}
# endif
#endif
//enter_display();
#if !defined(_FM8)
multimode_accessmask = val & 0x07;
multimode_dispmask = (val & 0x70) >> 4;
+ for(int i = 0; i < 4; i++) {
+ multimode_accessflags[i] = ((multimode_accessmask & (1 << i)) != 0) ? true : false;
+ multimode_dispflags[i] = ((multimode_dispmask & (1 << i)) != 0) ? true : false;
+ }
vram_wrote = true;
# if defined(_FM77AV_VARIANTS)
alu->write_signal(SIG_ALU_MULTIPAGE, multimode_accessmask, 0x07);
mainio->write_signal(SIG_DISPLAY_DISPLAY, 0x00, 0xff);
register_event(this, EVENT_FM7SUB_VSTART, usec, false, &vstart_event_id); // NEXT CYCLE_
if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) == 0) {
- bool ff = false;
- if(vram_wrote) {
- if(need_transfer_line) ff = true;
+ bool ff = false;
+ int lines = 200;
+ if(display_mode == DISPLAY_MODE_8_400L) lines = 400;
+ if(need_transfer_line) {
+ if(vram_wrote) ff = true;
+ //if(need_transfer_line) ff = true;
+ //}
+ for(displine = 0; displine < lines; displine++) {
+ if(ff) break;
+ for(int iii = 0; iii < 5 ; iii++) {
+ if(vram_wrote_table[iii + displine * 5]) {
+ ff = true;
+ break;
+ }
+ }
}
- if(ff) {
- int lines = 200;
- if(display_mode == DISPLAY_MODE_8_400L) lines = 400;
- for(int yy = 0; yy < lines; yy++) {
- //if(!vram_draw_table[yy]) {
- displine = yy;
- copy_vram_per_line(0, 4);
- vram_draw_table[yy] = true;
- //}
+ displine = 0;
+ }
+ if(ff) {
+ for(int yy = 0; yy < lines; yy++) {
+ if(!vram_draw_table[yy]) {
+ displine = yy;
+ copy_vram_per_line(0, 4);
+ vram_draw_table[yy] = true;
}
-
- //copy_vram_all();
- vram_wrote_shadow = true;
- screen_update_flag = true;
- vram_wrote = false;
}
+ //copy_vram_all();
+ vram_wrote_shadow = true;
+ screen_update_flag = true;
+ vram_wrote = false;
+ }
} else {
int lines = 200;
if(display_mode == DISPLAY_MODE_8_400L) lines = 400;
if(vram_wrote) {
for(int yy = 0; yy < lines; yy++) {
//if(!vram_draw_table[yy]) {
- displine = yy;
- copy_vram_per_line(0, 4);
- //}
+ displine = yy;
+ copy_vram_per_line(0, 4);
+ //}
}
displine = 0;
vram_wrote = false;
}
# endif
# if !defined(_FM8)
- if((multimode_accessmask & (1 << color)) != 0) return 0xff;
+ //if((multimode_accessmask & (1 << color)) != 0) return 0xff;
+ if(multimode_accessflags[color]) return 0xff;
# endif
#if defined(_FM77AV_VARIANTS)
if (active_page != 0) {
}
#endif
#if !defined(_FM8)
- if((multimode_accessmask & (1 << color)) != 0) return;
+ //if((multimode_accessmask & (1 << color)) != 0) return;
+ if(multimode_accessflags[color]) return;
#endif
write_vram_data8(addr & 0xffff, data);
}
}
#endif
#if !defined(_FM8)
- if((multimode_accessmask & (1 << color)) != 0) return;
+ //if((multimode_accessmask & (1 << color)) != 0) return;
+ if(multimode_accessflags[color]) return;
#endif
write_vram_data8(addr & 0xffff, data);
}
is_cyclesteal = true;
#else
is_cyclesteal = false;
-#endif
+#endif
+ multimode_accessmask = multimode_dispmask = 0;
+ for(i = 0; i < 4; i++) {
+ multimode_accessflags[i] = ((multimode_accessmask & (1 << i)) != 0) ? true : false;
+ multimode_dispflags[i] = ((multimode_dispmask & (1 << i)) != 0) ? true : false;
+ }
// emu->set_vm_screen_size(640, 200, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
emu->set_vm_screen_size(640, 200, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
enter_display();
for(addr = 0; addr < 8; addr++) set_dpalette(addr, dpalette_data[addr]);
multimode_accessmask = state_fio->FgetUint8();
multimode_dispmask = state_fio->FgetUint8();
+ for(i = 0; i < 4; i++) {
+ multimode_accessflags[i] = ((multimode_accessmask & (1 << i)) != 0) ? true : false;
+ multimode_dispflags[i] = ((multimode_dispmask & (1 << i)) != 0) ? true : false;
+ }
#endif
offset_point = state_fio->FgetUint32_BE();
#if defined(_FM77AV_VARIANTS)
#endif
}
-void DISPLAY::GETVRAM_8_200L(int yoff, scrntype_t *p, uint32_t mask,
+void DISPLAY::GETVRAM_8_200L(int yoff, scrntype_t *p,
bool window_inv = false)
{
uint8_t b, r, g;
#if defined(_FM77AV_VARIANTS)
if(display_page_bak == 1) yoff_d += 0xc000;
#endif
+#if 0
if(mask & 0x01) b = gvram_shadow[yoff_d + 0x00000];
if(mask & 0x02) r = gvram_shadow[yoff_d + 0x04000];
if(mask & 0x04) g = gvram_shadow[yoff_d + 0x08000];
+#else
+ if(!multimode_dispflags[0]) b = gvram_shadow[yoff_d + 0x00000];
+ if(!multimode_dispflags[1]) r = gvram_shadow[yoff_d + 0x04000];
+ if(!multimode_dispflags[2]) g = gvram_shadow[yoff_d + 0x08000];
+#endif
#if 1
uint16_t *pg = &(bit_trans_table_0[g][0]);
uint16_t *pr = &(bit_trans_table_1[r][0]);
}
#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
-void DISPLAY::GETVRAM_8_400L(int yoff, scrntype_t *p, uint32_t mask,
+void DISPLAY::GETVRAM_8_400L(int yoff, scrntype_t *p,
bool window_inv = false)
{
uint8_t b, r, g;
if(dpage != 0) yoff_d += 0x18000;
# endif
b = r = g = 0;
+#if 0
if(mask & 0x01) b = gvram_shadow[yoff_d + 0x00000];
if(mask & 0x02) r = gvram_shadow[yoff_d + 0x08000];
if(mask & 0x04) g = gvram_shadow[yoff_d + 0x10000];
+#else
+ if(!multimode_dispflags[0]) b = gvram_shadow[yoff_d + 0x00000];
+ if(!multimode_dispflags[1]) r = gvram_shadow[yoff_d + 0x08000];
+ if(!multimode_dispflags[2]) g = gvram_shadow[yoff_d + 0x10000];
+#endif
#if 1
uint16_t *pg = &(bit_trans_table_0[g][0]);
uint16_t *pr = &(bit_trans_table_1[r][0]);
#endif
}
-void DISPLAY::GETVRAM_256k(int yoff, scrntype_t *p, uint32_t mask)
+void DISPLAY::GETVRAM_256k(int yoff, scrntype_t *p)
{
uint32_t b3, r3, g3;
uint32_t b4, r4, g4;
uint8_t bb[8], rr[8], gg[8];
uint16_t *p0, *p1, *p2, *p3, *p4, *p5;
uint32_t _btmp[8], _rtmp[8], _gtmp[8];
- if(mask & 0x01) {
+// if(mask & 0x01) {
+ if(!multimode_dispflags[0]) {
// B
bb[0] = gvram_shadow[yoff_d1];
bb[1] = gvram_shadow[yoff_d1 + 0x02000];
_btmp[i] = 0;
}
}
- if(mask & 0x02) {
+ if(!multimode_dispflags[1]) {
+ //if(mask & 0x02) {
// R
rr[0] = gvram_shadow[yoff_d1 + 0x04000];
rr[1] = gvram_shadow[yoff_d1 + 0x06000];
_rtmp[i] = 0;
}
}
- if(mask & 0x04) {
+ if(!multimode_dispflags[2]) {
+ //if(mask & 0x04) {
// G
gg[0] = gvram_shadow[yoff_d1 + 0x08000];
gg[1] = gvram_shadow[yoff_d1 + 0x0a000];
}
#else
- if(mask & 0x01) {
+ if(!multimode_dispflags[0]) {
+ //if(mask & 0x01) {
b3 = gvram_shadow[yoff_d1] << 24;
b3 |= gvram_shadow[yoff_d1 + 0x02000] << 16;
b4 = gvram_shadow[yoff_d1 + 0x18000] << 8;
b4 |= gvram_shadow[yoff_d1 + 0x1a000] << 0;
}
- if(mask & 0x02) {
+ if(!multimode_dispflags[1]) {
+ //if(mask & 0x02) {
r3 = gvram_shadow[yoff_d1 + 0x04000] << 24;
r3 |= gvram_shadow[yoff_d1 + 0x06000] << 16;
r3 |= gvram_shadow[yoff_d2 + 0x10000] << 8;
r4 |= gvram_shadow[yoff_d1 + 0x1e000] << 0;
}
- if(mask & 0x04) {
+ if(!multimode_dispflags[2]) {
+ //if(mask & 0x04) {
g3 = gvram_shadow[yoff_d1 + 0x08000] << 24;
g3 |= gvram_shadow[yoff_d1 + 0x0a000] << 16;
g3 |= gvram_shadow[yoff_d2 + 0x14000] << 8;
for(_shift = 7; _shift >= 0; _shift--) {
_bit = 0x01010101 << _shift;
r = g = b = 0;
- if(mask & 0x01) {
+ if(!multimode_dispflags[0]) {
+ //if(mask & 0x01) {
btmp = (b3 & _bit) >> _shift;
b = (((btmp & (0x01 << 24)) != 0) ? 0x80 : 0) | (((btmp & (0x01 << 16)) != 0)? 0x40 : 0)
| (((btmp & (0x01 << 8)) != 0) ? 0x20 : 0) | (((btmp & 0x01) != 0) ? 0x10 : 0);
btmp = (b4 & _bit) >> _shift;
b = b | (((btmp & (0x01 << 8)) != 0) ? 0x08 : 0) | (((btmp & 0x01) != 0) ? 0x04 : 0);
}
- if(mask & 0x02) {
+ if(!multimode_dispflags[1]) {
+ //if(mask & 0x02) {
rtmp = (r3 & _bit) >> _shift;
r = ((rtmp & (0x01 << 24)) ? 0x80 : 0) | ((rtmp & (0x01 << 16)) ? 0x40 : 0)
| ((rtmp & (0x01 << 8)) ? 0x20 : 0) | ((rtmp & 0x01) ? 0x10 : 0);
rtmp = (r4 & _bit) >> _shift;
r = r | ((rtmp & (0x01 << 8)) ? 0x08 : 0) | ((rtmp & 0x01) ? 0x04 : 0);
}
- if(mask & 0x04) {
+ if(!multimode_dispflags[2]) {
+ //if(mask & 0x04) {
gtmp = (g3 & _bit) >> _shift;
g = ((gtmp & (0x01 << 24)) ? 0x80 : 0) | ((gtmp & (0x01 << 16)) ? 0x40 : 0)
| ((gtmp & (0x01 << 8)) ? 0x20 : 0) | ((gtmp & 0x01) ? 0x10 : 0);
uint32_t b3, r3, g3;
uint8_t bb[4], rr[4], gg[4];
uint16_t pixels[8];
- uint16_t __masks[8] = {(uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask};
+ const uint16_t __masks[8] = {(uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask};
scrntype_t b, r, g;
uint32_t idx;;
scrntype_t pixel;
int x;
scrntype_t *p, *pp;
int yoff;
- uint32_t rgbmask;
+ //uint32_t rgbmask;
uint32_t yoff_d1, yoff_d2;
uint16_t wx_begin, wx_end, wy_low, wy_high;
int ii;
emu->set_vm_screen_size(640, 200, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
yoff = 0;
- rgbmask = ~multimode_dispmask;
+ //rgbmask = ~multimode_dispmask;
for(y = 0; y < 200; y ++) {
if(!vram_draw_table[y]) continue;
vram_draw_table[y] = false;
if(window_opened && (wy_low <= y) && (wy_high > y)) {
for(x = 0; x < 80; x++) {
if((x >= wx_begin) && (x < wx_end)) {
- GETVRAM_8_200L(yoff, p, rgbmask, true);
+ GETVRAM_8_200L(yoff, p, true);
} else {
- GETVRAM_8_200L(yoff, p, rgbmask, false);
+ GETVRAM_8_200L(yoff, p, false);
}
p += 8;
yoff++;
{
for(x = 0; x < 10; x++) {
for(ii = 0; ii < 8; ii++) {
- GETVRAM_8_200L(yoff + ii, p, rgbmask, false);
+ GETVRAM_8_200L(yoff + ii, p, false);
p += 8;
}
yoff += 8;
uint32_t mask = 0;
int ii;
yoff = 0;
+#if 0
rgbmask = multimode_dispmask;
if((rgbmask & 0x01) == 0) mask = 0x00f;
if((rgbmask & 0x02) == 0) mask = mask | 0x0f0;
if((rgbmask & 0x04) == 0) mask = mask | 0xf00;
+#else
+ if(!multimode_dispflags[0]) mask = 0x00f;
+ if(!multimode_dispflags[1]) mask = mask | 0x0f0;
+ if(!multimode_dispflags[2]) mask = mask | 0xf00;
+#endif
for(y = 0; y < 200; y ++) {
if(!vram_draw_table[y]) continue;
vram_draw_table[y] = false;
int ii;
emu->set_vm_screen_size(640, 400, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
yoff = 0;
- rgbmask = ~multimode_dispmask;
+ //rgbmask = ~multimode_dispmask;
for(y = 0; y < 400; y++) {
if(!vram_draw_table[y]) continue;
vram_draw_table[y] = false;
if(window_opened && (wy_low <= y) && (wy_high > y)) {
for(x = 0; x < 80; x++) {
if((x >= wx_begin) && (x < wx_end)) {
- GETVRAM_8_400L(yoff, p, rgbmask, true);
+ GETVRAM_8_400L(yoff, p, true);
} else {
- GETVRAM_8_400L(yoff, p, rgbmask, false);
+ GETVRAM_8_400L(yoff, p, false);
}
p += 8;
yoff++;
for(x = 0; x < 10; x++) {
for(ii = 0; ii < 8; ii++) {
- GETVRAM_8_400L(yoff + ii, p, rgbmask);
+ GETVRAM_8_400L(yoff + ii, p);
p += 8;
}
yoff += 8;
} else if(display_mode == DISPLAY_MODE_256k) {
int ii;
emu->set_vm_screen_size(320, 200, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
- rgbmask = ~multimode_dispmask;
+ //rgbmask = ~multimode_dispmask;
for(y = 0; y < 200; y++) {
if(!vram_draw_table[y]) continue;
vram_draw_table[y] = false;
{
for(x = 0; x < 5; x++) {
for(ii = 0; ii < 8; ii++) {
- GETVRAM_256k(yoff + ii, p, rgbmask);
+ GETVRAM_256k(yoff + ii, p);
p += 8;
}
yoff += 8;