X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2Fsh2%2Fsh2.h;h=42de6305ccbdacb591ae54e5a9f92844ffcbe339;hb=405dfdd77f6500f040001196d34d2d00916662d3;hp=074b142eff314b234b4c4416bfaf6fdb620396ae;hpb=e05b81fc5b3f640496795ced5d893ece4cc51c2d;p=picodrive.git diff --git a/cpu/sh2/sh2.h b/cpu/sh2/sh2.h index 074b142..42de630 100644 --- a/cpu/sh2/sh2.h +++ b/cpu/sh2/sh2.h @@ -33,6 +33,20 @@ typedef struct SH2_ // 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]; + +#define SH2_STATE_RUN (1 << 0) // to prevent recursion +#define SH2_STATE_SLEEP (1 << 1) +#define SH2_STATE_CPOLL (1 << 2) // polling comm regs +#define SH2_STATE_VPOLL (1 << 3) // polling VDP + unsigned int state; + unsigned int poll_addr; + int poll_cycles; + int poll_cnt; // interpreter stuff int icount; // cycles left in current timeslice @@ -47,20 +61,33 @@ typedef struct SH2_ int REGPARM(2) (*irq_callback)(struct SH2_ *sh2, int level); int is_slave; - unsigned int cycles_aim; // subtract sh2_icount to get global counter - unsigned int cycles_done; + unsigned int cycles_timeslice; + + // we use 68k reference cycles for easier sync + unsigned int m68krcycles_done; + unsigned int mult_m68k_to_sh2; + unsigned int mult_sh2_to_m68k; } SH2; -extern SH2 *sh2; // active sh2. XXX: consider removing +#define CYCLE_MULT_SHIFT 10 +#define C_M68K_TO_SH2(xsh2, c) \ + ((int)((c) * (xsh2).mult_m68k_to_sh2) >> CYCLE_MULT_SHIFT) +#define C_SH2_TO_M68K(xsh2, c) \ + ((int)((c + 3) * (xsh2).mult_sh2_to_m68k) >> CYCLE_MULT_SHIFT) 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); +int 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); + +int sh2_execute(SH2 *sh2, int cycles); -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 @@ -71,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); int REGPARM(3) p32x_sh2_write32(unsigned int a, unsigned int d, SH2 *sh2); +// debug +#ifdef DRC_CMP +void do_sh2_trace(SH2 *current, int cycles); +void do_sh2_cmp(SH2 *current); +#endif + #endif /* __SH2_H__ */