Files
2015-08-10 18:39:34 +02:00

1871 lines
66 KiB
Diff

Only in bsneshle094/ananke/obj: .gitignore
Only in bsneshle094: changes.diff
Only in bsneshle094: changes-libretro.diff
Only in bsneshle094: diff.sh
Only in bsneshle094: e.log
diff -ru higan_v094-source/emulator/emulator.hpp bsneshle094/emulator/emulator.hpp
--- higan_v094-source/emulator/emulator.hpp 2014-01-20 07:36:22.000000000 +0100
+++ bsneshle094/emulator/emulator.hpp 2014-04-26 16:20:16.498065832 +0200
@@ -143,7 +143,7 @@
typedef uint30_t uint30;
typedef uint31_t uint31;
typedef uint32_t uint32;
-typedef uint_t<33> uint33;
+typedef nall::uint_t<33> uint33;
typedef uint64_t uint64;
typedef varuint_t<unsigned> varuint;
diff -ru higan_v094-source/emulator/interface.hpp bsneshle094/emulator/interface.hpp
--- higan_v094-source/emulator/interface.hpp 2013-12-23 08:39:57.000000000 +0100
+++ bsneshle094/emulator/interface.hpp 2014-08-19 14:54:43.757727345 +0200
@@ -59,6 +59,7 @@
virtual string path(unsigned) { return ""; }
virtual string server() { return ""; }
virtual void notify(string text) { print(text, "\n"); }
+ virtual unsigned altImplementation(unsigned) { return 0; }
};
Bind* bind = nullptr;
Only in bsneshle094: .git
Only in bsneshle094: install.sh
Only in higan_v094-source: libco
Only in bsneshle094: libretro-sdk
Only in bsneshle094: LICENSE
diff -ru higan_v094-source/Makefile bsneshle094/Makefile
--- higan_v094-source/Makefile 2013-10-20 14:39:14.000000000 +0200
+++ bsneshle094/Makefile 2015-06-25 17:48:26.523991971 +0200
@@ -1,20 +1,40 @@
include nall/Makefile
+ifeq ($(platform),win)
+ override platform = windows
+else ifeq ($(platform),mingw)
+ override platform = windows
+else ifeq ($(platform),osx)
+ override platform = macosx
+else ifeq ($(platform),unix)
+ override platform = linux
+else ifeq ($(platform),x)
+ override platform = linux
+endif
+
fc := fc
sfc := sfc
gb := gb
gba := gba
profile := accuracy
-target := ethos
+target := libretro
# options += debugger
# arch := x86
# console := true
# compiler
-flags += -I. -O3 -fomit-frame-pointer
-link +=
+
+ifneq ($(debug),)
+ flags := -I. -O0 -g
+else
+ flags := -I. -O3 -fomit-frame-pointer
+endif
+
+cflags := -std=gnu99 -xc
+cppflags := -std=gnu++0x
+
objects := libco
# profile-guided optimization mode
@@ -28,34 +48,64 @@
flags += -fprofile-use
endif
-# platform
-ifeq ($(platform),windows)
- ifeq ($(arch),x86)
- flags += -m32
- link += -m32
- endif
- ifeq ($(console),true)
- link += -mconsole
+ifeq ($(compiler),)
+ ifneq ($(CXX),)
+ compiler := $(CXX)
else
- link += -mwindows
+ compiler := g++
endif
- link += -s -mthreads -luuid -lkernel32 -luser32 -lgdi32 -lcomctl32 -lcomdlg32 -lshell32 -lole32 -lws2_32
- link += -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
-else ifeq ($(platform),macosx)
- flags += -march=native
-else ifeq ($(platform),linux)
- flags += -march=native
- link += -s -Wl,-export-dynamic -lX11 -lXext -ldl
-else ifeq ($(platform),bsd)
- flags += -march=native
- link += -s -Wl,-export-dynamic -lX11 -lXext
-else
- $(error unsupported platform.)
endif
+# platform
ui := target-$(target)
+ifeq ($(findstring libretro,$(ui)),)
+ ifeq ($(platform),windows)
+ ifeq ($(arch),x86)
+ flags += -m32
+ link += -m32
+ endif
+ ifeq ($(console),true)
+ link += -mconsole
+ else
+ link += -mwindows
+ endif
+ link += -mthreads -luuid -lkernel32 -luser32 -lgdi32 -lcomctl32 -lcomdlg32 -lshell32 -lole32 -lws2_32
+ link += -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
+ else ifeq ($(platform),macosx)
+ flags += -march=native
+ else ifeq ($(platform),linux)
+ flags += -march=native
+ link += -Wl,-export-dynamic -lX11 -lXext -ldl
+ else ifeq ($(platform),bsd)
+ flags += -march=native
+ link += -Wl,-export-dynamic -lX11 -lXext
+ else
+ $(error unsupported platform.)
+ endif
+endif
+
+ifeq ($(platform),macosx)
+ ifndef ($(NOUNIVERSAL))
+ flags += $(ARCHFLAGS)
+ link += $(ARCHFLAGS)
+ endif
+endif
+
+
# implicit rules
+compile-profile = \
+ $(strip \
+ $(if $(filter %.c,$<), \
+ $(compiler) $(cflags) $(flags) $(profflags) $1 -c $< -o $@, \
+ $(if $(filter %.cpp,$<), \
+ $(compiler) $(cppflags) $(flags) $(profflags) $1 -c $< -o $@ \
+ ) \
+ ) \
+ )
+
+%-$(profile).o: $<; $(call compile-profile)
+
compile = \
$(strip \
$(if $(filter %.c,$<), \
@@ -107,3 +157,9 @@
endif
help:;
+
+#this must be last because other things may have altered $(flags)
+ifneq ($(lto),)
+ flags += -flto
+ link += $(flags)
+endif
Only in bsneshle094: make.sh
diff -ru higan_v094-source/nall/directory.hpp bsneshle094/nall/directory.hpp
--- higan_v094-source/nall/directory.hpp 2014-01-20 07:37:12.000000000 +0100
+++ bsneshle094/nall/directory.hpp 2015-02-21 10:47:18.286028379 +0100
@@ -187,7 +187,7 @@
struct dirent* ep;
dp = opendir(pathname);
if(dp) {
- while(ep = readdir(dp)) {
+ while((ep = readdir(dp))) {
if(!strcmp(ep->d_name, ".")) continue;
if(!strcmp(ep->d_name, "..")) continue;
bool is_directory = ep->d_type & DT_DIR;
@@ -212,7 +212,7 @@
struct dirent* ep;
dp = opendir(pathname);
if(dp) {
- while(ep = readdir(dp)) {
+ while((ep = readdir(dp))) {
if(!strcmp(ep->d_name, ".")) continue;
if(!strcmp(ep->d_name, "..")) continue;
if((ep->d_type & DT_DIR) == 0) {
diff -ru higan_v094-source/nall/dsp/core.hpp bsneshle094/nall/dsp/core.hpp
--- higan_v094-source/nall/dsp/core.hpp 2014-01-20 07:37:12.000000000 +0100
+++ bsneshle094/nall/dsp/core.hpp 2015-02-21 10:47:18.286028379 +0100
@@ -19,6 +19,7 @@
virtual void clear() = 0;
virtual void sample() = 0;
Resampler(DSP& dsp) : dsp(dsp) {}
+ virtual ~Resampler() {}
};
struct DSP {
diff -ru higan_v094-source/nall/dsp/resample/lib/sinc.hpp bsneshle094/nall/dsp/resample/lib/sinc.hpp
--- higan_v094-source/nall/dsp/resample/lib/sinc.hpp 2014-01-20 07:37:12.000000000 +0100
+++ bsneshle094/nall/dsp/resample/lib/sinc.hpp 2015-02-21 10:47:18.286028379 +0100
@@ -11,8 +11,11 @@
#if defined(__SSE__)
#define SINCRESAMPLE_USE_SSE 1
#ifndef __x86_64__
- #undef RESAMPLE_SSEREGPARM
- #define RESAMPLE_SSEREGPARM __attribute__((sseregparm))
+ // clang may not have this extension (Apple's certainly doesn't)
+ #ifndef __clang__
+ #undef RESAMPLE_SSEREGPARM
+ #define RESAMPLE_SSEREGPARM __attribute__((sseregparm))
+ #endif
#endif
#else
// TODO: altivec here
diff -ru higan_v094-source/nall/file.hpp bsneshle094/nall/file.hpp
--- higan_v094-source/nall/file.hpp 2014-01-20 07:37:12.000000000 +0100
+++ bsneshle094/nall/file.hpp 2015-02-21 10:47:18.286028379 +0100
@@ -9,6 +9,10 @@
#include <nall/windows/utf8.hpp>
#include <nall/stream/memory.hpp>
+#ifdef __APPLE__
+#include "TargetConditionals.h"
+#endif
+
namespace nall {
inline FILE* fopen_utf8(const string& filename, const string& mode) {
@@ -191,10 +195,14 @@
uintmax_t req_offset = file_offset;
switch(index_) {
case index::absolute: req_offset = offset; break;
- case index::relative: req_offset += offset; break;
+ case index::relative:
+ if (offset < 0 && -offset > req_offset)
+ req_offset = 0; //cannot seek before start of file
+ else
+ req_offset += offset;
+ break;
}
- if(req_offset < 0) req_offset = 0; //cannot seek before start of file
if(req_offset > file_size) {
if(file_mode == mode::read) { //cannot seek past end of file
req_offset = file_size;
@@ -232,7 +240,10 @@
}
static bool exists(const string& filename) {
- #if !defined(_WIN32)
+ #if defined(__APPLE__) && TARGET_OS_IPHONE
+ struct stat data;
+ if(stat(filename, &data) != 0) return false;
+ #elif !defined(_WIN32)
struct stat data;
if(stat(filename, &data) != 0) return false;
#else
@@ -244,7 +255,10 @@
}
static uintmax_t size(const string& filename) {
- #if !defined(_WIN32)
+ #if defined(__APPLE__) && TARGET_OS_IPHONE
+ struct stat data;
+ if(stat(filename, &data) != 0) return false;
+ #elif !defined(_WIN32)
struct stat data;
stat(filename, &data);
#else
@@ -255,7 +269,10 @@
}
static time_t timestamp(const string& filename, file::time mode = file::time::create) {
- #if !defined(_WIN32)
+ #if defined(__APPLE__) && TARGET_OS_IPHONE
+ struct stat data;
+ if(stat(filename, &data) != 0) return false;
+ #elif !defined(_WIN32)
struct stat data;
stat(filename, &data);
#else
diff -ru higan_v094-source/nall/intrinsics.hpp bsneshle094/nall/intrinsics.hpp
--- higan_v094-source/nall/intrinsics.hpp 2014-01-20 07:37:12.000000000 +0100
+++ bsneshle094/nall/intrinsics.hpp 2014-05-27 22:37:16.697326984 +0200
@@ -6,7 +6,7 @@
struct Intrinsics {
enum class Compiler : unsigned { Clang, GCC, VisualCPP, Unknown };
enum class Platform : unsigned { Windows, MacOSX, X, Unknown }; //X = Linux, BSD, etc
- enum class Architecture : unsigned { x86, amd64, Unknown };
+ enum class Architecture : unsigned { x86, amd64, ARM, Unknown };
enum class Endian : unsigned { LSB, MSB, Unknown };
static inline Compiler compiler();
@@ -57,6 +57,9 @@
#elif defined(__amd64__) || defined(_M_AMD64)
#define ARCH_AMD64
Intrinsics::Architecture Intrinsics::architecture() { return Intrinsics::Architecture::amd64; }
+#elif defined(__arm__) || defined(__ARM_EABI__)
+ #define ARCH_ARM
+ Intrinsics::Architecture Intrinsics::architecture() { return Intrinsics::Architecture::ARM; }
#else
#warning "unable to detect architecture"
#define ARCH_UNKNOWN
@@ -65,7 +68,7 @@
/* Endian detection */
-#if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__) || defined(__i386__) || defined(__amd64__) || defined(_M_IX86) || defined(_M_AMD64)
+#if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__) || defined(__i386__) || defined(__amd64__) || defined(_M_IX86) || defined(_M_AMD64) || defined(__ARM_EABI__) || defined(__arm__)
#define ENDIAN_LSB
Intrinsics::Endian Intrinsics::endian() { return Intrinsics::Endian::LSB; }
#elif (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && __BYTE_ORDER == __BIG_ENDIAN) || defined(__BIG_ENDIAN__) || defined(__powerpc__) || defined(_M_PPC)
diff -ru higan_v094-source/nall/Makefile bsneshle094/nall/Makefile
--- higan_v094-source/nall/Makefile 2014-01-20 07:37:12.000000000 +0100
+++ bsneshle094/nall/Makefile 2015-04-23 17:11:57.475859018 +0200
@@ -6,6 +6,7 @@
[a-z] = a b c d e f g h i j k l m n o p q r s t u v w x y z
[0-9] = 0 1 2 3 4 5 6 7 8 9
[markup] = ` ~ ! @ \# $$ % ^ & * ( ) - _ = + [ { ] } \ | ; : ' " , < . > / ?
+# Some editors need this for proper syntax highlighting: '
[all] = $([A-Z]) $([a-z]) $([0-9]) $([markup])
[space] :=
[space] +=
@@ -15,25 +16,27 @@
uname := $(shell uname -s)
ifeq ($(uname),)
platform := windows
- delete = del $(subst /,\,$1)
else ifneq ($(findstring Windows,$(uname)),)
platform := windows
- delete = del $(subst /,\,$1)
else ifneq ($(findstring CYGWIN,$(uname)),)
platform := windows
- delete = del $(subst /,\,$1)
+ else ifneq ($(findstring MINGW,$(uname)),)
+ platform := windows
else ifneq ($(findstring Darwin,$(uname)),)
platform := macosx
- delete = rm -f $1
else ifneq ($(findstring BSD,$(uname)),)
platform := bsd
- delete = rm -f $1
else
platform := linux
- delete = rm -f $1
endif
endif
+ifeq ($(platform),windows)
+ delete = del /F /Q $(subst /,\,$1)
+else
+ delete = rm -f $1
+endif
+
# compiler detection
ifeq ($(compiler),)
ifeq ($(platform),windows)
diff -ru higan_v094-source/nall/platform.hpp bsneshle094/nall/platform.hpp
--- higan_v094-source/nall/platform.hpp 2014-01-20 07:37:12.000000000 +0100
+++ bsneshle094/nall/platform.hpp 2014-11-14 23:01:04.933698821 +0100
@@ -41,7 +41,11 @@
#undef interface
#define dllexport __declspec(dllexport)
#else
+#ifdef __APPLE__
+ #include <machine/endian.h>
+#else
#include <endian.h>
+#endif
#include <unistd.h>
#include <pwd.h>
#define dllexport
diff -ru higan_v094-source/nall/string/char/convert.hpp bsneshle094/nall/string/char/convert.hpp
--- higan_v094-source/nall/string/char/convert.hpp 2014-01-20 07:37:13.000000000 +0100
+++ bsneshle094/nall/string/char/convert.hpp 2015-02-21 10:47:18.286028379 +0100
@@ -30,6 +30,7 @@
if(quoted == false && *s >= 'A' && *s <= 'Z') *s += 0x20;
s++;
}
+ return s;
}
char* qstrupper(char* s) {
@@ -40,6 +41,7 @@
if(quoted == false && *s >= 'a' && *s <= 'z') *s -= 0x20;
s++;
}
+ return s;
}
char* strtr(char* dest, const char* before, const char* after) {
diff -ru higan_v094-source/nall/string/eval/evaluator.hpp bsneshle094/nall/string/eval/evaluator.hpp
--- higan_v094-source/nall/string/eval/evaluator.hpp 2014-01-20 07:37:13.000000000 +0100
+++ bsneshle094/nall/string/eval/evaluator.hpp 2015-02-21 10:47:18.286028379 +0100
@@ -31,10 +31,9 @@
}
return result.rtrim<1>(", ").append(")");
}
+ default: throw "invalid operator";
}
#undef p
-
- throw "invalid operator";
}
inline int64_t evaluateInteger(Node* node) {
@@ -87,10 +86,9 @@
case Node::Type::AssignBitwiseAnd: return p(0) & p(1);
case Node::Type::AssignBitwiseOr: return p(0) | p(1);
case Node::Type::AssignBitwiseXor: return p(0) ^ p(1);
+ default: throw "invalid operator";
}
#undef p
-
- throw "invalid operator";
}
inline optional<int64_t> integer(const string& expression) {
@@ -132,10 +130,10 @@
case Node::Type::AssignDivide: return p(0) / p(1);
case Node::Type::AssignAdd: return p(0) + p(1);
case Node::Type::AssignSubtract: return p(0) - p(1);
+ default: throw "invalid operator";
}
#undef p
- throw "invalid operator";
}
inline optional<long double> real(const string& expression) {
diff -ru higan_v094-source/nall/string/markup/node.hpp bsneshle094/nall/string/markup/node.hpp
--- higan_v094-source/nall/string/markup/node.hpp 2014-01-20 07:37:13.000000000 +0100
+++ bsneshle094/nall/string/markup/node.hpp 2015-02-21 10:47:18.286028379 +0100
@@ -59,6 +59,7 @@
case Comparator::LE: side = rule.split<1>("<="); break;
case Comparator::GT: side = rule.split<1> (">"); break;
case Comparator::GE: side = rule.split<1>(">="); break;
+ default: break;
}
string data = text();
@@ -75,8 +76,10 @@
case Comparator::LE: if(numeral(data) <= numeral(side(1))) continue; break;
case Comparator::GT: if(numeral(data) > numeral(side(1))) continue; break;
case Comparator::GE: if(numeral(data) >= numeral(side(1))) continue; break;
+ default: break;
}
+ // NOT REACHED
return false;
}
Only in bsneshle094/obj: gb-apu.o
Only in bsneshle094/obj: gb-cartridge.o
Only in bsneshle094/obj: gb-cheat.o
Only in bsneshle094/obj: gb-cpu.o
Only in bsneshle094/obj: gb-interface.o
Only in bsneshle094/obj: gb-memory.o
Only in bsneshle094/obj: gb-ppu.o
Only in bsneshle094/obj: gb-scheduler.o
Only in bsneshle094/obj: gb-system.o
Only in bsneshle094/obj: gb-video.o
Only in bsneshle094/obj: .gitignore
Only in bsneshle094/obj: libco.o
Only in bsneshle094/obj: libretro-accuracy.o
Only in bsneshle094/obj: processor-arm.o
Only in bsneshle094/obj: processor-gsu.o
Only in bsneshle094/obj: processor-hg51b.o
Only in bsneshle094/obj: processor-lr35902.o
Only in bsneshle094/obj: processor-r65816.o
Only in bsneshle094/obj: processor-spc700.o
Only in bsneshle094/obj: processor-upd96050.o
Only in bsneshle094/obj: sfc-armdsp-accuracy.o
Only in bsneshle094/obj: sfc-bsx-accuracy.o
Only in bsneshle094/obj: sfc-cartridge-accuracy.o
Only in bsneshle094/obj: sfc-cheat-accuracy.o
Only in bsneshle094/obj: sfc-controller-accuracy.o
Only in bsneshle094/obj: sfc-cpu-accuracy.o
Only in bsneshle094/obj: sfc-dsp-accuracy.o
Only in bsneshle094/obj: sfc-epsonrtc-accuracy.o
Only in bsneshle094/obj: sfc-event-accuracy.o
Only in bsneshle094/obj: sfc-hitachidsp-accuracy.o
Only in bsneshle094/obj: sfc-hlecx4-accuracy.o
Only in bsneshle094/obj: sfc-hledsp1-accuracy.o
Only in bsneshle094/obj: sfc-hledsp2-accuracy.o
Only in bsneshle094/obj: sfc-hledsp3-accuracy.o
Only in bsneshle094/obj: sfc-hledsp4-accuracy.o
Only in bsneshle094/obj: sfc-hlest0010-accuracy.o
Only in bsneshle094/obj: sfc-hsu1-accuracy.o
Only in bsneshle094/obj: sfc-icd2-accuracy.o
Only in bsneshle094/obj: sfc-interface-accuracy.o
Only in bsneshle094/obj: sfc-memory-accuracy.o
Only in bsneshle094/obj: sfc-msu1-accuracy.o
Only in bsneshle094/obj: sfc-necdsp-accuracy.o
Only in bsneshle094/obj: sfc-nss-accuracy.o
Only in bsneshle094/obj: sfc-obc1-accuracy.o
Only in bsneshle094/obj: sfc-ppu-accuracy.o
Only in bsneshle094/obj: sfc-sa1-accuracy.o
Only in bsneshle094/obj: sfc-satellaviewbase-accuracy.o
Only in bsneshle094/obj: sfc-satellaviewcart-accuracy.o
Only in bsneshle094/obj: sfc-sdd1-accuracy.o
Only in bsneshle094/obj: sfc-sgbexternal-accuracy.o
Only in bsneshle094/obj: sfc-sharprtc-accuracy.o
Only in bsneshle094/obj: sfc-smp-accuracy.o
Only in bsneshle094/obj: sfc-spc7110-accuracy.o
Only in bsneshle094/obj: sfc-sufamiturbo-accuracy.o
Only in bsneshle094/obj: sfc-superfx-accuracy.o
Only in bsneshle094/obj: sfc-system-accuracy.o
Only in bsneshle094/out: bsnes_mercury_accuracy_libretro.so
Only in bsneshle094/out: .gitignore
Only in bsneshle094/out: libsupergameboy.so
diff -ru higan_v094-source/processor/arm/algorithms.cpp bsneshle094/processor/arm/algorithms.cpp
--- higan_v094-source/processor/arm/algorithms.cpp 2012-04-15 03:34:45.000000000 +0200
+++ bsneshle094/processor/arm/algorithms.cpp 2015-02-21 10:47:18.286028379 +0100
@@ -17,6 +17,9 @@
case 14: return true; //AL (always)
case 15: return false; //NV (never)
}
+
+ // NOT REACHED
+ return false;
}
uint32 ARM::bit(uint32 result) {
@@ -59,7 +62,7 @@
carryout() = cpsr().c;
if(shift == 0) return source;
- carryout() = shift > 32 ? 0 : source & (1 << 32 - shift);
+ carryout() = shift > 32 ? 0 : source & (1 << (32 - shift));
source = shift > 31 ? 0 : source << shift;
return source;
}
@@ -68,7 +71,7 @@
carryout() = cpsr().c;
if(shift == 0) return source;
- carryout() = shift > 32 ? 0 : source & (1 << shift - 1);
+ carryout() = shift > 32 ? 0 : source & (1 << (shift - 1));
source = shift > 31 ? 0 : source >> shift;
return source;
}
@@ -77,7 +80,7 @@
carryout() = cpsr().c;
if(shift == 0) return source;
- carryout() = shift > 32 ? source & (1 << 31) : source & (1 << shift - 1);
+ carryout() = shift > 32 ? source & (1 << 31) : source & (1 << (shift - 1));
source = shift > 31 ? (int32)source >> 31 : (int32)source >> shift;
return source;
}
@@ -86,8 +89,8 @@
carryout() = cpsr().c;
if(shift == 0) return source;
- if(shift &= 31)
- source = source << 32 - shift | source >> shift;
+ if((shift &= 31))
+ source = source << (32 - shift) | source >> shift;
carryout() = source & (1 << 31);
return source;
}
diff -ru higan_v094-source/processor/arm/instructions-arm.cpp bsneshle094/processor/arm/instructions-arm.cpp
--- higan_v094-source/processor/arm/instructions-arm.cpp 2013-05-05 07:00:41.000000000 +0200
+++ bsneshle094/processor/arm/instructions-arm.cpp 2015-02-21 10:47:18.286028379 +0100
@@ -441,7 +441,7 @@
if(mode == 0 ) rm = lsl(rm, rs < 33 ? rs : 33);
if(mode == 1 ) rm = lsr(rm, rs < 33 ? rs : 33);
if(mode == 2 ) rm = asr(rm, rs < 32 ? rs : 32);
- if(mode == 3 && rs) rm = ror(rm, rs & 31 == 0 ? 32 : rs & 31);
+ if(mode == 3 && rs) rm = ror(rm, (rs & 31) == 0 ? 32 : rs & 31);
arm_opcode(rm);
}
diff -ru higan_v094-source/processor/r65816/opcode_misc.cpp bsneshle094/processor/r65816/opcode_misc.cpp
--- higan_v094-source/processor/r65816/opcode_misc.cpp 2012-04-28 10:17:50.000000000 +0200
+++ bsneshle094/processor/r65816/opcode_misc.cpp 2015-02-21 10:47:18.286028379 +0100
@@ -70,7 +70,7 @@
}
void R65816::op_stp() {
- while(regs.wai = true) {
+ while((regs.wai = true)) {
L op_io();
}
}
Only in bsneshle094: README
diff -ru higan_v094-source/sfc/alt/cpu/cpu.cpp bsneshle094/sfc/alt/cpu/cpu.cpp
--- higan_v094-source/sfc/alt/cpu/cpu.cpp 2013-05-05 08:00:10.000000000 +0200
+++ bsneshle094/sfc/alt/cpu/cpu.cpp 2014-05-03 20:02:34.275109688 +0200
@@ -99,9 +99,9 @@
reader = [](unsigned addr) { return cpu.wram[addr]; };
writer = [](unsigned addr, uint8 data) { cpu.wram[addr] = data; };
- bus.map(reader, writer, 0x00, 0x3f, 0x0000, 0x1fff, 0x002000);
- bus.map(reader, writer, 0x80, 0xbf, 0x0000, 0x1fff, 0x002000);
- bus.map(reader, writer, 0x7e, 0x7f, 0x0000, 0xffff, 0x020000);
+ bus.map(reader, writer, 0x00, 0x3f, 0x0000, 0x1fff, 0x002000, 0,0, Cartridge::Mapping::fastmode_readwrite, cpu.wram);
+ bus.map(reader, writer, 0x80, 0xbf, 0x0000, 0x1fff, 0x002000, 0,0, Cartridge::Mapping::fastmode_readwrite, cpu.wram);
+ bus.map(reader, writer, 0x7e, 0x7f, 0x0000, 0xffff, 0x020000, 0,0, Cartridge::Mapping::fastmode_readwrite, cpu.wram);
}
void CPU::power() {
diff -ru higan_v094-source/sfc/alt/ppu-balanced/render/windows.cpp bsneshle094/sfc/alt/ppu-balanced/render/windows.cpp
--- higan_v094-source/sfc/alt/ppu-balanced/render/windows.cpp 2013-05-05 08:11:18.000000000 +0200
+++ bsneshle094/sfc/alt/ppu-balanced/render/windows.cpp 2015-02-21 10:47:18.286028379 +0100
@@ -34,7 +34,11 @@
}
if(regs.window1_enabled[bg] == true && regs.window2_enabled[bg] == false) {
- if(regs.window1_invert[bg] == true) set ^= clr ^= set ^= clr;
+ if(regs.window1_invert[bg] == true) {
+ bool tmp = set;
+ set = clr;
+ clr = tmp;
+ }
for(unsigned x = 0; x < 256; x++) {
table[x] = (x >= window1_left && x <= window1_right) ? set : clr;
}
@@ -42,7 +46,11 @@
}
if(regs.window1_enabled[bg] == false && regs.window2_enabled[bg] == true) {
- if(regs.window2_invert[bg] == true) set ^= clr ^= set ^= clr;
+ if(regs.window2_invert[bg] == true) {
+ bool tmp = set;
+ set = clr;
+ clr = tmp;
+ }
for(unsigned x = 0; x < 256; x++) {
table[x] = (x >= window2_left && x <= window2_right) ? set : clr;
}
diff -ru higan_v094-source/sfc/alt/ppu-performance/cache/cache.cpp bsneshle094/sfc/alt/ppu-performance/cache/cache.cpp
--- higan_v094-source/sfc/alt/ppu-performance/cache/cache.cpp 2013-05-05 08:14:41.000000000 +0200
+++ bsneshle094/sfc/alt/ppu-performance/cache/cache.cpp 2015-02-21 10:47:18.286028379 +0100
@@ -109,6 +109,9 @@
case 1: return tile_4bpp(tile);
case 2: return tile_8bpp(tile);
}
+
+ // NOT REACHED
+ return 0;
}
PPU::Cache::Cache(PPU& self) : self(self) {
diff -ru higan_v094-source/sfc/alt/ppu-performance/window/window.cpp bsneshle094/sfc/alt/ppu-performance/window/window.cpp
--- higan_v094-source/sfc/alt/ppu-performance/window/window.cpp 2013-05-05 08:23:15.000000000 +0200
+++ bsneshle094/sfc/alt/ppu-performance/window/window.cpp 2015-02-21 10:47:18.286028379 +0100
@@ -41,10 +41,10 @@
bool one_mask = (x >= ppu.regs.window_one_left && x <= ppu.regs.window_one_right) ^ one_invert;
bool two_mask = (x >= ppu.regs.window_two_left && x <= ppu.regs.window_two_right) ^ two_invert;
switch(mask) {
- case 0: output[x] = one_mask | two_mask == 1; break;
- case 1: output[x] = one_mask & two_mask == 1; break;
- case 2: output[x] = one_mask ^ two_mask == 1; break;
- case 3: output[x] = one_mask ^ two_mask == 0; break;
+ case 0: output[x] = (one_mask | two_mask); break;
+ case 1: output[x] = (one_mask & two_mask); break;
+ case 2: output[x] = (one_mask ^ two_mask); break;
+ case 3: output[x] = !(one_mask ^ two_mask); break;
}
}
}
@@ -87,10 +87,10 @@
bool one_mask = (x >= ppu.regs.window_one_left && x <= ppu.regs.window_one_right) ^ one_invert;
bool two_mask = (x >= ppu.regs.window_two_left && x <= ppu.regs.window_two_right) ^ two_invert;
switch(mask) {
- case 0: output[x] = one_mask | two_mask == 1 ? set : clr; break;
- case 1: output[x] = one_mask & two_mask == 1 ? set : clr; break;
- case 2: output[x] = one_mask ^ two_mask == 1 ? set : clr; break;
- case 3: output[x] = one_mask ^ two_mask == 0 ? set : clr; break;
+ case 0: output[x] = (one_mask | two_mask) ? set : clr; break;
+ case 1: output[x] = (one_mask & two_mask) ? set : clr; break;
+ case 2: output[x] = (one_mask ^ two_mask) ? set : clr; break;
+ case 3: output[x] = !(one_mask ^ two_mask) ? set : clr; break;
}
}
}
diff -ru higan_v094-source/sfc/cartridge/cartridge.cpp bsneshle094/sfc/cartridge/cartridge.cpp
--- higan_v094-source/sfc/cartridge/cartridge.cpp 2013-05-05 08:31:39.000000000 +0200
+++ bsneshle094/sfc/cartridge/cartridge.cpp 2014-08-19 15:44:56.053783897 +0200
@@ -49,6 +49,14 @@
has_hsu1 = false;
has_msu1 = false;
+ has_dsp1 = false;
+ has_dsp2 = false;
+ has_dsp3 = false;
+ has_dsp4 = false;
+ has_cx4 = false;
+ has_st0010 = false;
+ has_sgbexternal = false;
+
information.markup.cartridge = "";
information.markup.gameBoy = "";
information.markup.satellaview = "";
diff -ru higan_v094-source/sfc/cartridge/cartridge.hpp bsneshle094/sfc/cartridge/cartridge.hpp
--- higan_v094-source/sfc/cartridge/cartridge.hpp 2013-01-22 23:52:43.000000000 +0100
+++ bsneshle094/sfc/cartridge/cartridge.hpp 2014-08-19 15:45:47.797784868 +0200
@@ -39,6 +39,13 @@
readonly<bool> has_obc1;
readonly<bool> has_hsu1;
readonly<bool> has_msu1;
+ readonly<bool> has_dsp1;
+ readonly<bool> has_dsp2;
+ readonly<bool> has_dsp3;
+ readonly<bool> has_dsp4;
+ readonly<bool> has_cx4;
+ readonly<bool> has_st0010;
+ readonly<bool> has_sgbexternal;
struct Mapping {
function<uint8 (unsigned)> reader;
@@ -48,6 +55,9 @@
unsigned base;
unsigned mask;
+ enum fastmode_t { fastmode_slow, fastmode_readonly, fastmode_readwrite } fastmode;
+ uint8* fastptr;
+
Mapping();
Mapping(const function<uint8 (unsigned)>&, const function<void (unsigned, uint8)>&);
Mapping(SuperFamicom::Memory&);
@@ -116,6 +126,10 @@
void parse_markup_obc1(Markup::Node);
void parse_markup_hsu1(Markup::Node);
void parse_markup_msu1(Markup::Node);
+
+ void parse_markup_hitachidsp_hle(Markup::Node);
+ void parse_markup_necdsp_hle(Markup::Node);
+ bool parse_markup_icd2_external(Markup::Node);
friend class Interface;
};
diff -ru higan_v094-source/sfc/cartridge/markup.cpp bsneshle094/sfc/cartridge/markup.cpp
--- higan_v094-source/sfc/cartridge/markup.cpp 2013-12-06 21:58:46.000000000 +0100
+++ bsneshle094/sfc/cartridge/markup.cpp 2014-08-19 16:45:00.909851573 +0200
@@ -64,6 +64,8 @@
Mapping m(rom);
parse_markup_map(m, node);
if(m.size == 0) m.size = rom.size();
+ m.fastmode = Mapping::fastmode_readonly;
+ m.fastptr = rom.data();
mapping.append(m);
}
@@ -71,6 +73,8 @@
Mapping m(ram);
parse_markup_map(m, node);
if(m.size == 0) m.size = ram.size();
+ m.fastmode = Mapping::fastmode_readwrite;
+ m.fastptr = ram.data();
mapping.append(m);
}
}
@@ -78,6 +82,10 @@
void Cartridge::parse_markup_icd2(Markup::Node root) {
if(root.exists() == false) return;
+ if(interface->bind->altImplementation(Alt::ForSuperGameBoy)==Alt::SuperGameBoy::External)
+ {
+ if (parse_markup_icd2_external(root)) return;
+ }
has_gb_slot = true;
icd2.revision = max(1, numeral(root["revision"].data));
@@ -340,6 +348,12 @@
void Cartridge::parse_markup_hitachidsp(Markup::Node root, unsigned roms) {
if(root.exists() == false) return;
+ if(interface->bind->altImplementation(Alt::ForDSP) == Alt::DSP::HLE)
+ {
+ //this is after checking existence because we don't want to ask which DSP to use and then use none of them
+ parse_markup_hitachidsp_hle(root);
+ return;
+ }
has_hitachidsp = true;
parse_markup_memory(hitachidsp.rom, root["rom[0]"], ID::HitachiDSPROM, false);
@@ -387,6 +401,11 @@
void Cartridge::parse_markup_necdsp(Markup::Node root) {
if(root.exists() == false) return;
+ if(interface->bind->altImplementation(Alt::ForDSP)==Alt::DSP::HLE)
+ {
+ parse_markup_necdsp_hle(root);
+ return;
+ }
has_necdsp = true;
for(auto& word : necdsp.programROM) word = 0x000000;
@@ -586,20 +605,112 @@
}
}
+void Cartridge::parse_markup_hitachidsp_hle(Markup::Node root) {
+ //root.exists() is known true in the HLE chip handlers
+ parse_markup_cartridge(root);
+
+ has_cx4 = true;
+ for(auto& node : root) {
+ if(node.name != "map" || node["id"].data != "io") continue;
+ Mapping m({&Cx4::read, &cx4}, {&Cx4::write, &cx4});
+ parse_markup_map(m, node);
+ mapping.append(m);
+ }
+}
+
+void Cartridge::parse_markup_necdsp_hle(Markup::Node root) {
+ if (root["model"].data == "uPD7725") {
+ Mapping m;
+ unsigned int select=0;
+ unsigned int * selectaddr=NULL;
+ for(auto& node : root) {
+ if (node.name == "rom" && node["id"].data == "program") {
+ if (node["name"].data == "dsp1.program.rom" || node["name"].data == "dsp1b.program.rom") {
+ has_dsp1 = true;
+ m.reader = {&DSP1::read, &dsp1};
+ m.writer = {&DSP1::write, &dsp1};
+ selectaddr = &dsp1.Select;
+ }
+ if (node["name"].data == "dsp2.program.rom") {
+ has_dsp2 = true;
+ m.reader = {&DSP2::read, &dsp2};
+ m.writer = {&DSP2::write, &dsp2};
+ selectaddr = &dsp2.Select;
+ }
+ if (node["name"].data == "dsp3.program.rom") {
+ has_dsp3 = true;
+ m.reader = {&DSP3::read, &dsp3};
+ m.writer = {&DSP3::write, &dsp3};
+ //some of the chips hardcode the Select value
+ }
+ if (node["name"].data == "dsp4.program.rom") {
+ has_dsp4 = true;
+ m.reader = {&DSP4::read, &dsp4};
+ m.writer = {&DSP4::write, &dsp4};
+ }
+ }
+ if (node.name == "map" && node["id"].data == "io") {
+ parse_markup_map(m, node);
+ select = numeral(node["select"].data);
+ }
+ }
+ if (selectaddr) *selectaddr=select;
+ mapping.append(m);
+ } else {
+ Mapping m({&ST0010::read, &st0010}, {&ST0010::write, &st0010});
+ for(auto& node : root) {
+ if(node.name != "map") continue;
+
+ parse_markup_map(m, node);
+ mapping.append(m);
+ }
+ }
+}
+
+bool Cartridge::parse_markup_icd2_external(Markup::Node root) {
+ //root.exists() is known true here
+ if (!sgbExternal.load_library("/home/alcaro/Desktop/minir/cores/bsnes_v073/supergameboy/libsupergameboy.so"))
+ {
+ interface->bind->notify("Couldn't load external GB emulator, falling back to internal");
+ return false;
+ }
+
+ has_sgbexternal = true;
+ sgbExternal.revision = max(1, numeral(root["revision"].data));
+
+ GameBoy::cartridge.load_empty(GameBoy::System::Revision::SuperGameBoy);
+ interface->loadRequest(ID::SuperGameBoy, "Game Boy", "gb");
+
+ for(auto& node : root) {
+ if(node.name != "map") continue;
+
+ if(node["id"].data == "io") {
+ Mapping m({&SGBExternal::read, &sgbExternal}, {&SGBExternal::write, &sgbExternal});
+ parse_markup_map(m, node);
+ mapping.append(m);
+ }
+ }
+
+ return true;
+}
+
Cartridge::Mapping::Mapping() {
size = base = mask = 0;
+ fastmode = Mapping::fastmode_slow;
}
Cartridge::Mapping::Mapping(SuperFamicom::Memory& memory) {
reader = {&SuperFamicom::Memory::read, &memory};
writer = {&SuperFamicom::Memory::write, &memory};
size = base = mask = 0;
+ fastmode = Mapping::fastmode_slow;
}
Cartridge::Mapping::Mapping(const function<uint8 (unsigned)>& reader, const function<void (unsigned, uint8)>& writer) {
this->reader = reader;
this->writer = writer;
size = base = mask = 0;
+ fastmode = Mapping::fastmode_slow;
}
#endif
diff -ru higan_v094-source/sfc/chip/armdsp/armdsp.cpp bsneshle094/sfc/chip/armdsp/armdsp.cpp
--- higan_v094-source/sfc/chip/armdsp/armdsp.cpp 2012-10-15 18:43:08.000000000 +0200
+++ bsneshle094/sfc/chip/armdsp/armdsp.cpp 2015-02-21 10:47:18.286028379 +0100
@@ -39,7 +39,7 @@
}
void ArmDSP::step(unsigned clocks) {
- if(bridge.timer && --bridge.timer == 0);
+ if(bridge.timer) --bridge.timer;
Coprocessor::step(clocks);
synchronize_cpu();
}
diff -ru higan_v094-source/sfc/chip/armdsp/memory.cpp bsneshle094/sfc/chip/armdsp/memory.cpp
--- higan_v094-source/sfc/chip/armdsp/memory.cpp 2012-04-17 02:47:16.000000000 +0200
+++ bsneshle094/sfc/chip/armdsp/memory.cpp 2015-02-21 10:47:18.286028379 +0100
@@ -15,6 +15,9 @@
case Byte:
return memory[addr];
}
+
+ // NOT REACHED
+ return 0;
};
switch(addr & 0xe0000000) {
diff -ru higan_v094-source/sfc/chip/bsx/bsx.cpp bsneshle094/sfc/chip/bsx/bsx.cpp
--- higan_v094-source/sfc/chip/bsx/bsx.cpp 2013-05-05 08:39:50.000000000 +0200
+++ bsneshle094/sfc/chip/bsx/bsx.cpp 2015-02-21 10:47:18.286028379 +0100
@@ -31,6 +31,9 @@
uint8 BSXCartridge::memory_access(bool write, Memory& memory, unsigned addr, uint8 data) {
if(write == 0) return memory_read(memory, addr);
memory_write(memory, addr, data);
+
+ // byuu returned nothing here (causing C++ to return 0)
+ return 0;
}
uint8 BSXCartridge::memory_read(Memory& memory, unsigned addr) {
diff -ru higan_v094-source/sfc/chip/chip.hpp bsneshle094/sfc/chip/chip.hpp
--- higan_v094-source/sfc/chip/chip.hpp 2013-01-21 07:09:43.000000000 +0100
+++ bsneshle094/sfc/chip/chip.hpp 2014-08-19 15:29:02.525765996 +0200
@@ -25,6 +25,16 @@
#include <sfc/chip/hsu1/hsu1.hpp>
#include <sfc/chip/msu1/msu1.hpp>
+#include <sfc/chip/dsp1/dsp1.hpp>
+#include <sfc/chip/dsp2/dsp2.hpp>
+#include <sfc/chip/dsp3/dsp3.hpp>
+#include <sfc/chip/dsp4/dsp4.hpp>
+
+#include <sfc/chip/cx4/cx4.hpp>
+#include <sfc/chip/st0010/st0010.hpp>
+
+#include <sfc/chip/sgb-external/sgb-external.hpp>
+
void Coprocessor::step(unsigned clocks) {
clock += clocks * (uint64)cpu.frequency;
}
Only in bsneshle094/sfc/chip: cx4
Only in bsneshle094/sfc/chip: dsp1
Only in bsneshle094/sfc/chip: dsp2
Only in bsneshle094/sfc/chip: dsp3
Only in bsneshle094/sfc/chip: dsp4
diff -ru higan_v094-source/sfc/chip/epsonrtc/epsonrtc.cpp bsneshle094/sfc/chip/epsonrtc/epsonrtc.cpp
--- higan_v094-source/sfc/chip/epsonrtc/epsonrtc.cpp 2013-05-05 08:40:40.000000000 +0200
+++ bsneshle094/sfc/chip/epsonrtc/epsonrtc.cpp 2015-02-21 10:47:18.286028379 +0100
@@ -165,6 +165,9 @@
if(addr == 2) {
return ready << 7;
}
+
+ // TODO: byuu returned nothing if addr == 3
+ return 0;
}
void EpsonRTC::write(unsigned addr, uint8 data) {
diff -ru higan_v094-source/sfc/chip/hitachidsp/memory.cpp bsneshle094/sfc/chip/hitachidsp/memory.cpp
--- higan_v094-source/sfc/chip/hitachidsp/memory.cpp 2012-11-06 03:57:30.000000000 +0100
+++ bsneshle094/sfc/chip/hitachidsp/memory.cpp 2015-02-21 10:47:18.290028379 +0100
@@ -38,7 +38,7 @@
addr &= 0x1fff;
//Data RAM
- if((addr >= 0x0000 && addr <= 0x0bff) || (addr >= 0x1000 && addr <= 0x1bff)) {
+ if(addr <= 0x0bff || (addr >= 0x1000 && addr <= 0x1bff)) {
return dataRAM[addr & 0x0fff];
}
@@ -88,7 +88,7 @@
addr &= 0x1fff;
//Data RAM
- if((addr >= 0x0000 && addr <= 0x0bff) || (addr >= 0x1000 && addr <= 0x1bff)) {
+ if(addr <= 0x0bff || (addr >= 0x1000 && addr <= 0x1bff)) {
dataRAM[addr & 0x0fff] = data;
return;
}
diff -ru higan_v094-source/sfc/chip/msu1/msu1.cpp bsneshle094/sfc/chip/msu1/msu1.cpp
--- higan_v094-source/sfc/chip/msu1/msu1.cpp 2013-05-05 08:47:03.000000000 +0200
+++ bsneshle094/sfc/chip/msu1/msu1.cpp 2015-02-21 10:47:18.290028379 +0100
@@ -133,6 +133,9 @@
case 0x2006: return 'U';
case 0x2007: return '1';
}
+
+ // NOT REACHED
+ return 0;
}
void MSU1::mmio_write(unsigned addr, uint8 data) {
diff -ru higan_v094-source/sfc/chip/sa1/dma/dma.cpp bsneshle094/sfc/chip/sa1/dma/dma.cpp
--- higan_v094-source/sfc/chip/sa1/dma/dma.cpp 2013-05-05 08:50:25.000000000 +0200
+++ bsneshle094/sfc/chip/sa1/dma/dma.cpp 2015-02-21 10:47:18.290028379 +0100
@@ -32,16 +32,13 @@
break;
}
- switch(mmio.dd) {
- case DMA::DestBWRAM:
+ if (mmio.dd == DMA::DestBWRAM) {
if((dda & 0x40e000) == 0x006000 || (dda & 0xf00000) == 0x400000) {
bus_write(dda, data);
}
- break;
-
- case DMA::DestIRAM:
+ } else {
+ // mmio.dd == DMA::DestIRAM
iram.write(dda & 0x07ff, data);
- break;
}
}
diff -ru higan_v094-source/sfc/chip/sa1/memory/memory.cpp bsneshle094/sfc/chip/sa1/memory/memory.cpp
--- higan_v094-source/sfc/chip/sa1/memory/memory.cpp 2013-10-20 14:48:17.000000000 +0200
+++ bsneshle094/sfc/chip/sa1/memory/memory.cpp 2015-02-21 10:47:18.290028379 +0100
@@ -99,6 +99,9 @@
if((addr & 0x40f800) == 0x003000) { //$00-3f|80-bf:3000-37ff
return iram.read(addr & 2047);
}
+
+ // TODO: invalid address, what does real hardware do here?
+ return 0;
}
//ROM, I-RAM and MMIO registers are accessed at ~10.74MHz (2 clock ticks)
@@ -252,6 +255,9 @@
case 3: return (bwram.read(addr) >> 6) & 3;
}
}
+
+ // NOT REACHED
+ return 0;
}
void SA1::bitmap_write(unsigned addr, uint8 data) {
diff -ru higan_v094-source/sfc/chip/sdd1/decomp.cpp bsneshle094/sfc/chip/sdd1/decomp.cpp
--- higan_v094-source/sfc/chip/sdd1/decomp.cpp 2013-05-05 08:57:02.000000000 +0200
+++ bsneshle094/sfc/chip/sdd1/decomp.cpp 2015-02-21 10:47:18.290028379 +0100
@@ -253,6 +253,9 @@
}
return r1;
}
+
+ // NOT REACHED
+ return 0;
}
//core
Only in bsneshle094/sfc/chip: sgb-external
Only in bsneshle094/sfc/chip: st0010
diff -ru higan_v094-source/sfc/chip/superfx/memory/memory.cpp bsneshle094/sfc/chip/superfx/memory/memory.cpp
--- higan_v094-source/sfc/chip/superfx/memory/memory.cpp 2012-07-09 06:59:32.000000000 +0200
+++ bsneshle094/sfc/chip/superfx/memory/memory.cpp 2015-02-21 10:47:18.290028379 +0100
@@ -24,6 +24,9 @@
}
return ram.read(addr & ram_mask);
}
+
+ // TODO: invalid address, what does real hardware do?
+ return 0;
}
void SuperFX::bus_write(unsigned addr, uint8 data) {
diff -ru higan_v094-source/sfc/controller/controller.cpp bsneshle094/sfc/controller/controller.cpp
--- higan_v094-source/sfc/controller/controller.cpp 2012-04-28 12:25:51.000000000 +0200
+++ bsneshle094/sfc/controller/controller.cpp 2015-02-21 10:47:18.290028379 +0100
@@ -33,17 +33,17 @@
}
bool Controller::iobit() {
- switch(port) {
- case Controller::Port1: return cpu.pio() & 0x40;
- case Controller::Port2: return cpu.pio() & 0x80;
- }
+ if (port == Controller::Port1)
+ return cpu.pio() & 0x40;
+ else
+ return cpu.pio() & 0x80;
}
void Controller::iobit(bool data) {
- switch(port) {
- case Controller::Port1: bus.write(0x4201, (cpu.pio() & ~0x40) | (data << 6)); break;
- case Controller::Port2: bus.write(0x4201, (cpu.pio() & ~0x80) | (data << 7)); break;
- }
+ if (port == Controller::Port1)
+ bus.write(0x4201, (cpu.pio() & ~0x40) | (data << 6));
+ else
+ bus.write(0x4201, (cpu.pio() & ~0x80) | (data << 7));
}
Controller::Controller(bool port) : port(port) {
diff -ru higan_v094-source/sfc/controller/justifier/justifier.cpp bsneshle094/sfc/controller/justifier/justifier.cpp
--- higan_v094-source/sfc/controller/justifier/justifier.cpp 2012-05-03 22:48:59.000000000 +0200
+++ bsneshle094/sfc/controller/justifier/justifier.cpp 2015-02-21 10:47:18.290028379 +0100
@@ -91,6 +91,9 @@
case 30: return 0;
case 31: return 0;
}
+
+ // NOT REACHED
+ return 0;
}
void Justifier::latch(bool data) {
diff -ru higan_v094-source/sfc/controller/superscope/superscope.cpp bsneshle094/sfc/controller/superscope/superscope.cpp
--- higan_v094-source/sfc/controller/superscope/superscope.cpp 2012-04-28 17:39:56.000000000 +0200
+++ bsneshle094/sfc/controller/superscope/superscope.cpp 2015-02-21 10:47:18.290028379 +0100
@@ -92,6 +92,9 @@
case 6: return offscreen;
case 7: return 0; //noise (1 = yes)
}
+
+ // NOT REACHED
+ return 0;
}
void SuperScope::latch(bool data) {
diff -ru higan_v094-source/sfc/cpu/cpu.cpp bsneshle094/sfc/cpu/cpu.cpp
--- higan_v094-source/sfc/cpu/cpu.cpp 2013-11-09 06:38:15.000000000 +0100
+++ bsneshle094/sfc/cpu/cpu.cpp 2014-05-03 20:02:53.027110040 +0200
@@ -114,9 +114,9 @@
reader = [](unsigned addr) { return cpu.wram[addr]; };
writer = [](unsigned addr, uint8 data) { cpu.wram[addr] = data; };
- bus.map(reader, writer, 0x00, 0x3f, 0x0000, 0x1fff, 0x002000);
- bus.map(reader, writer, 0x80, 0xbf, 0x0000, 0x1fff, 0x002000);
- bus.map(reader, writer, 0x7e, 0x7f, 0x0000, 0xffff, 0x020000);
+ bus.map(reader, writer, 0x00, 0x3f, 0x0000, 0x1fff, 0x002000, 0,0, Cartridge::Mapping::fastmode_readwrite, cpu.wram);
+ bus.map(reader, writer, 0x80, 0xbf, 0x0000, 0x1fff, 0x002000, 0,0, Cartridge::Mapping::fastmode_readwrite, cpu.wram);
+ bus.map(reader, writer, 0x7e, 0x7f, 0x0000, 0xffff, 0x020000, 0,0, Cartridge::Mapping::fastmode_readwrite, cpu.wram);
}
void CPU::power() {
diff -ru higan_v094-source/sfc/cpu/timing/timing.cpp bsneshle094/sfc/cpu/timing/timing.cpp
--- higan_v094-source/sfc/cpu/timing/timing.cpp 2012-02-12 07:25:08.000000000 +0100
+++ bsneshle094/sfc/cpu/timing/timing.cpp 2015-02-12 22:56:36.541886387 +0100
@@ -8,6 +8,7 @@
}
void CPU::add_clocks(unsigned clocks) {
+again:
status.irq_lock = false;
unsigned ticks = clocks >> 1;
while(ticks--) {
@@ -25,7 +26,8 @@
if(status.dram_refreshed == false && hcounter() >= status.dram_refresh_position) {
status.dram_refreshed = true;
- add_clocks(40);
+ clocks = 40;
+ goto again;
}
#if defined(DEBUGGER)
diff -ru higan_v094-source/sfc/cpu/timing/timing.hpp bsneshle094/sfc/cpu/timing/timing.hpp
--- higan_v094-source/sfc/cpu/timing/timing.hpp 2010-12-26 16:16:47.000000000 +0100
+++ bsneshle094/sfc/cpu/timing/timing.hpp 2015-02-12 22:36:02.421886534 +0100
@@ -1,7 +1,7 @@
//timing.cpp
unsigned dma_counter();
-void add_clocks(unsigned clocks);
+alwaysinline void add_clocks(unsigned clocks);
void scanline();
alwaysinline void alu_edge();
diff -ru higan_v094-source/sfc/interface/interface.hpp bsneshle094/sfc/interface/interface.hpp
--- higan_v094-source/sfc/interface/interface.hpp 2013-12-17 05:31:06.000000000 +0100
+++ bsneshle094/sfc/interface/interface.hpp 2014-08-19 15:43:19.689782088 +0200
@@ -88,6 +88,25 @@
};
};
+struct Alt {
+ enum : unsigned {
+ ForDSP,
+ ForSuperGameBoy,
+ };
+ struct DSP {
+ enum : unsigned {
+ LLE,
+ HLE,
+ };
+ };
+ struct SuperGameBoy {
+ enum : unsigned {
+ Internal,
+ External,
+ };
+ };
+};
+
struct Interface : Emulator::Interface {
string title();
double videoFrequency();
diff -ru higan_v094-source/sfc/Makefile bsneshle094/sfc/Makefile
--- higan_v094-source/sfc/Makefile 2013-01-23 00:07:55.000000000 +0100
+++ bsneshle094/sfc/Makefile 2015-04-23 17:11:57.475859018 +0200
@@ -9,22 +9,24 @@
sfc_objects += sfc-spc7110 sfc-sdd1 sfc-obc1
sfc_objects += sfc-hsu1 sfc-msu1
sfc_objects += sfc-satellaviewcart sfc-sufamiturbo
-objects += $(sfc_objects)
+sfc_objects += sfc-hledsp1 sfc-hledsp2 sfc-hledsp3 sfc-hledsp4
+sfc_objects += sfc-hlecx4 sfc-hlest0010
+sfc_objects += sfc-sgbexternal
ifeq ($(profile),accuracy)
- flags += -DPROFILE_ACCURACY
+ profflags := -DPROFILE_ACCURACY
sfccpu := $(sfc)/cpu
sfcsmp := $(sfc)/smp
sfcdsp := $(sfc)/dsp
sfcppu := $(sfc)/ppu
else ifeq ($(profile),balanced)
- flags += -DPROFILE_BALANCED
+ profflags := -DPROFILE_BALANCED
sfccpu := $(sfc)/cpu
sfcsmp := $(sfc)/smp
sfcdsp := $(sfc)/alt/dsp
sfcppu := $(sfc)/alt/ppu-balanced
else ifeq ($(profile),performance)
- flags += -DPROFILE_PERFORMANCE
+ profflags := -DPROFILE_PERFORMANCE
sfccpu := $(sfc)/alt/cpu
sfcsmp := $(sfc)/alt/smp
sfcdsp := $(sfc)/alt/dsp
@@ -33,40 +35,50 @@
$(error unknown profile.)
endif
-obj/sfc-interface.o: $(sfc)/interface/interface.cpp $(call rwildcard,$(sfc)/interface)
-obj/sfc-system.o: $(sfc)/system/system.cpp $(call rwildcard,$(sfc)/system/)
-obj/sfc-controller.o: $(sfc)/controller/controller.cpp $(call rwildcard,$(sfc)/controller/)
-obj/sfc-cartridge.o: $(sfc)/cartridge/cartridge.cpp $(sfc)/cartridge/*
-obj/sfc-cheat.o: $(sfc)/cheat/cheat.cpp $(sfc)/cheat/*
-obj/sfc-memory.o: $(sfc)/memory/memory.cpp $(call rwildcard,$(sfc)/memory/)
-obj/sfc-cpu.o: $(sfccpu)/cpu.cpp $(call rwildcard,$(sfccpu)/)
-obj/sfc-smp.o: $(sfcsmp)/smp.cpp $(call rwildcard,$(sfcsmp)/)
-obj/sfc-dsp.o: $(sfcdsp)/dsp.cpp $(call rwildcard,$(sfcdsp)/)
-obj/sfc-ppu.o: $(sfcppu)/ppu.cpp $(call rwildcard,$(sfcppu)/)
-
-obj/sfc-satellaviewbase.o: $(sfc)/base/satellaview/satellaview.cpp $(call rwildcard,$(sfc)/base/satellaview/)
-
-obj/sfc-icd2.o: $(sfc)/chip/icd2/icd2.cpp $(call rwildcard,$(sfc)/chip/icd2/)
-obj/sfc-bsx.o: $(sfc)/chip/bsx/bsx.cpp $(call rwildcard,$(sfc)/chip/bsx/)
-obj/sfc-nss.o: $(sfc)/chip/nss/nss.cpp $(call rwildcard,$(sfc)/chip/nss/)
-obj/sfc-event.o: $(sfc)/chip/event/event.cpp $(call rwildcard,$(sfc)/chip/event/)
-
-obj/sfc-sa1.o: $(sfc)/chip/sa1/sa1.cpp $(call rwildcard,$(sfc)/chip/sa1/)
-obj/sfc-superfx.o: $(sfc)/chip/superfx/superfx.cpp $(call rwildcard,$(sfc)/chip/superfx/)
-
-obj/sfc-armdsp.o: $(sfc)/chip/armdsp/armdsp.cpp $(call rwildcard,$(sfc)/chip/armdsp/)
-obj/sfc-hitachidsp.o: $(sfc)/chip/hitachidsp/hitachidsp.cpp $(call rwildcard,$(sfc)/chip/hitachidsp/)
-obj/sfc-necdsp.o: $(sfc)/chip/necdsp/necdsp.cpp $(call rwildcard,$(sfc)/chip/necdsp/)
-
-obj/sfc-epsonrtc.o: $(sfc)/chip/epsonrtc/epsonrtc.cpp $(call rwildcard,$(sfc)/chip/epsonrtc/)
-obj/sfc-sharprtc.o: $(sfc)/chip/sharprtc/sharprtc.cpp $(call rwildcard,$(sfc)/chip/sharprtc/)
-
-obj/sfc-spc7110.o: $(sfc)/chip/spc7110/spc7110.cpp $(sfc)/chip/spc7110/*
-obj/sfc-sdd1.o: $(sfc)/chip/sdd1/sdd1.cpp $(sfc)/chip/sdd1/*
-obj/sfc-obc1.o: $(sfc)/chip/obc1/obc1.cpp $(sfc)/chip/obc1/*
+obj/sfc-interface-$(profile).o: $(sfc)/interface/interface.cpp $(call rwildcard,$(sfc)/interface)
+obj/sfc-system-$(profile).o: $(sfc)/system/system.cpp $(call rwildcard,$(sfc)/system/)
+obj/sfc-controller-$(profile).o: $(sfc)/controller/controller.cpp $(call rwildcard,$(sfc)/controller/)
+obj/sfc-cartridge-$(profile).o: $(sfc)/cartridge/cartridge.cpp $(sfc)/cartridge/*
+obj/sfc-cheat-$(profile).o: $(sfc)/cheat/cheat.cpp $(sfc)/cheat/*
+obj/sfc-memory-$(profile).o: $(sfc)/memory/memory.cpp $(call rwildcard,$(sfc)/memory/)
+obj/sfc-cpu-$(profile).o: $(sfccpu)/cpu.cpp $(call rwildcard,$(sfccpu)/)
+obj/sfc-smp-$(profile).o: $(sfcsmp)/smp.cpp $(call rwildcard,$(sfcsmp)/)
+obj/sfc-dsp-$(profile).o: $(sfcdsp)/dsp.cpp $(call rwildcard,$(sfcdsp)/)
+obj/sfc-ppu-$(profile).o: $(sfcppu)/ppu.cpp $(call rwildcard,$(sfcppu)/)
+
+obj/sfc-satellaviewbase-$(profile).o: $(sfc)/base/satellaview/satellaview.cpp $(call rwildcard,$(sfc)/base/satellaview/)
+
+obj/sfc-icd2-$(profile).o: $(sfc)/chip/icd2/icd2.cpp $(call rwildcard,$(sfc)/chip/icd2/)
+obj/sfc-bsx-$(profile).o: $(sfc)/chip/bsx/bsx.cpp $(call rwildcard,$(sfc)/chip/bsx/)
+obj/sfc-nss-$(profile).o: $(sfc)/chip/nss/nss.cpp $(call rwildcard,$(sfc)/chip/nss/)
+obj/sfc-event-$(profile).o: $(sfc)/chip/event/event.cpp $(call rwildcard,$(sfc)/chip/event/)
+
+obj/sfc-sa1-$(profile).o: $(sfc)/chip/sa1/sa1.cpp $(call rwildcard,$(sfc)/chip/sa1/)
+obj/sfc-superfx-$(profile).o: $(sfc)/chip/superfx/superfx.cpp $(call rwildcard,$(sfc)/chip/superfx/)
+
+obj/sfc-armdsp-$(profile).o: $(sfc)/chip/armdsp/armdsp.cpp $(call rwildcard,$(sfc)/chip/armdsp/)
+obj/sfc-hitachidsp-$(profile).o: $(sfc)/chip/hitachidsp/hitachidsp.cpp $(call rwildcard,$(sfc)/chip/hitachidsp/)
+obj/sfc-necdsp-$(profile).o: $(sfc)/chip/necdsp/necdsp.cpp $(call rwildcard,$(sfc)/chip/necdsp/)
+
+obj/sfc-epsonrtc-$(profile).o: $(sfc)/chip/epsonrtc/epsonrtc.cpp $(call rwildcard,$(sfc)/chip/epsonrtc/)
+obj/sfc-sharprtc-$(profile).o: $(sfc)/chip/sharprtc/sharprtc.cpp $(call rwildcard,$(sfc)/chip/sharprtc/)
+
+obj/sfc-spc7110-$(profile).o: $(sfc)/chip/spc7110/spc7110.cpp $(sfc)/chip/spc7110/*
+obj/sfc-sdd1-$(profile).o: $(sfc)/chip/sdd1/sdd1.cpp $(sfc)/chip/sdd1/*
+obj/sfc-obc1-$(profile).o: $(sfc)/chip/obc1/obc1.cpp $(sfc)/chip/obc1/*
+
+obj/sfc-hsu1-$(profile).o: $(sfc)/chip/hsu1/hsu1.cpp $(sfc)/chip/hsu1/*
+obj/sfc-msu1-$(profile).o: $(sfc)/chip/msu1/msu1.cpp $(sfc)/chip/msu1/*
+
+obj/sfc-satellaviewcart-$(profile).o: $(sfc)/slot/satellaview/satellaview.cpp $(call rwildcard,$(sfc)/slot/satellaview/)
+obj/sfc-sufamiturbo-$(profile).o: $(sfc)/slot/sufamiturbo/sufamiturbo.cpp $(call rwildcard,$(sfc)/slot/sufamiturbo/)
+
+obj/sfc-hledsp1-$(profile).o: $(sfc)/chip/dsp1/dsp1.cpp $(sfc)/chip/dsp1/*
+obj/sfc-hledsp2-$(profile).o: $(sfc)/chip/dsp2/dsp2.cpp $(sfc)/chip/dsp2/*
+obj/sfc-hledsp3-$(profile).o: $(sfc)/chip/dsp3/dsp3.cpp $(sfc)/chip/dsp3/*
+obj/sfc-hledsp4-$(profile).o: $(sfc)/chip/dsp4/dsp4.cpp $(sfc)/chip/dsp4/*
-obj/sfc-hsu1.o: $(sfc)/chip/hsu1/hsu1.cpp $(sfc)/chip/hsu1/*
-obj/sfc-msu1.o: $(sfc)/chip/msu1/msu1.cpp $(sfc)/chip/msu1/*
+obj/sfc-hlecx4-$(profile).o: $(sfc)/chip/cx4/cx4.cpp $(sfc)/chip/cx4/*
+obj/sfc-hlest0010-$(profile).o: $(sfc)/chip/st0010/st0010.cpp $(sfc)/chip/st0010/*
-obj/sfc-satellaviewcart.o: $(sfc)/slot/satellaview/satellaview.cpp $(call rwildcard,$(sfc)/slot/satellaview/)
-obj/sfc-sufamiturbo.o: $(sfc)/slot/sufamiturbo/sufamiturbo.cpp $(call rwildcard,$(sfc)/slot/sufamiturbo/)
+obj/sfc-sgbexternal-$(profile).o: $(sfc)/chip/sgb-external/sgb-external.cpp $(sfc)/chip/sgb-external/*
diff -ru higan_v094-source/sfc/memory/memory.cpp bsneshle094/sfc/memory/memory.cpp
--- higan_v094-source/sfc/memory/memory.cpp 2013-05-05 09:29:50.000000000 +0200
+++ bsneshle094/sfc/memory/memory.cpp 2014-06-05 22:10:02.955293881 +0200
@@ -1,6 +1,7 @@
#include <sfc/sfc.hpp>
#define MEMORY_CPP
+
namespace SuperFamicom {
Bus bus;
@@ -10,22 +11,73 @@
const function<void (unsigned, uint8)>& writer,
unsigned banklo, unsigned bankhi,
unsigned addrlo, unsigned addrhi,
- unsigned size, unsigned base, unsigned mask
+ unsigned size, unsigned base, unsigned mask,
+ unsigned fastmode, uint8* fastptr
) {
assert(banklo <= bankhi && banklo <= 0xff);
assert(addrlo <= addrhi && addrlo <= 0xffff);
assert(idcount < 255);
+ bool do_fast=(size%(addrhi+1-addrlo)==0 && !((mask|addrlo|addrhi|size)&fast_page_size_mask));
+ bool do_fast_read =(fastmode!=Cartridge::Mapping::fastmode_slow && do_fast);
+ bool do_fast_write=(fastmode==Cartridge::Mapping::fastmode_readwrite && do_fast);
+ for(unsigned bank = banklo; bank <= bankhi; bank++) {
+ for(unsigned addr = addrlo&~fast_page_size_mask; addr<=addrhi; addr+=fast_page_size) {
+ unsigned origpos = (bank << 16 | addr);
+ unsigned fastoffset = origpos >> fast_page_size_bits;
+
+ unsigned accesspos = reduce(origpos, mask);
+ if(size) accesspos = base + mirror(accesspos, size - base);
+ if(do_fast_read) fast_read[fastoffset] = fastptr - origpos + accesspos;
+ else fast_read[fastoffset] = NULL;
+ if(do_fast_write) fast_write[fastoffset] = fastptr - origpos + accesspos;
+ else fast_write[fastoffset] = NULL;
+ }
+ }
+
+#ifdef __LIBRETRO__
+ if (((banklo&-banklo)|0x01000000)>(bankhi-banklo) && (bankhi&(bankhi+1)&~banklo)==0 &&
+ ((addrlo&-addrlo)|0x01000000)>(addrhi-addrlo) && (addrhi&(addrhi+1)&~addrlo)==0)
+ {
+ retro_memory_descriptor desc;
+ desc.flags=(fastmode==Cartridge::Mapping::fastmode_readwrite ? 0 : RETRO_MEMDESC_CONST);
+ desc.ptr=fastptr;
+ desc.offset=0;
+ desc.start=banklo<<16 | addrlo;
+ desc.select=(banklo<<16 | addrlo) ^ (bankhi<<16 | addrhi) ^ 0xFFFFFF;
+ desc.disconnect=mask;
+ desc.len=size;
+ if (!size) desc.len=0x01000000;
+ desc.addrspace=NULL;
+ libretro_mem_map.append(desc);
+ }
+#endif
+
unsigned id = idcount++;
this->reader[id] = reader;
this->writer[id] = writer;
- for(unsigned bank = banklo; bank <= bankhi; bank++) {
- for(unsigned addr = addrlo; addr <= addrhi; addr++) {
- unsigned offset = reduce(bank << 16 | addr, mask);
- if(size) offset = base + mirror(offset, size - base);
- lookup[bank << 16 | addr] = id;
- target[bank << 16 | addr] = offset;
+ if (!(mask & (addrlo^addrhi)) && size%(addrhi+1-addrlo)==0) {
+ //fastpath for common cases
+ for(unsigned bank = banklo; bank <= bankhi; bank++) {
+ unsigned offset = reduce(bank << 16 | addrlo, mask);
+ if (size) offset = base + mirror(offset, size - base);
+ unsigned pos = (bank<<16 | addrlo);
+ unsigned end = (bank<<16 | addrhi);
+ while (pos <= end) {
+ lookup[pos] = id;
+ target[pos] = offset++;
+ pos++;
+ }
+ }
+ } else {
+ for(unsigned bank = banklo; bank <= bankhi; bank++) {
+ for(unsigned addr = addrlo; addr <= addrhi; addr++) {
+ unsigned offset = reduce(bank << 16 | addr, mask);
+ if(size) offset = base + mirror(offset, size - base);
+ lookup[bank << 16 | addr] = id;
+ target[bank << 16 | addr] = offset;
+ }
}
}
}
@@ -34,6 +86,10 @@
function<uint8 (unsigned)> reader = [](unsigned) { return cpu.regs.mdr; };
function<void (unsigned, uint8)> writer = [](unsigned, uint8) {};
+#ifdef __LIBRETRO__
+ libretro_mem_map.reset();
+#endif
+
idcount = 0;
map(reader, writer, 0x00, 0xff, 0x0000, 0xffff);
}
@@ -51,7 +107,7 @@
unsigned bankhi = hex(bankpart(1, bankpart(0)));
unsigned addrlo = hex(addrpart(0));
unsigned addrhi = hex(addrpart(1, addrpart(0)));
- map(m.reader, m.writer, banklo, bankhi, addrlo, addrhi, m.size, m.base, m.mask);
+ map(m.reader, m.writer, banklo, bankhi, addrlo, addrhi, m.size, m.base, m.mask, m.fastmode, m.fastptr);
}
}
}
diff -ru higan_v094-source/sfc/memory/memory.hpp bsneshle094/sfc/memory/memory.hpp
--- higan_v094-source/sfc/memory/memory.hpp 2013-05-05 09:30:28.000000000 +0200
+++ bsneshle094/sfc/memory/memory.hpp 2014-06-05 21:25:47.259294198 +0200
@@ -1,7 +1,12 @@
+#ifdef __LIBRETRO__
+#include "../../target-libretro/libretro.h"
+#endif
+
struct Memory {
virtual inline unsigned size() const;
virtual uint8 read(unsigned addr) = 0;
virtual void write(unsigned addr, uint8 data) = 0;
+ virtual uint8* data() { return NULL; }
};
struct StaticRAM : Memory {
@@ -56,12 +61,19 @@
function<uint8 (unsigned)> reader[256];
function<void (unsigned, uint8)> writer[256];
+ static const uint32 fast_page_size_bits = 13;//keep at 13 or lower so the RAM mirrors can be on the fast path
+ static const uint32 fast_page_size = (1 << fast_page_size_bits);
+ static const uint32 fast_page_size_mask = (fast_page_size - 1);
+ uint8* fast_read[0x1000000>>fast_page_size_bits];
+ uint8* fast_write[0x1000000>>fast_page_size_bits];
+
void map(
const function<uint8 (unsigned)>& reader,
const function<void (unsigned, uint8)>& writer,
unsigned banklo, unsigned bankhi,
unsigned addrlo, unsigned addrhi,
- unsigned size = 0, unsigned base = 0, unsigned mask = 0
+ unsigned size = 0, unsigned base = 0, unsigned mask = 0,
+ unsigned fastmode = 0, uint8* fast_ptr = NULL
);
void map_reset();
@@ -69,6 +81,10 @@
Bus();
~Bus();
+
+#ifdef __LIBRETRO__
+ vector<retro_memory_descriptor> libretro_mem_map;
+#endif
};
extern Bus bus;
diff -ru higan_v094-source/sfc/memory/memory-inline.hpp bsneshle094/sfc/memory/memory-inline.hpp
--- higan_v094-source/sfc/memory/memory-inline.hpp 2014-01-13 07:27:34.000000000 +0100
+++ bsneshle094/sfc/memory/memory-inline.hpp 2014-05-13 17:48:18.379765481 +0200
@@ -73,26 +73,38 @@
return base;
}
-unsigned Bus::reduce(unsigned addr, unsigned mask) {
- unsigned result = 0, length = 0;
- for(unsigned n = 0; n < 24; n++) {
- unsigned bit = 1 << n;
- if(mask & bit) continue;
- result |= (bool)(addr & bit) << length++;
+unsigned Bus::reduce(unsigned addr, unsigned mask)
+{
+ while (mask)
+ {
+ //extract the bits to keep
+ //set everything below the lowest set bit; 0x018000 -> 0x007FFF
+ unsigned tmp=((mask-1)&(~mask));
+
+ //shift everything above that
+ addr=(addr&tmp)|((addr>>1)&~tmp);
+
+ //adjust the mask
+ mask=(mask&(mask-1))>>1;
}
- return result;
+ return addr;
}
uint8 Bus::read(unsigned addr) {
- uint8 data = reader[lookup[addr]](target[addr]);
+ uint8 data;
+ if (fast_read[addr>>fast_page_size_bits]) data = fast_read[addr>>fast_page_size_bits][addr];
+ else data = reader[lookup[addr]](target[addr]);
+#ifndef __LIBRETRO__
if(cheat.enable()) {
if(auto result = cheat.find(addr, data)) return result();
}
+#endif
return data;
}
void Bus::write(unsigned addr, uint8 data) {
- return writer[lookup[addr]](target[addr], data);
+ if (fast_write[addr>>fast_page_size_bits]) fast_write[addr>>fast_page_size_bits][addr] = data;
+ else writer[lookup[addr]](target[addr], data);
}
diff -ru higan_v094-source/sfc/ppu/background/background.hpp bsneshle094/sfc/ppu/background/background.hpp
--- higan_v094-source/sfc/ppu/background/background.hpp 2013-05-05 09:31:28.000000000 +0200
+++ bsneshle094/sfc/ppu/background/background.hpp 2014-05-03 23:18:53.731330831 +0200
@@ -60,21 +60,21 @@
uint8 data[8];
};
- void frame();
- void scanline();
- void begin();
- void run(bool screen);
- void reset();
+ inline void frame();
+ inline void scanline();
+ inline void begin();
+ inline void run(bool screen);
+ inline void reset();
- void get_tile();
- unsigned get_tile_color();
- unsigned get_tile(unsigned x, unsigned y);
- signed clip(signed n);
- void begin_mode7();
- void run_mode7();
+ inline void get_tile();
+ inline unsigned get_tile_color();
+ inline unsigned get_tile(unsigned x, unsigned y);
+ inline signed clip(signed n);
+ inline void begin_mode7();
+ inline void run_mode7();
- void serialize(serializer&);
- Background(PPU& self, unsigned id);
+ inline void serialize(serializer&);
+ inline Background(PPU& self, unsigned id);
PPU& self;
friend class PPU;
diff -ru higan_v094-source/sfc/ppu/screen/screen.cpp bsneshle094/sfc/ppu/screen/screen.cpp
--- higan_v094-source/sfc/ppu/screen/screen.cpp 2013-12-17 04:58:08.000000000 +0100
+++ bsneshle094/sfc/ppu/screen/screen.cpp 2015-02-21 10:47:18.290028379 +0100
@@ -56,7 +56,8 @@
priority = self.sprite.output.sub.priority;
math.sub.color = get_color(self.sprite.output.sub.palette);
}
- if(math.transparent = (priority == 0)) math.sub.color = get_color(0);
+ math.transparent = (priority == 0);
+ if(math.transparent) math.sub.color = get_color(0);
if(!hires) return 0;
if(!math.sub.color_enable) return math.main.color_enable ? math.sub.color : 0;
diff -ru higan_v094-source/sfc/ppu/screen/screen.hpp bsneshle094/sfc/ppu/screen/screen.hpp
--- higan_v094-source/sfc/ppu/screen/screen.hpp 2013-05-05 09:36:42.000000000 +0200
+++ bsneshle094/sfc/ppu/screen/screen.hpp 2014-05-03 23:19:20.659331336 +0200
@@ -29,19 +29,19 @@
bool color_halve;
} math;
- void scanline();
- void run();
- void reset();
+ inline void scanline();
+ inline void run();
+ inline void reset();
- uint16 get_pixel_sub(bool hires);
- uint16 get_pixel_main();
- uint16 addsub(unsigned x, unsigned y);
- uint16 get_color(unsigned palette);
- uint16 get_direct_color(unsigned palette, unsigned tile);
- uint16 fixed_color() const;
+ inline uint16 get_pixel_sub(bool hires);
+ inline uint16 get_pixel_main();
+ inline uint16 addsub(unsigned x, unsigned y);
+ inline uint16 get_color(unsigned palette);
+ inline uint16 get_direct_color(unsigned palette, unsigned tile);
+ inline uint16 fixed_color() const;
- void serialize(serializer&);
- Screen(PPU& self);
+ inline void serialize(serializer&);
+ inline Screen(PPU& self);
PPU& self;
friend class PPU;
diff -ru higan_v094-source/sfc/ppu/sprite/sprite.hpp bsneshle094/sfc/ppu/sprite/sprite.hpp
--- higan_v094-source/sfc/ppu/sprite/sprite.hpp 2013-05-05 09:37:44.000000000 +0200
+++ bsneshle094/sfc/ppu/sprite/sprite.hpp 2014-05-03 23:18:08.691329985 +0200
@@ -60,22 +60,22 @@
} output;
//list.cpp
- void update(unsigned addr, uint8 data);
- void synchronize();
+ inline void update(unsigned addr, uint8 data);
+ inline void synchronize();
//sprite.cpp
- void address_reset();
- void set_first_sprite();
- void frame();
- void scanline();
- void run();
- void tilefetch();
- void reset();
+ inline void address_reset();
+ inline void set_first_sprite();
+ inline void frame();
+ inline void scanline();
+ inline void run();
+ inline void tilefetch();
+ inline void reset();
- bool on_scanline(SpriteItem&);
+ inline bool on_scanline(SpriteItem&);
- void serialize(serializer&);
- Sprite(PPU& self);
+ inline void serialize(serializer&);
+ inline Sprite(PPU& self);
PPU& self;
friend class PPU;
diff -ru higan_v094-source/sfc/ppu/window/window.hpp bsneshle094/sfc/ppu/window/window.hpp
--- higan_v094-source/sfc/ppu/window/window.hpp 2013-05-05 09:40:42.000000000 +0200
+++ bsneshle094/sfc/ppu/window/window.hpp 2014-05-03 23:19:37.315331649 +0200
@@ -69,19 +69,19 @@
bool two;
};
- void scanline();
- void run();
- void reset();
+ inline void scanline();
+ inline void run();
+ inline void reset();
- void test(
+ inline void test(
bool& main, bool& sub,
bool one_enable, bool one_invert,
bool two_enable, bool two_invert,
uint8 mask, bool main_enable, bool sub_enable
);
- void serialize(serializer&);
- Window(PPU& self);
+ inline void serialize(serializer&);
+ inline Window(PPU& self);
PPU& self;
friend class PPU;
diff -ru higan_v094-source/sfc/system/input.cpp bsneshle094/sfc/system/input.cpp
--- higan_v094-source/sfc/system/input.cpp 2013-11-09 06:34:32.000000000 +0100
+++ bsneshle094/sfc/system/input.cpp 2015-02-21 10:47:18.290028379 +0100
@@ -20,10 +20,10 @@
case Device::USART: controller = new USART(port); break;
}
- switch(port) {
- case Controller::Port1: configuration.controller_port1 = id; break;
- case Controller::Port2: configuration.controller_port2 = id; break;
- }
+ if (port == Controller::Port1)
+ configuration.controller_port1 = id;
+ else
+ configuration.controller_port2 = id;
}
Input::Input() {
diff -ru higan_v094-source/sfc/system/serialization.cpp bsneshle094/sfc/system/serialization.cpp
--- higan_v094-source/sfc/system/serialization.cpp 2013-05-05 09:48:32.000000000 +0200
+++ bsneshle094/sfc/system/serialization.cpp 2014-08-19 16:07:51.405809717 +0200
@@ -73,6 +73,13 @@
if(cartridge.has_hsu1()) hsu1.serialize(s);
if(cartridge.has_msu1()) msu1.serialize(s);
if(cartridge.has_st_slots()) sufamiturboA.serialize(s), sufamiturboB.serialize(s);
+ if(cartridge.has_dsp1()) dsp1.serialize(s);
+ if(cartridge.has_dsp2()) dsp2.serialize(s);
+ //if(cartridge.has_dsp3()) dsp3.serialize(s);
+ //if(cartridge.has_dsp4()) dsp4.serialize(s);
+ if(cartridge.has_cx4()) cx4.serialize(s);
+ if(cartridge.has_st0010()) st0010.serialize(s);
+ if(cartridge.has_sgbexternal()) sgbExternal.serialize(s);
}
//perform dry-run state save:
diff -ru higan_v094-source/sfc/system/system.cpp bsneshle094/sfc/system/system.cpp
--- higan_v094-source/sfc/system/system.cpp 2014-01-13 07:06:55.000000000 +0100
+++ bsneshle094/sfc/system/system.cpp 2014-08-19 17:20:40.337891738 +0200
@@ -83,6 +83,14 @@
msu1.init();
satellaviewcartridge.init();
+ dsp1.init();
+ dsp2.init();
+ dsp3.init();
+ dsp4.init();
+ cx4.init();
+ st0010.init();
+ sgbExternal.init();
+
video.init();
audio.init();
@@ -94,6 +102,9 @@
}
void System::load() {
+#ifdef __LIBRETRO__
+ interface->loadRequest(ID::IPLROM, "");
+#else
string manifest = string::read({interface->path(ID::System), "manifest.bml"});
auto document = Markup::Document(manifest);
@@ -101,6 +112,7 @@
if(!file::exists({interface->path(ID::System), document["system/smp/rom/name"].data})) {
interface->notify("Error: required Super Famicom firmware ipl.rom not found.\n");
}
+#endif
region = configuration.region;
expansion = configuration.expansion_port;
@@ -138,6 +150,13 @@
if(cartridge.has_msu1()) msu1.load();
if(cartridge.has_bs_slot()) satellaviewcartridge.load();
if(cartridge.has_st_slots()) sufamiturboA.load(), sufamiturboB.load();
+ if(cartridge.has_dsp1()) dsp1.load();
+ if(cartridge.has_dsp2()) dsp2.load();
+ if(cartridge.has_dsp3()) dsp3.load();
+ if(cartridge.has_dsp4()) dsp4.load();
+ if(cartridge.has_cx4()) cx4.load();
+ if(cartridge.has_st0010()) st0010.load();
+ if(cartridge.has_sgbexternal()) sgbExternal.load();
serialize_init();
}
@@ -162,6 +181,14 @@
if(cartridge.has_msu1()) msu1.unload();
if(cartridge.has_bs_slot()) satellaviewcartridge.unload();
if(cartridge.has_st_slots()) sufamiturboA.unload(), sufamiturboB.unload();
+
+ if(cartridge.has_dsp1()) dsp1.unload();
+ if(cartridge.has_dsp2()) dsp2.unload();
+ if(cartridge.has_dsp3()) dsp3.unload();
+ if(cartridge.has_dsp4()) dsp4.unload();
+ if(cartridge.has_cx4()) cx4.unload();
+ if(cartridge.has_st0010()) st0010.unload();
+ if(cartridge.has_sgbexternal()) sgbExternal.unload();
}
void System::power() {
@@ -191,6 +218,14 @@
if(cartridge.has_msu1()) msu1.power();
if(cartridge.has_bs_slot()) satellaviewcartridge.power();
+ if(cartridge.has_dsp1()) dsp1.power();
+ if(cartridge.has_dsp2()) dsp2.power();
+ if(cartridge.has_dsp3()) dsp3.power();
+ if(cartridge.has_dsp4()) dsp4.power();
+ if(cartridge.has_cx4()) cx4.power();
+ if(cartridge.has_st0010()) st0010.power();
+ if(cartridge.has_sgbexternal()) sgbExternal.power();
+
reset();
}
@@ -231,6 +266,15 @@
if(cartridge.has_spc7110()) cpu.coprocessors.append(&spc7110);
if(cartridge.has_msu1()) cpu.coprocessors.append(&msu1);
+ if(cartridge.has_dsp1()) dsp1.reset();
+ if(cartridge.has_dsp2()) dsp2.reset();
+ if(cartridge.has_dsp3()) dsp3.reset();
+ if(cartridge.has_dsp4()) dsp4.reset();
+ if(cartridge.has_cx4()) cx4.reset();
+ if(cartridge.has_st0010()) st0010.reset();
+ if(cartridge.has_sgbexternal()) sgbExternal.reset();
+ if(cartridge.has_sgbexternal()) cpu.coprocessors.append(&sgbExternal);
+
scheduler.init();
input.connect(0, configuration.controller_port1);
input.connect(1, configuration.controller_port2);
diff -ru higan_v094-source/sfc/system/video.cpp bsneshle094/sfc/system/video.cpp
--- higan_v094-source/sfc/system/video.cpp 2013-12-21 07:49:58.000000000 +0100
+++ bsneshle094/sfc/system/video.cpp 2015-02-21 10:47:18.290028379 +0100
@@ -121,6 +121,8 @@
draw_cursor(0x02e0, device.player2.x, device.player2.y);
}
break;
+ default:
+ break;
}
uint32_t* data = (uint32_t*)ppu.output;
diff -ru higan_v094-source/target-ethos/Makefile bsneshle094/target-ethos/Makefile
--- higan_v094-source/target-ethos/Makefile 2014-01-13 06:26:29.000000000 +0100
+++ bsneshle094/target-ethos/Makefile 2015-04-23 17:11:57.475859018 +0200
@@ -43,6 +43,8 @@
# rules
objects := $(ui_objects) $(objects)
objects := $(patsubst %,obj/%.o,$(objects))
+sfc_objects := $(patsubst %,obj/%-$(profile).o,$(sfc_objects))
+objects += $(sfc_objects)
obj/ui-ethos.o: $(ui)/ethos.cpp $(call rwildcard,$(ui)/)
obj/ui-configuration.o: $(ui)/configuration/configuration.cpp $(call rwildcard,$(ui)/)
Only in bsneshle094: target-libretro