42de6305ccbdacb591ae54e5a9f92844ffcbe339
[picodrive.git] / cpu / sh2 / sh2.h
1 #ifndef __SH2_H__\r
2 #define __SH2_H__\r
3 \r
4 #if !defined(REGPARM) && defined(__i386__) \r
5 #define REGPARM(x) __attribute__((regparm(x)))\r
6 #else\r
7 #define REGPARM(x)\r
8 #endif\r
9 \r
10 // registers - matches structure order\r
11 typedef enum {\r
12   SHR_R0 = 0, SHR_SP = 15,\r
13   SHR_PC,  SHR_PPC, SHR_PR,   SHR_SR,\r
14   SHR_GBR, SHR_VBR, SHR_MACH, SHR_MACL,\r
15 } sh2_reg_e;\r
16 \r
17 typedef struct SH2_\r
18 {\r
19         unsigned int    r[16];          // 00\r
20         unsigned int    pc;             // 40\r
21         unsigned int    ppc;\r
22         unsigned int    pr;\r
23         unsigned int    sr;\r
24         unsigned int    gbr, vbr;       // 50\r
25         unsigned int    mach, macl;     // 58\r
26 \r
27         // common\r
28         const void      *read8_map;     // 60\r
29         const void      *read16_map;\r
30         const void      **write8_tab;\r
31         const void      **write16_tab;\r
32 \r
33         // drc stuff\r
34         int             drc_tmp;        // 70\r
35         int             irq_cycles;\r
36         void            *p_bios;        // convenience pointers\r
37         void            *p_da;\r
38         void            *p_sdram;       // 80\r
39         void            *p_rom;\r
40         unsigned int    pdb_io_csum[2];\r
41 \r
42 #define SH2_STATE_RUN   (1 << 0)        // to prevent recursion\r
43 #define SH2_STATE_SLEEP (1 << 1)\r
44 #define SH2_STATE_CPOLL (1 << 2)        // polling comm regs\r
45 #define SH2_STATE_VPOLL (1 << 3)        // polling VDP\r
46         unsigned int    state;\r
47         unsigned int    poll_addr;\r
48         int             poll_cycles;\r
49         int             poll_cnt;\r
50 \r
51         // interpreter stuff\r
52         int             icount;         // cycles left in current timeslice\r
53         unsigned int    ea;\r
54         unsigned int    delay;\r
55         unsigned int    test_irq;\r
56 \r
57         int     pending_level;          // MAX(pending_irl, pending_int_irq)\r
58         int     pending_irl;\r
59         int     pending_int_irq;        // internal irq\r
60         int     pending_int_vector;\r
61         int     REGPARM(2) (*irq_callback)(struct SH2_ *sh2, int level);\r
62         int     is_slave;\r
63 \r
64         unsigned int    cycles_timeslice;\r
65 \r
66         // we use 68k reference cycles for easier sync\r
67         unsigned int    m68krcycles_done;\r
68         unsigned int    mult_m68k_to_sh2;\r
69         unsigned int    mult_sh2_to_m68k;\r
70 } SH2;\r
71 \r
72 #define CYCLE_MULT_SHIFT 10\r
73 #define C_M68K_TO_SH2(xsh2, c) \\r
74         ((int)((c) * (xsh2).mult_m68k_to_sh2) >> CYCLE_MULT_SHIFT)\r
75 #define C_SH2_TO_M68K(xsh2, c) \\r
76         ((int)((c + 3) * (xsh2).mult_sh2_to_m68k) >> CYCLE_MULT_SHIFT)\r
77 \r
78 int  sh2_init(SH2 *sh2, int is_slave);\r
79 void sh2_finish(SH2 *sh2);\r
80 void sh2_reset(SH2 *sh2);\r
81 int  sh2_irl_irq(SH2 *sh2, int level, int nested_call);\r
82 void sh2_internal_irq(SH2 *sh2, int level, int vector);\r
83 void sh2_do_irq(SH2 *sh2, int level, int vector);\r
84 void sh2_pack(const SH2 *sh2, unsigned char *buff);\r
85 void sh2_unpack(SH2 *sh2, const unsigned char *buff);\r
86 \r
87 int  sh2_execute(SH2 *sh2, int cycles);\r
88 \r
89 // regs, pending_int*, cycles, reserved\r
90 #define SH2_STATE_SIZE ((24 + 2 + 2 + 12) * 4)\r
91 \r
92 // pico memhandlers\r
93 // XXX: move somewhere else\r
94 unsigned int REGPARM(2) p32x_sh2_read8(unsigned int a, SH2 *sh2);\r
95 unsigned int REGPARM(2) p32x_sh2_read16(unsigned int a, SH2 *sh2);\r
96 unsigned int REGPARM(2) p32x_sh2_read32(unsigned int a, SH2 *sh2);\r
97 int REGPARM(3) p32x_sh2_write8 (unsigned int a, unsigned int d, SH2 *sh2);\r
98 int REGPARM(3) p32x_sh2_write16(unsigned int a, unsigned int d, SH2 *sh2);\r
99 int REGPARM(3) p32x_sh2_write32(unsigned int a, unsigned int d, SH2 *sh2);\r
100 \r
101 // debug\r
102 #ifdef DRC_CMP\r
103 void do_sh2_trace(SH2 *current, int cycles);\r
104 void do_sh2_cmp(SH2 *current);\r
105 #endif\r
106 \r
107 #endif /* __SH2_H__ */\r