notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
famec: split fm68k_emulate
[picodrive.git]
/
cpu
/
fame
/
famec.c
diff --git
a/cpu/fame/famec.c
b/cpu/fame/famec.c
index
db4eae6
..
508a12f
100644
(file)
--- a/
cpu/fame/famec.c
+++ b/
cpu/fame/famec.c
@@
-556,7
+556,7
@@
M68K_CONTEXT *g_m68kcontext;
static u32 initialised = 0;
\r
\r
#ifdef PICODRIVE_HACK
\r
static u32 initialised = 0;
\r
\r
#ifdef PICODRIVE_HACK
\r
-extern M68K_CONTEXT PicoCpuF
M68k, PicoCpuF
S68k;
\r
+extern M68K_CONTEXT PicoCpuFS68k;
\r
#endif
\r
\r
/* Custom function handler */
\r
#endif
\r
\r
/* Custom function handler */
\r
@@
-640,6
+640,7
@@
static const s32 exception_cycle_table[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
\r
};
\r
\r
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
\r
};
\r
\r
+static int init_jump_table(void);
\r
\r
/***********************/
\r
/* core main functions */
\r
\r
/***********************/
\r
/* core main functions */
\r
@@
-656,8
+657,8
@@
void fm68k_init(void)
puts("Initializing FAME...");
\r
#endif
\r
\r
puts("Initializing FAME...");
\r
#endif
\r
\r
- if (!initialised)
\r
-
fm68k_emulate(0, 0
);
\r
+
if (!initialised)
\r
+
init_jump_table(
);
\r
\r
#ifdef FAMEC_DEBUG
\r
puts("FAME initialized.");
\r
\r
#ifdef FAMEC_DEBUG
\r
puts("FAME initialized.");
\r
@@
-673,10
+674,12
@@
void fm68k_init(void)
/* M68K_NO_SUP_ADDR_SPACE (2): No se puede resetear porque no hay mapa */
\r
/* de memoria supervisor de extraccion de opcodes */
\r
/******************************************************************************/
\r
/* M68K_NO_SUP_ADDR_SPACE (2): No se puede resetear porque no hay mapa */
\r
/* de memoria supervisor de extraccion de opcodes */
\r
/******************************************************************************/
\r
-int fm68k_reset(
void
)
\r
+int fm68k_reset(
M68K_CONTEXT *ctx
)
\r
{
\r
if (!initialised)
\r
{
\r
if (!initialised)
\r
- fm68k_emulate(0, 0);
\r
+ init_jump_table();
\r
+
\r
+ g_m68kcontext = ctx;
\r
\r
// Si la CPU esta en ejecucion, salir con M68K_RUNNING
\r
if (m68kcontext.execinfo & M68K_RUNNING)
\r
\r
// Si la CPU esta en ejecucion, salir con M68K_RUNNING
\r
if (m68kcontext.execinfo & M68K_RUNNING)
\r
@@
-731,7
+734,7
@@
static FAMEC_EXTRA_INLINE s32 interrupt_chk__(void)
return 0;
\r
}
\r
\r
return 0;
\r
}
\r
\r
-int fm68k_would_interrupt(
void
)
\r
+int fm68k_would_interrupt(
M68K_CONTEXT *ctx
)
\r
{
\r
return interrupt_chk__();
\r
}
\r
{
\r
return interrupt_chk__();
\r
}
\r
@@
-808,7
+811,7
@@
static FAMEC_EXTRA_INLINE u32 execute_exception_group_0(s32 vect, s32 addr, u16
// main exec function
\r
//////////////////////
\r
\r
// main exec function
\r
//////////////////////
\r
\r
-int fm68k_emulate(
s32 cycles, int idle_mode
)
\r
+int fm68k_emulate(
M68K_CONTEXT *ctx, s32 cycles, fm68k_call_reason reason
)
\r
{
\r
#ifndef FAMEC_NO_GOTOS
\r
u32 Opcode;
\r
{
\r
#ifndef FAMEC_NO_GOTOS
\r
u32 Opcode;
\r
@@
-820,17
+823,23
@@
int fm68k_emulate(s32 cycles, int idle_mode)
u32 flag_NotZ;
\r
u32 flag_N;
\r
u32 flag_X;
\r
u32 flag_NotZ;
\r
u32 flag_N;
\r
u32 flag_X;
\r
-#endif
\r
\r
\r
-
if (!initialised
)
\r
+
switch (reason
)
\r
{
\r
{
\r
+ case fm68k_reason_init:
\r
goto init_jump_table;
\r
goto init_jump_table;
\r
- }
\r
-
\r
#ifdef PICODRIVE_HACK
\r
#ifdef PICODRIVE_HACK
\r
- if (idle_mode == 1) goto idle_install;
\r
- else if (idle_mode == 2) goto idle_remove;
\r
+ case fm68k_reason_idle_install:
\r
+ goto idle_install;
\r
+ case fm68k_reason_idle_remove:
\r
+ goto idle_remove;
\r
#endif
\r
#endif
\r
+ case fm68k_reason_emulate:
\r
+ break;
\r
+ }
\r
+#endif // FAMEC_NO_GOTOS
\r
+
\r
+ g_m68kcontext = ctx;
\r
\r
// won't emulate double fault
\r
// if (m68kcontext.execinfo & M68K_FAULTED) return -1;
\r
\r
// won't emulate double fault
\r
// if (m68kcontext.execinfo & M68K_FAULTED) return -1;
\r
@@
-975,7
+984,13
@@
famec_End:
\r
return cycles - m68kcontext.io_cycle_counter;
\r
\r
\r
return cycles - m68kcontext.io_cycle_counter;
\r
\r
+#ifndef FAMEC_NO_GOTOS
\r
init_jump_table:
\r
init_jump_table:
\r
+#else
\r
+}
\r
+
\r
+static int init_jump_table(void)
\r
+#endif
\r
{
\r
u32 i, j;
\r
\r
{
\r
u32 i, j;
\r
\r
@@
-5005,7
+5020,12
@@
init_jump_table:
JumpTable[fake_op_base] = JumpTable[fake_op_base|0x0200] = CAST_OP(0x4AFC); \
\r
JumpTable[real_op] = CAST_OP(normal_handler)
\r
\r
JumpTable[fake_op_base] = JumpTable[fake_op_base|0x0200] = CAST_OP(0x4AFC); \
\r
JumpTable[real_op] = CAST_OP(normal_handler)
\r
\r
+#ifndef FAMEC_NO_GOTOS
\r
idle_install:
\r
idle_install:
\r
+#else
\r
+int fm68k_idle_install(void)
\r
+#endif
\r
+{
\r
// printf("install..\n");
\r
INSTALL_IDLE(0x71fa, 0x66fa, idle_detector_bcc8, 0x6601_idle, 0x6601);
\r
INSTALL_IDLE(0x71f8, 0x66f8, idle_detector_bcc8, 0x6601_idle, 0x6601);
\r
// printf("install..\n");
\r
INSTALL_IDLE(0x71fa, 0x66fa, idle_detector_bcc8, 0x6601_idle, 0x6601);
\r
INSTALL_IDLE(0x71f8, 0x66f8, idle_detector_bcc8, 0x6601_idle, 0x6601);
\r
@@
-5018,8
+5038,14
@@
idle_install:
INSTALL_IDLE(0x7dfe, 0x60fe, idle_detector_bcc8, 0x6001_idle, 0x6001);
\r
INSTALL_IDLE(0x7dfc, 0x60fc, idle_detector_bcc8, 0x6001_idle, 0x6001);
\r
return 0;
\r
INSTALL_IDLE(0x7dfe, 0x60fe, idle_detector_bcc8, 0x6001_idle, 0x6001);
\r
INSTALL_IDLE(0x7dfc, 0x60fc, idle_detector_bcc8, 0x6001_idle, 0x6001);
\r
return 0;
\r
+}
\r
\r
\r
+#ifndef FAMEC_NO_GOTOS
\r
idle_remove:
\r
idle_remove:
\r
+#else
\r
+int fm68k_idle_remove(void)
\r
+#endif
\r
+{
\r
// printf("remove..\n");
\r
UNDO_IDLE(0x71fa, 0x66fa, 0x6601);
\r
UNDO_IDLE(0x71f8, 0x66f8, 0x6601);
\r
// printf("remove..\n");
\r
UNDO_IDLE(0x71fa, 0x66fa, 0x6601);
\r
UNDO_IDLE(0x71f8, 0x66f8, 0x6601);
\r
@@
-5032,9
+5058,26
@@
idle_remove:
UNDO_IDLE(0x7dfe, 0x60fe, 0x6001);
\r
UNDO_IDLE(0x7dfc, 0x60fc, 0x6001);
\r
return 0;
\r
UNDO_IDLE(0x7dfe, 0x60fe, 0x6001);
\r
UNDO_IDLE(0x7dfc, 0x60fc, 0x6001);
\r
return 0;
\r
+}
\r
+#endif // PICODRIVE_HACK
\r
\r
\r
-#
endif
\r
+#
ifndef FAMEC_NO_GOTOS
\r
}
\r
\r
}
\r
\r
-void *get_jumptab(void) { return JumpTable; }
\r
+static int init_jump_table(void)
\r
+{
\r
+ return fm68k_emulate(NULL, 0, fm68k_reason_init);
\r
+}
\r
+
\r
+#ifdef PICODRIVE_HACK
\r
+int fm68k_idle_install(void)
\r
+{
\r
+ return fm68k_emulate(NULL, 0, fm68k_reason_idle_install);
\r
+}
\r
\r
\r
+int fm68k_idle_remove(void)
\r
+{
\r
+ return fm68k_emulate(NULL, 0, fm68k_reason_idle_remove);
\r
+}
\r
+#endif
\r
+#endif // FAMEC_NO_GOTOS
\r