sh2.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #ifndef __SH2_H__
  2. #define __SH2_H__
  3. #if !defined(REGPARM) && defined(__i386__)
  4. #define REGPARM(x) __attribute__((regparm(x)))
  5. #else
  6. #define REGPARM(x)
  7. #endif
  8. // registers - matches structure order
  9. typedef enum {
  10. SHR_R0 = 0, SHR_SP = 15,
  11. SHR_PC, SHR_PPC, SHR_PR, SHR_SR,
  12. SHR_GBR, SHR_VBR, SHR_MACH, SHR_MACL,
  13. } sh2_reg_e;
  14. typedef struct SH2_
  15. {
  16. unsigned int r[16]; // 00
  17. unsigned int pc; // 40
  18. unsigned int ppc;
  19. unsigned int pr;
  20. unsigned int sr;
  21. unsigned int gbr, vbr; // 50
  22. unsigned int mach, macl; // 58
  23. // common
  24. const void *read8_map; // 60
  25. const void *read16_map;
  26. const void **write8_tab;
  27. const void **write16_tab;
  28. // drc stuff
  29. int drc_tmp; // 70
  30. int irq_cycles;
  31. void *p_bios; // convenience pointers
  32. void *p_da;
  33. void *p_sdram;
  34. void *p_rom;
  35. unsigned int pdb_io_csum[2];
  36. // interpreter stuff
  37. int icount; // cycles left in current timeslice
  38. unsigned int ea;
  39. unsigned int delay;
  40. unsigned int test_irq;
  41. int pending_level; // MAX(pending_irl, pending_int_irq)
  42. int pending_irl;
  43. int pending_int_irq; // internal irq
  44. int pending_int_vector;
  45. int REGPARM(2) (*irq_callback)(struct SH2_ *sh2, int level);
  46. int is_slave;
  47. unsigned int cycles_aim; // subtract sh2_icount to get global counter
  48. unsigned int cycles_done;
  49. } SH2;
  50. extern SH2 *sh2; // active sh2. XXX: consider removing
  51. int sh2_init(SH2 *sh2, int is_slave);
  52. void sh2_finish(SH2 *sh2);
  53. void sh2_reset(SH2 *sh2);
  54. void sh2_irl_irq(SH2 *sh2, int level);
  55. void sh2_internal_irq(SH2 *sh2, int level, int vector);
  56. void sh2_do_irq(SH2 *sh2, int level, int vector);
  57. void sh2_execute(SH2 *sh2, int cycles);
  58. // pico memhandlers
  59. // XXX: move somewhere else
  60. unsigned int REGPARM(2) p32x_sh2_read8(unsigned int a, SH2 *sh2);
  61. unsigned int REGPARM(2) p32x_sh2_read16(unsigned int a, SH2 *sh2);
  62. unsigned int REGPARM(2) p32x_sh2_read32(unsigned int a, SH2 *sh2);
  63. int REGPARM(3) p32x_sh2_write8 (unsigned int a, unsigned int d, SH2 *sh2);
  64. int REGPARM(3) p32x_sh2_write16(unsigned int a, unsigned int d, SH2 *sh2);
  65. int REGPARM(3) p32x_sh2_write32(unsigned int a, unsigned int d, SH2 *sh2);
  66. #endif /* __SH2_H__ */