CPUs actually take some time to reset. Changed the 68000/68010 to eat an appropriate number of cycles after a reset.

This commit is contained in:
Aaron Giles 2009-05-25 23:13:36 +00:00 committed by Emmanuel Anne
parent 24366e2462
commit 6eb0d06b89
2 changed files with 19 additions and 5 deletions

View file

@ -53,6 +53,7 @@ extern void m68ki_build_opcode_table(void);
int m68ki_initial_cycles;
int m68ki_remaining_cycles = 0; /* Number of clocks remaining */
uint m68ki_reset_cycles;
uint m68ki_tracing = 0;
uint m68ki_address_space;
@ -125,13 +126,13 @@ const uint m68ki_shift_32_table[65] =
const uint8 m68ki_exception_cycle_table[4][256] =
{
{ /* 000 */
4, /* 0: Reset - Initial Stack Pointer */
40, /* 0: Reset - Initial Stack Pointer */
4, /* 1: Reset - Initial Program Counter */
50, /* 2: Bus Error (unemulated) */
50, /* 3: Address Error (unemulated) */
34, /* 4: Illegal Instruction */
38, /* 5: Divide by Zero -- ASG: changed from 42 */
40, /* 6: CHK -- ASG: chanaged from 44 */
38, /* 5: Divide by Zero */
40, /* 6: CHK */
34, /* 7: TRAPV */
34, /* 8: Privilege Violation */
34, /* 9: Trace */
@ -157,7 +158,7 @@ const uint8 m68ki_exception_cycle_table[4][256] =
44, /* 29: Level 5 Interrupt Autovector */
44, /* 30: Level 6 Interrupt Autovector */
44, /* 31: Level 7 Interrupt Autovector */
34, /* 32: TRAP #0 -- ASG: chanaged from 38 */
34, /* 32: TRAP #0 */
34, /* 33: TRAP #1 */
34, /* 34: TRAP #2 */
34, /* 35: TRAP #3 */
@ -198,7 +199,7 @@ const uint8 m68ki_exception_cycle_table[4][256] =
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
},
{ /* 010 */
4, /* 0: Reset - Initial Stack Pointer */
40, /* 0: Reset - Initial Stack Pointer */
4, /* 1: Reset - Initial Program Counter */
126, /* 2: Bus Error (unemulated) */
126, /* 3: Address Error (unemulated) */
@ -780,6 +781,15 @@ void m68k_set_cpu_type(unsigned int cpu_type)
/* ASG: removed per-instruction interrupt checks */
int m68k_execute(int num_cycles)
{
/* eat up any reset cycles */
if (m68ki_reset_cycles) {
int rc = m68ki_reset_cycles;
m68ki_reset_cycles = 0;
num_cycles -= rc;
if (num_cycles <= 0)
return rc;
}
/* Set our pool of clock cycles available */
SET_CYCLES(num_cycles);
m68ki_initial_cycles = num_cycles;
@ -948,6 +958,8 @@ void m68k_pulse_reset(void)
m68ki_jump(REG_PC);
CPU_RUN_MODE = RUN_MODE_NORMAL;
m68ki_reset_cycles = CYC_EXCEPTION[EXCEPTION_RESET];
}
/* Pulse the HALT line on the CPU */

View file

@ -141,6 +141,7 @@ extern "C" {
/* ======================================================================== */
/* Exception Vectors handled by emulation */
#define EXCEPTION_RESET 0
#define EXCEPTION_BUS_ERROR 2 /* This one is not emulated! */
#define EXCEPTION_ADDRESS_ERROR 3 /* This one is partially emulated (doesn't stack a proper frame yet) */
#define EXCEPTION_ILLEGAL_INSTRUCTION 4
@ -940,6 +941,7 @@ typedef struct
extern m68ki_cpu_core m68ki_cpu;
extern sint m68ki_remaining_cycles;
extern uint m68ki_reset_cycles;
extern uint m68ki_tracing;
extern const uint8 m68ki_shift_8_table[];
extern const uint16 m68ki_shift_16_table[];