X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=cpu%2Fsh2%2Fsh2.h;h=e15259d5433e272cf16dabbb7bc5c0bab38802b0;hb=b4db550e41b2aa277f570d7bff890c8e8ee1831f;hp=9d6f0d2103e155e3e5e212e181c371c808404a4d;hpb=71f68165b6e50f58ddbc6e98a38c7dd4968ccca2;p=picodrive.git diff --git a/cpu/sh2/sh2.h b/cpu/sh2/sh2.h index 9d6f0d2..e15259d 100644 --- a/cpu/sh2/sh2.h +++ b/cpu/sh2/sh2.h @@ -1,6 +1,12 @@ #ifndef __SH2_H__ #define __SH2_H__ +#if !defined(REGPARM) && defined(__i386__) +#define REGPARM(x) __attribute__((regparm(x))) +#else +#define REGPARM(x) +#endif + // registers - matches structure order typedef enum { SHR_R0 = 0, SHR_SP = 15, @@ -8,7 +14,7 @@ typedef enum { SHR_GBR, SHR_VBR, SHR_MACH, SHR_MACL, } sh2_reg_e; -typedef struct +typedef struct SH2_ { unsigned int r[16]; // 00 unsigned int pc; // 40 @@ -26,6 +32,12 @@ typedef struct // drc stuff int drc_tmp; // 70 + int irq_cycles; + void *p_bios; // convenience pointers + void *p_da; + void *p_sdram; // 80 + void *p_rom; + unsigned int pdb_io_csum[2]; // interpreter stuff int icount; // cycles left in current timeslice @@ -37,7 +49,7 @@ typedef struct int pending_irl; int pending_int_irq; // internal irq int pending_int_vector; - void (*irq_callback)(int id, int level); + int REGPARM(2) (*irq_callback)(struct SH2_ *sh2, int level); int is_slave; unsigned int cycles_aim; // subtract sh2_icount to get global counter @@ -49,25 +61,24 @@ extern SH2 *sh2; // active sh2. XXX: consider removing int sh2_init(SH2 *sh2, int is_slave); void sh2_finish(SH2 *sh2); void sh2_reset(SH2 *sh2); -void sh2_irl_irq(SH2 *sh2, int level); +void sh2_irl_irq(SH2 *sh2, int level, int nested_call); void sh2_internal_irq(SH2 *sh2, int level, int vector); void sh2_do_irq(SH2 *sh2, int level, int vector); +void sh2_pack(const SH2 *sh2, unsigned char *buff); +void sh2_unpack(SH2 *sh2, const unsigned char *buff); void sh2_execute(SH2 *sh2, int cycles); +// regs, pending_int*, cycles, reserved +#define SH2_STATE_SIZE ((24 + 2 + 2 + 12) * 4) + // pico memhandlers // XXX: move somewhere else -#if !defined(REGPARM) && defined(__i386__) -#define REGPARM(x) __attribute__((regparm(x))) -#else -#define REGPARM(x) -#endif - unsigned int REGPARM(2) p32x_sh2_read8(unsigned int a, SH2 *sh2); unsigned int REGPARM(2) p32x_sh2_read16(unsigned int a, SH2 *sh2); unsigned int REGPARM(2) p32x_sh2_read32(unsigned int a, SH2 *sh2); -void REGPARM(3) p32x_sh2_write8(unsigned int a, unsigned int d, SH2 *sh2); -void REGPARM(3) p32x_sh2_write16(unsigned int a, unsigned int d, SH2 *sh2); -void REGPARM(3) p32x_sh2_write32(unsigned int a, unsigned int d, SH2 *sh2); +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); +int REGPARM(3) p32x_sh2_write32(unsigned int a, unsigned int d, SH2 *sh2); #endif /* __SH2_H__ */