// totally non-real-blitter-like state save but better than nothing..
-uae_u8 *restore_blitter_new (uae_u8 *src)
+uae_u8 *restore_blitter_new(uae_u8 *src)
{
uae_u8 state, tmp;
blt_statefile_type = 1;
blitter_cycle_exact = restore_u8();
- if (blitter_cycle_exact == 3) {
+ if (blitter_cycle_exact & 2) {
blt_statefile_type = 2;
blitter_cycle_exact = 1;
}
restore_u8();
restore_u8();
- if (restore_u16() != 0x1234)
- write_log (_T("error\n"));
+ if (restore_u16() != 0x1234) {
+ write_log(_T("blitter state restore error\n"));
+ }
blt_info.blitter_nasty = restore_u8();
tmp = restore_u8();
- shifter[0] = (tmp & 1) != 0;
- shifter[1] = (tmp & 2) != 0;
- shifter[2] = (tmp & 4) != 0;
- shifter[3] = (tmp & 8) != 0;
- blt_info.blit_finald = restore_u8();
- blit_ovf = restore_u8();
+ if (blt_statefile_type < 2) {
+ tmp = 0;
+ blt_info.blit_finald = 0;
+ } else {
+ shifter[0] = (tmp & 1) != 0;
+ shifter[1] = (tmp & 2) != 0;
+ shifter[2] = (tmp & 4) != 0;
+ shifter[3] = (tmp & 8) != 0;
+ blt_info.blit_finald = restore_u8();
+ blit_ovf = restore_u8();
+ }
blt_info.blit_main = 0;
- blt_info.blit_finald = 0;
blt_info.blit_pending = 0;
if (!blitter_cycle_exact) {
if (state > 0)
do_blitter(0, 0, 0);
} else {
- if (state == 1)
- blt_info.blit_pending = 1;
- else if (state == 2)
- blt_info.blit_main = 1;
- if (blt_info.blit_finald) {
+ // if old blitter active state file:
+ // stop blitter. We can't support them anymore.
+ if (state == 2 && blt_statefile_type < 2) {
+ blt_info.blit_pending = 0;
blt_info.blit_main = 0;
- }
- if (blt_statefile_type == 2) {
- blit_bltset(0);
+ } else {
+ if (state == 1) {
+ blt_info.blit_pending = 1;
+ } else if (state == 2) {
+ blt_info.blit_main = 1;
+ }
+ if (blt_info.blit_finald) {
+ blt_info.blit_main = 0;
+ }
+ if (blt_statefile_type == 2) {
+ blit_bltset(0);
+ }
}
}
return src;
}
-uae_u8 *save_blitter_new (int *len, uae_u8 *dstptr)
+uae_u8 *save_blitter_new(int *len, uae_u8 *dstptr)
{
uae_u8 *dstbak,*dst;
if (dstptr)
dstbak = dst = xmalloc (uae_u8, 1000);
uae_u8 state;
- save_u8 (blitter_cycle_exact ? 3 : 0);
- if (!blt_info.blit_main && !blt_info.blit_finald)
+ save_u8(blitter_cycle_exact ? 3 : 0);
+ if (!blt_info.blit_main && !blt_info.blit_finald) {
state = 0;
- else if (blt_info.blit_pending)
+ } else if (blt_info.blit_pending) {
state = 1;
- else
+ } else {
state = 2;
- save_u8 (state);
+ }
+ save_u8(state);
if (blt_info.blit_main || blt_info.blit_finald) {
- write_log (_T("BLITTER active while saving state\n"));
+ write_log(_T("BLITTER active while saving state\n"));
if (log_blitter)
blitter_dump();
}
m2 = bpl2mod_prev;
}
if (fmode & 0x4000) {
- if (((diwstrt >> 8) ^ vpos) & 1)
+ if (((diwstrt >> 8) ^ vposh) & 1) {
mod = m2;
- else
+ } else {
mod = m1;
- } else if (nr & 1)
+ }
+ } else if (nr & 1) {
mod = m2;
- else
+ } else {
mod = m1;
+ }
add_mod(nr, mod);
}
uae_s16 m1, m2;
if (fmode & 0x4000) {
- if (((diwstrt >> 8) ^ vpos) & 1)
+ if (((diwstrt >> 8) ^ vposh) & 1) {
m1 = m2 = bpl2mod;
- else
+ } else {
m1 = m2 = bpl1mod;
+ }
} else {
m1 = bpl1mod;
m2 = bpl2mod;
}
}
-static void update_fetch_x (int until, int fm)
-{
- int pos;
-
- if (nodraw ())
- return;
-
- pos = last_fetch_hpos;
- update_toscr_planes (fm);
-
- // not optimized, update_fetch_x() is extremely rarely used.
- for (; pos < until; pos++) {
-
- toscr_nbits += toscr_res2p;
-
- if (toscr_nbits > 16) {
- uae_abort (_T("xtoscr_nbits > 16 (%d)"), toscr_nbits);
- toscr_nbits = 0;
- }
- if (toscr_nbits == 16)
- flush_display (fm);
-
- }
-
- if (until >= maxhpos) {
- maybe_finish_last_fetch(pos, fm);
- return;
- }
-
- flush_display (fm);
-}
-
static void update_fetch(int until, int fm)
{
+ int dma = dmaen(DMA_BITPLANE);
int hpos = last_fetch_hpos;
- int dma = dmaen (DMA_BITPLANE);
-
- if (1 && (nodraw() || !bprun_pipeline_flush_delay)) {
- if (hpos < until) {
- int diff = until - hpos;
- rga_pipeline_bpl_read += diff;
- rga_pipeline_bpl_read &= RGA_PIPELINE_MASK;
- rga_pipeline_bpl_write += diff;
- rga_pipeline_bpl_write &= RGA_PIPELINE_MASK;
- flush_display(fm);
- last_fetch_hpos = until;
- }
- return;
- }
- cycle_diagram_shift = last_fetch_hpos - fetch_cycle;
#if 0
+ cycle_diagram_shift = last_fetch_hpos - fetch_cycle;
/* First, a loop that prepares us for the speedup code. We want to enter
the SPEEDUP case with fetch_state == fetch_was_plane0 or it is the very
first fetch cycle (which equals to same state as fetch_was_plane0)
static void decide_bpl_fetch(int endhpos)
{
+ int hpos = last_fetch_hpos;
+
+ if (1 && (nodraw() || !bprun_pipeline_flush_delay)) {
+ if (hpos < endhpos) {
+ int diff = endhpos - hpos;
+ rga_pipeline_bpl_read += diff;
+ rga_pipeline_bpl_read &= RGA_PIPELINE_MASK;
+ rga_pipeline_bpl_write += diff;
+ rga_pipeline_bpl_write &= RGA_PIPELINE_MASK;
+ flush_display(fetchmode);
+ last_fetch_hpos = endhpos;
+ }
+ return;
+ }
+
+
switch (fetchmode) {
case 0: update_fetch_0(endhpos); break;
#ifdef AGA
}
}
- hsyncstartpos_start = hsyncstartpos;
+ hsyncstartpos_start = hsyncstartpos + (1 << CCK_SHRES_SHIFT);
if (hsyncstartpos < hsyncendpos) {
hsyncstartpos = (maxhpos << CCK_SHRES_SHIFT) + hsyncstartpos;
hsynctotal = hsyncstartpos;
SET_LINE_CYCLEBASED;
fmode_saved = v;
set_chipset_mode();
- bpldmainitdelay (hpos);
+ bpldmainitdelay(hpos);
record_register_change(hpos, 0x1fc, fmode);
}
{
#ifdef PICASSO96
frame_time_t start, end;
- start = read_processor_time ();
- picasso_handle_vsync ();
- end = read_processor_time ();
+ start = read_processor_time();
+ picasso_handle_vsync();
+ end = read_processor_time();
frameskiptime += end - start;
#endif
}
-static void rtg_vsynccheck (void)
+static void rtg_vsynccheck(void)
{
#if 0
if (vblank_found_rtg) {
vblank_found_rtg = false;
- rtg_vsync ();
+ rtg_vsync();
}
#endif
}
struct amigadisplay *ad = &adisplays[0];
frame_time_t curr_time;
frame_time_t start;
- int vs = isvsync_chipset ();
+ int vs = isvsync_chipset();
int status = 0;
events_reset_syncline();
static struct mavg_data ma_frameskipt;
- int frameskipt_avg = mavg (&ma_frameskipt, frameskiptime, MAVG_VSYNC_SIZE);
+ int frameskipt_avg = mavg(&ma_frameskipt, frameskiptime, MAVG_VSYNC_SIZE);
frameskiptime = 0;
static frame_time_t vsync_time;
int t;
- curr_time = read_processor_time ();
+ curr_time = read_processor_time();
vsyncwaittime = vsyncmaxtime = curr_time + vsynctimebase;
if (!frame_rendered && !ad->picasso_on)
frame_rendered = render_screen(0, 1, false);
- start = read_processor_time ();
+ start = read_processor_time();
t = 0;
if ((int)start - (int)vsync_time >= 0 && (int)start - (int)vsync_time < vsynctimebase)
t += (int)start - (int)vsync_time;
maybe_process_pull_audio();
- int legacy_avg = mavg (&ma_legacy, t, MAVG_VSYNC_SIZE);
+ int legacy_avg = mavg(&ma_legacy, t, MAVG_VSYNC_SIZE);
if (t > legacy_avg)
legacy_avg = t;
t = legacy_avg;
if (debug_vsync_forced_delay > 0)
t = debug_vsync_forced_delay * vsynctimebase / 100;
- vsync_time = read_processor_time ();
+ vsync_time = read_processor_time();
if (t > vsynctimebase * 2 / 3)
t = vsynctimebase * 2 / 3;
if (currprefs.m68k_speed_throttle) {
// this delay can safely overshoot frame time by 1-2 ms, following code will compensate for it.
for (;;) {
- curr_time = read_processor_time ();
+ curr_time = read_processor_time();
if ((int)vsyncwaittime - (int)curr_time <= 0 || (int)vsyncwaittime - (int)curr_time > 2 * vsynctimebase)
break;
rtg_vsynccheck ();
}
}
} else {
- curr_time = read_processor_time ();
+ curr_time = read_processor_time();
}
int max;
start = read_processor_time();
if (!frame_rendered && !ad->picasso_on) {
frame_rendered = render_screen(0, 1, false);
- t = read_processor_time () - start;
+ t = read_processor_time() - start;
}
if (!currprefs.cpu_thread) {
while (!currprefs.turbo_emulation) {
}
}
idletime += read_processor_time() - start;
- curr_time = read_processor_time ();
+ curr_time = read_processor_time();
vsyncmintime = curr_time;
vsyncmaxtime = vsyncwaittime = curr_time + vstb;
if (frame_rendered) {
show_screen(0, 0);
- t += read_processor_time () - curr_time;
+ t += read_processor_time() - curr_time;
}
t += frameskipt_avg;
#define FPSCOUNTER_MAVG_SIZE 10
static struct mavg_data fps_mavg, idle_mavg;
-void fpscounter_reset (void)
+void fpscounter_reset(void)
{
- mavg_clear (&fps_mavg);
- mavg_clear (&idle_mavg);
+ mavg_clear(&fps_mavg);
+ mavg_clear(&idle_mavg);
bogusframe = 2;
- lastframetime = read_processor_time ();
+ lastframetime = read_processor_time();
idletime = 0;
}
-static void fpscounter (bool frameok)
+static void fpscounter(bool frameok)
{
frame_time_t now, last;
- now = read_processor_time ();
+ now = read_processor_time();
last = now - lastframetime;
lastframetime = now;
if (bogusframe || (int)last < 0)
return;
- mavg (&fps_mavg, last / 10, FPSCOUNTER_MAVG_SIZE);
- mavg (&idle_mavg, idletime / 10, FPSCOUNTER_MAVG_SIZE);
+ mavg(&fps_mavg, last / 10, FPSCOUNTER_MAVG_SIZE);
+ mavg(&idle_mavg, idletime / 10, FPSCOUNTER_MAVG_SIZE);
idletime = 0;
frametime += last;
if (bogusframe > 0)
bogusframe--;
- config_check_vsync ();
+ config_check_vsync();
if (timehack_alive > 0)
timehack_alive--;
#ifdef PICASSO96
- if (isvsync_rtg () >= 0)
- rtg_vsync ();
+ if (isvsync_rtg() >= 0)
+ rtg_vsync();
#endif
if (!vsync_rendered) {
frame_time_t start, end;
- start = read_processor_time ();
+ start = read_processor_time();
vsync_handle_redraw(lof_store, lof_changed, bplcon0, bplcon3, isvsync_chipset() >= 0);
vsync_rendered = true;
- end = read_processor_time ();
+ end = read_processor_time();
frameskiptime += end - start;
}
// GUI check here, must be after frame rendering
devices_vsync_pre();
- fpscounter (frameok);
+ fpscounter(frameok);
bool waspaused = false;
while (handle_events()) {
else
vblank_hz_state = 1;
- vsync_handle_check ();
+ vsync_handle_check();
//checklacecount (bplcon0_interlace_seen || lof_lace);
}
static frame_time_t prevtime;
//write_log (_T("%d %d %d\n"), vsynctimebase, read_processor_time () - vsyncmintime, read_processor_time () - prevtime);
- prevtime = read_processor_time ();
+ prevtime = read_processor_time();
#if CUSTOM_DEBUG > 1
if ((intreq & 0x0020) && (intena & 0x0020))
- write_log (_T("vblank interrupt not cleared\n"));
+ write_log(_T("vblank interrupt not cleared\n"));
#endif
DISK_vsync ();
#ifdef WITH_LUA
- uae_lua_run_handler ("on_uae_vsync");
+ uae_lua_run_handler("on_uae_vsync");
#endif
if (bplcon0 & 4) {
lof_prev_lastline = lof_lastline;
lof_current = lof_store;
if (lof_togglecnt_lace >= LOF_TOGGLES_NEEDED) {
- interlace_changed = notice_interlace_seen (true);
+ interlace_changed = notice_interlace_seen(true);
if (interlace_changed) {
notice_screen_contents_lost(monid);
}
} else if (lof_togglecnt_nlace >= LOF_TOGGLES_NEEDED) {
- interlace_changed = notice_interlace_seen (false);
+ interlace_changed = notice_interlace_seen(false);
if (interlace_changed) {
notice_screen_contents_lost(monid);
}
#ifdef DEBUGGER
if (debug_copper)
- record_copper_reset ();
+ record_copper_reset();
if (debug_dma)
- record_dma_reset ();
+ record_dma_reset();
#endif
#ifdef PICASSO96
COPJMP(1, 1);
- init_hardware_frame ();
+ init_hardware_frame();
- vsync_cycles = get_cycles ();
+ vsync_cycles = get_cycles();
}
static void copper_check (int n)
static void events_dmal(int);
static uae_u16 dmal, dmal_hpos;
+static bool dmal_ce;
static void dmal_emu(uae_u32 v)
{
v -= 6;
int nr = v / 2;
uaecptr pt = audio_getpt(nr, (v & 1) != 0);
+ if (dmal_ce) {
#ifdef DEBUGGER
- if (debug_dma) {
- record_dma_read(0xaa + nr * 16, pt, hpos, vpos, DMARECORD_AUDIO, nr);
- }
- if (memwatch_enabled) {
- debug_getpeekdma_chipram(pt, MW_MASK_AUDIO_0 << nr, 0xaa + nr * 16, 0xa0 + nr * 16);
- }
+ if (debug_dma) {
+ record_dma_read(0xaa + nr * 16, pt, hpos, vpos, DMARECORD_AUDIO, nr);
+ }
+ if (memwatch_enabled) {
+ debug_getpeekdma_chipram(pt, MW_MASK_AUDIO_0 << nr, 0xaa + nr * 16, 0xa0 + nr * 16);
+ }
#endif
+ }
uae_u16 dat = chipmem_wget_indirect (pt);
#ifdef DEBUGGER
- if (debug_dma) {
- record_dma_read_value(dat);
- }
- if (memwatch_enabled) {
- debug_getpeekdma_value(dat);
- }
+ if (dmal_ce) {
+ if (debug_dma) {
+ record_dma_read_value(dat);
+ }
+ if (memwatch_enabled) {
+ debug_getpeekdma_value(dat);
+ }
#endif
+ }
last_custom_value1 = last_custom_value2 = dat;
AUDxDAT (nr, dat, pt);
} else {
if (w) {
// write to disk
if (disk_fifostatus () <= 0) {
+ if (dmal_ce) {
#ifdef DEBUGGER
- if (debug_dma) {
- record_dma_read(0x26, pt, hpos, vpos, DMARECORD_DISK, v / 2);
- }
- if (memwatch_enabled) {
- debug_getpeekdma_chipram(pt, MW_MASK_DISK, 0x26, 0x20);
- }
+ if (debug_dma) {
+ record_dma_read(0x26, pt, hpos, vpos, DMARECORD_DISK, v / 2);
+ }
+ if (memwatch_enabled) {
+ debug_getpeekdma_chipram(pt, MW_MASK_DISK, 0x26, 0x20);
+ }
#endif
+ }
dat = chipmem_wget_indirect (pt);
+ if (dmal_ce) {
#ifdef DEBUGGER
- if (debug_dma) {
- record_dma_read_value(dat);
- }
- if (memwatch_enabled) {
- debug_getpeekdma_value(dat);
- }
+ if (debug_dma) {
+ record_dma_read_value(dat);
+ }
+ if (memwatch_enabled) {
+ debug_getpeekdma_value(dat);
+ }
#endif
+ }
last_custom_value1 = last_custom_value2 = dat;
DSKDAT (dat);
}
// read from disk
if (disk_fifostatus () >= 0) {
dat = DSKDATR ();
+ if (dmal_ce) {
#ifdef DEBUGGER
- if (debug_dma) {
- record_dma_write(0x08, dat, pt, hpos, vpos, DMARECORD_DISK, v / 2);
- }
- if (memwatch_enabled) {
- debug_putpeekdma_chipram(pt, dat, MW_MASK_DISK, 0x08, 0x20);
- }
+ if (debug_dma) {
+ record_dma_write(0x08, dat, pt, hpos, vpos, DMARECORD_DISK, v / 2);
+ }
+ if (memwatch_enabled) {
+ debug_putpeekdma_chipram(pt, dat, MW_MASK_DISK, 0x08, 0x20);
+ }
#endif
+ }
chipmem_wput_indirect (pt, dat);
}
}
static void events_dmal(int hpos)
{
+ dmal_ce = false;
if (!dmal)
return;
if (currprefs.cachesize) {
dmal >>= 2;
dmal_hpos += 2;
}
+ dmal_ce = true;
event2_newevent2(hpos, dmal_hpos + ((dmal & 2) ? 1 : 0), dmal_func);
dmal &= ~3;
} else {
}
vsync_line = vs;
- hsync_handler_post (vs);
+ hsync_handler_post(vs);
}
// executed at start of hsync
nextevent = 0;
for (i = 0; i < ev_max; i++) {
eventtab[i].active = 0;
- eventtab[i].oldcycles = get_cycles ();
+ eventtab[i].oldcycles = get_cycles();
}
for (i = 0; i < ev2_max; i++) {
eventtab2[i].active = 0;