Skip to content

Commit 046e5ff

Browse files
authored
Merge pull request #256 from BinBashBanana/master
Fix emscripten
2 parents 5b8cdea + 51f7667 commit 046e5ff

File tree

8 files changed

+48
-31
lines changed

8 files changed

+48
-31
lines changed

Makefile.libretro

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,7 @@ else ifneq (,$(findstring armv,$(platform)))
443443
else ifeq ($(platform), emscripten)
444444
TARGET := $(TARGET_NAME)_libretro_$(platform).bc
445445
ARCH = unknown
446+
NO_ALIGN_FUNCTIONS = 1
446447
STATIC_LINKING_LINK = 1
447448
STATIC_LINKING = 1
448449

cpu/cz80/cz80.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ static inline unsigned char picodrive_read(unsigned short a)
221221
{
222222
uptr v = z80_read_map[a >> Z80_MEM_SHIFT];
223223
if (map_flag_set(v))
224-
return ((z80_read_f *)(v << 1))(a);
224+
return ((z80_read_f *)(map_to_function(v)))(a);
225225
return *(unsigned char *)((v << 1) + a);
226226
}
227227
#endif

cpu/cz80/cz80macro.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
unsigned char d = D; \
6868
uptr v = z80_write_map[a >> Z80_MEM_SHIFT]; \
6969
if (map_flag_set(v)) \
70-
((z80_write_f *)(v << 1))(a, d); \
70+
((z80_write_f *)(map_to_function(v)))(a, d); \
7171
else \
7272
*(unsigned char *)((v << 1) + a) = d; \
7373
}

pico/32x/memory.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1928,7 +1928,7 @@ u32 REGPARM(2) p32x_sh2_read8(u32 a, SH2 *sh2)
19281928
if (!map_flag_set(p))
19291929
return *(s8 *)((p << 1) + MEM_BE2(a & sh2_map->mask));
19301930
else
1931-
return ((sh2_read_handler *)(p << 1))(a, sh2);
1931+
return ((sh2_read_handler *)(map_to_function(p)))(a, sh2);
19321932
}
19331933

19341934
u32 REGPARM(2) p32x_sh2_read16(u32 a, SH2 *sh2)
@@ -1941,7 +1941,7 @@ u32 REGPARM(2) p32x_sh2_read16(u32 a, SH2 *sh2)
19411941
if (!map_flag_set(p))
19421942
return *(s16 *)((p << 1) + (a & sh2_map->mask));
19431943
else
1944-
return ((sh2_read_handler *)(p << 1))(a, sh2);
1944+
return ((sh2_read_handler *)(map_to_function(p)))(a, sh2);
19451945
}
19461946

19471947
u32 REGPARM(2) p32x_sh2_read32(u32 a, SH2 *sh2)
@@ -1955,7 +1955,7 @@ u32 REGPARM(2) p32x_sh2_read32(u32 a, SH2 *sh2)
19551955
u32 *pd = (u32 *)((p << 1) + (a & sh2_map->mask));
19561956
return CPU_BE2(*pd);
19571957
} else
1958-
return ((sh2_read_handler *)(p << 1))(a, sh2);
1958+
return ((sh2_read_handler *)(map_to_function(p)))(a, sh2);
19591959
}
19601960

19611961
void REGPARM(3) p32x_sh2_write8(u32 a, u32 d, SH2 *sh2)
@@ -2299,7 +2299,7 @@ static void get_bios(void)
22992299
}
23002300

23012301
#define MAP_MEMORY(m) ((uptr)(m) >> 1)
2302-
#define MAP_HANDLER(h) ( ((uptr)(h) >> 1) | ((uptr)1 << (sizeof(uptr) * 8 - 1)) )
2302+
#define MAP_HANDLER(h) ( ((uptr)(h) >> MAP_FUNCTION_SHIFT) | ((uptr)1 << (sizeof(uptr) * 8 - 1)) )
23032303

23042304
static sh2_memmap msh2_read8_map[0x80], msh2_read16_map[0x80], msh2_read32_map[0x80];
23052305
static sh2_memmap ssh2_read8_map[0x80], ssh2_read16_map[0x80], ssh2_read32_map[0x80];

pico/memory.c

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,26 @@ static void xmap_set(uptr *map, int shift, u32 start_addr, u32 end_addr,
4141
return;
4242
}
4343

44-
if (addr & 1) {
45-
elprintf(EL_STATUS|EL_ANOMALY, "xmap_set: ptr is not aligned: %08lx", addr);
46-
return;
44+
if (is_func) {
45+
if (addr & ((1 << MAP_FUNCTION_SHIFT) - 1)) {
46+
elprintf(EL_STATUS|EL_ANOMALY, "xmap_set: function ptr is not aligned: %08lx", addr);
47+
return;
48+
}
49+
} else {
50+
if (addr & 1) {
51+
elprintf(EL_STATUS|EL_ANOMALY, "xmap_set: data ptr is not aligned: %08lx", addr);
52+
return;
53+
}
4754
}
4855

4956
if (!is_func)
5057
addr -= start_addr;
5158

5259
for (i = start_addr >> shift; i <= end_addr >> shift; i++) {
53-
map[i] = addr >> 1;
5460
if (is_func)
55-
map[i] |= MAP_FLAG;
61+
map[i] = (addr >> MAP_FUNCTION_SHIFT) | MAP_FLAG;
62+
else
63+
map[i] = addr >> 1;
5664
}
5765
}
5866

@@ -168,8 +176,8 @@ void cpu68k_map_read_funcs(u32 start_addr, u32 end_addr, u32 (*r8)(u32), u32 (*r
168176
r16map = s68k_read16_map;
169177
}
170178

171-
ar8 = (ar8 >> 1 ) | MAP_FLAG;
172-
ar16 = (ar16 >> 1 ) | MAP_FLAG;
179+
ar8 = (ar8 >> MAP_FUNCTION_SHIFT) | MAP_FLAG;
180+
ar16 = (ar16 >> MAP_FUNCTION_SHIFT) | MAP_FLAG;
173181
for (i = start_addr >> shift; i <= end_addr >> shift; i++)
174182
r8map[i] = ar8, r16map[i] = ar16;
175183
}
@@ -194,10 +202,10 @@ void cpu68k_map_all_funcs(u32 start_addr, u32 end_addr, u32 (*r8)(u32), u32 (*r1
194202
w16map = s68k_write16_map;
195203
}
196204

197-
ar8 = (ar8 >> 1 ) | MAP_FLAG;
198-
ar16 = (ar16 >> 1 ) | MAP_FLAG;
199-
aw8 = (aw8 >> 1 ) | MAP_FLAG;
200-
aw16 = (aw16 >> 1 ) | MAP_FLAG;
205+
ar8 = (ar8 >> MAP_FUNCTION_SHIFT) | MAP_FLAG;
206+
ar16 = (ar16 >> MAP_FUNCTION_SHIFT) | MAP_FLAG;
207+
aw8 = (aw8 >> MAP_FUNCTION_SHIFT) | MAP_FLAG;
208+
aw16 = (aw16 >> MAP_FUNCTION_SHIFT) | MAP_FLAG;
201209
for (i = start_addr >> shift; i <= end_addr >> shift; i++)
202210
r8map[i] = ar8, r16map[i] = ar16, w8map[i] = aw8, w16map[i] = aw16;
203211
}
@@ -246,19 +254,19 @@ void m68k_map_unmap(u32 start_addr, u32 end_addr)
246254

247255
addr = (uptr)m68k_unmapped_read8;
248256
for (i = start_addr >> shift; i <= end_addr >> shift; i++)
249-
m68k_read8_map[i] = (addr >> 1) | MAP_FLAG;
257+
m68k_read8_map[i] = (addr >> MAP_FUNCTION_SHIFT) | MAP_FLAG;
250258

251259
addr = (uptr)m68k_unmapped_read16;
252260
for (i = start_addr >> shift; i <= end_addr >> shift; i++)
253-
m68k_read16_map[i] = (addr >> 1) | MAP_FLAG;
261+
m68k_read16_map[i] = (addr >> MAP_FUNCTION_SHIFT) | MAP_FLAG;
254262

255263
addr = (uptr)m68k_unmapped_write8;
256264
for (i = start_addr >> shift; i <= end_addr >> shift; i++)
257-
m68k_write8_map[i] = (addr >> 1) | MAP_FLAG;
265+
m68k_write8_map[i] = (addr >> MAP_FUNCTION_SHIFT) | MAP_FLAG;
258266

259267
addr = (uptr)m68k_unmapped_write16;
260268
for (i = start_addr >> shift; i <= end_addr >> shift; i++)
261-
m68k_write16_map[i] = (addr >> 1) | MAP_FLAG;
269+
m68k_write16_map[i] = (addr >> MAP_FUNCTION_SHIFT) | MAP_FLAG;
262270
}
263271

264272
#ifndef _ASM_MEMORY_C

pico/memory.h

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,22 @@ void m68k_map_unmap(u32 start_addr, u32 end_addr);
5757
#define MAP_FLAG ((uptr)1 << (sizeof(uptr) * 8 - 1))
5858
#define map_flag_set(x) ((x) & MAP_FLAG)
5959

60+
#ifdef __EMSCRIPTEN__
61+
#define MAP_FUNCTION_SHIFT 0
62+
#define map_to_function(x) ((x) & ~MAP_FLAG)
63+
#else
64+
#define MAP_FUNCTION_SHIFT 1
65+
#define map_to_function(x) ((x) << MAP_FUNCTION_SHIFT)
66+
#endif
67+
6068
#define MAKE_68K_READ8(name, map) \
6169
u32 name(u32 a) \
6270
{ \
6371
uptr v; \
6472
a &= 0x00ffffff; \
6573
v = map[a >> M68K_MEM_SHIFT]; \
6674
if (map_flag_set(v)) \
67-
return ((cpu68k_read_f *)(v << 1))(a); \
75+
return ((cpu68k_read_f *)(map_to_function(v)))(a); \
6876
else \
6977
return *(u8 *)((v << 1) + MEM_BE2(a)); \
7078
}
@@ -76,7 +84,7 @@ u32 name(u32 a) \
7684
a &= 0x00fffffe; \
7785
v = map[a >> M68K_MEM_SHIFT]; \
7886
if (map_flag_set(v)) \
79-
return ((cpu68k_read_f *)(v << 1))(a); \
87+
return ((cpu68k_read_f *)(map_to_function(v)))(a); \
8088
else \
8189
return *(u16 *)((v << 1) + a); \
8290
}
@@ -88,13 +96,13 @@ u32 name(u32 a) \
8896
u32 d; \
8997
a &= 0x00fffffe; \
9098
v = map[a >> M68K_MEM_SHIFT]; \
91-
vs = v << 1; \
9299
if (map_flag_set(v)) { \
100+
vs = map_to_function(v); \
93101
d = ((cpu68k_read_f *)vs)(a) << 16; \
94102
d |= ((cpu68k_read_f *)vs)(a + 2); \
95103
} \
96104
else { \
97-
u16 *m = (u16 *)(vs + a); \
105+
u16 *m = (u16 *)((v << 1) + a); \
98106
d = (m[0] << 16) | m[1]; \
99107
} \
100108
return d; \
@@ -107,7 +115,7 @@ void name(u32 a, u8 d) \
107115
a &= 0x00ffffff; \
108116
v = map[a >> M68K_MEM_SHIFT]; \
109117
if (map_flag_set(v)) \
110-
((cpu68k_write_f *)(v << 1))(a, d); \
118+
((cpu68k_write_f *)(map_to_function(v)))(a, d); \
111119
else \
112120
*(u8 *)((v << 1) + MEM_BE2(a)) = d; \
113121
}
@@ -119,7 +127,7 @@ void name(u32 a, u16 d) \
119127
a &= 0x00fffffe; \
120128
v = map[a >> M68K_MEM_SHIFT]; \
121129
if (map_flag_set(v)) \
122-
((cpu68k_write_f *)(v << 1))(a, d); \
130+
((cpu68k_write_f *)(map_to_function(v)))(a, d); \
123131
else \
124132
*(u16 *)((v << 1) + a) = d; \
125133
}
@@ -130,13 +138,13 @@ void name(u32 a, u32 d) \
130138
uptr v, vs; \
131139
a &= 0x00fffffe; \
132140
v = map[a >> M68K_MEM_SHIFT]; \
133-
vs = v << 1; \
134141
if (map_flag_set(v)) { \
142+
vs = map_to_function(v); \
135143
((cpu68k_write_f *)vs)(a, d >> 16); \
136144
((cpu68k_write_f *)vs)(a + 2, d); \
137145
} \
138146
else { \
139-
u16 *m = (u16 *)(vs + a); \
147+
u16 *m = (u16 *)((v << 1) + a); \
140148
m[0] = d >> 16; \
141149
m[1] = d; \
142150
} \

pico/z80if.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ u32 z80_read(u32 a)
1919
a &= 0x00ffff;
2020
v = z80_read_map[a >> Z80_MEM_SHIFT];
2121
if (map_flag_set(v))
22-
return ((z80_read_f *)(v << 1))(a);
22+
return ((z80_read_f *)(map_to_function(v)))(a);
2323
else
2424
return *(u8 *)((v << 1) + a);
2525
}

platform/libretro/libretro-common/include/memmap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
#include <stdio.h>
2727
#include <stdint.h>
2828

29-
#if defined(PSP) || defined(PS2) || defined(GEKKO) || defined(VITA) || defined(_XBOX) || defined(_3DS) || defined(WIIU) || defined(SWITCH) || defined(HAVE_LIBNX) || defined(__PS3__) || defined(__PSL1GHT__)
29+
#if defined(PSP) || defined(PS2) || defined(GEKKO) || defined(VITA) || defined(_XBOX) || defined(_3DS) || defined(WIIU) || defined(SWITCH) || defined(HAVE_LIBNX) || defined(__PS3__) || defined(__PSL1GHT__) || defined(__EMSCRIPTEN__)
3030
/* No mman available */
3131
#elif defined(_WIN32) && !defined(_XBOX)
3232
#include <windows.h>

0 commit comments

Comments
 (0)