mirror of https://github.com/snes9xgit/snes9x.git
Merge branch 'msu1'
This commit is contained in:
commit
27e6bc1b01
87
apu/apu.cpp
87
apu/apu.cpp
|
@ -190,6 +190,7 @@
|
|||
#include <math.h>
|
||||
#include "snes9x.h"
|
||||
#include "apu.h"
|
||||
#include "msu1.h"
|
||||
#include "snapshot.h"
|
||||
#include "display.h"
|
||||
#include "hermite_resampler.h"
|
||||
|
@ -239,6 +240,13 @@ namespace spc
|
|||
static uint32 ratio_denominator = APU_DENOMINATOR_NTSC;
|
||||
}
|
||||
|
||||
namespace msu
|
||||
{
|
||||
static int buffer_size;
|
||||
static uint8 *landing_buffer = NULL;
|
||||
static Resampler *resampler = NULL;
|
||||
}
|
||||
|
||||
static void EightBitize (uint8 *, int);
|
||||
static void DeStereo (uint8 *, int);
|
||||
static void ReverseStereo (uint8 *, int);
|
||||
|
@ -311,6 +319,9 @@ bool8 S9xMixSamples (uint8 *buffer, int sample_count)
|
|||
memset(dest, 0, sample_count << 1);
|
||||
spc::resampler->clear();
|
||||
|
||||
if(Settings.MSU1)
|
||||
msu::resampler->clear();
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
else
|
||||
|
@ -320,6 +331,17 @@ bool8 S9xMixSamples (uint8 *buffer, int sample_count)
|
|||
spc::resampler->read((short *) dest, sample_count);
|
||||
if (spc::lag == spc::lag_master)
|
||||
spc::lag = 0;
|
||||
|
||||
if (Settings.MSU1)
|
||||
{
|
||||
if (msu::resampler->avail() >= sample_count)
|
||||
{
|
||||
uint8 *msu_sample = new uint8[sample_count * 2];
|
||||
msu::resampler->read((short *)msu_sample, sample_count);
|
||||
for (uint32 i = 0; i < sample_count; ++i)
|
||||
*((int16*)(dest+(i * 2))) += *((int16*)(msu_sample+(i * 2)));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -361,7 +383,19 @@ void S9xFinalizeSamples (void)
|
|||
{
|
||||
if (!Settings.Mute)
|
||||
{
|
||||
if (!spc::resampler->push((short *) spc::landing_buffer, SNES::dsp.spc_dsp.sample_count ()))
|
||||
if (Settings.MSU1)
|
||||
{
|
||||
S9xMSU1Generate(SNES::dsp.spc_dsp.sample_count());
|
||||
if (!msu::resampler->push((short *)msu::landing_buffer, S9xMSU1Samples()))
|
||||
{
|
||||
//spc::sound_in_sync = FALSE;
|
||||
|
||||
//if (Settings.SoundSync && !Settings.TurboMode)
|
||||
//return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!spc::resampler->push((short *)spc::landing_buffer, SNES::dsp.spc_dsp.sample_count()))
|
||||
{
|
||||
/* We weren't able to process the entire buffer. Potential overrun. */
|
||||
spc::sound_in_sync = FALSE;
|
||||
|
@ -371,6 +405,7 @@ void S9xFinalizeSamples (void)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
if (!Settings.SoundSync || Settings.TurboMode || Settings.Mute)
|
||||
spc::sound_in_sync = TRUE;
|
||||
else
|
||||
|
@ -380,6 +415,9 @@ void S9xFinalizeSamples (void)
|
|||
spc::sound_in_sync = FALSE;
|
||||
|
||||
SNES::dsp.spc_dsp.set_output((SNES::SPC_DSP::sample_t *) spc::landing_buffer, spc::buffer_size);
|
||||
|
||||
if (Settings.MSU1)
|
||||
S9xMSU1SetOutput((int16 *)msu::landing_buffer, msu::buffer_size);
|
||||
}
|
||||
|
||||
void S9xLandSamples (void)
|
||||
|
@ -393,6 +431,8 @@ void S9xLandSamples (void)
|
|||
void S9xClearSamples (void)
|
||||
{
|
||||
spc::resampler->clear();
|
||||
if (Settings.MSU1)
|
||||
msu::resampler->clear();
|
||||
spc::lag = spc::lag_master;
|
||||
}
|
||||
|
||||
|
@ -419,6 +459,12 @@ static void UpdatePlaybackRate (void)
|
|||
|
||||
double time_ratio = (double) Settings.SoundInputRate * spc::timing_hack_numerator / (Settings.SoundPlaybackRate * spc::timing_hack_denominator);
|
||||
spc::resampler->time_ratio(time_ratio);
|
||||
|
||||
if (Settings.MSU1)
|
||||
{
|
||||
time_ratio = (44100.0 / Settings.SoundPlaybackRate) * (Settings.SoundInputRate / 32040.5);
|
||||
msu::resampler->time_ratio(time_ratio);
|
||||
}
|
||||
}
|
||||
|
||||
bool8 S9xInitSound (int buffer_ms, int lag_ms)
|
||||
|
@ -442,6 +488,7 @@ bool8 S9xInitSound (int buffer_ms, int lag_ms)
|
|||
spc::buffer_size <<= 1;
|
||||
if (Settings.SixteenBitSound)
|
||||
spc::buffer_size <<= 1;
|
||||
msu::buffer_size = ((buffer_ms * 44100 / 1000) * 441000 / 320405) << 2; // Always 16-bit, Stereo
|
||||
|
||||
printf("Sound buffer size: %d (%d samples)\n", spc::buffer_size, sample_count);
|
||||
|
||||
|
@ -450,6 +497,11 @@ bool8 S9xInitSound (int buffer_ms, int lag_ms)
|
|||
spc::landing_buffer = new uint8[spc::buffer_size * 2];
|
||||
if (!spc::landing_buffer)
|
||||
return (FALSE);
|
||||
if (msu::landing_buffer)
|
||||
delete[] msu::landing_buffer;
|
||||
msu::landing_buffer = new uint8[msu::buffer_size * 2];
|
||||
if (!msu::landing_buffer)
|
||||
return (FALSE);
|
||||
|
||||
/* The resampler and spc unit use samples (16-bit short) as
|
||||
arguments. Use 2x in the resampler for buffer leveling with SoundSync */
|
||||
|
@ -465,6 +517,20 @@ bool8 S9xInitSound (int buffer_ms, int lag_ms)
|
|||
else
|
||||
spc::resampler->resize(spc::buffer_size >> (Settings.SoundSync ? 0 : 1));
|
||||
|
||||
|
||||
if (!msu::resampler)
|
||||
{
|
||||
msu::resampler = new HermiteResampler(msu::buffer_size);
|
||||
if (!msu::resampler)
|
||||
{
|
||||
delete[] msu::landing_buffer;
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
else
|
||||
msu::resampler->resize(msu::buffer_size);
|
||||
|
||||
|
||||
SNES::dsp.spc_dsp.set_output ((SNES::SPC_DSP::sample_t *) spc::landing_buffer, spc::buffer_size);
|
||||
|
||||
UpdatePlaybackRate();
|
||||
|
@ -503,6 +569,7 @@ bool8 S9xInitAPU (void)
|
|||
spc::landing_buffer = NULL;
|
||||
spc::shrink_buffer = NULL;
|
||||
spc::resampler = NULL;
|
||||
msu::resampler = NULL;
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
@ -526,6 +593,18 @@ void S9xDeinitAPU (void)
|
|||
delete[] spc::shrink_buffer;
|
||||
spc::shrink_buffer = NULL;
|
||||
}
|
||||
|
||||
if (msu::resampler)
|
||||
{
|
||||
delete msu::resampler;
|
||||
msu::resampler = NULL;
|
||||
}
|
||||
|
||||
if (msu::landing_buffer)
|
||||
{
|
||||
delete[] msu::landing_buffer;
|
||||
msu::landing_buffer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static inline int S9xAPUGetClock (int32 cpucycles)
|
||||
|
@ -603,6 +682,9 @@ void S9xResetAPU (void)
|
|||
SNES::dsp.spc_dsp.set_spc_snapshot_callback(SPCSnapshotCallback);
|
||||
|
||||
spc::resampler->clear();
|
||||
|
||||
if (Settings.MSU1)
|
||||
msu::resampler->clear();
|
||||
}
|
||||
|
||||
void S9xSoftResetAPU (void)
|
||||
|
@ -615,6 +697,9 @@ void S9xSoftResetAPU (void)
|
|||
SNES::dsp.spc_dsp.set_output ((SNES::SPC_DSP::sample_t *) spc::landing_buffer, spc::buffer_size >> 1);
|
||||
|
||||
spc::resampler->clear();
|
||||
|
||||
if (Settings.MSU1)
|
||||
msu::resampler->clear();
|
||||
}
|
||||
|
||||
void S9xAPUSaveState (uint8 *block)
|
||||
|
|
4
cpu.cpp
4
cpu.cpp
|
@ -312,6 +312,8 @@ void S9xReset (void)
|
|||
S9xResetOBC1();
|
||||
if (Settings.SRTC)
|
||||
S9xResetSRTC();
|
||||
if (Settings.MSU1)
|
||||
S9xMSU1Init();
|
||||
|
||||
S9xInitCheatData();
|
||||
}
|
||||
|
@ -346,6 +348,8 @@ void S9xSoftReset (void)
|
|||
S9xResetOBC1();
|
||||
if (Settings.SRTC)
|
||||
S9xResetSRTC();
|
||||
if (Settings.MSU1)
|
||||
S9xMSU1Init();
|
||||
|
||||
S9xInitCheatData();
|
||||
}
|
||||
|
|
1
getset.h
1
getset.h
|
@ -199,6 +199,7 @@
|
|||
#include "obc1.h"
|
||||
#include "seta.h"
|
||||
#include "bsx.h"
|
||||
#include "msu1.h"
|
||||
|
||||
#define addCyclesInMemoryAccess \
|
||||
if (!CPU.InDMAorHDMA) \
|
||||
|
|
|
@ -232,6 +232,7 @@ struct SSPC7110Snapshot s7snap;
|
|||
struct SSRTCSnapshot srtcsnap;
|
||||
struct SRTCData RTCData;
|
||||
struct SBSX BSX;
|
||||
struct SMSU1 MSU1;
|
||||
struct SMulti Multi;
|
||||
struct SSettings Settings;
|
||||
struct SSNESGameFixes SNESGameFixes;
|
||||
|
|
|
@ -136,6 +136,11 @@ snes9x_gtk_SOURCES += \
|
|||
../apu/bapu/smp/smp.cpp \
|
||||
../apu/bapu/smp/smp_state.cpp
|
||||
|
||||
# MSU1
|
||||
snes9x_gtk_SOURCES += \
|
||||
../msu1.cpp \
|
||||
../msu1.h
|
||||
|
||||
# DSP
|
||||
snes9x_gtk_SOURCES += \
|
||||
../dsp.cpp \
|
||||
|
|
|
@ -46,4 +46,5 @@ SOURCES_CXX := $(CORE_DIR)/apu/apu.cpp \
|
|||
$(CORE_DIR)/spc7110.cpp \
|
||||
$(CORE_DIR)/srtc.cpp \
|
||||
$(CORE_DIR)/tile.cpp \
|
||||
$(CORE_DIR)/msu1.cpp \
|
||||
$(CORE_DIR)/libretro/libretro.cpp
|
||||
|
|
18
memmap.cpp
18
memmap.cpp
|
@ -205,6 +205,7 @@
|
|||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "snes9x.h"
|
||||
#include "memmap.h"
|
||||
|
@ -1274,6 +1275,12 @@ static bool8 is_GNEXT_Add_On (const uint8 *data, uint32 size)
|
|||
return (FALSE);
|
||||
}
|
||||
|
||||
static bool8 MsuRomExists (void)
|
||||
{
|
||||
struct stat buf;
|
||||
return (stat(S9xGetFilename(".msu", ROMFILENAME_DIR), &buf) == 0);
|
||||
}
|
||||
|
||||
int CMemory::ScoreHiROM (bool8 skip_header, int32 romoff)
|
||||
{
|
||||
uint8 *buf = ROM + 0xff00 + romoff + (skip_header ? 0x200 : 0);
|
||||
|
@ -1887,7 +1894,7 @@ bool8 CMemory::LoadMultiCartInt ()
|
|||
memmove(ROM + Multi.cartOffsetA, ROM, Multi.cartSizeA + Multi.cartSizeB);
|
||||
else if(Multi.cartOffsetB) // clear cart A so the bios can detect that it's not present
|
||||
memset(ROM, 0, Multi.cartOffsetB);
|
||||
|
||||
|
||||
FILE *fp;
|
||||
size_t size;
|
||||
char path[PATH_MAX + 1];
|
||||
|
@ -2364,6 +2371,7 @@ void CMemory::InitROM (void)
|
|||
Settings.SETA = 0;
|
||||
Settings.SRTC = FALSE;
|
||||
Settings.BS = FALSE;
|
||||
Settings.MSU1 = FALSE;
|
||||
|
||||
SuperFX.nRomBanks = CalculatedSize >> 15;
|
||||
|
||||
|
@ -2538,6 +2546,9 @@ void CMemory::InitROM (void)
|
|||
break;
|
||||
}
|
||||
|
||||
// MSU1
|
||||
Settings.MSU1 = MsuRomExists();
|
||||
|
||||
//// Map memory and calculate checksum
|
||||
|
||||
Map_Initialize();
|
||||
|
@ -3490,7 +3501,7 @@ const char * CMemory::KartContents (void)
|
|||
static char str[64];
|
||||
static const char *contents[3] = { "ROM", "ROM+RAM", "ROM+RAM+BAT" };
|
||||
|
||||
char chip[16];
|
||||
char chip[20];
|
||||
|
||||
if (ROMType == 0 && !Settings.BS)
|
||||
return ("ROM");
|
||||
|
@ -3536,6 +3547,9 @@ const char * CMemory::KartContents (void)
|
|||
else
|
||||
strcpy(chip, "");
|
||||
|
||||
if (Settings.MSU1)
|
||||
sprintf(chip + strlen(chip), "+MSU-1");
|
||||
|
||||
sprintf(str, "%s%s", contents[(ROMType & 0xf) % 3], chip);
|
||||
|
||||
return (str);
|
||||
|
|
|
@ -0,0 +1,467 @@
|
|||
/***********************************************************************************
|
||||
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
|
||||
|
||||
(c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com),
|
||||
Jerremy Koot (jkoot@snes9x.com)
|
||||
|
||||
(c) Copyright 2002 - 2004 Matthew Kendora
|
||||
|
||||
(c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org)
|
||||
|
||||
(c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/)
|
||||
|
||||
(c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net)
|
||||
|
||||
(c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca),
|
||||
Kris Bleakley (codeviolation@hotmail.com)
|
||||
|
||||
(c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net),
|
||||
Nach (n-a-c-h@users.sourceforge.net),
|
||||
|
||||
(c) Copyright 2002 - 2011 zones (kasumitokoduck@yahoo.com)
|
||||
|
||||
(c) Copyright 2006 - 2007 nitsuja
|
||||
|
||||
(c) Copyright 2009 - 2016 BearOso,
|
||||
OV2
|
||||
|
||||
(c) Copyright 2011 - 2016 Hans-Kristian Arntzen,
|
||||
Daniel De Matteis
|
||||
(Under no circumstances will commercial rights be given)
|
||||
|
||||
|
||||
BS-X C emulator code
|
||||
(c) Copyright 2005 - 2006 Dreamer Nom,
|
||||
zones
|
||||
|
||||
C4 x86 assembler and some C emulation code
|
||||
(c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com),
|
||||
Nach,
|
||||
zsKnight (zsknight@zsnes.com)
|
||||
|
||||
C4 C++ code
|
||||
(c) Copyright 2003 - 2006 Brad Jorsch,
|
||||
Nach
|
||||
|
||||
DSP-1 emulator code
|
||||
(c) Copyright 1998 - 2006 _Demo_,
|
||||
Andreas Naive (andreasnaive@gmail.com),
|
||||
Gary Henderson,
|
||||
Ivar (ivar@snes9x.com),
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Matthew Kendora,
|
||||
Nach,
|
||||
neviksti (neviksti@hotmail.com)
|
||||
|
||||
DSP-2 emulator code
|
||||
(c) Copyright 2003 John Weidman,
|
||||
Kris Bleakley,
|
||||
Lord Nightmare (lord_nightmare@users.sourceforge.net),
|
||||
Matthew Kendora,
|
||||
neviksti
|
||||
|
||||
DSP-3 emulator code
|
||||
(c) Copyright 2003 - 2006 John Weidman,
|
||||
Kris Bleakley,
|
||||
Lancer,
|
||||
z80 gaiden
|
||||
|
||||
DSP-4 emulator code
|
||||
(c) Copyright 2004 - 2006 Dreamer Nom,
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Nach,
|
||||
z80 gaiden
|
||||
|
||||
OBC1 emulator code
|
||||
(c) Copyright 2001 - 2004 zsKnight,
|
||||
pagefault (pagefault@zsnes.com),
|
||||
Kris Bleakley
|
||||
Ported from x86 assembler to C by sanmaiwashi
|
||||
|
||||
SPC7110 and RTC C++ emulator code used in 1.39-1.51
|
||||
(c) Copyright 2002 Matthew Kendora with research by
|
||||
zsKnight,
|
||||
John Weidman,
|
||||
Dark Force
|
||||
|
||||
SPC7110 and RTC C++ emulator code used in 1.52+
|
||||
(c) Copyright 2009 byuu,
|
||||
neviksti
|
||||
|
||||
S-DD1 C emulator code
|
||||
(c) Copyright 2003 Brad Jorsch with research by
|
||||
Andreas Naive,
|
||||
John Weidman
|
||||
|
||||
S-RTC C emulator code
|
||||
(c) Copyright 2001 - 2006 byuu,
|
||||
John Weidman
|
||||
|
||||
ST010 C++ emulator code
|
||||
(c) Copyright 2003 Feather,
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Matthew Kendora
|
||||
|
||||
Super FX x86 assembler emulator code
|
||||
(c) Copyright 1998 - 2003 _Demo_,
|
||||
pagefault,
|
||||
zsKnight
|
||||
|
||||
Super FX C emulator code
|
||||
(c) Copyright 1997 - 1999 Ivar,
|
||||
Gary Henderson,
|
||||
John Weidman
|
||||
|
||||
Sound emulator code used in 1.5-1.51
|
||||
(c) Copyright 1998 - 2003 Brad Martin
|
||||
(c) Copyright 1998 - 2006 Charles Bilyue'
|
||||
|
||||
Sound emulator code used in 1.52+
|
||||
(c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com)
|
||||
|
||||
S-SMP emulator code used in 1.54+
|
||||
(c) Copyright 2016 byuu
|
||||
|
||||
SH assembler code partly based on x86 assembler code
|
||||
(c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se)
|
||||
|
||||
2xSaI filter
|
||||
(c) Copyright 1999 - 2001 Derek Liauw Kie Fa
|
||||
|
||||
HQ2x, HQ3x, HQ4x filters
|
||||
(c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com)
|
||||
|
||||
NTSC filter
|
||||
(c) Copyright 2006 - 2007 Shay Green
|
||||
|
||||
GTK+ GUI code
|
||||
(c) Copyright 2004 - 2016 BearOso
|
||||
|
||||
Win32 GUI code
|
||||
(c) Copyright 2003 - 2006 blip,
|
||||
funkyass,
|
||||
Matthew Kendora,
|
||||
Nach,
|
||||
nitsuja
|
||||
(c) Copyright 2009 - 2016 OV2
|
||||
|
||||
Mac OS GUI code
|
||||
(c) Copyright 1998 - 2001 John Stiles
|
||||
(c) Copyright 2001 - 2011 zones
|
||||
|
||||
Libretro port
|
||||
(c) Copyright 2011 - 2016 Hans-Kristian Arntzen,
|
||||
Daniel De Matteis
|
||||
(Under no circumstances will commercial rights be given)
|
||||
|
||||
MSU-1 code
|
||||
(c) Copyright 2016 qwertymodo
|
||||
|
||||
|
||||
Specific ports contains the works of other authors. See headers in
|
||||
individual files.
|
||||
|
||||
|
||||
Snes9x homepage: http://www.snes9x.com/
|
||||
|
||||
Permission to use, copy, modify and/or distribute Snes9x in both binary
|
||||
and source form, for non-commercial purposes, is hereby granted without
|
||||
fee, providing that this license information and copyright notice appear
|
||||
with all copies and any derived work.
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event shall the authors be held liable for any damages
|
||||
arising from the use of this software or it's derivatives.
|
||||
|
||||
Snes9x is freeware for PERSONAL USE only. Commercial users should
|
||||
seek permission of the copyright holders first. Commercial use includes,
|
||||
but is not limited to, charging money for Snes9x or software derived from
|
||||
Snes9x, including Snes9x or derivatives in commercial game bundles, and/or
|
||||
using Snes9x as a promotion for your commercial product.
|
||||
|
||||
The copyright holders request that bug fixes and improvements to the code
|
||||
should be forwarded to them so everyone can benefit from the modifications
|
||||
in future versions.
|
||||
|
||||
Super NES and Super Nintendo Entertainment System are trademarks of
|
||||
Nintendo Co., Limited and its subsidiary companies.
|
||||
***********************************************************************************/
|
||||
|
||||
#include "snes9x.h"
|
||||
#include "display.h"
|
||||
#include "msu1.h"
|
||||
#include <fstream>
|
||||
#include <cerrno>
|
||||
|
||||
std::ifstream dataFile, audioFile;
|
||||
uint32 audioLoopPos;
|
||||
uint32 partial_samples;
|
||||
|
||||
// Sample buffer
|
||||
int16 *bufPos, *bufBegin, *bufEnd;
|
||||
|
||||
bool AudioOpen()
|
||||
{
|
||||
MSU1.MSU1_STATUS |= AudioError;
|
||||
|
||||
if (audioFile.is_open())
|
||||
audioFile.close();
|
||||
|
||||
char ext[_MAX_EXT];
|
||||
snprintf(ext, _MAX_EXT, "-%d.pcm", MSU1.MSU1_CURRENT_TRACK);
|
||||
|
||||
audioFile.clear();
|
||||
audioFile.open(S9xGetFilename(ext, ROMFILENAME_DIR), std::ios::in | std::ios::binary);
|
||||
if (audioFile.good())
|
||||
{
|
||||
if (audioFile.get() != 'M')
|
||||
return false;
|
||||
if (audioFile.get() != 'S')
|
||||
return false;
|
||||
if (audioFile.get() != 'U')
|
||||
return false;
|
||||
if (audioFile.get() != '1')
|
||||
return false;
|
||||
|
||||
audioFile.read((char *)&audioLoopPos, 4);
|
||||
audioLoopPos <<= 2;
|
||||
audioLoopPos += 8;
|
||||
}
|
||||
|
||||
MSU1.MSU1_STATUS &= ~AudioError;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DataOpen()
|
||||
{
|
||||
if (dataFile.is_open())
|
||||
dataFile.close();
|
||||
|
||||
dataFile.clear();
|
||||
dataFile.open(S9xGetFilename(".msu", ROMFILENAME_DIR), std::ios::in | std::ios::binary);
|
||||
return dataFile.is_open();
|
||||
}
|
||||
|
||||
void S9xMSU1Init(void)
|
||||
{
|
||||
MSU1.MSU1_STATUS = 0;
|
||||
MSU1.MSU1_DATA_SEEK = 0;
|
||||
MSU1.MSU1_DATA_POS = 0;
|
||||
MSU1.MSU1_TRACK_SEEK = 0;
|
||||
MSU1.MSU1_CURRENT_TRACK = 0;
|
||||
MSU1.MSU1_RESUME_TRACK = 0;
|
||||
MSU1.MSU1_VOLUME = 0;
|
||||
MSU1.MSU1_CONTROL = 0;
|
||||
MSU1.MSU1_AUDIO_POS = 0;
|
||||
MSU1.MSU1_RESUME_POS = 0;
|
||||
|
||||
|
||||
bufPos = 0;
|
||||
bufBegin = 0;
|
||||
bufEnd = 0;
|
||||
|
||||
partial_samples = 0;
|
||||
|
||||
if (dataFile.is_open())
|
||||
dataFile.close();
|
||||
|
||||
if (audioFile.is_open())
|
||||
audioFile.close();
|
||||
|
||||
DataOpen();
|
||||
}
|
||||
|
||||
void S9xMSU1Generate(int sample_count)
|
||||
{
|
||||
partial_samples += 441000 * sample_count;
|
||||
|
||||
while (((uintptr_t)bufPos < (uintptr_t)bufEnd) && (MSU1.MSU1_STATUS & AudioPlaying) && partial_samples > 320405)
|
||||
{
|
||||
if (audioFile.is_open())
|
||||
{
|
||||
int16 sample;
|
||||
if (audioFile.read((char *)&sample, 2).good())
|
||||
{
|
||||
sample = (int16)((double)sample * (double)MSU1.MSU1_VOLUME / 255.0);
|
||||
|
||||
*(bufPos++) = sample;
|
||||
MSU1.MSU1_AUDIO_POS += 2;
|
||||
partial_samples -= 320405;
|
||||
}
|
||||
else
|
||||
if (audioFile.eof())
|
||||
{
|
||||
sample = (int16)((double)sample * (double)MSU1.MSU1_VOLUME / 255.0);
|
||||
|
||||
*(bufPos++) = sample;
|
||||
MSU1.MSU1_AUDIO_POS += 2;
|
||||
partial_samples -= 320405;
|
||||
|
||||
if (MSU1.MSU1_STATUS & AudioRepeating)
|
||||
{
|
||||
audioFile.clear();
|
||||
MSU1.MSU1_AUDIO_POS = audioLoopPos;
|
||||
audioFile.seekg(MSU1.MSU1_AUDIO_POS);
|
||||
}
|
||||
else
|
||||
{
|
||||
MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating);
|
||||
audioFile.clear();
|
||||
audioFile.seekg(8);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint8 S9xMSU1ReadPort(int port)
|
||||
{
|
||||
switch (port)
|
||||
{
|
||||
case 0:
|
||||
return MSU1.MSU1_STATUS;
|
||||
case 1:
|
||||
if (MSU1.MSU1_STATUS & DataBusy)
|
||||
return 0;
|
||||
if (dataFile.fail() || dataFile.bad() || dataFile.eof())
|
||||
return 0;
|
||||
MSU1.MSU1_DATA_POS++;
|
||||
return dataFile.get();
|
||||
case 2:
|
||||
return 'S';
|
||||
case 3:
|
||||
return '-';
|
||||
case 4:
|
||||
return 'M';
|
||||
case 5:
|
||||
return 'S';
|
||||
case 6:
|
||||
return 'U';
|
||||
case 7:
|
||||
return '1';
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void S9xMSU1WritePort(int port, uint8 byte)
|
||||
{
|
||||
switch (port)
|
||||
{
|
||||
case 0:
|
||||
((uint8 *)(&MSU1.MSU1_DATA_SEEK))[0] = byte;
|
||||
break;
|
||||
case 1:
|
||||
((uint8 *)(&MSU1.MSU1_DATA_SEEK))[1] = byte;
|
||||
break;
|
||||
case 2:
|
||||
((uint8 *)(&MSU1.MSU1_DATA_SEEK))[2] = byte;
|
||||
break;
|
||||
case 3:
|
||||
((uint8 *)(&MSU1.MSU1_DATA_SEEK))[3] = byte;
|
||||
MSU1.MSU1_DATA_POS = MSU1.MSU1_DATA_SEEK;
|
||||
if(dataFile.good())
|
||||
dataFile.seekg(MSU1.MSU1_DATA_POS);
|
||||
break;
|
||||
case 4:
|
||||
((uint8 *)(&MSU1.MSU1_TRACK_SEEK))[0] = byte;
|
||||
break;
|
||||
case 5:
|
||||
((uint8 *)(&MSU1.MSU1_TRACK_SEEK))[1] = byte;
|
||||
MSU1.MSU1_CURRENT_TRACK = MSU1.MSU1_TRACK_SEEK;
|
||||
|
||||
MSU1.MSU1_STATUS &= ~AudioPlaying;
|
||||
MSU1.MSU1_STATUS &= ~AudioRepeating;
|
||||
|
||||
if (AudioOpen())
|
||||
{
|
||||
if (MSU1.MSU1_CURRENT_TRACK == MSU1.MSU1_RESUME_TRACK)
|
||||
{
|
||||
MSU1.MSU1_AUDIO_POS = MSU1.MSU1_RESUME_POS;
|
||||
MSU1.MSU1_RESUME_POS = 0;
|
||||
MSU1.MSU1_RESUME_TRACK = ~0;
|
||||
}
|
||||
else
|
||||
{
|
||||
MSU1.MSU1_AUDIO_POS = 8;
|
||||
}
|
||||
|
||||
audioFile.seekg(MSU1.MSU1_AUDIO_POS);
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
MSU1.MSU1_VOLUME = byte;
|
||||
break;
|
||||
case 7:
|
||||
if (MSU1.MSU1_STATUS & (AudioBusy | AudioError))
|
||||
break;
|
||||
|
||||
MSU1.MSU1_STATUS = (MSU1.MSU1_STATUS & ~0x30) | ((byte & 0x03) << 4);
|
||||
|
||||
if ((byte & (Play | Resume)) == Resume)
|
||||
{
|
||||
MSU1.MSU1_RESUME_TRACK = MSU1.MSU1_CURRENT_TRACK;
|
||||
MSU1.MSU1_RESUME_POS = MSU1.MSU1_AUDIO_POS;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint16 S9xMSU1Samples(void)
|
||||
{
|
||||
return bufPos - bufBegin;
|
||||
}
|
||||
|
||||
void S9xMSU1SetOutput(int16 * out, int size)
|
||||
{
|
||||
bufPos = bufBegin = out;
|
||||
bufEnd = out + size;
|
||||
}
|
||||
|
||||
void S9xMSU1PostLoadState(void)
|
||||
{
|
||||
if (DataOpen())
|
||||
{
|
||||
dataFile.seekg(MSU1.MSU1_DATA_POS);
|
||||
}
|
||||
|
||||
if (MSU1.MSU1_STATUS & AudioPlaying)
|
||||
{
|
||||
if (AudioOpen())
|
||||
{
|
||||
audioFile.seekg(4);
|
||||
audioFile.read((char *)&audioLoopPos, 4);
|
||||
audioLoopPos <<= 2;
|
||||
audioLoopPos += 8;
|
||||
|
||||
audioFile.seekg(MSU1.MSU1_AUDIO_POS);
|
||||
}
|
||||
else
|
||||
{
|
||||
MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating);
|
||||
MSU1.MSU1_STATUS |= AudioError;
|
||||
}
|
||||
}
|
||||
|
||||
bufPos = 0;
|
||||
bufBegin = 0;
|
||||
bufEnd = 0;
|
||||
|
||||
partial_samples = 0;
|
||||
}
|
|
@ -0,0 +1,237 @@
|
|||
/***********************************************************************************
|
||||
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
|
||||
|
||||
(c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com),
|
||||
Jerremy Koot (jkoot@snes9x.com)
|
||||
|
||||
(c) Copyright 2002 - 2004 Matthew Kendora
|
||||
|
||||
(c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org)
|
||||
|
||||
(c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/)
|
||||
|
||||
(c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net)
|
||||
|
||||
(c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca),
|
||||
Kris Bleakley (codeviolation@hotmail.com)
|
||||
|
||||
(c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net),
|
||||
Nach (n-a-c-h@users.sourceforge.net),
|
||||
|
||||
(c) Copyright 2002 - 2011 zones (kasumitokoduck@yahoo.com)
|
||||
|
||||
(c) Copyright 2006 - 2007 nitsuja
|
||||
|
||||
(c) Copyright 2009 - 2016 BearOso,
|
||||
OV2
|
||||
|
||||
(c) Copyright 2011 - 2016 Hans-Kristian Arntzen,
|
||||
Daniel De Matteis
|
||||
(Under no circumstances will commercial rights be given)
|
||||
|
||||
|
||||
BS-X C emulator code
|
||||
(c) Copyright 2005 - 2006 Dreamer Nom,
|
||||
zones
|
||||
|
||||
C4 x86 assembler and some C emulation code
|
||||
(c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com),
|
||||
Nach,
|
||||
zsKnight (zsknight@zsnes.com)
|
||||
|
||||
C4 C++ code
|
||||
(c) Copyright 2003 - 2006 Brad Jorsch,
|
||||
Nach
|
||||
|
||||
DSP-1 emulator code
|
||||
(c) Copyright 1998 - 2006 _Demo_,
|
||||
Andreas Naive (andreasnaive@gmail.com),
|
||||
Gary Henderson,
|
||||
Ivar (ivar@snes9x.com),
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Matthew Kendora,
|
||||
Nach,
|
||||
neviksti (neviksti@hotmail.com)
|
||||
|
||||
DSP-2 emulator code
|
||||
(c) Copyright 2003 John Weidman,
|
||||
Kris Bleakley,
|
||||
Lord Nightmare (lord_nightmare@users.sourceforge.net),
|
||||
Matthew Kendora,
|
||||
neviksti
|
||||
|
||||
DSP-3 emulator code
|
||||
(c) Copyright 2003 - 2006 John Weidman,
|
||||
Kris Bleakley,
|
||||
Lancer,
|
||||
z80 gaiden
|
||||
|
||||
DSP-4 emulator code
|
||||
(c) Copyright 2004 - 2006 Dreamer Nom,
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Nach,
|
||||
z80 gaiden
|
||||
|
||||
OBC1 emulator code
|
||||
(c) Copyright 2001 - 2004 zsKnight,
|
||||
pagefault (pagefault@zsnes.com),
|
||||
Kris Bleakley
|
||||
Ported from x86 assembler to C by sanmaiwashi
|
||||
|
||||
SPC7110 and RTC C++ emulator code used in 1.39-1.51
|
||||
(c) Copyright 2002 Matthew Kendora with research by
|
||||
zsKnight,
|
||||
John Weidman,
|
||||
Dark Force
|
||||
|
||||
SPC7110 and RTC C++ emulator code used in 1.52+
|
||||
(c) Copyright 2009 byuu,
|
||||
neviksti
|
||||
|
||||
S-DD1 C emulator code
|
||||
(c) Copyright 2003 Brad Jorsch with research by
|
||||
Andreas Naive,
|
||||
John Weidman
|
||||
|
||||
S-RTC C emulator code
|
||||
(c) Copyright 2001 - 2006 byuu,
|
||||
John Weidman
|
||||
|
||||
ST010 C++ emulator code
|
||||
(c) Copyright 2003 Feather,
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Matthew Kendora
|
||||
|
||||
Super FX x86 assembler emulator code
|
||||
(c) Copyright 1998 - 2003 _Demo_,
|
||||
pagefault,
|
||||
zsKnight
|
||||
|
||||
Super FX C emulator code
|
||||
(c) Copyright 1997 - 1999 Ivar,
|
||||
Gary Henderson,
|
||||
John Weidman
|
||||
|
||||
Sound emulator code used in 1.5-1.51
|
||||
(c) Copyright 1998 - 2003 Brad Martin
|
||||
(c) Copyright 1998 - 2006 Charles Bilyue'
|
||||
|
||||
Sound emulator code used in 1.52+
|
||||
(c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com)
|
||||
|
||||
S-SMP emulator code used in 1.54+
|
||||
(c) Copyright 2016 byuu
|
||||
|
||||
SH assembler code partly based on x86 assembler code
|
||||
(c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se)
|
||||
|
||||
2xSaI filter
|
||||
(c) Copyright 1999 - 2001 Derek Liauw Kie Fa
|
||||
|
||||
HQ2x, HQ3x, HQ4x filters
|
||||
(c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com)
|
||||
|
||||
NTSC filter
|
||||
(c) Copyright 2006 - 2007 Shay Green
|
||||
|
||||
GTK+ GUI code
|
||||
(c) Copyright 2004 - 2016 BearOso
|
||||
|
||||
Win32 GUI code
|
||||
(c) Copyright 2003 - 2006 blip,
|
||||
funkyass,
|
||||
Matthew Kendora,
|
||||
Nach,
|
||||
nitsuja
|
||||
(c) Copyright 2009 - 2016 OV2
|
||||
|
||||
Mac OS GUI code
|
||||
(c) Copyright 1998 - 2001 John Stiles
|
||||
(c) Copyright 2001 - 2011 zones
|
||||
|
||||
Libretro port
|
||||
(c) Copyright 2011 - 2016 Hans-Kristian Arntzen,
|
||||
Daniel De Matteis
|
||||
(Under no circumstances will commercial rights be given)
|
||||
|
||||
MSU-1 code
|
||||
(c) Copyright 2016 qwertymodo
|
||||
|
||||
|
||||
Specific ports contains the works of other authors. See headers in
|
||||
individual files.
|
||||
|
||||
|
||||
Snes9x homepage: http://www.snes9x.com/
|
||||
|
||||
Permission to use, copy, modify and/or distribute Snes9x in both binary
|
||||
and source form, for non-commercial purposes, is hereby granted without
|
||||
fee, providing that this license information and copyright notice appear
|
||||
with all copies and any derived work.
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event shall the authors be held liable for any damages
|
||||
arising from the use of this software or it's derivatives.
|
||||
|
||||
Snes9x is freeware for PERSONAL USE only. Commercial users should
|
||||
seek permission of the copyright holders first. Commercial use includes,
|
||||
but is not limited to, charging money for Snes9x or software derived from
|
||||
Snes9x, including Snes9x or derivatives in commercial game bundles, and/or
|
||||
using Snes9x as a promotion for your commercial product.
|
||||
|
||||
The copyright holders request that bug fixes and improvements to the code
|
||||
should be forwarded to them so everyone can benefit from the modifications
|
||||
in future versions.
|
||||
|
||||
Super NES and Super Nintendo Entertainment System are trademarks of
|
||||
Nintendo Co., Limited and its subsidiary companies.
|
||||
***********************************************************************************/
|
||||
|
||||
#ifndef _MSU1_H_
|
||||
#define _MSU1_H_
|
||||
#include "snes9x.h"
|
||||
|
||||
struct SMSU1
|
||||
{
|
||||
uint8 MSU1_STATUS;
|
||||
uint32 MSU1_DATA_SEEK;
|
||||
uint32 MSU1_DATA_POS;
|
||||
uint16 MSU1_TRACK_SEEK;
|
||||
uint16 MSU1_CURRENT_TRACK;
|
||||
uint32 MSU1_RESUME_TRACK;
|
||||
uint8 MSU1_VOLUME;
|
||||
uint8 MSU1_CONTROL;
|
||||
uint32 MSU1_AUDIO_POS;
|
||||
uint32 MSU1_RESUME_POS;
|
||||
};
|
||||
|
||||
enum SMSU1_FLAG {
|
||||
Revision = 0x02, //max: 0x07
|
||||
AudioResume = 0x04,
|
||||
AudioError = 0x08,
|
||||
AudioPlaying = 0x10,
|
||||
AudioRepeating = 0x20,
|
||||
AudioBusy = 0x40,
|
||||
DataBusy = 0x80
|
||||
};
|
||||
|
||||
enum SMSU1_CMD {
|
||||
Play = 0x01,
|
||||
Repeat = 0x02,
|
||||
Resume = 0x04
|
||||
};
|
||||
|
||||
extern struct SMSU1 MSU1;
|
||||
|
||||
void S9xMSU1Init(void);
|
||||
void S9xMSU1Generate(int sample_count);
|
||||
uint8 S9xMSU1ReadPort(int port);
|
||||
void S9xMSU1WritePort(int port, uint8 byte);
|
||||
uint16 S9xMSU1Samples(void);
|
||||
void S9xMSU1SetOutput(int16 *out, int size);
|
||||
void S9xMSU1PostLoadState(void);
|
||||
|
||||
#endif
|
2
port.h
2
port.h
|
@ -325,7 +325,7 @@ void SetInfoDlgColor(unsigned char, unsigned char, unsigned char);
|
|||
#endif // __WIN32_LIBSNES__
|
||||
#endif // __WIN32__
|
||||
|
||||
#ifdef __DJGPP
|
||||
#if defined(__DJGPP) || defined(__WIN32__)
|
||||
#define SLASH_STR "\\"
|
||||
#define SLASH_CHAR '\\'
|
||||
#else
|
||||
|
|
7
ppu.cpp
7
ppu.cpp
|
@ -344,6 +344,9 @@ void S9xSetPPU (uint8 Byte, uint16 Address)
|
|||
S9xTraceFormattedMessage("--- HDMA PPU %04X -> %02X", Address, Byte);
|
||||
#endif
|
||||
|
||||
if (Settings.MSU1 && (Address & 0xfff8) == 0x2000) // MSU-1
|
||||
S9xMSU1WritePort(Address & 7, Byte);
|
||||
else
|
||||
if ((Address & 0xffc0) == 0x2140) // APUIO0, APUIO1, APUIO2, APUIO3
|
||||
// write_port will run the APU until given clock before writing value
|
||||
S9xAPUWritePort(Address & 3, Byte);
|
||||
|
@ -1095,7 +1098,9 @@ void S9xSetPPU (uint8 Byte, uint16 Address)
|
|||
uint8 S9xGetPPU (uint16 Address)
|
||||
{
|
||||
// MAP_PPU: $2000-$3FFF
|
||||
|
||||
if (Settings.MSU1 && (Address & 0xfff8) == 0x2000)
|
||||
return (S9xMSU1ReadPort(Address & 7));
|
||||
else
|
||||
if (Address < 0x2100)
|
||||
return (OpenBus);
|
||||
|
||||
|
|
31
snapshot.cpp
31
snapshot.cpp
|
@ -1135,6 +1135,23 @@ static FreezeData SnapBSX[] =
|
|||
ARRAY_ENTRY(6, test2192, 32, uint8_ARRAY_V)
|
||||
};
|
||||
|
||||
#undef STRUCT
|
||||
#define STRUCT struct SMSU1
|
||||
|
||||
static FreezeData SnapMSU1[] =
|
||||
{
|
||||
INT_ENTRY(9, MSU1_STATUS),
|
||||
INT_ENTRY(9, MSU1_DATA_SEEK),
|
||||
INT_ENTRY(9, MSU1_DATA_POS),
|
||||
INT_ENTRY(9, MSU1_TRACK_SEEK),
|
||||
INT_ENTRY(9, MSU1_CURRENT_TRACK),
|
||||
INT_ENTRY(9, MSU1_RESUME_TRACK),
|
||||
INT_ENTRY(9, MSU1_VOLUME),
|
||||
INT_ENTRY(9, MSU1_CONTROL),
|
||||
INT_ENTRY(9, MSU1_AUDIO_POS),
|
||||
INT_ENTRY(9, MSU1_RESUME_POS)
|
||||
};
|
||||
|
||||
#undef STRUCT
|
||||
#define STRUCT struct SnapshotScreenshotInfo
|
||||
|
||||
|
@ -1392,6 +1409,9 @@ void S9xFreezeToStream (STREAM stream)
|
|||
if (Settings.BS)
|
||||
FreezeStruct(stream, "BSX", &BSX, SnapBSX, COUNT(SnapBSX));
|
||||
|
||||
if (Settings.MSU1)
|
||||
FreezeStruct(stream, "MSU", &MSU1, SnapMSU1, COUNT(SnapMSU1));
|
||||
|
||||
if (Settings.SnapshotScreenshots)
|
||||
{
|
||||
SnapshotScreenshotInfo *ssi = new SnapshotScreenshotInfo;
|
||||
|
@ -1490,6 +1510,7 @@ int S9xUnfreezeFromStream (STREAM stream)
|
|||
uint8 *local_srtc = NULL;
|
||||
uint8 *local_rtc_data = NULL;
|
||||
uint8 *local_bsx_data = NULL;
|
||||
uint8 *local_msu1_data = NULL;
|
||||
uint8 *local_screenshot = NULL;
|
||||
uint8 *local_movie_data = NULL;
|
||||
|
||||
|
@ -1595,6 +1616,10 @@ int S9xUnfreezeFromStream (STREAM stream)
|
|||
if (result != SUCCESS && Settings.BS)
|
||||
break;
|
||||
|
||||
result = UnfreezeStructCopy(stream, "MSU", &local_msu1_data, SnapMSU1, COUNT(SnapMSU1), version);
|
||||
if (result != SUCCESS && Settings.MSU1)
|
||||
break;
|
||||
|
||||
result = UnfreezeStructCopy(stream, "SHO", &local_screenshot, SnapScreenshot, COUNT(SnapScreenshot), version);
|
||||
|
||||
SnapshotMovieInfo mi;
|
||||
|
@ -1711,6 +1736,9 @@ int S9xUnfreezeFromStream (STREAM stream)
|
|||
if (local_bsx_data)
|
||||
UnfreezeStructFromCopy(&BSX, SnapBSX, COUNT(SnapBSX), local_bsx_data, version);
|
||||
|
||||
if (local_msu1_data)
|
||||
UnfreezeStructFromCopy(&MSU1, SnapMSU1, COUNT(SnapMSU1), local_msu1_data, version);
|
||||
|
||||
if (version < SNAPSHOT_VERSION_IRQ)
|
||||
{
|
||||
printf("Converting old snapshot version %d to %d\n...", version, SNAPSHOT_VERSION);
|
||||
|
@ -1792,6 +1820,9 @@ int S9xUnfreezeFromStream (STREAM stream)
|
|||
if (local_bsx_data)
|
||||
S9xBSXPostLoadState();
|
||||
|
||||
if (local_msu1_data)
|
||||
S9xMSU1PostLoadState();
|
||||
|
||||
if (local_movie_data)
|
||||
{
|
||||
// restore last displayed pad_read status
|
||||
|
|
|
@ -196,7 +196,7 @@
|
|||
#define SNAPSHOT_MAGIC "#!s9xsnp"
|
||||
#define SNAPSHOT_VERSION_IRQ 7
|
||||
#define SNAPSHOT_VERSION_BAPU 8
|
||||
#define SNAPSHOT_VERSION 8
|
||||
#define SNAPSHOT_VERSION 9
|
||||
|
||||
#define SUCCESS 1
|
||||
#define WRONG_FORMAT (-1)
|
||||
|
|
1
snes9x.h
1
snes9x.h
|
@ -377,6 +377,7 @@ struct SSettings
|
|||
bool8 BS;
|
||||
bool8 BSXItself;
|
||||
bool8 BSXBootup;
|
||||
bool8 MSU1;
|
||||
bool8 MouseMaster;
|
||||
bool8 SuperScopeMaster;
|
||||
bool8 JustifierMaster;
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
OS = `uname -s -r -m|sed \"s/ /-/g\"|tr \"[A-Z]\" \"[a-z]\"|tr \"/()\" \"___\"`
|
||||
BUILDDIR = .
|
||||
|
||||
OBJECTS = ../apu/apu.o ../apu/bapu/dsp/sdsp.o ../apu/bapu/dsp/SPC_DSP.o ../apu/bapu/smp/smp.o ../apu/bapu/smp/smp_state.o ../bsx.o ../c4.o ../c4emu.o ../cheats.o ../cheats2.o ../clip.o ../conffile.o ../controls.o ../cpu.o ../cpuexec.o ../cpuops.o ../crosshairs.o ../dma.o ../dsp.o ../dsp1.o ../dsp2.o ../dsp3.o ../dsp4.o ../fxinst.o ../fxemu.o ../gfx.o ../globals.o ../logger.o ../memmap.o ../movie.o ../obc1.o ../ppu.o ../stream.o ../sa1.o ../sa1cpu.o ../screenshot.o ../sdd1.o ../sdd1emu.o ../seta.o ../seta010.o ../seta011.o ../seta018.o ../snapshot.o ../snes9x.o ../spc7110.o ../srtc.o ../tile.o ../filter/2xsai.o ../filter/blit.o ../filter/epx.o ../filter/hq2x.o ../filter/snes_ntsc.o ../statemanager.o unix.o x11.o
|
||||
OBJECTS = ../apu/apu.o ../apu/bapu/dsp/sdsp.o ../apu/bapu/dsp/SPC_DSP.o ../apu/bapu/smp/smp.o ../apu/bapu/smp/smp_state.o ../bsx.o ../c4.o ../c4emu.o ../cheats.o ../cheats2.o ../clip.o ../conffile.o ../controls.o ../cpu.o ../cpuexec.o ../cpuops.o ../crosshairs.o ../dma.o ../dsp.o ../dsp1.o ../dsp2.o ../dsp3.o ../dsp4.o ../fxinst.o ../fxemu.o ../gfx.o ../globals.o ../logger.o ../memmap.o ../msu1.o ../movie.o ../obc1.o ../ppu.o ../stream.o ../sa1.o ../sa1cpu.o ../screenshot.o ../sdd1.o ../sdd1emu.o ../seta.o ../seta010.o ../seta011.o ../seta018.o ../snapshot.o ../snes9x.o ../spc7110.o ../srtc.o ../tile.o ../filter/2xsai.o ../filter/blit.o ../filter/epx.o ../filter/hq2x.o ../filter/snes_ntsc.o ../statemanager.o unix.o x11.o
|
||||
DEFS = -DMITSHM
|
||||
|
||||
ifdef S9XDEBUGGER
|
||||
|
|
|
@ -383,7 +383,7 @@ bool CD3DCG::LoadShader(const TCHAR *shaderFile)
|
|||
hr = pDevice->CreateVertexBuffer(sizeof(VERTEX)*4,D3DUSAGE_WRITEONLY,0,D3DPOOL_MANAGED,&pass.vertexBuffer,NULL);
|
||||
if(FAILED(hr)) {
|
||||
pass.vertexBuffer = NULL;
|
||||
DXTRACE_ERR_MSGBOX(TEXT("Error creating vertex buffer"), hr);
|
||||
DXTRACE_ERR_MSGBOX(TEXT(L"Error creating vertex buffer"), hr);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -449,7 +449,7 @@ void CD3DCG::ensureTextureSize(LPDIRECT3DTEXTURE9 &tex, D3DXVECTOR2 &texSize,
|
|||
texSize = wantedSize;
|
||||
|
||||
if(FAILED(hr)) {
|
||||
DXTRACE_ERR_MSGBOX(TEXT("Error while creating texture"), hr);
|
||||
DXTRACE_ERR_MSGBOX(TEXT(L"Error while creating texture"), hr);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -860,7 +860,7 @@ void CD3DCG::setupVertexDeclaration(shaderPass &pass)
|
|||
LPDIRECT3DVERTEXDECLARATION9 vertexDeclaration;
|
||||
HRESULT hr = pDevice->CreateVertexDeclaration(vElems,&vertexDeclaration);
|
||||
if(FAILED(hr)) {
|
||||
DXTRACE_ERR_MSGBOX(TEXT("Error creating vertex declaration"), hr);
|
||||
DXTRACE_ERR_MSGBOX(TEXT(L"Error creating vertex declaration"), hr);
|
||||
}
|
||||
if(pass.vertexDeclaration)
|
||||
pass.vertexDeclaration->Release();
|
||||
|
|
|
@ -272,7 +272,7 @@ bool CDirect3D::Initialize(HWND hWnd)
|
|||
|
||||
pD3D = Direct3DCreate9(D3D_SDK_VERSION);
|
||||
if(pD3D == NULL) {
|
||||
DXTRACE_ERR_MSGBOX(TEXT("Error creating initial D3D9 object"), 0);
|
||||
DXTRACE_ERR_MSGBOX(TEXT(L"Error creating initial D3D9 object"), 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -290,19 +290,19 @@ bool CDirect3D::Initialize(HWND hWnd)
|
|||
&dPresentParams,
|
||||
&pDevice);
|
||||
if(FAILED(hr)) {
|
||||
DXTRACE_ERR_MSGBOX(TEXT("Error creating D3D9 device"), hr);
|
||||
DXTRACE_ERR_MSGBOX(TEXT(L"Error creating D3D9 device"), hr);
|
||||
return false;
|
||||
}
|
||||
|
||||
hr = pDevice->CreateVertexBuffer(sizeof(vertexStream),D3DUSAGE_WRITEONLY,0,D3DPOOL_MANAGED,&vertexBuffer,NULL);
|
||||
if(FAILED(hr)) {
|
||||
DXTRACE_ERR_MSGBOX(TEXT("Error creating vertex buffer"), hr);
|
||||
DXTRACE_ERR_MSGBOX(TEXT(L"Error creating vertex buffer"), hr);
|
||||
return false;
|
||||
}
|
||||
|
||||
hr = pDevice->CreateVertexDeclaration(vertexElems,&vertexDeclaration);
|
||||
if(FAILED(hr)) {
|
||||
DXTRACE_ERR_MSGBOX(TEXT("Error creating vertex declaration"), hr);
|
||||
DXTRACE_ERR_MSGBOX(TEXT(L"Error creating vertex declaration"), hr);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -312,7 +312,7 @@ bool CDirect3D::Initialize(HWND hWnd)
|
|||
cgContext = cgCreateContext();
|
||||
hr = cgD3D9SetDevice(pDevice);
|
||||
if(FAILED(hr)) {
|
||||
DXTRACE_ERR_MSGBOX(TEXT("Error setting cg device"), hr);
|
||||
DXTRACE_ERR_MSGBOX(TEXT(L"Error setting cg device"), hr);
|
||||
}
|
||||
cgShader = new CD3DCG(cgContext,pDevice);
|
||||
}
|
||||
|
@ -650,14 +650,14 @@ void CDirect3D::Render(SSurface Src)
|
|||
ResetDevice();
|
||||
return;
|
||||
default:
|
||||
DXTRACE_ERR_MSGBOX( TEXT("Internal driver error"), hr);
|
||||
DXTRACE_ERR_MSGBOX( TEXT(L"Internal driver error"), hr);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//BlankTexture(drawSurface);
|
||||
if(FAILED(hr = drawSurface->LockRect(0, &lr, NULL, 0))) {
|
||||
DXTRACE_ERR_MSGBOX( TEXT("Unable to lock texture"), hr);
|
||||
DXTRACE_ERR_MSGBOX( TEXT(L"Unable to lock texture"), hr);
|
||||
return;
|
||||
} else {
|
||||
Dst.Surface = (unsigned char *)lr.pBits;
|
||||
|
@ -757,7 +757,7 @@ void CDirect3D::CreateDrawSurface()
|
|||
NULL );
|
||||
|
||||
if(FAILED(hr)) {
|
||||
DXTRACE_ERR_MSGBOX(TEXT("Error while creating texture"), hr);
|
||||
DXTRACE_ERR_MSGBOX(TEXT(L"Error while creating texture"), hr);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -787,7 +787,7 @@ bool CDirect3D::BlankTexture(LPDIRECT3DTEXTURE9 texture)
|
|||
HRESULT hr;
|
||||
|
||||
if(FAILED(hr = texture->LockRect(0, &lr, NULL, 0))) {
|
||||
DXTRACE_ERR_MSGBOX( TEXT("Unable to lock texture"), hr);
|
||||
DXTRACE_ERR_MSGBOX( TEXT(L"Unable to lock texture"), hr);
|
||||
return false;
|
||||
} else {
|
||||
memset(lr.pBits, 0, lr.Pitch * quadTextureSize);
|
||||
|
@ -938,7 +938,7 @@ bool CDirect3D::ResetDevice()
|
|||
}
|
||||
|
||||
if(FAILED(hr = pDevice->Reset(&dPresentParams))) {
|
||||
DXTRACE_ERR(TEXT("Unable to reset device"), hr);
|
||||
DXTRACE_ERR(TEXT(L"Unable to reset device"), hr);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -234,7 +234,7 @@ bool CXAudio2::InitXAudio2(void)
|
|||
|
||||
HRESULT hr;
|
||||
if ( FAILED(hr = XAudio2Create( &pXAudio2, 0 , XAUDIO2_DEFAULT_PROCESSOR ) ) ) {
|
||||
DXTRACE_ERR_MSGBOX(TEXT("Unable to create XAudio2 object."),hr);
|
||||
DXTRACE_ERR_MSGBOX(TEXT(L"Unable to create XAudio2 object."),hr);
|
||||
MessageBox (GUI.hWnd, TEXT("\
|
||||
Unable to initialize XAudio2. You will not be able to hear any\n\
|
||||
sound effects or music while playing.\n\n\
|
||||
|
@ -257,7 +257,7 @@ bool CXAudio2::InitVoices(void)
|
|||
HRESULT hr;
|
||||
if ( FAILED(hr = pXAudio2->CreateMasteringVoice( &pMasterVoice, (Settings.Stereo?2:1),
|
||||
Settings.SoundPlaybackRate, 0, 0 , NULL ) ) ) {
|
||||
DXTRACE_ERR_MSGBOX(TEXT("Unable to create mastering voice."),hr);
|
||||
DXTRACE_ERR_MSGBOX(TEXT(L"Unable to create mastering voice."),hr);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -272,7 +272,7 @@ bool CXAudio2::InitVoices(void)
|
|||
|
||||
if( FAILED(hr = pXAudio2->CreateSourceVoice(&pSourceVoice, (WAVEFORMATEX*)&wfx,
|
||||
XAUDIO2_VOICE_NOSRC , XAUDIO2_DEFAULT_FREQ_RATIO, this, NULL, NULL ) ) ) {
|
||||
DXTRACE_ERR_MSGBOX(TEXT("Unable to create source voice."),hr);
|
||||
DXTRACE_ERR_MSGBOX(TEXT(L"Unable to create source voice."),hr);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -677,6 +677,7 @@
|
|||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
||||
</CustomBuild>
|
||||
<ClInclude Include="..\msu1.h" />
|
||||
<ClInclude Include="..\statemanager.h" />
|
||||
<CustomBuild Include="..\stream.h" />
|
||||
<CustomBuild Include="..\tile.h" />
|
||||
|
@ -777,6 +778,7 @@
|
|||
<ClCompile Include="..\logger.cpp" />
|
||||
<ClCompile Include="..\memmap.cpp" />
|
||||
<ClCompile Include="..\movie.cpp" />
|
||||
<ClCompile Include="..\msu1.cpp" />
|
||||
<ClCompile Include="..\netplay.cpp" />
|
||||
<ClCompile Include="..\obc1.cpp" />
|
||||
<ClCompile Include="..\ppu.cpp" />
|
||||
|
|
|
@ -243,6 +243,9 @@
|
|||
<ClInclude Include="dxerr.h">
|
||||
<Filter>GUI</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\msu1.h">
|
||||
<Filter>Emu</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\bsx.cpp">
|
||||
|
@ -539,6 +542,9 @@
|
|||
<ClCompile Include="dxerr.cpp">
|
||||
<Filter>GUI</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\msu1.cpp">
|
||||
<Filter>Emu</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="rsrc\nodrop.cur">
|
||||
|
|
Loading…
Reference in New Issue