diff --git a/yabause/src/cd-libretro.c b/yabause/src/cd-libretro.c index 9cc041f87..7a750aa77 100644 --- a/yabause/src/cd-libretro.c +++ b/yabause/src/cd-libretro.c @@ -2132,6 +2132,13 @@ static int ISOCDReadSectorFADFromCHD(u32 FAD, void *buffer) { } } else { + if (track->sector_size == 2048) { /* lane web: 2048-byte track, callers want a whole raw sector */ + u8 *o = (u8 *)buffer; u32 f = FAD; int q; + memset(o, 0, 2448); for (q = 1; q < 11; q++) o[q] = 0xFF; + { u32 m = f / 75 / 60, se = (f / 75) % 60, fr = f % 75; o[12] = (u8)(((m / 10) << 4) | (m % 10)); o[13] = (u8)(((se / 10) << 4) | (se % 10)); o[14] = (u8)(((fr / 10) << 4) | (fr % 10)); } + o[15] = 1; + memcpy(o + 16, pChdInfo->hunk_buffer + hunk_offset, 2048); + } else memcpy(buffer, pChdInfo->hunk_buffer + hunk_offset, track->sector_size); } diff --git a/yabause/src/cs2.c b/yabause/src/cs2.c index accaa2da1..1767e1154 100644 --- a/yabause/src/cs2.c +++ b/yabause/src/cs2.c @@ -2243,6 +2243,7 @@ void Cs2ResetSelector(void) { } } + Cs2Area->blockfreespace = 200; /* lane web: all blocks free after this reset */ // clear blocks for (i = 0; i < MAX_BLOCKS; i++) { diff --git a/yabause/src/libretro/Makefile b/yabause/src/libretro/Makefile index 05585d143..925620b07 100644 --- a/yabause/src/libretro/Makefile +++ b/yabause/src/libretro/Makefile @@ -392,8 +392,8 @@ else ifeq ($(platform), libnx) # Emscripten else ifeq ($(platform), emscripten) TARGET := $(TARGET_NAME)_libretro_$(platform).bc - CFLAGS += -pthread -msimd128 -ftree-vectorize - CXXFLAGS += -pthread -msimd128 -ftree-vectorize + CFLAGS += -msimd128 -ftree-vectorize + CXXFLAGS += -msimd128 -ftree-vectorize STATIC_LINKING = 1 HAVE_SSE = 0 diff --git a/yabause/src/libretro/libretro.c b/yabause/src/libretro/libretro.c index a5c771fb6..afdb9b6c5 100644 --- a/yabause/src/libretro/libretro.c +++ b/yabause/src/libretro/libretro.c @@ -1195,7 +1195,15 @@ void retro_reset(void) YabauseSetDecilineMode(1); } +#ifdef __EMSCRIPTEN__ +extern double emscripten_get_now(void); +unsigned web_ms[2]; +static void web_run_inner(void); +void retro_run(void) { double t=emscripten_get_now(); web_run_inner(); t=emscripten_get_now()-t; web_ms[0]+=(unsigned)(t*1000); if((unsigned)(t*1000)>web_ms[1]) web_ms[1]=(unsigned)(t*1000); } +static void web_run_inner(void) +#else void retro_run(void) +#endif { unsigned i; bool fastforward = false; @@ -1250,3 +1258,13 @@ size_t wcstombs(char *s, const wchar_t *pwcs, size_t n) } #endif + +#ifdef __EMSCRIPTEN__ +#include +#include "sh2core.h" +#include "memory.h" +/* Test driver read of guest memory, no side effect outside I/O space. */ +#include "cs2.h" +EMSCRIPTEN_KEEPALIVE unsigned web_pc(int w) { switch(w){case 0:return MSH2->regs.PC;case 1:return MSH2->regs.PR;case 2:return Cs2Area->reg.HIRQ;case 3:return Cs2Area->reg.CR1;case 4:return Cs2Area->status;case 5:return Cs2Area->_command;case 6:return Cs2Area->_commandtiming;case 7:return SSH2->regs.PC;case 10:return web_ms[0];case 11:return web_ms[1];case 12:{unsigned m=web_ms[1];web_ms[1]=0;return m;}case 8:{extern unsigned web_cdda[2];return web_cdda[0];}case 9:{extern unsigned web_cdda[2];return web_cdda[1];}} return 0; } +EMSCRIPTEN_KEEPALIVE unsigned web_peek8(unsigned a) { return MappedMemoryReadByteNocache(MSH2, a); } +#endif diff --git a/yabause/src/scsp.c b/yabause/src/scsp.c index d46d52ee1..9baf5b6dd 100644 --- a/yabause/src/scsp.c +++ b/yabause/src/scsp.c @@ -5110,9 +5110,11 @@ ScspConvert32uto16s (s32 *srcL, s32 *srcR, s16 *dst, u32 len) ////////////////////////////////////////////////////////////////////////////// +unsigned web_cdda[2]; void ScspReceiveCDDA (const u8 *sector) { + { int q; web_cdda[0]++; for(q=0;q<2352;q++) if(sector[q]){web_cdda[1]++;break;} } // If buffer is half empty or less, boost timing for a bit until we've buffered a few sectors if (cdda_out_left < (sizeof(cddabuf.data) / 2)) { diff --git a/yabause/src/sh2int.c b/yabause/src/sh2int.c index c6f9696b2..c09656908 100644 --- a/yabause/src/sh2int.c +++ b/yabause/src/sh2int.c @@ -186,7 +186,7 @@ static u32 FASTCALL FetchHWram(SH2_struct *sh, u32 addr) } extern u8 * Vdp1Ram; -static u32 FASTCALL FetchVram(u32 addr) +static u32 FASTCALL FetchVram(UNUSED SH2_struct *sh, u32 addr) { addr &= 0x07FFFF; return T1ReadWord(Vdp1Ram, addr); @@ -195,7 +195,7 @@ static u32 FASTCALL FetchVram(u32 addr) ////////////////////////////////////////////////////////////////////////////// -static u32 FASTCALL FetchInvalid(UNUSED u32 addr) +static u32 FASTCALL FetchInvalid(SH2_struct *sh, UNUSED u32 addr) { return 0xFFFF; } @@ -2767,7 +2767,22 @@ int SH2InterpreterInit(enum SHMODELTYPE model, SH2_struct *msh, SH2_struct *ssh) case 0x002: // Low Work Ram msh->fetchlist[i] = ssh->fetchlist[i] = FetchLWram; break; - case 0x020: // CS0 + case 0x021: + case 0x022: + case 0x023: + case 0x024: + case 0x025: + case 0x026: + case 0x027: + case 0x028: + case 0x029: + case 0x02A: + case 0x02B: + case 0x02C: + case 0x02D: + case 0x02E: + case 0x02F: + case 0x020: // CS0, whole A-bus window: code runs from the 4 MB cart msh->fetchlist[i] = ssh->fetchlist[i] = FetchCs0; break; case 0x05c: // Fighting Viper