Update to v091r10 release.

byuu says:

This release adds HSU1 support, and fixes the reduce() memory mapping
function.
This commit is contained in:
Tim Allen
2012-11-02 21:37:38 +11:00
parent ab345ff20c
commit d4751c5244
25 changed files with 205 additions and 10 deletions

View File

@@ -3,7 +3,7 @@
namespace Emulator { namespace Emulator {
static const char Name[] = "higan"; static const char Name[] = "higan";
static const char Version[] = "091.09"; static const char Version[] = "091.10";
static const char Author[] = "byuu"; static const char Author[] = "byuu";
static const char License[] = "GPLv3"; static const char License[] = "GPLv3";
} }

View File

@@ -56,6 +56,7 @@ struct Interface {
virtual void audioSample(int16_t, int16_t) {} virtual void audioSample(int16_t, int16_t) {}
virtual int16_t inputPoll(unsigned, unsigned, unsigned) { return 0; } virtual int16_t inputPoll(unsigned, unsigned, unsigned) { return 0; }
virtual unsigned dipSettings(const Markup::Node&) { return 0; } virtual unsigned dipSettings(const Markup::Node&) { return 0; }
virtual string scoreServer() { return ""; }
virtual string path(unsigned) { return ""; } virtual string path(unsigned) { return ""; }
virtual void notify(const string &text) { print(text, "\n"); } virtual void notify(const string &text) { print(text, "\n"); }
} *bind; } *bind;
@@ -69,6 +70,7 @@ struct Interface {
void audioSample(int16_t lsample, int16_t rsample) { return bind->audioSample(lsample, rsample); } void audioSample(int16_t lsample, int16_t rsample) { return bind->audioSample(lsample, rsample); }
int16_t inputPoll(unsigned port, unsigned device, unsigned input) { return bind->inputPoll(port, device, input); } int16_t inputPoll(unsigned port, unsigned device, unsigned input) { return bind->inputPoll(port, device, input); }
unsigned dipSettings(const Markup::Node &node) { return bind->dipSettings(node); } unsigned dipSettings(const Markup::Node &node) { return bind->dipSettings(node); }
string scoreServer() { return bind->scoreServer(); }
string path(unsigned group) { return bind->path(group); } string path(unsigned group) { return bind->path(group); }
template<typename... Args> void notify(Args&... args) { return bind->notify({std::forward<Args>(args)...}); } template<typename... Args> void notify(Args&... args) { return bind->notify({std::forward<Args>(args)...}); }

View File

@@ -6,12 +6,12 @@ string activepath() {
string result; string result;
#ifdef _WIN32 #ifdef _WIN32
wchar_t path[PATH_MAX] = L""; wchar_t path[PATH_MAX] = L"";
_wgetcwd(path, PATH_MAX); auto unused = _wgetcwd(path, PATH_MAX);
result = (const char*)utf8_t(path); result = (const char*)utf8_t(path);
result.transform("\\", "/"); result.transform("\\", "/");
#else #else
char path[PATH_MAX] = ""; char path[PATH_MAX] = "";
getcwd(path, PATH_MAX); auto unused = getcwd(path, PATH_MAX);
result = path; result = path;
#endif #endif
if(result.empty()) result = "."; if(result.empty()) result = ".";

View File

@@ -6,7 +6,7 @@ sfc_objects += sfc-sa1 sfc-superfx
sfc_objects += sfc-armdsp sfc-hitachidsp sfc-necdsp sfc_objects += sfc-armdsp sfc-hitachidsp sfc-necdsp
sfc_objects += sfc-epsonrtc sfc-sharprtc sfc_objects += sfc-epsonrtc sfc-sharprtc
sfc_objects += sfc-spc7110 sfc-sdd1 sfc-obc1 sfc_objects += sfc-spc7110 sfc-sdd1 sfc-obc1
sfc_objects += sfc-msu1 sfc_objects += sfc-hsu1 sfc-msu1
objects += $(sfc_objects) objects += $(sfc_objects)
ifeq ($(profile),accuracy) ifeq ($(profile),accuracy)
@@ -60,4 +60,5 @@ 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-sdd1.o : $(sfc)/chip/sdd1/sdd1.cpp $(sfc)/chip/sdd1/*
obj/sfc-obc1.o : $(sfc)/chip/obc1/obc1.cpp $(sfc)/chip/obc1/* obj/sfc-obc1.o : $(sfc)/chip/obc1/obc1.cpp $(sfc)/chip/obc1/*
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-msu1.o : $(sfc)/chip/msu1/msu1.cpp $(sfc)/chip/msu1/*

View File

@@ -26,6 +26,7 @@ void Cartridge::load(const string &manifest) {
has_spc7110 = false; has_spc7110 = false;
has_sdd1 = false; has_sdd1 = false;
has_obc1 = false; has_obc1 = false;
has_hsu1 = false;
has_msu1 = false; has_msu1 = false;
this->manifest = manifest; this->manifest = manifest;

View File

@@ -38,6 +38,7 @@ struct Cartridge : property<Cartridge> {
readonly<bool> has_spc7110; readonly<bool> has_spc7110;
readonly<bool> has_sdd1; readonly<bool> has_sdd1;
readonly<bool> has_obc1; readonly<bool> has_obc1;
readonly<bool> has_hsu1;
readonly<bool> has_msu1; readonly<bool> has_msu1;
struct Mapping { struct Mapping {
@@ -93,6 +94,7 @@ private:
void parse_markup_spc7110(Markup::Node); void parse_markup_spc7110(Markup::Node);
void parse_markup_sdd1(Markup::Node); void parse_markup_sdd1(Markup::Node);
void parse_markup_obc1(Markup::Node); void parse_markup_obc1(Markup::Node);
void parse_markup_hsu1(Markup::Node);
void parse_markup_msu1(Markup::Node); void parse_markup_msu1(Markup::Node);
}; };

View File

@@ -25,6 +25,7 @@ void Cartridge::parse_markup(const char *markup) {
parse_markup_spc7110(board["spc7110"]); parse_markup_spc7110(board["spc7110"]);
parse_markup_sdd1(board["sdd1"]); parse_markup_sdd1(board["sdd1"]);
parse_markup_obc1(board["obc1"]); parse_markup_obc1(board["obc1"]);
parse_markup_hsu1(board["hsu1"]);
parse_markup_msu1(board["msu1"]); parse_markup_msu1(board["msu1"]);
} }
@@ -564,6 +565,21 @@ void Cartridge::parse_markup_obc1(Markup::Node root) {
} }
} }
void Cartridge::parse_markup_hsu1(Markup::Node root) {
if(root.exists() == false) return;
has_hsu1 = true;
for(auto &node : root) {
if(node.name != "map") continue;
if(node["id"].data == "io") {
Mapping m({&HSU1::read, &hsu1}, {&HSU1::write, &hsu1});
parse_markup_map(m, node);
mapping.append(m);
}
}
}
void Cartridge::parse_markup_msu1(Markup::Node root) { void Cartridge::parse_markup_msu1(Markup::Node root) {
if(root.exists() == false) return; if(root.exists() == false) return;
has_msu1 = true; has_msu1 = true;

View File

@@ -23,6 +23,7 @@ struct Coprocessor : Thread {
#include <sfc/chip/sdd1/sdd1.hpp> #include <sfc/chip/sdd1/sdd1.hpp>
#include <sfc/chip/obc1/obc1.hpp> #include <sfc/chip/obc1/obc1.hpp>
#include <sfc/chip/hsu1/hsu1.hpp>
#include <sfc/chip/msu1/msu1.hpp> #include <sfc/chip/msu1/msu1.hpp>
void Coprocessor::step(unsigned clocks) { void Coprocessor::step(unsigned clocks) {

View File

@@ -0,0 +1,66 @@
#include <sfc/sfc.hpp>
#define HSU1_CPP
namespace SuperFamicom {
#include "serialization.cpp"
HSU1 hsu1;
void HSU1::init() {
}
void HSU1::load() {
}
void HSU1::unload() {
}
void HSU1::power() {
}
void HSU1::reset() {
packetlength = 0;
}
uint8 HSU1::read(unsigned addr) {
return cpu.regs.mdr;
}
void HSU1::write(unsigned addr, uint8 data) {
packet[packetlength] = data;
if(packetlength < sizeof(packet)) packetlength++;
if(data) return;
lstring side = interface->scoreServer().split<1>("@");
string username = side(0).split<1>(":")(0);
string password = side(0).split<1>(":")(1);
string servername = side(1).ltrim<1>("http://");
side = servername.split<1>("/");
string host = side(0).split<1>(":")(0);
string port = side(0).split<1>(":")(1);
string path = side(1);
if(port.empty()) port = "80";
http server;
if(server.connect(host, decimal(port))) {
string content = {
"username:", username, "\r\n",
"password:", password, "\r\n",
"sha256:", interface->sha256(), "\r\n",
"data:", (const char*)packet, "\r\n",
"emulator:bsnes\r\n"
};
string packet = {
"POST ", path, " HTTP/1.0\r\n",
"Host: ", host, "\r\n",
"Connection: close\r\n",
"Content-Type: text/plain; charset=utf-8\r\n",
"Content-Length: ", content.length(), "\r\n",
"\r\n",
content
};
server.send(packet);
}
}
}

View File

@@ -0,0 +1,18 @@
struct HSU1 {
void init();
void load();
void unload();
void power();
void reset();
uint8 read(unsigned addr);
void write(unsigned addr, uint8 data);
void serialize(serializer&);
private:
uint8 packet[512];
unsigned packetlength;
};
extern HSU1 hsu1;

View File

@@ -0,0 +1,8 @@
#ifdef HSU1_CPP
void HSU1::serialize(serializer &s) {
s.array(packet);
s.integer(packetlength);
}
#endif

View File

@@ -73,12 +73,14 @@ unsigned Bus::mirror(unsigned addr, unsigned size) {
return base; return base;
} }
unsigned Bus::recode(unsigned addr, unsigned mask) { unsigned Bus::reduce(unsigned addr, unsigned mask) {
unsigned result = 0, length = 0;
for(unsigned n = 0; n < 24; n++) { for(unsigned n = 0; n < 24; n++) {
unsigned bit = 1 << n; unsigned bit = 1 << n;
if(mask & bit) addr = ((addr >> (n + 1)) << n) | (addr & (bit - 1)); if(mask & bit) continue;
result |= (bool)(addr & bit) << length++;
} }
return addr; return result;
} }
uint8 Bus::read(unsigned addr) { uint8 Bus::read(unsigned addr) {

View File

@@ -22,7 +22,7 @@ void Bus::map(
for(unsigned bank = banklo; bank <= bankhi; bank++) { for(unsigned bank = banklo; bank <= bankhi; bank++) {
for(unsigned addr = addrlo; addr <= addrhi; addr++) { for(unsigned addr = addrlo; addr <= addrhi; addr++) {
unsigned offset = recode(bank << 16 | addr, mask); unsigned offset = reduce(bank << 16 | addr, mask);
if(size) offset = base + mirror(offset, size - base); if(size) offset = base + mirror(offset, size - base);
lookup[bank << 16 | addr] = id; lookup[bank << 16 | addr] = id;
target[bank << 16 | addr] = offset; target[bank << 16 | addr] = offset;

View File

@@ -44,7 +44,7 @@ private:
struct Bus { struct Bus {
alwaysinline static unsigned mirror(unsigned addr, unsigned size); alwaysinline static unsigned mirror(unsigned addr, unsigned size);
alwaysinline static unsigned recode(unsigned addr, unsigned mask); alwaysinline static unsigned reduce(unsigned addr, unsigned mask);
alwaysinline uint8 read(unsigned addr); alwaysinline uint8 read(unsigned addr);
alwaysinline void write(unsigned addr, uint8 data); alwaysinline void write(unsigned addr, uint8 data);

View File

@@ -71,6 +71,7 @@ void System::serialize_all(serializer &s) {
if(cartridge.has_spc7110()) spc7110.serialize(s); if(cartridge.has_spc7110()) spc7110.serialize(s);
if(cartridge.has_sdd1()) sdd1.serialize(s); if(cartridge.has_sdd1()) sdd1.serialize(s);
if(cartridge.has_obc1()) obc1.serialize(s); if(cartridge.has_obc1()) obc1.serialize(s);
if(cartridge.has_hsu1()) hsu1.serialize(s);
if(cartridge.has_msu1()) msu1.serialize(s); if(cartridge.has_msu1()) msu1.serialize(s);
} }

View File

@@ -80,6 +80,7 @@ void System::init() {
spc7110.init(); spc7110.init();
sdd1.init(); sdd1.init();
obc1.init(); obc1.init();
hsu1.init();
msu1.init(); msu1.init();
video.init(); video.init();
@@ -136,6 +137,7 @@ void System::load() {
if(cartridge.has_spc7110()) spc7110.load(); if(cartridge.has_spc7110()) spc7110.load();
if(cartridge.has_sdd1()) sdd1.load(); if(cartridge.has_sdd1()) sdd1.load();
if(cartridge.has_obc1()) obc1.load(); if(cartridge.has_obc1()) obc1.load();
if(cartridge.has_hsu1()) hsu1.load();
if(cartridge.has_msu1()) msu1.load(); if(cartridge.has_msu1()) msu1.load();
serialize_init(); serialize_init();
@@ -160,6 +162,7 @@ void System::unload() {
if(cartridge.has_spc7110()) spc7110.unload(); if(cartridge.has_spc7110()) spc7110.unload();
if(cartridge.has_sdd1()) sdd1.unload(); if(cartridge.has_sdd1()) sdd1.unload();
if(cartridge.has_obc1()) obc1.unload(); if(cartridge.has_obc1()) obc1.unload();
if(cartridge.has_hsu1()) hsu1.unload();
if(cartridge.has_msu1()) msu1.unload(); if(cartridge.has_msu1()) msu1.unload();
} }
@@ -187,6 +190,7 @@ void System::power() {
if(cartridge.has_spc7110()) spc7110.power(); if(cartridge.has_spc7110()) spc7110.power();
if(cartridge.has_sdd1()) sdd1.power(); if(cartridge.has_sdd1()) sdd1.power();
if(cartridge.has_obc1()) obc1.power(); if(cartridge.has_obc1()) obc1.power();
if(cartridge.has_hsu1()) hsu1.power();
if(cartridge.has_msu1()) msu1.power(); if(cartridge.has_msu1()) msu1.power();
reset(); reset();
@@ -214,6 +218,7 @@ void System::reset() {
if(cartridge.has_spc7110()) spc7110.reset(); if(cartridge.has_spc7110()) spc7110.reset();
if(cartridge.has_sdd1()) sdd1.reset(); if(cartridge.has_sdd1()) sdd1.reset();
if(cartridge.has_obc1()) obc1.reset(); if(cartridge.has_obc1()) obc1.reset();
if(cartridge.has_hsu1()) hsu1.reset();
if(cartridge.has_msu1()) msu1.reset(); if(cartridge.has_msu1()) msu1.reset();
if(cartridge.has_gb_slot()) cpu.coprocessors.append(&icd2); if(cartridge.has_gb_slot()) cpu.coprocessors.append(&icd2);

View File

@@ -26,6 +26,9 @@ Configuration::Configuration() {
append(input.focusAllow = false, "Input::Focus::AllowInput"); append(input.focusAllow = false, "Input::Focus::AllowInput");
append(timing.video = 60.0, "Timing::Video"); append(timing.video = 60.0, "Timing::Video");
append(timing.audio = 48000.0, "Timing::Audio"); append(timing.audio = 48000.0, "Timing::Audio");
append(highScores.hostname = "", "HighScores::Hostname");
append(highScores.username = "", "HighScores::Username");
append(highScores.password = "", "HighScores::Password");
append(path.game = {userpath(), "Emulation/"}, "Path::Game"); append(path.game = {userpath(), "Emulation/"}, "Path::Game");
load(); load();
} }

View File

@@ -35,6 +35,12 @@ struct Configuration : configuration {
double audio; double audio;
} timing; } timing;
struct HighScores {
string hostname;
string username;
string password;
} highScores;
struct Path { struct Path {
string game; string game;
} path; } path;

View File

@@ -97,6 +97,7 @@ Application::Application(int argc, char **argv) {
inputSettings = new InputSettings; inputSettings = new InputSettings;
hotkeySettings = new HotkeySettings; hotkeySettings = new HotkeySettings;
timingSettings = new TimingSettings; timingSettings = new TimingSettings;
scoreSettings = new ScoreSettings;
driverSettings = new DriverSettings; driverSettings = new DriverSettings;
settings = new Settings; settings = new Settings;
cheatDatabase = new CheatDatabase; cheatDatabase = new CheatDatabase;

View File

@@ -111,6 +111,14 @@ unsigned Interface::dipSettings(const Markup::Node &node) {
return dipSwitches->run(node); return dipSwitches->run(node);
} }
string Interface::scoreServer() {
return string {
config->highScores.username, ":",
config->highScores.password, "@",
config->highScores.hostname
};
}
string Interface::path(unsigned group) { string Interface::path(unsigned group) {
return utility->path(group); return utility->path(group);
} }

View File

@@ -7,6 +7,7 @@ struct Interface : Emulator::Interface::Bind {
void audioSample(int16_t lsample, int16_t rsample); void audioSample(int16_t lsample, int16_t rsample);
int16_t inputPoll(unsigned port, unsigned device, unsigned input); int16_t inputPoll(unsigned port, unsigned device, unsigned input);
unsigned dipSettings(const Markup::Node &node); unsigned dipSettings(const Markup::Node &node);
string scoreServer();
string path(unsigned group); string path(unsigned group);
void notify(const string &text); void notify(const string &text);
}; };

View File

@@ -0,0 +1,32 @@
ScoreSettings *scoreSettings = nullptr;
ScoreSettings::ScoreSettings() {
title.setFont(application->titleFont);
title.setText("High Score Server Configuration");
hostLabel.setText("Hostname:");
userLabel.setText("Username:");
passLabel.setText("Password:");
unsigned width = max(
Font(application->normalFont).geometry("Hostname:").width,
Font(application->normalFont).geometry("Username:").width
);
append(title, {~0, 0}, 5);
append(serverLayout, {~0, 0}, 5);
serverLayout.append(hostLabel, {width, 0}, 5);
serverLayout.append(hostEdit, {~0, 0});
append(loginLayout, {~0, 0});
loginLayout.append(userLabel, {width, 0}, 5);
loginLayout.append(userEdit, {~0, 0}, 5);
loginLayout.append(passLabel, {0, 0}, 5);
loginLayout.append(passEdit, {~0, 0});
hostEdit.setText(config->highScores.hostname);
userEdit.setText(config->highScores.username);
passEdit.setText(config->highScores.password);
hostEdit.onChange = [&] { config->highScores.hostname = hostEdit.text(); };
userEdit.onChange = [&] { config->highScores.username = userEdit.text(); };
passEdit.onChange = [&] { config->highScores.password = passEdit.text(); };
}

View File

@@ -0,0 +1,15 @@
struct ScoreSettings : SettingsLayout {
Label title;
HorizontalLayout serverLayout;
Label hostLabel;
LineEdit hostEdit;
HorizontalLayout loginLayout;
Label userLabel;
LineEdit userEdit;
Label passLabel;
LineEdit passEdit;
ScoreSettings();
};
extern ScoreSettings *scoreSettings;

View File

@@ -4,6 +4,7 @@
#include "input.cpp" #include "input.cpp"
#include "hotkey.cpp" #include "hotkey.cpp"
#include "timing.cpp" #include "timing.cpp"
#include "scores.cpp"
#include "driver.cpp" #include "driver.cpp"
Settings *settings = nullptr; Settings *settings = nullptr;
@@ -31,6 +32,7 @@ Settings::Settings() {
panelList.append("Input"); panelList.append("Input");
panelList.append("Hotkeys"); panelList.append("Hotkeys");
panelList.append("Timing"); panelList.append("Timing");
panelList.append("Scores");
panelList.append("Driver"); panelList.append("Driver");
append(layout); append(layout);
@@ -40,6 +42,7 @@ Settings::Settings() {
append(*inputSettings); append(*inputSettings);
append(*hotkeySettings); append(*hotkeySettings);
append(*timingSettings); append(*timingSettings);
append(*scoreSettings);
append(*driverSettings); append(*driverSettings);
onClose = [&] { onClose = [&] {
@@ -59,6 +62,7 @@ void Settings::panelChanged() {
inputSettings->setVisible(false); inputSettings->setVisible(false);
hotkeySettings->setVisible(false); hotkeySettings->setVisible(false);
timingSettings->setVisible(false); timingSettings->setVisible(false);
scoreSettings->setVisible(false);
driverSettings->setVisible(false); driverSettings->setVisible(false);
if(panelList.selected() == false) return; if(panelList.selected() == false) return;
@@ -68,6 +72,7 @@ void Settings::panelChanged() {
case 2: return inputSettings->setVisible(); case 2: return inputSettings->setVisible();
case 3: return hotkeySettings->setVisible(); case 3: return hotkeySettings->setVisible();
case 4: return timingSettings->setVisible(); case 4: return timingSettings->setVisible();
case 5: return driverSettings->setVisible(); case 5: return scoreSettings->setVisible();
case 6: return driverSettings->setVisible();
} }
} }

View File

@@ -11,6 +11,7 @@ struct SettingsLayout : HorizontalLayout {
#include "input.hpp" #include "input.hpp"
#include "hotkey.hpp" #include "hotkey.hpp"
#include "timing.hpp" #include "timing.hpp"
#include "scores.hpp"
#include "driver.hpp" #include "driver.hpp"
struct Settings : Window { struct Settings : Window {