platform ps2, handle audio similar to psp
[picodrive.git] / cpu / sh2 / sh2.h
CommitLineData
41397701 1#ifndef __SH2_H__\r
2#define __SH2_H__\r
3\r
f821bb70 4#include <pico/pico_types.h>\r
5#include <pico/pico_port.h>\r
e05b81fc 6\r
71f68165 7// registers - matches structure order\r
8typedef enum {\r
9 SHR_R0 = 0, SHR_SP = 15,\r
10 SHR_PC, SHR_PPC, SHR_PR, SHR_SR,\r
11 SHR_GBR, SHR_VBR, SHR_MACH, SHR_MACL,\r
7082729e 12 SH2_REGS, // register set size\r
13 SHR_T = 29, SHR_MEM = 30, SHR_TMP = 31, // drc specific pseudo regs\r
71f68165 14} sh2_reg_e;\r
a5e51c16 15#define SHR_R(n) (SHR_R0+(n))\r
71f68165 16\r
e05b81fc 17typedef struct SH2_\r
41397701 18{\r
90314061 19 // registers. this MUST correlate with enum sh2_reg_e.\r
90b1c9db 20 uint32_t r[16] ALIGNED(32);\r
21 uint32_t pc; // 40\r
22 uint32_t ppc;\r
23 uint32_t pr;\r
24 uint32_t sr;\r
25 uint32_t gbr, vbr; // 50\r
26 uint32_t mach, macl; // 58\r
41397701 27\r
bcf65fd6 28 // common\r
90314061 29 const void *read8_map;\r
f4bb5d6b 30 const void *read16_map;\r
90314061 31 const void *read32_map;\r
f4bb5d6b 32 const void **write8_tab;\r
33 const void **write16_tab;\r
90314061 34 const void **write32_tab;\r
bcf65fd6 35\r
679af8a3 36 // drc stuff\r
90314061 37 int drc_tmp;\r
e05b81fc 38 int irq_cycles;\r
23686515 39 void *p_bios; // convenience pointers\r
40 void *p_da;\r
90314061 41 void *p_sdram;\r
23686515 42 void *p_rom;\r
6822ba9d 43 void *p_dram;\r
44 void *p_drcblk_da;\r
45 void *p_drcblk_ram;\r
5686d931 46 unsigned int pdb_io_csum[2];\r
f0d7b1fa 47\r
19886062 48#define SH2_STATE_RUN (1 << 0) // to prevent recursion\r
397ccdc6 49#define SH2_STATE_SLEEP (1 << 1) // temporarily stopped (DMA, IO, ...)\r
19886062 50#define SH2_STATE_CPOLL (1 << 2) // polling comm regs\r
51#define SH2_STATE_VPOLL (1 << 3) // polling VDP\r
397ccdc6 52#define SH2_STATE_RPOLL (1 << 4) // polling address in SDRAM\r
ca1b77e6 53#define SH2_TIMER_RUN (1 << 6) // SOC WDT timer is running\r
54#define SH2_IN_DRC (1 << 7) // DRC in use\r
19886062 55 unsigned int state;\r
90b1c9db 56 uint32_t poll_addr;\r
4af2edc3 57 unsigned int poll_cycles;\r
19886062 58 int poll_cnt;\r
bd078083 59// NB MUST be a bit unused in SH2 SR, see also cpu/sh2/compiler.c!\r
60#define SH2_NO_POLLING (1 << 10) // poll detection control\r
61 int no_polling;\r
19886062 62\r
d760c90f 63 // DRC branch cache. size must be 2^n and <=128\r
9e36dd0e 64 int rts_cache_idx;\r
90b1c9db 65 struct { uint32_t pc; void *code; } rts_cache[16];\r
66 struct { uint32_t pc; void *code; } branch_cache[128];\r
d760c90f 67\r
f0d7b1fa 68 // interpreter stuff\r
69 int icount; // cycles left in current timeslice\r
70 unsigned int ea;\r
71 unsigned int delay;\r
72 unsigned int test_irq;\r
679af8a3 73\r
6add7875 74 int pending_level; // MAX(pending_irl, pending_int_irq)\r
41397701 75 int pending_irl;\r
76 int pending_int_irq; // internal irq\r
77 int pending_int_vector;\r
e05b81fc 78 int REGPARM(2) (*irq_callback)(struct SH2_ *sh2, int level);\r
41397701 79 int is_slave;\r
80\r
ed4402a7 81 unsigned int cycles_timeslice;\r
82\r
f81107f5 83 struct SH2_ *other_sh2;\r
2eb21331 84 int (*run)(struct SH2_ *, int);\r
f81107f5 85\r
ed4402a7 86 // we use 68k reference cycles for easier sync\r
87 unsigned int m68krcycles_done;\r
88 unsigned int mult_m68k_to_sh2;\r
89 unsigned int mult_sh2_to_m68k;\r
f81107f5 90\r
90b1c9db 91 uint8_t data_array[0x1000]; // cache (can be used as RAM)\r
2eb21331 92 uint32_t peri_regs[0x200/4]; // peripheral regs\r
1fd8f986 93} SH2;\r
41397701 94\r
ed4402a7 95#define CYCLE_MULT_SHIFT 10\r
96#define C_M68K_TO_SH2(xsh2, c) \\r
90b1c9db 97 (int)(((uint64_t)(c) * (xsh2)->mult_m68k_to_sh2) >> CYCLE_MULT_SHIFT)\r
ed4402a7 98#define C_SH2_TO_M68K(xsh2, c) \\r
90b1c9db 99 (int)(((uint64_t)(c+3U) * (xsh2)->mult_sh2_to_m68k) >> CYCLE_MULT_SHIFT)\r
ed4402a7 100\r
f81107f5 101int sh2_init(SH2 *sh2, int is_slave, SH2 *other_sh2);\r
e898de13 102void sh2_finish(SH2 *sh2);\r
41397701 103void sh2_reset(SH2 *sh2);\r
a8fd6e37 104int sh2_irl_irq(SH2 *sh2, int level, int nested_call);\r
41397701 105void sh2_internal_irq(SH2 *sh2, int level, int vector);\r
6add7875 106void sh2_do_irq(SH2 *sh2, int level, int vector);\r
b4db550e 107void sh2_pack(const SH2 *sh2, unsigned char *buff);\r
108void sh2_unpack(SH2 *sh2, const unsigned char *buff);\r
41397701 109\r
0185b677 110int sh2_execute_drc(SH2 *sh2c, int cycles);\r
111int sh2_execute_interpreter(SH2 *sh2c, int cycles);\r
112\r
2eb21331 113static __inline void sh2_execute_prepare(SH2 *sh2, int use_drc)\r
114{\r
6b67b6aa 115#ifdef DRC_SH2\r
2eb21331 116 sh2->run = use_drc ? sh2_execute_drc : sh2_execute_interpreter;\r
6b67b6aa 117#else\r
118 sh2->run = sh2_execute_interpreter;\r
119#endif\r
2eb21331 120}\r
121\r
122static __inline int sh2_execute(SH2 *sh2, int cycles)\r
0185b677 123{\r
124 int ret;\r
125\r
126 sh2->cycles_timeslice = cycles;\r
2eb21331 127 ret = sh2->run(sh2, cycles);\r
0185b677 128\r
129 return sh2->cycles_timeslice - ret;\r
130}\r
41397701 131\r
b4db550e 132// regs, pending_int*, cycles, reserved\r
133#define SH2_STATE_SIZE ((24 + 2 + 2 + 12) * 4)\r
134\r
bcf65fd6 135// pico memhandlers\r
136// XXX: move somewhere else\r
9257c0c5 137u32 REGPARM(2) p32x_sh2_read8(u32 a, SH2 *sh2);\r
138u32 REGPARM(2) p32x_sh2_read16(u32 a, SH2 *sh2);\r
139u32 REGPARM(2) p32x_sh2_read32(u32 a, SH2 *sh2);\r
182b8d01 140void REGPARM(3) p32x_sh2_write8 (u32 a, u32 d, SH2 *sh2);\r
141void REGPARM(3) p32x_sh2_write16(u32 a, u32 d, SH2 *sh2);\r
142void REGPARM(3) p32x_sh2_write32(u32 a, u32 d, SH2 *sh2);\r
bcf65fd6 143\r
00faec9c 144// debug\r
145#ifdef DRC_CMP\r
146void do_sh2_trace(SH2 *current, int cycles);\r
898d51a7 147void REGPARM(1) do_sh2_cmp(SH2 *current);\r
00faec9c 148#endif\r
149\r
41397701 150#endif /* __SH2_H__ */\r