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 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 #include +#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 +#else #include +#endif #include #include #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 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 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 has_obc1; readonly has_hsu1; readonly has_msu1; + readonly has_dsp1; + readonly has_dsp2; + readonly has_dsp3; + readonly has_dsp4; + readonly has_cx4; + readonly has_st0010; + readonly has_sgbexternal; struct Mapping { function 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&, const function&); 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& reader, const function& 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 #include +#include +#include +#include +#include + +#include +#include + +#include + 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 #define MEMORY_CPP + namespace SuperFamicom { Bus bus; @@ -10,22 +11,73 @@ const function& 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 reader = [](unsigned) { return cpu.regs.mdr; }; function 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 reader[256]; function 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& reader, const function& 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 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