vram_wrote_shadow = true;
for(i = 0; i < 411; i++) vram_wrote_table[i] = true;
for(i = 0; i < 411; i++) vram_draw_table[i] = true;
+ write_access_page = 0;
+ for(i = 0; i < 411; i++) vram_wrote_pages[i] = write_access_page;
displine = 0;
active_page = 0;
#endif
vram_wrote = true;
clr_count = 0;
- frame_skip_count = 3;
+ frame_skip_count_draw = 3;
+ frame_skip_count_transfer = 3;
+ need_transfer_line = true;
}
{
}
-
void DISPLAY::copy_vram_per_line(void)
{
uint32_t src_offset;
uint32_t bytes_d1;
uint32_t bytes_d2;
uint32_t bytes_d;
+
+ uint32_t addr_d1, addr_d2;
+
int i, j, k;
//int dline = (int)displine - 1;
int dline = (int)displine;
#if defined(_FM77AV40EX) || defined(_FM77AV40SX)
pages = 2;
#endif
- bytes_d1 = 0x2000 - ((src_offset + yoff_d1) & 0x1fff);
- bytes_d2 = 0x2000 - ((src_offset + yoff_d2) & 0x1fff);
+ addr_d1 = (src_offset + yoff_d1) & 0x1fff;
+ addr_d2 = (src_offset + yoff_d2) & 0x1fff;
+ bytes_d1 = 0x2000 - addr_d1;
+ bytes_d2 = 0x2000 - addr_d2;
+ src_base = 0;
for(k = 0; k < pages; k++) {
for(i = 0; i < 3; i++) {
for(j = 0; j < 2; j++) {
- src_base = i * 0x4000 + j * 0x2000;
+ uint32_t _addr_base = src_base + src_offset + poff;
if(bytes_d1 < 40) {
- memcpy(&gvram_shadow[src_offset + src_base + poff],
- &gvram[((src_offset + yoff_d1) & 0x1fff) + src_base + poff],
+ memcpy(&gvram_shadow[_addr_base],
+ &gvram[addr_d1 + src_base + poff],
bytes_d1);
- memcpy(&gvram_shadow[src_offset + bytes_d1 + src_base + poff],
+ memcpy(&gvram_shadow[_addr_base + bytes_d1],
&gvram[src_base + poff],
40 - bytes_d1);
} else {
- memcpy(&gvram_shadow[src_offset + src_base + poff],
- &gvram[((src_offset + yoff_d1) & 0x1fff) + src_base + poff],
+ memcpy(&gvram_shadow[_addr_base],
+ &gvram[addr_d1 + src_base + poff],
40);
}
- src_base = i * 0x4000 + j * 0x2000 + 0xc000;
+ _addr_base += 0xc000;
if(bytes_d2 < 40) {
- memcpy(&gvram_shadow[src_offset + src_base + poff],
- &gvram[((src_offset + yoff_d2) & 0x1fff) + src_base + poff],
+ memcpy(&gvram_shadow[_addr_base],
+ &gvram[addr_d2 + src_base + poff + 0xc000],
bytes_d2);
- memcpy(&gvram_shadow[src_offset + bytes_d2 + src_base + poff],
- &gvram[src_base + poff],
+ memcpy(&gvram_shadow[_addr_base + bytes_d2],
+ &gvram[src_base + poff + 0xc000],
40 - bytes_d2);
} else {
- memcpy(&gvram_shadow[src_offset + src_base + poff],
- &gvram[((src_offset + yoff_d2) & 0x1fff) + src_base + poff],
+ memcpy(&gvram_shadow[_addr_base],
+ &gvram[addr_d2 + src_base + poff + 0xc000],
40);
}
+ src_base += 0x2000;
}
+ src_base = (i + 1) * 0x4000;
}
poff += 0x18000;
}
bytes_d1 = 0x4000 - ((src_offset + yoff_d1) & 0x3fff);
bytes_d2 = 0x4000 - ((src_offset + yoff_d2) & 0x3fff);
for(i = 0; i < pages; i++) {
+ if((i & 1) == 0) {
+ src_offset_d = src_offset_d1;
+ bytes_d = bytes_d1;
+ } else {
+ src_offset_d = src_offset_d2;
+ bytes_d = bytes_d2;
+ }
+ src_base = 0;
for(j = 0; j < 3; j++) {
- src_base = j * 0x4000;
- if((i & 1) == 0) {
- src_offset_d = src_offset_d1;
- bytes_d = bytes_d1;
- } else {
- src_offset_d = src_offset_d2;
- bytes_d = bytes_d2;
- }
if(bytes_d < 80) {
memcpy(&gvram_shadow[src_offset + src_base + poff],
&gvram[src_offset_d + src_base + poff],
&gvram[src_offset_d + src_base + poff],
80);
}
+ src_base += 0x4000;
}
poff += 0xc000;
}
}
#endif
}
-
+
// Timing values from XM7 . Thanks Ryu.
void DISPLAY::event_callback(int event_id, int err)
{
usec = 39.5;
if(displine < 200) f = true;
}
+ if(displine == 0) register_event(this, EVENT_FM7SUB_HBLANK, usec, false, &hblank_event_id); // NEXT CYCLE_
if(f) {
if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) != 0) {
- if(vram_wrote_table[displine] || vram_wrote) copy_vram_per_line();
+ if((vram_wrote_table[displine] || vram_wrote) && need_transfer_line/*|| vram_wrote */) copy_vram_per_line();
}
- register_event(this, EVENT_FM7SUB_HBLANK, usec, false, &hblank_event_id); // NEXT CYCLE_
vsync = false;
vblank = false;
enter_display();
hblank = true;
mainio->write_signal(SIG_DISPLAY_DISPLAY, 0x00, 0xff);
f = false;
+ if(displine == 0) {
+ if(display_mode == DISPLAY_MODE_8_400L) {
+ usec = 30.0 + 11.0;
+ } else {
+ usec = 39.5 + 24.0;
+ }
+ register_event(this, EVENT_FM7SUB_HBLANK, usec, true, &hblank_event_id); // NEXT CYCLE_
+ }
displine++;
if(display_mode == DISPLAY_MODE_8_400L) {
if((displine < 400)) f = true;
//}
//register_event(this, EVENT_FM7SUB_HDISP, usec, false, &hdisp_event_id);
cancel_event(this, hdisp_event_id);
+ cancel_event(this, hblank_event_id);
hdisp_event_id = -1;
+ hblank_event_id = -1;
}
//displine++;
break;
hblank = false;
displine = 0;
display_page_bak = display_page;
-
// Parameter from XM7/VM/display.c , thanks, Ryu.
mainio->write_signal(SIG_DISPLAY_DISPLAY, 0x00, 0xff);
mainio->write_signal(SIG_DISPLAY_VSYNC, 0x00, 0xff);
vblank = true;
hblank = false;
vsync = true;
+ write_access_page = (write_access_page + 1) & 1;
displine = 0;
if(display_mode == DISPLAY_MODE_8_400L) {
usec = 0.33 * 1000.0;
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) {
- int lines = 200;
- if(display_mode == DISPLAY_MODE_8_400L) lines = 400;
- for(int yy = 0; yy < lines; yy++) {
- if(vram_wrote_table[yy]) {
- vram_wrote_table[yy] = false;
- ff = true;
+ bool ff = false;
+ if(!vram_wrote) {
+ if(need_transfer_line) {
+ int lines = 200;
+ if(display_mode == DISPLAY_MODE_8_400L) lines = 400;
+ for(int yy = 0; yy < lines; yy++) {
+ if(vram_wrote_table[yy]) {
+ vram_wrote_table[yy] = false;
+ ff = true;
+ }
+ }
}
+ } else {
+ if(need_transfer_line) ff = true;
+ }
+ if(ff) {
+ for(int yy = 0; yy < 400; yy++) vram_draw_table[yy] = true;
+ copy_vram_all();
+ vram_wrote_shadow = true;
+ screen_update_flag = true;
+ vram_wrote = false;
}
- } else {
- ff = true;
- }
- if(ff) {
- for(int yy = 0; yy < 400; yy++) vram_draw_table[yy] = true;
- copy_vram_all();
- vram_wrote_shadow = true;
- screen_update_flag = true;
- }
} else {
- if(vram_wrote) {
- for(int yy = 0; yy < 400; yy++) {
- if(!vram_draw_table[yy]) {
- displine = yy;
- copy_vram_per_line();
+ if(need_transfer_line) {
+ if(vram_wrote) {
+ for(int yy = 0; yy < 400; yy++) {
+ if(!vram_draw_table[yy]) {
+ displine = yy;
+ copy_vram_per_line();
+ }
}
+ displine = 0;
+ vram_wrote = false;
}
- displine = 0;
}
for(int yy = 0; yy < 400; yy++) {
if(vram_draw_table[yy]) {
break;
}
}
+ //vram_wrote = false;
+ }
+ frame_skip_count_transfer++;
+ {
+ uint32_t factor = ((config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28) & 3;
+ if((frame_skip_count_transfer > factor) /* || (vram_wrote) */) {
+ frame_skip_count_transfer = 0;
+ need_transfer_line = true;
+ } else {
+ need_transfer_line = false;
+ }
}
- vram_wrote = false;
break;
#endif
case EVENT_FM7SUB_CLR_BUSY:
#if !defined(_FM77AV_VARIANTS) && !defined(_FM77L4)
int yy;
bool f = false;
-
- if(vram_wrote) {
+ if(need_transfer_line && vram_wrote) {
for(yy = 0; yy < 400; yy++) {
if(!vram_draw_table[yy]) {
displine = yy;
copy_vram_per_line();
}
}
+ vram_wrote = false;
+ displine = 0;
}
{
for(yy = 0; yy < 400; yy++) {
vram_wrote_shadow = true;
}
}
- vram_wrote = false;
- displine = 0;
enter_display();
+ frame_skip_count_transfer++;
+ {
+ uint32_t factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
+ if(frame_skip_count_transfer > factor) {
+ frame_skip_count_transfer = 0;
+ need_transfer_line = true;
+ } else {
+ need_transfer_line = false;
+ displine = 0;
+ //vram_wrote = false;
+ }
+ }
+
#endif
}
void DISPLAY::event_vline(int v, int clock)
{
#if !defined(_FM77AV_VARIANTS) && !defined(_FM77L4)
-// if((v >= 200) || (v < 0)) return;
+ if(need_transfer_line == false) return;
displine = v;
if(vram_wrote_table[displine] || vram_wrote) {
copy_vram_per_line();
alu->write_signal(SIG_ALU_X_WIDTH, (mode320 || mode256k) ? 40 : 80, 0xffff);
alu->write_signal(SIG_ALU_Y_HEIGHT, (display_mode == DISPLAY_MODE_8_400L) ? 400 : 200, 0xffff);
alu->write_signal(SIG_ALU_400LINE, (display_mode == DISPLAY_MODE_8_400L) ? 0xff : 0x00, 0xff);
- frame_skip_count = 3;
+ frame_skip_count_draw = 3;
+ frame_skip_count_transfer = 3;
}
}
#elif defined(_FM77_VARIANTS)
memset(work_ram, 0x00, sizeof(work_ram));
memset(shared_ram, 0x00, sizeof(shared_ram));
memset(subsys_c, 0xff, sizeof(subsys_c));
-
+ need_transfer_line = true;
+ frame_skip_count_draw = 3;
+ frame_skip_count_transfer = 3;
+
diag_load_subrom_c = false;
#if defined(_FM8)
if(read_bios(_T("SUBSYS_8.ROM"), subsys_c, 0x2800) >= 0x2800) diag_load_subrom_c = true;
nmi_event_id = -1;
firq_mask = false;
key_firq_req = false; //firq_mask = true;
- frame_skip_count = 3;
+ frame_skip_count_transfer = 3;
+ frame_skip_count_draw = 3;
emu->set_vm_screen_size(640, 200, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
palette_changed = true;
#if !defined(_FM77AV_VARIANTS) && !defined(_FM77L4)
{
}
-#define STATE_VERSION 7
+#define STATE_VERSION 8
void DISPLAY::save_state(FILEIO *state_fio)
{
state_fio->FputUint32_BE(STATE_VERSION);
#endif
state_fio->FputBool(firq_mask);
state_fio->FputBool(vram_accessflag);
- state_fio->FputUint32_BE(frame_skip_count);
}
}
#endif
firq_mask = state_fio->FgetBool();
vram_accessflag = state_fio->FgetBool();
- frame_skip_count = state_fio->FgetUint32_BE();
+ frame_skip_count_draw = 3;
+ frame_skip_count_transfer = 3;
+ need_transfer_line = true;
}
if(version == STATE_VERSION) return true;
return false;
uint32_t b3, r3, g3;
uint8_t bb[4], rr[4], gg[4];
uint16_t pixels[8];
-
+ uint16_t __masks[8] = {mask, mask, mask, mask, mask, mask, mask, mask};
scrntype_t b, r, g;
uint32_t idx;;
scrntype_t pixel;
yoff_d2 += 0x18000;
}
# endif
-#if 1
bb[0] = gvram_shadow[yoff_d1];
bb[1] = gvram_shadow[yoff_d1 + 0x02000];
rr[0] = gvram_shadow[yoff_d1 + 0x04000];
tmp_b[i] = p0[i] | p1[i] | p2[i] | p3[i];
}
for(int i = 0; i < 8; i++) {
- pixels[i] = (tmp_g[i] * 16) | tmp_r[i] | (tmp_b[i] / 16);
- }
- for(int i = 0; i < 8; i++) {
- pixels[i] = pixels[i] & mask;
+ pixels[i] = ((tmp_g[i] * 16) | tmp_r[i] | (tmp_b[i] / 16)) & __masks[i];
}
+ //for(int i = 0; i < 8; i++) {
+ // pixels[i] = pixels[i] & mask;
+ //}
for(int i = 0; i < 8; i++) {
p[i] = analog_palette_pixel[pixels[i]];
}
-#else
- b3 = gvram_shadow[yoff_d1] << 24;
- b3 |= gvram_shadow[yoff_d1 + 0x02000] << 16;
- r3 = gvram_shadow[yoff_d1 + 0x04000] << 24;
- r3 |= gvram_shadow[yoff_d1 + 0x06000] << 16;
-
- g3 = gvram_shadow[yoff_d1 + 0x08000] << 24;
- g3 |= gvram_shadow[yoff_d1 + 0x0a000] << 16;
-
- b3 |= gvram_shadow[yoff_d2 + 0x0c000] << 8;
- b3 |= gvram_shadow[yoff_d2 + 0x0e000] << 0;
-
- r3 |= gvram_shadow[yoff_d2 + 0x10000] << 8;
- r3 |= gvram_shadow[yoff_d2 + 0x12000] << 0;
- g3 |= gvram_shadow[yoff_d2 + 0x14000] << 8;
- g3 |= gvram_shadow[yoff_d2 + 0x16000] << 0;
-
- g = ((g3 & (0x80 << 24)) >> 20) | ((g3 & (0x80 << 16)) >> 13) | ((g3 & (0x80 << 8)) >> 6) | ((g3 & 0x80) << 1);
- r = ((r3 & (0x80 << 24)) >> 24) | ((r3 & (0x80 << 16)) >> 17) | ((r3 & (0x80 << 8)) >> 10) | ((r3 & 0x80) >> 3);
- b = ((b3 & (0x80 << 24)) >> 28) | ((b3 & (0x80 << 16)) >> 21) | ((b3 & (0x80 << 8)) >> 14) | ((b3 & 0x80) >> 7);
-
- idx = (g | b | r ) & mask;
- pixel = analog_palette_pixel[idx];
- p[0] = pixel;
- //p[1] = pixel;
-
- g = ((g3 & (0x40 << 24)) >> 19) | ((g3 & (0x40 << 16)) >> 12) | ((g3 & (0x40 << 8)) >> 5) | ((g3 & 0x40) << 2);
- r = ((r3 & (0x40 << 24)) >> 23) | ((r3 & (0x40 << 16)) >> 16) | ((r3 & (0x40 << 8)) >> 9) | ((r3 & 0x40) >> 2);
- b = ((b3 & (0x40 << 24)) >> 27) | ((b3 & (0x40 << 16)) >> 20) | ((b3 & (0x40 << 8)) >> 13) | ((b3 & 0x40) >> 6);
-
- idx = (g | b | r ) & mask;
- pixel = analog_palette_pixel[idx];
- p[1] = pixel;
- //p[3] = pixel;
-
- g = ((g3 & (0x20 << 24)) >> 18) | ((g3 & (0x20 << 16)) >> 11) | ((g3 & (0x20 << 8)) >> 4) | ((g3 & 0x20) << 3);
- r = ((r3 & (0x20 << 24)) >> 22) | ((r3 & (0x20 << 16)) >> 15) | ((r3 & (0x20 << 8)) >> 8) | ((r3 & 0x20) >> 1);
- b = ((b3 & (0x20 << 24)) >> 26) | ((b3 & (0x20 << 16)) >> 19) | ((b3 & (0x20 << 8)) >> 12) | ((b3 & 0x20) >> 5);
-
- idx = (g | b | r ) & mask;
- pixel = analog_palette_pixel[idx];
- p[2] = pixel;
- //p[5] = pixel;
-
- g = ((g3 & (0x10 << 24)) >> 17) | ((g3 & (0x10 << 16)) >> 10) | ((g3 & (0x10 << 8)) >> 3) | ((g3 & 0x10) << 4);
- r = ((r3 & (0x10 << 24)) >> 21) | ((r3 & (0x10 << 16)) >> 14) | ((r3 & (0x10 << 8)) >> 7) | ((r3 & 0x10) >> 0);
- b = ((b3 & (0x10 << 24)) >> 25) | ((b3 & (0x10 << 16)) >> 18) | ((b3 & (0x10 << 8)) >> 11) | ((b3 & 0x10) >> 4);
-
- idx = (g | b | r ) & mask;
- pixel = analog_palette_pixel[idx];
- p[3] = pixel;
- //p[7] = pixel;
-
- g = ((g3 & (0x8 << 24)) >> 16) | ((g3 & (0x8 << 16)) >> 9) | ((g3 & (0x8 << 8)) >> 2) | ((g3 & 0x8) << 5);
- r = ((r3 & (0x8 << 24)) >> 20) | ((r3 & (0x8 << 16)) >> 13) | ((r3 & (0x8 << 8)) >> 6) | ((r3 & 0x8) << 1);
- b = ((b3 & (0x8 << 24)) >> 24) | ((b3 & (0x8 << 16)) >> 17) | ((b3 & (0x8 << 8)) >> 10) | ((b3 & 0x8) >> 3);
-
- idx = (g | b | r ) & mask;
- pixel = analog_palette_pixel[idx];
- p[4] = pixel;
- //p[9] = pixel;
-
-
- g = ((g3 & (0x4 << 24)) >> 15) | ((g3 & (0x4 << 16)) >> 8) | ((g3 & (0x4 << 8)) >> 1) | ((g3 & 0x4) << 6);
- r = ((r3 & (0x4 << 24)) >> 19) | ((r3 & (0x4 << 16)) >> 12) | ((r3 & (0x4 << 8)) >> 5) | ((r3 & 0x4) << 2);
- b = ((b3 & (0x4 << 24)) >> 23) | ((b3 & (0x4 << 16)) >> 16) | ((b3 & (0x4 << 8)) >> 9) | ((b3 & 0x4) >> 2);
-
- idx = (g | b | r ) & mask;
- pixel = analog_palette_pixel[idx];
- p[5] = pixel;
- //p[11] = pixel;
-
- g = ((g3 & (0x2 << 24)) >> 14) | ((g3 & (0x2 << 16)) >> 7) | ((g3 & (0x2 << 8)) >> 0) | ((g3 & 0x2) << 7);
- r = ((r3 & (0x2 << 24)) >> 18) | ((r3 & (0x2 << 16)) >> 11) | ((r3 & (0x2 << 8)) >> 4) | ((r3 & 0x2) << 3);
- b = ((b3 & (0x2 << 24)) >> 22) | ((b3 & (0x2 << 16)) >> 15) | ((b3 & (0x2 << 8)) >> 8) | ((b3 & 0x2) >> 1);
-
- idx = (g | b | r ) & mask;
- pixel = analog_palette_pixel[idx];
- p[6] = pixel;
- //p[13] = pixel;
-
- g = ((g3 & (0x1 << 24)) >> 13) | ((g3 & (0x1 << 16)) >> 6) | ((g3 & (0x1 << 8)) << 1) | ((g3 & 0x1) << 8);
- r = ((r3 & (0x1 << 24)) >> 17) | ((r3 & (0x1 << 16)) >> 10) | ((r3 & (0x1 << 8)) >> 3) | ((r3 & 0x1) << 4);
- b = ((b3 & (0x1 << 24)) >> 21) | ((b3 & (0x1 << 16)) >> 14) | ((b3 & (0x1 << 8)) >> 7) | ((b3 & 0x1) >> 0);
-
- idx = (g | b | r ) & mask;
- pixel = analog_palette_pixel[idx];
- p[7] = pixel;
-#endif
//p[15] = pixel;
}
#endif
if(_flag != window_opened) vram_wrote_shadow = true;
}
#endif
- frame_skip_count++;
+// frame_skip_count_draw++;
#if defined(_FM77AV_VARIANTS)
- {
- uint32_t factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
- if(frame_skip_count < factor) return;
- frame_skip_count = 0;
- }
yoff_d2 = 0;
yoff_d1 = 0;
#else
- {
- uint32_t factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
- if((frame_skip_count < factor) || !(vram_wrote_shadow)) return;
- frame_skip_count = 0;
- }
+ //if(!(vram_wrote_shadow)) return;
yoff_d1 = yoff_d2 = offset_point;
#endif
// Set blank
}
}
crt_flag_bak = crt_flag;
+// {
+// uint32_t factor = ((config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28) & 3;
+// if(frame_skip_count_draw < factor) return;
+// frame_skip_count_draw = 0;
+// }
return;
}
crt_flag_bak = crt_flag;
+// {
+// uint32_t factor = ((config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28) & 3;
+// if(frame_skip_count_draw < factor) return;
+// frame_skip_count_draw = 0;
+// }
if(!vram_wrote_shadow && !palette_changed) return;
vram_wrote_shadow = false;
if(palette_changed) {