Update to v088r08 release.
byuu says:
From this WIP, I'm starting on the impossible task of
a declarative-based GUI, which I'm calling Ethos.
base/ becomes emulator/, and we add emulator/interface.hpp, which is
a base API that all emulation cores must implement in full.
(Right now, it's kind of a hybrid to work with the old GUI and the new
GUI at the same time, of course.)
Unlike the old interfaces, the new base class also provides all general
usability hooks: loading and saving files and states, cheat codes, etc.
The new interface also contains information and vector structs to
describe all possible loading methods, controller bindings, etc; and
gives names for them all.
The actual GUI in fact should not include eg <gba/gba.hpp> anymore.
Should speed up GUI compilation.
So the idea going forward is that ethos will build a list of emulators
right when the application starts up.
Once you've appended an emulator to that list, you're done. No more GUI
changes are needed to support that system.
The GUI will have code to parse the emulator interfaces list, and build
all the requisite GUI options dynamically, declarative style.
Ultimately, once the project is finished, the new GUI should look ~99%
identical to the current GUI. But it'll probably be a whole lot smaller.
2012-04-29 06:29:54 +00:00
|
|
|
#ifndef EMULATOR_HPP
|
|
|
|
#define EMULATOR_HPP
|
2012-02-06 12:03:45 +00:00
|
|
|
|
2015-06-18 10:48:53 +00:00
|
|
|
#include <nall/nall.hpp>
|
|
|
|
#include <nall/dsp.hpp>
|
|
|
|
#include <nall/priority-queue.hpp>
|
|
|
|
using namespace nall;
|
|
|
|
|
Update to v088r10 release.
byuu says:
ethos is going to be absolutely amazing. You guys are in for a treat :D
I'm impressing the hell out of myself with how well-structured this code
is, it's allowing me to do amazing new things.
Just a small sampling of what's in store (and already implemented):
The file browser will display folders as "[ folder name ]", and
cartridge folders as "Game Name" (no extension, no /) [icons would be
nicer, but well ... phoenix.]
Folders are sorted above cartridge folders.
Cartridge folders for other systems do not show up in the list.
Not only are unique paths stored for each image type, your position in
the list is saved across runs.
Some voodoo was added to GTK+ so that all targets even scroll directly
to that item when you open the list. Load->System->Enter restarts your
last game.
That sounds really simple and obvious, but it makes an -incredible-
difference. Didn't realize it until I tried an implementation of it,
wow.
The input mapping list now lets you bind as many hotkeys as you want to
any given input.
So SFC::Port1::Joypad::B = Keyboard::Z or Joypad::Button1 ... no need to
remap everything to switch between keyboard and joypad. Either one
activates the key.
There is a separate Hotkeys tab now. This should hopefully end the
confusion about how to remap hotkeys that users experience.
Hotkeys are different, too. Instead of OR logic, they use AND logic.
So Fullscreen = Keyboard::Alt and Keyboard::Enter. Both must be pressed
to enter the key. This lets you easily implement "super" modifier keys.
The actual codebase has new features the old UI never had, and has about
~50% of the old functionality (so far, of course), yet is only ~25% as
much code.
The entire GUI no longer needs to pull in all the headers for each
emulated system. It just needs a small interface header file.
Then bind the entire system with exactly **two** lines of code.
Everything is dynamically generated for you after that.
2012-04-30 23:43:23 +00:00
|
|
|
namespace Emulator {
|
2015-06-18 10:48:53 +00:00
|
|
|
static const string Name = "higan";
|
2015-07-02 10:22:24 +00:00
|
|
|
static const string Version = "094.36";
|
2015-06-18 10:48:53 +00:00
|
|
|
static const string Author = "byuu";
|
|
|
|
static const string License = "GPLv3";
|
|
|
|
static const string Website = "http://byuu.org/";
|
2013-03-21 12:59:01 +00:00
|
|
|
|
|
|
|
#if defined(PROFILE_ACCURACY)
|
2015-06-18 10:48:53 +00:00
|
|
|
static const string Profile = "Accuracy";
|
2013-03-21 12:59:01 +00:00
|
|
|
#elif defined(PROFILE_BALANCED)
|
2015-06-18 10:48:53 +00:00
|
|
|
static const string Profile = "Balanced";
|
2013-03-21 12:59:01 +00:00
|
|
|
#elif defined(PROFILE_PERFORMANCE)
|
2015-06-18 10:48:53 +00:00
|
|
|
static const string Profile = "Performance";
|
2013-03-21 12:59:01 +00:00
|
|
|
#endif
|
Update to v088r10 release.
byuu says:
ethos is going to be absolutely amazing. You guys are in for a treat :D
I'm impressing the hell out of myself with how well-structured this code
is, it's allowing me to do amazing new things.
Just a small sampling of what's in store (and already implemented):
The file browser will display folders as "[ folder name ]", and
cartridge folders as "Game Name" (no extension, no /) [icons would be
nicer, but well ... phoenix.]
Folders are sorted above cartridge folders.
Cartridge folders for other systems do not show up in the list.
Not only are unique paths stored for each image type, your position in
the list is saved across runs.
Some voodoo was added to GTK+ so that all targets even scroll directly
to that item when you open the list. Load->System->Enter restarts your
last game.
That sounds really simple and obvious, but it makes an -incredible-
difference. Didn't realize it until I tried an implementation of it,
wow.
The input mapping list now lets you bind as many hotkeys as you want to
any given input.
So SFC::Port1::Joypad::B = Keyboard::Z or Joypad::Button1 ... no need to
remap everything to switch between keyboard and joypad. Either one
activates the key.
There is a separate Hotkeys tab now. This should hopefully end the
confusion about how to remap hotkeys that users experience.
Hotkeys are different, too. Instead of OR logic, they use AND logic.
So Fullscreen = Keyboard::Alt and Keyboard::Enter. Both must be pressed
to enter the key. This lets you easily implement "super" modifier keys.
The actual codebase has new features the old UI never had, and has about
~50% of the old functionality (so far, of course), yet is only ~25% as
much code.
The entire GUI no longer needs to pull in all the headers for each
emulated system. It just needs a small interface header file.
Then bind the entire system with exactly **two** lines of code.
Everything is dynamically generated for you after that.
2012-04-30 23:43:23 +00:00
|
|
|
}
|
2012-02-06 12:03:45 +00:00
|
|
|
|
Update to v088r08 release.
byuu says:
From this WIP, I'm starting on the impossible task of
a declarative-based GUI, which I'm calling Ethos.
base/ becomes emulator/, and we add emulator/interface.hpp, which is
a base API that all emulation cores must implement in full.
(Right now, it's kind of a hybrid to work with the old GUI and the new
GUI at the same time, of course.)
Unlike the old interfaces, the new base class also provides all general
usability hooks: loading and saving files and states, cheat codes, etc.
The new interface also contains information and vector structs to
describe all possible loading methods, controller bindings, etc; and
gives names for them all.
The actual GUI in fact should not include eg <gba/gba.hpp> anymore.
Should speed up GUI compilation.
So the idea going forward is that ethos will build a list of emulators
right when the application starts up.
Once you've appended an emulator to that list, you're done. No more GUI
changes are needed to support that system.
The GUI will have code to parse the emulator interfaces list, and build
all the requisite GUI options dynamically, declarative style.
Ultimately, once the project is finished, the new GUI should look ~99%
identical to the current GUI. But it'll probably be a whole lot smaller.
2012-04-29 06:29:54 +00:00
|
|
|
#include "interface.hpp"
|
|
|
|
|
2012-02-06 12:03:45 +00:00
|
|
|
//debugging function hook:
|
|
|
|
//no overhead (and no debugger invocation) if not compiled with -DDEBUGGER
|
|
|
|
//wraps testing of function to allow invocation without a defined callback
|
|
|
|
template<typename T> struct hook;
|
|
|
|
template<typename R, typename... P> struct hook<R (P...)> {
|
|
|
|
function<R (P...)> callback;
|
|
|
|
|
2015-06-15 22:26:47 +00:00
|
|
|
auto operator()(P... p) const -> R {
|
2012-02-06 12:03:45 +00:00
|
|
|
#if defined(DEBUGGER)
|
2015-06-28 08:44:56 +00:00
|
|
|
if(callback) return callback(forward<P>(p)...);
|
2012-02-06 12:03:45 +00:00
|
|
|
#endif
|
|
|
|
return R();
|
|
|
|
}
|
|
|
|
|
|
|
|
hook() {}
|
2013-05-02 11:25:45 +00:00
|
|
|
hook(const hook& hook) { callback = hook.callback; }
|
|
|
|
hook(void* function) { callback = function; }
|
2012-02-06 12:03:45 +00:00
|
|
|
hook(R (*function)(P...)) { callback = function; }
|
2013-05-02 11:25:45 +00:00
|
|
|
template<typename C> hook(R (C::*function)(P...), C* object) { callback = {function, object}; }
|
|
|
|
template<typename C> hook(R (C::*function)(P...) const, C* object) { callback = {function, object}; }
|
2012-02-06 12:03:45 +00:00
|
|
|
template<typename L> hook(const L& function) { callback = function; }
|
2012-02-09 12:53:55 +00:00
|
|
|
|
2015-06-15 22:26:47 +00:00
|
|
|
auto operator=(const hook& source) -> hook& { callback = source.callback; return *this; }
|
2012-02-06 12:03:45 +00:00
|
|
|
};
|
|
|
|
|
2012-02-09 12:53:55 +00:00
|
|
|
#if defined(DEBUGGER)
|
|
|
|
#define privileged public
|
|
|
|
#else
|
|
|
|
#define privileged private
|
|
|
|
#endif
|
|
|
|
|
Update to v087r30 release.
byuu says:
Changelog:
- DMA channel masks added (some are 27-bit source/target and some are
14-bit length -- hooray, varuint_t class.)
- No more state.pending flags. Instead, we set dma.pending flag when we
want a transfer (fixes GBA Video - Pokemon audio) [Cydrak]
- fixed OBJ Vmosaic [Cydrak, krom]
- OBJ cannot read <=0x13fff in BG modes 3-5 (fixes the garbled tile at
the top-left of some games)
- DMA timing should be much closer to hardware now, but probably not
perfect
- PPU frame blending uses blargg's bit-perfect, rounded method (slower,
but what can you do?)
- GBA carts really unload now
- added nall/gba/cartridge.hpp: used when there is no manifest. Scans
ROMs for library tags, and selects the first valid one found
- added EEPROM auto-detection when EEPROM size=0. Forces disk/save state
size to 8192 (otherwise states could crash between pre and post
detect.)
- detects first read after a set read address command when the size
is zero, and sets all subsequent bit-lengths to that value, prints
detected size to terminal
- added nall/nes/cartridge.hpp: moves iNES detection out of emulation
core.
Important to note: long-term goal is to remove all
nall/(system)/cartridge.hpp detections from the core and replace with
databases. All in good time.
Anyway, the GBA workarounds should work for ~98.5% of the library, if my
pre-scanning was correct (~40 games with odd tags. I reject ones without
numeric versions now, too.)
I think we're basically at a point where we can release a new version
now. Compatibility should be relatively high (at least for a first
release), and fixes are only going to affect one or two games at a time.
I'd like to start doing some major cleaning house internally (rename
NES->Famicom, SNES->SuperFamicom and such.) Would be much wiser to do
that on a .01 WIP to minimize regressions.
The main problems with a release now:
- speed is pretty bad, haven't really optimized much yet (not sure how
much we can improve it yet, this usually isn't easy)
- sound isn't -great-, but the GBA audio sucks anyway :P
- couple of known bugs (Sonic X video, etc.)
2012-04-22 10:49:19 +00:00
|
|
|
typedef int1_t int1;
|
|
|
|
typedef int2_t int2;
|
|
|
|
typedef int3_t int3;
|
|
|
|
typedef int4_t int4;
|
|
|
|
typedef int5_t int5;
|
|
|
|
typedef int6_t int6;
|
|
|
|
typedef int7_t int7;
|
|
|
|
typedef int8_t int8;
|
|
|
|
typedef int9_t int9;
|
Update to v085r08 release.
byuu says:
Changelog:
- follow the Laevateinn topic to get most of it
- also added NMI, IRQ step buttons to CPU debugger
- also added trace masking + trace mask reset
- also added memory export
- cartridge loading is entirely folder-based now
FitzRoy, I'll go ahead and make a second compromise with you for v086:
I'll match the following:
/path/to/SNES.sfc/*.sfc
/path/to/NES.fc/*.prg, *.chr (split format)
/path/to/NES.fc/*.fc (merged format)
/path/to/GB.gb/*.gb
/path/to/GBC.gbc/*.gbc
Condition will be that there can only be one of each file. If there's
more than one, it'll abort. That lets me name my ROMs as
"Game.fc/Game.fc", and you can name yours as "Game.fc/cartridge.prg,
cartridge.chr". Or whatever you want.
We'll just go with that, see what fares out as the most popular, and
then restrict it back to that method.
The folder must have the .fc, etc extension though. That will be how we
avoid false-positive folder matches.
[Editor's note - the Laevateinn topic mentions these changes for
v085r08:
Added SMP/PPU breakpoints, SMP debugger, SMP stepping / tracing,
memory editing on APU-bus / VRAM / OAM / CGRAM, save state menu,
WRAM mirroring on breakpoints, protected MMIO memory regions
(otherwise, viewing $002100 could crash your game.)
Major missing components:
- trace mask
- trace mask clear / usage map clear
- window geometry caching / sizing improvements
- VRAM viewer
- properties viewer
- working memory export button
The rest will most likely appear after v086 is released.
]
2012-02-12 05:35:40 +00:00
|
|
|
typedef int10_t int10;
|
|
|
|
typedef int11_t int11;
|
|
|
|
typedef int12_t int12;
|
|
|
|
typedef int13_t int13;
|
|
|
|
typedef int14_t int14;
|
|
|
|
typedef int15_t int15;
|
|
|
|
typedef int16_t int16;
|
|
|
|
typedef int17_t int17;
|
|
|
|
typedef int18_t int18;
|
|
|
|
typedef int19_t int19;
|
|
|
|
typedef int20_t int20;
|
|
|
|
typedef int21_t int21;
|
|
|
|
typedef int22_t int22;
|
|
|
|
typedef int23_t int23;
|
|
|
|
typedef int24_t int24;
|
|
|
|
typedef int25_t int25;
|
|
|
|
typedef int26_t int26;
|
|
|
|
typedef int27_t int27;
|
|
|
|
typedef int28_t int28;
|
|
|
|
typedef int29_t int29;
|
|
|
|
typedef int30_t int30;
|
|
|
|
typedef int31_t int31;
|
|
|
|
typedef int32_t int32;
|
|
|
|
typedef int64_t int64;
|
2012-02-06 12:03:45 +00:00
|
|
|
|
Update to v087r30 release.
byuu says:
Changelog:
- DMA channel masks added (some are 27-bit source/target and some are
14-bit length -- hooray, varuint_t class.)
- No more state.pending flags. Instead, we set dma.pending flag when we
want a transfer (fixes GBA Video - Pokemon audio) [Cydrak]
- fixed OBJ Vmosaic [Cydrak, krom]
- OBJ cannot read <=0x13fff in BG modes 3-5 (fixes the garbled tile at
the top-left of some games)
- DMA timing should be much closer to hardware now, but probably not
perfect
- PPU frame blending uses blargg's bit-perfect, rounded method (slower,
but what can you do?)
- GBA carts really unload now
- added nall/gba/cartridge.hpp: used when there is no manifest. Scans
ROMs for library tags, and selects the first valid one found
- added EEPROM auto-detection when EEPROM size=0. Forces disk/save state
size to 8192 (otherwise states could crash between pre and post
detect.)
- detects first read after a set read address command when the size
is zero, and sets all subsequent bit-lengths to that value, prints
detected size to terminal
- added nall/nes/cartridge.hpp: moves iNES detection out of emulation
core.
Important to note: long-term goal is to remove all
nall/(system)/cartridge.hpp detections from the core and replace with
databases. All in good time.
Anyway, the GBA workarounds should work for ~98.5% of the library, if my
pre-scanning was correct (~40 games with odd tags. I reject ones without
numeric versions now, too.)
I think we're basically at a point where we can release a new version
now. Compatibility should be relatively high (at least for a first
release), and fixes are only going to affect one or two games at a time.
I'd like to start doing some major cleaning house internally (rename
NES->Famicom, SNES->SuperFamicom and such.) Would be much wiser to do
that on a .01 WIP to minimize regressions.
The main problems with a release now:
- speed is pretty bad, haven't really optimized much yet (not sure how
much we can improve it yet, this usually isn't easy)
- sound isn't -great-, but the GBA audio sucks anyway :P
- couple of known bugs (Sonic X video, etc.)
2012-04-22 10:49:19 +00:00
|
|
|
typedef uint1_t uint1;
|
|
|
|
typedef uint2_t uint2;
|
|
|
|
typedef uint3_t uint3;
|
|
|
|
typedef uint4_t uint4;
|
|
|
|
typedef uint5_t uint5;
|
|
|
|
typedef uint6_t uint6;
|
|
|
|
typedef uint7_t uint7;
|
|
|
|
typedef uint8_t uint8;
|
|
|
|
typedef uint9_t uint9;
|
Update to v085r08 release.
byuu says:
Changelog:
- follow the Laevateinn topic to get most of it
- also added NMI, IRQ step buttons to CPU debugger
- also added trace masking + trace mask reset
- also added memory export
- cartridge loading is entirely folder-based now
FitzRoy, I'll go ahead and make a second compromise with you for v086:
I'll match the following:
/path/to/SNES.sfc/*.sfc
/path/to/NES.fc/*.prg, *.chr (split format)
/path/to/NES.fc/*.fc (merged format)
/path/to/GB.gb/*.gb
/path/to/GBC.gbc/*.gbc
Condition will be that there can only be one of each file. If there's
more than one, it'll abort. That lets me name my ROMs as
"Game.fc/Game.fc", and you can name yours as "Game.fc/cartridge.prg,
cartridge.chr". Or whatever you want.
We'll just go with that, see what fares out as the most popular, and
then restrict it back to that method.
The folder must have the .fc, etc extension though. That will be how we
avoid false-positive folder matches.
[Editor's note - the Laevateinn topic mentions these changes for
v085r08:
Added SMP/PPU breakpoints, SMP debugger, SMP stepping / tracing,
memory editing on APU-bus / VRAM / OAM / CGRAM, save state menu,
WRAM mirroring on breakpoints, protected MMIO memory regions
(otherwise, viewing $002100 could crash your game.)
Major missing components:
- trace mask
- trace mask clear / usage map clear
- window geometry caching / sizing improvements
- VRAM viewer
- properties viewer
- working memory export button
The rest will most likely appear after v086 is released.
]
2012-02-12 05:35:40 +00:00
|
|
|
typedef uint10_t uint10;
|
|
|
|
typedef uint11_t uint11;
|
|
|
|
typedef uint12_t uint12;
|
|
|
|
typedef uint13_t uint13;
|
|
|
|
typedef uint14_t uint14;
|
|
|
|
typedef uint15_t uint15;
|
|
|
|
typedef uint16_t uint16;
|
|
|
|
typedef uint17_t uint17;
|
|
|
|
typedef uint18_t uint18;
|
|
|
|
typedef uint19_t uint19;
|
|
|
|
typedef uint20_t uint20;
|
|
|
|
typedef uint21_t uint21;
|
|
|
|
typedef uint22_t uint22;
|
|
|
|
typedef uint23_t uint23;
|
|
|
|
typedef uint24_t uint24;
|
|
|
|
typedef uint25_t uint25;
|
|
|
|
typedef uint26_t uint26;
|
|
|
|
typedef uint27_t uint27;
|
|
|
|
typedef uint28_t uint28;
|
|
|
|
typedef uint29_t uint29;
|
|
|
|
typedef uint30_t uint30;
|
|
|
|
typedef uint31_t uint31;
|
|
|
|
typedef uint32_t uint32;
|
2012-02-29 12:59:48 +00:00
|
|
|
typedef uint_t<33> uint33;
|
Update to v085r08 release.
byuu says:
Changelog:
- follow the Laevateinn topic to get most of it
- also added NMI, IRQ step buttons to CPU debugger
- also added trace masking + trace mask reset
- also added memory export
- cartridge loading is entirely folder-based now
FitzRoy, I'll go ahead and make a second compromise with you for v086:
I'll match the following:
/path/to/SNES.sfc/*.sfc
/path/to/NES.fc/*.prg, *.chr (split format)
/path/to/NES.fc/*.fc (merged format)
/path/to/GB.gb/*.gb
/path/to/GBC.gbc/*.gbc
Condition will be that there can only be one of each file. If there's
more than one, it'll abort. That lets me name my ROMs as
"Game.fc/Game.fc", and you can name yours as "Game.fc/cartridge.prg,
cartridge.chr". Or whatever you want.
We'll just go with that, see what fares out as the most popular, and
then restrict it back to that method.
The folder must have the .fc, etc extension though. That will be how we
avoid false-positive folder matches.
[Editor's note - the Laevateinn topic mentions these changes for
v085r08:
Added SMP/PPU breakpoints, SMP debugger, SMP stepping / tracing,
memory editing on APU-bus / VRAM / OAM / CGRAM, save state menu,
WRAM mirroring on breakpoints, protected MMIO memory regions
(otherwise, viewing $002100 could crash your game.)
Major missing components:
- trace mask
- trace mask clear / usage map clear
- window geometry caching / sizing improvements
- VRAM viewer
- properties viewer
- working memory export button
The rest will most likely appear after v086 is released.
]
2012-02-12 05:35:40 +00:00
|
|
|
typedef uint64_t uint64;
|
2012-02-06 12:03:45 +00:00
|
|
|
|
Update to v087r30 release.
byuu says:
Changelog:
- DMA channel masks added (some are 27-bit source/target and some are
14-bit length -- hooray, varuint_t class.)
- No more state.pending flags. Instead, we set dma.pending flag when we
want a transfer (fixes GBA Video - Pokemon audio) [Cydrak]
- fixed OBJ Vmosaic [Cydrak, krom]
- OBJ cannot read <=0x13fff in BG modes 3-5 (fixes the garbled tile at
the top-left of some games)
- DMA timing should be much closer to hardware now, but probably not
perfect
- PPU frame blending uses blargg's bit-perfect, rounded method (slower,
but what can you do?)
- GBA carts really unload now
- added nall/gba/cartridge.hpp: used when there is no manifest. Scans
ROMs for library tags, and selects the first valid one found
- added EEPROM auto-detection when EEPROM size=0. Forces disk/save state
size to 8192 (otherwise states could crash between pre and post
detect.)
- detects first read after a set read address command when the size
is zero, and sets all subsequent bit-lengths to that value, prints
detected size to terminal
- added nall/nes/cartridge.hpp: moves iNES detection out of emulation
core.
Important to note: long-term goal is to remove all
nall/(system)/cartridge.hpp detections from the core and replace with
databases. All in good time.
Anyway, the GBA workarounds should work for ~98.5% of the library, if my
pre-scanning was correct (~40 games with odd tags. I reject ones without
numeric versions now, too.)
I think we're basically at a point where we can release a new version
now. Compatibility should be relatively high (at least for a first
release), and fixes are only going to affect one or two games at a time.
I'd like to start doing some major cleaning house internally (rename
NES->Famicom, SNES->SuperFamicom and such.) Would be much wiser to do
that on a .01 WIP to minimize regressions.
The main problems with a release now:
- speed is pretty bad, haven't really optimized much yet (not sure how
much we can improve it yet, this usually isn't easy)
- sound isn't -great-, but the GBA audio sucks anyway :P
- couple of known bugs (Sonic X video, etc.)
2012-04-22 10:49:19 +00:00
|
|
|
typedef varuint_t<unsigned> varuint;
|
2012-02-06 12:03:45 +00:00
|
|
|
|
|
|
|
#endif
|