div10 = ccount % DIV10;
- if (!ciaclocks)
- return 0;
-
/* CIA A timers */
if ((ciaacra & 0x21) == 0x01) {
assert ((ciaata + 1) >= ciaclocks);
CLXCON (RW); /* 098 CLXCON */
intena = intena_internal = RW; /* 09A INTENA */
intreq = RW; /* 09C INTREQ */
- if (!currprefs.cs_dipagnus)
- intreq |= 0x20;
intreq_internal = intreq;
adkcon = RW; /* 09E ADKCON */
for (i = 0; i < 8; i++)
struct dma_rec *dr;
hpos = dma_cycle ();
- x_do_cycles (CYCLE_UNIT);
+ x_do_cycles_pre (CYCLE_UNIT);
#ifdef DEBUGGER
if (debug_dma) {
int hpos;
hpos = dma_cycle ();
- x_do_cycles (CYCLE_UNIT);
+ x_do_cycles_pre (CYCLE_UNIT);
#ifdef DEBUGGER
if (debug_dma) {
#ifdef CPUEMU_20
-
STATIC_INLINE void do_cycles_ce020 (int clocks)
{
- do_cycles_ce (clocks * cpucycleunit);
+ x_do_cycles (clocks * cpucycleunit);
}
-STATIC_INLINE void do_cycles_ce020_mem (int clocks)
+STATIC_INLINE void do_cycles_ce020_mem (int clocks, uae_u32 val)
{
regs.ce020memcycles -= clocks * cpucycleunit;
- do_cycles_ce (clocks * cpucycleunit);
+ x_do_cycles_post (clocks * cpucycleunit, val);
}
STATIC_INLINE void checkcycles_ce020 (void)
{
if (regs.ce020memcycles > 0)
- do_cycles_ce (regs.ce020memcycles);
+ x_do_cycles_pre (regs.ce020memcycles);
regs.ce020memcycles = 0;
}
STATIC_INLINE uae_u32 mem_access_delay_long_read_ce020 (uaecptr addr)
{
+ uae_u32 v;
checkcycles_ce020 ();
switch (ce_banktype[addr >> 16])
{
case CE_MEMBANK_CHIP:
if ((addr & 3) != 0) {
- uae_u32 v;
v = wait_cpu_cycle_read_ce020 (addr + 0, 1) << 16;
v |= wait_cpu_cycle_read_ce020 (addr + 2, 1) << 0;
return v;
return wait_cpu_cycle_read_ce020 (addr, -1);
}
case CE_MEMBANK_FAST:
+ v = get_long (addr);
if ((addr & 3) != 0)
- do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE);
+ do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE, v);
else
- do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE);
- break;
+ do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE, v);
+ return v;
case CE_MEMBANK_FAST16BIT:
- do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE);
- break;
+ v = get_long (addr);
+ do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE, v);
+ return v;
}
return get_long (addr);
}
STATIC_INLINE uae_u32 mem_access_delay_longi_read_ce020 (uaecptr addr)
{
+ uae_u32 v;
checkcycles_ce020 ();
switch (ce_banktype[addr >> 16])
{
case CE_MEMBANK_CHIP:
if ((addr & 3) != 0) {
- uae_u32 v;
v = wait_cpu_cycle_read_ce020 (addr + 0, 1) << 16;
v |= wait_cpu_cycle_read_ce020 (addr + 2, 1) << 0;
return v;
return wait_cpu_cycle_read_ce020 (addr, -1);
}
case CE_MEMBANK_FAST:
+ v = get_longi (addr);
if ((addr & 3) != 0)
- do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE);
+ do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE, v);
else
- do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE);
- break;
+ do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE, v);
+ return v;
case CE_MEMBANK_FAST16BIT:
- do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE);
- break;
+ v = get_longi (addr);
+ do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE, v);
+ return v;
}
return get_longi (addr);
}
STATIC_INLINE uae_u32 mem_access_delay_word_read_ce020 (uaecptr addr)
{
+ uae_u32 v;
checkcycles_ce020 ();
switch (ce_banktype[addr >> 16])
{
case CE_MEMBANK_CHIP:
if ((addr & 3) == 3) {
- uae_u16 v;
v = wait_cpu_cycle_read_ce020 (addr + 0, 0) << 8;
v |= wait_cpu_cycle_read_ce020 (addr + 1, 0) << 0;
return v;
}
case CE_MEMBANK_FAST:
case CE_MEMBANK_FAST16BIT:
+ v = get_word (addr);
if ((addr & 3) == 3)
- do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE);
+ do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE, v);
else
- do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE);
- break;
+ do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE, v);
+ return v;
}
return get_word (addr);
}
STATIC_INLINE uae_u32 mem_access_delay_wordi_read_ce020 (uaecptr addr)
{
+ uae_u32 v;
checkcycles_ce020 ();
switch (ce_banktype[addr >> 16])
{
return wait_cpu_cycle_read_ce020 (addr, 1);
case CE_MEMBANK_FAST:
case CE_MEMBANK_FAST16BIT:
- do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE);
- break;
+ v = get_wordi (addr);
+ do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE, v);
+ return v;
}
return get_wordi (addr);
}
STATIC_INLINE uae_u32 mem_access_delay_byte_read_ce020 (uaecptr addr)
{
+ uae_u32 v;
checkcycles_ce020 ();
switch (ce_banktype[addr >> 16])
{
return wait_cpu_cycle_read_ce020 (addr, 0);
case CE_MEMBANK_FAST:
case CE_MEMBANK_FAST16BIT:
- do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE);
- break;
+ v = get_byte (addr);
+ do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE, v);
+ return v;
}
return get_byte (addr);
return;
case CE_MEMBANK_FAST:
case CE_MEMBANK_FAST16BIT:
- do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE);
- break;
+ put_byte (addr, v);
+ do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE, v);
+ return;
}
put_byte (addr, v);
}
break;
case CE_MEMBANK_FAST:
case CE_MEMBANK_FAST16BIT:
+ put_word (addr, v);
if ((addr & 3) == 3)
- do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE);
+ do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE, v);
else
- do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE);
- break;
+ do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE, v);
+ return;
}
put_word (addr, v);
}
return;
break;
case CE_MEMBANK_FAST:
+ put_long (addr, v);
if ((addr & 3) != 0)
- do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE);
+ do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE, v);
else
- do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE);
- break;
+ do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE, v);
+ return;
case CE_MEMBANK_FAST16BIT:
- do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE);
- break;
+ put_long (addr, v);
+ do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE, v);
+ return;
}
put_long (addr, v);
}
STATIC_INLINE void m68k_do_bsr_ce020 (uaecptr oldpc, uae_s32 offset)
{
m68k_areg (regs, 7) -= 4;
- put_long_ce020 (m68k_areg (regs, 7), oldpc);
+ x_put_long (m68k_areg (regs, 7), oldpc);
m68k_incpc (offset);
}
STATIC_INLINE void m68k_do_rts_ce020 (void)
{
- m68k_setpc (get_long_ce020 (m68k_areg (regs, 7)));
+ m68k_setpc (x_get_long (m68k_areg (regs, 7)));
m68k_areg (regs, 7) += 4;
}
#endif
#endif
+#define MAX68020CYCLES 4
+
#define CPU_PIPELINE_MAX 3
#define CPU000_MEM_CYCLE 4
#define CPU000_CLOCK_MULT 2
uae_u32 cacheholdingdata020;
uae_u32 cacheholdingaddr020;
int ce020memcycles;
+ int ce020tmpcycles;
};
extern struct regstruct regs;
uae_u32 usp, isp, pc;
uae_u16 ir, irc, sr, opcode;
int intmask, stopped, state;
+
+ uae_u32 msp, vbr;
+ uae_u32 cacr, caar;
+ uae_u16 prefetch020[CPU_PIPELINE_MAX];
+ uae_u32 prefetch020addr;
+ uae_u32 cacheholdingdata020;
+ uae_u32 cacheholdingaddr020;
+ struct cache020 caches020[CACHELINES020];
+
int memoryoffset;
int cyclecounter, cyclecounter_pre, cyclecounter_post;
int readcounter, writecounter;
write_log (L"\n");
}
cycleoffset = cycles - cycles2;
- gui_message (L"INPREC OFFSET=%d\n", cycleoffset / CYCLE_UNIT);
+ gui_message (L"INPREC OFFSET=%d\n", (int)cycleoffset / CYCLE_UNIT);
+ activate_debugger ();
}
lastcycle = cycles;
inprec_plast = p;
bool can_cpu_tracer (void)
{
- return (currprefs.cpu_model == 68000) && currprefs.cpu_cycle_exact;
+ return (currprefs.cpu_model == 68000 || currprefs.cpu_model == 68020) && currprefs.cpu_cycle_exact;
}
bool is_cpu_tracer (void)
}
#endif
+static uae_u32 exception_pc (int nr)
+{
+ // zero divide, chk, trapcc/trapv, trace, trap#
+ if (nr == 5 || nr == 6 || nr == 7 || nr == 9 || (nr >= 32 && nr <= 47))
+ return m68k_getpc ();
+ return regs.instruction_pc;
+}
+
static void Exception_mmu (int nr)
{
uae_u32 newpc;
int sv = regs.s;
+ int pc = exception_pc (nr);
int i;
exception_debug (nr);
}
m68k_areg (regs, 7) -= 4;
- put_long_mmu (m68k_areg (regs, 7), regs.instruction_pc);
+ put_long_mmu (m68k_areg (regs, 7), pc);
m68k_areg (regs, 7) -= 2;
put_word_mmu (m68k_areg (regs, 7), regs.sr);
kludge_me_do:
mmu_set_super (regs.s != 0);
}
if (currprefs.cpu_model > 68000) {
- currpc = regs.instruction_pc;
+ currpc = exception_pc (nr);
if (nr == 2 || nr == 3) {
int i;
if (currprefs.cpu_model >= 68040) {
if (kickstart_rom)
regs.pcr |= 2; /* disable FPU */
}
+ regs.ce020tmpcycles = MAX68020CYCLES;
+ regs.ce020memcycles = 0;
fill_prefetch_quick ();
}
struct regstruct *r = ®s;
for (;;) {
- uae_u32 opcode = r->ir;
+ uae_u16 opcode = r->ir;
count_instr (opcode);
set_cpu_tracer (false);
for (;;) {
- uae_u32 opcode = r->ir;
+ uae_u16 opcode = r->ir;
#if DEBUG_CD32CDTVIO
out_cd32io (m68k_getpc ());
#endif
/* Aranym MMU 68040 */
static void m68k_run_mmu040 (void)
{
- uae_u32 opcode;
+ uae_u16 opcode;
uaecptr pc;
retry:
TRY (prb) {
}
/* "cycle exact" 68020/030 */
-#define MAX68020CYCLES 4
+
+STATIC_INLINE void docodece020 (uae_u32 opcode)
+{
+ (*cpufunctbl[opcode])(opcode);
+ if (regs.ce020memcycles > 0) {
+ regs.ce020tmpcycles = CYCLE_UNIT * MAX68020CYCLES;
+ x_do_cycles (regs.ce020memcycles);
+ regs.ce020memcycles = 0;
+ }
+}
static void m68k_run_2ce (void)
{
struct regstruct *r = ®s;
- int tmpcycles = MAX68020CYCLES;
if (cpu_tracer < 0) {
memcpy (&r->regs, &cputrace.regs, 16 * sizeof (uae_u32));
r->isp = cputrace.isp;
r->intmask = cputrace.intmask;
r->stopped = cputrace.stopped;
+
+ r->msp = cputrace.msp;
+ r->vbr = cputrace.vbr;
+ r->caar = cputrace.caar;
+ r->cacr = cputrace.cacr;
+ r->cacheholdingdata020 = cputrace.cacheholdingdata020;
+ r->cacheholdingaddr020 = cputrace.cacheholdingaddr020;
+ r->prefetch020addr = cputrace.prefetch020addr;
+ memcpy (&r->prefetch020, &cputrace.prefetch020, CPU_PIPELINE_MAX * sizeof (uae_u16));
+ memcpy (&caches020, &cputrace.caches020, sizeof caches020);
+
m68k_setpc (cputrace.pc);
if (cputrace.state > 1)
Exception (cputrace.state);
else if (cputrace.state == 1)
- (*cpufunctbl[cputrace.opcode])(cputrace.opcode);
+ docodece020 (cputrace.opcode);
if (regs.stopped)
set_special (SPCFLAG_STOP);
set_cpu_tracer (false);
}
set_cpu_tracer (false);
- ipl_fetch ();
for (;;) {
r->instruction_pc = m68k_getpc ();
- uae_u32 opcode = x_prefetch (0);
+ uae_u16 opcode = x_prefetch (0);
if (cpu_tracer) {
memcpy (&cputrace.regs, &r->regs, 16 * sizeof (uae_u32));
cputrace.stopped = r->stopped;
cputrace.state = 1;
cputrace.pc = m68k_getpc ();
+
+ cputrace.msp = r->msp;
+ cputrace.vbr = r->vbr;
+ cputrace.caar = r->caar;
+ cputrace.cacr = r->cacr;
+ cputrace.cacheholdingdata020 = r->cacheholdingdata020;
+ cputrace.cacheholdingaddr020 = r->cacheholdingaddr020;
+ cputrace.prefetch020addr = r->prefetch020addr;
+ memcpy (&cputrace.prefetch020, &r->prefetch020, CPU_PIPELINE_MAX * sizeof (uae_u16));
+ memcpy (&cputrace.caches020, &caches020, sizeof caches020);
+
cputrace.memoryoffset = 0;
cputrace.cyclecounter = cputrace.cyclecounter_pre = cputrace.cyclecounter_post = 0;
cputrace.readcounter = cputrace.writecounter = 0;
inprec_playdebug_cpu (1);
}
- (*cpufunctbl[opcode])(opcode);
- if (r->ce020memcycles > 0) {
- tmpcycles = CYCLE_UNIT * MAX68020CYCLES;
- do_cycles_ce (r->ce020memcycles);
- r->ce020memcycles = 0;
- }
+ docodece020 (opcode);
+
cont:
if (r->spcflags || time_for_interrupt ()) {
if (do_specialties (0))
return;
}
- tmpcycles -= cpucycleunit;
- if (tmpcycles <= 0) {
- do_cycles_ce (1 * CYCLE_UNIT);
- tmpcycles = CYCLE_UNIT * MAX68020CYCLES;;
+
+ regs.ce020tmpcycles -= cpucycleunit;
+ if (regs.ce020tmpcycles <= 0) {
+ x_do_cycles (1 * CYCLE_UNIT);
+ regs.ce020tmpcycles = CYCLE_UNIT * MAX68020CYCLES;;
}
regs.ipl = regs.ipl_pin;
}
prefetch_pc = m68k_getpc ();
prefetch = x_get_long (prefetch_pc);
for (;;) {
- uae_u32 opcode;
+ uae_u16 opcode;
uae_u32 pc = m68k_getpc ();
#if DEBUG_CD32CDTVIO
regs.instruction_pc = pc;
} else if (pc == prefetch_pc + 2) {
regs.instruction_pc = pc + 2;
- opcode = prefetch & 0xffff;
+ opcode = prefetch;
} else {
regs.instruction_pc = pc;
opcode = x_get_word (pc);
struct regstruct *r = ®s;
for (;;) {
- uae_u32 opcode = get_iword (0);
+ uae_u16 opcode = get_iword (0);
count_instr (opcode);
#if 0
if (!used[opcode]) {
static void m68k_run_mmu (void)
{
for (;;) {
- uae_u32 opcode = get_iword (0);
+ uae_u16 opcode = get_iword (0);
do_cycles (cpu_cycles);
mmu_backup_regs = regs;
cpu_cycles = (*cpufunctbl[opcode])(opcode);
#if 0
static void m68k_verify (uaecptr addr, uaecptr *nextpc)
{
- uae_u32 opcode, val;
+ uae_u16 opcode, val;
struct instr *dp;
opcode = get_iword_1 (0);
dcaches030[i].tag = restore_u32 ();
}
}
+ if (model >= 68020) {
+ regs.ce020memcycles = restore_u32 ();
+ regs.ce020tmpcycles = restore_u32 ();
+ }
}
write_log (L"CPU: %d%s%03d, PC=%08X\n",
save_u32 (dcaches030[i].tag);
}
}
+ if (currprefs.cpu_model >= 68020) {
+ save_u32 (regs.ce020memcycles);
+ save_u32 (regs.ce020tmpcycles);
+ }
*len = dst - dstbak;
return dstbak;
}
static int serial_period_hsyncs, serial_period_hsync_counter;
static int ninebit;
int serdev;
-int seriallog;
+int seriallog = 1;
int serial_enet;
void serial_open (void);
v &= 0xff;
if (v >= 32 && v < 127)
return v;
+ if (v == 10)
+ return 10;
return '.';
}
#define WINUAEPUBLICBETA 1
#define LANG_DLL 1
-#define WINUAEBETA L"1"
-#define WINUAEDATE MAKEBD(2010, 10, 23)
+#define WINUAEBETA L"2"
+#define WINUAEDATE MAKEBD(2010, 10, 24)
#define WINUAEEXTRA L""
#define WINUAEREV L""
+- CIA timing issue in some situations (b1)
+- some 68020+ exceptions had wrong return address (b1)
+- do not attempt to save log window position if it is minimized
+- do not set vblank bit during state restore, old code that broke interrupt delaying and rerecorder timing
+
Beta 1
!!!!!! NOTE: Re-recorder discussion will be opened later in another thread. All posts related to new input recorder
close_debug_window ();
} else if (consoleopen < 0) {
HWND hwnd = myGetConsoleWindow ();
- if (hwnd) {
+ if (hwnd && !IsIconic (hwnd)) {
RECT r;
if (GetWindowRect (hwnd, &r)) {
r.bottom -= r.top;