notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
32x: fix some more timing problems
[picodrive.git]
/
cpu
/
sh2
/
sh2.h
diff --git
a/cpu/sh2/sh2.h
b/cpu/sh2/sh2.h
index
4be13d9
..
42de630
100644
(file)
--- a/
cpu/sh2/sh2.h
+++ b/
cpu/sh2/sh2.h
@@
-35,10
+35,19
@@
typedef struct SH2_
int irq_cycles;
\r
void *p_bios; // convenience pointers
\r
void *p_da;
\r
int irq_cycles;
\r
void *p_bios; // convenience pointers
\r
void *p_da;
\r
- void *p_sdram;
\r
+ void *p_sdram;
// 80
\r
void *p_rom;
\r
unsigned int pdb_io_csum[2];
\r
\r
void *p_rom;
\r
unsigned int pdb_io_csum[2];
\r
\r
+#define SH2_STATE_RUN (1 << 0) // to prevent recursion
\r
+#define SH2_STATE_SLEEP (1 << 1)
\r
+#define SH2_STATE_CPOLL (1 << 2) // polling comm regs
\r
+#define SH2_STATE_VPOLL (1 << 3) // polling VDP
\r
+ unsigned int state;
\r
+ unsigned int poll_addr;
\r
+ int poll_cycles;
\r
+ int poll_cnt;
\r
+
\r
// interpreter stuff
\r
int icount; // cycles left in current timeslice
\r
unsigned int ea;
\r
// interpreter stuff
\r
int icount; // cycles left in current timeslice
\r
unsigned int ea;
\r
@@
-52,20
+61,33
@@
typedef struct SH2_
int REGPARM(2) (*irq_callback)(struct SH2_ *sh2, int level);
\r
int is_slave;
\r
\r
int REGPARM(2) (*irq_callback)(struct SH2_ *sh2, int level);
\r
int is_slave;
\r
\r
- unsigned int cycles_aim; // subtract sh2_icount to get global counter
\r
- unsigned int cycles_done;
\r
+ unsigned int cycles_timeslice;
\r
+
\r
+ // we use 68k reference cycles for easier sync
\r
+ unsigned int m68krcycles_done;
\r
+ unsigned int mult_m68k_to_sh2;
\r
+ unsigned int mult_sh2_to_m68k;
\r
} SH2;
\r
\r
} SH2;
\r
\r
-extern SH2 *sh2; // active sh2. XXX: consider removing
\r
+#define CYCLE_MULT_SHIFT 10
\r
+#define C_M68K_TO_SH2(xsh2, c) \
\r
+ ((int)((c) * (xsh2).mult_m68k_to_sh2) >> CYCLE_MULT_SHIFT)
\r
+#define C_SH2_TO_M68K(xsh2, c) \
\r
+ ((int)((c + 3) * (xsh2).mult_sh2_to_m68k) >> CYCLE_MULT_SHIFT)
\r
\r
int sh2_init(SH2 *sh2, int is_slave);
\r
void sh2_finish(SH2 *sh2);
\r
void sh2_reset(SH2 *sh2);
\r
\r
int sh2_init(SH2 *sh2, int is_slave);
\r
void sh2_finish(SH2 *sh2);
\r
void sh2_reset(SH2 *sh2);
\r
-
void sh2_irl_irq(SH2 *sh2, int leve
l);
\r
+
int sh2_irl_irq(SH2 *sh2, int level, int nested_cal
l);
\r
void sh2_internal_irq(SH2 *sh2, int level, int vector);
\r
void sh2_do_irq(SH2 *sh2, int level, int vector);
\r
void sh2_internal_irq(SH2 *sh2, int level, int vector);
\r
void sh2_do_irq(SH2 *sh2, int level, int vector);
\r
+void sh2_pack(const SH2 *sh2, unsigned char *buff);
\r
+void sh2_unpack(SH2 *sh2, const unsigned char *buff);
\r
+
\r
+int sh2_execute(SH2 *sh2, int cycles);
\r
\r
\r
-void sh2_execute(SH2 *sh2, int cycles);
\r
+// regs, pending_int*, cycles, reserved
\r
+#define SH2_STATE_SIZE ((24 + 2 + 2 + 12) * 4)
\r
\r
// pico memhandlers
\r
// XXX: move somewhere else
\r
\r
// pico memhandlers
\r
// XXX: move somewhere else
\r
@@
-76,4
+98,10
@@
int REGPARM(3) p32x_sh2_write8 (unsigned int a, unsigned int d, SH2 *sh2);
int REGPARM(3) p32x_sh2_write16(unsigned int a, unsigned int d, SH2 *sh2);
\r
int REGPARM(3) p32x_sh2_write32(unsigned int a, unsigned int d, SH2 *sh2);
\r
\r
int REGPARM(3) p32x_sh2_write16(unsigned int a, unsigned int d, SH2 *sh2);
\r
int REGPARM(3) p32x_sh2_write32(unsigned int a, unsigned int d, SH2 *sh2);
\r
\r
+// debug
\r
+#ifdef DRC_CMP
\r
+void do_sh2_trace(SH2 *current, int cycles);
\r
+void do_sh2_cmp(SH2 *current);
\r
+#endif
\r
+
\r
#endif /* __SH2_H__ */
\r
#endif /* __SH2_H__ */
\r