Commit fbc58c70 authored by Screwtape's avatar Screwtape

Update to v104r14 release.

byuu says:

Changelog:

  - Emulator::Interface::videoResolution() -\> VideoResolution renamed
    to videoInformation() -\> VideoInformation
  - added double VideoInformation::refreshRate
  - higan: added `binary := (application|library)` — set this to
    `library` to produce a dynamic link library
  - higan: removed `-march=native` for macOS application builds; and for
    all library builds
  - higan: removed `console` build flag; uncomment  `link += -mwindows`
    instead
  - nall/GNUmakefile: `macosx` platform renamed `macos`
      - still need to do this for nall/intrinsics.hpp
  - Game Gear: return region=NTSC as the only option, so that the system
    frequency is always set correctly
  - hiro/cocoa: fixed typo [Sintendo]
  - hiro/Windows: removed GetDpiForMonitor, as it's Windows 8+ only; DPI
    is no longer per-monitor aware
  - icarus: core Icarus class now has virtual functions for
    directory::create, <file::exists>, <file::copy>, <file::write>
  - icarus: Sufami Turbo can import save RAM files now
  - icarus: setting `ICARUS_LIBRARY` define will compile icarus without
    main(), GUI components
  - ruby/video/Direct3D: choose the current monitor instead of top-left
    monitor for fullscreen exclusive [Cydrak]
  - ruby/video/Direct3D: do not set `WS_EX_TOPMOST` on fullscreen
    exclusive window [Cydrak]
      - this isn't necessary for exclusive mode, and it just makes
        getting out of the application more difficult
parent c63e6f29
build := optimize
include ../nall/GNUmakefile
binary := application
target := tomoko
objects := libco emulator audio video resource
# console := true
flags += -I. -I..
ifeq ($(platform),windows)
ifeq ($(console),true)
link += -mconsole
else
link += -mwindows
link += -mwindows
ifeq ($(binary),application)
link += -mthreads -lpthread -luuid -lkernel32 -luser32 -lgdi32 -lcomctl32 -lcomdlg32 -lshell32
link += -Wl,-enable-auto-import
link += -Wl,-enable-runtime-pseudo-reloc
else ifeq ($(binary),library)
link += -shared
endif
else ifeq ($(platform),macos)
ifeq ($(binary),application)
else ifeq ($(binary),library)
flags += -fPIC
link += -dynamiclib
endif
link += -mthreads -lpthread -luuid -lkernel32 -luser32 -lgdi32 -lcomctl32 -lcomdlg32 -lshell32
link += -Wl,-enable-auto-import
link += -Wl,-enable-runtime-pseudo-reloc
else ifeq ($(platform),macosx)
flags += -march=native
else ifneq ($(filter $(platform),linux bsd),)
flags += -march=native -fopenmp
flags += -fopenmp
link += -fopenmp
link += -Wl,-export-dynamic
link += -lX11 -lXext
ifeq ($(binary),application)
flags += -march=native
link += -Wl,-export-dynamic
link += -lX11 -lXext
else ifeq ($(binary),library)
flags += -fPIC
link += -shared
endif
else
$(error "unsupported platform")
endif
......
......@@ -12,7 +12,7 @@ using namespace nall;
namespace Emulator {
static const string Name = "higan";
static const string Version = "104.13";
static const string Version = "104.14";
static const string Author = "byuu";
static const string License = "GPLv3";
static const string Website = "https://byuu.org/";
......
......@@ -37,15 +37,15 @@ struct Interface {
virtual auto manifest() -> string = 0;
virtual auto title() -> string = 0;
//video information
struct VideoResolution {
uint width;
uint height;
uint internalWidth;
uint internalHeight;
double aspectCorrection;
struct VideoInformation {
uint width = 0;
uint height = 0;
uint internalWidth = 0;
uint internalHeight = 0;
double aspectCorrection = 0;
double refreshRate = 0;
};
virtual auto videoResolution() -> VideoResolution = 0;
virtual auto videoInformation() -> VideoInformation = 0;
virtual auto videoColors() -> uint32 = 0;
virtual auto videoColor(uint32 color) -> uint64 = 0;
......
......@@ -44,8 +44,15 @@ auto Interface::title() -> string {
return cartridge.title();
}
auto Interface::videoResolution() -> VideoResolution {
return {256, 240, 256, 240, 8.0 / 7.0};
auto Interface::videoInformation() -> VideoInformation {
VideoInformation vi;
vi.width = 256;
vi.height = 240;
vi.internalWidth = 256;
vi.internalHeight = 240;
vi.aspectCorrection = 8.0 / 7.0;
vi.refreshRate = system.frequency() / (ppu.vlines() * ppu.rate() * 341.0);
return vi;
}
auto Interface::videoColors() -> uint32 {
......
......@@ -26,7 +26,7 @@ struct Interface : Emulator::Interface {
auto manifest() -> string override;
auto title() -> string override;
auto videoResolution() -> VideoResolution override;
auto videoInformation() -> VideoInformation override;
auto videoColors() -> uint32 override;
auto videoColor(uint32 color) -> uint64 override;
......
......@@ -36,8 +36,15 @@ auto Interface::title() -> string {
return cartridge.title();
}
auto Interface::videoResolution() -> VideoResolution {
return {160, 144, 160, 144, 1.0};
auto Interface::videoInformation() -> VideoInformation {
VideoInformation vi;
vi.width = 160;
vi.height = 144;
vi.internalWidth = 160;
vi.internalHeight = 144;
vi.aspectCorrection = 1.0;
vi.refreshRate = (4.0 * 1024.0 * 1024.0) / (154.0 * 456.0);
return vi;
}
auto Interface::loaded() -> bool {
......
......@@ -23,7 +23,7 @@ struct Interface : Emulator::Interface {
auto manifest() -> string override;
auto title() -> string override;
auto videoResolution() -> VideoResolution override;
auto videoInformation() -> VideoInformation override;
auto loaded() -> bool override;
auto sha256() -> string override;
......
......@@ -39,12 +39,19 @@ auto Interface::title() -> string {
return cartridge.title();
}
auto Interface::videoResolution() -> VideoResolution {
if(!settings.rotateLeft) {
return {240, 160, 240, 160, 1.0};
} else {
return {160, 240, 160, 240, 1.0};
auto Interface::videoInformation() -> VideoInformation {
VideoInformation vi;
vi.width = 240;
vi.height = 160;
vi.internalWidth = 240;
vi.internalHeight = 160;
vi.aspectCorrection = 1.0;
vi.refreshRate = system.frequency() / (228.0 * 1232.0);
if(settings.rotateLeft) {
swap(vi.width, vi.height);
swap(vi.internalWidth, vi.internalHeight);
}
return vi;
}
auto Interface::videoColors() -> uint32 {
......
......@@ -23,7 +23,7 @@ struct Interface : Emulator::Interface {
auto manifest() -> string override;
auto title() -> string override;
auto videoResolution() -> VideoResolution override;
auto videoInformation() -> VideoInformation override;
auto videoColors() -> uint32 override;
auto videoColor(uint32 color) -> uint64 override;
......
......@@ -64,8 +64,15 @@ auto Interface::title() -> string {
return cartridge.title();
}
auto Interface::videoResolution() -> VideoResolution {
return {320, 240, 1280, 480, 1.0};
auto Interface::videoInformation() -> VideoInformation {
VideoInformation vi;
vi.width = 320;
vi.height = 240;
vi.internalWidth = 1280;
vi.internalHeight = 480;
vi.aspectCorrection = 1.0;
vi.refreshRate = (system.frequency() / 2.0) / (vdp.frameHeight() * 1710.0);
return vi;
}
auto Interface::videoColors() -> uint32 {
......
......@@ -27,7 +27,7 @@ struct Interface : Emulator::Interface {
auto manifest() -> string override;
auto title() -> string override;
auto videoResolution() -> VideoResolution override;
auto videoInformation() -> VideoInformation override;
auto videoColors() -> uint32 override;
auto videoColor(uint32 color) -> uint64 override;
......
......@@ -262,6 +262,8 @@ private:
uint32 buffer[1280 * 512];
uint32* output = nullptr;
friend class Interface;
};
extern VDP vdp;
......@@ -17,7 +17,7 @@ auto Cartridge::load() -> bool {
}
if(Model::GameGear()) {
if(auto loaded = platform->load(ID::GameGear, "Game Gear", "gg")) {
if(auto loaded = platform->load(ID::GameGear, "Game Gear", "gg", {"NTSC"})) {
information.pathID = loaded.pathID();
} else return false;
}
......
......@@ -21,8 +21,15 @@ GameGearInterface::GameGearInterface() {
ports.append(move(hardware));
}
auto GameGearInterface::videoResolution() -> VideoResolution {
return {160, 144, 160, 144, 1.0};
auto GameGearInterface::videoInformation() -> VideoInformation {
VideoInformation vi;
vi.width = 160;
vi.height = 144;
vi.internalWidth = 160;
vi.internalHeight = 144;
vi.aspectCorrection = 1.0;
vi.refreshRate = (system.colorburst() * 15.0 / 5.0) / (262.0 * 684.0);
return vi;
}
auto GameGearInterface::videoColors() -> uint32 {
......
......@@ -50,7 +50,7 @@ struct MasterSystemInterface : Interface {
MasterSystemInterface();
auto videoResolution() -> VideoResolution override;
auto videoInformation() -> VideoInformation override;
auto videoColors() -> uint32 override;
auto videoColor(uint32 color) -> uint64 override;
......@@ -64,7 +64,7 @@ struct GameGearInterface : Interface {
GameGearInterface();
auto videoResolution() -> VideoResolution override;
auto videoInformation() -> VideoInformation override;
auto videoColors() -> uint32 override;
auto videoColor(uint32 color) -> uint64 override;
......
......@@ -36,8 +36,16 @@ MasterSystemInterface::MasterSystemInterface() {
ports.append(move(hardware));
}
auto MasterSystemInterface::videoResolution() -> VideoResolution {
return {256, 240, 256, 240, 8.0 / 7.0};
auto MasterSystemInterface::videoInformation() -> VideoInformation {
VideoInformation vi;
vi.width = 256;
vi.height = 240;
vi.internalWidth = 256;
vi.internalHeight = 240;
vi.aspectCorrection = 8.0 / 7.0;
if(Region::NTSC()) vi.refreshRate = (system.colorburst() * 15.0 / 5.0) / (262.0 * 684.0);
if(Region::PAL()) vi.refreshRate = (system.colorburst() * 15.0 / 5.0) / (312.0 * 684.0);
return vi;
}
auto MasterSystemInterface::videoColors() -> uint32 {
......
......@@ -39,8 +39,15 @@ auto Interface::title() -> string {
return cartridge.title();
}
auto Interface::videoResolution() -> VideoResolution {
return {280, 240, 1120, 240, 8.0 / 7.0};
auto Interface::videoInformation() -> VideoInformation {
VideoInformation vi;
vi.width = 280;
vi.height = 240;
vi.internalWidth = 1120;
vi.internalHeight = 240;
vi.aspectCorrection = 8.0 / 7.0;
vi.refreshRate = (system.colorburst() * 6.0) / (262.0 * 1365.0);
return vi;
}
auto Interface::videoColors() -> uint32 {
......
......@@ -23,7 +23,7 @@ struct Interface : Emulator::Interface {
auto manifest() -> string override;
auto title() -> string override;
auto videoResolution() -> VideoResolution override;
auto videoInformation() -> VideoInformation override;
auto videoColors() -> uint32 override;
auto videoColor(uint32 color) -> uint64 override;
......
......@@ -118,8 +118,16 @@ auto Interface::title() -> string {
return cartridge.title();
}
auto Interface::videoResolution() -> VideoResolution {
return {256, 240, 512, 480, 8.0 / 7.0};
auto Interface::videoInformation() -> VideoInformation {
VideoInformation vi;
vi.width = 256;
vi.height = 240;
vi.internalWidth = 512;
vi.internalHeight = 480;
vi.aspectCorrection = 8.0 / 7.0;
if(Region::NTSC()) vi.refreshRate = system.cpuFrequency() / (262.0 * 1364.0);
if(Region::PAL()) vi.refreshRate = system.cpuFrequency() / (312.0 * 1364.0);
return vi;
}
auto Interface::videoColors() -> uint32 {
......
......@@ -38,7 +38,7 @@ struct Interface : Emulator::Interface {
auto manifest() -> string override;
auto title() -> string override;
auto videoResolution() -> VideoResolution override;
auto videoInformation() -> VideoInformation override;
auto videoColors() -> uint32 override;
auto videoColor(uint32 color) -> uint64 override;
......
......@@ -21,7 +21,7 @@ ifeq ($(platform),windows)
ruby += video.wgl video.direct3d video.directdraw video.gdi
ruby += audio.asio audio.wasapi audio.xaudio2 audio.directsound
ruby += input.windows
else ifeq ($(platform),macosx)
else ifeq ($(platform),macos)
ruby += video.cgl
ruby += audio.openal
ruby += input.quartz input.carbon
......@@ -68,7 +68,7 @@ obj/ui-resource.o:
# targets
build: $(objects)
$(strip $(compiler) -o out/$(name) $(objects) $(link))
ifeq ($(platform),macosx)
ifeq ($(platform),macos)
@if [ -d out/$(name).app ]; then rm -r out/$(name).app; fi
mkdir -p out/$(name).app/Contents/MacOS/
mkdir -p out/$(name).app/Contents/Resources/
......@@ -81,7 +81,7 @@ install:
ifeq ($(shell id -un),root)
$(error "make install should not be run as root")
else ifeq ($(platform),windows)
else ifeq ($(platform),macosx)
else ifeq ($(platform),macos)
mkdir -p ~/Library/Application\ Support/$(name)/
mkdir -p ~/Emulation/System/
cp -R out/$(name).app /Applications/$(name).app
......@@ -101,7 +101,7 @@ uninstall:
ifeq ($(shell id -un),root)
$(error "make uninstall should not be run as root")
else ifeq ($(platform),windows)
else ifeq ($(platform),macosx)
else ifeq ($(platform),macos)
if [ -d /Applications/$(name).app ]; then rm -r /Applications/$(name).app; fi
else ifneq ($(filter $(platform),linux bsd),)
if [ -f $(prefix)/bin/$(name) ]; then rm $(prefix)/bin/$(name); fi
......
......@@ -248,10 +248,10 @@ auto Presentation::resizeViewport(bool resizeWindow) -> void {
double emulatorHeight = 240;
double aspectCorrection = 1.0;
if(emulator) {
auto resolution = emulator->videoResolution();
emulatorWidth = resolution.width;
emulatorHeight = resolution.height;
aspectCorrection = resolution.aspectCorrection;
auto information = emulator->videoInformation();
emulatorWidth = information.width;
emulatorHeight = information.height;
aspectCorrection = information.aspectCorrection;
if(emulator->information.overscan) {
uint overscanHorizontal = settings["Video/Overscan/Horizontal"].natural();
uint overscanVertical = settings["Video/Overscan/Vertical"].natural();
......
......@@ -59,9 +59,9 @@ auto Program::videoRefresh(const uint32* data, uint pitch, uint width, uint heig
if(emulator->information.overscan) {
uint overscanHorizontal = settings["Video/Overscan/Horizontal"].natural();
uint overscanVertical = settings["Video/Overscan/Vertical"].natural();
auto resolution = emulator->videoResolution();
overscanHorizontal *= resolution.internalWidth / resolution.width;
overscanVertical *= resolution.internalHeight / resolution.height;
auto information = emulator->videoInformation();
overscanHorizontal *= information.internalWidth / information.width;
overscanVertical *= information.internalHeight / information.height;
data += overscanVertical * pitch + overscanHorizontal;
width -= overscanHorizontal * 2;
height -= overscanVertical * 2;
......
......@@ -35,12 +35,19 @@ auto Interface::title() -> string {
return cartridge.information.title;
}
auto Interface::videoResolution() -> VideoResolution {
if(!settings.rotateLeft) {
return {224, 144, 224, 144, 1.0};
} else {
return {144, 224, 144, 224, 1.0};
auto Interface::videoInformation() -> VideoInformation {
VideoInformation vi;
vi.width = 224;
vi.height = 144;
vi.internalWidth = 224;
vi.internalHeight = 144;
vi.aspectCorrection = 1.0;
vi.refreshRate = 3'072'000.0 / (159.0 * 256.0);
if(settings.rotateLeft) {
swap(vi.width, vi.height);
swap(vi.internalWidth, vi.internalHeight);
}
return vi;
}
auto Interface::loaded() -> bool {
......
......@@ -22,7 +22,7 @@ struct Interface : Emulator::Interface {
auto manifest() -> string override;
auto title() -> string override;
auto videoResolution() -> VideoResolution override;
auto videoInformation() -> VideoInformation override;
auto loaded() -> bool override;
auto sha256() -> string override;
......
......@@ -30,7 +30,7 @@ auto pFont::family(const string& family) -> string {
auto pFont::create(const Font& font) -> NSFont* {
auto fontName = family(font.family());
NSString* family = [NSString stringWithUTF8String:fontName];
CGFloat size = (float)(font.size() ? font.size() : 8);
CGFloat size = Application::scale(font.size() ? font.size() : 8);
NSFontTraitMask traits = 0;
if(font.bold()) traits |= NSBoldFontMask;
......
......@@ -11,7 +11,7 @@ auto pMonitor::count() -> uint {
auto pMonitor::dpi(uint monitor) -> Position {
@autoreleasepool {
NSScreen* screen = [[NSScreen screens] objectAtIndex:monitor];
NSDistionary* dictionary = [screen deviceDescription];
NSDictionary* dictionary = [screen deviceDescription];
NSSize dpi = [[dictionary objectForKey:NSDeviceSize] sizeValue];
return {dpi.width, dpi.height};
}
......
......@@ -55,6 +55,10 @@ auto Application::setScale(float scale) -> void {
state.scale = scale;
}
auto Application::unscale(float value) -> float {
return value * (1.0 / state.scale);
}
//Windows
//=======
......
......@@ -385,6 +385,7 @@ struct Application {
static auto setFont(const Font& font = {}) -> void;
static auto setName(const string& name = "") -> void;
static auto setScale(float scale = 1.0) -> void;
static auto unscale(float value) -> float;
struct Windows {
static auto doModalChange(bool modal) -> void;
......
......@@ -14,7 +14,7 @@ auto pFont::size(PangoFontDescription* font, const string& text) -> Size {
PangoLayout* layout = pango_layout_new(context);
pango_layout_set_font_description(layout, font);
pango_layout_set_text(layout, text, -1);
signed width = 0, height = 0;
int width = 0, height = 0;
pango_layout_get_pixel_size(layout, &width, &height);
g_object_unref((gpointer)layout);
return {width, height};
......@@ -39,7 +39,7 @@ auto pFont::family(const string& family) -> string {
auto pFont::create(const Font& font) -> PangoFontDescription* {
auto p = pango_font_description_new();
pango_font_description_set_family(p, family(font.family()));
pango_font_description_set_size(p, (font.size() ? font.size() : 8) * PANGO_SCALE);
pango_font_description_set_size(p, Application::scale(font.size() ? font.size() : 8) * PANGO_SCALE);
pango_font_description_set_weight(p, font.bold() ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL);
pango_font_description_set_style(p, font.italic() ? PANGO_STYLE_OBLIQUE : PANGO_STYLE_NORMAL);
return p;
......
......@@ -26,7 +26,7 @@ auto pFont::family(const string& family) -> QString {
auto pFont::create(const Font& font) -> QFont {
QFont qtFont;
qtFont.setFamily(family(font.family()));
qtFont.setPointSize(font.size() ? font.size() : 8);
qtFont.setPointSize(Application::scale(font.size() ? font.size() : 8));
qtFont.setBold(font.bold());
qtFont.setItalic(font.italic());
return qtFont;
......
......@@ -27,7 +27,7 @@ auto pFont::family(const string& family) -> string {
auto pFont::create(const Font& font) -> HFONT {
return CreateFont(
-((font.size() ? font.size() : 8) * 96.0 / 72.0 + 0.5),
-(Application::scale(font.size() ? font.size() : 8) * 96.0 / 72.0 + 0.5),
0, 0, 0, font.bold() ? FW_BOLD : FW_NORMAL, font.italic(), 0, 0, 0, 0, 0, 0, 0,
utf16_t(family(font.family()))
);
......
......@@ -5,24 +5,19 @@ namespace hiro {
struct MonitorInfo {
uint monitor = 0;
uint primary = 0;
float dpiX = 0;
float dpiY = 0;
Geometry geometry;
uint index = 0;
};
static auto CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) -> BOOL {
MonitorInfo& info = *(MonitorInfo*)dwData;
MONITORINFOEX mi{sizeof(MONITORINFOEX)};
MONITORINFOEX mi{};
mi.cbSize = sizeof(MONITORINFOEX);
GetMonitorInfo(hMonitor, &mi);
string displayName = (const char*)utf8_t(mi.szDevice);
if(displayName.beginsWith(R"(\\.\DISPLAYV)")) return true; //ignore pseudo-monitors
if(mi.dwFlags & MONITORINFOF_PRIMARY) info.primary = info.index;
if(info.monitor == info.index) {
UINT dpiX = 0, dpiY = 0;
GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY);
info.dpiX = dpiX;
info.dpiY = dpiY;
info.geometry = {lprcMonitor->left, lprcMonitor->top, lprcMonitor->right - lprcMonitor->left, lprcMonitor->bottom - lprcMonitor->top};
}
info.index++;
......@@ -34,10 +29,11 @@ auto pMonitor::count() -> uint {
}
auto pMonitor::dpi(uint monitor) -> Position {
MonitorInfo info;
info.monitor = monitor;
EnumDisplayMonitors(nullptr, nullptr, MonitorEnumProc, (LPARAM)&info);
return {info.dpiX, info.dpiY};
HDC hdc = GetDC(0);
auto dpiX = (float)GetDeviceCaps(hdc, LOGPIXELSX);
auto dpiY = (float)GetDeviceCaps(hdc, LOGPIXELSY);
ReleaseDC(0, hdc);
return {dpiX, dpiY};
}
auto pMonitor::geometry(uint monitor) -> Geometry {
......
......@@ -173,7 +173,12 @@ auto Button_CustomDraw(HWND hwnd, PAINTSTRUCT& ps, bool bordered, bool checked,
SetTextColor(ps.hdc, GetSysColor(IsWindowEnabled(hwnd) ? COLOR_BTNTEXT : COLOR_GRAYTEXT));
auto hFont = pFont::create(font);
SelectObject(ps.hdc, hFont);
RECT rcText{textGeometry.x(), textGeometry.y(), textGeometry.x() + textGeometry.width(), textGeometry.y() + textGeometry.height()};
RECT rcText{
LONG(textGeometry.x()),
LONG(textGeometry.y()),
LONG(textGeometry.x() + textGeometry.width()),
LONG(textGeometry.y() + textGeometry.height())
};
DrawText(ps.hdc, wText, -1, &rcText, DT_NOPREFIX | DT_END_ELLIPSIS);
DeleteObject(hFont);
}
......
......@@ -31,9 +31,9 @@ auto pFrame::setGeometry(Geometry geometry) -> void {
auto size = pFont::size(hfont, state().text);
pWidget::setGeometry({
geometry.x(),
geometry.y() - (empty ? size.height() >> 1 : 0),
geometry.y() - (empty ? size.height() / 2 : 0),
geometry.width(),
geometry.height() + (empty ? size.height() >> 1 : 0)
geometry.height() + (empty ? size.height() / 2 : 0)
});
if(auto layout = state().layout) {
if(empty) size.setHeight(1);
......
......@@ -16,7 +16,7 @@ objects += $(if $(call streq,$(platform),windows),obj/resource.o)
all: $(objects)
$(strip $(compiler) -o out/$(name) $(objects) $(link) $(hirolink))
ifeq ($(platform),macosx)
ifeq ($(platform),macos)
@if [ -d out/$(name).app ]; then rm -r out/$(name).app; fi
mkdir -p out/$(name).app/Contents/MacOS/
mkdir -p out/$(name).app/Contents/Resources/
......@@ -35,14 +35,14 @@ obj/resource.o:
$(windres) data/icarus.rc obj/resource.o
clean:
ifeq ($(platform),macosx)
ifeq ($(platform),macos)
@if [ -d out/$(name).app ]; then rm out/$(name).app; fi
endif
-@$(call delete,obj/*)
-@$(call delete,out/*)
install:
ifeq ($(platform),macosx)
ifeq ($(platform),macos)
cp -R out/$(name).app /Applications/$(name).app
else ifneq ($(filter $(platform),linux bsd),)
mkdir -p $(prefix)/bin/
......@@ -56,7 +56,7 @@ else ifneq ($(filter $(platform),linux bsd),)
endif
uninstall:
ifeq ($(platform),macosx)
ifeq ($(platform),macos)
if [ -d /Applications/$(name).app ]; then rm -r /Applications/$(name).app; fi
else ifneq ($(filter $(platform),linux bsd),)
if [ -f $(prefix)/bin/$(name) ]; then rm $(prefix)/bin/$(name); fi
......
......@@ -35,13 +35,13 @@ auto Icarus::bsMemoryImport(vector<uint8_t>& buffer, string location) -> string
auto name = Location::prefix(location);
auto source = Location::path(location);
string target{settings["Library/Location"].text(), "BS Memory/", name, ".bs/"};
//if(directory::exists(target)) return failure("game already exists");
auto markup = bsMemoryManifest(buffer, location);
if(!markup) return failure("failed to parse ROM image");
if(!directory::create(target)) return failure("library path unwritable");
auto manifest = bsMemoryManifest(buffer, location);
if(!manifest) return failure("failed to parse ROM image");
if(settings["icarus/CreateManifests"].boolean()) file::write({target, "manifest.bml"}, markup);
file::write({target, "program.rom"}, buffer);
if(!create(target)) return failure("library path unwritable");
if(settings["icarus/CreateManifests"].boolean()) write({target, "manifest.bml"}, manifest);
write({target, "program.rom"}, buffer);
return success(target);
}
struct Icarus {
virtual auto create(const string& pathname) -> bool {
return directory::create(pathname);
}
virtual auto exists(const string& filename) -> bool {
return file::exists(filename);
}
virtual auto copy(const string& target, const string& source) -> bool {
return file::copy(target, source);
}
virtual auto write(const string& filename, const uint8_t* data, uint size) -> bool {
return file::write(filename, data, size);
}
auto write(const string& filename, const vector<uint8_t>& buffer) -> bool {
return write(filename, buffer.data(), buffer.size());
}
auto write(const string& filename, const string& text) -> bool {
return write(filename, (const uint8_t*)text.data(), text.size());
}
//core.cpp
Icarus();
......
......@@ -41,22 +41,21 @@ auto Icarus::famicomImport(vector<uint8_t>& buffer, string location) -> string {
auto name = Location::prefix(location);
auto source = Location::path(location);
string target{settings["Library/Location"].text(), "Famicom/", name, ".fc/"};
//if(directory::exists(target)) return failure("game already exists");
uint prgrom = 0;
uint chrrom = 0;
auto markup = famicomManifest(buffer, location, &prgrom, &chrrom);