Make the SNES rate specials methods

This commit is contained in:
Ilari Liusvaara 2013-01-05 16:28:09 +02:00
parent 315d1620b3
commit 4641b640c4
7 changed files with 35 additions and 29 deletions

View file

@ -12,10 +12,6 @@
#include "interface/romtype.hpp"
//Get the CPU rate.
uint32_t get_snes_cpu_rate();
//Get the APU rate.
uint32_t get_snes_apu_rate();
//Get the core identifier.
std::string get_core_identifier();
//Do basic core initialization (to get it to stable state).

View file

@ -52,6 +52,7 @@ struct core_type_params
bool (*set_region)(core_region& region);
std::pair<uint32_t, uint32_t> (*video_rate)();
std::pair<uint32_t, uint32_t> (*audio_rate)();
std::pair<uint32_t, uint32_t> (*snes_rate)();
};
struct core_region
@ -120,6 +121,7 @@ public:
bool set_region(core_region& region);
std::pair<uint32_t, uint32_t> get_video_rate();
std::pair<uint32_t, uint32_t> get_audio_rate();
std::pair<uint32_t, uint32_t> get_snes_rate(); //(0,0) for non-SNES.
private:
core_type(const core_type&);
core_type& operator=(const core_type&);
@ -129,6 +131,7 @@ private:
bool (*_set_region)(core_region& region);
std::pair<uint32_t, uint32_t> (*_video_rate)();
std::pair<uint32_t, uint32_t> (*_audio_rate)();
std::pair<uint32_t, uint32_t> (*_snes_rate)();
unsigned id;
unsigned reset_support;
std::string iname;

View file

@ -81,6 +81,11 @@ namespace
const char* justifier_name = "justifier";
const char* gamepad16_name = "gamepad16";
std::pair<uint32_t, uint32_t> snes_rate()
{
return std::make_pair(SNES::system.cpu_frequency(), SNES::system.apu_frequency());
}
port_controller_button gamepad_btn_B = {port_controller_button::TYPE_BUTTON, "B"};
port_controller_button gamepad_btn_Y = {port_controller_button::TYPE_BUTTON, "Y"};
port_controller_button gamepad_btn_s = {port_controller_button::TYPE_BUTTON, "select"};
@ -661,7 +666,7 @@ namespace
div = last_interlace ? DURATION_PAL_FIELD : DURATION_PAL_FRAME;
else
div = last_interlace ? DURATION_NTSC_FIELD : DURATION_NTSC_FRAME;
return std::make_pair(get_snes_cpu_rate(), div);
return std::make_pair(SNES::system.cpu_frequency(), div);
}
//Get the current audio rate.
@ -669,33 +674,33 @@ namespace
{
if(!internal_rom)
return std::make_pair(64081, 2);
return std::make_pair(get_snes_apu_rate(), static_cast<uint32_t>(768));
return std::make_pair(SNES::system.apu_frequency(), static_cast<uint32_t>(768));
}
core_type_params _type_snes = {
"snes", "SNES", 0, BSNES_RESET_LEVEL , load_rom_snes, _controllerconfig,
"sfc;smc;swc;fig;ufo;sf2;gd3;gd7;dx2;mgd;mgh", NULL, _all_regions, snes_images, &bsnes_settings,
core_set_region, get_video_rate, get_audio_rate
core_set_region, get_video_rate, get_audio_rate, snes_rate
};
core_type_params _type_bsx = {
"bsx", "BS-X (non-slotted)", 1, BSNES_RESET_LEVEL , load_rom_bsx, _controllerconfig,
"bs", "bsx.sfc", _ntsconly, bsx_images, &bsnes_settings, core_set_region, get_video_rate,
get_audio_rate
get_audio_rate, snes_rate
};
core_type_params _type_bsxslotted = {
"bsxslotted", "BS-X (slotted)", 2, BSNES_RESET_LEVEL , load_rom_bsxslotted, _controllerconfig,
"bss", "bsxslotted.sfc", _ntsconly, bsxs_images, &bsnes_settings, core_set_region, get_video_rate,
get_audio_rate
get_audio_rate, snes_rate
};
core_type_params _type_sufamiturbo = {
"sufamiturbo", "Sufami Turbo", 3, BSNES_RESET_LEVEL , load_rom_sufamiturbo, _controllerconfig,
"st", "sufamiturbo.sfc", _ntsconly, bsxs_images, &bsnes_settings, core_set_region, get_video_rate,
get_audio_rate
get_audio_rate, snes_rate
};
core_type_params _type_sgb = {
"sgb", "Super Game Boy", 4, BSNES_RESET_LEVEL , load_rom_sgb, _controllerconfig,
"gb;dmg;sgb", "sgb.sfc", _all_regions, sgb_images, &bsnes_settings, core_set_region, get_video_rate,
get_audio_rate
get_audio_rate, snes_rate
};
core_type type_snes(_type_snes);
@ -995,16 +1000,6 @@ void core_uninstall_handler()
SNES::interface = old;
}
uint32_t get_snes_cpu_rate()
{
return SNES::system.cpu_frequency();
}
uint32_t get_snes_apu_rate()
{
return SNES::system.apu_frequency();
}
std::string get_core_identifier()
{
std::ostringstream x;

View file

@ -307,15 +307,18 @@ namespace
core_type_params _type_dmg = {
"dmg", "Game Boy", 1, 1, load_rom_dmg, _controllerconfig, "gb;dmg", NULL,
regions_gambatte, dmg_images, &gambatte_settings, core_set_region, get_video_rate, get_audio_rate
regions_gambatte, dmg_images, &gambatte_settings, core_set_region, get_video_rate, get_audio_rate,
NULL
};
core_type_params _type_gbc = {
"gbc", "Game Boy Color", 0, 1, load_rom_gbc, _controllerconfig, "gbc;cgb", NULL,
regions_gambatte, gbc_images, &gambatte_settings, core_set_region, get_video_rate, get_audio_rate
regions_gambatte, gbc_images, &gambatte_settings, core_set_region, get_video_rate, get_audio_rate,
NULL
};
core_type_params _type_gbc_gba = {
"gbc_gba", "Game Boy Color (GBA)", 2, 1, load_rom_gbc_gba, _controllerconfig, "", NULL,
regions_gambatte, gbca_images, &gambatte_settings, core_set_region, get_video_rate, get_audio_rate
regions_gambatte, gbca_images, &gambatte_settings, core_set_region, get_video_rate, get_audio_rate,
NULL
};
core_type type_dmg(_type_dmg);
core_type type_gbc(_type_gbc);
@ -336,8 +339,6 @@ std::string get_logical_button_name(unsigned lbid) throw(std::bad_alloc)
return buttonnames[lbid];
}
uint32_t get_snes_cpu_rate() { return 0; }
uint32_t get_snes_apu_rate() { return 0; }
std::string get_core_identifier()
{
return "libgambatte "+gambatte::GB::version();

View file

@ -98,7 +98,7 @@ namespace
core_type_params _type_null = {
"null", "(null)", 9999, 0, load_rom_null, null_controllerconfig,
"", NULL, null_regions, null_images, &null_settings, set_region_null,
videorate_null, audiorate_null
videorate_null, audiorate_null, NULL
};
core_type type_null(_type_null);
core_sysregion sysregion_null("null", type_null, null_region);

View file

@ -127,6 +127,7 @@ core_type::core_type(core_type_params& params)
_set_region = params.set_region;
_audio_rate = params.audio_rate;
_video_rate = params.video_rate;
_snes_rate = params.snes_rate;
settings = params.settings;
if(params.bios)
biosname = params.bios;
@ -266,6 +267,14 @@ std::pair<uint32_t, uint32_t> core_type::get_audio_rate()
return _audio_rate();
}
std::pair<uint32_t, uint32_t> core_type::get_snes_rate()
{
if(_snes_rate)
return _snes_rate();
else
return std::make_pair(0, 0);
}
core_sysregion::core_sysregion(const std::string& _name, core_type& _type, core_region& _region)
: name(_name), type(_type), region(_region)

View file

@ -4,6 +4,7 @@
#include "core/advdumper.hpp"
#include "core/dispatch.hpp"
#include "core/emucore.hpp"
#include "core/moviedata.hpp"
#include "library/serialization.hpp"
#include "video/tcp.hpp"
@ -83,8 +84,9 @@ namespace
if(!*out)
throw std::runtime_error("Failed to open '" + str2 + "'");
write32ube(tbuffer, 0x53444D50U);
write32ube(tbuffer + 4, get_snes_cpu_rate());
write32ube(tbuffer + 8, get_snes_apu_rate());
auto rates = our_rom->rtype->get_snes_rate();
write32ube(tbuffer + 4, rates.first);
write32ube(tbuffer + 8, rates.second);
out->write(reinterpret_cast<char*>(tbuffer), 12);
if(!*out)
throw std::runtime_error("Failed to write header to '" + str2 + "'");