platform ps2, handle audio similar to psp
[picodrive.git] / pico / memory.h
CommitLineData
af37bca8 1// memory map related stuff
2
48c9e01b 3#include "pico_port.h"
4
af37bca8 5#define M68K_MEM_SHIFT 16
45f2f245 6// minimum size we can map
7#define M68K_BANK_SIZE (1 << M68K_MEM_SHIFT)
8#define M68K_BANK_MASK (M68K_BANK_SIZE - 1)
af37bca8 9
bcf65fd6 10extern uptr m68k_read8_map [0x1000000 >> M68K_MEM_SHIFT];
11extern uptr m68k_read16_map [0x1000000 >> M68K_MEM_SHIFT];
12extern uptr m68k_write8_map [0x1000000 >> M68K_MEM_SHIFT];
13extern uptr m68k_write16_map[0x1000000 >> M68K_MEM_SHIFT];
af37bca8 14
bcf65fd6 15extern uptr s68k_read8_map [0x1000000 >> M68K_MEM_SHIFT];
16extern uptr s68k_read16_map [0x1000000 >> M68K_MEM_SHIFT];
17extern uptr s68k_write8_map [0x1000000 >> M68K_MEM_SHIFT];
18extern uptr s68k_write16_map[0x1000000 >> M68K_MEM_SHIFT];
af37bca8 19
b8a1c09a 20// top-level handlers that cores can use
21// (or alternatively build them into themselves)
22// XXX: unhandled: *16 and *32 might cross the bank boundaries
23typedef u32 (cpu68k_read_f)(u32 a);
24typedef void (cpu68k_write_f)(u32 a, u32 d);
25
77e58d93 26extern u32 m68k_read8(u32 a);
27extern u32 m68k_read16(u32 a);
82b3e6cf 28extern u32 m68k_read32(u32 a);
77e58d93 29extern void m68k_write8(u32 a, u8 d);
30extern void m68k_write16(u32 a, u16 d);
82b3e6cf 31extern void m68k_write32(u32 a, u32 d);
32
33extern u32 s68k_read8(u32 a);
34extern u32 s68k_read16(u32 a);
35extern u32 s68k_read32(u32 a);
36extern void s68k_write8(u32 a, u8 d);
37extern void s68k_write16(u32 a, u16 d);
38extern void s68k_write32(u32 a, u32 d);
77e58d93 39
b8a1c09a 40// z80
b784d4a5 41#define Z80_MEM_SHIFT 10 // must be <=10 to allow 1KB pages for SMS Sega mapper
b8a1c09a 42extern uptr z80_read_map [0x10000 >> Z80_MEM_SHIFT];
43extern uptr z80_write_map[0x10000 >> Z80_MEM_SHIFT];
44typedef unsigned char (z80_read_f)(unsigned short a);
45typedef void (z80_write_f)(unsigned int a, unsigned char data);
46
7ed05f84 47void z80_map_set(uptr *map, u16 start_addr, u16 end_addr,
0ace9b9a 48 const void *func_or_mh, int is_func);
7ed05f84 49void cpu68k_map_set(uptr *map, u32 start_addr, u32 end_addr,
0ace9b9a 50 const void *func_or_mh, int is_func);
8eeb3426 51void cpu68k_map_read_mem(u32 start_addr, u32 end_addr, void *ptr, int is_sub);
7ed05f84 52void cpu68k_map_all_ram(u32 start_addr, u32 end_addr, void *ptr, int is_sub);
8eeb3426 53void cpu68k_map_read_funcs(u32 start_addr, u32 end_addr, u32 (*r8)(u32), u32 (*r16)(u32), int is_sub);
54void cpu68k_map_all_funcs(u32 start_addr, u32 end_addr, u32 (*r8)(u32), u32 (*r16)(u32), void (*w8)(u32, u32), void (*w16)(u32, u32), int is_sub);
7ed05f84 55void m68k_map_unmap(u32 start_addr, u32 end_addr);
af37bca8 56
add51c49 57#define MAP_FLAG ((uptr)1 << (sizeof(uptr) * 8 - 1))
58#define map_flag_set(x) ((x) & MAP_FLAG)
af37bca8 59
60#define MAKE_68K_READ8(name, map) \
61u32 name(u32 a) \
62{ \
bcf65fd6 63 uptr v; \
af37bca8 64 a &= 0x00ffffff; \
65 v = map[a >> M68K_MEM_SHIFT]; \
b8a1c09a 66 if (map_flag_set(v)) \
af37bca8 67 return ((cpu68k_read_f *)(v << 1))(a); \
68 else \
57c5a5e5 69 return *(u8 *)((v << 1) + MEM_BE2(a)); \
af37bca8 70}
71
72#define MAKE_68K_READ16(name, map) \
73u32 name(u32 a) \
74{ \
bcf65fd6 75 uptr v; \
af37bca8 76 a &= 0x00fffffe; \
77 v = map[a >> M68K_MEM_SHIFT]; \
b8a1c09a 78 if (map_flag_set(v)) \
af37bca8 79 return ((cpu68k_read_f *)(v << 1))(a); \
80 else \
81 return *(u16 *)((v << 1) + a); \
82}
83
84#define MAKE_68K_READ32(name, map) \
85u32 name(u32 a) \
86{ \
bcf65fd6 87 uptr v, vs; \
af37bca8 88 u32 d; \
89 a &= 0x00fffffe; \
90 v = map[a >> M68K_MEM_SHIFT]; \
91 vs = v << 1; \
b8a1c09a 92 if (map_flag_set(v)) { \
af37bca8 93 d = ((cpu68k_read_f *)vs)(a) << 16; \
94 d |= ((cpu68k_read_f *)vs)(a + 2); \
95 } \
96 else { \
97 u16 *m = (u16 *)(vs + a); \
98 d = (m[0] << 16) | m[1]; \
99 } \
100 return d; \
101}
102
103#define MAKE_68K_WRITE8(name, map) \
104void name(u32 a, u8 d) \
105{ \
bcf65fd6 106 uptr v; \
af37bca8 107 a &= 0x00ffffff; \
108 v = map[a >> M68K_MEM_SHIFT]; \
b8a1c09a 109 if (map_flag_set(v)) \
af37bca8 110 ((cpu68k_write_f *)(v << 1))(a, d); \
111 else \
57c5a5e5 112 *(u8 *)((v << 1) + MEM_BE2(a)) = d; \
af37bca8 113}
114
115#define MAKE_68K_WRITE16(name, map) \
116void name(u32 a, u16 d) \
117{ \
bcf65fd6 118 uptr v; \
af37bca8 119 a &= 0x00fffffe; \
120 v = map[a >> M68K_MEM_SHIFT]; \
b8a1c09a 121 if (map_flag_set(v)) \
af37bca8 122 ((cpu68k_write_f *)(v << 1))(a, d); \
123 else \
124 *(u16 *)((v << 1) + a) = d; \
125}
126
127#define MAKE_68K_WRITE32(name, map) \
128void name(u32 a, u32 d) \
129{ \
bcf65fd6 130 uptr v, vs; \
af37bca8 131 a &= 0x00fffffe; \
132 v = map[a >> M68K_MEM_SHIFT]; \
133 vs = v << 1; \
b8a1c09a 134 if (map_flag_set(v)) { \
af37bca8 135 ((cpu68k_write_f *)vs)(a, d >> 16); \
136 ((cpu68k_write_f *)vs)(a + 2, d); \
137 } \
138 else { \
139 u16 *m = (u16 *)(vs + a); \
140 m[0] = d >> 16; \
141 m[1] = d; \
142 } \
143}
144
0c7d1ba3 145#ifdef NEED_DMA_SOURCE // meh
146
7feeb880 147static __inline void *m68k_dma_source(u32 a)
148{
0c7d1ba3 149 u8 *base;
7feeb880 150 uptr v;
7feeb880 151 v = m68k_read16_map[a >> M68K_MEM_SHIFT];
0c7d1ba3 152 if (map_flag_set(v)) {
153 if (a >= Pico.romsize) // Rom
154 return NULL;
155 base = Pico.rom;
156 }
7feeb880 157 else
0c7d1ba3 158 base = (void *)(v << 1);
159 return base + (a & 0xfe0000);
7feeb880 160}
161
0c7d1ba3 162#endif
163
00faec9c 164// 32x
165typedef struct {
166 uptr addr; // stores (membase >> 1) or ((handler >> 1) | (1<<31))
167 u32 mask;
168} sh2_memmap;