From 0c35f56438945d11354f55a7ae1a64682f8c7d8a Mon Sep 17 00:00:00 2001 From: desertkun Date: Thu, 20 Aug 2026 18:19:26 +0300 Subject: [PATCH 1/5] spectranext: xfs refactoring --- fusepb/FuseX.xcodeproj/project.pbxproj | 36 +- fusepb/scaler/scalers32.c | 28 ++ peripherals/Makefile.am | 5 + peripherals/fs/ramfs.c | 145 ++++++ peripherals/fs/ramfs.h | 59 +++ peripherals/fs/xfs.c | 271 +++++++++-- peripherals/fs/xfs.h | 37 +- peripherals/fs/xfs_compat.c | 99 ++++ peripherals/fs/xfs_engines.h | 2 + peripherals/fs/xfs_fs.c | 5 +- peripherals/fs/xfs_https.c | 241 +++------- peripherals/fs/xfs_https_compat.c | 170 +++++++ peripherals/fs/xfs_https_compat.h | 21 + peripherals/fs/xfs_overlay.c | 611 +++++++++++++++++++++++++ peripherals/fs/xfs_romfs.c | 358 +++++++++++++++ peripherals/fs/xfs_worker.c | 19 +- roms/Makefile.am | 3 +- roms/spectranet.rom | Bin 131072 -> 131072 bytes roms/spxromfs.bin | Bin 0 -> 58651 bytes 19 files changed, 1883 insertions(+), 227 deletions(-) create mode 100644 fusepb/scaler/scalers32.c create mode 100644 peripherals/fs/ramfs.c create mode 100644 peripherals/fs/ramfs.h create mode 100644 peripherals/fs/xfs_compat.c create mode 100644 peripherals/fs/xfs_https_compat.c create mode 100644 peripherals/fs/xfs_https_compat.h create mode 100644 peripherals/fs/xfs_overlay.c create mode 100644 peripherals/fs/xfs_romfs.c create mode 100644 roms/spxromfs.bin diff --git a/fusepb/FuseX.xcodeproj/project.pbxproj b/fusepb/FuseX.xcodeproj/project.pbxproj index d0e6922ff..c8a533184 100644 --- a/fusepb/FuseX.xcodeproj/project.pbxproj +++ b/fusepb/FuseX.xcodeproj/project.pbxproj @@ -101,7 +101,6 @@ B61F466009121DF100C8096C /* DebuggerController.m in Sources */ = {isa = PBXBuildFile; fileRef = B632C6AF03E5368700A864FD /* DebuggerController.m */; }; B61F466209121DF100C8096C /* FuseMenus.m in Sources */ = {isa = PBXBuildFile; fileRef = B66EA7840401075300A864FD /* FuseMenus.m */; }; B61F466309121DF100C8096C /* scaler.c in Sources */ = {isa = PBXBuildFile; fileRef = B63ABD8D042F175200A864FD /* scaler.c */; }; - FEC5107A347A105100000001 /* snes_ntsc.c in Sources */ = {isa = PBXBuildFile; fileRef = FEC51079347A105100000001 /* snes_ntsc.c */; }; B61F466409121DF100C8096C /* tc2068.c in Sources */ = {isa = PBXBuildFile; fileRef = B6FEA44F0444C3370013916D /* tc2068.c */; }; B61F466509121DF100C8096C /* dck.c in Sources */ = {isa = PBXBuildFile; fileRef = B65E4C600445DB7D00A864FD /* dck.c */; }; B61F466709121DF100C8096C /* psg.c in Sources */ = {isa = PBXBuildFile; fileRef = B6CA304C049CEC410037E9F2 /* psg.c */; }; @@ -315,6 +314,10 @@ D15E8F95259F5C0C0006FC79 /* gdbserver.c in Sources */ = {isa = PBXBuildFile; fileRef = D15E8F91259F5C0B0006FC79 /* gdbserver.c */; }; D1DF6DD826F8077F004A4AB7 /* debug.png in Resources */ = {isa = PBXBuildFile; fileRef = D1DF6DD726F8077F004A4AB7 /* debug.png */; }; D1ECC73E2924069800147252 /* ttx2000s.c in Sources */ = {isa = PBXBuildFile; fileRef = D1ECC73D2924069800147252 /* ttx2000s.c */; }; + FE0A0101301F000000000001 /* ramfs.c in Sources */ = {isa = PBXBuildFile; fileRef = FE0A0201301F000000000001 /* ramfs.c */; }; + FE0A0102301F000000000001 /* xfs_overlay.c in Sources */ = {isa = PBXBuildFile; fileRef = FE0A0203301F000000000001 /* xfs_overlay.c */; }; + FE0A0103301F000000000001 /* xfs_romfs.c in Sources */ = {isa = PBXBuildFile; fileRef = FE0A0204301F000000000001 /* xfs_romfs.c */; }; + FE0A0104301F000000000001 /* ../roms/spxromfs.bin in Resources */ = {isa = PBXBuildFile; fileRef = FE0A0205301F000000000001 /* ../roms/spxromfs.bin */; }; FE2DAC5A2F328D96009AC45A /* xfs.c in Sources */ = {isa = PBXBuildFile; fileRef = FE2DAC592F328D96009AC45A /* xfs.c */; }; FE2DAC6C2F329E6D009AC45A /* xfs_fs.c in Sources */ = {isa = PBXBuildFile; fileRef = FE2DAC6A2F329E6D009AC45A /* xfs_fs.c */; }; FE2DAC6D2F329E6D009AC45A /* xfs_worker.c in Sources */ = {isa = PBXBuildFile; fileRef = FE2DAC6B2F329E6D009AC45A /* xfs_worker.c */; }; @@ -351,12 +354,16 @@ FEC02C9F2EEF65D6008277BA /* spectranext_controller.c in Sources */ = {isa = PBXBuildFile; fileRef = FEC02C9C2EEF65D5008277BA /* spectranext_controller.c */; }; FEC02CA02EEF65D6008277BA /* spectranext.h in Sources */ = {isa = PBXBuildFile; fileRef = FEC02C9D2EEF65D5008277BA /* spectranext.h */; }; FEC02CA12EEF65D6008277BA /* spectranext_controller.h in Sources */ = {isa = PBXBuildFile; fileRef = FEC02C9E2EEF65D6008277BA /* spectranext_controller.h */; }; + FEC5107A347A105100000001 /* snes_ntsc.c in Sources */ = {isa = PBXBuildFile; fileRef = FEC51079347A105100000001 /* snes_ntsc.c */; }; FED23B142EE096F10013DD32 /* tls.c in Sources */ = {isa = PBXBuildFile; fileRef = FED23B122EE096F10013DD32 /* tls.c */; }; FED24C472EE104C60013DD32 /* mbedtls.framework in Copy Files */ = {isa = PBXBuildFile; fileRef = FED24C382EE1002B0013DD32 /* mbedtls.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; FED24C482EE104EB0013DD32 /* mbedtls.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FED24C382EE1002B0013DD32 /* mbedtls.framework */; }; FED24DE32EE108360013DD32 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FED24DE22EE108360013DD32 /* Security.framework */; }; FED24DE62EE10B590013DD32 /* dns_resolver.c in Sources */ = {isa = PBXBuildFile; fileRef = FED24DE42EE10B590013DD32 /* dns_resolver.c */; }; FED24DE72EE10B590013DD32 /* dns_processor.c in Sources */ = {isa = PBXBuildFile; fileRef = FED24DE52EE10B590013DD32 /* dns_processor.c */; }; + FEFB7C20301EB52200F1CFEC /* xfs_https_compat.c in Sources */ = {isa = PBXBuildFile; fileRef = FEFB7C1F301EB52200F1CFEC /* xfs_https_compat.c */; }; + FEFB7C22301EB52E00F1CFEC /* xfs_compat.c in Sources */ = {isa = PBXBuildFile; fileRef = FEFB7C21301EB52E00F1CFEC /* xfs_compat.c */; }; + FEFB7C243023F19700F1CFEC /* scalers32.c in Sources */ = {isa = PBXBuildFile; fileRef = FEFB7C233023F19700F1CFEC /* scalers32.c */; }; /* End PBXBuildFile section */ /* Begin PBXBuildRule section */ @@ -534,7 +541,6 @@ B639B7670A6BAFCF00927E24 /* csw.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = csw.icns; sourceTree = ""; }; B639B7D00A6BB45600927E24 /* raw.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = raw.icns; sourceTree = ""; }; B63ABD8D042F175200A864FD /* scaler.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = scaler.c; path = ../ui/scaler/scaler.c; sourceTree = SOURCE_ROOT; }; - FEC51079347A105100000001 /* snes_ntsc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = snes_ntsc.c; path = ../ui/scaler/snes_ntsc.c; sourceTree = SOURCE_ROOT; }; B63F9949077182B4004D6DFA /* RollbackController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = RollbackController.h; path = controllers/RollbackController.h; sourceTree = SOURCE_ROOT; }; B63F994A077182B4004D6DFA /* RollbackController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = RollbackController.m; path = controllers/RollbackController.m; sourceTree = SOURCE_ROOT; }; B6403FD60A7E4B1A00E00B11 /* loader.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = loader.c; sourceTree = ""; }; @@ -920,6 +926,11 @@ F5F291060396932B01730B00 /* Credits.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; path = Credits.html; sourceTree = ""; }; F5F876370399540D011FA3A4 /* FuseController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = FuseController.h; path = controllers/FuseController.h; sourceTree = SOURCE_ROOT; }; F5F876380399540D011FA3A4 /* FuseController.m */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; name = FuseController.m; path = controllers/FuseController.m; sourceTree = SOURCE_ROOT; tabWidth = 2; }; + FE0A0201301F000000000001 /* ramfs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ramfs.c; sourceTree = ""; }; + FE0A0202301F000000000001 /* ramfs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ramfs.h; sourceTree = ""; }; + FE0A0203301F000000000001 /* xfs_overlay.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = xfs_overlay.c; sourceTree = ""; }; + FE0A0204301F000000000001 /* xfs_romfs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = xfs_romfs.c; sourceTree = ""; }; + FE0A0205301F000000000001 /* ../roms/spxromfs.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; path = ../roms/spxromfs.bin; sourceTree = SOURCE_ROOT; }; FE2DAC582F328D96009AC45A /* xfs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = xfs.h; sourceTree = ""; }; FE2DAC592F328D96009AC45A /* xfs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = xfs.c; sourceTree = ""; }; FE2DAC5C2F328DD5009AC45A /* xfs_engines.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = xfs_engines.h; sourceTree = ""; }; @@ -976,6 +987,7 @@ FEC02C9C2EEF65D5008277BA /* spectranext_controller.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = spectranext_controller.c; sourceTree = ""; }; FEC02C9D2EEF65D5008277BA /* spectranext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = spectranext.h; sourceTree = ""; }; FEC02C9E2EEF65D6008277BA /* spectranext_controller.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = spectranext_controller.h; sourceTree = ""; }; + FEC51079347A105100000001 /* snes_ntsc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = snes_ntsc.c; path = ../ui/scaler/snes_ntsc.c; sourceTree = SOURCE_ROOT; }; FED23B102EE096F10013DD32 /* mbedtls_config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mbedtls_config.h; sourceTree = ""; }; FED23B112EE096F10013DD32 /* tls.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tls.h; sourceTree = ""; }; FED23B122EE096F10013DD32 /* tls.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = tls.c; sourceTree = ""; }; @@ -984,6 +996,10 @@ FED24DE42EE10B590013DD32 /* dns_resolver.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = dns_resolver.c; sourceTree = ""; }; FED24DE52EE10B590013DD32 /* dns_processor.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = dns_processor.c; sourceTree = ""; }; FED24DE82EE10C370013DD32 /* dns_resolver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dns_resolver.h; sourceTree = ""; }; + FEFB7C1E301EB52200F1CFEC /* xfs_https_compat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = xfs_https_compat.h; sourceTree = ""; }; + FEFB7C1F301EB52200F1CFEC /* xfs_https_compat.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = xfs_https_compat.c; sourceTree = ""; }; + FEFB7C21301EB52E00F1CFEC /* xfs_compat.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = xfs_compat.c; sourceTree = ""; }; + FEFB7C233023F19700F1CFEC /* scalers32.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = scalers32.c; path = scaler/scalers32.c; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1273,6 +1289,7 @@ 3B061F2A9CBA3011FBE7A640 /* d80.icns */, 06FA366DDA50516B0E710919 /* mlt.icns */, 384001994B177FFEB8AE6C99 /* udi.icns */, + FE0A0205301F000000000001 /* ../roms/spxromfs.bin */, ); path = resources; sourceTree = ""; @@ -1715,6 +1732,7 @@ B63ABD8D042F175200A864FD /* scaler.c */, FEC51079347A105100000001 /* snes_ntsc.c */, B62B19E00DD31DF500D42AAF /* scalers16.c */, + FEFB7C233023F19700F1CFEC /* scalers32.c */, ); path = scaler; sourceTree = ""; @@ -1848,10 +1866,17 @@ FE2DAC5C2F328DD5009AC45A /* xfs_engines.h */, FE2DAC582F328D96009AC45A /* xfs.h */, FE2DAC592F328D96009AC45A /* xfs.c */, + FEFB7C21301EB52E00F1CFEC /* xfs_compat.c */, + FE0A0202301F000000000001 /* ramfs.h */, + FE0A0201301F000000000001 /* ramfs.c */, FE2DAC6A2F329E6D009AC45A /* xfs_fs.c */, + FE0A0203301F000000000001 /* xfs_overlay.c */, + FE0A0204301F000000000001 /* xfs_romfs.c */, FE2DAC6B2F329E6D009AC45A /* xfs_worker.c */, FE2DAC6E2F329EE2009AC45A /* xfs_worker.h */, FE2DAC762F32A480009AC45A /* xfs_https.c */, + FEFB7C1E301EB52200F1CFEC /* xfs_https_compat.h */, + FEFB7C1F301EB52200F1CFEC /* xfs_https_compat.c */, ); path = fs; sourceTree = ""; @@ -2103,6 +2128,7 @@ 7F7BB782D4AEBC99DC6AF1C8 /* d80.icns in Resources */, 03A9A1325AFA09F88C578556 /* mlt.icns in Resources */, 7C22B962B64B1942413DF26A /* udi.icns in Resources */, + FE0A0104301F000000000001 /* ../roms/spxromfs.bin in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2249,10 +2275,15 @@ B6A6F1200B3EA737000B88E9 /* cocoascreenshot.m in Sources */, B6D0E10B1CFD54D400202683 /* uimedia.c in Sources */, B615BFE80B4261E50082D535 /* HIDJoysticks.m in Sources */, + FEFB7C243023F19700F1CFEC /* scalers32.c in Sources */, B6B076B30B59FE9A00D4F95C /* Emulator.m in Sources */, B6D0E1031CFD547C00202683 /* didaktik.c in Sources */, B6B99F8A0B5F798700EE408F /* cocoadisplay.m in Sources */, B67DC2190B63835100FA31B6 /* cocoastatusbar.m in Sources */, + FEFB7C22301EB52E00F1CFEC /* xfs_compat.c in Sources */, + FE0A0101301F000000000001 /* ramfs.c in Sources */, + FE0A0102301F000000000001 /* xfs_overlay.c in Sources */, + FE0A0103301F000000000001 /* xfs_romfs.c in Sources */, B68C32961D3BBF2D0082CBD4 /* startup_manager.c in Sources */, B65352F20B8CF6CC0083F942 /* SDL_sysjoystick.c in Sources */, B65353150B8FF3D20083F942 /* SDL_joystick.c in Sources */, @@ -2307,6 +2338,7 @@ FE2DAC7B2F32A500009AC45A /* httpc.c in Sources */, FE2DAC772F32A480009AC45A /* xfs_https.c in Sources */, B6DCBBD2114FA0E700DC9A11 /* ide.c in Sources */, + FEFB7C20301EB52200F1CFEC /* xfs_https_compat.c in Sources */, B6DCBBD4114FA0E700DC9A11 /* libspectrum.c in Sources */, B6DCBBD9114FA0E700DC9A11 /* memory.c in Sources */, B6DCBBDA114FA0E700DC9A11 /* microdrive.c in Sources */, diff --git a/fusepb/scaler/scalers32.c b/fusepb/scaler/scalers32.c new file mode 100644 index 000000000..1931cec4e --- /dev/null +++ b/fusepb/scaler/scalers32.c @@ -0,0 +1,28 @@ +/* scalers.c: the actual graphics scalers + * Copyright (C) 2003 Fredrick Meunier, Philip Kendall + * + * $Id$ + * + * Originally taken from ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001/2002 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#define SCALER_DATA_SIZE 4 + +#include "ui/scaler/scalers.c" diff --git a/peripherals/Makefile.am b/peripherals/Makefile.am index 7428ba9e0..93c7497ec 100644 --- a/peripherals/Makefile.am +++ b/peripherals/Makefile.am @@ -85,9 +85,14 @@ fuse_SOURCES += \ peripherals/nic/spectranext_controller.c \ peripherals/nic/spectranext_stdout.c \ peripherals/fs/xfs.c \ + peripherals/fs/xfs_compat.c \ peripherals/fs/xfs_worker.c \ peripherals/fs/xfs_fs.c \ + peripherals/fs/xfs_overlay.c \ + peripherals/fs/xfs_romfs.c \ + peripherals/fs/ramfs.c \ peripherals/fs/xfs_https.c \ + peripherals/fs/xfs_https_compat.c \ peripherals/http/httpc.c \ peripherals/http/http_sck.c \ peripherals/security/tls.c \ diff --git a/peripherals/fs/ramfs.c b/peripherals/fs/ramfs.c new file mode 100644 index 000000000..b9a74ba76 --- /dev/null +++ b/peripherals/fs/ramfs.c @@ -0,0 +1,145 @@ +#include "ramfs.h" + +#include +#include + +static uint32_t read_u32(uint32_t value) +{ + return value; +} + +static uint16_t read_u16(uint16_t value) +{ + return value; +} + +static void normalize_path(const char* in, char* out, size_t out_size) +{ + if (!out || out_size == 0) + return; + + if (!in || in[0] == '\0' || strcmp(in, "/") == 0) + { + strncpy(out, "/", out_size - 1); + out[out_size - 1] = '\0'; + return; + } + + size_t pos = 0; + out[pos++] = '/'; + while (*in == '/') + in++; + while (*in && pos + 1 < out_size) + { + out[pos++] = *in++; + } + while (pos > 1 && out[pos - 1] == '/') + pos--; + out[pos] = '\0'; +} + +static uint8_t entry_full_path(const ramfs_entry_t* entry, char* out, size_t out_size) +{ + if (!entry || !out || out_size == 0) + return 0; + if (strncmp(entry->parent, "/", sizeof(entry->parent)) == 0) + { + int n = snprintf(out, out_size, "/%s", entry->name); + return n > 0 && (size_t)n < out_size; + } + int n = snprintf(out, out_size, "%s/%s", entry->parent, entry->name); + return n > 0 && (size_t)n < out_size; +} + +uint8_t ramfs_mount(const uint8_t* start, const uint8_t* end, ramfs_t* fs) +{ + if (!start || !end || !fs || end < start || (size_t)(end - start) < sizeof(ramfs_header_t)) + return 0; + + memset(fs, 0, sizeof(*fs)); + fs->start = start; + fs->size = (size_t)(end - start); + fs->header = (const ramfs_header_t*)start; + + if (read_u32(fs->header->magic) != RAMFS_MAGIC || + read_u16(fs->header->version) != RAMFS_VERSION || + read_u16(fs->header->entry_size) != sizeof(ramfs_entry_t)) + { + return 0; + } + + const uint32_t entry_count = read_u32(fs->header->entry_count); + const uint32_t data_offset = read_u32(fs->header->data_offset); + const uint32_t data_size = read_u32(fs->header->data_size); + const size_t table_end = sizeof(ramfs_header_t) + (size_t)entry_count * sizeof(ramfs_entry_t); + if (table_end > fs->size || data_offset < table_end || (size_t)data_offset + data_size > fs->size) + return 0; + + fs->entries = (const ramfs_entry_t*)(start + sizeof(ramfs_header_t)); + fs->data = start + data_offset; + return 1; +} + +const ramfs_entry_t* ramfs_find(const ramfs_t* fs, const char* path) +{ + if (!fs || !fs->entries) + return NULL; + + char wanted[XFS_PATH_MAX]; + char current[XFS_PATH_MAX]; + normalize_path(path, wanted, sizeof(wanted)); + if (strcmp(wanted, "/") == 0) + return NULL; + + for (uint32_t i = 0; i < read_u32(fs->header->entry_count); ++i) + { + if (!entry_full_path(&fs->entries[i], current, sizeof(current))) + continue; + if (strcmp(current, wanted) == 0) + return &fs->entries[i]; + } + return NULL; +} + +uint8_t ramfs_opendir(const ramfs_t* fs, const char* path, ramfs_dir_t* dir) +{ + if (!fs || !fs->entries || !dir) + return 0; + + normalize_path(path, dir->path, sizeof(dir->path)); + if (strcmp(dir->path, "/") != 0) + { + const ramfs_entry_t* entry = ramfs_find(fs, dir->path); + if (!entry || entry->type != RAMFS_TYPE_DIR) + return 0; + } + dir->index = 0; + return 1; +} + +const ramfs_entry_t* ramfs_readdir(const ramfs_t* fs, ramfs_dir_t* dir) +{ + if (!fs || !fs->entries || !dir) + return NULL; + + const uint32_t count = read_u32(fs->header->entry_count); + while (dir->index < count) + { + const ramfs_entry_t* entry = &fs->entries[dir->index++]; + if (strncmp(entry->parent, dir->path, sizeof(entry->parent)) == 0) + return entry; + } + return NULL; +} + +const uint8_t* ramfs_file_data(const ramfs_t* fs, const ramfs_entry_t* entry) +{ + if (!fs || !entry || entry->type != RAMFS_TYPE_REG) + return NULL; + + const uint32_t offset = read_u32(entry->offset); + const uint32_t size = read_u32(entry->size); + if ((size_t)offset + size > read_u32(fs->header->data_size)) + return NULL; + return fs->data + offset; +} diff --git a/peripherals/fs/ramfs.h b/peripherals/fs/ramfs.h new file mode 100644 index 000000000..3841730ed --- /dev/null +++ b/peripherals/fs/ramfs.h @@ -0,0 +1,59 @@ +#pragma once + +#include +#include + +#include "xfs.h" + +#define RAMFS_MAGIC 0x46524e53u +#define RAMFS_VERSION 1 +#define RAMFS_NAME_MAX 64 +#define RAMFS_PARENT_MAX 128 + +enum ramfs_entry_type +{ + RAMFS_TYPE_REG = 1, + RAMFS_TYPE_DIR = 2, +}; + +typedef struct __attribute__((packed)) +{ + uint32_t magic; + uint16_t version; + uint16_t entry_size; + uint32_t entry_count; + uint32_t data_offset; + uint32_t data_size; +} ramfs_header_t; + +typedef struct __attribute__((packed)) +{ + char parent[RAMFS_PARENT_MAX]; + char name[RAMFS_NAME_MAX]; + uint8_t type; + uint8_t reserved[3]; + uint32_t offset; + uint32_t size; + uint32_t mtime; +} ramfs_entry_t; + +typedef struct +{ + const uint8_t* start; + size_t size; + const ramfs_header_t* header; + const ramfs_entry_t* entries; + const uint8_t* data; +} ramfs_t; + +typedef struct +{ + uint32_t index; + char path[XFS_PATH_MAX]; +} ramfs_dir_t; + +uint8_t ramfs_mount(const uint8_t* start, const uint8_t* end, ramfs_t* fs); +const ramfs_entry_t* ramfs_find(const ramfs_t* fs, const char* path); +uint8_t ramfs_opendir(const ramfs_t* fs, const char* path, ramfs_dir_t* dir); +const ramfs_entry_t* ramfs_readdir(const ramfs_t* fs, ramfs_dir_t* dir); +const uint8_t* ramfs_file_data(const ramfs_t* fs, const ramfs_entry_t* entry); diff --git a/peripherals/fs/xfs.c b/peripherals/fs/xfs.c index 44ec91505..1fb793b6e 100644 --- a/peripherals/fs/xfs.c +++ b/peripherals/fs/xfs.c @@ -7,7 +7,7 @@ struct xfs_engine_mount_t xfs_mounted_engines[4] = {0}; // Handles array - shared between task and emulator -struct xfs_handle_t xfs_handles[XFS_MAX_FDS] = {0}; +struct xfs_handle_t xfs_handles[XFS_MAX_FDS] = {}; // Helper functions static inline struct xfs_handle_t* get_handle(uint8_t handle) @@ -53,6 +53,109 @@ static inline bool ensure_mounted(const uint8_t mount_point) return (xfs_mounted_engines[mount_point].engine != NULL); } +static void xfs_set_root_cwd(struct xfs_engine_mount_t* mount) +{ + if (!mount->cwd) + { + return; + } + mount->cwd[0] = '/'; + mount->cwd[1] = '\0'; +} + +static int16_t xfs_resolve_path(const struct xfs_engine_mount_t* mount, const char* path, + char* out, const size_t out_size) +{ + if (!path || !out || out_size < 2) + { + return XFS_ERR_INVAL; + } + + const char* cwd = (mount && mount->cwd && mount->cwd[0]) ? mount->cwd : "/"; + + char combined[XFS_PATH_MAX]; + int written; + if (path[0] == '/') + { + written = snprintf(combined, sizeof(combined), "%s", path); + } + else if (cwd[0] == '/' && cwd[1] == '\0') + { + written = snprintf(combined, sizeof(combined), "/%s", path); + } + else + { + written = snprintf(combined, sizeof(combined), "%s/%s", cwd, path); + } + if (written < 0 || (size_t)written >= sizeof(combined)) + { + return XFS_ERR_NAMETOOLONG; + } + + size_t out_len = 0; + out[out_len++] = '/'; + out[out_len] = '\0'; + + char* segment = combined; + while (*segment) + { + while (*segment == '/') + { + segment++; + } + if (!*segment) + { + break; + } + + char* next = segment; + while (*next && *next != '/') + { + next++; + } + + const size_t len = (size_t)(next - segment); + if (len == 1 && segment[0] == '.') + { + /* Stay in the current directory. */ + } + else if (len == 2 && segment[0] == '.' && segment[1] == '.') + { + if (out_len > 1) + { + out_len--; + while (out_len > 1 && out[out_len - 1] != '/') + { + out_len--; + } + out[out_len] = '\0'; + } + } + else + { + if (out_len > 1) + { + if (out_len + 1 >= out_size) + { + return XFS_ERR_NAMETOOLONG; + } + out[out_len++] = '/'; + } + if (out_len + len >= out_size) + { + return XFS_ERR_NAMETOOLONG; + } + memcpy(out + out_len, segment, len); + out_len += len; + out[out_len] = '\0'; + } + + segment = next; + } + + return XFS_ERR_OK; +} + /** * Handle XFS mount command */ @@ -87,7 +190,7 @@ void xfs_handle_mount(volatile struct xfs_registers_t* registers) return; } - struct xfs_engine_t* engine = NULL; + const struct xfs_engine_t* engine = NULL; if (strcmp(protocol, "xfs") == 0) { @@ -95,7 +198,7 @@ void xfs_handle_mount(volatile struct xfs_registers_t* registers) if (strcmp(hostname, "ram") == 0 && (path[0] == '\0' || strcmp(path, "/") == 0)) { - engine = &xfs_ram_engine; + engine = &xfs_overlay_engine; } else { @@ -133,6 +236,8 @@ void xfs_handle_mount(volatile struct xfs_registers_t* registers) else { xfs_mounted_engines[mount_point].engine = engine; + xfs_mounted_engines[mount_point].cwd = xfs_compat_get_cwd_buffer(mount_point); + xfs_set_root_cwd(&xfs_mounted_engines[mount_point]); XFS_DEBUG("xfs: mount success mount_point=%d\n", mount_point); registers->result = 0; registers->status = XFS_STATUS_COMPLETE; @@ -185,11 +290,12 @@ void xfs_handle_umount(volatile struct xfs_registers_t* registers) return; } - struct xfs_engine_t* const eng = xfs_mounted_engines[mount_point].engine; + const struct xfs_engine_t* const eng = xfs_mounted_engines[mount_point].engine; if (eng->unmount) eng->unmount(eng, &xfs_mounted_engines[mount_point]); xfs_mounted_engines[mount_point].engine = NULL; + xfs_mounted_engines[mount_point].cwd = NULL; XFS_DEBUG("xfs: umount success mount_point=%d\n", mount_point); registers->result = 0; @@ -280,8 +386,18 @@ void xfs_handle_open(volatile struct xfs_registers_t* registers) struct xfs_handle_t* h = get_handle(handle); const struct xfs_engine_mount_t* mounted_engine = &xfs_mounted_engines[mount_point]; + char resolved_path[XFS_PATH_MAX]; + int16_t err = xfs_resolve_path(mounted_engine, path, resolved_path, sizeof(resolved_path)); + if (err) + { + XFS_DEBUG("xfs: open path resolution failed: result=%d\n", err); + free_handle(handle, mount_point); + registers->result = err; + registers->status = XFS_STATUS_ERROR; + return; + } - const int16_t err = mounted_engine->engine->open(mounted_engine, h, path, xfs_flags); + err = mounted_engine->engine->open(mounted_engine, h, resolved_path, xfs_flags); if (err) { @@ -293,7 +409,7 @@ void xfs_handle_open(volatile struct xfs_registers_t* registers) else { h->owner_mount = mount_point; - XFS_DEBUG("xfs: open success handle=%d\n", handle); + XFS_DEBUG("xfs: open success path=%s handle=%d\n", resolved_path, handle); registers->file_handle = handle; registers->result = 0; registers->status = XFS_STATUS_COMPLETE; @@ -437,11 +553,21 @@ void xfs_handle_opendir(volatile struct xfs_registers_t* registers) } struct xfs_handle_t* h = get_handle(handle); - const int16_t err = mounted_engine->engine->opendir(mounted_engine, h, path); + char resolved_path[XFS_PATH_MAX]; + int16_t err = xfs_resolve_path(mounted_engine, path, resolved_path, sizeof(resolved_path)); + if (err) + { + XFS_DEBUG("xfs: opendir path resolution failed: result=%d mount_point=%d\n", err, mount_point); + free_handle(handle, mount_point); + registers->result = err; + registers->status = XFS_STATUS_ERROR; + return; + } + err = mounted_engine->engine->opendir(mounted_engine, h, resolved_path); if (err) { - XFS_DEBUG("xfs: opendir %s failed: result=%d mount_point=%d\n", path, err, mount_point); + XFS_DEBUG("xfs: opendir %s failed: result=%d mount_point=%d\n", resolved_path, err, mount_point); free_handle(handle, mount_point); registers->result = err; registers->status = XFS_STATUS_ERROR; @@ -449,7 +575,7 @@ void xfs_handle_opendir(volatile struct xfs_registers_t* registers) else { h->owner_mount = mount_point; - XFS_DEBUG("xfs: opendir %s success handle=%d mount_point=%d\n", path, handle, mount_point); + XFS_DEBUG("xfs: opendir %s success handle=%d mount_point=%d\n", resolved_path, handle, mount_point); registers->result = 0; registers->file_handle = handle; registers->status = XFS_STATUS_COMPLETE; @@ -560,8 +686,18 @@ void xfs_handle_stat(volatile struct xfs_registers_t* registers) return; } + char resolved_path[XFS_PATH_MAX]; + int16_t err = xfs_resolve_path(mounted_engine, path, resolved_path, sizeof(resolved_path)); + if (err) + { + XFS_DEBUG("xfs: stat path resolution failed: result=%d\n", err); + registers->result = err; + registers->status = XFS_STATUS_ERROR; + return; + } + struct xfs_stat_info info = {0}; - const int16_t err = mounted_engine->engine->stat(mounted_engine, path, &info); + err = mounted_engine->engine->stat(mounted_engine, resolved_path, &info); if (err) { @@ -590,7 +726,7 @@ void xfs_handle_stat(volatile struct xfs_registers_t* registers) uint8_t* strings = (uint8_t*)registers->workspace + 22; strings[0] = 0; strings[1] = 0; - XFS_DEBUG("xfs: stat success size=%lu mode=0x%04x\n", info.size, stat->mode); + XFS_DEBUG("xfs: stat success path=%s size=%lu mode=0x%04x\n", resolved_path, info.size, stat->mode); registers->result = 0; registers->status = XFS_STATUS_COMPLETE; } @@ -611,7 +747,17 @@ void xfs_handle_unlink(volatile struct xfs_registers_t* registers) return; } - const int16_t err = mounted_engine->engine->unlink(mounted_engine, path); + char resolved_path[XFS_PATH_MAX]; + int16_t err = xfs_resolve_path(mounted_engine, path, resolved_path, sizeof(resolved_path)); + if (err) + { + XFS_DEBUG("xfs: unlink path resolution failed: result=%d\n", err); + registers->result = err; + registers->status = XFS_STATUS_ERROR; + return; + } + + err = mounted_engine->engine->unlink(mounted_engine, resolved_path); if (err) { @@ -621,7 +767,7 @@ void xfs_handle_unlink(volatile struct xfs_registers_t* registers) } else { - XFS_DEBUG("xfs: unlink success\n"); + XFS_DEBUG("xfs: unlink success path=%s\n", resolved_path); registers->result = 0; registers->status = XFS_STATUS_COMPLETE; } @@ -642,7 +788,17 @@ void xfs_handle_mkdir(volatile struct xfs_registers_t* registers) return; } - const int16_t err = mounted_engine->engine->mkdir(mounted_engine, path); + char resolved_path[XFS_PATH_MAX]; + int16_t err = xfs_resolve_path(mounted_engine, path, resolved_path, sizeof(resolved_path)); + if (err) + { + XFS_DEBUG("xfs: mkdir path resolution failed: result=%d\n", err); + registers->result = err; + registers->status = XFS_STATUS_ERROR; + return; + } + + err = mounted_engine->engine->mkdir(mounted_engine, resolved_path); if (err) { @@ -652,7 +808,7 @@ void xfs_handle_mkdir(volatile struct xfs_registers_t* registers) } else { - XFS_DEBUG("xfs: mkdir success\n"); + XFS_DEBUG("xfs: mkdir success path=%s\n", resolved_path); registers->result = 0; registers->status = XFS_STATUS_COMPLETE; } @@ -673,7 +829,17 @@ void xfs_handle_rmdir(volatile struct xfs_registers_t* registers) return; } - const int16_t err = mounted_engine->engine->rmdir(mounted_engine, path); + char resolved_path[XFS_PATH_MAX]; + int16_t err = xfs_resolve_path(mounted_engine, path, resolved_path, sizeof(resolved_path)); + if (err) + { + XFS_DEBUG("xfs: rmdir path resolution failed: result=%d\n", err); + registers->result = err; + registers->status = XFS_STATUS_ERROR; + return; + } + + err = mounted_engine->engine->rmdir(mounted_engine, resolved_path); if (err) { @@ -683,7 +849,7 @@ void xfs_handle_rmdir(volatile struct xfs_registers_t* registers) } else { - XFS_DEBUG("xfs: rmdir success\n"); + XFS_DEBUG("xfs: rmdir success path=%s\n", resolved_path); registers->result = 0; registers->status = XFS_STATUS_COMPLETE; } @@ -694,7 +860,7 @@ void xfs_handle_chdir(volatile struct xfs_registers_t* registers) const char* path = (const char*)registers->arguments.chdir.path; const uint8_t mount_point = registers->mount_point; const struct xfs_engine_mount_t* mounted_engine = &xfs_mounted_engines[mount_point]; - XFS_DEBUG("xfs: chdir path=%s (not supported by littlefs)\n", path); + XFS_DEBUG("xfs: chdir path=%s\n", path); if (!ensure_mounted(mount_point)) { @@ -704,8 +870,27 @@ void xfs_handle_chdir(volatile struct xfs_registers_t* registers) return; } + char resolved_path[XFS_PATH_MAX]; + int16_t err = xfs_resolve_path(mounted_engine, path, resolved_path, sizeof(resolved_path)); + if (err) + { + XFS_DEBUG("xfs: chdir path resolution failed: result=%d\n", err); + registers->result = err; + registers->status = XFS_STATUS_ERROR; + return; + } + struct xfs_stat_info info; - const int err = mounted_engine->engine->stat(mounted_engine, path, &info); + if (strcmp(resolved_path, "/") == 0) + { + memset(&info, 0, sizeof(info)); + info.type = XFS_TYPE_DIR; + err = XFS_ERR_OK; + } + else + { + err = mounted_engine->engine->stat(mounted_engine, resolved_path, &info); + } if (err || info.type != XFS_TYPE_DIR) { @@ -715,7 +900,8 @@ void xfs_handle_chdir(volatile struct xfs_registers_t* registers) } else { - XFS_DEBUG("xfs: chdir success (path verified)\n"); + snprintf(xfs_mounted_engines[mount_point].cwd, XFS_PATH_MAX, "%s", resolved_path); + XFS_DEBUG("xfs: chdir success cwd=%s\n", xfs_mounted_engines[mount_point].cwd); registers->result = 0; registers->status = XFS_STATUS_COMPLETE; } @@ -724,9 +910,6 @@ void xfs_handle_chdir(volatile struct xfs_registers_t* registers) void xfs_handle_getcwd(volatile struct xfs_registers_t* registers) { const uint8_t mount_point = registers->mount_point; - const struct xfs_engine_mount_t* mounted_engine = &xfs_mounted_engines[mount_point]; - - XFS_DEBUG("xfs: getcwd (littlefs always returns root)\n"); if (!ensure_mounted(mount_point)) { XFS_DEBUG("xfs: getcwd failed: not mounted\n"); @@ -737,15 +920,16 @@ void xfs_handle_getcwd(volatile struct xfs_registers_t* registers) char* path = (char*)registers->workspace; uint16_t len = registers->arguments.getcwd.buffer_size; - - int16_t err = mounted_engine->engine->getcwd(mounted_engine, path, len); - if (err) + + if (len == 0) { - registers->result = err; + registers->result = XFS_ERR_INVAL; registers->status = XFS_STATUS_ERROR; return; } - + + const char* cwd = xfs_mounted_engines[mount_point].cwd ? xfs_mounted_engines[mount_point].cwd : "/"; + snprintf(path, len, "%s", cwd); XFS_DEBUG("xfs: getcwd success path=%s\n", path); registers->result = 0; registers->status = XFS_STATUS_COMPLETE; @@ -768,7 +952,22 @@ void xfs_handle_rename(volatile struct xfs_registers_t* registers) return; } - const int16_t err = mounted_engine->engine->rename(mounted_engine, old_path, new_path); + char resolved_old_path[XFS_PATH_MAX]; + char resolved_new_path[XFS_PATH_MAX]; + int16_t err = xfs_resolve_path(mounted_engine, old_path, resolved_old_path, sizeof(resolved_old_path)); + if (!err) + { + err = xfs_resolve_path(mounted_engine, new_path, resolved_new_path, sizeof(resolved_new_path)); + } + if (err) + { + XFS_DEBUG("xfs: rename path resolution failed: result=%d\n", err); + registers->result = err; + registers->status = XFS_STATUS_ERROR; + return; + } + + err = mounted_engine->engine->rename(mounted_engine, resolved_old_path, resolved_new_path); if (err) { @@ -778,7 +977,7 @@ void xfs_handle_rename(volatile struct xfs_registers_t* registers) } else { - XFS_DEBUG("xfs: rename success\n"); + XFS_DEBUG("xfs: rename success old=%s new=%s\n", resolved_old_path, resolved_new_path); registers->result = 0; registers->status = XFS_STATUS_COMPLETE; } @@ -809,7 +1008,17 @@ void xfs_handle_chmod(volatile struct xfs_registers_t* registers) return; } - const int16_t err = mounted_engine->engine->chmod(mounted_engine, path, mode); + char resolved_path[XFS_PATH_MAX]; + int16_t err = xfs_resolve_path(mounted_engine, path, resolved_path, sizeof(resolved_path)); + if (err) + { + XFS_DEBUG("xfs: chmod path resolution failed: result=%d\n", err); + registers->result = err; + registers->status = XFS_STATUS_ERROR; + return; + } + + err = mounted_engine->engine->chmod(mounted_engine, resolved_path, mode); if (err) { diff --git a/peripherals/fs/xfs.h b/peripherals/fs/xfs.h index fa57f7aa0..9e034ac9b 100644 --- a/peripherals/fs/xfs.h +++ b/peripherals/fs/xfs.h @@ -6,6 +6,8 @@ #include #define XFS_SPECTRANET_PAGE (0x49) +#define XFS_PATH_MAX (256) +#define XFS_OVERLAY_MAX_LAYERS 4 // XFS error codes (mapped from LittleFS error codes) enum xfs_error { @@ -83,15 +85,19 @@ struct xfs_handle_t; struct xfs_engine_mount_t { - struct xfs_engine_t* engine; + const struct xfs_engine_t* engine; void* mount_data; + char* cwd; }; +#ifndef FS_STORAGE_ENUM_DEFINED +#define FS_STORAGE_ENUM_DEFINED enum { FS_STORAGE_RAM = 0, FS_STORAGE_FLASH = 1, }; +#endif struct xfs_stat_info { @@ -146,6 +152,30 @@ struct xfs_engine_t void (*free_handle)(const struct xfs_engine_mount_t* engine, struct xfs_handle_t* handle); }; +typedef struct +{ + const struct xfs_engine_t* engine; + const char* hostname; + const char* path; +} xfs_overlay_layer_config_t; + +typedef struct +{ + const xfs_overlay_layer_config_t* layers[XFS_OVERLAY_MAX_LAYERS + 1]; + const xfs_overlay_layer_config_t* default_layer; +} xfs_overlay_config_t; + +typedef struct +{ + const uint8_t* start; + const uint8_t* end; + const char* name; + uint8_t storage; +} xfs_romfs_config_t; + +extern const xfs_overlay_config_t xfs_default_overlay; +extern xfs_romfs_config_t xfs_default_romfs; + enum xfs_handle_type_t { XFS_HANDLE_TYPE_NONE = 0, @@ -337,7 +367,10 @@ void xfs_close_handles_for_mount(const struct xfs_engine_mount_t *mount); extern void xfs_debug_enable(bool enable); extern bool xfs_debug_is_enabled(void); extern void xfs_debug_log(const char *format, ...); -#define XFS_DEBUG(...) do { if( xfs_debug_is_enabled() ) xfs_debug_log( __VA_ARGS__ ); } while(0) +#define XFS_DEBUG(...) do { if (xfs_debug_is_enabled()) xfs_debug_log(__VA_ARGS__); } while(0) + +char* xfs_compat_get_cwd_buffer(uint8_t mount_point); +void xfs_compat_init(void); // Command handlers (FreeRTOS-independent, usable in emulator) extern void xfs_handle_command(volatile struct xfs_registers_t* registers); diff --git a/peripherals/fs/xfs_compat.c b/peripherals/fs/xfs_compat.c new file mode 100644 index 000000000..1dc76c2a2 --- /dev/null +++ b/peripherals/fs/xfs_compat.c @@ -0,0 +1,99 @@ +#include "config.h" + +#include "xfs.h" +#include "xfs_engines.h" + +#include +#include +#include + +#include "debugger/gdbserver.h" +#include "utils.h" + +static char xfs_cwd_buffers[4][XFS_PATH_MAX]; +static utils_file xfs_romfs_file = { 0 }; +static bool xfs_romfs_loaded = false; + +static const xfs_overlay_layer_config_t xfs_romfs_layer = { + .engine = &xfs_romfs_engine, + .hostname = "romfs", + .path = "/", +}; + +static const xfs_overlay_layer_config_t xfs_ram_layer = { + .engine = &xfs_ram_engine, + .hostname = "ram", + .path = "/", +}; + +xfs_romfs_config_t xfs_default_romfs = { + .start = NULL, + .end = NULL, + .name = "romfs", + .storage = FS_STORAGE_FLASH, +}; + +const xfs_overlay_config_t xfs_default_overlay = { + .layers = { &xfs_romfs_layer, &xfs_ram_layer, NULL }, + .default_layer = &xfs_ram_layer, +}; + +static bool xfs_compat_load_romfs_file(const char* path) +{ + utils_file file = { 0 }; + if (utils_read_file(path, &file) != 0) + return false; + + xfs_romfs_file = file; + xfs_default_romfs.start = xfs_romfs_file.buffer; + xfs_default_romfs.end = xfs_romfs_file.buffer + xfs_romfs_file.length; + xfs_romfs_loaded = true; + return true; +} + +void xfs_compat_init(void) +{ + if (xfs_romfs_loaded) + return; + + utils_file file = { 0 }; + if (utils_read_auxiliary_file("spxromfs.bin", &file, UTILS_AUXILIARY_ROM) == 0) + { + xfs_romfs_file = file; + xfs_default_romfs.start = xfs_romfs_file.buffer; + xfs_default_romfs.end = xfs_romfs_file.buffer + xfs_romfs_file.length; + xfs_romfs_loaded = true; + } + else if (!xfs_compat_load_romfs_file("fuse/roms/spxromfs.bin") && + !xfs_compat_load_romfs_file("../roms/spxromfs.bin") && + !xfs_compat_load_romfs_file("roms/spxromfs.bin")) + { + XFS_DEBUG("xfs: spxromfs.bin not found; ROMFS overlay disabled\n"); + } +} + +char* xfs_compat_get_cwd_buffer(uint8_t mount_point) +{ + if (mount_point >= 4) + { + return NULL; + } + + return xfs_cwd_buffers[mount_point]; +} + +void xfs_debug_log(const char *format, ...) +{ + va_list args; + va_list remote_args; + char buffer[1024]; + + va_start(args, format); + va_copy(remote_args, args); + vprintf(format, args); + vsnprintf(buffer, sizeof(buffer), format, remote_args); + va_end(remote_args); + va_end(args); + + gdbserver_send_remote_console_output(buffer); +} diff --git a/peripherals/fs/xfs_engines.h b/peripherals/fs/xfs_engines.h index 26214a117..73f821882 100644 --- a/peripherals/fs/xfs_engines.h +++ b/peripherals/fs/xfs_engines.h @@ -5,3 +5,5 @@ extern struct xfs_engine_t http_engine; extern struct xfs_engine_t https_engine; extern struct xfs_engine_t xfs_ram_engine; +extern const struct xfs_engine_t xfs_romfs_engine; +extern const struct xfs_engine_t xfs_overlay_engine; diff --git a/peripherals/fs/xfs_fs.c b/peripherals/fs/xfs_fs.c index e28890395..1521f20ec 100644 --- a/peripherals/fs/xfs_fs.c +++ b/peripherals/fs/xfs_fs.c @@ -373,7 +373,7 @@ static int16_t fs_readdir(const struct xfs_engine_mount_t* engine, struct xfs_ha struct dirent *entry; int err = 0; - // Read directory entries, skipping "." + // Read directory entries, skipping hidden dot entries but preserving parent navigation. errno = 0; do { @@ -386,8 +386,7 @@ static int16_t fs_readdir(const struct xfs_engine_mount_t* engine, struct xfs_ha } break; // End of directory or error } - // Skip "." entries - } while (strcmp(entry->d_name, ".") == 0); + } while (entry->d_name[0] == '.' && strcmp(entry->d_name, "..") != 0); if (err != 0) { diff --git a/peripherals/fs/xfs_https.c b/peripherals/fs/xfs_https.c index 2edf0908c..40b52e013 100644 --- a/peripherals/fs/xfs_https.c +++ b/peripherals/fs/xfs_https.c @@ -1,20 +1,10 @@ -#include "config.h" - #include "xfs.h" -#include "xfs_worker.h" +#include "xfs_https_compat.h" +#include #include #include #include -#include -#include -#include -#include -#include - -#include "libspectrum.h" -#include "../http/httpc.h" -#include "../http/http_sck.h" struct xfs_handle_https_file_t { @@ -72,18 +62,9 @@ struct https_engine_mount_data_t static inline struct https_engine_mount_data_t* get_mount_data(const struct xfs_engine_mount_t* engine_mount) { - return (struct https_engine_mount_data_t*)engine_mount->mount_data; + return engine_mount->mount_data; } -// Structure to hold buffer information during download -struct https_buffer_info_t -{ - void* data; // Buffer pointer - size_t size; // Current buffer size - size_t capacity; // Current buffer capacity - size_t expected_size; // Fixed response size when provided -}; - // Helper function to build full URL from base URL + path // base_url should be the mount URL (e.g., "https://hostname/path/") // path is the relative path to append @@ -195,10 +176,10 @@ static void https_cache_free_entries(struct https_dir_cache_entry_t* cache_entry { if (cache_entry->dir_entries[i]) { - libspectrum_free(cache_entry->dir_entries[i]); + xfs_https_free(cache_entry->dir_entries[i]); } } - libspectrum_free(cache_entry->dir_entries); + xfs_https_free(cache_entry->dir_entries); cache_entry->dir_entries = NULL; cache_entry->dir_entries_count = 0; } @@ -210,7 +191,7 @@ static struct xfs_handle_https_dir_entry_t* https_cache_copy_entry(const struct return NULL; } - struct xfs_handle_https_dir_entry_t* dst = libspectrum_malloc(sizeof(struct xfs_handle_https_dir_entry_t)); + struct xfs_handle_https_dir_entry_t* dst = xfs_https_alloc(sizeof(struct xfs_handle_https_dir_entry_t)); if (!dst) { @@ -233,7 +214,7 @@ static void https_cache_put_entries(const struct xfs_engine_mount_t* engine, con struct https_engine_mount_data_t* mount_data = get_mount_data(engine); int cache_idx = -1; - int i; + uint8_t i; for (i = 0; i < HTTPS_DIR_CACHE_SIZE; i++) { @@ -270,7 +251,7 @@ static void https_cache_put_entries(const struct xfs_engine_mount_t* engine, con mount_data->https_dir_cache[cache_idx].path[path_len] = '\0'; // Allocate array for cached entries - mount_data->https_dir_cache[cache_idx].dir_entries = (struct xfs_handle_https_dir_entry_t**)malloc( + mount_data->https_dir_cache[cache_idx].dir_entries = (struct xfs_handle_https_dir_entry_t**)xfs_https_alloc( count * sizeof(struct xfs_handle_https_dir_entry_t*)); if (!mount_data->https_dir_cache[cache_idx].dir_entries) @@ -350,69 +331,6 @@ static void https_cache_store_entries(const struct xfs_engine_mount_t* engine, count, dir_path, cache_idx); } -// Callback function for httpc_get to write downloaded data to buffer -static int write_buffer_callback(void *param, unsigned char *buf, size_t length, size_t position, size_t content_length) -{ - XFS_DEBUG("https: write_buffer_callback ENTRY param=%p buf=%p length=%zu position=%zu content_length=%zu\n", - param, (void*)buf, length, position, content_length); - - struct https_buffer_info_t* buffer_info = (struct https_buffer_info_t*)param; - if (content_length > 0 && buffer_info->expected_size == 0) - { - buffer_info->expected_size = content_length; - } - - // If we know the content length, pre-allocate buffer - if (content_length > 0 && buffer_info->capacity == 0) - { - buffer_info->capacity = content_length; - buffer_info->data = libspectrum_malloc(content_length); - if (!buffer_info->data) - { - XFS_DEBUG("https: write_buffer_callback [ERROR] failed to allocate buffer of size %zu\n", content_length); - return -1; - } - buffer_info->size = 0; - } - - // Grow buffer if needed (if content_length was unknown) - if (position + length > buffer_info->capacity) - { - size_t new_capacity = buffer_info->capacity; - if (new_capacity == 0) - { - new_capacity = 4096; // Start with 4KB - } - - // Double capacity until it's large enough - while (new_capacity < position + length) - { - new_capacity *= 2; - } - - void* new_data = libspectrum_realloc(buffer_info->data, new_capacity); - if (!new_data) - { - XFS_DEBUG("https: write_buffer_callback [ERROR] failed to reallocate buffer to size %zu\n", new_capacity); - return -1; - } - - buffer_info->data = new_data; - buffer_info->capacity = new_capacity; - } - - // Copy data to buffer - memcpy((unsigned char*)buffer_info->data + position, buf, length); - - // Update size if this extends the buffer - if (position + length > buffer_info->size) - { - buffer_info->size = position + length; - } - - return (int)length; -} - static int parse_index_line_to_entry(const char* line, struct xfs_handle_https_dir_entry_t* entry); // Parse index.txt buffer and populate entries array @@ -477,7 +395,7 @@ static int https_parse_index_txt(const char* buffer, const size_t buffer_len, if (should_allocate) { - entry = (struct xfs_handle_https_dir_entry_t*)calloc(1, + entry = (struct xfs_handle_https_dir_entry_t*)xfs_https_calloc(1, sizeof(struct xfs_handle_https_dir_entry_t)); } @@ -503,7 +421,7 @@ static int https_parse_index_txt(const char* buffer, const size_t buffer_len, if (should_allocate) { // We allocated but didn't store, free it - free(entry); + xfs_https_free(entry); } } } @@ -512,7 +430,7 @@ static int https_parse_index_txt(const char* buffer, const size_t buffer_len, // Invalid entry if (should_allocate) { - free(entry); + xfs_https_free(entry); } } } @@ -568,19 +486,18 @@ static int16_t https_fetch_and_parse_index(const struct xfs_engine_mount_t* engi XFS_DEBUG("https: fetch_index fetching from '%s'\n", url); - // Allocate buffer and fetch index.txt - const size_t buffer_size = 2048; - char* buffer = (char*)libspectrum_malloc(buffer_size); - if (!buffer) + size_t buffer_size = 0; + char* buffer = xfs_https_index_buffer_acquire(&buffer_size); + if (!buffer || buffer_size == 0) { return XFS_ERR_NOMEM; } size_t length = buffer_size; - if (httpc_get_buffer(&tls_sck, url, buffer, &length) != HTTPC_OK) + if (xfs_https_http_get_buffer(url, buffer, &length) != XFS_HTTPS_HTTP_OK) { XFS_DEBUG("https: fetch_index failed: httpc_get_buffer error\n"); - libspectrum_free(buffer); + xfs_https_index_buffer_release(buffer); return XFS_ERR_NOENT; } @@ -591,7 +508,7 @@ static int16_t https_fetch_and_parse_index(const struct xfs_engine_mount_t* engi if (entry_count < 0) { XFS_DEBUG("https: fetch_index failed: parse error\n"); - libspectrum_free(buffer); + xfs_https_index_buffer_release(buffer); return XFS_ERR_IO; } @@ -606,20 +523,20 @@ static int16_t https_fetch_and_parse_index(const struct xfs_engine_mount_t* engi if (entry_count == 0) { XFS_DEBUG("https: fetch_index empty directory\n"); - libspectrum_free(buffer); + xfs_https_index_buffer_release(buffer); *out_entries = NULL; *out_entry_count = 0; return XFS_ERR_OK; // Empty directory } // Allocate array of pointers - struct xfs_handle_https_dir_entry_t** entries = (struct xfs_handle_https_dir_entry_t**)libspectrum_malloc(entry_count * - sizeof(struct xfs_handle_https_dir_entry_t*)); + struct xfs_handle_https_dir_entry_t** entries = (struct xfs_handle_https_dir_entry_t**)xfs_https_calloc(entry_count, + sizeof(struct xfs_handle_https_dir_entry_t*)); if (!entries) { XFS_DEBUG("https: fetch_index failed: no memory for entries array\n"); - libspectrum_free(buffer); + xfs_https_index_buffer_release(buffer); return XFS_ERR_NOMEM; } @@ -633,17 +550,15 @@ static int16_t https_fetch_and_parse_index(const struct xfs_engine_mount_t* engi { if (entries[i]) { - libspectrum_free(entries[i]); + xfs_https_free(entries[i]); } } - libspectrum_free(entries); - libspectrum_free(buffer); + xfs_https_free(entries); + xfs_https_index_buffer_release(buffer); return XFS_ERR_NOMEM; } - // Free buffer now that parsing is complete - libspectrum_free(buffer); - + xfs_https_index_buffer_release(buffer); *out_entries = entries; *out_entry_count = (uint8_t)parsed_count; @@ -651,7 +566,6 @@ static int16_t https_fetch_and_parse_index(const struct xfs_engine_mount_t* engi return XFS_ERR_OK; } - // Mount HTTPS filesystem static int16_t https_mount(const struct xfs_engine_t* engine, const char* hostname, const char* path, struct xfs_engine_mount_t* out_mount) { @@ -670,13 +584,12 @@ static int16_t https_mount(const struct xfs_engine_t* engine, const char* hostna return XFS_ERR_INVAL; } - struct https_engine_mount_data_t* mount_data = libspectrum_malloc(sizeof(struct https_engine_mount_data_t)); + struct https_engine_mount_data_t* mount_data = xfs_https_calloc(1, sizeof(struct https_engine_mount_data_t)); if (mount_data == NULL) { XFS_DEBUG("https: mount failed: no mount data\n"); return XFS_ERR_NOMEM; } - memset(mount_data, 0, sizeof(struct https_engine_mount_data_t)); // Initialize cache rotation index mount_data->next_cache = 0; @@ -705,7 +618,7 @@ static int16_t https_mount(const struct xfs_engine_t* engine, const char* hostna if (max_url_len >= sizeof(mount_data->url)) { XFS_DEBUG("https: mount failed: URL too long (hostname=%zu, path=%zu)\n", hostname_len, normalized_len); - libspectrum_free(mount_data); + xfs_https_free(mount_data); return XFS_ERR_INVAL; } @@ -741,7 +654,7 @@ static int16_t https_mount(const struct xfs_engine_t* engine, const char* hostna XFS_DEBUG("https: mount failed: URL buffer overflow or snprintf error (written=%d, max=%zu)\n", url_written, sizeof(mount_data->url)); mount_data->url[0] = '\0'; // Clear invalid URL - libspectrum_free(mount_data); + xfs_https_free(mount_data); return XFS_ERR_INVAL; } @@ -752,50 +665,51 @@ static int16_t https_mount(const struct xfs_engine_t* engine, const char* hostna // Verify mount URL exists using HEAD request XFS_DEBUG("https: mount verifying URL with HEAD request: %s\n", mount_data->url); - const int head_result = httpc_head(&tls_sck, mount_data->url); + const int head_result = xfs_https_http_head(mount_data->url); + const int response = xfs_https_http_response(); - if (head_result != HTTPC_OK) + if (head_result != XFS_HTTPS_HTTP_OK) { XFS_DEBUG("https: mount failed: HEAD request failed (result=%d, response=%d)\n", - head_result, tls_sck.response); + head_result, response); out_mount->mount_data = NULL; - free(mount_data); + xfs_https_free(mount_data); return XFS_ERR_IO; } // Prefer the HTTP response code when the server returned one. httpc_head can // return HTTPC_OK for a completed HTTP error response such as 404. - if ((tls_sck.response >= 200 && tls_sck.response < 400) || tls_sck.response == 405 || tls_sck.response == 403) + if ((response >= 200 && response < 400) || response == 405 || response == 403) { - XFS_DEBUG("https: mount HEAD request successful (response=%d)\n", tls_sck.response); + XFS_DEBUG("https: mount HEAD request successful (response=%d)\n", response); return XFS_ERR_OK; } - if (tls_sck.response == 404) + if (response == 404) { - XFS_DEBUG("https: mount failed: URL not found (response=%d)\n", tls_sck.response); + XFS_DEBUG("https: mount failed: URL not found (response=%d)\n", response); out_mount->mount_data = NULL; - free(mount_data); + xfs_https_free(mount_data); return XFS_ERR_NOENT; } - if (tls_sck.response >= 400 && tls_sck.response < 500) + if (response >= 400 && response < 500) { - XFS_DEBUG("https: mount failed: client error (response=%d)\n", tls_sck.response); + XFS_DEBUG("https: mount failed: client error (response=%d)\n", response); out_mount->mount_data = NULL; - free(mount_data); + xfs_https_free(mount_data); return XFS_ERR_INVAL; } - if (tls_sck.response >= 500 && tls_sck.response < 600) + if (response >= 500 && response < 600) { - XFS_DEBUG("https: mount failed: server error (response=%d)\n", tls_sck.response); + XFS_DEBUG("https: mount failed: server error (response=%d)\n", response); out_mount->mount_data = NULL; - free(mount_data); + xfs_https_free(mount_data); return XFS_ERR_IO; } - XFS_DEBUG("https: mount HEAD request successful (response=%d)\n", tls_sck.response); + XFS_DEBUG("https: mount HEAD request successful (response=%d)\n", response); return XFS_ERR_OK; } @@ -828,8 +742,8 @@ static void https_unmount(const struct xfs_engine_t* engine, struct xfs_engine_m mount_data->url[0] = '\0'; XFS_DEBUG("https: unmount complete\n"); + xfs_https_free(mount_data); mount->mount_data = NULL; - libspectrum_free(mount_data); } // Open file — download body into a PSRAM blob (see download_blob.c) @@ -856,45 +770,35 @@ static int16_t https_open(const struct xfs_engine_mount_t* engine, struct xfs_ha XFS_DEBUG("https: open URL='%s'\n", url); - struct xfs_handle_https_file_t* https_handle = libspectrum_malloc(sizeof(struct xfs_handle_https_file_t)); + struct xfs_handle_https_file_t *https_handle = xfs_https_calloc(1, sizeof(struct xfs_handle_https_file_t)); if (!https_handle) { + XFS_DEBUG("https: open failed: no memory for handle\n"); return XFS_ERR_NOMEM; } - memset(https_handle, 0, sizeof(struct xfs_handle_https_file_t)); - // Initialize buffer info for download callback - struct https_buffer_info_t buffer_info = {0}; - - // Download file using httpc_get XFS_DEBUG("https: open downloading from URL...\n"); - if (httpc_get(&tls_sck, url, write_buffer_callback, &buffer_info) != HTTPC_OK) + int e = xfs_https_download_file(url, &https_handle->blob, &https_handle->blob_size); + const int response = xfs_https_http_response(); + if (e != XFS_HTTPS_HTTP_OK) { - XFS_DEBUG("https: open failed: httpc_get error\n"); - if (buffer_info.data) - libspectrum_free(buffer_info.data); - libspectrum_free(https_handle); - return XFS_ERR_IO; - } - - if (buffer_info.expected_size > 0 && buffer_info.size != buffer_info.expected_size) - { - XFS_DEBUG("https: open failed: short download bytes=%zu expected=%zu\n", - buffer_info.size, buffer_info.expected_size); - if (buffer_info.data) - libspectrum_free(buffer_info.data); - libspectrum_free(https_handle); + XFS_DEBUG("https: open failed %d: httpc_get error (response %d, bytes=%zu)\n", + e, response, https_handle->blob_size); + if (https_handle->blob) + { + xfs_https_download_file_free(https_handle->blob); + } + xfs_https_free(https_handle); return XFS_ERR_IO; } - if (tls_sck.response < 200 || tls_sck.response >= 300) + if (response < 200 || response >= 300) { - XFS_DEBUG("https: open failed: HTTP response=%d\n", tls_sck.response); - if (buffer_info.data) - libspectrum_free(buffer_info.data); - libspectrum_free(https_handle); + XFS_DEBUG("https: open failed: HTTP response=%d\n", response); + xfs_https_download_file_free(https_handle->blob); + xfs_https_free(https_handle); - if (tls_sck.response == 404) + if (response == 404) { return XFS_ERR_NOENT; } @@ -902,10 +806,6 @@ static int16_t https_open(const struct xfs_engine_mount_t* engine, struct xfs_ha return XFS_ERR_IO; } - https_handle->blob = buffer_info.data; - https_handle->blob_size = buffer_info.size; - https_handle->read_pos = 0; - XFS_DEBUG("https: open download complete bytes=%zu\n", https_handle->blob_size); https_handle->live = 1; @@ -996,10 +896,9 @@ static int16_t https_close(const struct xfs_engine_mount_t* engine, struct xfs_h if (https_handle->blob) { - libspectrum_free(https_handle->blob); + xfs_https_download_file_free(https_handle->blob); https_handle->blob = NULL; } - https_handle->live = 0; XFS_DEBUG("https: close success\n"); @@ -1146,7 +1045,7 @@ static int16_t https_opendir(const struct xfs_engine_mount_t* engine, struct xfs uint8_t entry_count = 0; - struct xfs_handle_https_dir_t* https_handle = calloc(1, sizeof(struct xfs_handle_https_dir_t)); + struct xfs_handle_https_dir_t* https_handle = xfs_https_calloc(1, sizeof(struct xfs_handle_https_dir_t)); if (https_handle == NULL) { @@ -1157,7 +1056,7 @@ static int16_t https_opendir(const struct xfs_engine_mount_t* engine, struct xfs if (result != XFS_ERR_OK) { - free(https_handle); + xfs_https_free(https_handle); return result; } @@ -1252,10 +1151,10 @@ static int16_t https_closedir(const struct xfs_engine_mount_t* engine, struct xf { if (https_handle->dir_entries[i]) { - free(https_handle->dir_entries[i]); + xfs_https_free(https_handle->dir_entries[i]); } } - free(https_handle->dir_entries); + xfs_https_free(https_handle->dir_entries); https_handle->dir_entries = NULL; } https_handle->dir_entries_count = 0; @@ -1528,12 +1427,12 @@ static void https_free_handle(const struct xfs_engine_mount_t* engine, struct xf if (handle->type == XFS_HANDLE_TYPE_FILE) { (void)https_close(engine, handle); - free(handle->data); + xfs_https_free(handle->data); } else if (handle->type == XFS_HANDLE_TYPE_DIR) { (void)https_closedir(engine, handle); - free(handle->data); + xfs_https_free(handle->data); } handle->data = NULL; diff --git a/peripherals/fs/xfs_https_compat.c b/peripherals/fs/xfs_https_compat.c new file mode 100644 index 000000000..404ab9dc9 --- /dev/null +++ b/peripherals/fs/xfs_https_compat.c @@ -0,0 +1,170 @@ +#include "config.h" + +#include "xfs_https_compat.h" + +#include + +#include "libspectrum.h" +#include "../http/httpc.h" +#include "../http/http_sck.h" + +#include "xfs.h" + +void* xfs_https_alloc(size_t size) +{ + return libspectrum_malloc(size); +} + +void* xfs_https_calloc(size_t count, size_t size) +{ + void* ptr = libspectrum_malloc(count * size); + if (ptr) + { + memset(ptr, 0, count * size); + } + return ptr; +} + +void* xfs_https_realloc(void* ptr, size_t size) +{ + return libspectrum_realloc(ptr, size); +} + +void xfs_https_free(void* ptr) +{ + libspectrum_free(ptr); +} + +char* xfs_https_index_buffer_acquire(size_t* out_size) +{ + if (!out_size) + { + return NULL; + } + + *out_size = 2048; + return (char*)libspectrum_malloc(*out_size); +} + +void xfs_https_index_buffer_release(char* buffer) +{ + libspectrum_free(buffer); +} + +int xfs_https_http_get_buffer(const char* url, char* buffer, size_t* length) +{ + return httpc_get_buffer(&tls_sck, url, buffer, length); +} + +int xfs_https_http_head(const char* url) +{ + return httpc_head(&tls_sck, url); +} + +int xfs_https_http_response(void) +{ + return tls_sck.response; +} + +struct xfs_https_download_ctx +{ + uint8_t* data; + size_t size; + size_t capacity; + size_t expected_size; +}; + +static int write_buffer_callback(void *param, unsigned char *buf, size_t length, size_t position, size_t content_length) +{ + struct xfs_https_download_ctx* ctx = (struct xfs_https_download_ctx*)param; + + if (!ctx) + { + return -1; + } + + if (content_length > 0 && ctx->expected_size == 0) + { + ctx->expected_size = content_length; + } + + if (content_length > 0 && ctx->capacity == 0) + { + ctx->capacity = content_length; + ctx->data = libspectrum_malloc(content_length); + if (!ctx->data) + { + XFS_DEBUG("https: write_buffer_callback [ERROR] failed to allocate buffer of size %zu\n", content_length); + return -1; + } + } + + if (position + length > ctx->capacity) + { + size_t new_capacity = ctx->capacity; + if (new_capacity == 0) + { + new_capacity = 4096; + } + + while (new_capacity < position + length) + { + new_capacity *= 2; + } + + void* new_data = libspectrum_realloc(ctx->data, new_capacity); + if (!new_data) + { + XFS_DEBUG("https: write_buffer_callback [ERROR] failed to reallocate buffer to size %zu\n", new_capacity); + return -1; + } + + ctx->data = new_data; + ctx->capacity = new_capacity; + } + + memcpy(ctx->data + position, buf, length); + if (position + length > ctx->size) + { + ctx->size = position + length; + } + + return (int)length; +} + +int xfs_https_download_file(const char* url, uint8_t** out_blob, size_t* out_size) +{ + if (!out_blob || !out_size) + { + return -1; + } + + struct xfs_https_download_ctx ctx = {0}; + const int result = httpc_get(&tls_sck, url, write_buffer_callback, &ctx); + + if (result != HTTPC_OK) + { + libspectrum_free(ctx.data); + *out_blob = NULL; + *out_size = 0; + return result; + } + + if (ctx.expected_size > 0 && ctx.size != ctx.expected_size) + { + XFS_DEBUG("https: open failed: short download bytes=%zu expected=%zu\n", ctx.size, ctx.expected_size); + libspectrum_free(ctx.data); + *out_blob = NULL; + *out_size = 0; + return -1; + } + + *out_blob = ctx.data; + *out_size = ctx.size; + return result; +} + +void xfs_https_download_file_free(uint8_t* blob) +{ + libspectrum_free(blob); +} diff --git a/peripherals/fs/xfs_https_compat.h b/peripherals/fs/xfs_https_compat.h new file mode 100644 index 000000000..9c8b82990 --- /dev/null +++ b/peripherals/fs/xfs_https_compat.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +#define XFS_HTTPS_HTTP_OK 0 + +void* xfs_https_alloc(size_t size); +void* xfs_https_calloc(size_t count, size_t size); +void* xfs_https_realloc(void* ptr, size_t size); +void xfs_https_free(void* ptr); + +char* xfs_https_index_buffer_acquire(size_t* out_size); +void xfs_https_index_buffer_release(char* buffer); + +int xfs_https_http_get_buffer(const char* url, char* buffer, size_t* length); +int xfs_https_http_head(const char* url); +int xfs_https_http_response(void); + +int xfs_https_download_file(const char* url, uint8_t** out_blob, size_t* out_size); +void xfs_https_download_file_free(uint8_t* blob); diff --git a/peripherals/fs/xfs_overlay.c b/peripherals/fs/xfs_overlay.c new file mode 100644 index 000000000..8d6e74d39 --- /dev/null +++ b/peripherals/fs/xfs_overlay.c @@ -0,0 +1,611 @@ +#include "xfs.h" + +#include +#include +#include + +#define XFS_OVERLAY_MAX_SEEN_DIRS 64 + +typedef struct +{ + const xfs_overlay_layer_config_t* config; + struct xfs_engine_mount_t mount; +} xfs_overlay_layer_t; + +typedef struct +{ + xfs_overlay_layer_t layers[XFS_OVERLAY_MAX_LAYERS]; + uint8_t layer_count; + uint8_t default_layer; +} xfs_overlay_mount_t; + +typedef struct +{ + uint8_t layer; + struct xfs_handle_t child; +} xfs_overlay_file_handle_t; + +typedef struct +{ + xfs_overlay_mount_t* overlay; + char path[XFS_PATH_MAX]; + uint8_t current_layer; + uint8_t child_open; + uint8_t parent_emitted; + uint8_t seen_dir_count; + char* seen_dirs[XFS_OVERLAY_MAX_SEEN_DIRS]; + struct xfs_handle_t child; +} xfs_overlay_dir_handle_t; + +static xfs_overlay_mount_t* overlay_mount_data(const struct xfs_engine_mount_t* mount) +{ + return (xfs_overlay_mount_t*)mount->mount_data; +} + +static int overlay_layer_index_for_config(const xfs_overlay_mount_t* overlay, + const xfs_overlay_layer_config_t* config) +{ + for (uint8_t i = 0; i < overlay->layer_count; ++i) + { + if (overlay->layers[i].config == config) + return i; + } + return -1; +} + +static int16_t overlay_join_path(char* out, size_t out_size, const char* dir, const char* name) +{ + const int written = (strcmp(dir, "/") == 0) + ? snprintf(out, out_size, "/%s", name) + : snprintf(out, out_size, "%s/%s", dir, name); + if (written < 0 || (size_t)written >= out_size) + return XFS_ERR_NAMETOOLONG; + return XFS_ERR_OK; +} + +static int16_t overlay_mount(const struct xfs_engine_t* engine, const char* hostname, + const char* path, struct xfs_engine_mount_t* out_mount) +{ + (void)hostname; + (void)path; + const xfs_overlay_config_t* config = (const xfs_overlay_config_t*)engine->user; + if (!config) + return XFS_ERR_INVAL; + + xfs_overlay_mount_t* overlay = calloc(1, sizeof(*overlay)); + if (!overlay) + return XFS_ERR_NOMEM; + + int16_t first_error = XFS_ERR_NOENT; + for (uint8_t i = 0; config->layers[i] && i < XFS_OVERLAY_MAX_LAYERS; ++i) + { + const xfs_overlay_layer_config_t* layer_config = config->layers[i]; + xfs_overlay_layer_t* layer = &overlay->layers[overlay->layer_count]; + layer->config = layer_config; + + int16_t err = layer_config->engine->mount(layer_config->engine, + layer_config->hostname, layer_config->path, &layer->mount); + if (err == XFS_ERR_OK) + { + layer->mount.engine = layer_config->engine; + overlay->layer_count++; + } + else if (first_error == XFS_ERR_NOENT) + { + first_error = err; + } + } + + if (overlay->layer_count == 0) + { + free(overlay); + return first_error; + } + + int default_layer = overlay_layer_index_for_config(overlay, config->default_layer); + overlay->default_layer = default_layer >= 0 ? (uint8_t)default_layer : (overlay->layer_count - 1); + out_mount->mount_data = overlay; + XFS_DEBUG("overlay: mount success layers=%u default=%u\n", overlay->layer_count, overlay->default_layer); + return XFS_ERR_OK; +} + +static uint8_t overlay_is_mounted(const struct xfs_engine_t* engine, struct xfs_engine_mount_t* mount) +{ + (void)engine; + return mount->mount_data != NULL; +} + +static void overlay_unmount(const struct xfs_engine_t* engine, struct xfs_engine_mount_t* mount) +{ + (void)engine; + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + if (!overlay) + return; + + xfs_close_handles_for_mount(mount); + for (uint8_t i = 0; i < overlay->layer_count; ++i) + { + xfs_overlay_layer_t* layer = &overlay->layers[i]; + if (layer->config->engine->unmount) + layer->config->engine->unmount(layer->config->engine, &layer->mount); + } + free(overlay); + mount->mount_data = NULL; +} + +static void overlay_mount_info(const struct xfs_engine_mount_t* mount, char* buffer, size_t size) +{ + (void)mount; + if (!buffer || size == 0) + return; + strncpy(buffer, "xfs://ram/", size - 1); + buffer[size - 1] = '\0'; +} + +static bool overlay_path_exists(xfs_overlay_layer_t* layer, const char* path, struct xfs_stat_info* info) +{ + return layer->config->engine->stat(&layer->mount, path, info) == XFS_ERR_OK; +} + +static int16_t overlay_open(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + const char* path, int flags) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + if (!overlay) + return XFS_ERR_IO; + + const bool create = (flags & XFS_O_CREAT) != 0; + struct xfs_stat_info stat_info; + int16_t first_error = XFS_ERR_NOENT; + + for (uint8_t i = 0; i < overlay->layer_count; ++i) + { + xfs_overlay_layer_t* layer = &overlay->layers[i]; + const int16_t stat_err = layer->config->engine->stat(&layer->mount, path, &stat_info); + if (stat_err == XFS_ERR_OK) + { + if (create && (flags & XFS_O_EXCL)) + return XFS_ERR_EXIST; + + xfs_overlay_file_handle_t* overlay_handle = calloc(1, sizeof(*overlay_handle)); + if (!overlay_handle) + return XFS_ERR_NOMEM; + overlay_handle->layer = i; + overlay_handle->child.type = XFS_HANDLE_TYPE_FILE; + + const int16_t err = layer->config->engine->open(&layer->mount, &overlay_handle->child, path, flags); + if (err == XFS_ERR_OK) + { + handle->data = overlay_handle; + return XFS_ERR_OK; + } + free(overlay_handle); + return err; + } + if (stat_err != XFS_ERR_NOENT && first_error == XFS_ERR_NOENT) + first_error = stat_err; + } + + if (!create) + return first_error; + + xfs_overlay_layer_t* layer = &overlay->layers[overlay->default_layer]; + xfs_overlay_file_handle_t* overlay_handle = calloc(1, sizeof(*overlay_handle)); + if (!overlay_handle) + return XFS_ERR_NOMEM; + overlay_handle->layer = overlay->default_layer; + overlay_handle->child.type = XFS_HANDLE_TYPE_FILE; + + const int16_t err = layer->config->engine->open(&layer->mount, &overlay_handle->child, path, flags); + if (err == XFS_ERR_OK) + { + handle->data = overlay_handle; + return XFS_ERR_OK; + } + free(overlay_handle); + return err; +} + +static int32_t overlay_read(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + void* buffer, uint32_t size) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + xfs_overlay_file_handle_t* overlay_handle = (xfs_overlay_file_handle_t*)handle->data; + if (!overlay || !overlay_handle || overlay_handle->layer >= overlay->layer_count) + return XFS_ERR_BADF; + xfs_overlay_layer_t* layer = &overlay->layers[overlay_handle->layer]; + return layer->config->engine->read(&layer->mount, &overlay_handle->child, buffer, size); +} + +static const uint8_t* overlay_direct_read(const struct xfs_engine_mount_t* mount, + struct xfs_handle_t* handle, size_t* out_len) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + xfs_overlay_file_handle_t* overlay_handle = (xfs_overlay_file_handle_t*)handle->data; + if (!overlay || !overlay_handle || overlay_handle->layer >= overlay->layer_count) + return NULL; + xfs_overlay_layer_t* layer = &overlay->layers[overlay_handle->layer]; + if (!layer->config->engine->direct_read) + return NULL; + return layer->config->engine->direct_read(&layer->mount, &overlay_handle->child, out_len); +} + +static int32_t overlay_write(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + const void* buffer, uint32_t size) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + xfs_overlay_file_handle_t* overlay_handle = (xfs_overlay_file_handle_t*)handle->data; + if (!overlay || !overlay_handle || overlay_handle->layer >= overlay->layer_count) + return XFS_ERR_BADF; + xfs_overlay_layer_t* layer = &overlay->layers[overlay_handle->layer]; + return layer->config->engine->write(&layer->mount, &overlay_handle->child, buffer, size); +} + +static int16_t overlay_close(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + xfs_overlay_file_handle_t* overlay_handle = (xfs_overlay_file_handle_t*)handle->data; + if (!overlay_handle) + return XFS_ERR_OK; + if (!overlay || overlay_handle->layer >= overlay->layer_count) + return XFS_ERR_BADF; + xfs_overlay_layer_t* layer = &overlay->layers[overlay_handle->layer]; + return layer->config->engine->close(&layer->mount, &overlay_handle->child); +} + +static int32_t overlay_lseek(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + int32_t offset, uint8_t whence) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + xfs_overlay_file_handle_t* overlay_handle = (xfs_overlay_file_handle_t*)handle->data; + if (!overlay || !overlay_handle || overlay_handle->layer >= overlay->layer_count) + return XFS_ERR_BADF; + xfs_overlay_layer_t* layer = &overlay->layers[overlay_handle->layer]; + return layer->config->engine->lseek(&layer->mount, &overlay_handle->child, offset, whence); +} + +static int16_t overlay_open_next_dir(xfs_overlay_dir_handle_t* dir_handle) +{ + while (dir_handle->current_layer < dir_handle->overlay->layer_count) + { + xfs_overlay_layer_t* layer = &dir_handle->overlay->layers[dir_handle->current_layer]; + memset(&dir_handle->child, 0, sizeof(dir_handle->child)); + dir_handle->child.type = XFS_HANDLE_TYPE_DIR; + const int16_t err = layer->config->engine->opendir(&layer->mount, &dir_handle->child, dir_handle->path); + if (err == XFS_ERR_OK) + { + dir_handle->child_open = 1; + return XFS_ERR_OK; + } + if (err != XFS_ERR_NOENT) + return err; + dir_handle->current_layer++; + } + return XFS_ERR_NOENT; +} + +static int16_t overlay_opendir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + const char* path) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + if (!overlay) + return XFS_ERR_IO; + + xfs_overlay_dir_handle_t* dir_handle = calloc(1, sizeof(*dir_handle)); + if (!dir_handle) + return XFS_ERR_NOMEM; + + dir_handle->overlay = overlay; + strncpy(dir_handle->path, path, sizeof(dir_handle->path) - 1); + dir_handle->path[sizeof(dir_handle->path) - 1] = '\0'; + + const int16_t err = overlay_open_next_dir(dir_handle); + if (err == XFS_ERR_OK) + { + handle->data = dir_handle; + return XFS_ERR_OK; + } + free(dir_handle); + return err; +} + +static bool overlay_entry_shadowed(xfs_overlay_dir_handle_t* dir_handle, const char* name) +{ + if (strcmp(name, ".") == 0) + return false; + + char child[XFS_PATH_MAX]; + if (overlay_join_path(child, sizeof(child), dir_handle->path, name) != XFS_ERR_OK) + return false; + + struct xfs_stat_info info; + for (uint8_t i = 0; i < dir_handle->current_layer; ++i) + { + if (overlay_path_exists(&dir_handle->overlay->layers[i], child, &info)) + return true; + } + return false; +} + +static char* overlay_strdup(const char* s) +{ + const size_t len = strlen(s) + 1; + char* copy = malloc(len); + if (!copy) + return NULL; + memcpy(copy, s, len); + return copy; +} + +static void overlay_free_seen_dirs(xfs_overlay_dir_handle_t* dir_handle) +{ + for (uint8_t i = 0; i < dir_handle->seen_dir_count; ++i) + { + free(dir_handle->seen_dirs[i]); + dir_handle->seen_dirs[i] = NULL; + } + dir_handle->seen_dir_count = 0; +} + +static bool overlay_dir_seen(const xfs_overlay_dir_handle_t* dir_handle, const char* name) +{ + for (uint8_t i = 0; i < dir_handle->seen_dir_count; ++i) + { + if (strcmp(dir_handle->seen_dirs[i], name) == 0) + return true; + } + return false; +} + +static int16_t overlay_note_dir_seen(xfs_overlay_dir_handle_t* dir_handle, const char* name) +{ + if (dir_handle->seen_dir_count >= XFS_OVERLAY_MAX_SEEN_DIRS) + return XFS_ERR_OK; + + char* copy = overlay_strdup(name); + if (!copy) + return XFS_ERR_NOMEM; + + dir_handle->seen_dirs[dir_handle->seen_dir_count++] = copy; + return XFS_ERR_OK; +} + +static int16_t overlay_emit_parent(struct xfs_stat_info* info) +{ + memset(info, 0, sizeof(*info)); + info->type = XFS_TYPE_DIR; + info->storage = FS_STORAGE_RAM; + strncpy(info->name, "..", sizeof(info->name) - 1); + info->name[sizeof(info->name) - 1] = '\0'; + return 1; +} + +static int16_t overlay_readdir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + struct xfs_stat_info* info) +{ + (void)mount; + xfs_overlay_dir_handle_t* dir_handle = (xfs_overlay_dir_handle_t*)handle->data; + if (!dir_handle || !dir_handle->overlay) + return XFS_ERR_BADF; + + if (!dir_handle->parent_emitted) + { + dir_handle->parent_emitted = 1; + return overlay_emit_parent(info); + } + + for (;;) + { + if (!dir_handle->child_open) + { + const int16_t err = overlay_open_next_dir(dir_handle); + if (err == XFS_ERR_NOENT) + return 0; + if (err != XFS_ERR_OK) + return err; + } + + xfs_overlay_layer_t* layer = &dir_handle->overlay->layers[dir_handle->current_layer]; + const int16_t err = layer->config->engine->readdir(&layer->mount, &dir_handle->child, info); + if (err > 0) + { + if (strcmp(info->name, "..") == 0) + continue; + if (info->type == XFS_TYPE_DIR) + { + if (overlay_dir_seen(dir_handle, info->name)) + continue; + + const int16_t note_err = overlay_note_dir_seen(dir_handle, info->name); + if (note_err != XFS_ERR_OK) + return note_err; + } + if (overlay_entry_shadowed(dir_handle, info->name)) + continue; + return err; + } + if (err < 0) + return err; + + layer->config->engine->closedir(&layer->mount, &dir_handle->child); + dir_handle->child_open = 0; + dir_handle->current_layer++; + } +} + +static int16_t overlay_closedir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle) +{ + (void)mount; + xfs_overlay_dir_handle_t* dir_handle = (xfs_overlay_dir_handle_t*)handle->data; + if (!dir_handle) + return XFS_ERR_OK; + if (dir_handle->child_open && dir_handle->current_layer < dir_handle->overlay->layer_count) + { + xfs_overlay_layer_t* layer = &dir_handle->overlay->layers[dir_handle->current_layer]; + const int16_t err = layer->config->engine->closedir(&layer->mount, &dir_handle->child); + dir_handle->child_open = 0; + overlay_free_seen_dirs(dir_handle); + return err; + } + overlay_free_seen_dirs(dir_handle); + return XFS_ERR_OK; +} + +static int16_t overlay_stat(const struct xfs_engine_mount_t* mount, const char* path, + struct xfs_stat_info* stat_info) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + if (!overlay) + return XFS_ERR_IO; + int16_t first_error = XFS_ERR_NOENT; + for (uint8_t i = 0; i < overlay->layer_count; ++i) + { + int16_t err = overlay->layers[i].config->engine->stat(&overlay->layers[i].mount, path, stat_info); + if (err == XFS_ERR_OK) + return XFS_ERR_OK; + if (err != XFS_ERR_NOENT && first_error == XFS_ERR_NOENT) + first_error = err; + } + return first_error; +} + +static int16_t overlay_unlink(const struct xfs_engine_mount_t* mount, const char* path) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + if (!overlay) + return XFS_ERR_IO; + + struct xfs_stat_info info; + int16_t first_error = XFS_ERR_NOENT; + for (uint8_t i = 0; i < overlay->layer_count; ++i) + { + xfs_overlay_layer_t* layer = &overlay->layers[i]; + int16_t err = layer->config->engine->stat(&layer->mount, path, &info); + if (err == XFS_ERR_OK) + return layer->config->engine->unlink(&layer->mount, path); + if (err != XFS_ERR_NOENT && first_error == XFS_ERR_NOENT) + first_error = err; + } + return first_error; +} + +static int16_t overlay_mkdir(const struct xfs_engine_mount_t* mount, const char* path) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + if (!overlay) + return XFS_ERR_IO; + xfs_overlay_layer_t* layer = &overlay->layers[overlay->default_layer]; + return layer->config->engine->mkdir(&layer->mount, path); +} + +static int16_t overlay_rmdir(const struct xfs_engine_mount_t* mount, const char* path) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + if (!overlay) + return XFS_ERR_IO; + + struct xfs_stat_info info; + int16_t first_error = XFS_ERR_NOENT; + for (uint8_t i = 0; i < overlay->layer_count; ++i) + { + xfs_overlay_layer_t* layer = &overlay->layers[i]; + int16_t err = layer->config->engine->stat(&layer->mount, path, &info); + if (err == XFS_ERR_OK) + return layer->config->engine->rmdir(&layer->mount, path); + if (err != XFS_ERR_NOENT && first_error == XFS_ERR_NOENT) + first_error = err; + } + return first_error; +} + +static int16_t overlay_chdir(const struct xfs_engine_mount_t* mount, const char* path) +{ + struct xfs_stat_info info; + int16_t err = overlay_stat(mount, path, &info); + if (err != XFS_ERR_OK || info.type != XFS_TYPE_DIR) + return XFS_ERR_NOENT; + return XFS_ERR_OK; +} + +static int16_t overlay_getcwd(const struct xfs_engine_mount_t* mount, char* buffer, uint16_t size) +{ + (void)mount; + if (size < 2) + return XFS_ERR_INVAL; + strncpy(buffer, "/", size - 1); + buffer[size - 1] = '\0'; + return XFS_ERR_OK; +} + +static int16_t overlay_rename(const struct xfs_engine_mount_t* mount, const char* old_path, + const char* new_path) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + if (!overlay) + return XFS_ERR_IO; + + struct xfs_stat_info info; + int16_t first_error = XFS_ERR_NOENT; + for (uint8_t i = 0; i < overlay->layer_count; ++i) + { + xfs_overlay_layer_t* layer = &overlay->layers[i]; + int16_t err = layer->config->engine->stat(&layer->mount, old_path, &info); + if (err == XFS_ERR_OK) + return layer->config->engine->rename(&layer->mount, old_path, new_path); + if (err != XFS_ERR_NOENT && first_error == XFS_ERR_NOENT) + first_error = err; + } + return first_error; +} + +static int16_t overlay_chmod(const struct xfs_engine_mount_t* mount, const char* path, uint16_t mode) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + if (!overlay) + return XFS_ERR_IO; + xfs_overlay_layer_t* layer = &overlay->layers[overlay->default_layer]; + return layer->config->engine->chmod(&layer->mount, path, mode); +} + +static void overlay_free_handle(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle) +{ + if (!handle->data) + return; + if (handle->type == XFS_HANDLE_TYPE_FILE) + { + overlay_close(mount, handle); + free(handle->data); + } + else if (handle->type == XFS_HANDLE_TYPE_DIR) + { + overlay_closedir(mount, handle); + free(handle->data); + } + handle->data = NULL; +} + +const struct xfs_engine_t xfs_overlay_engine = { + .user = (void*)&xfs_default_overlay, + .mount = overlay_mount, + .is_mounted = overlay_is_mounted, + .unmount = overlay_unmount, + .mount_info = overlay_mount_info, + .open = overlay_open, + .read = overlay_read, + .direct_read = overlay_direct_read, + .write = overlay_write, + .close = overlay_close, + .lseek = overlay_lseek, + .opendir = overlay_opendir, + .readdir = overlay_readdir, + .closedir = overlay_closedir, + .stat = overlay_stat, + .unlink = overlay_unlink, + .mkdir = overlay_mkdir, + .rmdir = overlay_rmdir, + .chdir = overlay_chdir, + .getcwd = overlay_getcwd, + .rename = overlay_rename, + .chmod = overlay_chmod, + .free_handle = overlay_free_handle, +}; diff --git a/peripherals/fs/xfs_romfs.c b/peripherals/fs/xfs_romfs.c new file mode 100644 index 000000000..b69a53b3c --- /dev/null +++ b/peripherals/fs/xfs_romfs.c @@ -0,0 +1,358 @@ +#include "xfs.h" +#include "ramfs.h" + +#include +#include +#include + +typedef struct +{ + ramfs_t fs; + const xfs_romfs_config_t* config; +} xfs_romfs_mount_t; + +typedef struct +{ + const ramfs_entry_t* entry; + uint32_t offset; +} xfs_romfs_file_handle_t; + +typedef struct +{ + ramfs_dir_t dir; +} xfs_romfs_dir_handle_t; + +static xfs_romfs_mount_t* romfs_mount_data(const struct xfs_engine_mount_t* mount) +{ + return (xfs_romfs_mount_t*)mount->mount_data; +} + +static int16_t romfs_mount(const struct xfs_engine_t* engine, const char* hostname, + const char* path, struct xfs_engine_mount_t* out_mount) +{ + (void)hostname; + (void)path; + const xfs_romfs_config_t* config = (const xfs_romfs_config_t*)engine->user; + if (!config || !config->start || !config->end) + return XFS_ERR_INVAL; + + xfs_romfs_mount_t* mount = calloc(1, sizeof(*mount)); + if (!mount) + return XFS_ERR_NOMEM; + + if (!ramfs_mount(config->start, config->end, &mount->fs)) + { + free(mount); + return XFS_ERR_CORRUPT; + } + + mount->config = config; + out_mount->mount_data = mount; + XFS_DEBUG("romfs: mount success entries=%lu\n", (unsigned long)mount->fs.header->entry_count); + return XFS_ERR_OK; +} + +static uint8_t romfs_is_mounted(const struct xfs_engine_t* engine, struct xfs_engine_mount_t* mount) +{ + (void)engine; + return mount->mount_data != NULL; +} + +static void romfs_unmount(const struct xfs_engine_t* engine, struct xfs_engine_mount_t* mount) +{ + (void)engine; + xfs_close_handles_for_mount(mount); + free(mount->mount_data); + mount->mount_data = NULL; +} + +static void romfs_mount_info(const struct xfs_engine_mount_t* mount, char* buffer, size_t size) +{ + if (!buffer || size == 0) + return; + const xfs_romfs_mount_t* romfs = romfs_mount_data(mount); + const char* name = romfs && romfs->config && romfs->config->name ? romfs->config->name : "romfs"; + snprintf(buffer, size, "xfs://%s/", name); + buffer[size - 1] = '\0'; +} + +static int16_t romfs_open(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + const char* path, int flags) +{ + xfs_romfs_mount_t* romfs = romfs_mount_data(mount); + if (!romfs) + return XFS_ERR_IO; + const int accmode = flags & XFS_O_RDWR; + if (accmode == XFS_O_WRONLY || accmode == XFS_O_RDWR || (flags & XFS_O_CREAT) || + (flags & XFS_O_TRUNC) || (flags & XFS_O_APPEND)) + { + return -100; + } + + const ramfs_entry_t* entry = ramfs_find(&romfs->fs, path); + if (!entry) + return XFS_ERR_NOENT; + if (entry->type == RAMFS_TYPE_DIR) + return XFS_ERR_ISDIR; + + xfs_romfs_file_handle_t* file = calloc(1, sizeof(*file)); + if (!file) + return XFS_ERR_NOMEM; + file->entry = entry; + handle->data = file; + return XFS_ERR_OK; +} + +static int32_t romfs_read(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + void* buffer, uint32_t size) +{ + xfs_romfs_mount_t* romfs = romfs_mount_data(mount); + xfs_romfs_file_handle_t* file = (xfs_romfs_file_handle_t*)handle->data; + if (!romfs || !file || !file->entry) + return XFS_ERR_BADF; + + const uint8_t* data = ramfs_file_data(&romfs->fs, file->entry); + if (!data) + return XFS_ERR_IO; + + uint32_t available = file->entry->size > file->offset ? file->entry->size - file->offset : 0; + if (size > available) + size = available; + memcpy(buffer, data + file->offset, size); + file->offset += size; + return (int32_t)size; +} + +static const uint8_t* romfs_direct_read(const struct xfs_engine_mount_t* mount, + struct xfs_handle_t* handle, size_t* out_len) +{ + xfs_romfs_mount_t* romfs = romfs_mount_data(mount); + xfs_romfs_file_handle_t* file = (xfs_romfs_file_handle_t*)handle->data; + if (!romfs || !file || !file->entry || !out_len) + return NULL; + + const uint8_t* data = ramfs_file_data(&romfs->fs, file->entry); + if (!data) + return NULL; + *out_len = file->entry->size; + return data; +} + +static int32_t romfs_write(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + const void* buffer, uint32_t size) +{ + (void)mount; + (void)handle; + (void)buffer; + (void)size; + return XFS_ERR_INVAL; +} + +static int16_t romfs_close(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle) +{ + (void)mount; + (void)handle; + return XFS_ERR_OK; +} + +static int32_t romfs_lseek(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + int32_t offset, uint8_t whence) +{ + (void)mount; + xfs_romfs_file_handle_t* file = (xfs_romfs_file_handle_t*)handle->data; + if (!file || !file->entry) + return XFS_ERR_BADF; + + int32_t next; + switch (whence) + { + case XFS_SEEK_SET: + next = offset; + break; + case XFS_SEEK_CUR: + next = (int32_t)file->offset + offset; + break; + case XFS_SEEK_END: + next = (int32_t)file->entry->size + offset; + break; + default: + return XFS_ERR_INVAL; + } + + if (next < 0) + return XFS_ERR_INVAL; + if ((uint32_t)next > file->entry->size) + next = (int32_t)file->entry->size; + file->offset = (uint32_t)next; + return next; +} + +static int16_t romfs_opendir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + const char* path) +{ + xfs_romfs_mount_t* romfs = romfs_mount_data(mount); + if (!romfs) + return XFS_ERR_IO; + + xfs_romfs_dir_handle_t* dir = calloc(1, sizeof(*dir)); + if (!dir) + return XFS_ERR_NOMEM; + if (!ramfs_opendir(&romfs->fs, path, &dir->dir)) + { + free(dir); + return XFS_ERR_NOENT; + } + handle->data = dir; + return XFS_ERR_OK; +} + +static int16_t romfs_readdir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + struct xfs_stat_info* info) +{ + xfs_romfs_mount_t* romfs = romfs_mount_data(mount); + xfs_romfs_dir_handle_t* dir = (xfs_romfs_dir_handle_t*)handle->data; + if (!romfs || !dir) + return XFS_ERR_BADF; + + const ramfs_entry_t* entry = ramfs_readdir(&romfs->fs, &dir->dir); + if (!entry) + return 0; + + memset(info, 0, sizeof(*info)); + info->type = entry->type == RAMFS_TYPE_DIR ? XFS_TYPE_DIR : XFS_TYPE_REG; + info->storage = romfs->config ? romfs->config->storage : FS_STORAGE_FLASH; + info->size = entry->size; + info->mtime = entry->mtime; + info->ctime = entry->mtime; + strncpy(info->name, entry->name, sizeof(info->name) - 1); + info->name[sizeof(info->name) - 1] = '\0'; + return 1; +} + +static int16_t romfs_closedir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle) +{ + (void)mount; + (void)handle; + return XFS_ERR_OK; +} + +static int16_t romfs_stat(const struct xfs_engine_mount_t* mount, const char* path, + struct xfs_stat_info* stat_info) +{ + xfs_romfs_mount_t* romfs = romfs_mount_data(mount); + if (!romfs) + return XFS_ERR_IO; + + if (!path || path[0] == '\0' || strcmp(path, "/") == 0) + { + memset(stat_info, 0, sizeof(*stat_info)); + stat_info->type = XFS_TYPE_DIR; + stat_info->storage = romfs->config ? romfs->config->storage : FS_STORAGE_FLASH; + strncpy(stat_info->name, "/", sizeof(stat_info->name) - 1); + return XFS_ERR_OK; + } + + const ramfs_entry_t* entry = ramfs_find(&romfs->fs, path); + if (!entry) + return XFS_ERR_NOENT; + + memset(stat_info, 0, sizeof(*stat_info)); + stat_info->type = entry->type == RAMFS_TYPE_DIR ? XFS_TYPE_DIR : XFS_TYPE_REG; + stat_info->storage = romfs->config ? romfs->config->storage : FS_STORAGE_FLASH; + stat_info->size = entry->size; + stat_info->mtime = entry->mtime; + stat_info->ctime = entry->mtime; + strncpy(stat_info->name, entry->name, sizeof(stat_info->name) - 1); + stat_info->name[sizeof(stat_info->name) - 1] = '\0'; + return XFS_ERR_OK; +} + +static int16_t romfs_unlink(const struct xfs_engine_mount_t* mount, const char* path) +{ + (void)mount; + (void)path; + return XFS_ERR_INVAL; +} + +static int16_t romfs_mkdir(const struct xfs_engine_mount_t* mount, const char* path) +{ + (void)mount; + (void)path; + return XFS_ERR_INVAL; +} + +static int16_t romfs_rmdir(const struct xfs_engine_mount_t* mount, const char* path) +{ + (void)mount; + (void)path; + return XFS_ERR_INVAL; +} + +static int16_t romfs_chdir(const struct xfs_engine_mount_t* mount, const char* path) +{ + struct xfs_stat_info info; + int16_t err = romfs_stat(mount, path, &info); + if (err != XFS_ERR_OK || info.type != XFS_TYPE_DIR) + return XFS_ERR_NOENT; + return XFS_ERR_OK; +} + +static int16_t romfs_getcwd(const struct xfs_engine_mount_t* mount, char* buffer, uint16_t size) +{ + (void)mount; + if (size < 2) + return XFS_ERR_INVAL; + strncpy(buffer, "/", size - 1); + buffer[size - 1] = '\0'; + return XFS_ERR_OK; +} + +static int16_t romfs_rename(const struct xfs_engine_mount_t* mount, const char* old_path, + const char* new_path) +{ + (void)mount; + (void)old_path; + (void)new_path; + return XFS_ERR_INVAL; +} + +static int16_t romfs_chmod(const struct xfs_engine_mount_t* mount, const char* path, uint16_t mode) +{ + (void)mount; + (void)path; + (void)mode; + return XFS_ERR_INVAL; +} + +static void romfs_free_handle(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle) +{ + (void)mount; + free(handle->data); + handle->data = NULL; +} + +const struct xfs_engine_t xfs_romfs_engine = { + .user = (void*)&xfs_default_romfs, + .mount = romfs_mount, + .is_mounted = romfs_is_mounted, + .unmount = romfs_unmount, + .mount_info = romfs_mount_info, + .open = romfs_open, + .read = romfs_read, + .direct_read = romfs_direct_read, + .write = romfs_write, + .close = romfs_close, + .lseek = romfs_lseek, + .opendir = romfs_opendir, + .readdir = romfs_readdir, + .closedir = romfs_closedir, + .stat = romfs_stat, + .unlink = romfs_unlink, + .mkdir = romfs_mkdir, + .rmdir = romfs_rmdir, + .chdir = romfs_chdir, + .getcwd = romfs_getcwd, + .rename = romfs_rename, + .chmod = romfs_chmod, + .free_handle = romfs_free_handle, +}; diff --git a/peripherals/fs/xfs_worker.c b/peripherals/fs/xfs_worker.c index 3ae3dc3d0..899fc0470 100644 --- a/peripherals/fs/xfs_worker.c +++ b/peripherals/fs/xfs_worker.c @@ -7,7 +7,6 @@ #include #include #include -#include #include #include #if defined(WIN32) || defined(_WIN32) @@ -40,27 +39,13 @@ bool xfs_debug_is_enabled(void) return xfs_debug_enabled; } -void xfs_debug_log(const char *format, ...) -{ - va_list args; - va_list remote_args; - char buffer[1024]; - - va_start(args, format); - va_copy(remote_args, args); - vprintf(format, args); - vsnprintf(buffer, sizeof(buffer), format, remote_args); - va_end(remote_args); - va_end(args); - - gdbserver_send_remote_console_output(buffer); -} - // XFS base directory path char xfs_base_path[512]; void xfs_init() { + xfs_compat_init(); + snprintf(xfs_base_path, sizeof(xfs_base_path), "%s/xfs", compat_get_config_path()); // Create "xfs" directory in Application Support directory diff --git a/roms/Makefile.am b/roms/Makefile.am index 5a0b552c4..c01227075 100644 --- a/roms/Makefile.am +++ b/roms/Makefile.am @@ -41,7 +41,8 @@ ROMS = \ roms/tc2068-1.rom \ roms/se-0.rom \ roms/se-1.rom \ - roms/speccyboot-1.4.rom + roms/speccyboot-1.4.rom \ + roms/spxromfs.bin pkgdata_DATA += $(ROMS) diff --git a/roms/spectranet.rom b/roms/spectranet.rom index c98e6c2cbd705c550b8021865332215929d07567..9e0e87cb7a4ad083dc86dcc4a573c9bebdf1dad8 100644 GIT binary patch delta 7300 zcmaJm3wRS%x-)I_XwyfUA_PP_CzGVp2WbeTgaFf`@|FeP4^Xy15f*8ofGyA_;Nol7 z>*X?6KV8vfuU@N&Ta?|~&&PTRW0eV>OH(XGw79wJxN7Cn*at0bC-*-yDJ`yUzRo%S z`Tzg??{nsy>7G5tJ$sBtyR*_}O?CTx(>&f8YmNMxs#$K_%P zS2M@ahed+5EI0f6qU>ZhZKN(9Mak|)Y{(ZDmD!V8iiFBC+Y&U@VNFJp9Ws8FZ$CPo zr`qZ9eB3i<6|y++drTA_G>1S|Q=s9b+`cy}%36CHJ^M=sFYcbZYPf`oqtg~ytfPee zW#|D*d#n&oL%tR5&rjKjU*pAjwgiU9_oDO59nAzA0$?ZpJKy>|&*zJPYy-=(Q`~ea zRRU&4LMX$HH=z!K&2S^?$|Z^CfKRZ@a|MY=E2U&`)7zh#OstL-0w1uG_JXPr$o}v_ z9(c0wcL;c{k^mk)MF+yq^AHmp<-rg>30x)&3mkk#yO|PIS|(+s3hrMOP#7kewe|-T zKbH>jjPK0jbe0^}ddYVGs@_IROaeKXMb@^fdH^vkvk1qKQgq@V-_B5kfr7F4Eb*6k zQ9f^Sx@v9&zsrF;!c+5Z2yQ~)Hdyf;!GLEHui#lwQn&QXf%yhJz-QO#2}r7 zpP_)4Pqs$1nUj^n+#Ds$EdngeZ)v>_tjT4f-$rm=>I7O#22>*KHbzn4DB9`V6`AP_o>8P=zR9{~6H@Dhu;c$KA}X9V4bY_Fbq@R|Qar>Y6&S@gjo?*a6#woB zUIm1f71rXbiHYEkRO)rMkvh2Q3h=DBS0fYCAc&);=|)Ub0mt_8EfpIp85>o+ZRfV) zHPux$+bXJEfYlHiE7w)jszV#&XD%@|TLuNI6pEO&Uhc(rJ7VI0^3I{EY|7nexr8XU zq-sjkj-(lTJ9H2%Eb{04Dbr2`nbcD?Cl)z*=S)dk8vBZ2X}-lE zNOl(%juj`obTb>ApO9_s&~(51GrFY)?jD8a?p2bw`;=sECE7(8k-@D`3lR6s1H{1n zBf6lfzjPAJOCy+^5zLVh%yod7MwleDq}ZB)?kKhz(b{6z9jgh8^<{N;kYH2tbd*q3 z2b-COb$PkvM`(FfzuX7)iNSQZ{|ugpLHQ9%dN zyZu&o#|IRH8kh|HDna_Umf}`kQj(eMiz{>77nec`_T~$pE_@~lx=oAb(wl_W7hUgu zzrZtrY#G2$Uq|6jc$iy|?Pgh9vK!t*Izj+4ot&TvJ&PPpn551i1Uf-TDC8Y8#g7U? zQD}tH#S>CDA%Asg!-u9qVfA8b&Rd0OxB%DkQXCbo)2-3PLxsX`7C-7Y6?T*)(c-`G zQLKU#fB;20qI}XB1!x4(3zER6n1oUaiHr^z4HXKDm$132Opz_r7&@ZByr!yZyK7f% z356dh5`Md6OX{zSI>B80T#=Bnv?K|TbC%Wx?XLKK#^iLxpJ7bJuK0PzRHC+XUGZJW zG+%9(x#GV;rdwU{*OBQ?SA0Edx)1nS(`r|Iq0O{jZ8y8(&)ZDf)OM#Ue#T}Bs_mmH z<_Q)4tt)9Q+c zWiu&it1FH_Z#ShE$3u2RITD)~<=9-cBUrheazPKBV~5te61`*XI?4r)V{JL`kj7E| zP*ph~wa%dp)Yh@B{NW19rM8Ysl%tg*)?<--rA2l$XP^ zIOUb_22ME~&d68Z2p8rnN5Z${D{qGXlCK;MU&vS93J>KYra-uFe_;?m$w+=fDgHfw zZXy1f*;3@!m)6wc={!Ei;18HaNd|17iOVQ55{eNh(IzQ6Q|cvzq5v7kB>XCKuF*r8 zVMddLD04P#rsG-UC`N=E3nb((%)5!OdP4aMtet$bR3@bn&+HU)Tsd z#|Uuiw>Cskwgq1F3JX(wS)_+a3t-X$uk~A=_AK$@_3VKI_OjO!9MC__`fu^h@!SF& zjh#{ zw~2dgjIe{CO9Gxi(@7=31Wjz9P;vWG6u%FSr=2q;e2M`Mc-#1Kx8RCNh70-aVi z02}JO0MuTeI9B@HR0v|1QY*F0YdMX^X>O?^X2fLdf78kO0#s z?yRv+_U{Ic-CiXHIFuB3`sy3TQ|MupMuAWkWLy6O#6aSR$PZf_khXx=`ZwI-uwDQ{ zu<4V}9sWA+*YrtPN&xiHU}H?`b4uk3awon@4Hkg1hEOCn=w%4$xp zOy!bhO0aZZWqb=@&4DKlIUD@bPx^ovm&2O-quF|DVnB&=NposoWlGU(BQ??5PMCt7 zv>sMxX9>-gQ1BP!X~F>&>)+{B*7vEk$r7 zg}4%IlpH8DBYHdPo7!B!QI8H zcNO2w*8TZ-4v}_K!i_1!jR{2dNtUcPT`#P?*pCcWwMXEBm}7~x!8(kdPsz94;T3xR zoudbY8=kqopt-H!4lk_ANa*}m9DpQQ`g91g9+ndcGH74}Y!fpmEP7^g`BKz4CX^XO zebY#kv>1&B+MF=%-JfFUC8=1|rmEa(4L(X^mP{eAFw4o^+tsB8T2RL&CvBw%hyLH0Sk1ay+$9H&oaRU?c=*`Gz zCToj^8hnz$0^`dKMcSGXWufB~+434Vg9$F?J&l%Q4IeKs9%$i{PG<^bEi)|_w`Fxr zqq?x8=i=_HE{URy!mgIQVABtxrOTh)wJAxqEbOHi4JHZH_nK zF8=(u*utGnCtmETZ3>Tz>60=kpok4!ZOt-1))fs!#Q*D>k~BVLck1JhKfVxd$JfP# zoXC-2Z?oRYPdKAwnlqST-jD#y--lvwupO3V_!v|$ca^Pl)tFC02Y$eGcbgBA%2fKNcw5MBWiBwFU*KIZM`RJ~0E7c44 zCG>DNv@u-!0}6Btx3*5Yb2>pt;#B^hT!u$)zqfCxSi8Ntyt1NpJ9S&dwyGV~Yb%(= zbH0j597mbzimf{~R#$9erg?lzna$;EH*Bn|NaJeCx3As6 ztgotOc5GQ!zP(~wei|hXl)~pO{L~=+s9O@|ov{TU>ykoIxf#z=>i!(g?jf)@z$$Tu z_O7pDC6q+X3b5;|N<6St!vO~ae>4103N@>Qs&rCV>;`m5hMfy&4+A_)#=YGkGEqi4 zGCDjIiqu;O0{H6{I=rt(Nech2M@bGJ4fZH0;ZTpF3*#O|AO5UIEbBqZWR|Ws1QwO` zV5vIgeH-^qdd~8JeOl*$)rT#K#TYC zC_@qUf10sqjCQqv6I6=6g!l2o(T?a?`_z<>K%Ui?w!Yu1noB}kDQR@`sFe4Fti@O9BJeCBusb(1}IL| zTc(pRCZ-o&Gd;Win(16WOs5mm)B6QiJ0jC=ZOPZy2E+4DHN#5M!m+cTEDDl&sD*~`C;hOnTKZvOecBHT>s-J1ML)U`O8G8$w!>2a z&jv~Y*R}L!brBsTzx8Kzt=xd1w6noK_J?Hb0m&h;vwymT3=l`7jLgt2lySn*Q6!#2 zl89$?sf-pGM~P9hqpnOS4U%}-l_jHENYh9bM$y{b=^FR!sQeI+g2)I{YGu6UGRW0% zXo7|c6O?Lus(5nXs_7G2I|mYsS}Zhu*As40RQXDb;=srRs9}{`t>oEPND0fT(miBe zP{wboWvStbW?GY{p~aqoM9krT5~)sVc73!;COK0p?Qm}>fx`DH37d#N=4(Sh98H8q zivh6Kd$PMg=X`a0eD4ZmF?0p8`0*9k9q|>|9nV}LyW3-h3Nu4wU(LRC?7);5fI0Bplct;$%n%08r%t|2 zt|BOU<+K3WW_coM;{bK*sc7 zNbTW8f;}-H)%tTgr+OUi_4u$Y0rFG_2yo^<6!h45F0AV31uzi3auyE}#c^$*P&Fd`UgG9Pl z3vv*Wvxd}(j3a}voHxhB7?_)gM7a4!qR2+X!u_rj*DIZ)FZQ32p~f#9)0|-=ZQI!D zPR%hIIvKw(6q@QJKB>rS88m0r{~wJ0yFf5>%%hD$S;xw(_mpT9zT!D48&<@V%C8T1 UG#&1s@3I_g>8Q+nwTm|YKX>6__W%F@ delta 8960 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 diff --git a/roms/spxromfs.bin b/roms/spxromfs.bin new file mode 100644 index 0000000000000000000000000000000000000000..49c1a144d22912a4041682c2f167b45f1a2a192a GIT binary patch literal 58651 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 A?*IS* literal 0 HcmV?d00001 From 7bf986da05a7875f249feeb845cbf455ae6c517c Mon Sep 17 00:00:00 2001 From: desertkun Date: Fri, 28 Aug 2026 16:56:22 +0200 Subject: [PATCH 2/5] spectranext: esxdos dot commands, browser support --- 3rdparty/libspectrum | 2 +- debugger/gdbserver_remote_commands.c | 87 ++++- memory_pages.c | 40 ++- peripherals/fs/xfs.c | 55 +++ peripherals/fs/xfs.h | 23 ++ peripherals/fs/xfs_compat.c | 6 +- peripherals/fs/xfs_engines.h | 6 +- peripherals/fs/xfs_fs.c | 45 ++- peripherals/fs/xfs_https.c | 28 +- peripherals/fs/xfs_overlay.c | 430 ++++++++++++++--------- peripherals/fs/xfs_romfs.c | 29 +- peripherals/fs/xfs_worker.c | 1 + peripherals/nic/spectranext.h | 15 +- peripherals/nic/spectranext_controller.c | 90 +++++ peripherals/spectranet.c | 65 +++- peripherals/spectranet.h | 27 +- roms/spectranet.rom | Bin 131072 -> 131072 bytes roms/spxromfs.bin | Bin 58651 -> 77045 bytes 18 files changed, 752 insertions(+), 197 deletions(-) diff --git a/3rdparty/libspectrum b/3rdparty/libspectrum index 282b61099..ad4416f5a 160000 --- a/3rdparty/libspectrum +++ b/3rdparty/libspectrum @@ -1 +1 @@ -Subproject commit 282b61099a2b7e171b0a13fc39821adb452e08ab +Subproject commit ad4416f5a158153e39d787d1d14c91400fa73889 diff --git a/debugger/gdbserver_remote_commands.c b/debugger/gdbserver_remote_commands.c index b293c78ec..804462dd1 100644 --- a/debugger/gdbserver_remote_commands.c +++ b/debugger/gdbserver_remote_commands.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "fuse.h" @@ -116,17 +117,97 @@ static uint8_t remote_command_spectranet_info( const char *args GCC_UNUSED ) snprintf( buffer, sizeof( buffer ), "Spectranet available: %s\n" "Spectranet paged in: %s\n" + "Page 0: 0x%02x\n" "Page A: 0x%02x\n" - "Page B: 0x%02x\n", + "Page B: 0x%02x\n" + "Page 3: 0x%02x\n", info.available ? "yes" : "no", info.paged ? "yes" : "no", + info.page_0, info.page_a, - info.page_b ); + info.page_b, + info.page_3 ); gdbserver_send_remote_console_output( buffer ); return 0; } +static uint8_t +remote_command_spectranet_set_page( const char *args ) +{ + char section; + const char *end; + char *page_end; + unsigned long page; + int destination; + char buffer[64]; + + args = skip_spaces( args ); + if( !args || !*args ) goto usage; + + section = tolower( (unsigned char)*args++ ); + if( *args && !isspace( (unsigned char)*args ) ) goto usage; + args = skip_spaces( args ); + if( !args || !*args ) goto usage; + + if( *args == '$' ) + page = strtoul( args + 1, &page_end, 16 ); + else + page = strtoul( args, &page_end, 0 ); + end = page_end; + if( end == args || (args[0] == '$' && end == args + 1) || + *skip_spaces( end ) || page > 0xff ) goto usage; + + switch( section ) { + case '0': destination = 0; break; + case 'a': destination = 1; break; + case 'b': destination = 2; break; + case '3': destination = 3; break; + default: goto usage; + } + + spectranet_map_page( destination, (int)page ); + snprintf( buffer, sizeof( buffer ), "Spectranet page %c set to 0x%02lx\n", + section, page ); + gdbserver_send_remote_console_output( buffer ); + return 0; + +usage: + gdbserver_send_remote_console_output( + "Usage: spectranet-set-page \n" ); + return 1; +} + +static uint8_t +remote_command_spectranet_set_pagein( const char *args ) +{ + const char *end; + size_t length; + + args = skip_spaces( args ); + if( !args || !*args ) goto usage; + end = args; + while( *end && !isspace( (unsigned char)*end ) ) end++; + length = end - args; + if( *skip_spaces( end ) ) goto usage; + + if( length == 3 && !strncmp( args, "yes", length ) ) { + spectranet_page( 0 ); + gdbserver_send_remote_console_output( "Spectranet paged in\n" ); + return 0; + } + if( length == 2 && !strncmp( args, "no", length ) ) { + spectranet_unpage(); + gdbserver_send_remote_console_output( "Spectranet paged out\n" ); + return 0; + } + +usage: + gdbserver_send_remote_console_output( + "Usage: spectranet-set-pagein \n" ); + return 1; +} + static uint8_t remote_command_xfs_debug( const char *args ) { int enable; @@ -185,6 +266,8 @@ const struct remote_command_entry_t remote_commands[] = { { "reset", remote_command_reset }, { "dump", remote_command_dump }, { "spectranet-info", remote_command_spectranet_info }, + { "spectranet-set-page", remote_command_spectranet_set_page }, + { "spectranet-set-pagein", remote_command_spectranet_set_pagein }, { "xfs-debug", remote_command_xfs_debug }, { NULL, NULL } }; diff --git a/memory_pages.c b/memory_pages.c index eabffa24b..994ce2581 100644 --- a/memory_pages.c +++ b/memory_pages.c @@ -393,24 +393,38 @@ readbyte( libspectrum_word address ) return opus_read( address ); if( spectranet_paged ) { + if( spectranet_w5100_paged_0 && address < 0x1000 ) + return spectranet_w5100_read( mapping, address ); if( spectranet_w5100_paged_a && address >= 0x1000 && address < 0x2000 ) return spectranet_w5100_read( mapping, address ); if( spectranet_w5100_paged_b && address >= 0x2000 && address < 0x3000 ) return spectranet_w5100_read( mapping, address ); + if( spectranet_w5100_paged_3 && address >= 0x3000 ) + return spectranet_w5100_read( mapping, address ); + if( spectranet_xfs_paged_0 && address < 0x1000 ) + return spectranet_xfs_read( mapping, address ); if( spectranet_xfs_paged_a && address >= 0x1000 && address < 0x2000 ) return spectranet_xfs_read( mapping, address ); if( spectranet_xfs_paged_b && address >= 0x2000 && address < 0x3000 ) return spectranet_xfs_read( mapping, address ); + if( spectranet_xfs_paged_3 && address >= 0x3000 ) + return spectranet_xfs_read( mapping, address ); + if( spectranet_spectranext_config_paged_0 && address < 0x1000 ) + return spectranet_spectranext_config_read( mapping, address ); if( spectranet_spectranext_config_paged_a && address >= 0x1000 && address < 0x2000 ) return spectranet_spectranext_config_read( mapping, address ); if( spectranet_spectranext_config_paged_b && address >= 0x2000 && address < 0x3000 ) return spectranet_spectranext_config_read( mapping, address ); - if( address < 0x1000 ) + if( spectranet_spectranext_config_paged_3 && address >= 0x3000 ) + return spectranet_spectranext_config_read( mapping, address ); + if( spectranet_flash_paged_0 && address < 0x1000 ) return spectranet_flash_rom_read( mapping, address ); if( spectranet_flash_paged_a && address >= 0x1000 && address < 0x2000 ) return spectranet_flash_rom_read( mapping, address ); if( spectranet_flash_paged_b && address >= 0x2000 && address < 0x3000 ) return spectranet_flash_rom_read( mapping, address ); + if( spectranet_flash_paged_3 && address >= 0x3000 ) + return spectranet_flash_rom_read( mapping, address ); } if( ttx2000s_paged && address >= 0x2000 ) @@ -506,6 +520,10 @@ writebyte_internal( libspectrum_word address, libspectrum_byte b ) /* all writes need to be parsed by the flash rom emulation */ spectranet_flash_rom_write(address, b); + if( spectranet_w5100_paged_0 && address < 0x1000 ) { + spectranet_w5100_write( mapping, address, b ); + return; + } if( spectranet_w5100_paged_a && address >= 0x1000 && address < 0x2000 ) { spectranet_w5100_write( mapping, address, b ); return; @@ -514,6 +532,14 @@ writebyte_internal( libspectrum_word address, libspectrum_byte b ) spectranet_w5100_write( mapping, address, b ); return; } + if( spectranet_w5100_paged_3 && address >= 0x3000 ) { + spectranet_w5100_write( mapping, address, b ); + return; + } + if( spectranet_xfs_paged_0 && address < 0x1000 ) { + spectranet_xfs_write( mapping, address, b ); + return; + } if( spectranet_xfs_paged_a && address >= 0x1000 && address < 0x2000 ) { spectranet_xfs_write( mapping, address, b ); return; @@ -522,6 +548,14 @@ writebyte_internal( libspectrum_word address, libspectrum_byte b ) spectranet_xfs_write( mapping, address, b ); return; } + if( spectranet_xfs_paged_3 && address >= 0x3000 ) { + spectranet_xfs_write( mapping, address, b ); + return; + } + if( spectranet_spectranext_config_paged_0 && address < 0x1000 ) { + spectranet_spectranext_config_write( mapping, address, b ); + return; + } if( spectranet_spectranext_config_paged_a && address >= 0x1000 && address < 0x2000 ) { spectranet_spectranext_config_write( mapping, address, b ); return; @@ -530,6 +564,10 @@ writebyte_internal( libspectrum_word address, libspectrum_byte b ) spectranet_spectranext_config_write( mapping, address, b ); return; } + if( spectranet_spectranext_config_paged_3 && address >= 0x3000 ) { + spectranet_spectranext_config_write( mapping, address, b ); + return; + } } if( ttx2000s_paged ) { diff --git a/peripherals/fs/xfs.c b/peripherals/fs/xfs.c index 1fb793b6e..695c7e212 100644 --- a/peripherals/fs/xfs.c +++ b/peripherals/fs/xfs.c @@ -575,6 +575,9 @@ void xfs_handle_opendir(volatile struct xfs_registers_t* registers) else { h->owner_mount = mount_point; + h->dir_position = 0; + strncpy(h->dir_path, resolved_path, sizeof(h->dir_path) - 1); + h->dir_path[sizeof(h->dir_path) - 1] = '\0'; XFS_DEBUG("xfs: opendir %s success handle=%d mount_point=%d\n", resolved_path, handle, mount_point); registers->result = 0; registers->file_handle = handle; @@ -598,6 +601,48 @@ void xfs_handle_readdir(volatile struct xfs_registers_t* registers) return; } + if (registers->arguments.readdir.operation == XFS_READDIR_SEEK) + { + const uint32_t position = registers->arguments.readdir.position; + const int16_t err = mounted_engine->engine->seekdir(mounted_engine, h, position); + if (err != XFS_ERR_OK) + { + registers->result = err; + registers->status = XFS_STATUS_ERROR; + return; + } + h->dir_position = position; + registers->arguments.readdir.position = position; + registers->result = 0; + registers->status = XFS_STATUS_COMPLETE; + return; + } + + if (registers->arguments.readdir.operation == XFS_READDIR_TELL) + { + const int16_t err = mounted_engine->engine->telldir( + mounted_engine, h, &h->dir_position); + if (err != XFS_ERR_OK) + { + registers->result = err; + registers->status = XFS_STATUS_ERROR; + return; + } + registers->arguments.readdir.position = h->dir_position; + registers->result = 0; + registers->status = XFS_STATUS_COMPLETE; + return; + } + + if (registers->arguments.readdir.operation != XFS_READDIR_NEXT) + { + XFS_DEBUG("xfs: readdir failed: invalid operation=%u\n", + registers->arguments.readdir.operation); + registers->result = XFS_ERR_INVAL; + registers->status = XFS_STATUS_ERROR; + return; + } + struct xfs_stat_info info = {0}; const int16_t err = mounted_engine->engine->readdir(mounted_engine, h, &info); @@ -632,6 +677,16 @@ void xfs_handle_readdir(volatile struct xfs_registers_t* registers) tail[7] = (uint8_t)((info.mtime >> 8) & 0xff); tail[8] = (uint8_t)((info.mtime >> 16) & 0xff); tail[9] = (uint8_t)((info.mtime >> 24) & 0xff); + const int16_t tell_err = mounted_engine->engine->telldir( + mounted_engine, h, &h->dir_position); + if (tell_err != XFS_ERR_OK) + { + XFS_DEBUG("xfs: telldir failed: result=%d\n", tell_err); + registers->result = tell_err; + registers->status = XFS_STATUS_ERROR; + return; + } + registers->arguments.readdir.position = h->dir_position; registers->result = 0; } registers->status = XFS_STATUS_COMPLETE; diff --git a/peripherals/fs/xfs.h b/peripherals/fs/xfs.h index 9e034ac9b..a959fec33 100644 --- a/peripherals/fs/xfs.h +++ b/peripherals/fs/xfs.h @@ -96,6 +96,7 @@ enum { FS_STORAGE_RAM = 0, FS_STORAGE_FLASH = 1, + FS_STORAGE_SYSTEM = 2 }; #endif @@ -136,6 +137,8 @@ struct xfs_engine_t // Directory operations int16_t (*opendir)(const struct xfs_engine_mount_t* engine, struct xfs_handle_t* handle, const char* path); int16_t (*readdir)(const struct xfs_engine_mount_t* engine, struct xfs_handle_t* handle, struct xfs_stat_info* info); + int16_t (*telldir)(const struct xfs_engine_mount_t* engine, struct xfs_handle_t* handle, uint32_t* position); + int16_t (*seekdir)(const struct xfs_engine_mount_t* engine, struct xfs_handle_t* handle, uint32_t position); int16_t (*closedir)(const struct xfs_engine_mount_t* engine, struct xfs_handle_t* handle); // Path operations @@ -195,6 +198,8 @@ struct xfs_handle_t enum xfs_handle_type_t type; /** Mount point this handle belongs to (0–3); 0xFF when unallocated. */ uint8_t owner_mount; + uint32_t dir_position; + char dir_path[XFS_PATH_MAX]; void* data; }; @@ -232,6 +237,20 @@ struct xfs_args_opendir_t char path[256]; }; +struct xfs_args_readdir_t +{ + uint32_t position; + uint8_t operation; + uint8_t reserved[251]; +}; + +enum xfs_readdir_operation_t +{ + XFS_READDIR_NEXT = 0, + XFS_READDIR_SEEK = 1, + XFS_READDIR_TELL = 2, +}; + struct xfs_args_stat_t { char path[256]; @@ -304,6 +323,7 @@ union xfs_arguments_t struct xfs_args_read_t read; struct xfs_args_write_t write; struct xfs_args_opendir_t opendir; + struct xfs_args_readdir_t readdir; struct xfs_args_stat_t stat; struct xfs_args_unlink_t unlink; struct xfs_args_mkdir_t mkdir; @@ -358,6 +378,9 @@ _Static_assert(0x200 == offsetof(struct xfs_registers_t, workspace), "workspace _Static_assert(0x008 == offsetof(struct xfs_registers_t, arguments), "arguments is not at 0x008"); extern void xfs_init(); +/** Serialize access to XFS mounts and handle state. */ +extern void xfs_lock(void); +extern void xfs_unlock(void); extern void xfs_reset(void); /** Close all XFS handles for this mount (call from engine unmount; idempotent if already empty). */ diff --git a/peripherals/fs/xfs_compat.c b/peripherals/fs/xfs_compat.c index 1dc76c2a2..e1aa9519b 100644 --- a/peripherals/fs/xfs_compat.c +++ b/peripherals/fs/xfs_compat.c @@ -30,11 +30,13 @@ xfs_romfs_config_t xfs_default_romfs = { .start = NULL, .end = NULL, .name = "romfs", - .storage = FS_STORAGE_FLASH, + /* Match the controller: ROMFS is the immutable system layer, not a + * user-writable flash filesystem. Overlay policy distinguishes it. */ + .storage = FS_STORAGE_SYSTEM, }; const xfs_overlay_config_t xfs_default_overlay = { - .layers = { &xfs_romfs_layer, &xfs_ram_layer, NULL }, + .layers = { &xfs_ram_layer, &xfs_romfs_layer, NULL }, .default_layer = &xfs_ram_layer, }; diff --git a/peripherals/fs/xfs_engines.h b/peripherals/fs/xfs_engines.h index 73f821882..e81efa662 100644 --- a/peripherals/fs/xfs_engines.h +++ b/peripherals/fs/xfs_engines.h @@ -2,8 +2,8 @@ #include "xfs.h" -extern struct xfs_engine_t http_engine; -extern struct xfs_engine_t https_engine; -extern struct xfs_engine_t xfs_ram_engine; +extern const struct xfs_engine_t https_engine; +extern const struct xfs_engine_t http_engine; extern const struct xfs_engine_t xfs_romfs_engine; +extern const struct xfs_engine_t xfs_ram_engine; extern const struct xfs_engine_t xfs_overlay_engine; diff --git a/peripherals/fs/xfs_fs.c b/peripherals/fs/xfs_fs.c index 1521f20ec..f20fdf18c 100644 --- a/peripherals/fs/xfs_fs.c +++ b/peripherals/fs/xfs_fs.c @@ -84,6 +84,9 @@ struct xfs_fs_dir_handle_t { DIR *dir; char path[PATH_MAX]; + /* XFS exposes a logical cursor, whereas POSIX telldir cookies are opaque + * and can exceed 16 bits. Keep an XFS-visible logical entry index instead. */ + uint32_t position; }; static inline struct xfs_fs_mount_data_t* get_mount_data(const struct xfs_engine_mount_t* mount) @@ -345,6 +348,11 @@ static int16_t fs_opendir(const struct xfs_engine_mount_t* engine, struct xfs_ha if (!dir_handle) { return XFS_ERR_NOMEM; } + + /* Overlay cursors use the child engine's logical directory-entry index. + * This allocation is not zeroed, so leaving position unset leaks an + * allocator value through fs_telldir() and makes overlay reject entries. */ + dir_handle->position = 0; dir_handle->dir = opendir(full_path); @@ -436,9 +444,42 @@ static int16_t fs_readdir(const struct xfs_engine_mount_t* engine, struct xfs_ha } XFS_DEBUG("fs: readdir success name=%s type=%d\n", info->name, info->type); + if (dir_handle->position == UINT32_MAX) + return XFS_ERR_INVAL; + dir_handle->position++; return 1; // Success, not end of directory } +static int16_t fs_telldir(const struct xfs_engine_mount_t* engine, struct xfs_handle_t* handle, uint32_t* position) +{ + (void)engine; + struct xfs_fs_dir_handle_t* dir_handle = get_dir_handle(handle); + if (!dir_handle || !position) + return XFS_ERR_BADF; + + *position = dir_handle->position; + return XFS_ERR_OK; +} + +static int16_t fs_seekdir(const struct xfs_engine_mount_t* engine, struct xfs_handle_t* handle, uint32_t position) +{ + (void)engine; + struct xfs_fs_dir_handle_t* dir_handle = get_dir_handle(handle); + if (!dir_handle) + return XFS_ERR_BADF; + + rewinddir(dir_handle->dir); + dir_handle->position = 0; + struct xfs_stat_info ignored; + while (dir_handle->position < position) + { + const int16_t err = fs_readdir(engine, handle, &ignored); + if (err <= 0) + return err < 0 ? err : XFS_ERR_INVAL; + } + return XFS_ERR_OK; +} + // Close directory static int16_t fs_closedir(const struct xfs_engine_mount_t* engine, struct xfs_handle_t* handle) { @@ -651,7 +692,7 @@ static void fs_free_handle(const struct xfs_engine_mount_t* engine, struct xfs_h } // XFS filesystem engine -struct xfs_engine_t xfs_ram_engine = { +const struct xfs_engine_t xfs_ram_engine = { .user = NULL, .mount = fs_mount, .is_mounted = fs_is_mounted, @@ -664,6 +705,8 @@ struct xfs_engine_t xfs_ram_engine = { .lseek = fs_lseek, .opendir = fs_opendir, .readdir = fs_readdir, + .telldir = fs_telldir, + .seekdir = fs_seekdir, .closedir = fs_closedir, .stat = fs_stat, .unlink = fs_unlink, diff --git a/peripherals/fs/xfs_https.c b/peripherals/fs/xfs_https.c index 40b52e013..42bd8556a 100644 --- a/peripherals/fs/xfs_https.c +++ b/peripherals/fs/xfs_https.c @@ -1129,6 +1129,26 @@ static int16_t https_readdir(const struct xfs_engine_mount_t* engine, struct xfs return 1; // Entry found } +static int16_t https_telldir(const struct xfs_engine_mount_t* engine, struct xfs_handle_t* handle, uint32_t* position) +{ + (void)engine; + struct xfs_handle_https_dir_t* https_handle = get_https_dir_handle(handle); + if (!https_handle || !position) + return XFS_ERR_BADF; + *position = https_handle->dir_entries_pos; + return XFS_ERR_OK; +} + +static int16_t https_seekdir(const struct xfs_engine_mount_t* engine, struct xfs_handle_t* handle, uint32_t position) +{ + (void)engine; + struct xfs_handle_https_dir_t* https_handle = get_https_dir_handle(handle); + if (!https_handle || position > https_handle->dir_entries_count) + return XFS_ERR_INVAL; + https_handle->dir_entries_pos = position; + return XFS_ERR_OK; +} + /* Free opendir entries; dir wrapper freed in https_free_handle. Safe to call twice. */ static int16_t https_closedir(const struct xfs_engine_mount_t* engine, struct xfs_handle_t* handle) { @@ -1459,7 +1479,7 @@ static void https_mount_info(const struct xfs_engine_mount_t *engine_mount, char } // HTTPS engine instance -struct xfs_engine_t https_engine = { +const struct xfs_engine_t https_engine = { .user = (void*)HTTPS_SCHEME, .mount = https_mount, .unmount = https_unmount, @@ -1472,6 +1492,8 @@ struct xfs_engine_t https_engine = { .lseek = https_lseek, .opendir = https_opendir, .readdir = https_readdir, + .telldir = https_telldir, + .seekdir = https_seekdir, .closedir = https_closedir, .stat = https_stat, .unlink = https_unlink, @@ -1484,7 +1506,7 @@ struct xfs_engine_t https_engine = { .free_handle = https_free_handle, }; -struct xfs_engine_t http_engine = { +const struct xfs_engine_t http_engine = { .user = (void*)HTTP_SCHEME, .mount = https_mount, .unmount = https_unmount, @@ -1497,6 +1519,8 @@ struct xfs_engine_t http_engine = { .lseek = https_lseek, .opendir = https_opendir, .readdir = https_readdir, + .telldir = https_telldir, + .seekdir = https_seekdir, .closedir = https_closedir, .stat = https_stat, .unlink = https_unlink, diff --git a/peripherals/fs/xfs_overlay.c b/peripherals/fs/xfs_overlay.c index 8d6e74d39..759a4b400 100644 --- a/peripherals/fs/xfs_overlay.c +++ b/peripherals/fs/xfs_overlay.c @@ -4,7 +4,7 @@ #include #include -#define XFS_OVERLAY_MAX_SEEN_DIRS 64 +#define XFS_OVERLAY_MAX_READDIR_ENTRIES 256 typedef struct { @@ -16,25 +16,22 @@ typedef struct { xfs_overlay_layer_t layers[XFS_OVERLAY_MAX_LAYERS]; uint8_t layer_count; - uint8_t default_layer; + xfs_overlay_layer_t* default_layer; } xfs_overlay_mount_t; typedef struct { - uint8_t layer; + xfs_overlay_layer_t* layer; struct xfs_handle_t child; } xfs_overlay_file_handle_t; typedef struct { xfs_overlay_mount_t* overlay; - char path[XFS_PATH_MAX]; - uint8_t current_layer; - uint8_t child_open; - uint8_t parent_emitted; - uint8_t seen_dir_count; - char* seen_dirs[XFS_OVERLAY_MAX_SEEN_DIRS]; - struct xfs_handle_t child; + struct xfs_stat_info* entries; + uint16_t entry_count; + uint16_t position; + bool parent_emitted; } xfs_overlay_dir_handle_t; static xfs_overlay_mount_t* overlay_mount_data(const struct xfs_engine_mount_t* mount) @@ -103,7 +100,7 @@ static int16_t overlay_mount(const struct xfs_engine_t* engine, const char* host } int default_layer = overlay_layer_index_for_config(overlay, config->default_layer); - overlay->default_layer = default_layer >= 0 ? (uint8_t)default_layer : (overlay->layer_count - 1); + overlay->default_layer = &overlay->layers[default_layer >= 0 ? (uint8_t)default_layer : (overlay->layer_count - 1)]; out_mount->mount_data = overlay; XFS_DEBUG("overlay: mount success layers=%u default=%u\n", overlay->layer_count, overlay->default_layer); return XFS_ERR_OK; @@ -147,6 +144,62 @@ static bool overlay_path_exists(xfs_overlay_layer_t* layer, const char* path, st return layer->config->engine->stat(&layer->mount, path, info) == XFS_ERR_OK; } +static bool overlay_is_system_dir(const xfs_overlay_mount_t* overlay, const char* path) +{ + if (overlay->layer_count == 0) + return false; + + struct xfs_stat_info info; + const xfs_overlay_layer_t* layer = &overlay->layers[overlay->layer_count - 1]; + return layer->config->engine->stat(&layer->mount, path, &info) == XFS_ERR_OK + && info.type == XFS_TYPE_DIR + && info.storage == FS_STORAGE_SYSTEM; +} + +/* Shadow only an already-existing immediate parent; never create missing paths. */ +static int16_t overlay_mkdir_shadow(xfs_overlay_mount_t* overlay, const char* path) +{ + const char* slash = strrchr(path, '/'); + if (!slash) + return XFS_ERR_OK; + if (slash == path) + return XFS_ERR_OK; + + const size_t parent_len = (size_t)(slash - path); + if (parent_len >= XFS_PATH_MAX) + return XFS_ERR_NAMETOOLONG; + + char parent[XFS_PATH_MAX]; + memcpy(parent, path, parent_len); + parent[parent_len] = '\0'; + + struct xfs_stat_info info; + xfs_overlay_layer_t* first_layer = &overlay->layers[0]; + int16_t err = first_layer->config->engine->stat(&first_layer->mount, parent, &info); + if (err == XFS_ERR_OK) + return info.type == XFS_TYPE_DIR ? XFS_ERR_OK : XFS_ERR_NOTDIR; + if (err != XFS_ERR_NOENT) + return err; + + for (uint8_t i = 1; i < overlay->layer_count; ++i) + { + xfs_overlay_layer_t* layer = &overlay->layers[i]; + err = layer->config->engine->stat(&layer->mount, parent, &info); + if (err == XFS_ERR_OK) + { + if (info.type != XFS_TYPE_DIR) + return XFS_ERR_NOTDIR; + + err = first_layer->config->engine->mkdir(&first_layer->mount, parent); + return err == XFS_ERR_EXIST ? XFS_ERR_OK : err; + } + if (err != XFS_ERR_NOENT) + return err; + } + + return XFS_ERR_NOENT; +} + static int16_t overlay_open(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, const char* path, int flags) { @@ -154,7 +207,30 @@ static int16_t overlay_open(const struct xfs_engine_mount_t* mount, struct xfs_h if (!overlay) return XFS_ERR_IO; - const bool create = (flags & XFS_O_CREAT) != 0; + if ((flags & XFS_O_CREAT) != 0) + { + // we always create on first layer + xfs_overlay_layer_t* layer = &overlay->layers[0]; + const int16_t shadow_err = overlay_mkdir_shadow(overlay, path); + if (shadow_err != XFS_ERR_OK) + return shadow_err; + + xfs_overlay_file_handle_t* overlay_handle = calloc(1, sizeof(*overlay_handle)); + if (!overlay_handle) + return XFS_ERR_NOMEM; + overlay_handle->layer = layer; + overlay_handle->child.type = XFS_HANDLE_TYPE_FILE; + + const int16_t err = layer->config->engine->open(&layer->mount, &overlay_handle->child, path, flags); + if (err == XFS_ERR_OK) + { + handle->data = overlay_handle; + return XFS_ERR_OK; + } + free(overlay_handle); + return err; + } + struct xfs_stat_info stat_info; int16_t first_error = XFS_ERR_NOENT; @@ -164,13 +240,10 @@ static int16_t overlay_open(const struct xfs_engine_mount_t* mount, struct xfs_h const int16_t stat_err = layer->config->engine->stat(&layer->mount, path, &stat_info); if (stat_err == XFS_ERR_OK) { - if (create && (flags & XFS_O_EXCL)) - return XFS_ERR_EXIST; - xfs_overlay_file_handle_t* overlay_handle = calloc(1, sizeof(*overlay_handle)); if (!overlay_handle) return XFS_ERR_NOMEM; - overlay_handle->layer = i; + overlay_handle->layer = layer; overlay_handle->child.type = XFS_HANDLE_TYPE_FILE; const int16_t err = layer->config->engine->open(&layer->mount, &overlay_handle->child, path, flags); @@ -186,10 +259,7 @@ static int16_t overlay_open(const struct xfs_engine_mount_t* mount, struct xfs_h first_error = stat_err; } - if (!create) - return first_error; - - xfs_overlay_layer_t* layer = &overlay->layers[overlay->default_layer]; + xfs_overlay_layer_t* layer = overlay->default_layer; xfs_overlay_file_handle_t* overlay_handle = calloc(1, sizeof(*overlay_handle)); if (!overlay_handle) return XFS_ERR_NOMEM; @@ -211,9 +281,9 @@ static int32_t overlay_read(const struct xfs_engine_mount_t* mount, struct xfs_h { xfs_overlay_mount_t* overlay = overlay_mount_data(mount); xfs_overlay_file_handle_t* overlay_handle = (xfs_overlay_file_handle_t*)handle->data; - if (!overlay || !overlay_handle || overlay_handle->layer >= overlay->layer_count) + if (!overlay || !overlay_handle) return XFS_ERR_BADF; - xfs_overlay_layer_t* layer = &overlay->layers[overlay_handle->layer]; + xfs_overlay_layer_t* layer = overlay_handle->layer; return layer->config->engine->read(&layer->mount, &overlay_handle->child, buffer, size); } @@ -222,9 +292,9 @@ static const uint8_t* overlay_direct_read(const struct xfs_engine_mount_t* mount { xfs_overlay_mount_t* overlay = overlay_mount_data(mount); xfs_overlay_file_handle_t* overlay_handle = (xfs_overlay_file_handle_t*)handle->data; - if (!overlay || !overlay_handle || overlay_handle->layer >= overlay->layer_count) + if (!overlay || !overlay_handle) return NULL; - xfs_overlay_layer_t* layer = &overlay->layers[overlay_handle->layer]; + xfs_overlay_layer_t* layer = overlay_handle->layer; if (!layer->config->engine->direct_read) return NULL; return layer->config->engine->direct_read(&layer->mount, &overlay_handle->child, out_len); @@ -235,22 +305,25 @@ static int32_t overlay_write(const struct xfs_engine_mount_t* mount, struct xfs_ { xfs_overlay_mount_t* overlay = overlay_mount_data(mount); xfs_overlay_file_handle_t* overlay_handle = (xfs_overlay_file_handle_t*)handle->data; - if (!overlay || !overlay_handle || overlay_handle->layer >= overlay->layer_count) + if (!overlay || !overlay_handle) return XFS_ERR_BADF; - xfs_overlay_layer_t* layer = &overlay->layers[overlay_handle->layer]; + xfs_overlay_layer_t* layer = overlay_handle->layer; return layer->config->engine->write(&layer->mount, &overlay_handle->child, buffer, size); } static int16_t overlay_close(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle) { - xfs_overlay_mount_t* overlay = overlay_mount_data(mount); xfs_overlay_file_handle_t* overlay_handle = (xfs_overlay_file_handle_t*)handle->data; if (!overlay_handle) return XFS_ERR_OK; - if (!overlay || overlay_handle->layer >= overlay->layer_count) - return XFS_ERR_BADF; - xfs_overlay_layer_t* layer = &overlay->layers[overlay_handle->layer]; - return layer->config->engine->close(&layer->mount, &overlay_handle->child); + xfs_overlay_layer_t* layer = overlay_handle->layer; + const int16_t err = layer->config->engine->close(&layer->mount, &overlay_handle->child); + if (err == XFS_ERR_OK && layer->config->engine->free_handle) + { + /* The child engine owns its handle wrapper; release it once the close succeeds. */ + layer->config->engine->free_handle(&layer->mount, &overlay_handle->child); + } + return err; } static int32_t overlay_lseek(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, @@ -258,115 +331,65 @@ static int32_t overlay_lseek(const struct xfs_engine_mount_t* mount, struct xfs_ { xfs_overlay_mount_t* overlay = overlay_mount_data(mount); xfs_overlay_file_handle_t* overlay_handle = (xfs_overlay_file_handle_t*)handle->data; - if (!overlay || !overlay_handle || overlay_handle->layer >= overlay->layer_count) + if (!overlay || !overlay_handle) return XFS_ERR_BADF; - xfs_overlay_layer_t* layer = &overlay->layers[overlay_handle->layer]; + xfs_overlay_layer_t* layer = overlay_handle->layer; return layer->config->engine->lseek(&layer->mount, &overlay_handle->child, offset, whence); } -static int16_t overlay_open_next_dir(xfs_overlay_dir_handle_t* dir_handle) -{ - while (dir_handle->current_layer < dir_handle->overlay->layer_count) - { - xfs_overlay_layer_t* layer = &dir_handle->overlay->layers[dir_handle->current_layer]; - memset(&dir_handle->child, 0, sizeof(dir_handle->child)); - dir_handle->child.type = XFS_HANDLE_TYPE_DIR; - const int16_t err = layer->config->engine->opendir(&layer->mount, &dir_handle->child, dir_handle->path); - if (err == XFS_ERR_OK) - { - dir_handle->child_open = 1; - return XFS_ERR_OK; - } - if (err != XFS_ERR_NOENT) - return err; - dir_handle->current_layer++; - } - return XFS_ERR_NOENT; -} - -static int16_t overlay_opendir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, - const char* path) -{ - xfs_overlay_mount_t* overlay = overlay_mount_data(mount); - if (!overlay) - return XFS_ERR_IO; - - xfs_overlay_dir_handle_t* dir_handle = calloc(1, sizeof(*dir_handle)); - if (!dir_handle) - return XFS_ERR_NOMEM; - - dir_handle->overlay = overlay; - strncpy(dir_handle->path, path, sizeof(dir_handle->path) - 1); - dir_handle->path[sizeof(dir_handle->path) - 1] = '\0'; - - const int16_t err = overlay_open_next_dir(dir_handle); - if (err == XFS_ERR_OK) - { - handle->data = dir_handle; - return XFS_ERR_OK; - } - free(dir_handle); - return err; -} - -static bool overlay_entry_shadowed(xfs_overlay_dir_handle_t* dir_handle, const char* name) +static bool overlay_entry_shadowed(xfs_overlay_mount_t* overlay, const char* path, + uint8_t layer_index, const char* name) { if (strcmp(name, ".") == 0) return false; char child[XFS_PATH_MAX]; - if (overlay_join_path(child, sizeof(child), dir_handle->path, name) != XFS_ERR_OK) + if (overlay_join_path(child, sizeof(child), path, name) != XFS_ERR_OK) return false; struct xfs_stat_info info; - for (uint8_t i = 0; i < dir_handle->current_layer; ++i) + for (uint8_t i = 0; i < layer_index; ++i) { - if (overlay_path_exists(&dir_handle->overlay->layers[i], child, &info)) + if (overlay_path_exists(&overlay->layers[i], child, &info)) return true; } return false; } -static char* overlay_strdup(const char* s) -{ - const size_t len = strlen(s) + 1; - char* copy = malloc(len); - if (!copy) - return NULL; - memcpy(copy, s, len); - return copy; -} - -static void overlay_free_seen_dirs(xfs_overlay_dir_handle_t* dir_handle) -{ - for (uint8_t i = 0; i < dir_handle->seen_dir_count; ++i) - { - free(dir_handle->seen_dirs[i]); - dir_handle->seen_dirs[i] = NULL; - } - dir_handle->seen_dir_count = 0; -} - -static bool overlay_dir_seen(const xfs_overlay_dir_handle_t* dir_handle, const char* name) +static bool overlay_cached_dir_seen(const xfs_overlay_dir_handle_t* dir_handle, const char* name) { - for (uint8_t i = 0; i < dir_handle->seen_dir_count; ++i) + for (uint16_t i = 0; i < dir_handle->entry_count; ++i) { - if (strcmp(dir_handle->seen_dirs[i], name) == 0) + if (dir_handle->entries[i].type == XFS_TYPE_DIR && + strcmp(dir_handle->entries[i].name, name) == 0) return true; } return false; } -static int16_t overlay_note_dir_seen(xfs_overlay_dir_handle_t* dir_handle, const char* name) +static int16_t overlay_cache_readdir_entry(xfs_overlay_dir_handle_t* dir_handle, + const char* path, uint8_t layer_index, struct xfs_stat_info* info) { - if (dir_handle->seen_dir_count >= XFS_OVERLAY_MAX_SEEN_DIRS) + if (strcmp(info->name, "..") == 0) + return XFS_ERR_OK; + if (info->type == XFS_TYPE_DIR && overlay_cached_dir_seen(dir_handle, info->name)) + return XFS_ERR_OK; + if (overlay_entry_shadowed(dir_handle->overlay, path, layer_index, info->name)) return XFS_ERR_OK; + if (dir_handle->entry_count >= XFS_OVERLAY_MAX_READDIR_ENTRIES) + return XFS_ERR_INVAL; - char* copy = overlay_strdup(name); - if (!copy) - return XFS_ERR_NOMEM; + if (info->type == XFS_TYPE_DIR) + { + char child[XFS_PATH_MAX]; + const int16_t err = overlay_join_path(child, sizeof(child), path, info->name); + if (err != XFS_ERR_OK) + return err; + if (overlay_is_system_dir(dir_handle->overlay, child)) + info->storage = FS_STORAGE_SYSTEM; + } - dir_handle->seen_dirs[dir_handle->seen_dir_count++] = copy; + dir_handle->entries[dir_handle->entry_count++] = *info; return XFS_ERR_OK; } @@ -380,57 +403,88 @@ static int16_t overlay_emit_parent(struct xfs_stat_info* info) return 1; } -static int16_t overlay_readdir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, - struct xfs_stat_info* info) +static int16_t overlay_scan_dir(xfs_overlay_dir_handle_t* dir_handle, const char* path) { - (void)mount; - xfs_overlay_dir_handle_t* dir_handle = (xfs_overlay_dir_handle_t*)handle->data; - if (!dir_handle || !dir_handle->overlay) - return XFS_ERR_BADF; - - if (!dir_handle->parent_emitted) + bool opened_any = false; + for (uint8_t layer_index = 0; layer_index < dir_handle->overlay->layer_count; ++layer_index) { - dir_handle->parent_emitted = 1; - return overlay_emit_parent(info); - } + xfs_overlay_layer_t* layer = &dir_handle->overlay->layers[layer_index]; + struct xfs_handle_t child = {.type = XFS_HANDLE_TYPE_DIR}; + int16_t err = layer->config->engine->opendir(&layer->mount, &child, path); + if (err == XFS_ERR_NOENT) + continue; + if (err != XFS_ERR_OK) + return err; + opened_any = true; - for (;;) - { - if (!dir_handle->child_open) + struct xfs_stat_info info; + while ((err = layer->config->engine->readdir(&layer->mount, &child, &info)) > 0) { - const int16_t err = overlay_open_next_dir(dir_handle); - if (err == XFS_ERR_NOENT) - return 0; + err = overlay_cache_readdir_entry(dir_handle, path, layer_index, &info); if (err != XFS_ERR_OK) - return err; + break; } - xfs_overlay_layer_t* layer = &dir_handle->overlay->layers[dir_handle->current_layer]; - const int16_t err = layer->config->engine->readdir(&layer->mount, &dir_handle->child, info); - if (err > 0) - { - if (strcmp(info->name, "..") == 0) - continue; - if (info->type == XFS_TYPE_DIR) - { - if (overlay_dir_seen(dir_handle, info->name)) - continue; - - const int16_t note_err = overlay_note_dir_seen(dir_handle, info->name); - if (note_err != XFS_ERR_OK) - return note_err; - } - if (overlay_entry_shadowed(dir_handle, info->name)) - continue; - return err; - } + const int16_t close_err = layer->config->engine->closedir(&layer->mount, &child); + if (close_err == XFS_ERR_OK && layer->config->engine->free_handle) + layer->config->engine->free_handle(&layer->mount, &child); if (err < 0) return err; + if (close_err != XFS_ERR_OK) + return close_err; + } + return opened_any ? XFS_ERR_OK : XFS_ERR_NOENT; +} + +static int16_t overlay_opendir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + const char* path) +{ + xfs_overlay_mount_t* overlay = overlay_mount_data(mount); + if (!overlay) + return XFS_ERR_IO; + + xfs_overlay_dir_handle_t* dir_handle = calloc(1, sizeof(*dir_handle)); + if (!dir_handle) + return XFS_ERR_NOMEM; + dir_handle->entries = calloc(XFS_OVERLAY_MAX_READDIR_ENTRIES, sizeof(*dir_handle->entries)); + if (!dir_handle->entries) + { + free(dir_handle); + return XFS_ERR_NOMEM; + } + dir_handle->overlay = overlay; + + const int16_t err = overlay_scan_dir(dir_handle, path); + if (err != XFS_ERR_OK) + { + free(dir_handle->entries); + free(dir_handle); + return err; + } + handle->data = dir_handle; + handle->dir_position = 0; + return XFS_ERR_OK; +} - layer->config->engine->closedir(&layer->mount, &dir_handle->child); - dir_handle->child_open = 0; - dir_handle->current_layer++; +static int16_t overlay_readdir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, + struct xfs_stat_info* info) +{ + (void)mount; + xfs_overlay_dir_handle_t* dir_handle = (xfs_overlay_dir_handle_t*)handle->data; + if (!dir_handle || !dir_handle->entries) + return XFS_ERR_BADF; + if (!dir_handle->parent_emitted) + { + dir_handle->parent_emitted = true; + handle->dir_position = 0; + return overlay_emit_parent(info); } + if (dir_handle->position >= dir_handle->entry_count) + return 0; + + *info = dir_handle->entries[dir_handle->position++]; + handle->dir_position = dir_handle->position; + return 1; } static int16_t overlay_closedir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle) @@ -439,15 +493,34 @@ static int16_t overlay_closedir(const struct xfs_engine_mount_t* mount, struct x xfs_overlay_dir_handle_t* dir_handle = (xfs_overlay_dir_handle_t*)handle->data; if (!dir_handle) return XFS_ERR_OK; - if (dir_handle->child_open && dir_handle->current_layer < dir_handle->overlay->layer_count) - { - xfs_overlay_layer_t* layer = &dir_handle->overlay->layers[dir_handle->current_layer]; - const int16_t err = layer->config->engine->closedir(&layer->mount, &dir_handle->child); - dir_handle->child_open = 0; - overlay_free_seen_dirs(dir_handle); - return err; - } - overlay_free_seen_dirs(dir_handle); + free(dir_handle->entries); + dir_handle->entries = NULL; + dir_handle->entry_count = 0; + dir_handle->position = 0; + dir_handle->parent_emitted = false; + handle->dir_position = 0; + return XFS_ERR_OK; +} + +static int16_t overlay_telldir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, uint32_t* position) +{ + (void)mount; + xfs_overlay_dir_handle_t* dir_handle = (xfs_overlay_dir_handle_t*)handle->data; + if (!dir_handle || !position) + return XFS_ERR_BADF; + *position = dir_handle->position; + return XFS_ERR_OK; +} + +static int16_t overlay_seekdir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, uint32_t position) +{ + (void)mount; + xfs_overlay_dir_handle_t* dir_handle = (xfs_overlay_dir_handle_t*)handle->data; + if (!dir_handle || !dir_handle->entries || position > dir_handle->entry_count) + return XFS_ERR_INVAL; + dir_handle->position = (uint16_t)position; + dir_handle->parent_emitted = true; + handle->dir_position = position; return XFS_ERR_OK; } @@ -462,7 +535,14 @@ static int16_t overlay_stat(const struct xfs_engine_mount_t* mount, const char* { int16_t err = overlay->layers[i].config->engine->stat(&overlay->layers[i].mount, path, stat_info); if (err == XFS_ERR_OK) + { + if (stat_info->type == XFS_TYPE_DIR) + { + if (overlay_is_system_dir(overlay, path)) + stat_info->storage = FS_STORAGE_SYSTEM; + } return XFS_ERR_OK; + } if (err != XFS_ERR_NOENT && first_error == XFS_ERR_NOENT) first_error = err; } @@ -482,7 +562,14 @@ static int16_t overlay_unlink(const struct xfs_engine_mount_t* mount, const char xfs_overlay_layer_t* layer = &overlay->layers[i]; int16_t err = layer->config->engine->stat(&layer->mount, path, &info); if (err == XFS_ERR_OK) + { + if (info.type == XFS_TYPE_DIR) + { + if (overlay_is_system_dir(overlay, path)) + return XFS_ERR_INVAL; + } return layer->config->engine->unlink(&layer->mount, path); + } if (err != XFS_ERR_NOENT && first_error == XFS_ERR_NOENT) first_error = err; } @@ -494,7 +581,7 @@ static int16_t overlay_mkdir(const struct xfs_engine_mount_t* mount, const char* xfs_overlay_mount_t* overlay = overlay_mount_data(mount); if (!overlay) return XFS_ERR_IO; - xfs_overlay_layer_t* layer = &overlay->layers[overlay->default_layer]; + xfs_overlay_layer_t* layer = overlay->default_layer; return layer->config->engine->mkdir(&layer->mount, path); } @@ -511,7 +598,14 @@ static int16_t overlay_rmdir(const struct xfs_engine_mount_t* mount, const char* xfs_overlay_layer_t* layer = &overlay->layers[i]; int16_t err = layer->config->engine->stat(&layer->mount, path, &info); if (err == XFS_ERR_OK) + { + if (info.type == XFS_TYPE_DIR) + { + if (overlay_is_system_dir(overlay, path)) + return XFS_ERR_INVAL; + } return layer->config->engine->rmdir(&layer->mount, path); + } if (err != XFS_ERR_NOENT && first_error == XFS_ERR_NOENT) first_error = err; } @@ -563,7 +657,7 @@ static int16_t overlay_chmod(const struct xfs_engine_mount_t* mount, const char* xfs_overlay_mount_t* overlay = overlay_mount_data(mount); if (!overlay) return XFS_ERR_IO; - xfs_overlay_layer_t* layer = &overlay->layers[overlay->default_layer]; + xfs_overlay_layer_t* layer = overlay->default_layer; return layer->config->engine->chmod(&layer->mount, path, mode); } @@ -573,13 +667,15 @@ static void overlay_free_handle(const struct xfs_engine_mount_t* mount, struct x return; if (handle->type == XFS_HANDLE_TYPE_FILE) { - overlay_close(mount, handle); - free(handle->data); + xfs_overlay_file_handle_t* overlay_handle = (xfs_overlay_file_handle_t*)handle->data; + (void)overlay_close(mount, handle); + free(overlay_handle); } else if (handle->type == XFS_HANDLE_TYPE_DIR) { - overlay_closedir(mount, handle); - free(handle->data); + xfs_overlay_dir_handle_t* dir_handle = (xfs_overlay_dir_handle_t*)handle->data; + (void)overlay_closedir(mount, handle); + free(dir_handle); } handle->data = NULL; } @@ -598,6 +694,8 @@ const struct xfs_engine_t xfs_overlay_engine = { .lseek = overlay_lseek, .opendir = overlay_opendir, .readdir = overlay_readdir, + .telldir = overlay_telldir, + .seekdir = overlay_seekdir, .closedir = overlay_closedir, .stat = overlay_stat, .unlink = overlay_unlink, diff --git a/peripherals/fs/xfs_romfs.c b/peripherals/fs/xfs_romfs.c index b69a53b3c..97cb097b1 100644 --- a/peripherals/fs/xfs_romfs.c +++ b/peripherals/fs/xfs_romfs.c @@ -1,6 +1,5 @@ #include "xfs.h" #include "ramfs.h" - #include #include #include @@ -220,7 +219,7 @@ static int16_t romfs_readdir(const struct xfs_engine_mount_t* mount, struct xfs_ memset(info, 0, sizeof(*info)); info->type = entry->type == RAMFS_TYPE_DIR ? XFS_TYPE_DIR : XFS_TYPE_REG; - info->storage = romfs->config ? romfs->config->storage : FS_STORAGE_FLASH; + info->storage = romfs->config ? romfs->config->storage : FS_STORAGE_SYSTEM; info->size = entry->size; info->mtime = entry->mtime; info->ctime = entry->mtime; @@ -229,6 +228,26 @@ static int16_t romfs_readdir(const struct xfs_engine_mount_t* mount, struct xfs_ return 1; } +static int16_t romfs_telldir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, uint32_t* position) +{ + (void)mount; + xfs_romfs_dir_handle_t* dir = (xfs_romfs_dir_handle_t*)handle->data; + if (!dir || !position) + return XFS_ERR_INVAL; + *position = dir->dir.index; + return XFS_ERR_OK; +} + +static int16_t romfs_seekdir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle, uint32_t position) +{ + (void)mount; + xfs_romfs_dir_handle_t* dir = (xfs_romfs_dir_handle_t*)handle->data; + if (!dir) + return XFS_ERR_BADF; + dir->dir.index = position; + return XFS_ERR_OK; +} + static int16_t romfs_closedir(const struct xfs_engine_mount_t* mount, struct xfs_handle_t* handle) { (void)mount; @@ -247,7 +266,7 @@ static int16_t romfs_stat(const struct xfs_engine_mount_t* mount, const char* pa { memset(stat_info, 0, sizeof(*stat_info)); stat_info->type = XFS_TYPE_DIR; - stat_info->storage = romfs->config ? romfs->config->storage : FS_STORAGE_FLASH; + stat_info->storage = romfs->config ? romfs->config->storage : FS_STORAGE_SYSTEM; strncpy(stat_info->name, "/", sizeof(stat_info->name) - 1); return XFS_ERR_OK; } @@ -258,7 +277,7 @@ static int16_t romfs_stat(const struct xfs_engine_mount_t* mount, const char* pa memset(stat_info, 0, sizeof(*stat_info)); stat_info->type = entry->type == RAMFS_TYPE_DIR ? XFS_TYPE_DIR : XFS_TYPE_REG; - stat_info->storage = romfs->config ? romfs->config->storage : FS_STORAGE_FLASH; + stat_info->storage = romfs->config ? romfs->config->storage : FS_STORAGE_SYSTEM; stat_info->size = entry->size; stat_info->mtime = entry->mtime; stat_info->ctime = entry->mtime; @@ -345,6 +364,8 @@ const struct xfs_engine_t xfs_romfs_engine = { .lseek = romfs_lseek, .opendir = romfs_opendir, .readdir = romfs_readdir, + .telldir = romfs_telldir, + .seekdir = romfs_seekdir, .closedir = romfs_closedir, .stat = romfs_stat, .unlink = romfs_unlink, diff --git a/peripherals/fs/xfs_worker.c b/peripherals/fs/xfs_worker.c index 899fc0470..5666ab730 100644 --- a/peripherals/fs/xfs_worker.c +++ b/peripherals/fs/xfs_worker.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #if defined(WIN32) || defined(_WIN32) #include diff --git a/peripherals/nic/spectranext.h b/peripherals/nic/spectranext.h index 5eef5105f..58b60b111 100644 --- a/peripherals/nic/spectranext.h +++ b/peripherals/nic/spectranext.h @@ -17,7 +17,8 @@ enum spectranext_cmd_t SPECTRANEXT_CMD_WIFI_DISCONNECT = 4, SPECTRANEXT_CMD_DNS_GETHOSTBYNAME = 5, SPECTRANEXT_CMD_ENGINECALL = 6, - SPECTRANEXT_CMD_GET_MESSAGE = 7 + SPECTRANEXT_CMD_GET_MESSAGE = 7, + SPECTRANEXT_CMD_LOAD_DOT = 8 }; #define WIFI_CONTROLLER_STATUS_OFFLINE (0u) @@ -46,6 +47,9 @@ enum spectranext_cmd_t #define SPECTRANEXT_MESSAGE_MAX 128 +/* Maximum DOT basename supplied by the Z80, including its NUL terminator. */ +#define SPECTRANEXT_LOAD_DOT_NAME_MAX 256 + #define SPECTRANEXT_CMD_REG_IDLE 0xFFu #pragma pack(push, 1) @@ -141,6 +145,15 @@ typedef union spectranext_workspace } out; } get_message; + /* LOAD_DOT input — controller resolves the basename as /bin/. */ + struct + { + struct + { + char name[SPECTRANEXT_LOAD_DOT_NAME_MAX]; + } in; + } load_dot; + char page[4096 - 2]; } spectranext_workspace_t; diff --git a/peripherals/nic/spectranext_controller.c b/peripherals/nic/spectranext_controller.c index e0b889ed5..3063c08d7 100644 --- a/peripherals/nic/spectranext_controller.c +++ b/peripherals/nic/spectranext_controller.c @@ -17,6 +17,12 @@ #include "libspectrum.h" #include "memory_pages.h" +#include "peripherals/fs/xfs.h" +#include "peripherals/fs/xfs_engines.h" +#include "peripherals/spectranet.h" + +#define SPECTRANEXT_DOT_PAGE_FIRST 0xD8u +#define SPECTRANEXT_DOT_PAGE_COUNT 2u spectranext_enginecall_args_t spectranext_enginecall_args; @@ -37,6 +43,79 @@ volatile struct spectranext_controller_t spectranext_controller = { .status = SPECTRANEXT_STATUS_SUCCESS, }; +/* + * DOT lookup is controller-owned, rather than tied to the Z80's selected + * mountpoint. Mount the default RAM-over-ROMFS overlay for this short-lived + * operation, then fill the two dedicated DOT RAM pages directly. + */ +static int16_t spectranext_load_dot(const char *name) +{ + char path[XFS_PATH_MAX]; + const size_t prefix_len = sizeof("/bin/") - 1u; + size_t name_len = 0; + + if (name == NULL || name[0] == '\0') + return XFS_ERR_INVAL; + + memcpy(path, "/bin/", prefix_len); + while (name[name_len] != '\0') + { + if (name_len >= sizeof(path) - prefix_len - 1u) + return XFS_ERR_NAMETOOLONG; + + unsigned char c = (unsigned char)name[name_len]; + if (c == '/' || c == '\\') + return XFS_ERR_INVAL; + if (c >= 'A' && c <= 'Z') + c = (unsigned char)(c + ('a' - 'A')); + path[prefix_len + name_len++] = (char)c; + } + path[prefix_len + name_len] = '\0'; + + struct xfs_engine_mount_t mount = { .engine = &xfs_overlay_engine }; + int16_t err = mount.engine->mount(mount.engine, "ram", "/", &mount); + if (err != XFS_ERR_OK) + return err; + + struct xfs_handle_t handle = { .type = XFS_HANDLE_TYPE_FILE }; + err = mount.engine->open(&mount, &handle, path, XFS_O_RDONLY); + if (err == XFS_ERR_OK) + { + uint8_t *destination[SPECTRANEXT_DOT_PAGE_COUNT]; + uint8_t page; + for (page = 0; page < SPECTRANEXT_DOT_PAGE_COUNT; ++page) + { + destination[page] = spectranet_ram_page(SPECTRANEXT_DOT_PAGE_FIRST + page); + if (destination[page] == NULL) + { + err = XFS_ERR_IO; + break; + } + memset(destination[page], 0, 0x1000u); + } + + for (page = 0; err == XFS_ERR_OK && page < SPECTRANEXT_DOT_PAGE_COUNT; ++page) + { + const int32_t bytes_read = mount.engine->read(&mount, &handle, destination[page], 0x1000u); + if (bytes_read < 0) + { + err = (int16_t)bytes_read; + break; + } + if ((uint32_t)bytes_read < 0x1000u) + break; + } + + const int16_t close_err = mount.engine->close(&mount, &handle); + if (err == XFS_ERR_OK && close_err != XFS_ERR_OK) + err = close_err; + mount.engine->free_handle(&mount, &handle); + } + + mount.engine->unmount(mount.engine, &mount); + return err; +} + int spectranext_enginecall_dispatch(const char *input_file, const char *output_file, const char *operation) { char opbuf[256]; @@ -241,6 +320,17 @@ static void spectranext_controller_process_command(void) spectranext_controller_get_message(); break; + case SPECTRANEXT_CMD_LOAD_DOT: + { + char name[SPECTRANEXT_LOAD_DOT_NAME_MAX]; + memcpy(name, (const void *)spectranext_controller.workspace.load_dot.in.name, + sizeof(name) - 1u); + name[sizeof(name) - 1u] = '\0'; + spectranext_set_status( + spectranext_load_dot(name) == XFS_ERR_OK ? SPECTRANEXT_STATUS_SUCCESS : SPECTRANEXT_STATUS_ERROR); + break; + } + default: spectranext_set_status(SPECTRANEXT_STATUS_ERROR); break; diff --git a/peripherals/spectranet.c b/peripherals/spectranet.c index 1e9f07845..271bfe8e3 100644 --- a/peripherals/spectranet.c +++ b/peripherals/spectranet.c @@ -82,10 +82,16 @@ static libspectrum_dword spectranet_source_rom_hash; int spectranet_available = 0; int spectranet_paged; int spectranet_paged_via_io; -int spectranet_w5100_paged_a = 0, spectranet_w5100_paged_b = 0; -int spectranet_xfs_paged_a = 0, spectranet_xfs_paged_b = 0; -int spectranet_spectranext_config_paged_a = 0, spectranet_spectranext_config_paged_b = 0; -int spectranet_flash_paged_a = 0, spectranet_flash_paged_b = 0; +int spectranet_w5100_paged_0 = 0, spectranet_w5100_paged_a = 0, + spectranet_w5100_paged_b = 0, spectranet_w5100_paged_3 = 0; +int spectranet_xfs_paged_0 = 0, spectranet_xfs_paged_a = 0, + spectranet_xfs_paged_b = 0, spectranet_xfs_paged_3 = 0; +int spectranet_spectranext_config_paged_0 = 0, + spectranet_spectranext_config_paged_a = 0, + spectranet_spectranext_config_paged_b = 0, + spectranet_spectranext_config_paged_3 = 0; +int spectranet_flash_paged_0 = 0, spectranet_flash_paged_a = 0, + spectranet_flash_paged_b = 0, spectranet_flash_paged_3 = 0; /* Whether the programmable trap is active */ int spectranet_programmable_trap_active; @@ -291,7 +297,7 @@ spectranet_nmi_flipflop( void ) return nmi_flipflop; } -static void +void spectranet_map_page( int dest, int source ) { int i; @@ -306,6 +312,12 @@ spectranet_map_page( int dest, int source ) switch( dest ) { + case 0: + spectranet_w5100_paged_0 = w5100_page; + spectranet_xfs_paged_0 = xfs_page; + spectranet_spectranext_config_paged_0 = spectranext_config_page; + spectranet_flash_paged_0 = flash_page; + break; case 1: spectranet_w5100_paged_a = w5100_page; spectranet_xfs_paged_a = xfs_page; @@ -318,14 +330,32 @@ spectranet_map_page( int dest, int source ) spectranet_spectranext_config_paged_b = spectranext_config_page; spectranet_flash_paged_b = flash_page; break; + case 3: + spectranet_w5100_paged_3 = w5100_page; + spectranet_xfs_paged_3 = xfs_page; + spectranet_spectranext_config_paged_3 = spectranext_config_page; + spectranet_flash_paged_3 = flash_page; + break; } } +uint8_t * +spectranet_ram_page( uint8_t page ) +{ + if( !spectranet_memory_allocated || page < SPECTRANET_RAM_BASE || + page >= SPECTRANET_RAM_BASE + SPECTRANET_RAM_LENGTH / SPECTRANET_PAGE_LENGTH ) + return NULL; + + return spectranet_full_map[ page * MEMORY_PAGES_IN_4K ].page; +} + static void spectranet_hard_reset( void ) { + spectranet_map_page( 0, 0x00 ); spectranet_map_page( 1, 0xff ); /* Map something into 0x1000 to 0x1fff */ spectranet_map_page( 2, 0xff ); /* And 0x2000 to 0x2fff */ + spectranet_map_page( 3, 0xc0 ); spectranet_programmable_trap = 0x0000; spectranet_programmable_trap_active = 0; @@ -338,6 +368,9 @@ spectranet_hard_reset( void ) static void spectranet_reset( int hard_reset ) { + spectranet_map_page( 0, 0x00 ); + spectranet_map_page( 3, 0xc0 ); + if( !periph_is_active( PERIPH_TYPE_SPECTRANET ) ) { spectranet_available = 0; spectranet_paged = 0; @@ -553,6 +586,13 @@ static module_info_t spectranet_module_info = { }; +static void +spectranet_page_0( libspectrum_word port, libspectrum_byte data ) +{ + spectranet_map_page( 0, data ); + memory_map_romcs_full( spectranet_current_map ); +} + static void spectranet_page_a( libspectrum_word port, libspectrum_byte data ) { @@ -567,6 +607,13 @@ spectranet_page_b( libspectrum_word port, libspectrum_byte data ) memory_map_romcs_full( spectranet_current_map ); } +static void +spectranet_page_3( libspectrum_word port, libspectrum_byte data ) +{ + spectranet_map_page( 3, data ); + memory_map_romcs_full( spectranet_current_map ); +} + static libspectrum_byte spectranet_cpld_version( libspectrum_word port, libspectrum_byte *attached ) { @@ -625,6 +672,8 @@ static const periph_port_t spectranet_ports[] = { { 0xffff, 0x023b, spectranet_cpld_version, spectranet_trap }, { 0xffff, 0x033b, spectranet_control_read, spectranet_control_write }, { 0xffff, 0x043b, NULL, spectranext_stdout_write }, + { 0xffff, 0x053b, NULL, spectranet_page_0 }, + { 0xffff, 0x063b, NULL, spectranet_page_3 }, { 0, 0, NULL, NULL } }; @@ -786,11 +835,15 @@ spectranet_get_paging_info( void ) info.paged = spectranet_paged; if( spectranet_memory_allocated ) { + info.page_0 = spectranet_current_map[0 * MEMORY_PAGES_IN_4K].page_num; info.page_a = spectranet_current_map[1 * MEMORY_PAGES_IN_4K].page_num; info.page_b = spectranet_current_map[2 * MEMORY_PAGES_IN_4K].page_num; + info.page_3 = spectranet_current_map[3 * MEMORY_PAGES_IN_4K].page_num; } else { + info.page_0 = 0xff; info.page_a = 0xff; info.page_b = 0xff; + info.page_3 = 0xff; } return info; @@ -1413,7 +1466,7 @@ spectranet_dump_ram( const char *filename GCC_UNUSED ) spectranet_paging_info_t spectranet_get_paging_info( void ) { - spectranet_paging_info_t info = { 0, 0, 0xff, 0xff }; + spectranet_paging_info_t info = { 0, 0, 0xff, 0xff, 0xff, 0xff }; return info; } diff --git a/peripherals/spectranet.h b/peripherals/spectranet.h index 79a89e8d9..35f8363ad 100644 --- a/peripherals/spectranet.h +++ b/peripherals/spectranet.h @@ -61,10 +61,12 @@ typedef struct { } spectranet_config_option_t; typedef struct { - int available; - int paged; - int page_a; - int page_b; + int available; + int paged; + int page_0; + int page_a; + int page_b; + int page_3; } spectranet_paging_info_t; // get currently loaded config @@ -87,6 +89,9 @@ uint16_t spectranet_config_get_total_size(void); bool spectranet_config_is_valid(void); void spectranet_register_startup( void ); +void spectranet_map_page( int dest, int source ); +/* Return the backing storage for a 4K Spectranet RAM page, or NULL. */ +uint8_t *spectranet_ram_page( uint8_t page ); void spectranet_page( int via_io ); void spectranet_nmi( void ); void spectranet_unpage( void ); @@ -105,10 +110,16 @@ void spectranet_flash_rom_write( libspectrum_word address, libspectrum_byte b ); extern int spectranet_available; extern int spectranet_paged; -extern int spectranet_w5100_paged_a, spectranet_w5100_paged_b; -extern int spectranet_xfs_paged_a, spectranet_xfs_paged_b; -extern int spectranet_spectranext_config_paged_a, spectranet_spectranext_config_paged_b; -extern int spectranet_flash_paged_a, spectranet_flash_paged_b; +extern int spectranet_w5100_paged_0, spectranet_w5100_paged_a, + spectranet_w5100_paged_b, spectranet_w5100_paged_3; +extern int spectranet_xfs_paged_0, spectranet_xfs_paged_a, + spectranet_xfs_paged_b, spectranet_xfs_paged_3; +extern int spectranet_spectranext_config_paged_0, + spectranet_spectranext_config_paged_a, + spectranet_spectranext_config_paged_b, + spectranet_spectranext_config_paged_3; +extern int spectranet_flash_paged_0, spectranet_flash_paged_a, + spectranet_flash_paged_b, spectranet_flash_paged_3; extern int spectranet_programmable_trap_active; extern libspectrum_word spectranet_programmable_trap; diff --git a/roms/spectranet.rom b/roms/spectranet.rom index 9e0e87cb7a4ad083dc86dcc4a573c9bebdf1dad8..b7d9db0c2b99413af0b1d97b945098061501a4e5 100644 GIT binary patch delta 8837 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 ZaTAL&>30S)37@_<#S5y}y>Xd#{$CyKg-rke delta 8606 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 diff --git a/roms/spxromfs.bin b/roms/spxromfs.bin index 49c1a144d22912a4041682c2f167b45f1a2a192a..91161157d2400eb7771c5ad872e3b554453860db 100644 GIT binary patch literal 77045 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 X;(-wljCf$g10x<7@xcEh548UuBZwzV delta 18698 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 Yt$nN;YsQH}>}t{IAp`g!DSXlY164VZrvLx| From 0ab8206b2b27cfc2be697a0604a9c08e01e28424 Mon Sep 17 00:00:00 2001 From: desertkun Date: Fri, 28 Aug 2026 17:17:17 +0200 Subject: [PATCH 3/5] spectranet: patch browser/esxdos layer --- roms/spectranet.rom | Bin 131072 -> 131072 bytes roms/spxromfs.bin | Bin 77045 -> 76995 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/roms/spectranet.rom b/roms/spectranet.rom index b7d9db0c2b99413af0b1d97b945098061501a4e5..485976d9deefc1bc32099307c3586c36a6a63898 100644 GIT binary patch delta 321 zcmV-H0lxl#fCzwq2(U*x2rxA?Fk>_}II~YXzZ3yrlMhfBUbrOwo63bH{+-I6CH|hu zyCwdg%E%@Dp~?v+{-er*CjO+#&L;k)%B&~;rpnVN{;10SC;q9*BPjl=%0VdptIA&} z{;bM8&!iK-R05E$v!v;#oguM(HXbN{vpEQAprmY zx5>?fA>HNSle1MS0r!*MRU-r4<>8Y7R+s^}lbTjQ0bjG*Ruusl{{PB~BF(5F&6XiJ z58dU_&EY=v&9NczlMPrIvj|wu2ZCU>U;%N00ce+U;sHz(XdgZcGHf5oDr6rbY9ApW TJR)e9(c%Ga0cf{C;{m`NR=1cB delta 288 zcmV+*0pI?BfCzwq2(U*x2r@V}GGR7kH?vPWzZ3yBlMhfBUbQ6to63SE{+-I3CH|hu zuqFPV%DN@~q00Lu{-erqCjO+#y(a#p%9|(trpm%6{;10BC;q9*`6vFW$`>g9tI9Pf z{;bMVDE_U=xG4Uw%GN0Uu*wA~{;|pN&EY=U;UUShBUs%BlfWM;f?&2_0dax>WS4T{ m0ZbEQA3h5*Y#+%gWFI1GA0Z$-B4n4*;sI^}WVb-$0l*wxq=MK0 diff --git a/roms/spxromfs.bin b/roms/spxromfs.bin index 91161157d2400eb7771c5ad872e3b554453860db..74a1033a45dc0698217e8dbca30541f8867b88b2 100644 GIT binary patch delta 6708 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 Hg>CzPj62`j From 0f2439214fdd742271ae8b4a25363b9a5e8592a7 Mon Sep 17 00:00:00 2001 From: desertkun Date: Fri, 28 Aug 2026 20:43:17 +0200 Subject: [PATCH 4/5] spectranext: update controller --- peripherals/nic/spectranext.h | 27 ++++-- peripherals/nic/spectranext_controller.c | 106 +++++++++++++---------- roms/spectranet.rom | Bin 131072 -> 131072 bytes roms/spxromfs.bin | Bin 76995 -> 76995 bytes 4 files changed, 83 insertions(+), 50 deletions(-) diff --git a/peripherals/nic/spectranext.h b/peripherals/nic/spectranext.h index 58b60b111..02e522bc5 100644 --- a/peripherals/nic/spectranext.h +++ b/peripherals/nic/spectranext.h @@ -18,7 +18,7 @@ enum spectranext_cmd_t SPECTRANEXT_CMD_DNS_GETHOSTBYNAME = 5, SPECTRANEXT_CMD_ENGINECALL = 6, SPECTRANEXT_CMD_GET_MESSAGE = 7, - SPECTRANEXT_CMD_LOAD_DOT = 8 + SPECTRANEXT_CMD_XFS_READ = 8 }; #define WIFI_CONTROLLER_STATUS_OFFLINE (0u) @@ -47,8 +47,8 @@ enum spectranext_cmd_t #define SPECTRANEXT_MESSAGE_MAX 128 -/* Maximum DOT basename supplied by the Z80, including its NUL terminator. */ -#define SPECTRANEXT_LOAD_DOT_NAME_MAX 256 +/* Maximum XFS path supplied by the Z80, including its NUL terminator. */ +#define SPECTRANEXT_XFS_READ_PATH_MAX 128 #define SPECTRANEXT_CMD_REG_IDLE 0xFFu @@ -145,18 +145,33 @@ typedef union spectranext_workspace } out; } get_message; - /* LOAD_DOT input — controller resolves the basename as /bin/. */ + /* XFS_READ input and output. */ struct { struct { - char name[SPECTRANEXT_LOAD_DOT_NAME_MAX]; + char source_filename[SPECTRANEXT_XFS_READ_PATH_MAX]; + uint32_t source_offset; + uint8_t target_first_page; + uint16_t target_first_page_offset; + uint32_t maximum_data; } in; - } load_dot; + struct + { + uint32_t bytes_read; + } out; + } xfs_read; char page[4096 - 2]; } spectranext_workspace_t; +_Static_assert(offsetof(spectranext_workspace_t, xfs_read.in.source_filename) == 0u, ""); +_Static_assert(offsetof(spectranext_workspace_t, xfs_read.in.source_offset) == 128u, ""); +_Static_assert(offsetof(spectranext_workspace_t, xfs_read.in.target_first_page) == 132u, ""); +_Static_assert(offsetof(spectranext_workspace_t, xfs_read.in.target_first_page_offset) == 133u, ""); +_Static_assert(offsetof(spectranext_workspace_t, xfs_read.in.maximum_data) == 135u, ""); +_Static_assert(offsetof(spectranext_workspace_t, xfs_read.out.bytes_read) == 139u, ""); + struct spectranext_controller_t { uint8_t command; diff --git a/peripherals/nic/spectranext_controller.c b/peripherals/nic/spectranext_controller.c index 3063c08d7..486abfc35 100644 --- a/peripherals/nic/spectranext_controller.c +++ b/peripherals/nic/spectranext_controller.c @@ -11,6 +11,7 @@ #include #include #endif +#include #include #include "engines/engine.h" @@ -21,8 +22,9 @@ #include "peripherals/fs/xfs_engines.h" #include "peripherals/spectranet.h" -#define SPECTRANEXT_DOT_PAGE_FIRST 0xD8u -#define SPECTRANEXT_DOT_PAGE_COUNT 2u +#define SPECTRANEXT_RAM_PAGE_FIRST 0xC0u +#define SPECTRANEXT_RAM_PAGE_LAST 0xDFu +#define SPECTRANEXT_RAM_PAGE_COUNT (SPECTRANEXT_RAM_PAGE_LAST - SPECTRANEXT_RAM_PAGE_FIRST + 1u) spectranext_enginecall_args_t spectranext_enginecall_args; @@ -44,33 +46,30 @@ volatile struct spectranext_controller_t spectranext_controller = { }; /* - * DOT lookup is controller-owned, rather than tied to the Z80's selected - * mountpoint. Mount the default RAM-over-ROMFS overlay for this short-lived - * operation, then fill the two dedicated DOT RAM pages directly. + * XFS_READ is controller-owned: mount the default RAM-over-ROMFS overlay for + * this short-lived operation, resolving the caller's absolute path unchanged. */ -static int16_t spectranext_load_dot(const char *name) +static int16_t spectranext_xfs_read(const char *path, + const uint32_t source_offset, + const uint8_t target_first_page, + const uint16_t target_first_page_offset, + const uint32_t maximum_data, + uint32_t *const bytes_read_out) { - char path[XFS_PATH_MAX]; - const size_t prefix_len = sizeof("/bin/") - 1u; - size_t name_len = 0; + if (path == NULL || path[0] == '\0' || path[0] != '/' || + source_offset > INT32_MAX || + target_first_page < SPECTRANEXT_RAM_PAGE_FIRST || + target_first_page > SPECTRANEXT_RAM_PAGE_LAST || + target_first_page_offset >= 0x1000u) + return XFS_ERR_INVAL; - if (name == NULL || name[0] == '\0') + const uint32_t destination_offset = + (uint32_t)(target_first_page - SPECTRANEXT_RAM_PAGE_FIRST) * 0x1000u + target_first_page_offset; + const uint32_t destination_capacity = SPECTRANEXT_RAM_PAGE_COUNT * 0x1000u - destination_offset; + if (maximum_data > destination_capacity) return XFS_ERR_INVAL; - memcpy(path, "/bin/", prefix_len); - while (name[name_len] != '\0') - { - if (name_len >= sizeof(path) - prefix_len - 1u) - return XFS_ERR_NAMETOOLONG; - - unsigned char c = (unsigned char)name[name_len]; - if (c == '/' || c == '\\') - return XFS_ERR_INVAL; - if (c >= 'A' && c <= 'Z') - c = (unsigned char)(c + ('a' - 'A')); - path[prefix_len + name_len++] = (char)c; - } - path[prefix_len + name_len] = '\0'; + *bytes_read_out = 0; struct xfs_engine_mount_t mount = { .engine = &xfs_overlay_engine }; int16_t err = mount.engine->mount(mount.engine, "ram", "/", &mount); @@ -81,29 +80,34 @@ static int16_t spectranext_load_dot(const char *name) err = mount.engine->open(&mount, &handle, path, XFS_O_RDONLY); if (err == XFS_ERR_OK) { - uint8_t *destination[SPECTRANEXT_DOT_PAGE_COUNT]; - uint8_t page; - for (page = 0; page < SPECTRANEXT_DOT_PAGE_COUNT; ++page) + if (mount.engine->lseek(&mount, &handle, (int32_t)source_offset, XFS_SEEK_SET) < 0) + err = XFS_ERR_IO; + + uint8_t page = target_first_page; + uint16_t page_offset = target_first_page_offset; + uint32_t remaining = maximum_data; + while (err == XFS_ERR_OK && remaining != 0) { - destination[page] = spectranet_ram_page(SPECTRANEXT_DOT_PAGE_FIRST + page); - if (destination[page] == NULL) + uint8_t *const destination = spectranet_ram_page(page); + if (destination == NULL) { err = XFS_ERR_IO; break; } - memset(destination[page], 0, 0x1000u); - } - - for (page = 0; err == XFS_ERR_OK && page < SPECTRANEXT_DOT_PAGE_COUNT; ++page) - { - const int32_t bytes_read = mount.engine->read(&mount, &handle, destination[page], 0x1000u); - if (bytes_read < 0) + const uint32_t chunk_size = remaining < 0x1000u - page_offset + ? remaining : 0x1000u - page_offset; + const int32_t read_result = mount.engine->read(&mount, &handle, destination + page_offset, chunk_size); + if (read_result < 0) { - err = (int16_t)bytes_read; + err = (int16_t)read_result; break; } - if ((uint32_t)bytes_read < 0x1000u) + *bytes_read_out += (uint32_t)read_result; + if ((uint32_t)read_result < chunk_size) break; + remaining -= (uint32_t)read_result; + ++page; + page_offset = 0; } const int16_t close_err = mount.engine->close(&mount, &handle); @@ -320,14 +324,28 @@ static void spectranext_controller_process_command(void) spectranext_controller_get_message(); break; - case SPECTRANEXT_CMD_LOAD_DOT: + case SPECTRANEXT_CMD_XFS_READ: { - char name[SPECTRANEXT_LOAD_DOT_NAME_MAX]; - memcpy(name, (const void *)spectranext_controller.workspace.load_dot.in.name, - sizeof(name) - 1u); - name[sizeof(name) - 1u] = '\0'; + char path[SPECTRANEXT_XFS_READ_PATH_MAX]; + memcpy(path, (const void *)spectranext_controller.workspace.xfs_read.in.source_filename, + sizeof(path)); + if (memchr(path, '\0', sizeof(path)) == NULL) + { + spectranext_set_status(SPECTRANEXT_STATUS_ERROR); + break; + } + + uint32_t bytes_read = 0; + const int16_t result = spectranext_xfs_read( + path, + spectranext_controller.workspace.xfs_read.in.source_offset, + spectranext_controller.workspace.xfs_read.in.target_first_page, + spectranext_controller.workspace.xfs_read.in.target_first_page_offset, + spectranext_controller.workspace.xfs_read.in.maximum_data, + &bytes_read); + spectranext_controller.workspace.xfs_read.out.bytes_read = bytes_read; spectranext_set_status( - spectranext_load_dot(name) == XFS_ERR_OK ? SPECTRANEXT_STATUS_SUCCESS : SPECTRANEXT_STATUS_ERROR); + result == XFS_ERR_OK ? SPECTRANEXT_STATUS_SUCCESS : SPECTRANEXT_STATUS_ERROR); break; } diff --git a/roms/spectranet.rom b/roms/spectranet.rom index 485976d9deefc1bc32099307c3586c36a6a63898..434c95315b03110a89ed6c6b242a28418df9ba78 100644 GIT binary patch delta 3232 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 X2Sho`LDL@hq&A;P4xCBSB}@JXvj{Pf delta 3166 zcmaJ@dvFuS8NZWcTQ;&zHeee};MS6DJ#5Yu2xJl8iKhwS{S>gC)ovr@^T^9P~&CqiM{H8)%ZF-=1vZWHQws zyWf8A@ArMXr)bn1jhg@P*z8rzqhIVir_gNiL=QYVvd1l z88+D>n#oMAV--Voh|O^`tmet_cV1jLYzODglI{flBa!es7nieN;e2*38^SNJu!Io@qBL19!q!N zxOB&FbEcEsT%Qux*Rq0ZX0jW%SUSP`%h^xBdNJEkALe5JFlda^sj<%an!y>?jPf?C zW|EIvwKVyHRZEwXRxLy3In6B3U?#`)CW{O-m(N#`iDykrvL#^T7X%D^wW4>s8rIE& znrvzeK-yai{NBjvl#6b4i`T%{1AO3#V}lGb@W~b>p?gpgu~m#7sk>9{rXv-EC`!(> z6d@X^ky&XU&~AUEE}Bx|z)LEO+WE*_Oruu0iEfCbXPszQY%9QB;DCe8v@>v{ie|6~2iT;fa&{Z40KTMpKB3g|T0nleK}1MYz}wF18#0 zPO3E>;$p3B4<*i4zuFZ!EVuGnj=ajDy(O=6Xup-;a%g{+&p5O_@@vJ~UU^@!wog7= ztnHUC6>IOynI+m^*N&?F;#HmzZQE65m}3` zEfk%NF1V)#6m@;?eoBgcAd&`AKLY7~_8Ggq=ou-8sY-u{=Pa6t4=i%qK0=>89w)GR zYo*gb;GRWa)GJ8Lizz6%WVSCS=+oQg4*Kd&xu^L)JSDHOqmvm$GkoN_T_w2=#cv@F zhkJ(44!nY|fXF$QaXPuU=ht>hKW+xPtKNpn}&gTT%~R5Bg2o zaeoHs5_M0Xr?v*vt0qWX^qV_-RV6X%bX-Fn3St=snm~mLxiYBP-y7-dRuYh(1>Oq_ zycd?f*lR^rrXbVG7Nn7HimhxP`9xQb2(@*>+O0y(Z-f>0y7W^QhtuR|EZ^k+A!+0< z?hn*T-j!0{=G#F&4}$foD@o%Dtza;5|-h(D^MZ+Sl3fHPMVvNgDPg@fIR=d7qU zK!JEgWnm)fFkyT za-WWjj@lrw$e&Fy_~#(1DNKJNJ^g>B9}Sg`87#k_>_Yy9-QYZxtv^6o@wLzxC@UFy zY;r3~^lgUjRnxR6@sp4r4t4s26i;0_N@_*$%8sCxKV$f>pEpE)gP4~pu5I_qwdwfc zxXP2Ow+G=%*l-}tG`w1XcW{CjC(C%0Rg?o?xazj|4xTesQO5SDiW;ISX)BE!?r3nr z4O3&AoQhpl)SNGkhv^k`w#S}!4pr3Hj(bkr*f_1^UdrIsj|^^r!6hekzV~6}gS%)r zwjCK!TIm88#>`UF#L`5xO?oz!CutSMmK{sWo$Ou3vrIGxu5qRv;3H7&J6DZ$qchR31 zYFMkPV^^p18|}956g_aq)9xuWITcP3a!yD@a_KQu<_m7Jb^PE_8z!G}YcJ6yOa9cY zJx7;~@;7cRTmFvnVBuwpCpOZ9j8OLBj;r-;Mj@D3!SSJ1>0jN%Oqu@$)Y%o2Vs%#lA&H#|{f@AJ_ z3U9}Y9$ELb~j&09^k)KbfD4xVwHFVXtp?$_Jy^;Ukdl@|fhI6zqHX^)LA!_Vc1eWbO#XY2TYOQ_;Y18$+} zzqnl9R~~Q*UY8ILlnOO@Y;p-Doj@9N((A$(j=yQyTAsO0ORKoPy#~FG7oVsymw*NX z8u;B4P3yfv_gxYc?xxT$j5jZ+PPTgDVl;W+jVpVFiu>Ix%PbtB(+^_n1WH`axoqpX zB8=qk8CTga+s9Ol*15SqT_ry|;&S0FHMuwe|Bkwz#Ldl;VGG(1WrLx3Ufa5guf(5Pbju delta 32 ocmX?nljZPDmJJR(i~^G%@-}Zi!t;iaNnmO7Ccf>P_!tG{0OQvTV*mgE From abcdfde1850c0015dbb20222a51701bfd13223d3 Mon Sep 17 00:00:00 2001 From: desertkun Date: Fri, 28 Aug 2026 20:43:33 +0200 Subject: [PATCH 5/5] spectranext: proper support for BUILD_SPECTRANET --- Makefile | 5465 ++++++++++++++++++++++++-- debugger/Makefile.am | 8 +- debugger/gdbserver.c | 7 +- debugger/gdbserver_remote_commands.c | 11 +- peripherals/Makefile.am | 13 +- peripherals/fs/xfs.c | 4 - 6 files changed, 5195 insertions(+), 313 deletions(-) diff --git a/Makefile b/Makefile index f14fee4bd..15ea09afd 100644 --- a/Makefile +++ b/Makefile @@ -1,304 +1,5179 @@ -.PHONY: 3rdparty audiofile libgcrypt FuseGenerator FuseImporter mbedtls libssh2 clean-3rdparty list-teams fusex archive dist dmg appcast appcast-push release release-clean release-notarize release-export clean - -# Signing parameters (can be overridden from command line) -# By default, use the signing settings already stored in the Xcode projects. -# Example override: make 3rdparty DEVELOPMENT_TEAM="ABC123DEFG" CODE_SIGN_IDENTITY="Apple Development" -DEVELOPMENT_TEAM ?= -CODE_SIGN_IDENTITY ?= -CODE_SIGN_STYLE ?= -PROVISIONING_PROFILE_SPECIFIER ?= - -# Archive path (can be overridden from command line) -# Example: make archive ARCHIVE_PATH=./build/FuseX.xcarchive -ARCHIVE_PATH ?= ./build/FuseX.xcarchive - -# Release paths and notarization profile -DIST_APP_PATH ?= dist/FuseX.app -ARCHIVE_APP_PATH = $(ARCHIVE_PATH)/Products/Applications/FuseX.app -RELEASE_ZIP_PATH ?= ./build/FuseX-notarize.zip -NOTARYTOOL_PROFILE ?= -FUSEX_VERSION ?= $(shell awk -F'= ' '/MARKETING_VERSION = / { gsub(/[";]/, "", $$2); print $$2; exit }' fusepb/FuseX.xcodeproj/project.pbxproj) -DMG_NAME ?= FuseX-$(FUSEX_VERSION).dmg -APPCAST_DIR ?= ./build/appcast -APPCAST_ARCHIVE ?= ./$(DMG_NAME) -APPCAST_OUTPUT ?= appcast.xml -APPCAST_URL_PREFIX ?= https://github.com/speccytools/fusex/releases/download/$(FUSEX_VERSION)/ -APPCAST_PUSH_DIR ?= ../speccytools.github.io -SPARKLE_GENERATE_APPCAST ?= $(shell find "$(HOME)/Library/Developer/Xcode/DerivedData" -path "*/SourcePackages/artifacts/sparkle/Sparkle/bin/generate_appcast" -type f 2>/dev/null | head -1) -FUSEGENERATOR_DEVELOPMENT_TEAM ?= $(if $(DEVELOPMENT_TEAM),$(DEVELOPMENT_TEAM),48UV5KV3FB) -FUSEGENERATOR_CODE_SIGN_IDENTITY ?= $(if $(CODE_SIGN_IDENTITY),$(CODE_SIGN_IDENTITY),Developer ID Application) -FUSEGENERATOR_CODE_SIGN_STYLE ?= $(if $(CODE_SIGN_STYLE),$(CODE_SIGN_STYLE),Manual) - -# Automatically set CODE_SIGN_STYLE=Manual if a code signing identity is specified -ifneq ($(CODE_SIGN_IDENTITY),) - CODE_SIGN_STYLE := Manual -endif - -# Build common xcodebuild arguments for signing -XCODEBUILD_SIGN_ARGS := -ifneq ($(DEVELOPMENT_TEAM),) - XCODEBUILD_SIGN_ARGS += DEVELOPMENT_TEAM="$(DEVELOPMENT_TEAM)" -endif -ifneq ($(CODE_SIGN_IDENTITY),) - XCODEBUILD_SIGN_ARGS += CODE_SIGN_IDENTITY="$(CODE_SIGN_IDENTITY)" - XCODEBUILD_SIGN_ARGS += CODE_SIGN_IDENTITY_ALL="$(CODE_SIGN_IDENTITY)" -endif -ifneq ($(CODE_SIGN_STYLE),) - XCODEBUILD_SIGN_ARGS += CODE_SIGN_STYLE="$(CODE_SIGN_STYLE)" -endif -ifneq ($(PROVISIONING_PROFILE_SPECIFIER),) - XCODEBUILD_SIGN_ARGS += PROVISIONING_PROFILE_SPECIFIER="$(PROVISIONING_PROFILE_SPECIFIER)" -endif - -all: 3rdparty - -fusepb: - cd fusepb && make clean && make - -3rdparty: audiofile libgcrypt FuseGenerator FuseImporter mbedtls libssh2 - -audiofile: - @echo "Building audiofile Framework..." - cd 3rdparty/audiofile && \ - xcodebuild -project audiofile.xcodeproj \ - -target "audiofile Framework" \ - -configuration Deployment \ - SYMROOT=build \ - BUILD_DIR=build \ - CONFIGURATION_BUILD_DIR=build/Deployment \ - $(XCODEBUILD_SIGN_ARGS) - -libgcrypt: - @echo "Building gcrypt Framework..." - cd 3rdparty/libgcrypt && \ - xcodebuild -project libgcrypt.xcodeproj \ - -target "gcrypt Framework" \ - -configuration Deployment \ - SYMROOT=build \ - BUILD_DIR=build \ - CONFIGURATION_BUILD_DIR=build/Deployment \ - $(XCODEBUILD_SIGN_ARGS) - -FuseGenerator: - @echo "Building Quick Look extensions..." - cd 3rdparty/FuseGenerator && \ - xcodebuild -project FuseGenerator.xcodeproj \ - -target "FuseQLThumbnail" \ - -target "FuseQLPreview" \ - -parallelizeTargets \ - -configuration Deployment \ - SYMROOT=build \ - BUILD_DIR=build \ - CONFIGURATION_BUILD_DIR=build/Deployment \ - DEVELOPMENT_TEAM="$(FUSEGENERATOR_DEVELOPMENT_TEAM)" \ - CODE_SIGN_IDENTITY="$(FUSEGENERATOR_CODE_SIGN_IDENTITY)" \ - CODE_SIGN_STYLE="$(FUSEGENERATOR_CODE_SIGN_STYLE)" \ - $(XCODEBUILD_SIGN_ARGS) - -FuseImporter: - @echo "Building FuseImporter Framework..." - cd 3rdparty/FuseImporter && \ - xcodebuild -project FuseImporter.xcodeproj \ - -target "FuseImporter" \ - -configuration Deployment \ - SYMROOT=build \ - BUILD_DIR=build \ - CONFIGURATION_BUILD_DIR=build/Deployment \ - $(XCODEBUILD_SIGN_ARGS) - -mbedtls: - @echo "Building mbedtls Framework..." - cd 3rdparty/mbedtls && \ - xcodebuild -project mbedtls.xcodeproj \ - -target "mbedtls" \ - -configuration Deployment \ - SYMROOT=build \ - BUILD_DIR=build \ - CONFIGURATION_BUILD_DIR=build/Deployment \ - $(XCODEBUILD_SIGN_ARGS) - -libssh2: mbedtls - @echo "Building libssh2 Framework..." - cd 3rdparty/libssh2 && \ - xcodebuild -project libssh2.xcodeproj \ - -target "libssh2" \ - -configuration Deployment \ - SYMROOT=build \ - BUILD_DIR=build \ - CONFIGURATION_BUILD_DIR=build/Deployment \ - $(XCODEBUILD_SIGN_ARGS) - -list-teams: - @echo "Available code signing identities and development teams:" - @echo "" - @if security find-identity -v -p codesigning 2>/dev/null | grep -q "valid identities found"; then \ - echo "Unique Development Team IDs:"; \ - security find-identity -v -p codesigning 2>/dev/null | \ - grep -oE '\([A-Z0-9]{10}\)' | \ - sed 's/[()]//g' | \ - sort -u | \ - while read team; do \ - echo " $$team"; \ - done; \ - echo ""; \ - echo "Full identity list:"; \ - security find-identity -v -p codesigning 2>/dev/null; \ - else \ - echo "No code signing identities found. Make sure you have certificates installed in your keychain."; \ - fi +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# Makefile. Generated from Makefile.in by configure. -fusex: 3rdparty fusepb - @echo "Building FuseX app..." - cd fusepb && \ - xcodebuild -project FuseX.xcodeproj \ - -target FuseX \ - -configuration Deployment \ - SYMROOT=build \ - BUILD_DIR=build \ - CONFIGURATION_BUILD_DIR=build/Deployment \ - $(XCODEBUILD_SIGN_ARGS) - -release-clean: - @echo "Cleaning FuseX build folder..." - @rm -rf fusepb/build - @rm -rf build - @echo "Removing existing app bundle from dist/..." - @rm -rf "$(DIST_APP_PATH)" - -archive: 3rdparty fusepb - @echo "Archiving FuseX app..." - @mkdir -p build - cd fusepb && \ - xcodebuild archive \ - -project FuseX.xcodeproj \ - -scheme FuseX \ - -configuration Deployment \ - -archivePath "$(CURDIR)/$(ARCHIVE_PATH)" \ - SYMROOT=build \ - BUILD_DIR=build \ - CONFIGURATION_BUILD_DIR=build/Deployment \ - $(XCODEBUILD_SIGN_ARGS) - @echo "Archive created at: $(ARCHIVE_PATH)" - -release-notarize: archive - @echo "Submitting archived app for notarization..." - @if [ -z "$(NOTARYTOOL_PROFILE)" ]; then \ - echo "Error: NOTARYTOOL_PROFILE is required for make release"; \ - echo "Create one with: xcrun notarytool store-credentials --apple-id ... --team-id ... --password ..."; \ - exit 1; \ - fi - @if [ ! -d "$(ARCHIVE_APP_PATH)" ]; then \ - echo "Error: archived app not found at $(ARCHIVE_APP_PATH)"; \ - exit 1; \ - fi - @mkdir -p build - @rm -f "$(RELEASE_ZIP_PATH)" - @ditto -c -k --keepParent "$(ARCHIVE_APP_PATH)" "$(RELEASE_ZIP_PATH)" - @xcrun notarytool submit "$(RELEASE_ZIP_PATH)" --keychain-profile "$(NOTARYTOOL_PROFILE)" --wait - @xcrun stapler staple "$(ARCHIVE_APP_PATH)" - -release-export: release-notarize - @echo "Exporting notarized app to dist/..." - @mkdir -p dist - @rm -rf "$(DIST_APP_PATH)" - @ditto "$(ARCHIVE_APP_PATH)" "$(DIST_APP_PATH)" - -release: release-clean release-export - @$(MAKE) dmg - -dist: - @echo "Checking for dist/FuseX.app..." - @if [ ! -d "dist/FuseX.app" ]; then \ - echo "Error: dist/FuseX.app not found. Please copy FuseX.app to dist/ first."; \ - exit 1; \ - fi - @echo "dist/FuseX.app found." +# Copyright (C) 1994-2021 Free Software Foundation, Inc. -dmg: dist - @echo "Creating $(DMG_NAME)..." - @if ! command -v create-dmg >/dev/null 2>&1; then \ - echo "Error: create-dmg is not installed. Install it with: brew install create-dmg"; \ - exit 1; \ - fi - @rm -f "$(DMG_NAME)" - @if create-dmg \ - --volname "FuseX" \ - --window-pos 200 120 \ - --window-size 600 300 \ - --icon-size 100 \ - --icon "FuseX.app" 175 120 \ - --hide-extension "FuseX.app" \ - --app-drop-link 425 120 \ - "$(DMG_NAME)" \ - dist/; then \ - if [ -f "$(DMG_NAME)" ]; then \ - echo "DMG created successfully: $(DMG_NAME)"; \ - else \ - echo "Error: DMG file was not created"; \ - exit 1; \ - fi \ - else \ - echo "Error: create-dmg failed"; \ - exit 1; \ - fi +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. -appcast: - @echo "Generating Sparkle appcast..." - @if [ -z "$(SPARKLE_GENERATE_APPCAST)" ] || [ ! -x "$(SPARKLE_GENERATE_APPCAST)" ]; then \ - echo "Error: Sparkle generate_appcast tool not found."; \ - echo "Build/resolve Sparkle first, or pass SPARKLE_GENERATE_APPCAST=/path/to/generate_appcast"; \ - exit 1; \ - fi - @if [ ! -f "$(APPCAST_ARCHIVE)" ]; then \ - echo "Error: update archive not found: $(APPCAST_ARCHIVE)"; \ - echo "Create it first with: make dmg"; \ - exit 1; \ - fi - @url_prefix="$(APPCAST_URL_PREFIX)"; \ - if [ -z "$$url_prefix" ]; then \ - echo "Error: APPCAST_URL_PREFIX is required"; \ - exit 1; \ +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + + + + +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/fusex +pkgincludedir = $(includedir)/fusex +pkglibdir = $(libdir)/fusex +pkglibexecdir = $(libexecdir)/fusex +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = aarch64-apple-darwin25.5.0 +host_triplet = aarch64-apple-darwin25.5.0 +bin_PROGRAMS = fuse$(EXEEXT) +noinst_PROGRAMS = unittests/displaytest$(EXEEXT) \ + unittests/sdl2displaytest$(EXEEXT) \ + unittests/sdl2scalerstatetest$(EXEEXT) \ + unittests/sdl2joysticktest$(EXEEXT) \ + unittests/sdl2mousetest$(EXEEXT) \ + unittests/palcompositetest$(EXEEXT) \ + unittests/scalerexpandtest$(EXEEXT) z80/coretest$(EXEEXT) +#am__append_1 = $(LIBSSH2_LIBS) $(MBEDTLS_LIBS) +#am__append_2 = $(SDL1_LIBS) +am__append_3 = $(SDL2_LIBS) +#am__append_4 = $(SDL1_CFLAGS) +am__append_5 = $(SDL2_CFLAGS) +#am__append_6 = $(MBEDTLS_CFLAGS) $(LIBSSH2_CFLAGS) +#am__append_7 = windres.rc +#am__append_8 = -lcomctl32 -lwinmm -lshell32 $(WINSPARKLE_LIBS) windres.o +#am__append_9 = windres.o +#am__append_10 = $(WINSPARKLE_CFLAGS) +#am__append_11 = compat/dirname.c +#am__append_12 = compat/getopt.c compat/getopt1.c +#am__append_13 = \ +# compat/unix/dir.c \ +# compat/unix/file.c \ +# compat/amiga/osname.c \ +# compat/amiga/paths.c \ +# compat/unix/timer.c + +#am__append_14 = \ +# compat/unix/dir.c \ +# compat/unix/file.c \ +# compat/unix/osname.c \ +# compat/linux/relative_paths.c \ +# compat/unix/paths.c \ +# compat/unix/timer.c + +#am__append_15 = compat/unix/socket.c +#am__append_16 = \ +# compat/unix/dir.c \ +# compat/unix/file.c \ +# compat/morphos/osname.c \ +# compat/amiga/paths.c \ +# compat/unix/timer.c + +am__append_17 = \ + compat/unix/dir.c \ + compat/unix/file.c \ + compat/unix/osname.c \ + compat/unix/relative_paths.c \ + compat/unix/paths.c \ + compat/unix/timer.c + +am__append_18 = compat/unix/socket.c +#am__append_19 = \ +# compat/unix/dir.c \ +# compat/unix/file.c \ +# compat/wii/osname.c \ +# compat/wii/paths.c \ +# compat/wii/timer.c + +#am__append_20 = \ +# compat/unix/dir.c \ +# compat/unix/file.c \ +# compat/win32/osname.c \ +# compat/win32/paths.c \ +# compat/win32/timer.c + +#am__append_21 = compat/win32/socket.c +#am__append_22 = compat/unix/tuntap.c +#am__append_23 = \ +# debugger/vfile.c \ +# debugger/vfile_ext.c + +#am__append_24 = peripherals/nic/enc28j60.c +#am__append_25 = \ +# peripherals/flash/am29f010.c \ +# peripherals/nic/w5100.c \ +# peripherals/nic/w5100_socket.c \ +# peripherals/nic/dns_resolver.c \ +# peripherals/nic/dns_processor.c \ +# peripherals/nic/engines/engine_argv.c \ +# peripherals/nic/engines/engine_fs.c \ +# peripherals/nic/engines/engine_utf8.c \ +# peripherals/nic/engines/json.c \ +# peripherals/nic/engines/xpath.c \ +# peripherals/nic/engines/jsonpath/ast.c \ +# peripherals/nic/engines/jsonpath/lexer.c \ +# peripherals/nic/engines/jsonpath/matcher.c \ +# peripherals/nic/engines/jsonpath/parser.c \ +# peripherals/nic/engines/parson.c \ +# peripherals/nic/spectranext_controller.c \ +# peripherals/nic/spectranext_stdout.c \ +# peripherals/fs/xfs.c \ +# peripherals/fs/xfs_compat.c \ +# peripherals/fs/xfs_worker.c \ +# peripherals/fs/xfs_fs.c \ +# peripherals/fs/xfs_overlay.c \ +# peripherals/fs/xfs_romfs.c \ +# peripherals/fs/ramfs.c \ +# peripherals/fs/xfs_https.c \ +# peripherals/fs/xfs_https_compat.c \ +# peripherals/http/httpc.c \ +# peripherals/http/http_sck.c \ +# peripherals/security/tls.c \ +# peripherals/security/ssh.c + +#am__append_26 = $(ui_fb_files) +#am__append_27 = $(ui_fb_built) +#am__append_28 = $(ui_gtk_files) +#am__append_29 = $(ui_gtk_built) +am__append_30 = $(ui_null_files) +am__append_31 = $(ui_null_built) +#am__append_32 = $(ui_sdl_files) +#am__append_33 = $(ui_sdl_built) +#am__append_34 = $(ui_sdl2_files) +#am__append_35 = $(ui_widget_files) +#am__append_36 = $(ui_widget_built) +#am__append_37 = ui/widget/fuse.font +#am__append_38 = $(ui_wii_files) +#am__append_39 = $(ui_wii_built) +#am__append_40 = $(ui_win32_files) +#am__append_41 = $(ui_win32_built) +#am__append_42 = $(ui_xlib_files) +#am__append_43 = $(ui_xlib_built) +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_string_strcasecmp.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ + $(top_srcdir)/m4/sdl.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__dist_bashcompletion_DATA_DIST) \ + $(am__dist_icons128_DATA_DIST) $(am__dist_icons16_DATA_DIST) \ + $(am__dist_icons256_DATA_DIST) $(am__dist_icons32_DATA_DIST) \ + $(am__dist_icons48_DATA_DIST) $(am__dist_icons64_DATA_DIST) \ + $(am__dist_mimeicons128_DATA_DIST) \ + $(am__dist_mimeicons16_DATA_DIST) \ + $(am__dist_mimeicons256_DATA_DIST) \ + $(am__dist_mimeicons32_DATA_DIST) \ + $(am__dist_mimeicons48_DATA_DIST) \ + $(am__dist_mimeicons64_DATA_DIST) $(noinst_HEADERS) \ + $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = data/win32/fuse.manifest data/win32/installer.nsi +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ + "$(DESTDIR)$(appdatadir)" "$(DESTDIR)$(bashcompletiondir)" \ + "$(DESTDIR)$(icons128dir)" "$(DESTDIR)$(icons16dir)" \ + "$(DESTDIR)$(icons256dir)" "$(DESTDIR)$(icons32dir)" \ + "$(DESTDIR)$(icons48dir)" "$(DESTDIR)$(icons64dir)" \ + "$(DESTDIR)$(mimeicons128dir)" "$(DESTDIR)$(mimeicons16dir)" \ + "$(DESTDIR)$(mimeicons256dir)" "$(DESTDIR)$(mimeicons32dir)" \ + "$(DESTDIR)$(mimeicons48dir)" "$(DESTDIR)$(mimeicons64dir)" \ + "$(DESTDIR)$(fusemimedir)" "$(DESTDIR)$(metainfodir)" \ + "$(DESTDIR)$(pkgdatadir)" +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) +am__fuse_SOURCES_DIST = display.c event.c fuse.c input.c keyboard.c \ + loader.c machine.c memory_pages.c mempool.c menu.c movie.c \ + module.c periph.c phantom_typist.c profile.c psg.c rectangle.c \ + rzx.c screenshot.c settings.c slt.c snapshot.c sound.c \ + spectrum.c svg.c tape.c ui.c uidisplay.c uimedia.c utils.c \ + windres.rc compat/dirname.c compat/getopt.c compat/getopt1.c \ + compat/unix/dir.c compat/unix/file.c compat/amiga/osname.c \ + compat/amiga/paths.c compat/unix/timer.c compat/unix/osname.c \ + compat/linux/relative_paths.c compat/unix/paths.c \ + compat/unix/socket.c compat/morphos/osname.c \ + compat/unix/relative_paths.c compat/wii/osname.c \ + compat/wii/paths.c compat/wii/timer.c compat/win32/osname.c \ + compat/win32/paths.c compat/win32/timer.c \ + compat/win32/socket.c compat/unix/tuntap.c \ + debugger/breakpoint.c debugger/command.c debugger/commandl.l \ + debugger/commandy.y debugger/debugger.c debugger/disassemble.c \ + debugger/event.c debugger/expression.c debugger/gdbserver.c \ + debugger/gdbserver_remote_commands.c \ + debugger/gdbserver_utils.c debugger/system_variable.c \ + debugger/packets.c debugger/variable.c debugger/vfile.c \ + debugger/vfile_ext.c infrastructure/startup_manager.c \ + machines/machines_periph.c machines/pentagon.c \ + machines/pentagon512.c machines/pentagon1024.c \ + machines/scorpion.c machines/spec128.c machines/spec16.c \ + machines/spec48.c machines/spec48_ntsc.c machines/specplus2.c \ + machines/spec_se.c machines/specplus2a.c machines/specplus3.c \ + machines/specplus3e.c machines/tc2048.c machines/tc2068.c \ + machines/ts2068.c peripherals/dck.c peripherals/if1.c \ + peripherals/if2.c peripherals/joystick.c \ + peripherals/kempmouse.c peripherals/multiface.c \ + peripherals/printer.c peripherals/scld.c \ + peripherals/speccyboot.c peripherals/ula.c \ + peripherals/usource.c peripherals/ttx2000s.c \ + peripherals/sound/ay.c peripherals/sound/covox.c \ + peripherals/sound/fuller.c peripherals/sound/melodik.c \ + peripherals/sound/sp0256.c peripherals/sound/specdrum.c \ + peripherals/sound/uspeech.c peripherals/disk/beta.c \ + peripherals/disk/crc.c peripherals/disk/didaktik.c \ + peripherals/disk/disciple.c peripherals/disk/disk.c \ + peripherals/disk/fdd.c peripherals/disk/opus.c \ + peripherals/disk/plusd.c peripherals/disk/trdos.c \ + peripherals/disk/upd_fdc.c peripherals/disk/wd_fdc.c \ + peripherals/ide/divide.c peripherals/ide/divmmc.c \ + peripherals/ide/divxxx.c peripherals/ide/ide.c \ + peripherals/ide/simpleide.c peripherals/ide/zxatasp.c \ + peripherals/ide/zxcf.c peripherals/ide/zxmmc.c \ + peripherals/spectranet.c peripherals/nic/enc28j60.c \ + peripherals/flash/am29f010.c peripherals/nic/w5100.c \ + peripherals/nic/w5100_socket.c peripherals/nic/dns_resolver.c \ + peripherals/nic/dns_processor.c \ + peripherals/nic/engines/engine_argv.c \ + peripherals/nic/engines/engine_fs.c \ + peripherals/nic/engines/engine_utf8.c \ + peripherals/nic/engines/json.c peripherals/nic/engines/xpath.c \ + peripherals/nic/engines/jsonpath/ast.c \ + peripherals/nic/engines/jsonpath/lexer.c \ + peripherals/nic/engines/jsonpath/matcher.c \ + peripherals/nic/engines/jsonpath/parser.c \ + peripherals/nic/engines/parson.c \ + peripherals/nic/spectranext_controller.c \ + peripherals/nic/spectranext_stdout.c peripherals/fs/xfs.c \ + peripherals/fs/xfs_compat.c peripherals/fs/xfs_worker.c \ + peripherals/fs/xfs_fs.c peripherals/fs/xfs_overlay.c \ + peripherals/fs/xfs_romfs.c peripherals/fs/ramfs.c \ + peripherals/fs/xfs_https.c peripherals/fs/xfs_https_compat.c \ + peripherals/http/httpc.c peripherals/http/http_sck.c \ + peripherals/security/tls.c peripherals/security/ssh.c \ + pokefinder/pokefinder.c pokefinder/pokemem.c \ + sound/blipbuffer.c timer/timer.c ui/fb/fbdisplay.c \ + ui/fb/fbdisplay.h ui/fb/fbjoystick.c ui/fb/fbkeyboard.c \ + ui/fb/fbkeyboard.h ui/fb/fbmouse.c ui/fb/fbmouse.h \ + ui/fb/fbui.c ui/fb/keysyms.c ui/gtk3/binary.c ui/gtk3/browse.c \ + ui/gtk3/confirm.c ui/gtk3/debugger.c ui/gtk3/fileselector.c \ + ui/gtk3/filter_options.c ui/gtk3/gtkdisplay.c \ + ui/gtk3/gtkinternals.h ui/gtk3/gtkjoystick.c \ + ui/gtk3/gtkkeyboard.c ui/gtk3/gtkmouse.c ui/gtk3/gtkui.c \ + ui/gtk3/keysyms.c ui/gtk3/menu_data.c ui/gtk3/options.c \ + ui/gtk3/picture.c ui/gtk3/pokefinder.c ui/gtk3/pokemem.c \ + ui/gtk3/resources.c ui/gtk3/resources.h ui/gtk3/rollback.c \ + ui/gtk3/roms.c ui/gtk3/statusbar.c ui/gtk3/stock.c \ + ui/gtk3/memory.c ui/null/null_ui.c ui/null/options.c \ + ui/scaler/scaler.c ui/scaler/snes_ntsc.c ui/sdl/sdldisplay.c \ + ui/sdl/sdldisplay.h ui/sdl/sdljoystick.c ui/sdl/sdljoystick.h \ + ui/sdl/sdlkeyboard.c ui/sdl/sdlkeyboard.h ui/sdl/sdlui.c \ + ui/sdl/keysyms.c ui/sdl2/sdl2_display_internal.c \ + ui/sdl2/sdl2_display_internal.h ui/sdl2/sdl2_scaler_state.c \ + ui/sdl2/sdl2_scaler_state.h ui/sdl2/sdl2_display.c \ + ui/sdl2/sdl2_display.h ui/sdl2/sdl2_joystick_internal.c \ + ui/sdl2/sdl2_joystick_internal.h ui/sdl2/sdl2_joystick.c \ + ui/sdl2/sdl2_joystick.h ui/sdl2/sdl2_keyboard.c \ + ui/sdl2/sdl2_keyboard.h ui/sdl2/sdl2_mouse_internal.c \ + ui/sdl2/sdl2_mouse_internal.h ui/sdl2/sdl2_ui.c \ + ui/sdl2/sdl2_ui.h ui/widget/about.c ui/widget/binary.c \ + ui/widget/browse.c ui/widget/debugger.c ui/widget/error.c \ + ui/widget/filesel.c ui/widget/memory.c ui/widget/menu.c \ + ui/widget/menu_data.c ui/widget/options.c ui/widget/picture.c \ + ui/widget/pokefinder.c ui/widget/pokemem.c ui/widget/query.c \ + ui/widget/roms.c ui/widget/select.c ui/widget/text.c \ + ui/widget/widget_internals.h ui/widget/widget.c \ + ui/widget/widget.h ui/wii/keysyms.c ui/wii/wiidisplay.c \ + ui/wii/wiidisplay.h ui/wii/wiijoystick.c ui/wii/wiikeyboard.c \ + ui/wii/wiikeyboard.h ui/wii/wiikeysyms.h ui/wii/wiimouse.c \ + ui/wii/wiimouse.h ui/wii/wiiui.c ui/win32/about.c \ + ui/win32/about.h ui/win32/binary.c ui/win32/binary.h \ + ui/win32/browse.c ui/win32/browse.h ui/win32/confirm.c \ + ui/win32/debugger.c ui/win32/debugger.h ui/win32/debuglog.c \ + ui/win32/debuglog.h ui/win32/fileselector.c \ + ui/win32/hyperlinks.c ui/win32/hyperlinks.h ui/win32/keysyms.c \ + ui/win32/memorybrowser.c ui/win32/memorybrowser.h \ + ui/win32/menu_data.c ui/win32/options.c ui/win32/picture.c \ + ui/win32/picture.h ui/win32/pokefinder.c ui/win32/pokefinder.h \ + ui/win32/pokemem.c ui/win32/pokemem.h ui/win32/rollback.c \ + ui/win32/rollback.h ui/win32/roms.c ui/win32/roms.h \ + ui/win32/select_template.h ui/win32/statusbar.c \ + ui/win32/win32display.c ui/win32/win32internals.h \ + ui/win32/win32joystick.c ui/win32/win32joystick.h \ + ui/win32/win32keyboard.c ui/win32/win32mouse.c \ + ui/win32/win32ui.c ui/win32/winsparkle.c ui/win32/winsparkle.h \ + ui/xlib/keysyms.c ui/xlib/xdisplay.c ui/xlib/xdisplay.h \ + ui/xlib/xerror.c ui/xlib/xjoystick.c ui/xlib/xkeyboard.c \ + ui/xlib/xkeyboard.h ui/xlib/xui.c ui/xlib/xui.h \ + unittests/unittests.c z80/z80.c z80/z80_debugger_variables.c \ + z80/z80_ops.c +am__objects_1 = +am__dirstamp = $(am__leading_dot)dirstamp +#am__objects_2 = compat/dirname.$(OBJEXT) +#am__objects_3 = compat/getopt.$(OBJEXT) \ +# compat/getopt1.$(OBJEXT) +#am__objects_4 = compat/unix/dir.$(OBJEXT) \ +# compat/unix/file.$(OBJEXT) \ +# compat/amiga/osname.$(OBJEXT) \ +# compat/amiga/paths.$(OBJEXT) \ +# compat/unix/timer.$(OBJEXT) +#am__objects_5 = compat/unix/dir.$(OBJEXT) \ +# compat/unix/file.$(OBJEXT) \ +# compat/unix/osname.$(OBJEXT) \ +# compat/linux/relative_paths.$(OBJEXT) \ +# compat/unix/paths.$(OBJEXT) \ +# compat/unix/timer.$(OBJEXT) +#am__objects_6 = compat/unix/socket.$(OBJEXT) +#am__objects_7 = compat/unix/dir.$(OBJEXT) \ +# compat/unix/file.$(OBJEXT) \ +# compat/morphos/osname.$(OBJEXT) \ +# compat/amiga/paths.$(OBJEXT) \ +# compat/unix/timer.$(OBJEXT) +am__objects_8 = compat/unix/dir.$(OBJEXT) \ + compat/unix/file.$(OBJEXT) \ + compat/unix/osname.$(OBJEXT) \ + compat/unix/relative_paths.$(OBJEXT) \ + compat/unix/paths.$(OBJEXT) \ + compat/unix/timer.$(OBJEXT) +am__objects_9 = compat/unix/socket.$(OBJEXT) +#am__objects_10 = compat/unix/dir.$(OBJEXT) \ +# compat/unix/file.$(OBJEXT) \ +# compat/wii/osname.$(OBJEXT) \ +# compat/wii/paths.$(OBJEXT) \ +# compat/wii/timer.$(OBJEXT) +#am__objects_11 = compat/unix/dir.$(OBJEXT) \ +# compat/unix/file.$(OBJEXT) \ +# compat/win32/osname.$(OBJEXT) \ +# compat/win32/paths.$(OBJEXT) \ +# compat/win32/timer.$(OBJEXT) +#am__objects_12 = compat/win32/socket.$(OBJEXT) +#am__objects_13 = compat/unix/tuntap.$(OBJEXT) +#am__objects_14 = debugger/vfile.$(OBJEXT) \ +# debugger/vfile_ext.$(OBJEXT) +#am__objects_15 = \ +# peripherals/nic/enc28j60.$(OBJEXT) +#am__objects_16 = \ +# peripherals/flash/am29f010.$(OBJEXT) \ +# peripherals/nic/w5100.$(OBJEXT) \ +# peripherals/nic/w5100_socket.$(OBJEXT) \ +# peripherals/nic/dns_resolver.$(OBJEXT) \ +# peripherals/nic/dns_processor.$(OBJEXT) \ +# peripherals/nic/engines/engine_argv.$(OBJEXT) \ +# peripherals/nic/engines/engine_fs.$(OBJEXT) \ +# peripherals/nic/engines/engine_utf8.$(OBJEXT) \ +# peripherals/nic/engines/json.$(OBJEXT) \ +# peripherals/nic/engines/xpath.$(OBJEXT) \ +# peripherals/nic/engines/jsonpath/ast.$(OBJEXT) \ +# peripherals/nic/engines/jsonpath/lexer.$(OBJEXT) \ +# peripherals/nic/engines/jsonpath/matcher.$(OBJEXT) \ +# peripherals/nic/engines/jsonpath/parser.$(OBJEXT) \ +# peripherals/nic/engines/parson.$(OBJEXT) \ +# peripherals/nic/spectranext_controller.$(OBJEXT) \ +# peripherals/nic/spectranext_stdout.$(OBJEXT) \ +# peripherals/fs/xfs.$(OBJEXT) \ +# peripherals/fs/xfs_compat.$(OBJEXT) \ +# peripherals/fs/xfs_worker.$(OBJEXT) \ +# peripherals/fs/xfs_fs.$(OBJEXT) \ +# peripherals/fs/xfs_overlay.$(OBJEXT) \ +# peripherals/fs/xfs_romfs.$(OBJEXT) \ +# peripherals/fs/ramfs.$(OBJEXT) \ +# peripherals/fs/xfs_https.$(OBJEXT) \ +# peripherals/fs/xfs_https_compat.$(OBJEXT) \ +# peripherals/http/httpc.$(OBJEXT) \ +# peripherals/http/http_sck.$(OBJEXT) \ +# peripherals/security/tls.$(OBJEXT) \ +# peripherals/security/ssh.$(OBJEXT) +am__objects_17 = ui/fb/fbdisplay.$(OBJEXT) ui/fb/fbjoystick.$(OBJEXT) \ + ui/fb/fbkeyboard.$(OBJEXT) ui/fb/fbmouse.$(OBJEXT) \ + ui/fb/fbui.$(OBJEXT) ui/fb/keysyms.$(OBJEXT) +#am__objects_18 = $(am__objects_17) +am__objects_19 = ui/gtk3/binary.$(OBJEXT) ui/gtk3/browse.$(OBJEXT) \ + ui/gtk3/confirm.$(OBJEXT) ui/gtk3/debugger.$(OBJEXT) \ + ui/gtk3/fileselector.$(OBJEXT) \ + ui/gtk3/filter_options.$(OBJEXT) ui/gtk3/gtkdisplay.$(OBJEXT) \ + ui/gtk3/gtkjoystick.$(OBJEXT) ui/gtk3/gtkkeyboard.$(OBJEXT) \ + ui/gtk3/gtkmouse.$(OBJEXT) ui/gtk3/gtkui.$(OBJEXT) \ + ui/gtk3/keysyms.$(OBJEXT) ui/gtk3/menu_data.$(OBJEXT) \ + ui/gtk3/options.$(OBJEXT) ui/gtk3/picture.$(OBJEXT) \ + ui/gtk3/pokefinder.$(OBJEXT) ui/gtk3/pokemem.$(OBJEXT) \ + ui/gtk3/resources.$(OBJEXT) ui/gtk3/rollback.$(OBJEXT) \ + ui/gtk3/roms.$(OBJEXT) ui/gtk3/statusbar.$(OBJEXT) \ + ui/gtk3/stock.$(OBJEXT) ui/gtk3/memory.$(OBJEXT) +#am__objects_20 = $(am__objects_19) +am__objects_21 = ui/null/null_ui.$(OBJEXT) ui/null/options.$(OBJEXT) +am__objects_22 = $(am__objects_21) +am__objects_23 = ui/sdl/sdldisplay.$(OBJEXT) \ + ui/sdl/sdljoystick.$(OBJEXT) ui/sdl/sdlkeyboard.$(OBJEXT) \ + ui/sdl/sdlui.$(OBJEXT) ui/sdl/keysyms.$(OBJEXT) +#am__objects_24 = $(am__objects_23) +am__objects_25 = ui/sdl2/sdl2_display_internal.$(OBJEXT) \ + ui/sdl2/sdl2_scaler_state.$(OBJEXT) \ + ui/sdl2/sdl2_display.$(OBJEXT) \ + ui/sdl2/sdl2_joystick_internal.$(OBJEXT) \ + ui/sdl2/sdl2_joystick.$(OBJEXT) \ + ui/sdl2/sdl2_keyboard.$(OBJEXT) \ + ui/sdl2/sdl2_mouse_internal.$(OBJEXT) \ + ui/sdl2/sdl2_ui.$(OBJEXT) +#am__objects_26 = $(am__objects_25) +am__objects_27 = ui/widget/about.$(OBJEXT) ui/widget/binary.$(OBJEXT) \ + ui/widget/browse.$(OBJEXT) ui/widget/debugger.$(OBJEXT) \ + ui/widget/error.$(OBJEXT) ui/widget/filesel.$(OBJEXT) \ + ui/widget/memory.$(OBJEXT) ui/widget/menu.$(OBJEXT) \ + ui/widget/menu_data.$(OBJEXT) ui/widget/options.$(OBJEXT) \ + ui/widget/picture.$(OBJEXT) ui/widget/pokefinder.$(OBJEXT) \ + ui/widget/pokemem.$(OBJEXT) ui/widget/query.$(OBJEXT) \ + ui/widget/roms.$(OBJEXT) ui/widget/select.$(OBJEXT) \ + ui/widget/text.$(OBJEXT) ui/widget/widget.$(OBJEXT) +#am__objects_28 = $(am__objects_27) +am__objects_29 = ui/wii/keysyms.$(OBJEXT) ui/wii/wiidisplay.$(OBJEXT) \ + ui/wii/wiijoystick.$(OBJEXT) ui/wii/wiikeyboard.$(OBJEXT) \ + ui/wii/wiimouse.$(OBJEXT) ui/wii/wiiui.$(OBJEXT) +#am__objects_30 = $(am__objects_29) +am__objects_31 = ui/win32/about.$(OBJEXT) ui/win32/binary.$(OBJEXT) \ + ui/win32/browse.$(OBJEXT) ui/win32/confirm.$(OBJEXT) \ + ui/win32/debugger.$(OBJEXT) ui/win32/debuglog.$(OBJEXT) \ + ui/win32/fileselector.$(OBJEXT) ui/win32/hyperlinks.$(OBJEXT) \ + ui/win32/keysyms.$(OBJEXT) ui/win32/memorybrowser.$(OBJEXT) \ + ui/win32/menu_data.$(OBJEXT) ui/win32/options.$(OBJEXT) \ + ui/win32/picture.$(OBJEXT) ui/win32/pokefinder.$(OBJEXT) \ + ui/win32/pokemem.$(OBJEXT) ui/win32/rollback.$(OBJEXT) \ + ui/win32/roms.$(OBJEXT) ui/win32/statusbar.$(OBJEXT) \ + ui/win32/win32display.$(OBJEXT) \ + ui/win32/win32joystick.$(OBJEXT) \ + ui/win32/win32keyboard.$(OBJEXT) ui/win32/win32mouse.$(OBJEXT) \ + ui/win32/win32ui.$(OBJEXT) ui/win32/winsparkle.$(OBJEXT) +#am__objects_32 = $(am__objects_31) +am__objects_33 = ui/xlib/keysyms.$(OBJEXT) ui/xlib/xdisplay.$(OBJEXT) \ + ui/xlib/xerror.$(OBJEXT) ui/xlib/xjoystick.$(OBJEXT) \ + ui/xlib/xkeyboard.$(OBJEXT) ui/xlib/xui.$(OBJEXT) +#am__objects_34 = $(am__objects_33) +am_fuse_OBJECTS = display.$(OBJEXT) event.$(OBJEXT) fuse.$(OBJEXT) \ + input.$(OBJEXT) keyboard.$(OBJEXT) loader.$(OBJEXT) \ + machine.$(OBJEXT) memory_pages.$(OBJEXT) mempool.$(OBJEXT) \ + menu.$(OBJEXT) movie.$(OBJEXT) module.$(OBJEXT) \ + periph.$(OBJEXT) phantom_typist.$(OBJEXT) profile.$(OBJEXT) \ + psg.$(OBJEXT) rectangle.$(OBJEXT) rzx.$(OBJEXT) \ + screenshot.$(OBJEXT) settings.$(OBJEXT) slt.$(OBJEXT) \ + snapshot.$(OBJEXT) sound.$(OBJEXT) spectrum.$(OBJEXT) \ + svg.$(OBJEXT) tape.$(OBJEXT) ui.$(OBJEXT) uidisplay.$(OBJEXT) \ + uimedia.$(OBJEXT) utils.$(OBJEXT) $(am__objects_1) \ + $(am__objects_2) $(am__objects_3) $(am__objects_4) \ + $(am__objects_5) $(am__objects_6) $(am__objects_7) \ + $(am__objects_8) $(am__objects_9) $(am__objects_10) \ + $(am__objects_11) $(am__objects_12) $(am__objects_13) \ + debugger/breakpoint.$(OBJEXT) debugger/command.$(OBJEXT) \ + debugger/commandl.$(OBJEXT) debugger/commandy.$(OBJEXT) \ + debugger/debugger.$(OBJEXT) debugger/disassemble.$(OBJEXT) \ + debugger/event.$(OBJEXT) debugger/expression.$(OBJEXT) \ + debugger/gdbserver.$(OBJEXT) \ + debugger/gdbserver_remote_commands.$(OBJEXT) \ + debugger/gdbserver_utils.$(OBJEXT) \ + debugger/system_variable.$(OBJEXT) debugger/packets.$(OBJEXT) \ + debugger/variable.$(OBJEXT) $(am__objects_14) \ + infrastructure/startup_manager.$(OBJEXT) \ + machines/machines_periph.$(OBJEXT) machines/pentagon.$(OBJEXT) \ + machines/pentagon512.$(OBJEXT) machines/pentagon1024.$(OBJEXT) \ + machines/scorpion.$(OBJEXT) machines/spec128.$(OBJEXT) \ + machines/spec16.$(OBJEXT) machines/spec48.$(OBJEXT) \ + machines/spec48_ntsc.$(OBJEXT) machines/specplus2.$(OBJEXT) \ + machines/spec_se.$(OBJEXT) machines/specplus2a.$(OBJEXT) \ + machines/specplus3.$(OBJEXT) machines/specplus3e.$(OBJEXT) \ + machines/tc2048.$(OBJEXT) machines/tc2068.$(OBJEXT) \ + machines/ts2068.$(OBJEXT) peripherals/dck.$(OBJEXT) \ + peripherals/if1.$(OBJEXT) peripherals/if2.$(OBJEXT) \ + peripherals/joystick.$(OBJEXT) peripherals/kempmouse.$(OBJEXT) \ + peripherals/multiface.$(OBJEXT) peripherals/printer.$(OBJEXT) \ + peripherals/scld.$(OBJEXT) peripherals/speccyboot.$(OBJEXT) \ + peripherals/ula.$(OBJEXT) peripherals/usource.$(OBJEXT) \ + peripherals/ttx2000s.$(OBJEXT) peripherals/sound/ay.$(OBJEXT) \ + peripherals/sound/covox.$(OBJEXT) \ + peripherals/sound/fuller.$(OBJEXT) \ + peripherals/sound/melodik.$(OBJEXT) \ + peripherals/sound/sp0256.$(OBJEXT) \ + peripherals/sound/specdrum.$(OBJEXT) \ + peripherals/sound/uspeech.$(OBJEXT) \ + peripherals/disk/beta.$(OBJEXT) peripherals/disk/crc.$(OBJEXT) \ + peripherals/disk/didaktik.$(OBJEXT) \ + peripherals/disk/disciple.$(OBJEXT) \ + peripherals/disk/disk.$(OBJEXT) peripherals/disk/fdd.$(OBJEXT) \ + peripherals/disk/opus.$(OBJEXT) \ + peripherals/disk/plusd.$(OBJEXT) \ + peripherals/disk/trdos.$(OBJEXT) \ + peripherals/disk/upd_fdc.$(OBJEXT) \ + peripherals/disk/wd_fdc.$(OBJEXT) \ + peripherals/ide/divide.$(OBJEXT) \ + peripherals/ide/divmmc.$(OBJEXT) \ + peripherals/ide/divxxx.$(OBJEXT) peripherals/ide/ide.$(OBJEXT) \ + peripherals/ide/simpleide.$(OBJEXT) \ + peripherals/ide/zxatasp.$(OBJEXT) \ + peripherals/ide/zxcf.$(OBJEXT) peripherals/ide/zxmmc.$(OBJEXT) \ + peripherals/spectranet.$(OBJEXT) $(am__objects_15) \ + $(am__objects_16) pokefinder/pokefinder.$(OBJEXT) \ + pokefinder/pokemem.$(OBJEXT) sound/blipbuffer.$(OBJEXT) \ + timer/timer.$(OBJEXT) $(am__objects_18) $(am__objects_20) \ + $(am__objects_22) ui/scaler/scaler.$(OBJEXT) \ + ui/scaler/snes_ntsc.$(OBJEXT) $(am__objects_24) \ + $(am__objects_26) $(am__objects_28) $(am__objects_30) \ + $(am__objects_32) $(am__objects_34) \ + unittests/unittests.$(OBJEXT) z80/z80.$(OBJEXT) \ + z80/z80_debugger_variables.$(OBJEXT) z80/z80_ops.$(OBJEXT) +fuse_OBJECTS = $(am_fuse_OBJECTS) +am__DEPENDENCIES_1 = +#am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) \ +# $(am__DEPENDENCIES_1) +#am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1) +am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1) +#am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1) \ +# windres.o +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +am__v_lt_1 = +fuse_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(fuse_LDFLAGS) $(LDFLAGS) -o $@ +am_unittests_displaytest_OBJECTS = \ + unittests/displaytest-displaytest.$(OBJEXT) \ + unittests_displaytest-display.$(OBJEXT) +unittests_displaytest_OBJECTS = $(am_unittests_displaytest_OBJECTS) +unittests_displaytest_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_unittests_palcompositetest_OBJECTS = \ + unittests/palcompositetest-palcompositetest.$(OBJEXT) \ + ui/scaler/unittests_palcompositetest-snes_ntsc.$(OBJEXT) +unittests_palcompositetest_OBJECTS = \ + $(am_unittests_palcompositetest_OBJECTS) +unittests_palcompositetest_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + ui/scaler/scalers16.o ui/scaler/scalers32.o +am_unittests_scalerexpandtest_OBJECTS = \ + unittests/scalerexpandtest-scalerexpandtest.$(OBJEXT) \ + ui/scaler/unittests_scalerexpandtest-scaler.$(OBJEXT) +unittests_scalerexpandtest_OBJECTS = \ + $(am_unittests_scalerexpandtest_OBJECTS) +unittests_scalerexpandtest_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + ui/scaler/scalers16.o ui/scaler/scalers32.o \ + ui/scaler/snes_ntsc.o +am_unittests_sdl2displaytest_OBJECTS = \ + unittests/sdl2displaytest-sdl2displaytest.$(OBJEXT) \ + ui/sdl2/unittests_sdl2displaytest-sdl2_display_internal.$(OBJEXT) +unittests_sdl2displaytest_OBJECTS = \ + $(am_unittests_sdl2displaytest_OBJECTS) +unittests_sdl2displaytest_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_unittests_sdl2joysticktest_OBJECTS = \ + unittests/sdl2joysticktest-sdl2joysticktest.$(OBJEXT) \ + ui/sdl2/unittests_sdl2joysticktest-sdl2_joystick_internal.$(OBJEXT) +unittests_sdl2joysticktest_OBJECTS = \ + $(am_unittests_sdl2joysticktest_OBJECTS) +unittests_sdl2joysticktest_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_unittests_sdl2mousetest_OBJECTS = \ + unittests/sdl2mousetest-sdl2mousetest.$(OBJEXT) \ + ui/sdl2/unittests_sdl2mousetest-sdl2_mouse_internal.$(OBJEXT) +unittests_sdl2mousetest_OBJECTS = \ + $(am_unittests_sdl2mousetest_OBJECTS) +unittests_sdl2mousetest_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_unittests_sdl2scalerstatetest_OBJECTS = \ + unittests/sdl2scalerstatetest-sdl2scalerstatetest.$(OBJEXT) \ + ui/sdl2/unittests_sdl2scalerstatetest-sdl2_scaler_state.$(OBJEXT) +unittests_sdl2scalerstatetest_OBJECTS = \ + $(am_unittests_sdl2scalerstatetest_OBJECTS) +unittests_sdl2scalerstatetest_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_z80_coretest_OBJECTS = z80/coretest-coretest.$(OBJEXT) \ + z80/coretest-z80.$(OBJEXT) +z80_coretest_OBJECTS = $(am_z80_coretest_OBJECTS) +z80_coretest_DEPENDENCIES = z80/z80_coretest.o $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I. +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/display.Po ./$(DEPDIR)/event.Po \ + ./$(DEPDIR)/fuse.Po ./$(DEPDIR)/input.Po \ + ./$(DEPDIR)/keyboard.Po ./$(DEPDIR)/loader.Po \ + ./$(DEPDIR)/machine.Po ./$(DEPDIR)/memory_pages.Po \ + ./$(DEPDIR)/mempool.Po ./$(DEPDIR)/menu.Po \ + ./$(DEPDIR)/module.Po ./$(DEPDIR)/movie.Po \ + ./$(DEPDIR)/periph.Po ./$(DEPDIR)/phantom_typist.Po \ + ./$(DEPDIR)/profile.Po ./$(DEPDIR)/psg.Po \ + ./$(DEPDIR)/rectangle.Po ./$(DEPDIR)/rzx.Po \ + ./$(DEPDIR)/screenshot.Po ./$(DEPDIR)/settings.Po \ + ./$(DEPDIR)/slt.Po ./$(DEPDIR)/snapshot.Po \ + ./$(DEPDIR)/sound.Po ./$(DEPDIR)/spectrum.Po \ + ./$(DEPDIR)/svg.Po ./$(DEPDIR)/tape.Po ./$(DEPDIR)/ui.Po \ + ./$(DEPDIR)/uidisplay.Po ./$(DEPDIR)/uimedia.Po \ + ./$(DEPDIR)/unittests_displaytest-display.Po \ + ./$(DEPDIR)/utils.Po compat/$(DEPDIR)/dirname.Po \ + compat/$(DEPDIR)/getopt.Po compat/$(DEPDIR)/getopt1.Po \ + compat/amiga/$(DEPDIR)/osname.Po \ + compat/amiga/$(DEPDIR)/paths.Po \ + compat/linux/$(DEPDIR)/relative_paths.Po \ + compat/morphos/$(DEPDIR)/osname.Po \ + compat/unix/$(DEPDIR)/dir.Po compat/unix/$(DEPDIR)/file.Po \ + compat/unix/$(DEPDIR)/osname.Po compat/unix/$(DEPDIR)/paths.Po \ + compat/unix/$(DEPDIR)/relative_paths.Po \ + compat/unix/$(DEPDIR)/socket.Po compat/unix/$(DEPDIR)/timer.Po \ + compat/unix/$(DEPDIR)/tuntap.Po compat/wii/$(DEPDIR)/osname.Po \ + compat/wii/$(DEPDIR)/paths.Po compat/wii/$(DEPDIR)/timer.Po \ + compat/win32/$(DEPDIR)/osname.Po \ + compat/win32/$(DEPDIR)/paths.Po \ + compat/win32/$(DEPDIR)/socket.Po \ + compat/win32/$(DEPDIR)/timer.Po \ + debugger/$(DEPDIR)/breakpoint.Po debugger/$(DEPDIR)/command.Po \ + debugger/$(DEPDIR)/commandl.Po debugger/$(DEPDIR)/commandy.Po \ + debugger/$(DEPDIR)/debugger.Po \ + debugger/$(DEPDIR)/disassemble.Po debugger/$(DEPDIR)/event.Po \ + debugger/$(DEPDIR)/expression.Po \ + debugger/$(DEPDIR)/gdbserver.Po \ + debugger/$(DEPDIR)/gdbserver_remote_commands.Po \ + debugger/$(DEPDIR)/gdbserver_utils.Po \ + debugger/$(DEPDIR)/packets.Po \ + debugger/$(DEPDIR)/system_variable.Po \ + debugger/$(DEPDIR)/variable.Po debugger/$(DEPDIR)/vfile.Po \ + debugger/$(DEPDIR)/vfile_ext.Po \ + infrastructure/$(DEPDIR)/startup_manager.Po \ + machines/$(DEPDIR)/machines_periph.Po \ + machines/$(DEPDIR)/pentagon.Po \ + machines/$(DEPDIR)/pentagon1024.Po \ + machines/$(DEPDIR)/pentagon512.Po \ + machines/$(DEPDIR)/scorpion.Po machines/$(DEPDIR)/spec128.Po \ + machines/$(DEPDIR)/spec16.Po machines/$(DEPDIR)/spec48.Po \ + machines/$(DEPDIR)/spec48_ntsc.Po \ + machines/$(DEPDIR)/spec_se.Po machines/$(DEPDIR)/specplus2.Po \ + machines/$(DEPDIR)/specplus2a.Po \ + machines/$(DEPDIR)/specplus3.Po \ + machines/$(DEPDIR)/specplus3e.Po machines/$(DEPDIR)/tc2048.Po \ + machines/$(DEPDIR)/tc2068.Po machines/$(DEPDIR)/ts2068.Po \ + peripherals/$(DEPDIR)/dck.Po peripherals/$(DEPDIR)/if1.Po \ + peripherals/$(DEPDIR)/if2.Po peripherals/$(DEPDIR)/joystick.Po \ + peripherals/$(DEPDIR)/kempmouse.Po \ + peripherals/$(DEPDIR)/multiface.Po \ + peripherals/$(DEPDIR)/printer.Po peripherals/$(DEPDIR)/scld.Po \ + peripherals/$(DEPDIR)/speccyboot.Po \ + peripherals/$(DEPDIR)/spectranet.Po \ + peripherals/$(DEPDIR)/ttx2000s.Po peripherals/$(DEPDIR)/ula.Po \ + peripherals/$(DEPDIR)/usource.Po \ + peripherals/disk/$(DEPDIR)/beta.Po \ + peripherals/disk/$(DEPDIR)/crc.Po \ + peripherals/disk/$(DEPDIR)/didaktik.Po \ + peripherals/disk/$(DEPDIR)/disciple.Po \ + peripherals/disk/$(DEPDIR)/disk.Po \ + peripherals/disk/$(DEPDIR)/fdd.Po \ + peripherals/disk/$(DEPDIR)/opus.Po \ + peripherals/disk/$(DEPDIR)/plusd.Po \ + peripherals/disk/$(DEPDIR)/trdos.Po \ + peripherals/disk/$(DEPDIR)/upd_fdc.Po \ + peripherals/disk/$(DEPDIR)/wd_fdc.Po \ + peripherals/flash/$(DEPDIR)/am29f010.Po \ + peripherals/fs/$(DEPDIR)/ramfs.Po \ + peripherals/fs/$(DEPDIR)/xfs.Po \ + peripherals/fs/$(DEPDIR)/xfs_compat.Po \ + peripherals/fs/$(DEPDIR)/xfs_fs.Po \ + peripherals/fs/$(DEPDIR)/xfs_https.Po \ + peripherals/fs/$(DEPDIR)/xfs_https_compat.Po \ + peripherals/fs/$(DEPDIR)/xfs_overlay.Po \ + peripherals/fs/$(DEPDIR)/xfs_romfs.Po \ + peripherals/fs/$(DEPDIR)/xfs_worker.Po \ + peripherals/http/$(DEPDIR)/http_sck.Po \ + peripherals/http/$(DEPDIR)/httpc.Po \ + peripherals/ide/$(DEPDIR)/divide.Po \ + peripherals/ide/$(DEPDIR)/divmmc.Po \ + peripherals/ide/$(DEPDIR)/divxxx.Po \ + peripherals/ide/$(DEPDIR)/ide.Po \ + peripherals/ide/$(DEPDIR)/simpleide.Po \ + peripherals/ide/$(DEPDIR)/zxatasp.Po \ + peripherals/ide/$(DEPDIR)/zxcf.Po \ + peripherals/ide/$(DEPDIR)/zxmmc.Po \ + peripherals/nic/$(DEPDIR)/dns_processor.Po \ + peripherals/nic/$(DEPDIR)/dns_resolver.Po \ + peripherals/nic/$(DEPDIR)/enc28j60.Po \ + peripherals/nic/$(DEPDIR)/spectranext_controller.Po \ + peripherals/nic/$(DEPDIR)/spectranext_stdout.Po \ + peripherals/nic/$(DEPDIR)/w5100.Po \ + peripherals/nic/$(DEPDIR)/w5100_socket.Po \ + peripherals/nic/engines/$(DEPDIR)/engine_argv.Po \ + peripherals/nic/engines/$(DEPDIR)/engine_fs.Po \ + peripherals/nic/engines/$(DEPDIR)/engine_utf8.Po \ + peripherals/nic/engines/$(DEPDIR)/json.Po \ + peripherals/nic/engines/$(DEPDIR)/parson.Po \ + peripherals/nic/engines/$(DEPDIR)/xpath.Po \ + peripherals/nic/engines/jsonpath/$(DEPDIR)/ast.Po \ + peripherals/nic/engines/jsonpath/$(DEPDIR)/lexer.Po \ + peripherals/nic/engines/jsonpath/$(DEPDIR)/matcher.Po \ + peripherals/nic/engines/jsonpath/$(DEPDIR)/parser.Po \ + peripherals/security/$(DEPDIR)/ssh.Po \ + peripherals/security/$(DEPDIR)/tls.Po \ + peripherals/sound/$(DEPDIR)/ay.Po \ + peripherals/sound/$(DEPDIR)/covox.Po \ + peripherals/sound/$(DEPDIR)/fuller.Po \ + peripherals/sound/$(DEPDIR)/melodik.Po \ + peripherals/sound/$(DEPDIR)/sp0256.Po \ + peripherals/sound/$(DEPDIR)/specdrum.Po \ + peripherals/sound/$(DEPDIR)/uspeech.Po \ + pokefinder/$(DEPDIR)/pokefinder.Po \ + pokefinder/$(DEPDIR)/pokemem.Po sound/$(DEPDIR)/alsasound.Po \ + sound/$(DEPDIR)/aosound.Po sound/$(DEPDIR)/blipbuffer.Po \ + sound/$(DEPDIR)/coreaudiosound.Po sound/$(DEPDIR)/dxsound.Po \ + sound/$(DEPDIR)/hpsound.Po sound/$(DEPDIR)/nullsound.Po \ + sound/$(DEPDIR)/osssound.Po sound/$(DEPDIR)/pulsesound.Po \ + sound/$(DEPDIR)/sdl2sound.Po sound/$(DEPDIR)/sdlsound.Po \ + sound/$(DEPDIR)/sfifo.Po sound/$(DEPDIR)/sunsound.Po \ + sound/$(DEPDIR)/wiisound.Po sound/$(DEPDIR)/win32sound.Po \ + timer/$(DEPDIR)/native.Po timer/$(DEPDIR)/sdl.Po \ + timer/$(DEPDIR)/timer.Po ui/fb/$(DEPDIR)/fbdisplay.Po \ + ui/fb/$(DEPDIR)/fbjoystick.Po ui/fb/$(DEPDIR)/fbkeyboard.Po \ + ui/fb/$(DEPDIR)/fbmouse.Po ui/fb/$(DEPDIR)/fbui.Po \ + ui/fb/$(DEPDIR)/keysyms.Po ui/gtk3/$(DEPDIR)/binary.Po \ + ui/gtk3/$(DEPDIR)/browse.Po ui/gtk3/$(DEPDIR)/confirm.Po \ + ui/gtk3/$(DEPDIR)/debugger.Po \ + ui/gtk3/$(DEPDIR)/fileselector.Po \ + ui/gtk3/$(DEPDIR)/filter_options.Po \ + ui/gtk3/$(DEPDIR)/gtkdisplay.Po \ + ui/gtk3/$(DEPDIR)/gtkjoystick.Po \ + ui/gtk3/$(DEPDIR)/gtkkeyboard.Po ui/gtk3/$(DEPDIR)/gtkmouse.Po \ + ui/gtk3/$(DEPDIR)/gtkui.Po ui/gtk3/$(DEPDIR)/keysyms.Po \ + ui/gtk3/$(DEPDIR)/memory.Po ui/gtk3/$(DEPDIR)/menu_data.Po \ + ui/gtk3/$(DEPDIR)/options.Po ui/gtk3/$(DEPDIR)/picture.Po \ + ui/gtk3/$(DEPDIR)/pokefinder.Po ui/gtk3/$(DEPDIR)/pokemem.Po \ + ui/gtk3/$(DEPDIR)/resources.Po ui/gtk3/$(DEPDIR)/rollback.Po \ + ui/gtk3/$(DEPDIR)/roms.Po ui/gtk3/$(DEPDIR)/statusbar.Po \ + ui/gtk3/$(DEPDIR)/stock.Po ui/null/$(DEPDIR)/null_ui.Po \ + ui/null/$(DEPDIR)/options.Po ui/scaler/$(DEPDIR)/scaler.Po \ + ui/scaler/$(DEPDIR)/snes_ntsc.Po \ + ui/scaler/$(DEPDIR)/unittests_palcompositetest-snes_ntsc.Po \ + ui/scaler/$(DEPDIR)/unittests_scalerexpandtest-scaler.Po \ + ui/sdl/$(DEPDIR)/keysyms.Po ui/sdl/$(DEPDIR)/sdldisplay.Po \ + ui/sdl/$(DEPDIR)/sdljoystick.Po \ + ui/sdl/$(DEPDIR)/sdlkeyboard.Po ui/sdl/$(DEPDIR)/sdlui.Po \ + ui/sdl2/$(DEPDIR)/sdl2_display.Po \ + ui/sdl2/$(DEPDIR)/sdl2_display_internal.Po \ + ui/sdl2/$(DEPDIR)/sdl2_joystick.Po \ + ui/sdl2/$(DEPDIR)/sdl2_joystick_internal.Po \ + ui/sdl2/$(DEPDIR)/sdl2_keyboard.Po \ + ui/sdl2/$(DEPDIR)/sdl2_mouse_internal.Po \ + ui/sdl2/$(DEPDIR)/sdl2_scaler_state.Po \ + ui/sdl2/$(DEPDIR)/sdl2_ui.Po \ + ui/sdl2/$(DEPDIR)/unittests_sdl2displaytest-sdl2_display_internal.Po \ + ui/sdl2/$(DEPDIR)/unittests_sdl2joysticktest-sdl2_joystick_internal.Po \ + ui/sdl2/$(DEPDIR)/unittests_sdl2mousetest-sdl2_mouse_internal.Po \ + ui/sdl2/$(DEPDIR)/unittests_sdl2scalerstatetest-sdl2_scaler_state.Po \ + ui/widget/$(DEPDIR)/about.Po ui/widget/$(DEPDIR)/binary.Po \ + ui/widget/$(DEPDIR)/browse.Po ui/widget/$(DEPDIR)/debugger.Po \ + ui/widget/$(DEPDIR)/error.Po ui/widget/$(DEPDIR)/filesel.Po \ + ui/widget/$(DEPDIR)/memory.Po ui/widget/$(DEPDIR)/menu.Po \ + ui/widget/$(DEPDIR)/menu_data.Po \ + ui/widget/$(DEPDIR)/options.Po ui/widget/$(DEPDIR)/picture.Po \ + ui/widget/$(DEPDIR)/pokefinder.Po \ + ui/widget/$(DEPDIR)/pokemem.Po ui/widget/$(DEPDIR)/query.Po \ + ui/widget/$(DEPDIR)/roms.Po ui/widget/$(DEPDIR)/select.Po \ + ui/widget/$(DEPDIR)/text.Po ui/widget/$(DEPDIR)/widget.Po \ + ui/wii/$(DEPDIR)/keysyms.Po ui/wii/$(DEPDIR)/wiidisplay.Po \ + ui/wii/$(DEPDIR)/wiijoystick.Po \ + ui/wii/$(DEPDIR)/wiikeyboard.Po ui/wii/$(DEPDIR)/wiimouse.Po \ + ui/wii/$(DEPDIR)/wiiui.Po ui/win32/$(DEPDIR)/about.Po \ + ui/win32/$(DEPDIR)/binary.Po ui/win32/$(DEPDIR)/browse.Po \ + ui/win32/$(DEPDIR)/confirm.Po ui/win32/$(DEPDIR)/debugger.Po \ + ui/win32/$(DEPDIR)/debuglog.Po \ + ui/win32/$(DEPDIR)/fileselector.Po \ + ui/win32/$(DEPDIR)/hyperlinks.Po ui/win32/$(DEPDIR)/keysyms.Po \ + ui/win32/$(DEPDIR)/memorybrowser.Po \ + ui/win32/$(DEPDIR)/menu_data.Po ui/win32/$(DEPDIR)/options.Po \ + ui/win32/$(DEPDIR)/picture.Po ui/win32/$(DEPDIR)/pokefinder.Po \ + ui/win32/$(DEPDIR)/pokemem.Po ui/win32/$(DEPDIR)/rollback.Po \ + ui/win32/$(DEPDIR)/roms.Po ui/win32/$(DEPDIR)/statusbar.Po \ + ui/win32/$(DEPDIR)/win32display.Po \ + ui/win32/$(DEPDIR)/win32joystick.Po \ + ui/win32/$(DEPDIR)/win32keyboard.Po \ + ui/win32/$(DEPDIR)/win32mouse.Po ui/win32/$(DEPDIR)/win32ui.Po \ + ui/win32/$(DEPDIR)/winsparkle.Po ui/xlib/$(DEPDIR)/keysyms.Po \ + ui/xlib/$(DEPDIR)/xdisplay.Po ui/xlib/$(DEPDIR)/xerror.Po \ + ui/xlib/$(DEPDIR)/xjoystick.Po ui/xlib/$(DEPDIR)/xkeyboard.Po \ + ui/xlib/$(DEPDIR)/xui.Po \ + unittests/$(DEPDIR)/displaytest-displaytest.Po \ + unittests/$(DEPDIR)/palcompositetest-palcompositetest.Po \ + unittests/$(DEPDIR)/scalerexpandtest-scalerexpandtest.Po \ + unittests/$(DEPDIR)/sdl2displaytest-sdl2displaytest.Po \ + unittests/$(DEPDIR)/sdl2joysticktest-sdl2joysticktest.Po \ + unittests/$(DEPDIR)/sdl2mousetest-sdl2mousetest.Po \ + unittests/$(DEPDIR)/sdl2scalerstatetest-sdl2scalerstatetest.Po \ + unittests/$(DEPDIR)/unittests.Po \ + z80/$(DEPDIR)/coretest-coretest.Po \ + z80/$(DEPDIR)/coretest-z80.Po z80/$(DEPDIR)/z80.Po \ + z80/$(DEPDIR)/z80_debugger_variables.Po \ + z80/$(DEPDIR)/z80_ops.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS) +LTLEXCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(LEX) $(AM_LFLAGS) $(LFLAGS) +AM_V_LEX = $(am__v_LEX_$(V)) +am__v_LEX_ = $(am__v_LEX_$(AM_DEFAULT_VERBOSITY)) +am__v_LEX_0 = @echo " LEX " $@; +am__v_LEX_1 = +YLWRAP = $(top_srcdir)/ylwrap +am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ + -e s/c++$$/h++/ -e s/c$$/h/ +YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) +LTYACCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(YACC) $(AM_YFLAGS) $(YFLAGS) +AM_V_YACC = $(am__v_YACC_$(V)) +am__v_YACC_ = $(am__v_YACC_$(AM_DEFAULT_VERBOSITY)) +am__v_YACC_0 = @echo " YACC " $@; +am__v_YACC_1 = +SOURCES = $(fuse_SOURCES) $(EXTRA_fuse_SOURCES) \ + $(unittests_displaytest_SOURCES) \ + $(unittests_palcompositetest_SOURCES) \ + $(unittests_scalerexpandtest_SOURCES) \ + $(unittests_sdl2displaytest_SOURCES) \ + $(unittests_sdl2joysticktest_SOURCES) \ + $(unittests_sdl2mousetest_SOURCES) \ + $(unittests_sdl2scalerstatetest_SOURCES) \ + $(z80_coretest_SOURCES) +DIST_SOURCES = $(am__fuse_SOURCES_DIST) $(EXTRA_fuse_SOURCES) \ + $(unittests_displaytest_SOURCES) \ + $(unittests_palcompositetest_SOURCES) \ + $(unittests_scalerexpandtest_SOURCES) \ + $(unittests_sdl2displaytest_SOURCES) \ + $(unittests_sdl2joysticktest_SOURCES) \ + $(unittests_sdl2mousetest_SOURCES) \ + $(unittests_sdl2scalerstatetest_SOURCES) \ + $(z80_coretest_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +am__dist_bashcompletion_DATA_DIST = data/shell-completion/bash/fuse +am__dist_icons128_DATA_DIST = \ + data/icons/128x128/net.sourceforge.fuse_emulator.Fuse.png +am__dist_icons16_DATA_DIST = \ + data/icons/16x16/net.sourceforge.fuse_emulator.Fuse.png +am__dist_icons256_DATA_DIST = \ + data/icons/256x256/net.sourceforge.fuse_emulator.Fuse.png +am__dist_icons32_DATA_DIST = \ + data/icons/32x32/net.sourceforge.fuse_emulator.Fuse.png +am__dist_icons48_DATA_DIST = \ + data/icons/48x48/net.sourceforge.fuse_emulator.Fuse.png +am__dist_icons64_DATA_DIST = \ + data/icons/64x64/net.sourceforge.fuse_emulator.Fuse.png +am__dist_mimeicons128_DATA_DIST = \ + data/icons/128x128/application-x-spectrum.png +am__dist_mimeicons16_DATA_DIST = \ + data/icons/16x16/application-x-spectrum.png +am__dist_mimeicons256_DATA_DIST = \ + data/icons/256x256/application-x-spectrum.png +am__dist_mimeicons32_DATA_DIST = \ + data/icons/32x32/application-x-spectrum.png +am__dist_mimeicons48_DATA_DIST = \ + data/icons/48x48/application-x-spectrum.png +am__dist_mimeicons64_DATA_DIST = \ + data/icons/64x64/application-x-spectrum.png +DATA = $(appdata_DATA) $(dist_bashcompletion_DATA) \ + $(dist_icons128_DATA) $(dist_icons16_DATA) \ + $(dist_icons256_DATA) $(dist_icons32_DATA) \ + $(dist_icons48_DATA) $(dist_icons64_DATA) \ + $(dist_mimeicons128_DATA) $(dist_mimeicons16_DATA) \ + $(dist_mimeicons256_DATA) $(dist_mimeicons32_DATA) \ + $(dist_mimeicons48_DATA) $(dist_mimeicons64_DATA) \ + $(fusemime_DATA) $(metainfo_DATA) $(pkgdata_DATA) +HEADERS = $(noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \ + config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +AM_RECURSIVE_TARGETS = cscope +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/compat/Makefile.am \ + $(srcdir)/config.h.in $(srcdir)/data/Makefile.am \ + $(srcdir)/data/win32/distribution.mk \ + $(srcdir)/debugger/Makefile.am $(srcdir)/hacking/Makefile.am \ + $(srcdir)/infrastructure/Makefile.am $(srcdir)/lib/Makefile.am \ + $(srcdir)/machines/Makefile.am $(srcdir)/man/Makefile.am \ + $(srcdir)/peripherals/Makefile.am $(srcdir)/perl/Makefile.am \ + $(srcdir)/pokefinder/Makefile.am $(srcdir)/roms/Makefile.am \ + $(srcdir)/sound/Makefile.am $(srcdir)/timer/Makefile.am \ + $(srcdir)/ui/Makefile.am $(srcdir)/ui/fb/Makefile.am \ + $(srcdir)/ui/gtk3/Makefile.am $(srcdir)/ui/null/Makefile.am \ + $(srcdir)/ui/scaler/Makefile.am $(srcdir)/ui/sdl/Makefile.am \ + $(srcdir)/ui/sdl2/Makefile.am $(srcdir)/ui/widget/Makefile.am \ + $(srcdir)/ui/wii/Makefile.am $(srcdir)/ui/win32/Makefile.am \ + $(srcdir)/ui/xlib/Makefile.am $(srcdir)/unittests/Makefile.am \ + $(srcdir)/z80/Makefile.am \ + $(top_srcdir)/data/win32/fuse.manifest.in \ + $(top_srcdir)/data/win32/installer.nsi.in AUTHORS COPYING \ + ChangeLog INSTALL README THANKS TODO compile config.guess \ + config.sub debugger/commandl.c debugger/commandy.c depcomp \ + install-sh ltmain.sh missing ylwrap +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +# Exists only to be overridden by the user if desired. +AM_DISTCHECK_DVI_TARGET = dvi +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = ${SHELL} '/Users/desert/Documents/Work/spectranext/fuse/missing' aclocal-1.16 +AMTAR = $${TAR-tar} +AM_DEFAULT_VERBOSITY = 0 +AR = ar +AUTOCONF = ${SHELL} '/Users/desert/Documents/Work/spectranext/fuse/missing' autoconf +AUTOHEADER = ${SHELL} '/Users/desert/Documents/Work/spectranext/fuse/missing' autoheader +AUTOMAKE = ${SHELL} '/Users/desert/Documents/Work/spectranext/fuse/missing' automake-1.16 +AWK = gawk +BASH_COMPLETION_DIR = +CC = gcc -std=gnu23 +CCDEPMODE = depmode=gcc3 +CFLAGS = -I/opt/homebrew/include -I/opt/homebrew/Cellar/boost/1.87.0/include +CPP = gcc -std=gnu23 -E +CPPFLAGS = -I/opt/homebrew/opt/openssl@3/include -I/opt/homebrew/Cellar/boost/1.87.0/include -I/opt/homebrew/opt/zlib/include +CSCOPE = cscope +CTAGS = ctags +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DESKTOP_DATADIR = ${datarootdir} +DLLTOOL = dlltool +DSYMUTIL = dsymutil +DUMPBIN = +ECHO_C = \c +ECHO_N = +ECHO_T = +EGREP = /usr/bin/grep -E +ETAGS = etags +EXEEXT = +FGREP = /usr/bin/grep -F +FILECMD = file +FUSE_COPYRIGHT = (c) 1999-2026 Philip Kendall and others +FUSE_FULL_VERSION = 1.8.0.1 +FUSE_URL = http://fuse-emulator.sourceforge.net/ +GLIB_CFLAGS = -I/opt/homebrew/Cellar/glib/2.86.3/include/glib-2.0 -I/opt/homebrew/Cellar/glib/2.86.3/lib/glib-2.0/include -I/opt/homebrew/opt/gettext/include -I/opt/homebrew/Cellar/pcre2/10.47/include +GLIB_LIBS = -L/opt/homebrew/Cellar/glib/2.86.3/lib -lglib-2.0 -L/opt/homebrew/opt/gettext/lib -lintl +GREP = /usr/bin/grep +GROFF = +GTK_CFLAGS = +GTK_LIBS = +GTK_UPDATE_ICON_CACHE = true +INSTALL = /opt/homebrew/bin/ginstall -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld +LDFLAGS = -L/opt/homebrew/opt/openssl@3/lib -L/opt/homebrew/lib -L/opt/homebrew/Cellar/boost/1.87.0/lib -L/opt/homebrew/opt/zlib/lib +LEX = flex +LEXLIB = -ll +LEX_OUTPUT_ROOT = lex.yy +LIBOBJS = +LIBS = -lz -lm +LIBSPECTRUM_CFLAGS = -I/usr/local/include +LIBSPECTRUM_LIBS = -L/usr/local/lib -lspectrum +LIBSPEC_HAVE_BZ2 = yes +LIBSPEC_HAVE_ZLIB = yes +LIBSSH2_CFLAGS = +LIBSSH2_LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = lipo +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +MAKEINFO = ${SHELL} '/Users/desert/Documents/Work/spectranext/fuse/missing' makeinfo +MAN2HTML = +MANIFEST_TOOL = : +MBEDTLS_CFLAGS = +MBEDTLS_LIBS = +MKDIR_P = /opt/homebrew/bin/gmkdir -p +NM = /usr/bin/nm -B +NMEDIT = nmedit +OBJDUMP = objdump +OBJEXT = o +OPTIONS_DIR = null +OTOOL = otool +OTOOL64 = : +PACKAGE = fusex +PACKAGE_BUGREPORT = http://sourceforge.net/p/fuse-emulator/bugs/ +PACKAGE_NAME = fusex +PACKAGE_STRING = fusex 1.8.0-fusex-0.7 +PACKAGE_TARNAME = fusex +PACKAGE_URL = http://fuse-emulator.sourceforge.net/ +PACKAGE_VERSION = 1.8.0-fusex-0.7 +PATH_SEPARATOR = : +PERL = /opt/homebrew/bin/perl +PKG_CONFIG = /opt/homebrew/bin/pkg-config +PKG_CONFIG_LIBDIR = +PKG_CONFIG_PATH = /opt/homebrew/opt/openssl@3/lib/pkgconfig +PNG_CFLAGS = -I/opt/homebrew/opt/libpng/include/libpng16 +PNG_LIBS = -L/opt/homebrew/opt/libpng/lib -lpng16 +PTHREAD_CC = +PTHREAD_CFLAGS = +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = +RANLIB = ranlib +SDL1_CFLAGS = +SDL1_LIBS = +SDL2_CFLAGS = -I/opt/homebrew/include -I/opt/homebrew/include/SDL2 -D_THREAD_SAFE +SDL2_LIBS = -L/opt/homebrew/lib -lSDL2main -lSDL2 -Wl,-framework,Cocoa +SDL_CFLAGS = +SDL_CONFIG = no +SDL_LIBS = +SED = /opt/homebrew/bin/gsed +SET_MAKE = +SHELL = /bin/sh +SOUND_LIBADD = sound/sdl2sound.$(OBJEXT) sound/sfifo.$(OBJEXT) +SOUND_LIBS = +STRIP = strip +TIMER_LIBADD = timer/native.$(OBJEXT) +UI = null +UNIX2DOS = +VERSION = 1.8.0-fusex-0.7 +WARN_CFLAGS = -Wall -Wwrite-strings +WINDRES = +WINSPARKLE_CFLAGS = +WINSPARKLE_LIBS = +XMKMF = +XML_CFLAGS = +XML_LIBS = -lxml2 +X_CFLAGS = +X_EXTRA_LIBS = +X_LIBS = +X_PRE_LIBS = +YACC = bison -y +YFLAGS = -d +abs_builddir = /Users/desert/Documents/Work/spectranext/fuse +abs_srcdir = /Users/desert/Documents/Work/spectranext/fuse +abs_top_builddir = /Users/desert/Documents/Work/spectranext/fuse +abs_top_srcdir = /Users/desert/Documents/Work/spectranext/fuse +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +ax_pthread_config = +bindir = ${exec_prefix}/bin +build = aarch64-apple-darwin25.5.0 +build_alias = +build_cpu = aarch64 +build_os = darwin25.5.0 +build_vendor = apple +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = aarch64-apple-darwin25.5.0 +host_alias = +host_cpu = aarch64 +host_os = darwin25.5.0 +host_vendor = apple +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /Users/desert/Documents/Work/spectranext/fuse/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = . +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = +top_builddir = . +top_srcdir = . +ACLOCAL_AMFLAGS = -I m4 +fuse_SOURCES = display.c event.c fuse.c input.c keyboard.c loader.c \ + machine.c memory_pages.c mempool.c menu.c movie.c module.c \ + periph.c phantom_typist.c profile.c psg.c rectangle.c rzx.c \ + screenshot.c settings.c slt.c snapshot.c sound.c spectrum.c \ + svg.c tape.c ui.c uidisplay.c uimedia.c utils.c \ + $(am__append_7) $(am__append_11) $(am__append_12) \ + $(am__append_13) $(am__append_14) $(am__append_15) \ + $(am__append_16) $(am__append_17) $(am__append_18) \ + $(am__append_19) $(am__append_20) $(am__append_21) \ + $(am__append_22) debugger/breakpoint.c debugger/command.c \ + debugger/commandl.l debugger/commandy.y debugger/debugger.c \ + debugger/disassemble.c debugger/event.c debugger/expression.c \ + debugger/gdbserver.c debugger/gdbserver_remote_commands.c \ + debugger/gdbserver_utils.c debugger/system_variable.c \ + debugger/packets.c debugger/variable.c $(am__append_23) \ + infrastructure/startup_manager.c machines/machines_periph.c \ + machines/pentagon.c machines/pentagon512.c \ + machines/pentagon1024.c machines/scorpion.c machines/spec128.c \ + machines/spec16.c machines/spec48.c machines/spec48_ntsc.c \ + machines/specplus2.c machines/spec_se.c machines/specplus2a.c \ + machines/specplus3.c machines/specplus3e.c machines/tc2048.c \ + machines/tc2068.c machines/ts2068.c peripherals/dck.c \ + peripherals/if1.c peripherals/if2.c peripherals/joystick.c \ + peripherals/kempmouse.c peripherals/multiface.c \ + peripherals/printer.c peripherals/scld.c \ + peripherals/speccyboot.c peripherals/ula.c \ + peripherals/usource.c peripherals/ttx2000s.c \ + peripherals/sound/ay.c peripherals/sound/covox.c \ + peripherals/sound/fuller.c peripherals/sound/melodik.c \ + peripherals/sound/sp0256.c peripherals/sound/specdrum.c \ + peripherals/sound/uspeech.c peripherals/disk/beta.c \ + peripherals/disk/crc.c peripherals/disk/didaktik.c \ + peripherals/disk/disciple.c peripherals/disk/disk.c \ + peripherals/disk/fdd.c peripherals/disk/opus.c \ + peripherals/disk/plusd.c peripherals/disk/trdos.c \ + peripherals/disk/upd_fdc.c peripherals/disk/wd_fdc.c \ + peripherals/ide/divide.c peripherals/ide/divmmc.c \ + peripherals/ide/divxxx.c peripherals/ide/ide.c \ + peripherals/ide/simpleide.c peripherals/ide/zxatasp.c \ + peripherals/ide/zxcf.c peripherals/ide/zxmmc.c \ + peripherals/spectranet.c $(am__append_24) $(am__append_25) \ + pokefinder/pokefinder.c pokefinder/pokemem.c \ + sound/blipbuffer.c timer/timer.c $(am__append_26) \ + $(am__append_28) $(am__append_30) ui/scaler/scaler.c \ + ui/scaler/snes_ntsc.c $(am__append_32) $(am__append_34) \ + $(am__append_35) $(am__append_38) $(am__append_40) \ + $(am__append_42) unittests/unittests.c z80/z80.c \ + z80/z80_debugger_variables.c z80/z80_ops.c +fuse_LDADD = $(PTHREAD_LIBS) $(LIBSPECTRUM_LIBS) $(GTK_LIBS) \ + $(GLIB_LIBS) $(PNG_LIBS) $(X_LIBS) $(XML_LIBS) $(am__append_1) \ + $(am__append_2) $(am__append_3) $(am__append_8) $(SOUND_LIBS) \ + $(SOUND_LIBADD) $(TIMER_LIBADD) ui/scaler/scalers16.o \ + ui/scaler/scalers32.o +fuse_DEPENDENCIES = $(am__append_9) $(SOUND_LIBADD) $(TIMER_LIBADD) \ + ui/scaler/scalers16.o ui/scaler/scalers32.o +EXTRA_fuse_SOURCES = sound/alsasound.c sound/aosound.c \ + sound/coreaudiosound.c sound/dxsound.c sound/hpsound.c \ + sound/nullsound.c sound/osssound.c sound/pulsesound.c \ + sound/sdl2sound.c sound/sdlsound.c sound/sfifo.c \ + sound/sunsound.c sound/wiisound.c sound/win32sound.c \ + timer/native.c timer/sdl.c $(ui_xlib_files) +BUILT_SOURCES = options.h settings.c settings.h debugger/commandy.c \ + debugger/commandy.h debugger/commandl.c $(am__append_27) \ + $(am__append_29) $(am__append_31) $(am__append_33) \ + $(am__append_36) $(am__append_39) $(am__append_41) \ + $(am__append_43) z80/opcodes_base.c z80/z80_cb.c \ + z80/z80_ddfd.c z80/z80_ddfdcb.c z80/z80_ed.c +AM_CPPFLAGS = $(GLIB_CFLAGS) $(GTK_CFLAGS) $(LIBSPECTRUM_CFLAGS) \ + $(XML_CFLAGS) -DFUSEDATADIR="\"${pkgdatadir}\"" $(PNG_CFLAGS) \ + $(am__append_4) $(am__append_5) $(am__append_6) \ + $(am__append_10) +AM_CFLAGS = $(WARN_CFLAGS) $(PTHREAD_CFLAGS) +noinst_HEADERS = bitmap.h compat.h display.h event.h fuse.h input.h \ + keyboard.h loader.h machine.h memory_pages.h mempool.h menu.h \ + movie.h movie_tables.h module.h periph.h phantom_typist.h \ + psg.h rectangle.h rzx.h screenshot.h settings.h slt.h \ + snapshot.h sound.h spectrum.h svg.h tape.h utils.h options.h \ + profile.h compat/getopt.h debugger/breakpoint.h \ + debugger/commandy.h debugger/debugger.h \ + debugger/debugger_internals.h debugger/gdbserver.h \ + debugger/gdbserver_remote_commands.h debugger/vfile.h \ + debugger/vfile_ext.h infrastructure/startup_manager.h \ + machines/machines.h machines/machines_periph.h \ + machines/pentagon.h machines/scorpion.h machines/spec128.h \ + machines/spec48.h machines/specplus3.h machines/tc2068.h \ + peripherals/dck.h peripherals/if1.h peripherals/if2.h \ + peripherals/joystick.h peripherals/kempmouse.h \ + peripherals/multiface.h peripherals/printer.h \ + peripherals/scld.h peripherals/speccyboot.h \ + peripherals/spectranet.h peripherals/ula.h \ + peripherals/usource.h peripherals/ttx2000s.h \ + peripherals/sound/ay.h peripherals/sound/covox.h \ + peripherals/sound/fuller.h peripherals/sound/melodik.h \ + peripherals/sound/sp0256.h peripherals/sound/specdrum.h \ + peripherals/sound/uspeech.h peripherals/disk/beta.h \ + peripherals/disk/crc.h peripherals/disk/didaktik.h \ + peripherals/disk/disciple.h peripherals/disk/disk.h \ + peripherals/disk/fdd.h peripherals/disk/opus.h \ + peripherals/disk/plusd.h peripherals/disk/trdos.h \ + peripherals/disk/upd_fdc.h peripherals/disk/wd_fdc.h \ + peripherals/ide/divide.h peripherals/ide/divmmc.h \ + peripherals/ide/divxxx.h peripherals/ide/ide.h \ + peripherals/ide/simpleide.h peripherals/ide/zxatasp.h \ + peripherals/ide/zxcf.h peripherals/ide/zxmmc.h \ + peripherals/flash/am29f010.h peripherals/nic/enc28j60.h \ + peripherals/nic/w5100.h peripherals/nic/w5100_internals.h \ + peripherals/security/tls.h peripherals/security/ssh.h \ + peripherals/security/mbedtls_config.h pokefinder/pokefinder.h \ + pokefinder/pokemem.h sound/blipbuffer.h sound/sfifo.h \ + timer/timer.h ui/ui.h ui/uidisplay.h ui/uijoystick.h \ + ui/uimedia.h ui/scaler/scaler.h ui/scaler/scaler_internals.h \ + ui/scaler/snes_ntsc.h ui/scaler/snes_ntsc_config.h \ + ui/scaler/snes_ntsc_impl.h unittests/unittests.h z80/z80.h \ + z80/z80_checks.h z80/z80_internals.h z80/z80_macros.h +EXTRA_DIST = AUTHORS INSTALL PORTING README THANKS keysyms.dat \ + keysyms.pl m4/ax_pthread.m4 m4/ax_string_strcasecmp.m4 \ + m4/pkg.m4 m4/sdl.m4 menu_data.dat menu_data.pl settings.dat \ + settings.pl settings-win32.pl settings-header.pl \ + update-release.py .agents/skills/README.md \ + .agents/skills/update-changelog/SKILL.md \ + data/net.sourceforge.fuse_emulator.Fuse.desktop.in \ + data/net.sourceforge.fuse_emulator.Fuse.metainfo.xml \ + data/fuse.xml.in data/shell-completion/diff_options.sh \ + data/win32/LICENSES.txt data/win32/README-win32.txt \ + data/win32/check_win32_dll_deps.sh data/win32/fuse.manifest.in \ + data/win32/installer.nsi.in data/win32/winfuse.ico \ + data/win32/WinSparkle.dll data/win32/libWinSparkle.a \ + data/win32/WinSparkle.def data/win32/winsparkle.h \ + data/win32/winsparkle-version.h data/win32/winsparkle-tool.exe \ + data/win32/generate-appcast.sh hacking/code_beautifiers.txt \ + hacking/coding_style.txt hacking/cvs-tags \ + hacking/implementation_notes.txt hacking/input.txt \ + hacking/peripheral_tests.txt hacking/releasing.md \ + hacking/sound.txt hacking/spectranet.txt \ + hacking/tc2048_tech_notes.txt hacking/timer.txt \ + hacking/unittests.txt hacking/ui.txt hacking/uncrustify.cfg \ + hacking/valgrind.supp $(lib_files) $(lib_tests) $(man_MANS) \ + perl/cpp-perl.pl perl/Fuse.pm perl/Fuse/Dialog.pm $(ROMS) \ + roms/README.copyright roms/spectranext-launcher/boot.zx \ + roms/spectranext-launcher/launcher.bin ui/options.dat \ + ui/uijoystick.c $(gtkui_resource_files) ui/gtk3/options.pl \ + ui/gtk3/options-header.pl ui/gtk3/resources.xml \ + ui/null/options.pl ui/null/options-header.pl \ + ui/scaler/scalers.c ui/scaler/scaler_hq2x.c \ + ui/scaler/scaler_hq3x.c ui/scaler/scaler_hq4x.c \ + ui/widget/fuse.font.sbf ui/widget/mkfusefont.pl \ + ui/widget/options.pl ui/widget/options-header.pl \ + ui/win32/icons/disk_active.bmp \ + ui/win32/icons/disk_inactive.bmp ui/win32/icons/mdr_active.bmp \ + ui/win32/icons/mdr_inactive.bmp \ + ui/win32/icons/mouse_active.bmp \ + ui/win32/icons/mouse_inactive.bmp \ + ui/win32/icons/pause_active.bmp \ + ui/win32/icons/pause_inactive.bmp \ + ui/win32/icons/tape_active.bmp \ + ui/win32/icons/tape_inactive.bmp \ + ui/win32/icons/tape_marker.bmp \ + ui/win32/icons/tape_marker_mask.bmp ui/win32/options.pl \ + ui/win32/options-header.pl ui/win32/options-resource.pl \ + $(ui_win32_rc_files) ui/xlib/xpixmaps.c ui/xlib/xpixmaps.c.in \ + ui/xlib/xstatusbar.pl z80/tests/README \ + z80/tests/tests.expected z80/tests/tests.in z80/opcodes_base.c \ + z80/opcodes_base.dat z80/opcodes_cb.dat z80/opcodes_ddfd.dat \ + z80/opcodes_ddfdcb.dat z80/opcodes_ed.dat z80/z80.pl \ + z80/z80_cb.c z80/z80_ddfd.c z80/z80_ddfdcb.c z80/z80_ed.c +CLEANFILES = options.h settings.c settings.h \ + data/net.sourceforge.fuse_emulator.Fuse.desktop data/fuse.xml \ + data/shell-completion/bash.txt data/shell-completion/man.txt \ + data/shell-completion/settings.txt debugger/commandl.c \ + debugger/commandy.c debugger/commandy.h $(ui_fb_built) \ + $(ui_gtk_built) ui/gtk3/options.stamp $(ui_null_built) \ + ui/scaler/scalers16.o ui/scaler/scalers32.o \ + ui/scaler/snes_ntsc.o $(ui_sdl_built) $(ui_widget_built) \ + $(ui_wii_built) $(ui_win32_built) $(ui_xlib_built) \ + z80/opcodes_base.c z80/tests.actual z80/z80_cb.c \ + z80/z80_coretest.o z80/z80_ddfd.c z80/z80_ddfdcb.c \ + z80/z80_ed.c +DISTCLEANFILES = +pkgdata_DATA = $(lib_files) $(ROMS) $(am__append_37) +#fuse_LDFLAGS = -mwindows +#fusemimedir = $(DESKTOP_DATADIR)/mime/packages +#fusemime_DATA = data/fuse.xml +#appdatadir = $(DESKTOP_DATADIR)/applications +#appdata_DATA = data/net.sourceforge.fuse_emulator.Fuse.desktop +#metainfodir = $(DESKTOP_DATADIR)/metainfo +#metainfo_DATA = data/net.sourceforge.fuse_emulator.Fuse.metainfo.xml +#iconsdatadir = $(DESKTOP_DATADIR)/icons/hicolor +#icons16dir = $(iconsdatadir)/16x16/apps +#icons32dir = $(iconsdatadir)/32x32/apps +#icons48dir = $(iconsdatadir)/48x48/apps +#icons64dir = $(iconsdatadir)/64x64/apps +#icons128dir = $(iconsdatadir)/128x128/apps +#icons256dir = $(iconsdatadir)/256x256/apps +#dist_icons16_DATA = data/icons/16x16/net.sourceforge.fuse_emulator.Fuse.png +#dist_icons32_DATA = data/icons/32x32/net.sourceforge.fuse_emulator.Fuse.png +#dist_icons48_DATA = data/icons/48x48/net.sourceforge.fuse_emulator.Fuse.png +#dist_icons64_DATA = data/icons/64x64/net.sourceforge.fuse_emulator.Fuse.png +#dist_icons128_DATA = data/icons/128x128/net.sourceforge.fuse_emulator.Fuse.png +#dist_icons256_DATA = data/icons/256x256/net.sourceforge.fuse_emulator.Fuse.png +#mimeicons16dir = $(iconsdatadir)/16x16/mimetypes +#mimeicons32dir = $(iconsdatadir)/32x32/mimetypes +#mimeicons48dir = $(iconsdatadir)/48x48/mimetypes +#mimeicons64dir = $(iconsdatadir)/64x64/mimetypes +#mimeicons128dir = $(iconsdatadir)/128x128/mimetypes +#mimeicons256dir = $(iconsdatadir)/256x256/mimetypes +#dist_mimeicons16_DATA = data/icons/16x16/application-x-spectrum.png +#dist_mimeicons32_DATA = data/icons/32x32/application-x-spectrum.png +#dist_mimeicons48_DATA = data/icons/48x48/application-x-spectrum.png +#dist_mimeicons64_DATA = data/icons/64x64/application-x-spectrum.png +#dist_mimeicons128_DATA = data/icons/128x128/application-x-spectrum.png +#dist_mimeicons256_DATA = data/icons/256x256/application-x-spectrum.png +##EXTRA_DESKTOP_CATEGORIES = GTK; +#bashcompletiondir = $(BASH_COMPLETION_DIR) +#dist_bashcompletion_DATA = data/shell-completion/bash/fuse +#package_win32 = $(PACKAGE)-$(PACKAGE_VERSION)-$(UI) +#top_win32dir = $(top_builddir)/$(package_win32) +lib_files = \ + lib/cassette.bmp \ + lib/keyboard.png \ + lib/keyboard.scr \ + lib/microdrive.bmp \ + lib/plus3disk.bmp + +lib_tests = \ + lib/tests/fatware-success.hdf.bz2 \ + lib/tests/idedos-success.hdf.bz2 \ + lib/tests/success.d80.bz2 \ + lib/tests/success.mdr \ + lib/tests/success.mgt.bz2 \ + lib/tests/success.opd \ + lib/tests/success.udi + +man_MANS = man/fuse.1 +ROMS = \ + roms/128-0.rom \ + roms/128-1.rom \ + roms/128p-0.rom \ + roms/128p-1.rom \ + roms/256s-0.rom \ + roms/256s-1.rom \ + roms/256s-2.rom \ + roms/256s-3.rom \ + roms/48.rom \ + roms/disciple.rom \ + roms/gluck.rom \ + roms/plus2-0.rom \ + roms/plus2-1.rom \ + roms/plus3-0.rom \ + roms/plus3-1.rom \ + roms/plus3-2.rom \ + roms/plus3-3.rom \ + roms/plus3e-0.rom \ + roms/plus3e-1.rom \ + roms/plus3e-2.rom \ + roms/plus3e-3.rom \ + roms/plusd.rom \ + roms/tc2048.rom \ + roms/tc2068-0.rom \ + roms/tc2068-1.rom \ + roms/trdos.rom \ + roms/se-0.rom \ + roms/se-1.rom \ + roms/speccyboot-1.4.rom \ + roms/spxromfs.bin + +ui_fb_files = \ + ui/fb/fbdisplay.c \ + ui/fb/fbdisplay.h \ + ui/fb/fbjoystick.c \ + ui/fb/fbkeyboard.c \ + ui/fb/fbkeyboard.h \ + ui/fb/fbmouse.c \ + ui/fb/fbmouse.h \ + ui/fb/fbui.c \ + ui/fb/keysyms.c + +ui_fb_built = ui/fb/keysyms.c +gtkui_resource_files = \ + ui/gtk3/icons/disk_active.png \ + ui/gtk3/icons/disk_inactive.png \ + ui/gtk3/icons/mdr_active.png \ + ui/gtk3/icons/mdr_inactive.png \ + ui/gtk3/icons/mouse_active.png \ + ui/gtk3/icons/mouse_inactive.png \ + ui/gtk3/icons/pause_active.png \ + ui/gtk3/icons/pause_inactive.png \ + ui/gtk3/icons/tape_active.png \ + ui/gtk3/icons/tape_inactive.png \ + ui/gtk3/icons/tape_marker.png + +gtkui_built_resource_files = \ + ui/gtk3/menu_data.ui + +ui_gtk_files = \ + ui/gtk3/binary.c \ + ui/gtk3/browse.c \ + ui/gtk3/confirm.c \ + ui/gtk3/debugger.c \ + ui/gtk3/fileselector.c \ + ui/gtk3/filter_options.c \ + ui/gtk3/gtkdisplay.c \ + ui/gtk3/gtkinternals.h \ + ui/gtk3/gtkjoystick.c \ + ui/gtk3/gtkkeyboard.c \ + ui/gtk3/gtkmouse.c \ + ui/gtk3/gtkui.c \ + ui/gtk3/keysyms.c \ + ui/gtk3/menu_data.c \ + ui/gtk3/options.c \ + ui/gtk3/picture.c \ + ui/gtk3/pokefinder.c \ + ui/gtk3/pokemem.c \ + ui/gtk3/resources.c \ + ui/gtk3/resources.h \ + ui/gtk3/rollback.c \ + ui/gtk3/roms.c \ + ui/gtk3/statusbar.c \ + ui/gtk3/stock.c \ + ui/gtk3/memory.c + +ui_gtk_built = \ + ui/gtk3/keysyms.c \ + ui/gtk3/menu_data.c \ + ui/gtk3/menu_data.ui \ + ui/gtk3/options.c \ + ui/gtk3/options_internals.h \ + ui/gtk3/resources.c \ + ui/gtk3/resources.h + +ui_null_files = \ + ui/null/null_ui.c \ + ui/null/options.c + +ui_null_built = \ + ui/null/options.c + +ui_sdl_files = \ + ui/sdl/sdldisplay.c \ + ui/sdl/sdldisplay.h \ + ui/sdl/sdljoystick.c \ + ui/sdl/sdljoystick.h \ + ui/sdl/sdlkeyboard.c \ + ui/sdl/sdlkeyboard.h \ + ui/sdl/sdlui.c \ + ui/sdl/keysyms.c + +ui_sdl_built = ui/sdl/keysyms.c +ui_sdl2_files = \ + ui/sdl2/sdl2_display_internal.c \ + ui/sdl2/sdl2_display_internal.h \ + ui/sdl2/sdl2_scaler_state.c \ + ui/sdl2/sdl2_scaler_state.h \ + ui/sdl2/sdl2_display.c \ + ui/sdl2/sdl2_display.h \ + ui/sdl2/sdl2_joystick_internal.c \ + ui/sdl2/sdl2_joystick_internal.h \ + ui/sdl2/sdl2_joystick.c \ + ui/sdl2/sdl2_joystick.h \ + ui/sdl2/sdl2_keyboard.c \ + ui/sdl2/sdl2_keyboard.h \ + ui/sdl2/sdl2_mouse_internal.c \ + ui/sdl2/sdl2_mouse_internal.h \ + ui/sdl2/sdl2_ui.c \ + ui/sdl2/sdl2_ui.h + +ui_widget_files = \ + ui/widget/about.c \ + ui/widget/binary.c \ + ui/widget/browse.c \ + ui/widget/debugger.c \ + ui/widget/error.c \ + ui/widget/filesel.c \ + ui/widget/memory.c \ + ui/widget/menu.c \ + ui/widget/menu_data.c \ + ui/widget/options.c \ + ui/widget/picture.c \ + ui/widget/pokefinder.c \ + ui/widget/pokemem.c \ + ui/widget/query.c \ + ui/widget/roms.c \ + ui/widget/select.c \ + ui/widget/text.c \ + ui/widget/widget_internals.h \ + ui/widget/widget.c \ + ui/widget/widget.h + +ui_widget_built = \ + ui/widget/fuse.font \ + ui/widget/menu_data.c \ + ui/widget/options.c \ + ui/widget/options_internals.h + +ui_wii_files = \ + ui/wii/keysyms.c \ + ui/wii/wiidisplay.c \ + ui/wii/wiidisplay.h \ + ui/wii/wiijoystick.c \ + ui/wii/wiikeyboard.c \ + ui/wii/wiikeyboard.h \ + ui/wii/wiikeysyms.h \ + ui/wii/wiimouse.c \ + ui/wii/wiimouse.h \ + ui/wii/wiiui.c + +ui_wii_built = ui/wii/keysyms.c +#ui_win32_res = $(ui_win32_rc_files) +ui_win32_files = \ + ui/win32/about.c \ + ui/win32/about.h \ + ui/win32/binary.c \ + ui/win32/binary.h \ + ui/win32/browse.c \ + ui/win32/browse.h \ + ui/win32/confirm.c \ + ui/win32/debugger.c \ + ui/win32/debugger.h \ + ui/win32/debuglog.c \ + ui/win32/debuglog.h \ + ui/win32/fileselector.c \ + ui/win32/hyperlinks.c \ + ui/win32/hyperlinks.h \ + ui/win32/keysyms.c \ + ui/win32/memorybrowser.c \ + ui/win32/memorybrowser.h \ + ui/win32/menu_data.c \ + ui/win32/options.c \ + ui/win32/picture.c \ + ui/win32/picture.h \ + ui/win32/pokefinder.c \ + ui/win32/pokefinder.h \ + ui/win32/pokemem.c \ + ui/win32/pokemem.h \ + ui/win32/rollback.c \ + ui/win32/rollback.h \ + ui/win32/roms.c \ + ui/win32/roms.h \ + ui/win32/select_template.h \ + ui/win32/statusbar.c \ + ui/win32/win32display.c \ + ui/win32/win32internals.h \ + ui/win32/win32joystick.c \ + ui/win32/win32joystick.h \ + ui/win32/win32keyboard.c \ + ui/win32/win32mouse.c \ + ui/win32/win32ui.c \ + ui/win32/winsparkle.c \ + ui/win32/winsparkle.h + +ui_win32_rc_files = \ + ui/win32/about.rc \ + ui/win32/binary.rc \ + ui/win32/browse.rc \ + ui/win32/debugger.rc \ + ui/win32/memorybrowser.rc \ + ui/win32/menu_data.rc \ + ui/win32/options.rc \ + ui/win32/picture.rc \ + ui/win32/pokefinder.rc \ + ui/win32/pokemem.rc \ + ui/win32/rollback.rc \ + ui/win32/roms.rc \ + ui/win32/select_template.rc \ + ui/win32/statusbar.rc \ + ui/win32/win32joystick.rc + +ui_win32_built = \ + ui/win32/keysyms.c \ + ui/win32/menu_data.c \ + ui/win32/menu_data.h \ + ui/win32/menu_data.rc \ + ui/win32/options_internals.h \ + ui/win32/options.c \ + ui/win32/options.rc + +ui_xlib_files = \ + ui/xlib/keysyms.c \ + ui/xlib/xdisplay.c \ + ui/xlib/xdisplay.h \ + ui/xlib/xerror.c \ + ui/xlib/xjoystick.c \ + ui/xlib/xkeyboard.c \ + ui/xlib/xkeyboard.h \ + ui/xlib/xui.c \ + ui/xlib/xui.h + +ui_xlib_built = \ + ui/xlib/keysyms.c \ + ui/xlib/xpixmaps.c + +unittests_displaytest_SOURCES = unittests/displaytest.c display.c +unittests_displaytest_LDADD = $(LIBSPECTRUM_LIBS) $(GLIB_LIBS) +unittests_displaytest_CPPFLAGS = $(AM_CPPFLAGS) -DDISPLAYTEST +unittests_sdl2displaytest_SOURCES = \ + unittests/sdl2displaytest.c \ + ui/sdl2/sdl2_display_internal.c + +unittests_sdl2displaytest_LDADD = $(LIBSPECTRUM_LIBS) +unittests_sdl2displaytest_CPPFLAGS = $(AM_CPPFLAGS) +unittests_sdl2scalerstatetest_SOURCES = \ + unittests/sdl2scalerstatetest.c \ + ui/sdl2/sdl2_scaler_state.c + +unittests_sdl2scalerstatetest_LDADD = $(LIBSPECTRUM_LIBS) +unittests_sdl2scalerstatetest_CPPFLAGS = $(AM_CPPFLAGS) +unittests_sdl2joysticktest_SOURCES = \ + unittests/sdl2joysticktest.c \ + ui/sdl2/sdl2_joystick_internal.c + +unittests_sdl2joysticktest_LDADD = $(LIBSPECTRUM_LIBS) +unittests_sdl2joysticktest_CPPFLAGS = $(AM_CPPFLAGS) +unittests_sdl2mousetest_SOURCES = \ + unittests/sdl2mousetest.c \ + ui/sdl2/sdl2_mouse_internal.c + +unittests_sdl2mousetest_LDADD = $(LIBSPECTRUM_LIBS) +unittests_sdl2mousetest_CPPFLAGS = $(AM_CPPFLAGS) +unittests_palcompositetest_SOURCES = \ + unittests/palcompositetest.c \ + ui/scaler/snes_ntsc.c + +unittests_palcompositetest_LDADD = $(LIBSPECTRUM_LIBS) \ + ui/scaler/scalers16.o ui/scaler/scalers32.o + +unittests_palcompositetest_CPPFLAGS = $(AM_CPPFLAGS) +unittests_scalerexpandtest_SOURCES = \ + unittests/scalerexpandtest.c \ + ui/scaler/scaler.c + +unittests_scalerexpandtest_LDADD = $(LIBSPECTRUM_LIBS) \ + ui/scaler/scalers16.o ui/scaler/scalers32.o ui/scaler/snes_ntsc.o + +unittests_scalerexpandtest_CPPFLAGS = $(AM_CPPFLAGS) +z80_coretest_SOURCES = z80/coretest.c z80/z80.c +z80_coretest_LDADD = z80/z80_coretest.o $(GLIB_LIBS) $(LIBSPECTRUM_LIBS) +z80_coretest_CPPFLAGS = $(GLIB_CFLAGS) $(LIBSPECTRUM_CFLAGS) -DCORETEST +all: $(BUILT_SOURCES) config.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .l .lo .o .obj .y +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/compat/Makefile.am $(srcdir)/data/Makefile.am $(srcdir)/data/win32/distribution.mk $(srcdir)/debugger/Makefile.am $(srcdir)/hacking/Makefile.am $(srcdir)/infrastructure/Makefile.am $(srcdir)/lib/Makefile.am $(srcdir)/machines/Makefile.am $(srcdir)/man/Makefile.am $(srcdir)/peripherals/Makefile.am $(srcdir)/perl/Makefile.am $(srcdir)/pokefinder/Makefile.am $(srcdir)/roms/Makefile.am $(srcdir)/sound/Makefile.am $(srcdir)/timer/Makefile.am $(srcdir)/ui/Makefile.am $(srcdir)/ui/fb/Makefile.am $(srcdir)/ui/gtk3/Makefile.am $(srcdir)/ui/null/Makefile.am $(srcdir)/ui/scaler/Makefile.am $(srcdir)/ui/sdl/Makefile.am $(srcdir)/ui/sdl2/Makefile.am $(srcdir)/ui/widget/Makefile.am $(srcdir)/ui/wii/Makefile.am $(srcdir)/ui/win32/Makefile.am $(srcdir)/ui/xlib/Makefile.am $(srcdir)/unittests/Makefile.am $(srcdir)/z80/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ + esac; +$(srcdir)/compat/Makefile.am $(srcdir)/data/Makefile.am $(srcdir)/data/win32/distribution.mk $(srcdir)/debugger/Makefile.am $(srcdir)/hacking/Makefile.am $(srcdir)/infrastructure/Makefile.am $(srcdir)/lib/Makefile.am $(srcdir)/machines/Makefile.am $(srcdir)/man/Makefile.am $(srcdir)/peripherals/Makefile.am $(srcdir)/perl/Makefile.am $(srcdir)/pokefinder/Makefile.am $(srcdir)/roms/Makefile.am $(srcdir)/sound/Makefile.am $(srcdir)/timer/Makefile.am $(srcdir)/ui/Makefile.am $(srcdir)/ui/fb/Makefile.am $(srcdir)/ui/gtk3/Makefile.am $(srcdir)/ui/null/Makefile.am $(srcdir)/ui/scaler/Makefile.am $(srcdir)/ui/sdl/Makefile.am $(srcdir)/ui/sdl2/Makefile.am $(srcdir)/ui/widget/Makefile.am $(srcdir)/ui/wii/Makefile.am $(srcdir)/ui/win32/Makefile.am $(srcdir)/ui/xlib/Makefile.am $(srcdir)/unittests/Makefile.am $(srcdir)/z80/Makefile.am $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +data/win32/fuse.manifest: $(top_builddir)/config.status $(top_srcdir)/data/win32/fuse.manifest.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +data/win32/installer.nsi: $(top_builddir)/config.status $(top_srcdir)/data/win32/installer.nsi.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +compat/$(am__dirstamp): + @$(MKDIR_P) compat + @: > compat/$(am__dirstamp) +compat/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) compat/$(DEPDIR) + @: > compat/$(DEPDIR)/$(am__dirstamp) +compat/dirname.$(OBJEXT): compat/$(am__dirstamp) \ + compat/$(DEPDIR)/$(am__dirstamp) +compat/getopt.$(OBJEXT): compat/$(am__dirstamp) \ + compat/$(DEPDIR)/$(am__dirstamp) +compat/getopt1.$(OBJEXT): compat/$(am__dirstamp) \ + compat/$(DEPDIR)/$(am__dirstamp) +compat/unix/$(am__dirstamp): + @$(MKDIR_P) compat/unix + @: > compat/unix/$(am__dirstamp) +compat/unix/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) compat/unix/$(DEPDIR) + @: > compat/unix/$(DEPDIR)/$(am__dirstamp) +compat/unix/dir.$(OBJEXT): compat/unix/$(am__dirstamp) \ + compat/unix/$(DEPDIR)/$(am__dirstamp) +compat/unix/file.$(OBJEXT): compat/unix/$(am__dirstamp) \ + compat/unix/$(DEPDIR)/$(am__dirstamp) +compat/amiga/$(am__dirstamp): + @$(MKDIR_P) compat/amiga + @: > compat/amiga/$(am__dirstamp) +compat/amiga/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) compat/amiga/$(DEPDIR) + @: > compat/amiga/$(DEPDIR)/$(am__dirstamp) +compat/amiga/osname.$(OBJEXT): compat/amiga/$(am__dirstamp) \ + compat/amiga/$(DEPDIR)/$(am__dirstamp) +compat/amiga/paths.$(OBJEXT): compat/amiga/$(am__dirstamp) \ + compat/amiga/$(DEPDIR)/$(am__dirstamp) +compat/unix/timer.$(OBJEXT): compat/unix/$(am__dirstamp) \ + compat/unix/$(DEPDIR)/$(am__dirstamp) +compat/unix/osname.$(OBJEXT): compat/unix/$(am__dirstamp) \ + compat/unix/$(DEPDIR)/$(am__dirstamp) +compat/linux/$(am__dirstamp): + @$(MKDIR_P) compat/linux + @: > compat/linux/$(am__dirstamp) +compat/linux/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) compat/linux/$(DEPDIR) + @: > compat/linux/$(DEPDIR)/$(am__dirstamp) +compat/linux/relative_paths.$(OBJEXT): compat/linux/$(am__dirstamp) \ + compat/linux/$(DEPDIR)/$(am__dirstamp) +compat/unix/paths.$(OBJEXT): compat/unix/$(am__dirstamp) \ + compat/unix/$(DEPDIR)/$(am__dirstamp) +compat/unix/socket.$(OBJEXT): compat/unix/$(am__dirstamp) \ + compat/unix/$(DEPDIR)/$(am__dirstamp) +compat/morphos/$(am__dirstamp): + @$(MKDIR_P) compat/morphos + @: > compat/morphos/$(am__dirstamp) +compat/morphos/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) compat/morphos/$(DEPDIR) + @: > compat/morphos/$(DEPDIR)/$(am__dirstamp) +compat/morphos/osname.$(OBJEXT): compat/morphos/$(am__dirstamp) \ + compat/morphos/$(DEPDIR)/$(am__dirstamp) +compat/unix/relative_paths.$(OBJEXT): compat/unix/$(am__dirstamp) \ + compat/unix/$(DEPDIR)/$(am__dirstamp) +compat/wii/$(am__dirstamp): + @$(MKDIR_P) compat/wii + @: > compat/wii/$(am__dirstamp) +compat/wii/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) compat/wii/$(DEPDIR) + @: > compat/wii/$(DEPDIR)/$(am__dirstamp) +compat/wii/osname.$(OBJEXT): compat/wii/$(am__dirstamp) \ + compat/wii/$(DEPDIR)/$(am__dirstamp) +compat/wii/paths.$(OBJEXT): compat/wii/$(am__dirstamp) \ + compat/wii/$(DEPDIR)/$(am__dirstamp) +compat/wii/timer.$(OBJEXT): compat/wii/$(am__dirstamp) \ + compat/wii/$(DEPDIR)/$(am__dirstamp) +compat/win32/$(am__dirstamp): + @$(MKDIR_P) compat/win32 + @: > compat/win32/$(am__dirstamp) +compat/win32/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) compat/win32/$(DEPDIR) + @: > compat/win32/$(DEPDIR)/$(am__dirstamp) +compat/win32/osname.$(OBJEXT): compat/win32/$(am__dirstamp) \ + compat/win32/$(DEPDIR)/$(am__dirstamp) +compat/win32/paths.$(OBJEXT): compat/win32/$(am__dirstamp) \ + compat/win32/$(DEPDIR)/$(am__dirstamp) +compat/win32/timer.$(OBJEXT): compat/win32/$(am__dirstamp) \ + compat/win32/$(DEPDIR)/$(am__dirstamp) +compat/win32/socket.$(OBJEXT): compat/win32/$(am__dirstamp) \ + compat/win32/$(DEPDIR)/$(am__dirstamp) +compat/unix/tuntap.$(OBJEXT): compat/unix/$(am__dirstamp) \ + compat/unix/$(DEPDIR)/$(am__dirstamp) +debugger/$(am__dirstamp): + @$(MKDIR_P) debugger + @: > debugger/$(am__dirstamp) +debugger/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) debugger/$(DEPDIR) + @: > debugger/$(DEPDIR)/$(am__dirstamp) +debugger/breakpoint.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/command.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/commandl.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/commandy.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/debugger.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/disassemble.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/event.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/expression.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/gdbserver.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/gdbserver_remote_commands.$(OBJEXT): \ + debugger/$(am__dirstamp) debugger/$(DEPDIR)/$(am__dirstamp) +debugger/gdbserver_utils.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/system_variable.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/packets.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/variable.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/vfile.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +debugger/vfile_ext.$(OBJEXT): debugger/$(am__dirstamp) \ + debugger/$(DEPDIR)/$(am__dirstamp) +infrastructure/$(am__dirstamp): + @$(MKDIR_P) infrastructure + @: > infrastructure/$(am__dirstamp) +infrastructure/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) infrastructure/$(DEPDIR) + @: > infrastructure/$(DEPDIR)/$(am__dirstamp) +infrastructure/startup_manager.$(OBJEXT): \ + infrastructure/$(am__dirstamp) \ + infrastructure/$(DEPDIR)/$(am__dirstamp) +machines/$(am__dirstamp): + @$(MKDIR_P) machines + @: > machines/$(am__dirstamp) +machines/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) machines/$(DEPDIR) + @: > machines/$(DEPDIR)/$(am__dirstamp) +machines/machines_periph.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/pentagon.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/pentagon512.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/pentagon1024.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/scorpion.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/spec128.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/spec16.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/spec48.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/spec48_ntsc.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/specplus2.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/spec_se.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/specplus2a.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/specplus3.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/specplus3e.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/tc2048.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/tc2068.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +machines/ts2068.$(OBJEXT): machines/$(am__dirstamp) \ + machines/$(DEPDIR)/$(am__dirstamp) +peripherals/$(am__dirstamp): + @$(MKDIR_P) peripherals + @: > peripherals/$(am__dirstamp) +peripherals/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) peripherals/$(DEPDIR) + @: > peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/dck.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/if1.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/if2.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/joystick.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/kempmouse.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/multiface.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/printer.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/scld.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/speccyboot.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/ula.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/usource.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/ttx2000s.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/sound/$(am__dirstamp): + @$(MKDIR_P) peripherals/sound + @: > peripherals/sound/$(am__dirstamp) +peripherals/sound/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) peripherals/sound/$(DEPDIR) + @: > peripherals/sound/$(DEPDIR)/$(am__dirstamp) +peripherals/sound/ay.$(OBJEXT): peripherals/sound/$(am__dirstamp) \ + peripherals/sound/$(DEPDIR)/$(am__dirstamp) +peripherals/sound/covox.$(OBJEXT): peripherals/sound/$(am__dirstamp) \ + peripherals/sound/$(DEPDIR)/$(am__dirstamp) +peripherals/sound/fuller.$(OBJEXT): peripherals/sound/$(am__dirstamp) \ + peripherals/sound/$(DEPDIR)/$(am__dirstamp) +peripherals/sound/melodik.$(OBJEXT): \ + peripherals/sound/$(am__dirstamp) \ + peripherals/sound/$(DEPDIR)/$(am__dirstamp) +peripherals/sound/sp0256.$(OBJEXT): peripherals/sound/$(am__dirstamp) \ + peripherals/sound/$(DEPDIR)/$(am__dirstamp) +peripherals/sound/specdrum.$(OBJEXT): \ + peripherals/sound/$(am__dirstamp) \ + peripherals/sound/$(DEPDIR)/$(am__dirstamp) +peripherals/sound/uspeech.$(OBJEXT): \ + peripherals/sound/$(am__dirstamp) \ + peripherals/sound/$(DEPDIR)/$(am__dirstamp) +peripherals/disk/$(am__dirstamp): + @$(MKDIR_P) peripherals/disk + @: > peripherals/disk/$(am__dirstamp) +peripherals/disk/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) peripherals/disk/$(DEPDIR) + @: > peripherals/disk/$(DEPDIR)/$(am__dirstamp) +peripherals/disk/beta.$(OBJEXT): peripherals/disk/$(am__dirstamp) \ + peripherals/disk/$(DEPDIR)/$(am__dirstamp) +peripherals/disk/crc.$(OBJEXT): peripherals/disk/$(am__dirstamp) \ + peripherals/disk/$(DEPDIR)/$(am__dirstamp) +peripherals/disk/didaktik.$(OBJEXT): peripherals/disk/$(am__dirstamp) \ + peripherals/disk/$(DEPDIR)/$(am__dirstamp) +peripherals/disk/disciple.$(OBJEXT): peripherals/disk/$(am__dirstamp) \ + peripherals/disk/$(DEPDIR)/$(am__dirstamp) +peripherals/disk/disk.$(OBJEXT): peripherals/disk/$(am__dirstamp) \ + peripherals/disk/$(DEPDIR)/$(am__dirstamp) +peripherals/disk/fdd.$(OBJEXT): peripherals/disk/$(am__dirstamp) \ + peripherals/disk/$(DEPDIR)/$(am__dirstamp) +peripherals/disk/opus.$(OBJEXT): peripherals/disk/$(am__dirstamp) \ + peripherals/disk/$(DEPDIR)/$(am__dirstamp) +peripherals/disk/plusd.$(OBJEXT): peripherals/disk/$(am__dirstamp) \ + peripherals/disk/$(DEPDIR)/$(am__dirstamp) +peripherals/disk/trdos.$(OBJEXT): peripherals/disk/$(am__dirstamp) \ + peripherals/disk/$(DEPDIR)/$(am__dirstamp) +peripherals/disk/upd_fdc.$(OBJEXT): peripherals/disk/$(am__dirstamp) \ + peripherals/disk/$(DEPDIR)/$(am__dirstamp) +peripherals/disk/wd_fdc.$(OBJEXT): peripherals/disk/$(am__dirstamp) \ + peripherals/disk/$(DEPDIR)/$(am__dirstamp) +peripherals/ide/$(am__dirstamp): + @$(MKDIR_P) peripherals/ide + @: > peripherals/ide/$(am__dirstamp) +peripherals/ide/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) peripherals/ide/$(DEPDIR) + @: > peripherals/ide/$(DEPDIR)/$(am__dirstamp) +peripherals/ide/divide.$(OBJEXT): peripherals/ide/$(am__dirstamp) \ + peripherals/ide/$(DEPDIR)/$(am__dirstamp) +peripherals/ide/divmmc.$(OBJEXT): peripherals/ide/$(am__dirstamp) \ + peripherals/ide/$(DEPDIR)/$(am__dirstamp) +peripherals/ide/divxxx.$(OBJEXT): peripherals/ide/$(am__dirstamp) \ + peripherals/ide/$(DEPDIR)/$(am__dirstamp) +peripherals/ide/ide.$(OBJEXT): peripherals/ide/$(am__dirstamp) \ + peripherals/ide/$(DEPDIR)/$(am__dirstamp) +peripherals/ide/simpleide.$(OBJEXT): peripherals/ide/$(am__dirstamp) \ + peripherals/ide/$(DEPDIR)/$(am__dirstamp) +peripherals/ide/zxatasp.$(OBJEXT): peripherals/ide/$(am__dirstamp) \ + peripherals/ide/$(DEPDIR)/$(am__dirstamp) +peripherals/ide/zxcf.$(OBJEXT): peripherals/ide/$(am__dirstamp) \ + peripherals/ide/$(DEPDIR)/$(am__dirstamp) +peripherals/ide/zxmmc.$(OBJEXT): peripherals/ide/$(am__dirstamp) \ + peripherals/ide/$(DEPDIR)/$(am__dirstamp) +peripherals/spectranet.$(OBJEXT): peripherals/$(am__dirstamp) \ + peripherals/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/$(am__dirstamp): + @$(MKDIR_P) peripherals/nic + @: > peripherals/nic/$(am__dirstamp) +peripherals/nic/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) peripherals/nic/$(DEPDIR) + @: > peripherals/nic/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/enc28j60.$(OBJEXT): peripherals/nic/$(am__dirstamp) \ + peripherals/nic/$(DEPDIR)/$(am__dirstamp) +peripherals/flash/$(am__dirstamp): + @$(MKDIR_P) peripherals/flash + @: > peripherals/flash/$(am__dirstamp) +peripherals/flash/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) peripherals/flash/$(DEPDIR) + @: > peripherals/flash/$(DEPDIR)/$(am__dirstamp) +peripherals/flash/am29f010.$(OBJEXT): \ + peripherals/flash/$(am__dirstamp) \ + peripherals/flash/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/w5100.$(OBJEXT): peripherals/nic/$(am__dirstamp) \ + peripherals/nic/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/w5100_socket.$(OBJEXT): \ + peripherals/nic/$(am__dirstamp) \ + peripherals/nic/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/dns_resolver.$(OBJEXT): \ + peripherals/nic/$(am__dirstamp) \ + peripherals/nic/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/dns_processor.$(OBJEXT): \ + peripherals/nic/$(am__dirstamp) \ + peripherals/nic/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/engines/$(am__dirstamp): + @$(MKDIR_P) peripherals/nic/engines + @: > peripherals/nic/engines/$(am__dirstamp) +peripherals/nic/engines/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) peripherals/nic/engines/$(DEPDIR) + @: > peripherals/nic/engines/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/engines/engine_argv.$(OBJEXT): \ + peripherals/nic/engines/$(am__dirstamp) \ + peripherals/nic/engines/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/engines/engine_fs.$(OBJEXT): \ + peripherals/nic/engines/$(am__dirstamp) \ + peripherals/nic/engines/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/engines/engine_utf8.$(OBJEXT): \ + peripherals/nic/engines/$(am__dirstamp) \ + peripherals/nic/engines/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/engines/json.$(OBJEXT): \ + peripherals/nic/engines/$(am__dirstamp) \ + peripherals/nic/engines/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/engines/xpath.$(OBJEXT): \ + peripherals/nic/engines/$(am__dirstamp) \ + peripherals/nic/engines/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/engines/jsonpath/$(am__dirstamp): + @$(MKDIR_P) peripherals/nic/engines/jsonpath + @: > peripherals/nic/engines/jsonpath/$(am__dirstamp) +peripherals/nic/engines/jsonpath/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) peripherals/nic/engines/jsonpath/$(DEPDIR) + @: > peripherals/nic/engines/jsonpath/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/engines/jsonpath/ast.$(OBJEXT): \ + peripherals/nic/engines/jsonpath/$(am__dirstamp) \ + peripherals/nic/engines/jsonpath/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/engines/jsonpath/lexer.$(OBJEXT): \ + peripherals/nic/engines/jsonpath/$(am__dirstamp) \ + peripherals/nic/engines/jsonpath/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/engines/jsonpath/matcher.$(OBJEXT): \ + peripherals/nic/engines/jsonpath/$(am__dirstamp) \ + peripherals/nic/engines/jsonpath/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/engines/jsonpath/parser.$(OBJEXT): \ + peripherals/nic/engines/jsonpath/$(am__dirstamp) \ + peripherals/nic/engines/jsonpath/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/engines/parson.$(OBJEXT): \ + peripherals/nic/engines/$(am__dirstamp) \ + peripherals/nic/engines/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/spectranext_controller.$(OBJEXT): \ + peripherals/nic/$(am__dirstamp) \ + peripherals/nic/$(DEPDIR)/$(am__dirstamp) +peripherals/nic/spectranext_stdout.$(OBJEXT): \ + peripherals/nic/$(am__dirstamp) \ + peripherals/nic/$(DEPDIR)/$(am__dirstamp) +peripherals/fs/$(am__dirstamp): + @$(MKDIR_P) peripherals/fs + @: > peripherals/fs/$(am__dirstamp) +peripherals/fs/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) peripherals/fs/$(DEPDIR) + @: > peripherals/fs/$(DEPDIR)/$(am__dirstamp) +peripherals/fs/xfs.$(OBJEXT): peripherals/fs/$(am__dirstamp) \ + peripherals/fs/$(DEPDIR)/$(am__dirstamp) +peripherals/fs/xfs_compat.$(OBJEXT): peripherals/fs/$(am__dirstamp) \ + peripherals/fs/$(DEPDIR)/$(am__dirstamp) +peripherals/fs/xfs_worker.$(OBJEXT): peripherals/fs/$(am__dirstamp) \ + peripherals/fs/$(DEPDIR)/$(am__dirstamp) +peripherals/fs/xfs_fs.$(OBJEXT): peripherals/fs/$(am__dirstamp) \ + peripherals/fs/$(DEPDIR)/$(am__dirstamp) +peripherals/fs/xfs_overlay.$(OBJEXT): peripherals/fs/$(am__dirstamp) \ + peripherals/fs/$(DEPDIR)/$(am__dirstamp) +peripherals/fs/xfs_romfs.$(OBJEXT): peripherals/fs/$(am__dirstamp) \ + peripherals/fs/$(DEPDIR)/$(am__dirstamp) +peripherals/fs/ramfs.$(OBJEXT): peripherals/fs/$(am__dirstamp) \ + peripherals/fs/$(DEPDIR)/$(am__dirstamp) +peripherals/fs/xfs_https.$(OBJEXT): peripherals/fs/$(am__dirstamp) \ + peripherals/fs/$(DEPDIR)/$(am__dirstamp) +peripherals/fs/xfs_https_compat.$(OBJEXT): \ + peripherals/fs/$(am__dirstamp) \ + peripherals/fs/$(DEPDIR)/$(am__dirstamp) +peripherals/http/$(am__dirstamp): + @$(MKDIR_P) peripherals/http + @: > peripherals/http/$(am__dirstamp) +peripherals/http/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) peripherals/http/$(DEPDIR) + @: > peripherals/http/$(DEPDIR)/$(am__dirstamp) +peripherals/http/httpc.$(OBJEXT): peripherals/http/$(am__dirstamp) \ + peripherals/http/$(DEPDIR)/$(am__dirstamp) +peripherals/http/http_sck.$(OBJEXT): peripherals/http/$(am__dirstamp) \ + peripherals/http/$(DEPDIR)/$(am__dirstamp) +peripherals/security/$(am__dirstamp): + @$(MKDIR_P) peripherals/security + @: > peripherals/security/$(am__dirstamp) +peripherals/security/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) peripherals/security/$(DEPDIR) + @: > peripherals/security/$(DEPDIR)/$(am__dirstamp) +peripherals/security/tls.$(OBJEXT): \ + peripherals/security/$(am__dirstamp) \ + peripherals/security/$(DEPDIR)/$(am__dirstamp) +peripherals/security/ssh.$(OBJEXT): \ + peripherals/security/$(am__dirstamp) \ + peripherals/security/$(DEPDIR)/$(am__dirstamp) +pokefinder/$(am__dirstamp): + @$(MKDIR_P) pokefinder + @: > pokefinder/$(am__dirstamp) +pokefinder/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) pokefinder/$(DEPDIR) + @: > pokefinder/$(DEPDIR)/$(am__dirstamp) +pokefinder/pokefinder.$(OBJEXT): pokefinder/$(am__dirstamp) \ + pokefinder/$(DEPDIR)/$(am__dirstamp) +pokefinder/pokemem.$(OBJEXT): pokefinder/$(am__dirstamp) \ + pokefinder/$(DEPDIR)/$(am__dirstamp) +sound/$(am__dirstamp): + @$(MKDIR_P) sound + @: > sound/$(am__dirstamp) +sound/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) sound/$(DEPDIR) + @: > sound/$(DEPDIR)/$(am__dirstamp) +sound/blipbuffer.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +timer/$(am__dirstamp): + @$(MKDIR_P) timer + @: > timer/$(am__dirstamp) +timer/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) timer/$(DEPDIR) + @: > timer/$(DEPDIR)/$(am__dirstamp) +timer/timer.$(OBJEXT): timer/$(am__dirstamp) \ + timer/$(DEPDIR)/$(am__dirstamp) +ui/fb/$(am__dirstamp): + @$(MKDIR_P) ui/fb + @: > ui/fb/$(am__dirstamp) +ui/fb/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ui/fb/$(DEPDIR) + @: > ui/fb/$(DEPDIR)/$(am__dirstamp) +ui/fb/fbdisplay.$(OBJEXT): ui/fb/$(am__dirstamp) \ + ui/fb/$(DEPDIR)/$(am__dirstamp) +ui/fb/fbjoystick.$(OBJEXT): ui/fb/$(am__dirstamp) \ + ui/fb/$(DEPDIR)/$(am__dirstamp) +ui/fb/fbkeyboard.$(OBJEXT): ui/fb/$(am__dirstamp) \ + ui/fb/$(DEPDIR)/$(am__dirstamp) +ui/fb/fbmouse.$(OBJEXT): ui/fb/$(am__dirstamp) \ + ui/fb/$(DEPDIR)/$(am__dirstamp) +ui/fb/fbui.$(OBJEXT): ui/fb/$(am__dirstamp) \ + ui/fb/$(DEPDIR)/$(am__dirstamp) +ui/fb/keysyms.$(OBJEXT): ui/fb/$(am__dirstamp) \ + ui/fb/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/$(am__dirstamp): + @$(MKDIR_P) ui/gtk3 + @: > ui/gtk3/$(am__dirstamp) +ui/gtk3/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ui/gtk3/$(DEPDIR) + @: > ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/binary.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/browse.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/confirm.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/debugger.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/fileselector.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/filter_options.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/gtkdisplay.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/gtkjoystick.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/gtkkeyboard.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/gtkmouse.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/gtkui.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/keysyms.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/menu_data.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/options.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/picture.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/pokefinder.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/pokemem.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/resources.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/rollback.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/roms.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/statusbar.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/stock.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/gtk3/memory.$(OBJEXT): ui/gtk3/$(am__dirstamp) \ + ui/gtk3/$(DEPDIR)/$(am__dirstamp) +ui/null/$(am__dirstamp): + @$(MKDIR_P) ui/null + @: > ui/null/$(am__dirstamp) +ui/null/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ui/null/$(DEPDIR) + @: > ui/null/$(DEPDIR)/$(am__dirstamp) +ui/null/null_ui.$(OBJEXT): ui/null/$(am__dirstamp) \ + ui/null/$(DEPDIR)/$(am__dirstamp) +ui/null/options.$(OBJEXT): ui/null/$(am__dirstamp) \ + ui/null/$(DEPDIR)/$(am__dirstamp) +ui/scaler/$(am__dirstamp): + @$(MKDIR_P) ui/scaler + @: > ui/scaler/$(am__dirstamp) +ui/scaler/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ui/scaler/$(DEPDIR) + @: > ui/scaler/$(DEPDIR)/$(am__dirstamp) +ui/scaler/scaler.$(OBJEXT): ui/scaler/$(am__dirstamp) \ + ui/scaler/$(DEPDIR)/$(am__dirstamp) +ui/scaler/snes_ntsc.$(OBJEXT): ui/scaler/$(am__dirstamp) \ + ui/scaler/$(DEPDIR)/$(am__dirstamp) +ui/sdl/$(am__dirstamp): + @$(MKDIR_P) ui/sdl + @: > ui/sdl/$(am__dirstamp) +ui/sdl/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ui/sdl/$(DEPDIR) + @: > ui/sdl/$(DEPDIR)/$(am__dirstamp) +ui/sdl/sdldisplay.$(OBJEXT): ui/sdl/$(am__dirstamp) \ + ui/sdl/$(DEPDIR)/$(am__dirstamp) +ui/sdl/sdljoystick.$(OBJEXT): ui/sdl/$(am__dirstamp) \ + ui/sdl/$(DEPDIR)/$(am__dirstamp) +ui/sdl/sdlkeyboard.$(OBJEXT): ui/sdl/$(am__dirstamp) \ + ui/sdl/$(DEPDIR)/$(am__dirstamp) +ui/sdl/sdlui.$(OBJEXT): ui/sdl/$(am__dirstamp) \ + ui/sdl/$(DEPDIR)/$(am__dirstamp) +ui/sdl/keysyms.$(OBJEXT): ui/sdl/$(am__dirstamp) \ + ui/sdl/$(DEPDIR)/$(am__dirstamp) +ui/sdl2/$(am__dirstamp): + @$(MKDIR_P) ui/sdl2 + @: > ui/sdl2/$(am__dirstamp) +ui/sdl2/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ui/sdl2/$(DEPDIR) + @: > ui/sdl2/$(DEPDIR)/$(am__dirstamp) +ui/sdl2/sdl2_display_internal.$(OBJEXT): ui/sdl2/$(am__dirstamp) \ + ui/sdl2/$(DEPDIR)/$(am__dirstamp) +ui/sdl2/sdl2_scaler_state.$(OBJEXT): ui/sdl2/$(am__dirstamp) \ + ui/sdl2/$(DEPDIR)/$(am__dirstamp) +ui/sdl2/sdl2_display.$(OBJEXT): ui/sdl2/$(am__dirstamp) \ + ui/sdl2/$(DEPDIR)/$(am__dirstamp) +ui/sdl2/sdl2_joystick_internal.$(OBJEXT): ui/sdl2/$(am__dirstamp) \ + ui/sdl2/$(DEPDIR)/$(am__dirstamp) +ui/sdl2/sdl2_joystick.$(OBJEXT): ui/sdl2/$(am__dirstamp) \ + ui/sdl2/$(DEPDIR)/$(am__dirstamp) +ui/sdl2/sdl2_keyboard.$(OBJEXT): ui/sdl2/$(am__dirstamp) \ + ui/sdl2/$(DEPDIR)/$(am__dirstamp) +ui/sdl2/sdl2_mouse_internal.$(OBJEXT): ui/sdl2/$(am__dirstamp) \ + ui/sdl2/$(DEPDIR)/$(am__dirstamp) +ui/sdl2/sdl2_ui.$(OBJEXT): ui/sdl2/$(am__dirstamp) \ + ui/sdl2/$(DEPDIR)/$(am__dirstamp) +ui/widget/$(am__dirstamp): + @$(MKDIR_P) ui/widget + @: > ui/widget/$(am__dirstamp) +ui/widget/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ui/widget/$(DEPDIR) + @: > ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/about.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/binary.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/browse.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/debugger.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/error.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/filesel.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/memory.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/menu.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/menu_data.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/options.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/picture.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/pokefinder.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/pokemem.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/query.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/roms.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/select.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/text.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/widget/widget.$(OBJEXT): ui/widget/$(am__dirstamp) \ + ui/widget/$(DEPDIR)/$(am__dirstamp) +ui/wii/$(am__dirstamp): + @$(MKDIR_P) ui/wii + @: > ui/wii/$(am__dirstamp) +ui/wii/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ui/wii/$(DEPDIR) + @: > ui/wii/$(DEPDIR)/$(am__dirstamp) +ui/wii/keysyms.$(OBJEXT): ui/wii/$(am__dirstamp) \ + ui/wii/$(DEPDIR)/$(am__dirstamp) +ui/wii/wiidisplay.$(OBJEXT): ui/wii/$(am__dirstamp) \ + ui/wii/$(DEPDIR)/$(am__dirstamp) +ui/wii/wiijoystick.$(OBJEXT): ui/wii/$(am__dirstamp) \ + ui/wii/$(DEPDIR)/$(am__dirstamp) +ui/wii/wiikeyboard.$(OBJEXT): ui/wii/$(am__dirstamp) \ + ui/wii/$(DEPDIR)/$(am__dirstamp) +ui/wii/wiimouse.$(OBJEXT): ui/wii/$(am__dirstamp) \ + ui/wii/$(DEPDIR)/$(am__dirstamp) +ui/wii/wiiui.$(OBJEXT): ui/wii/$(am__dirstamp) \ + ui/wii/$(DEPDIR)/$(am__dirstamp) +ui/win32/$(am__dirstamp): + @$(MKDIR_P) ui/win32 + @: > ui/win32/$(am__dirstamp) +ui/win32/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ui/win32/$(DEPDIR) + @: > ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/about.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/binary.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/browse.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/confirm.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/debugger.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/debuglog.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/fileselector.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/hyperlinks.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/keysyms.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/memorybrowser.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/menu_data.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/options.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/picture.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/pokefinder.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/pokemem.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/rollback.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/roms.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/statusbar.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/win32display.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/win32joystick.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/win32keyboard.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/win32mouse.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/win32ui.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/win32/winsparkle.$(OBJEXT): ui/win32/$(am__dirstamp) \ + ui/win32/$(DEPDIR)/$(am__dirstamp) +ui/xlib/$(am__dirstamp): + @$(MKDIR_P) ui/xlib + @: > ui/xlib/$(am__dirstamp) +ui/xlib/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ui/xlib/$(DEPDIR) + @: > ui/xlib/$(DEPDIR)/$(am__dirstamp) +ui/xlib/keysyms.$(OBJEXT): ui/xlib/$(am__dirstamp) \ + ui/xlib/$(DEPDIR)/$(am__dirstamp) +ui/xlib/xdisplay.$(OBJEXT): ui/xlib/$(am__dirstamp) \ + ui/xlib/$(DEPDIR)/$(am__dirstamp) +ui/xlib/xerror.$(OBJEXT): ui/xlib/$(am__dirstamp) \ + ui/xlib/$(DEPDIR)/$(am__dirstamp) +ui/xlib/xjoystick.$(OBJEXT): ui/xlib/$(am__dirstamp) \ + ui/xlib/$(DEPDIR)/$(am__dirstamp) +ui/xlib/xkeyboard.$(OBJEXT): ui/xlib/$(am__dirstamp) \ + ui/xlib/$(DEPDIR)/$(am__dirstamp) +ui/xlib/xui.$(OBJEXT): ui/xlib/$(am__dirstamp) \ + ui/xlib/$(DEPDIR)/$(am__dirstamp) +unittests/$(am__dirstamp): + @$(MKDIR_P) unittests + @: > unittests/$(am__dirstamp) +unittests/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) unittests/$(DEPDIR) + @: > unittests/$(DEPDIR)/$(am__dirstamp) +unittests/unittests.$(OBJEXT): unittests/$(am__dirstamp) \ + unittests/$(DEPDIR)/$(am__dirstamp) +z80/$(am__dirstamp): + @$(MKDIR_P) z80 + @: > z80/$(am__dirstamp) +z80/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) z80/$(DEPDIR) + @: > z80/$(DEPDIR)/$(am__dirstamp) +z80/z80.$(OBJEXT): z80/$(am__dirstamp) z80/$(DEPDIR)/$(am__dirstamp) +z80/z80_debugger_variables.$(OBJEXT): z80/$(am__dirstamp) \ + z80/$(DEPDIR)/$(am__dirstamp) +z80/z80_ops.$(OBJEXT): z80/$(am__dirstamp) \ + z80/$(DEPDIR)/$(am__dirstamp) +sound/alsasound.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +sound/aosound.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +sound/coreaudiosound.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +sound/dxsound.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +sound/hpsound.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +sound/nullsound.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +sound/osssound.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +sound/pulsesound.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +sound/sdl2sound.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +sound/sdlsound.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +sound/sfifo.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +sound/sunsound.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +sound/wiisound.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +sound/win32sound.$(OBJEXT): sound/$(am__dirstamp) \ + sound/$(DEPDIR)/$(am__dirstamp) +timer/native.$(OBJEXT): timer/$(am__dirstamp) \ + timer/$(DEPDIR)/$(am__dirstamp) +timer/sdl.$(OBJEXT): timer/$(am__dirstamp) \ + timer/$(DEPDIR)/$(am__dirstamp) + +fuse$(EXEEXT): $(fuse_OBJECTS) $(fuse_DEPENDENCIES) $(EXTRA_fuse_DEPENDENCIES) + @rm -f fuse$(EXEEXT) + $(AM_V_CCLD)$(fuse_LINK) $(fuse_OBJECTS) $(fuse_LDADD) $(LIBS) +unittests/displaytest-displaytest.$(OBJEXT): \ + unittests/$(am__dirstamp) unittests/$(DEPDIR)/$(am__dirstamp) + +unittests/displaytest$(EXEEXT): $(unittests_displaytest_OBJECTS) $(unittests_displaytest_DEPENDENCIES) $(EXTRA_unittests_displaytest_DEPENDENCIES) unittests/$(am__dirstamp) + @rm -f unittests/displaytest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(unittests_displaytest_OBJECTS) $(unittests_displaytest_LDADD) $(LIBS) +unittests/palcompositetest-palcompositetest.$(OBJEXT): \ + unittests/$(am__dirstamp) unittests/$(DEPDIR)/$(am__dirstamp) +ui/scaler/unittests_palcompositetest-snes_ntsc.$(OBJEXT): \ + ui/scaler/$(am__dirstamp) ui/scaler/$(DEPDIR)/$(am__dirstamp) + +unittests/palcompositetest$(EXEEXT): $(unittests_palcompositetest_OBJECTS) $(unittests_palcompositetest_DEPENDENCIES) $(EXTRA_unittests_palcompositetest_DEPENDENCIES) unittests/$(am__dirstamp) + @rm -f unittests/palcompositetest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(unittests_palcompositetest_OBJECTS) $(unittests_palcompositetest_LDADD) $(LIBS) +unittests/scalerexpandtest-scalerexpandtest.$(OBJEXT): \ + unittests/$(am__dirstamp) unittests/$(DEPDIR)/$(am__dirstamp) +ui/scaler/unittests_scalerexpandtest-scaler.$(OBJEXT): \ + ui/scaler/$(am__dirstamp) ui/scaler/$(DEPDIR)/$(am__dirstamp) + +unittests/scalerexpandtest$(EXEEXT): $(unittests_scalerexpandtest_OBJECTS) $(unittests_scalerexpandtest_DEPENDENCIES) $(EXTRA_unittests_scalerexpandtest_DEPENDENCIES) unittests/$(am__dirstamp) + @rm -f unittests/scalerexpandtest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(unittests_scalerexpandtest_OBJECTS) $(unittests_scalerexpandtest_LDADD) $(LIBS) +unittests/sdl2displaytest-sdl2displaytest.$(OBJEXT): \ + unittests/$(am__dirstamp) unittests/$(DEPDIR)/$(am__dirstamp) +ui/sdl2/unittests_sdl2displaytest-sdl2_display_internal.$(OBJEXT): \ + ui/sdl2/$(am__dirstamp) ui/sdl2/$(DEPDIR)/$(am__dirstamp) + +unittests/sdl2displaytest$(EXEEXT): $(unittests_sdl2displaytest_OBJECTS) $(unittests_sdl2displaytest_DEPENDENCIES) $(EXTRA_unittests_sdl2displaytest_DEPENDENCIES) unittests/$(am__dirstamp) + @rm -f unittests/sdl2displaytest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(unittests_sdl2displaytest_OBJECTS) $(unittests_sdl2displaytest_LDADD) $(LIBS) +unittests/sdl2joysticktest-sdl2joysticktest.$(OBJEXT): \ + unittests/$(am__dirstamp) unittests/$(DEPDIR)/$(am__dirstamp) +ui/sdl2/unittests_sdl2joysticktest-sdl2_joystick_internal.$(OBJEXT): \ + ui/sdl2/$(am__dirstamp) ui/sdl2/$(DEPDIR)/$(am__dirstamp) + +unittests/sdl2joysticktest$(EXEEXT): $(unittests_sdl2joysticktest_OBJECTS) $(unittests_sdl2joysticktest_DEPENDENCIES) $(EXTRA_unittests_sdl2joysticktest_DEPENDENCIES) unittests/$(am__dirstamp) + @rm -f unittests/sdl2joysticktest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(unittests_sdl2joysticktest_OBJECTS) $(unittests_sdl2joysticktest_LDADD) $(LIBS) +unittests/sdl2mousetest-sdl2mousetest.$(OBJEXT): \ + unittests/$(am__dirstamp) unittests/$(DEPDIR)/$(am__dirstamp) +ui/sdl2/unittests_sdl2mousetest-sdl2_mouse_internal.$(OBJEXT): \ + ui/sdl2/$(am__dirstamp) ui/sdl2/$(DEPDIR)/$(am__dirstamp) + +unittests/sdl2mousetest$(EXEEXT): $(unittests_sdl2mousetest_OBJECTS) $(unittests_sdl2mousetest_DEPENDENCIES) $(EXTRA_unittests_sdl2mousetest_DEPENDENCIES) unittests/$(am__dirstamp) + @rm -f unittests/sdl2mousetest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(unittests_sdl2mousetest_OBJECTS) $(unittests_sdl2mousetest_LDADD) $(LIBS) +unittests/sdl2scalerstatetest-sdl2scalerstatetest.$(OBJEXT): \ + unittests/$(am__dirstamp) unittests/$(DEPDIR)/$(am__dirstamp) +ui/sdl2/unittests_sdl2scalerstatetest-sdl2_scaler_state.$(OBJEXT): \ + ui/sdl2/$(am__dirstamp) ui/sdl2/$(DEPDIR)/$(am__dirstamp) + +unittests/sdl2scalerstatetest$(EXEEXT): $(unittests_sdl2scalerstatetest_OBJECTS) $(unittests_sdl2scalerstatetest_DEPENDENCIES) $(EXTRA_unittests_sdl2scalerstatetest_DEPENDENCIES) unittests/$(am__dirstamp) + @rm -f unittests/sdl2scalerstatetest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(unittests_sdl2scalerstatetest_OBJECTS) $(unittests_sdl2scalerstatetest_LDADD) $(LIBS) +z80/coretest-coretest.$(OBJEXT): z80/$(am__dirstamp) \ + z80/$(DEPDIR)/$(am__dirstamp) +z80/coretest-z80.$(OBJEXT): z80/$(am__dirstamp) \ + z80/$(DEPDIR)/$(am__dirstamp) + +z80/coretest$(EXEEXT): $(z80_coretest_OBJECTS) $(z80_coretest_DEPENDENCIES) $(EXTRA_z80_coretest_DEPENDENCIES) z80/$(am__dirstamp) + @rm -f z80/coretest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(z80_coretest_OBJECTS) $(z80_coretest_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f compat/*.$(OBJEXT) + -rm -f compat/amiga/*.$(OBJEXT) + -rm -f compat/linux/*.$(OBJEXT) + -rm -f compat/morphos/*.$(OBJEXT) + -rm -f compat/unix/*.$(OBJEXT) + -rm -f compat/wii/*.$(OBJEXT) + -rm -f compat/win32/*.$(OBJEXT) + -rm -f debugger/*.$(OBJEXT) + -rm -f infrastructure/*.$(OBJEXT) + -rm -f machines/*.$(OBJEXT) + -rm -f peripherals/*.$(OBJEXT) + -rm -f peripherals/disk/*.$(OBJEXT) + -rm -f peripherals/flash/*.$(OBJEXT) + -rm -f peripherals/fs/*.$(OBJEXT) + -rm -f peripherals/http/*.$(OBJEXT) + -rm -f peripherals/ide/*.$(OBJEXT) + -rm -f peripherals/nic/*.$(OBJEXT) + -rm -f peripherals/nic/engines/*.$(OBJEXT) + -rm -f peripherals/nic/engines/jsonpath/*.$(OBJEXT) + -rm -f peripherals/security/*.$(OBJEXT) + -rm -f peripherals/sound/*.$(OBJEXT) + -rm -f pokefinder/*.$(OBJEXT) + -rm -f sound/*.$(OBJEXT) + -rm -f timer/*.$(OBJEXT) + -rm -f ui/fb/*.$(OBJEXT) + -rm -f ui/gtk3/*.$(OBJEXT) + -rm -f ui/null/*.$(OBJEXT) + -rm -f ui/scaler/*.$(OBJEXT) + -rm -f ui/sdl/*.$(OBJEXT) + -rm -f ui/sdl2/*.$(OBJEXT) + -rm -f ui/widget/*.$(OBJEXT) + -rm -f ui/wii/*.$(OBJEXT) + -rm -f ui/win32/*.$(OBJEXT) + -rm -f ui/xlib/*.$(OBJEXT) + -rm -f unittests/*.$(OBJEXT) + -rm -f z80/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include ./$(DEPDIR)/display.Po # am--include-marker +include ./$(DEPDIR)/event.Po # am--include-marker +include ./$(DEPDIR)/fuse.Po # am--include-marker +include ./$(DEPDIR)/input.Po # am--include-marker +include ./$(DEPDIR)/keyboard.Po # am--include-marker +include ./$(DEPDIR)/loader.Po # am--include-marker +include ./$(DEPDIR)/machine.Po # am--include-marker +include ./$(DEPDIR)/memory_pages.Po # am--include-marker +include ./$(DEPDIR)/mempool.Po # am--include-marker +include ./$(DEPDIR)/menu.Po # am--include-marker +include ./$(DEPDIR)/module.Po # am--include-marker +include ./$(DEPDIR)/movie.Po # am--include-marker +include ./$(DEPDIR)/periph.Po # am--include-marker +include ./$(DEPDIR)/phantom_typist.Po # am--include-marker +include ./$(DEPDIR)/profile.Po # am--include-marker +include ./$(DEPDIR)/psg.Po # am--include-marker +include ./$(DEPDIR)/rectangle.Po # am--include-marker +include ./$(DEPDIR)/rzx.Po # am--include-marker +include ./$(DEPDIR)/screenshot.Po # am--include-marker +include ./$(DEPDIR)/settings.Po # am--include-marker +include ./$(DEPDIR)/slt.Po # am--include-marker +include ./$(DEPDIR)/snapshot.Po # am--include-marker +include ./$(DEPDIR)/sound.Po # am--include-marker +include ./$(DEPDIR)/spectrum.Po # am--include-marker +include ./$(DEPDIR)/svg.Po # am--include-marker +include ./$(DEPDIR)/tape.Po # am--include-marker +include ./$(DEPDIR)/ui.Po # am--include-marker +include ./$(DEPDIR)/uidisplay.Po # am--include-marker +include ./$(DEPDIR)/uimedia.Po # am--include-marker +include ./$(DEPDIR)/unittests_displaytest-display.Po # am--include-marker +include ./$(DEPDIR)/utils.Po # am--include-marker +include compat/$(DEPDIR)/dirname.Po # am--include-marker +include compat/$(DEPDIR)/getopt.Po # am--include-marker +include compat/$(DEPDIR)/getopt1.Po # am--include-marker +include compat/amiga/$(DEPDIR)/osname.Po # am--include-marker +include compat/amiga/$(DEPDIR)/paths.Po # am--include-marker +include compat/linux/$(DEPDIR)/relative_paths.Po # am--include-marker +include compat/morphos/$(DEPDIR)/osname.Po # am--include-marker +include compat/unix/$(DEPDIR)/dir.Po # am--include-marker +include compat/unix/$(DEPDIR)/file.Po # am--include-marker +include compat/unix/$(DEPDIR)/osname.Po # am--include-marker +include compat/unix/$(DEPDIR)/paths.Po # am--include-marker +include compat/unix/$(DEPDIR)/relative_paths.Po # am--include-marker +include compat/unix/$(DEPDIR)/socket.Po # am--include-marker +include compat/unix/$(DEPDIR)/timer.Po # am--include-marker +include compat/unix/$(DEPDIR)/tuntap.Po # am--include-marker +include compat/wii/$(DEPDIR)/osname.Po # am--include-marker +include compat/wii/$(DEPDIR)/paths.Po # am--include-marker +include compat/wii/$(DEPDIR)/timer.Po # am--include-marker +include compat/win32/$(DEPDIR)/osname.Po # am--include-marker +include compat/win32/$(DEPDIR)/paths.Po # am--include-marker +include compat/win32/$(DEPDIR)/socket.Po # am--include-marker +include compat/win32/$(DEPDIR)/timer.Po # am--include-marker +include debugger/$(DEPDIR)/breakpoint.Po # am--include-marker +include debugger/$(DEPDIR)/command.Po # am--include-marker +include debugger/$(DEPDIR)/commandl.Po # am--include-marker +include debugger/$(DEPDIR)/commandy.Po # am--include-marker +include debugger/$(DEPDIR)/debugger.Po # am--include-marker +include debugger/$(DEPDIR)/disassemble.Po # am--include-marker +include debugger/$(DEPDIR)/event.Po # am--include-marker +include debugger/$(DEPDIR)/expression.Po # am--include-marker +include debugger/$(DEPDIR)/gdbserver.Po # am--include-marker +include debugger/$(DEPDIR)/gdbserver_remote_commands.Po # am--include-marker +include debugger/$(DEPDIR)/gdbserver_utils.Po # am--include-marker +include debugger/$(DEPDIR)/packets.Po # am--include-marker +include debugger/$(DEPDIR)/system_variable.Po # am--include-marker +include debugger/$(DEPDIR)/variable.Po # am--include-marker +include debugger/$(DEPDIR)/vfile.Po # am--include-marker +include debugger/$(DEPDIR)/vfile_ext.Po # am--include-marker +include infrastructure/$(DEPDIR)/startup_manager.Po # am--include-marker +include machines/$(DEPDIR)/machines_periph.Po # am--include-marker +include machines/$(DEPDIR)/pentagon.Po # am--include-marker +include machines/$(DEPDIR)/pentagon1024.Po # am--include-marker +include machines/$(DEPDIR)/pentagon512.Po # am--include-marker +include machines/$(DEPDIR)/scorpion.Po # am--include-marker +include machines/$(DEPDIR)/spec128.Po # am--include-marker +include machines/$(DEPDIR)/spec16.Po # am--include-marker +include machines/$(DEPDIR)/spec48.Po # am--include-marker +include machines/$(DEPDIR)/spec48_ntsc.Po # am--include-marker +include machines/$(DEPDIR)/spec_se.Po # am--include-marker +include machines/$(DEPDIR)/specplus2.Po # am--include-marker +include machines/$(DEPDIR)/specplus2a.Po # am--include-marker +include machines/$(DEPDIR)/specplus3.Po # am--include-marker +include machines/$(DEPDIR)/specplus3e.Po # am--include-marker +include machines/$(DEPDIR)/tc2048.Po # am--include-marker +include machines/$(DEPDIR)/tc2068.Po # am--include-marker +include machines/$(DEPDIR)/ts2068.Po # am--include-marker +include peripherals/$(DEPDIR)/dck.Po # am--include-marker +include peripherals/$(DEPDIR)/if1.Po # am--include-marker +include peripherals/$(DEPDIR)/if2.Po # am--include-marker +include peripherals/$(DEPDIR)/joystick.Po # am--include-marker +include peripherals/$(DEPDIR)/kempmouse.Po # am--include-marker +include peripherals/$(DEPDIR)/multiface.Po # am--include-marker +include peripherals/$(DEPDIR)/printer.Po # am--include-marker +include peripherals/$(DEPDIR)/scld.Po # am--include-marker +include peripherals/$(DEPDIR)/speccyboot.Po # am--include-marker +include peripherals/$(DEPDIR)/spectranet.Po # am--include-marker +include peripherals/$(DEPDIR)/ttx2000s.Po # am--include-marker +include peripherals/$(DEPDIR)/ula.Po # am--include-marker +include peripherals/$(DEPDIR)/usource.Po # am--include-marker +include peripherals/disk/$(DEPDIR)/beta.Po # am--include-marker +include peripherals/disk/$(DEPDIR)/crc.Po # am--include-marker +include peripherals/disk/$(DEPDIR)/didaktik.Po # am--include-marker +include peripherals/disk/$(DEPDIR)/disciple.Po # am--include-marker +include peripherals/disk/$(DEPDIR)/disk.Po # am--include-marker +include peripherals/disk/$(DEPDIR)/fdd.Po # am--include-marker +include peripherals/disk/$(DEPDIR)/opus.Po # am--include-marker +include peripherals/disk/$(DEPDIR)/plusd.Po # am--include-marker +include peripherals/disk/$(DEPDIR)/trdos.Po # am--include-marker +include peripherals/disk/$(DEPDIR)/upd_fdc.Po # am--include-marker +include peripherals/disk/$(DEPDIR)/wd_fdc.Po # am--include-marker +include peripherals/flash/$(DEPDIR)/am29f010.Po # am--include-marker +include peripherals/fs/$(DEPDIR)/ramfs.Po # am--include-marker +include peripherals/fs/$(DEPDIR)/xfs.Po # am--include-marker +include peripherals/fs/$(DEPDIR)/xfs_compat.Po # am--include-marker +include peripherals/fs/$(DEPDIR)/xfs_fs.Po # am--include-marker +include peripherals/fs/$(DEPDIR)/xfs_https.Po # am--include-marker +include peripherals/fs/$(DEPDIR)/xfs_https_compat.Po # am--include-marker +include peripherals/fs/$(DEPDIR)/xfs_overlay.Po # am--include-marker +include peripherals/fs/$(DEPDIR)/xfs_romfs.Po # am--include-marker +include peripherals/fs/$(DEPDIR)/xfs_worker.Po # am--include-marker +include peripherals/http/$(DEPDIR)/http_sck.Po # am--include-marker +include peripherals/http/$(DEPDIR)/httpc.Po # am--include-marker +include peripherals/ide/$(DEPDIR)/divide.Po # am--include-marker +include peripherals/ide/$(DEPDIR)/divmmc.Po # am--include-marker +include peripherals/ide/$(DEPDIR)/divxxx.Po # am--include-marker +include peripherals/ide/$(DEPDIR)/ide.Po # am--include-marker +include peripherals/ide/$(DEPDIR)/simpleide.Po # am--include-marker +include peripherals/ide/$(DEPDIR)/zxatasp.Po # am--include-marker +include peripherals/ide/$(DEPDIR)/zxcf.Po # am--include-marker +include peripherals/ide/$(DEPDIR)/zxmmc.Po # am--include-marker +include peripherals/nic/$(DEPDIR)/dns_processor.Po # am--include-marker +include peripherals/nic/$(DEPDIR)/dns_resolver.Po # am--include-marker +include peripherals/nic/$(DEPDIR)/enc28j60.Po # am--include-marker +include peripherals/nic/$(DEPDIR)/spectranext_controller.Po # am--include-marker +include peripherals/nic/$(DEPDIR)/spectranext_stdout.Po # am--include-marker +include peripherals/nic/$(DEPDIR)/w5100.Po # am--include-marker +include peripherals/nic/$(DEPDIR)/w5100_socket.Po # am--include-marker +include peripherals/nic/engines/$(DEPDIR)/engine_argv.Po # am--include-marker +include peripherals/nic/engines/$(DEPDIR)/engine_fs.Po # am--include-marker +include peripherals/nic/engines/$(DEPDIR)/engine_utf8.Po # am--include-marker +include peripherals/nic/engines/$(DEPDIR)/json.Po # am--include-marker +include peripherals/nic/engines/$(DEPDIR)/parson.Po # am--include-marker +include peripherals/nic/engines/$(DEPDIR)/xpath.Po # am--include-marker +include peripherals/nic/engines/jsonpath/$(DEPDIR)/ast.Po # am--include-marker +include peripherals/nic/engines/jsonpath/$(DEPDIR)/lexer.Po # am--include-marker +include peripherals/nic/engines/jsonpath/$(DEPDIR)/matcher.Po # am--include-marker +include peripherals/nic/engines/jsonpath/$(DEPDIR)/parser.Po # am--include-marker +include peripherals/security/$(DEPDIR)/ssh.Po # am--include-marker +include peripherals/security/$(DEPDIR)/tls.Po # am--include-marker +include peripherals/sound/$(DEPDIR)/ay.Po # am--include-marker +include peripherals/sound/$(DEPDIR)/covox.Po # am--include-marker +include peripherals/sound/$(DEPDIR)/fuller.Po # am--include-marker +include peripherals/sound/$(DEPDIR)/melodik.Po # am--include-marker +include peripherals/sound/$(DEPDIR)/sp0256.Po # am--include-marker +include peripherals/sound/$(DEPDIR)/specdrum.Po # am--include-marker +include peripherals/sound/$(DEPDIR)/uspeech.Po # am--include-marker +include pokefinder/$(DEPDIR)/pokefinder.Po # am--include-marker +include pokefinder/$(DEPDIR)/pokemem.Po # am--include-marker +include sound/$(DEPDIR)/alsasound.Po # am--include-marker +include sound/$(DEPDIR)/aosound.Po # am--include-marker +include sound/$(DEPDIR)/blipbuffer.Po # am--include-marker +include sound/$(DEPDIR)/coreaudiosound.Po # am--include-marker +include sound/$(DEPDIR)/dxsound.Po # am--include-marker +include sound/$(DEPDIR)/hpsound.Po # am--include-marker +include sound/$(DEPDIR)/nullsound.Po # am--include-marker +include sound/$(DEPDIR)/osssound.Po # am--include-marker +include sound/$(DEPDIR)/pulsesound.Po # am--include-marker +include sound/$(DEPDIR)/sdl2sound.Po # am--include-marker +include sound/$(DEPDIR)/sdlsound.Po # am--include-marker +include sound/$(DEPDIR)/sfifo.Po # am--include-marker +include sound/$(DEPDIR)/sunsound.Po # am--include-marker +include sound/$(DEPDIR)/wiisound.Po # am--include-marker +include sound/$(DEPDIR)/win32sound.Po # am--include-marker +include timer/$(DEPDIR)/native.Po # am--include-marker +include timer/$(DEPDIR)/sdl.Po # am--include-marker +include timer/$(DEPDIR)/timer.Po # am--include-marker +include ui/fb/$(DEPDIR)/fbdisplay.Po # am--include-marker +include ui/fb/$(DEPDIR)/fbjoystick.Po # am--include-marker +include ui/fb/$(DEPDIR)/fbkeyboard.Po # am--include-marker +include ui/fb/$(DEPDIR)/fbmouse.Po # am--include-marker +include ui/fb/$(DEPDIR)/fbui.Po # am--include-marker +include ui/fb/$(DEPDIR)/keysyms.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/binary.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/browse.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/confirm.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/debugger.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/fileselector.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/filter_options.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/gtkdisplay.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/gtkjoystick.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/gtkkeyboard.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/gtkmouse.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/gtkui.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/keysyms.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/memory.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/menu_data.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/options.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/picture.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/pokefinder.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/pokemem.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/resources.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/rollback.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/roms.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/statusbar.Po # am--include-marker +include ui/gtk3/$(DEPDIR)/stock.Po # am--include-marker +include ui/null/$(DEPDIR)/null_ui.Po # am--include-marker +include ui/null/$(DEPDIR)/options.Po # am--include-marker +include ui/scaler/$(DEPDIR)/scaler.Po # am--include-marker +include ui/scaler/$(DEPDIR)/snes_ntsc.Po # am--include-marker +include ui/scaler/$(DEPDIR)/unittests_palcompositetest-snes_ntsc.Po # am--include-marker +include ui/scaler/$(DEPDIR)/unittests_scalerexpandtest-scaler.Po # am--include-marker +include ui/sdl/$(DEPDIR)/keysyms.Po # am--include-marker +include ui/sdl/$(DEPDIR)/sdldisplay.Po # am--include-marker +include ui/sdl/$(DEPDIR)/sdljoystick.Po # am--include-marker +include ui/sdl/$(DEPDIR)/sdlkeyboard.Po # am--include-marker +include ui/sdl/$(DEPDIR)/sdlui.Po # am--include-marker +include ui/sdl2/$(DEPDIR)/sdl2_display.Po # am--include-marker +include ui/sdl2/$(DEPDIR)/sdl2_display_internal.Po # am--include-marker +include ui/sdl2/$(DEPDIR)/sdl2_joystick.Po # am--include-marker +include ui/sdl2/$(DEPDIR)/sdl2_joystick_internal.Po # am--include-marker +include ui/sdl2/$(DEPDIR)/sdl2_keyboard.Po # am--include-marker +include ui/sdl2/$(DEPDIR)/sdl2_mouse_internal.Po # am--include-marker +include ui/sdl2/$(DEPDIR)/sdl2_scaler_state.Po # am--include-marker +include ui/sdl2/$(DEPDIR)/sdl2_ui.Po # am--include-marker +include ui/sdl2/$(DEPDIR)/unittests_sdl2displaytest-sdl2_display_internal.Po # am--include-marker +include ui/sdl2/$(DEPDIR)/unittests_sdl2joysticktest-sdl2_joystick_internal.Po # am--include-marker +include ui/sdl2/$(DEPDIR)/unittests_sdl2mousetest-sdl2_mouse_internal.Po # am--include-marker +include ui/sdl2/$(DEPDIR)/unittests_sdl2scalerstatetest-sdl2_scaler_state.Po # am--include-marker +include ui/widget/$(DEPDIR)/about.Po # am--include-marker +include ui/widget/$(DEPDIR)/binary.Po # am--include-marker +include ui/widget/$(DEPDIR)/browse.Po # am--include-marker +include ui/widget/$(DEPDIR)/debugger.Po # am--include-marker +include ui/widget/$(DEPDIR)/error.Po # am--include-marker +include ui/widget/$(DEPDIR)/filesel.Po # am--include-marker +include ui/widget/$(DEPDIR)/memory.Po # am--include-marker +include ui/widget/$(DEPDIR)/menu.Po # am--include-marker +include ui/widget/$(DEPDIR)/menu_data.Po # am--include-marker +include ui/widget/$(DEPDIR)/options.Po # am--include-marker +include ui/widget/$(DEPDIR)/picture.Po # am--include-marker +include ui/widget/$(DEPDIR)/pokefinder.Po # am--include-marker +include ui/widget/$(DEPDIR)/pokemem.Po # am--include-marker +include ui/widget/$(DEPDIR)/query.Po # am--include-marker +include ui/widget/$(DEPDIR)/roms.Po # am--include-marker +include ui/widget/$(DEPDIR)/select.Po # am--include-marker +include ui/widget/$(DEPDIR)/text.Po # am--include-marker +include ui/widget/$(DEPDIR)/widget.Po # am--include-marker +include ui/wii/$(DEPDIR)/keysyms.Po # am--include-marker +include ui/wii/$(DEPDIR)/wiidisplay.Po # am--include-marker +include ui/wii/$(DEPDIR)/wiijoystick.Po # am--include-marker +include ui/wii/$(DEPDIR)/wiikeyboard.Po # am--include-marker +include ui/wii/$(DEPDIR)/wiimouse.Po # am--include-marker +include ui/wii/$(DEPDIR)/wiiui.Po # am--include-marker +include ui/win32/$(DEPDIR)/about.Po # am--include-marker +include ui/win32/$(DEPDIR)/binary.Po # am--include-marker +include ui/win32/$(DEPDIR)/browse.Po # am--include-marker +include ui/win32/$(DEPDIR)/confirm.Po # am--include-marker +include ui/win32/$(DEPDIR)/debugger.Po # am--include-marker +include ui/win32/$(DEPDIR)/debuglog.Po # am--include-marker +include ui/win32/$(DEPDIR)/fileselector.Po # am--include-marker +include ui/win32/$(DEPDIR)/hyperlinks.Po # am--include-marker +include ui/win32/$(DEPDIR)/keysyms.Po # am--include-marker +include ui/win32/$(DEPDIR)/memorybrowser.Po # am--include-marker +include ui/win32/$(DEPDIR)/menu_data.Po # am--include-marker +include ui/win32/$(DEPDIR)/options.Po # am--include-marker +include ui/win32/$(DEPDIR)/picture.Po # am--include-marker +include ui/win32/$(DEPDIR)/pokefinder.Po # am--include-marker +include ui/win32/$(DEPDIR)/pokemem.Po # am--include-marker +include ui/win32/$(DEPDIR)/rollback.Po # am--include-marker +include ui/win32/$(DEPDIR)/roms.Po # am--include-marker +include ui/win32/$(DEPDIR)/statusbar.Po # am--include-marker +include ui/win32/$(DEPDIR)/win32display.Po # am--include-marker +include ui/win32/$(DEPDIR)/win32joystick.Po # am--include-marker +include ui/win32/$(DEPDIR)/win32keyboard.Po # am--include-marker +include ui/win32/$(DEPDIR)/win32mouse.Po # am--include-marker +include ui/win32/$(DEPDIR)/win32ui.Po # am--include-marker +include ui/win32/$(DEPDIR)/winsparkle.Po # am--include-marker +include ui/xlib/$(DEPDIR)/keysyms.Po # am--include-marker +include ui/xlib/$(DEPDIR)/xdisplay.Po # am--include-marker +include ui/xlib/$(DEPDIR)/xerror.Po # am--include-marker +include ui/xlib/$(DEPDIR)/xjoystick.Po # am--include-marker +include ui/xlib/$(DEPDIR)/xkeyboard.Po # am--include-marker +include ui/xlib/$(DEPDIR)/xui.Po # am--include-marker +include unittests/$(DEPDIR)/displaytest-displaytest.Po # am--include-marker +include unittests/$(DEPDIR)/palcompositetest-palcompositetest.Po # am--include-marker +include unittests/$(DEPDIR)/scalerexpandtest-scalerexpandtest.Po # am--include-marker +include unittests/$(DEPDIR)/sdl2displaytest-sdl2displaytest.Po # am--include-marker +include unittests/$(DEPDIR)/sdl2joysticktest-sdl2joysticktest.Po # am--include-marker +include unittests/$(DEPDIR)/sdl2mousetest-sdl2mousetest.Po # am--include-marker +include unittests/$(DEPDIR)/sdl2scalerstatetest-sdl2scalerstatetest.Po # am--include-marker +include unittests/$(DEPDIR)/unittests.Po # am--include-marker +include z80/$(DEPDIR)/coretest-coretest.Po # am--include-marker +include z80/$(DEPDIR)/coretest-z80.Po # am--include-marker +include z80/$(DEPDIR)/z80.Po # am--include-marker +include z80/$(DEPDIR)/z80_debugger_variables.Po # am--include-marker +include z80/$(DEPDIR)/z80_ops.Po # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: + $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ + $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ + $(am__mv) $$depbase.Tpo $$depbase.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(COMPILE) -c -o $@ $< + +.c.obj: + $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ + $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ + $(am__mv) $$depbase.Tpo $$depbase.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: + $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ + $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ + $(am__mv) $$depbase.Tpo $$depbase.Plo +# $(AM_V_CC)source='$<' object='$@' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(LTCOMPILE) -c -o $@ $< + +unittests/displaytest-displaytest.o: unittests/displaytest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/displaytest-displaytest.o -MD -MP -MF unittests/$(DEPDIR)/displaytest-displaytest.Tpo -c -o unittests/displaytest-displaytest.o `test -f 'unittests/displaytest.c' || echo '$(srcdir)/'`unittests/displaytest.c + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/displaytest-displaytest.Tpo unittests/$(DEPDIR)/displaytest-displaytest.Po +# $(AM_V_CC)source='unittests/displaytest.c' object='unittests/displaytest-displaytest.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/displaytest-displaytest.o `test -f 'unittests/displaytest.c' || echo '$(srcdir)/'`unittests/displaytest.c + +unittests/displaytest-displaytest.obj: unittests/displaytest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/displaytest-displaytest.obj -MD -MP -MF unittests/$(DEPDIR)/displaytest-displaytest.Tpo -c -o unittests/displaytest-displaytest.obj `if test -f 'unittests/displaytest.c'; then $(CYGPATH_W) 'unittests/displaytest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/displaytest.c'; fi` + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/displaytest-displaytest.Tpo unittests/$(DEPDIR)/displaytest-displaytest.Po +# $(AM_V_CC)source='unittests/displaytest.c' object='unittests/displaytest-displaytest.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/displaytest-displaytest.obj `if test -f 'unittests/displaytest.c'; then $(CYGPATH_W) 'unittests/displaytest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/displaytest.c'; fi` + +unittests_displaytest-display.o: display.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests_displaytest-display.o -MD -MP -MF $(DEPDIR)/unittests_displaytest-display.Tpo -c -o unittests_displaytest-display.o `test -f 'display.c' || echo '$(srcdir)/'`display.c + $(AM_V_at)$(am__mv) $(DEPDIR)/unittests_displaytest-display.Tpo $(DEPDIR)/unittests_displaytest-display.Po +# $(AM_V_CC)source='display.c' object='unittests_displaytest-display.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests_displaytest-display.o `test -f 'display.c' || echo '$(srcdir)/'`display.c + +unittests_displaytest-display.obj: display.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests_displaytest-display.obj -MD -MP -MF $(DEPDIR)/unittests_displaytest-display.Tpo -c -o unittests_displaytest-display.obj `if test -f 'display.c'; then $(CYGPATH_W) 'display.c'; else $(CYGPATH_W) '$(srcdir)/display.c'; fi` + $(AM_V_at)$(am__mv) $(DEPDIR)/unittests_displaytest-display.Tpo $(DEPDIR)/unittests_displaytest-display.Po +# $(AM_V_CC)source='display.c' object='unittests_displaytest-display.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests_displaytest-display.obj `if test -f 'display.c'; then $(CYGPATH_W) 'display.c'; else $(CYGPATH_W) '$(srcdir)/display.c'; fi` + +unittests/palcompositetest-palcompositetest.o: unittests/palcompositetest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_palcompositetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/palcompositetest-palcompositetest.o -MD -MP -MF unittests/$(DEPDIR)/palcompositetest-palcompositetest.Tpo -c -o unittests/palcompositetest-palcompositetest.o `test -f 'unittests/palcompositetest.c' || echo '$(srcdir)/'`unittests/palcompositetest.c + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/palcompositetest-palcompositetest.Tpo unittests/$(DEPDIR)/palcompositetest-palcompositetest.Po +# $(AM_V_CC)source='unittests/palcompositetest.c' object='unittests/palcompositetest-palcompositetest.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_palcompositetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/palcompositetest-palcompositetest.o `test -f 'unittests/palcompositetest.c' || echo '$(srcdir)/'`unittests/palcompositetest.c + +unittests/palcompositetest-palcompositetest.obj: unittests/palcompositetest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_palcompositetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/palcompositetest-palcompositetest.obj -MD -MP -MF unittests/$(DEPDIR)/palcompositetest-palcompositetest.Tpo -c -o unittests/palcompositetest-palcompositetest.obj `if test -f 'unittests/palcompositetest.c'; then $(CYGPATH_W) 'unittests/palcompositetest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/palcompositetest.c'; fi` + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/palcompositetest-palcompositetest.Tpo unittests/$(DEPDIR)/palcompositetest-palcompositetest.Po +# $(AM_V_CC)source='unittests/palcompositetest.c' object='unittests/palcompositetest-palcompositetest.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_palcompositetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/palcompositetest-palcompositetest.obj `if test -f 'unittests/palcompositetest.c'; then $(CYGPATH_W) 'unittests/palcompositetest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/palcompositetest.c'; fi` + +ui/scaler/unittests_palcompositetest-snes_ntsc.o: ui/scaler/snes_ntsc.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_palcompositetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ui/scaler/unittests_palcompositetest-snes_ntsc.o -MD -MP -MF ui/scaler/$(DEPDIR)/unittests_palcompositetest-snes_ntsc.Tpo -c -o ui/scaler/unittests_palcompositetest-snes_ntsc.o `test -f 'ui/scaler/snes_ntsc.c' || echo '$(srcdir)/'`ui/scaler/snes_ntsc.c + $(AM_V_at)$(am__mv) ui/scaler/$(DEPDIR)/unittests_palcompositetest-snes_ntsc.Tpo ui/scaler/$(DEPDIR)/unittests_palcompositetest-snes_ntsc.Po +# $(AM_V_CC)source='ui/scaler/snes_ntsc.c' object='ui/scaler/unittests_palcompositetest-snes_ntsc.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_palcompositetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ui/scaler/unittests_palcompositetest-snes_ntsc.o `test -f 'ui/scaler/snes_ntsc.c' || echo '$(srcdir)/'`ui/scaler/snes_ntsc.c + +ui/scaler/unittests_palcompositetest-snes_ntsc.obj: ui/scaler/snes_ntsc.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_palcompositetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ui/scaler/unittests_palcompositetest-snes_ntsc.obj -MD -MP -MF ui/scaler/$(DEPDIR)/unittests_palcompositetest-snes_ntsc.Tpo -c -o ui/scaler/unittests_palcompositetest-snes_ntsc.obj `if test -f 'ui/scaler/snes_ntsc.c'; then $(CYGPATH_W) 'ui/scaler/snes_ntsc.c'; else $(CYGPATH_W) '$(srcdir)/ui/scaler/snes_ntsc.c'; fi` + $(AM_V_at)$(am__mv) ui/scaler/$(DEPDIR)/unittests_palcompositetest-snes_ntsc.Tpo ui/scaler/$(DEPDIR)/unittests_palcompositetest-snes_ntsc.Po +# $(AM_V_CC)source='ui/scaler/snes_ntsc.c' object='ui/scaler/unittests_palcompositetest-snes_ntsc.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_palcompositetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ui/scaler/unittests_palcompositetest-snes_ntsc.obj `if test -f 'ui/scaler/snes_ntsc.c'; then $(CYGPATH_W) 'ui/scaler/snes_ntsc.c'; else $(CYGPATH_W) '$(srcdir)/ui/scaler/snes_ntsc.c'; fi` + +unittests/scalerexpandtest-scalerexpandtest.o: unittests/scalerexpandtest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_scalerexpandtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/scalerexpandtest-scalerexpandtest.o -MD -MP -MF unittests/$(DEPDIR)/scalerexpandtest-scalerexpandtest.Tpo -c -o unittests/scalerexpandtest-scalerexpandtest.o `test -f 'unittests/scalerexpandtest.c' || echo '$(srcdir)/'`unittests/scalerexpandtest.c + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/scalerexpandtest-scalerexpandtest.Tpo unittests/$(DEPDIR)/scalerexpandtest-scalerexpandtest.Po +# $(AM_V_CC)source='unittests/scalerexpandtest.c' object='unittests/scalerexpandtest-scalerexpandtest.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_scalerexpandtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/scalerexpandtest-scalerexpandtest.o `test -f 'unittests/scalerexpandtest.c' || echo '$(srcdir)/'`unittests/scalerexpandtest.c + +unittests/scalerexpandtest-scalerexpandtest.obj: unittests/scalerexpandtest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_scalerexpandtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/scalerexpandtest-scalerexpandtest.obj -MD -MP -MF unittests/$(DEPDIR)/scalerexpandtest-scalerexpandtest.Tpo -c -o unittests/scalerexpandtest-scalerexpandtest.obj `if test -f 'unittests/scalerexpandtest.c'; then $(CYGPATH_W) 'unittests/scalerexpandtest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/scalerexpandtest.c'; fi` + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/scalerexpandtest-scalerexpandtest.Tpo unittests/$(DEPDIR)/scalerexpandtest-scalerexpandtest.Po +# $(AM_V_CC)source='unittests/scalerexpandtest.c' object='unittests/scalerexpandtest-scalerexpandtest.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_scalerexpandtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/scalerexpandtest-scalerexpandtest.obj `if test -f 'unittests/scalerexpandtest.c'; then $(CYGPATH_W) 'unittests/scalerexpandtest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/scalerexpandtest.c'; fi` + +ui/scaler/unittests_scalerexpandtest-scaler.o: ui/scaler/scaler.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_scalerexpandtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ui/scaler/unittests_scalerexpandtest-scaler.o -MD -MP -MF ui/scaler/$(DEPDIR)/unittests_scalerexpandtest-scaler.Tpo -c -o ui/scaler/unittests_scalerexpandtest-scaler.o `test -f 'ui/scaler/scaler.c' || echo '$(srcdir)/'`ui/scaler/scaler.c + $(AM_V_at)$(am__mv) ui/scaler/$(DEPDIR)/unittests_scalerexpandtest-scaler.Tpo ui/scaler/$(DEPDIR)/unittests_scalerexpandtest-scaler.Po +# $(AM_V_CC)source='ui/scaler/scaler.c' object='ui/scaler/unittests_scalerexpandtest-scaler.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_scalerexpandtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ui/scaler/unittests_scalerexpandtest-scaler.o `test -f 'ui/scaler/scaler.c' || echo '$(srcdir)/'`ui/scaler/scaler.c + +ui/scaler/unittests_scalerexpandtest-scaler.obj: ui/scaler/scaler.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_scalerexpandtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ui/scaler/unittests_scalerexpandtest-scaler.obj -MD -MP -MF ui/scaler/$(DEPDIR)/unittests_scalerexpandtest-scaler.Tpo -c -o ui/scaler/unittests_scalerexpandtest-scaler.obj `if test -f 'ui/scaler/scaler.c'; then $(CYGPATH_W) 'ui/scaler/scaler.c'; else $(CYGPATH_W) '$(srcdir)/ui/scaler/scaler.c'; fi` + $(AM_V_at)$(am__mv) ui/scaler/$(DEPDIR)/unittests_scalerexpandtest-scaler.Tpo ui/scaler/$(DEPDIR)/unittests_scalerexpandtest-scaler.Po +# $(AM_V_CC)source='ui/scaler/scaler.c' object='ui/scaler/unittests_scalerexpandtest-scaler.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_scalerexpandtest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ui/scaler/unittests_scalerexpandtest-scaler.obj `if test -f 'ui/scaler/scaler.c'; then $(CYGPATH_W) 'ui/scaler/scaler.c'; else $(CYGPATH_W) '$(srcdir)/ui/scaler/scaler.c'; fi` + +unittests/sdl2displaytest-sdl2displaytest.o: unittests/sdl2displaytest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/sdl2displaytest-sdl2displaytest.o -MD -MP -MF unittests/$(DEPDIR)/sdl2displaytest-sdl2displaytest.Tpo -c -o unittests/sdl2displaytest-sdl2displaytest.o `test -f 'unittests/sdl2displaytest.c' || echo '$(srcdir)/'`unittests/sdl2displaytest.c + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/sdl2displaytest-sdl2displaytest.Tpo unittests/$(DEPDIR)/sdl2displaytest-sdl2displaytest.Po +# $(AM_V_CC)source='unittests/sdl2displaytest.c' object='unittests/sdl2displaytest-sdl2displaytest.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/sdl2displaytest-sdl2displaytest.o `test -f 'unittests/sdl2displaytest.c' || echo '$(srcdir)/'`unittests/sdl2displaytest.c + +unittests/sdl2displaytest-sdl2displaytest.obj: unittests/sdl2displaytest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/sdl2displaytest-sdl2displaytest.obj -MD -MP -MF unittests/$(DEPDIR)/sdl2displaytest-sdl2displaytest.Tpo -c -o unittests/sdl2displaytest-sdl2displaytest.obj `if test -f 'unittests/sdl2displaytest.c'; then $(CYGPATH_W) 'unittests/sdl2displaytest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/sdl2displaytest.c'; fi` + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/sdl2displaytest-sdl2displaytest.Tpo unittests/$(DEPDIR)/sdl2displaytest-sdl2displaytest.Po +# $(AM_V_CC)source='unittests/sdl2displaytest.c' object='unittests/sdl2displaytest-sdl2displaytest.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/sdl2displaytest-sdl2displaytest.obj `if test -f 'unittests/sdl2displaytest.c'; then $(CYGPATH_W) 'unittests/sdl2displaytest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/sdl2displaytest.c'; fi` + +ui/sdl2/unittests_sdl2displaytest-sdl2_display_internal.o: ui/sdl2/sdl2_display_internal.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ui/sdl2/unittests_sdl2displaytest-sdl2_display_internal.o -MD -MP -MF ui/sdl2/$(DEPDIR)/unittests_sdl2displaytest-sdl2_display_internal.Tpo -c -o ui/sdl2/unittests_sdl2displaytest-sdl2_display_internal.o `test -f 'ui/sdl2/sdl2_display_internal.c' || echo '$(srcdir)/'`ui/sdl2/sdl2_display_internal.c + $(AM_V_at)$(am__mv) ui/sdl2/$(DEPDIR)/unittests_sdl2displaytest-sdl2_display_internal.Tpo ui/sdl2/$(DEPDIR)/unittests_sdl2displaytest-sdl2_display_internal.Po +# $(AM_V_CC)source='ui/sdl2/sdl2_display_internal.c' object='ui/sdl2/unittests_sdl2displaytest-sdl2_display_internal.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ui/sdl2/unittests_sdl2displaytest-sdl2_display_internal.o `test -f 'ui/sdl2/sdl2_display_internal.c' || echo '$(srcdir)/'`ui/sdl2/sdl2_display_internal.c + +ui/sdl2/unittests_sdl2displaytest-sdl2_display_internal.obj: ui/sdl2/sdl2_display_internal.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ui/sdl2/unittests_sdl2displaytest-sdl2_display_internal.obj -MD -MP -MF ui/sdl2/$(DEPDIR)/unittests_sdl2displaytest-sdl2_display_internal.Tpo -c -o ui/sdl2/unittests_sdl2displaytest-sdl2_display_internal.obj `if test -f 'ui/sdl2/sdl2_display_internal.c'; then $(CYGPATH_W) 'ui/sdl2/sdl2_display_internal.c'; else $(CYGPATH_W) '$(srcdir)/ui/sdl2/sdl2_display_internal.c'; fi` + $(AM_V_at)$(am__mv) ui/sdl2/$(DEPDIR)/unittests_sdl2displaytest-sdl2_display_internal.Tpo ui/sdl2/$(DEPDIR)/unittests_sdl2displaytest-sdl2_display_internal.Po +# $(AM_V_CC)source='ui/sdl2/sdl2_display_internal.c' object='ui/sdl2/unittests_sdl2displaytest-sdl2_display_internal.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2displaytest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ui/sdl2/unittests_sdl2displaytest-sdl2_display_internal.obj `if test -f 'ui/sdl2/sdl2_display_internal.c'; then $(CYGPATH_W) 'ui/sdl2/sdl2_display_internal.c'; else $(CYGPATH_W) '$(srcdir)/ui/sdl2/sdl2_display_internal.c'; fi` + +unittests/sdl2joysticktest-sdl2joysticktest.o: unittests/sdl2joysticktest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2joysticktest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/sdl2joysticktest-sdl2joysticktest.o -MD -MP -MF unittests/$(DEPDIR)/sdl2joysticktest-sdl2joysticktest.Tpo -c -o unittests/sdl2joysticktest-sdl2joysticktest.o `test -f 'unittests/sdl2joysticktest.c' || echo '$(srcdir)/'`unittests/sdl2joysticktest.c + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/sdl2joysticktest-sdl2joysticktest.Tpo unittests/$(DEPDIR)/sdl2joysticktest-sdl2joysticktest.Po +# $(AM_V_CC)source='unittests/sdl2joysticktest.c' object='unittests/sdl2joysticktest-sdl2joysticktest.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2joysticktest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/sdl2joysticktest-sdl2joysticktest.o `test -f 'unittests/sdl2joysticktest.c' || echo '$(srcdir)/'`unittests/sdl2joysticktest.c + +unittests/sdl2joysticktest-sdl2joysticktest.obj: unittests/sdl2joysticktest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2joysticktest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/sdl2joysticktest-sdl2joysticktest.obj -MD -MP -MF unittests/$(DEPDIR)/sdl2joysticktest-sdl2joysticktest.Tpo -c -o unittests/sdl2joysticktest-sdl2joysticktest.obj `if test -f 'unittests/sdl2joysticktest.c'; then $(CYGPATH_W) 'unittests/sdl2joysticktest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/sdl2joysticktest.c'; fi` + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/sdl2joysticktest-sdl2joysticktest.Tpo unittests/$(DEPDIR)/sdl2joysticktest-sdl2joysticktest.Po +# $(AM_V_CC)source='unittests/sdl2joysticktest.c' object='unittests/sdl2joysticktest-sdl2joysticktest.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2joysticktest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/sdl2joysticktest-sdl2joysticktest.obj `if test -f 'unittests/sdl2joysticktest.c'; then $(CYGPATH_W) 'unittests/sdl2joysticktest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/sdl2joysticktest.c'; fi` + +ui/sdl2/unittests_sdl2joysticktest-sdl2_joystick_internal.o: ui/sdl2/sdl2_joystick_internal.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2joysticktest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ui/sdl2/unittests_sdl2joysticktest-sdl2_joystick_internal.o -MD -MP -MF ui/sdl2/$(DEPDIR)/unittests_sdl2joysticktest-sdl2_joystick_internal.Tpo -c -o ui/sdl2/unittests_sdl2joysticktest-sdl2_joystick_internal.o `test -f 'ui/sdl2/sdl2_joystick_internal.c' || echo '$(srcdir)/'`ui/sdl2/sdl2_joystick_internal.c + $(AM_V_at)$(am__mv) ui/sdl2/$(DEPDIR)/unittests_sdl2joysticktest-sdl2_joystick_internal.Tpo ui/sdl2/$(DEPDIR)/unittests_sdl2joysticktest-sdl2_joystick_internal.Po +# $(AM_V_CC)source='ui/sdl2/sdl2_joystick_internal.c' object='ui/sdl2/unittests_sdl2joysticktest-sdl2_joystick_internal.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2joysticktest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ui/sdl2/unittests_sdl2joysticktest-sdl2_joystick_internal.o `test -f 'ui/sdl2/sdl2_joystick_internal.c' || echo '$(srcdir)/'`ui/sdl2/sdl2_joystick_internal.c + +ui/sdl2/unittests_sdl2joysticktest-sdl2_joystick_internal.obj: ui/sdl2/sdl2_joystick_internal.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2joysticktest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ui/sdl2/unittests_sdl2joysticktest-sdl2_joystick_internal.obj -MD -MP -MF ui/sdl2/$(DEPDIR)/unittests_sdl2joysticktest-sdl2_joystick_internal.Tpo -c -o ui/sdl2/unittests_sdl2joysticktest-sdl2_joystick_internal.obj `if test -f 'ui/sdl2/sdl2_joystick_internal.c'; then $(CYGPATH_W) 'ui/sdl2/sdl2_joystick_internal.c'; else $(CYGPATH_W) '$(srcdir)/ui/sdl2/sdl2_joystick_internal.c'; fi` + $(AM_V_at)$(am__mv) ui/sdl2/$(DEPDIR)/unittests_sdl2joysticktest-sdl2_joystick_internal.Tpo ui/sdl2/$(DEPDIR)/unittests_sdl2joysticktest-sdl2_joystick_internal.Po +# $(AM_V_CC)source='ui/sdl2/sdl2_joystick_internal.c' object='ui/sdl2/unittests_sdl2joysticktest-sdl2_joystick_internal.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2joysticktest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ui/sdl2/unittests_sdl2joysticktest-sdl2_joystick_internal.obj `if test -f 'ui/sdl2/sdl2_joystick_internal.c'; then $(CYGPATH_W) 'ui/sdl2/sdl2_joystick_internal.c'; else $(CYGPATH_W) '$(srcdir)/ui/sdl2/sdl2_joystick_internal.c'; fi` + +unittests/sdl2mousetest-sdl2mousetest.o: unittests/sdl2mousetest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2mousetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/sdl2mousetest-sdl2mousetest.o -MD -MP -MF unittests/$(DEPDIR)/sdl2mousetest-sdl2mousetest.Tpo -c -o unittests/sdl2mousetest-sdl2mousetest.o `test -f 'unittests/sdl2mousetest.c' || echo '$(srcdir)/'`unittests/sdl2mousetest.c + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/sdl2mousetest-sdl2mousetest.Tpo unittests/$(DEPDIR)/sdl2mousetest-sdl2mousetest.Po +# $(AM_V_CC)source='unittests/sdl2mousetest.c' object='unittests/sdl2mousetest-sdl2mousetest.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2mousetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/sdl2mousetest-sdl2mousetest.o `test -f 'unittests/sdl2mousetest.c' || echo '$(srcdir)/'`unittests/sdl2mousetest.c + +unittests/sdl2mousetest-sdl2mousetest.obj: unittests/sdl2mousetest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2mousetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/sdl2mousetest-sdl2mousetest.obj -MD -MP -MF unittests/$(DEPDIR)/sdl2mousetest-sdl2mousetest.Tpo -c -o unittests/sdl2mousetest-sdl2mousetest.obj `if test -f 'unittests/sdl2mousetest.c'; then $(CYGPATH_W) 'unittests/sdl2mousetest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/sdl2mousetest.c'; fi` + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/sdl2mousetest-sdl2mousetest.Tpo unittests/$(DEPDIR)/sdl2mousetest-sdl2mousetest.Po +# $(AM_V_CC)source='unittests/sdl2mousetest.c' object='unittests/sdl2mousetest-sdl2mousetest.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2mousetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/sdl2mousetest-sdl2mousetest.obj `if test -f 'unittests/sdl2mousetest.c'; then $(CYGPATH_W) 'unittests/sdl2mousetest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/sdl2mousetest.c'; fi` + +ui/sdl2/unittests_sdl2mousetest-sdl2_mouse_internal.o: ui/sdl2/sdl2_mouse_internal.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2mousetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ui/sdl2/unittests_sdl2mousetest-sdl2_mouse_internal.o -MD -MP -MF ui/sdl2/$(DEPDIR)/unittests_sdl2mousetest-sdl2_mouse_internal.Tpo -c -o ui/sdl2/unittests_sdl2mousetest-sdl2_mouse_internal.o `test -f 'ui/sdl2/sdl2_mouse_internal.c' || echo '$(srcdir)/'`ui/sdl2/sdl2_mouse_internal.c + $(AM_V_at)$(am__mv) ui/sdl2/$(DEPDIR)/unittests_sdl2mousetest-sdl2_mouse_internal.Tpo ui/sdl2/$(DEPDIR)/unittests_sdl2mousetest-sdl2_mouse_internal.Po +# $(AM_V_CC)source='ui/sdl2/sdl2_mouse_internal.c' object='ui/sdl2/unittests_sdl2mousetest-sdl2_mouse_internal.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2mousetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ui/sdl2/unittests_sdl2mousetest-sdl2_mouse_internal.o `test -f 'ui/sdl2/sdl2_mouse_internal.c' || echo '$(srcdir)/'`ui/sdl2/sdl2_mouse_internal.c + +ui/sdl2/unittests_sdl2mousetest-sdl2_mouse_internal.obj: ui/sdl2/sdl2_mouse_internal.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2mousetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ui/sdl2/unittests_sdl2mousetest-sdl2_mouse_internal.obj -MD -MP -MF ui/sdl2/$(DEPDIR)/unittests_sdl2mousetest-sdl2_mouse_internal.Tpo -c -o ui/sdl2/unittests_sdl2mousetest-sdl2_mouse_internal.obj `if test -f 'ui/sdl2/sdl2_mouse_internal.c'; then $(CYGPATH_W) 'ui/sdl2/sdl2_mouse_internal.c'; else $(CYGPATH_W) '$(srcdir)/ui/sdl2/sdl2_mouse_internal.c'; fi` + $(AM_V_at)$(am__mv) ui/sdl2/$(DEPDIR)/unittests_sdl2mousetest-sdl2_mouse_internal.Tpo ui/sdl2/$(DEPDIR)/unittests_sdl2mousetest-sdl2_mouse_internal.Po +# $(AM_V_CC)source='ui/sdl2/sdl2_mouse_internal.c' object='ui/sdl2/unittests_sdl2mousetest-sdl2_mouse_internal.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2mousetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ui/sdl2/unittests_sdl2mousetest-sdl2_mouse_internal.obj `if test -f 'ui/sdl2/sdl2_mouse_internal.c'; then $(CYGPATH_W) 'ui/sdl2/sdl2_mouse_internal.c'; else $(CYGPATH_W) '$(srcdir)/ui/sdl2/sdl2_mouse_internal.c'; fi` + +unittests/sdl2scalerstatetest-sdl2scalerstatetest.o: unittests/sdl2scalerstatetest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2scalerstatetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/sdl2scalerstatetest-sdl2scalerstatetest.o -MD -MP -MF unittests/$(DEPDIR)/sdl2scalerstatetest-sdl2scalerstatetest.Tpo -c -o unittests/sdl2scalerstatetest-sdl2scalerstatetest.o `test -f 'unittests/sdl2scalerstatetest.c' || echo '$(srcdir)/'`unittests/sdl2scalerstatetest.c + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/sdl2scalerstatetest-sdl2scalerstatetest.Tpo unittests/$(DEPDIR)/sdl2scalerstatetest-sdl2scalerstatetest.Po +# $(AM_V_CC)source='unittests/sdl2scalerstatetest.c' object='unittests/sdl2scalerstatetest-sdl2scalerstatetest.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2scalerstatetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/sdl2scalerstatetest-sdl2scalerstatetest.o `test -f 'unittests/sdl2scalerstatetest.c' || echo '$(srcdir)/'`unittests/sdl2scalerstatetest.c + +unittests/sdl2scalerstatetest-sdl2scalerstatetest.obj: unittests/sdl2scalerstatetest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2scalerstatetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unittests/sdl2scalerstatetest-sdl2scalerstatetest.obj -MD -MP -MF unittests/$(DEPDIR)/sdl2scalerstatetest-sdl2scalerstatetest.Tpo -c -o unittests/sdl2scalerstatetest-sdl2scalerstatetest.obj `if test -f 'unittests/sdl2scalerstatetest.c'; then $(CYGPATH_W) 'unittests/sdl2scalerstatetest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/sdl2scalerstatetest.c'; fi` + $(AM_V_at)$(am__mv) unittests/$(DEPDIR)/sdl2scalerstatetest-sdl2scalerstatetest.Tpo unittests/$(DEPDIR)/sdl2scalerstatetest-sdl2scalerstatetest.Po +# $(AM_V_CC)source='unittests/sdl2scalerstatetest.c' object='unittests/sdl2scalerstatetest-sdl2scalerstatetest.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2scalerstatetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unittests/sdl2scalerstatetest-sdl2scalerstatetest.obj `if test -f 'unittests/sdl2scalerstatetest.c'; then $(CYGPATH_W) 'unittests/sdl2scalerstatetest.c'; else $(CYGPATH_W) '$(srcdir)/unittests/sdl2scalerstatetest.c'; fi` + +ui/sdl2/unittests_sdl2scalerstatetest-sdl2_scaler_state.o: ui/sdl2/sdl2_scaler_state.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2scalerstatetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ui/sdl2/unittests_sdl2scalerstatetest-sdl2_scaler_state.o -MD -MP -MF ui/sdl2/$(DEPDIR)/unittests_sdl2scalerstatetest-sdl2_scaler_state.Tpo -c -o ui/sdl2/unittests_sdl2scalerstatetest-sdl2_scaler_state.o `test -f 'ui/sdl2/sdl2_scaler_state.c' || echo '$(srcdir)/'`ui/sdl2/sdl2_scaler_state.c + $(AM_V_at)$(am__mv) ui/sdl2/$(DEPDIR)/unittests_sdl2scalerstatetest-sdl2_scaler_state.Tpo ui/sdl2/$(DEPDIR)/unittests_sdl2scalerstatetest-sdl2_scaler_state.Po +# $(AM_V_CC)source='ui/sdl2/sdl2_scaler_state.c' object='ui/sdl2/unittests_sdl2scalerstatetest-sdl2_scaler_state.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2scalerstatetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ui/sdl2/unittests_sdl2scalerstatetest-sdl2_scaler_state.o `test -f 'ui/sdl2/sdl2_scaler_state.c' || echo '$(srcdir)/'`ui/sdl2/sdl2_scaler_state.c + +ui/sdl2/unittests_sdl2scalerstatetest-sdl2_scaler_state.obj: ui/sdl2/sdl2_scaler_state.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2scalerstatetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ui/sdl2/unittests_sdl2scalerstatetest-sdl2_scaler_state.obj -MD -MP -MF ui/sdl2/$(DEPDIR)/unittests_sdl2scalerstatetest-sdl2_scaler_state.Tpo -c -o ui/sdl2/unittests_sdl2scalerstatetest-sdl2_scaler_state.obj `if test -f 'ui/sdl2/sdl2_scaler_state.c'; then $(CYGPATH_W) 'ui/sdl2/sdl2_scaler_state.c'; else $(CYGPATH_W) '$(srcdir)/ui/sdl2/sdl2_scaler_state.c'; fi` + $(AM_V_at)$(am__mv) ui/sdl2/$(DEPDIR)/unittests_sdl2scalerstatetest-sdl2_scaler_state.Tpo ui/sdl2/$(DEPDIR)/unittests_sdl2scalerstatetest-sdl2_scaler_state.Po +# $(AM_V_CC)source='ui/sdl2/sdl2_scaler_state.c' object='ui/sdl2/unittests_sdl2scalerstatetest-sdl2_scaler_state.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unittests_sdl2scalerstatetest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ui/sdl2/unittests_sdl2scalerstatetest-sdl2_scaler_state.obj `if test -f 'ui/sdl2/sdl2_scaler_state.c'; then $(CYGPATH_W) 'ui/sdl2/sdl2_scaler_state.c'; else $(CYGPATH_W) '$(srcdir)/ui/sdl2/sdl2_scaler_state.c'; fi` + +z80/coretest-coretest.o: z80/coretest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(z80_coretest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT z80/coretest-coretest.o -MD -MP -MF z80/$(DEPDIR)/coretest-coretest.Tpo -c -o z80/coretest-coretest.o `test -f 'z80/coretest.c' || echo '$(srcdir)/'`z80/coretest.c + $(AM_V_at)$(am__mv) z80/$(DEPDIR)/coretest-coretest.Tpo z80/$(DEPDIR)/coretest-coretest.Po +# $(AM_V_CC)source='z80/coretest.c' object='z80/coretest-coretest.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(z80_coretest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o z80/coretest-coretest.o `test -f 'z80/coretest.c' || echo '$(srcdir)/'`z80/coretest.c + +z80/coretest-coretest.obj: z80/coretest.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(z80_coretest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT z80/coretest-coretest.obj -MD -MP -MF z80/$(DEPDIR)/coretest-coretest.Tpo -c -o z80/coretest-coretest.obj `if test -f 'z80/coretest.c'; then $(CYGPATH_W) 'z80/coretest.c'; else $(CYGPATH_W) '$(srcdir)/z80/coretest.c'; fi` + $(AM_V_at)$(am__mv) z80/$(DEPDIR)/coretest-coretest.Tpo z80/$(DEPDIR)/coretest-coretest.Po +# $(AM_V_CC)source='z80/coretest.c' object='z80/coretest-coretest.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(z80_coretest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o z80/coretest-coretest.obj `if test -f 'z80/coretest.c'; then $(CYGPATH_W) 'z80/coretest.c'; else $(CYGPATH_W) '$(srcdir)/z80/coretest.c'; fi` + +z80/coretest-z80.o: z80/z80.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(z80_coretest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT z80/coretest-z80.o -MD -MP -MF z80/$(DEPDIR)/coretest-z80.Tpo -c -o z80/coretest-z80.o `test -f 'z80/z80.c' || echo '$(srcdir)/'`z80/z80.c + $(AM_V_at)$(am__mv) z80/$(DEPDIR)/coretest-z80.Tpo z80/$(DEPDIR)/coretest-z80.Po +# $(AM_V_CC)source='z80/z80.c' object='z80/coretest-z80.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(z80_coretest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o z80/coretest-z80.o `test -f 'z80/z80.c' || echo '$(srcdir)/'`z80/z80.c + +z80/coretest-z80.obj: z80/z80.c + $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(z80_coretest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT z80/coretest-z80.obj -MD -MP -MF z80/$(DEPDIR)/coretest-z80.Tpo -c -o z80/coretest-z80.obj `if test -f 'z80/z80.c'; then $(CYGPATH_W) 'z80/z80.c'; else $(CYGPATH_W) '$(srcdir)/z80/z80.c'; fi` + $(AM_V_at)$(am__mv) z80/$(DEPDIR)/coretest-z80.Tpo z80/$(DEPDIR)/coretest-z80.Po +# $(AM_V_CC)source='z80/z80.c' object='z80/coretest-z80.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(z80_coretest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o z80/coretest-z80.obj `if test -f 'z80/z80.c'; then $(CYGPATH_W) 'z80/z80.c'; else $(CYGPATH_W) '$(srcdir)/z80/z80.c'; fi` + +.l.c: + $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) + +.y.c: + $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf unittests/.libs unittests/_libs + -rm -rf z80/.libs z80/_libs + +distclean-libtool: + -rm -f libtool config.lt +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +install-appdataDATA: $(appdata_DATA) + @$(NORMAL_INSTALL) + @list='$(appdata_DATA)'; test -n "$(appdatadir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(appdatadir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(appdatadir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(appdatadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(appdatadir)" || exit $$?; \ + done + +uninstall-appdataDATA: + @$(NORMAL_UNINSTALL) + @list='$(appdata_DATA)'; test -n "$(appdatadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(appdatadir)'; $(am__uninstall_files_from_dir) +install-dist_bashcompletionDATA: $(dist_bashcompletion_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_bashcompletion_DATA)'; test -n "$(bashcompletiondir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bashcompletiondir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bashcompletiondir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(bashcompletiondir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(bashcompletiondir)" || exit $$?; \ + done + +uninstall-dist_bashcompletionDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_bashcompletion_DATA)'; test -n "$(bashcompletiondir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(bashcompletiondir)'; $(am__uninstall_files_from_dir) +install-dist_icons128DATA: $(dist_icons128_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_icons128_DATA)'; test -n "$(icons128dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(icons128dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(icons128dir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icons128dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(icons128dir)" || exit $$?; \ + done + +uninstall-dist_icons128DATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_icons128_DATA)'; test -n "$(icons128dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(icons128dir)'; $(am__uninstall_files_from_dir) +install-dist_icons16DATA: $(dist_icons16_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_icons16_DATA)'; test -n "$(icons16dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(icons16dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(icons16dir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icons16dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(icons16dir)" || exit $$?; \ + done + +uninstall-dist_icons16DATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_icons16_DATA)'; test -n "$(icons16dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(icons16dir)'; $(am__uninstall_files_from_dir) +install-dist_icons256DATA: $(dist_icons256_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_icons256_DATA)'; test -n "$(icons256dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(icons256dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(icons256dir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icons256dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(icons256dir)" || exit $$?; \ + done + +uninstall-dist_icons256DATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_icons256_DATA)'; test -n "$(icons256dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(icons256dir)'; $(am__uninstall_files_from_dir) +install-dist_icons32DATA: $(dist_icons32_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_icons32_DATA)'; test -n "$(icons32dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(icons32dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(icons32dir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icons32dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(icons32dir)" || exit $$?; \ + done + +uninstall-dist_icons32DATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_icons32_DATA)'; test -n "$(icons32dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(icons32dir)'; $(am__uninstall_files_from_dir) +install-dist_icons48DATA: $(dist_icons48_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_icons48_DATA)'; test -n "$(icons48dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(icons48dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(icons48dir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icons48dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(icons48dir)" || exit $$?; \ + done + +uninstall-dist_icons48DATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_icons48_DATA)'; test -n "$(icons48dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(icons48dir)'; $(am__uninstall_files_from_dir) +install-dist_icons64DATA: $(dist_icons64_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_icons64_DATA)'; test -n "$(icons64dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(icons64dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(icons64dir)" || exit 1; \ fi; \ - rm -rf "$(APPCAST_DIR)"; \ - mkdir -p "$(APPCAST_DIR)"; \ - cp -f "$(APPCAST_ARCHIVE)" "$(APPCAST_DIR)/"; \ - "$(SPARKLE_GENERATE_APPCAST)" \ - --download-url-prefix "$$url_prefix" \ - -o "$(APPCAST_DIR)/$(APPCAST_OUTPUT)" \ - "$(APPCAST_DIR)"; \ - echo "Appcast generated: $(APPCAST_DIR)/$(APPCAST_OUTPUT)" - -appcast-push: appcast - @echo "Publishing Sparkle appcast..." - @if [ ! -d "$(APPCAST_PUSH_DIR)/.git" ]; then \ - echo "Error: appcast push repository not found: $(APPCAST_PUSH_DIR)"; \ - exit 1; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icons64dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(icons64dir)" || exit $$?; \ + done + +uninstall-dist_icons64DATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_icons64_DATA)'; test -n "$(icons64dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(icons64dir)'; $(am__uninstall_files_from_dir) +install-dist_mimeicons128DATA: $(dist_mimeicons128_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_mimeicons128_DATA)'; test -n "$(mimeicons128dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(mimeicons128dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(mimeicons128dir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mimeicons128dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(mimeicons128dir)" || exit $$?; \ + done + +uninstall-dist_mimeicons128DATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_mimeicons128_DATA)'; test -n "$(mimeicons128dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(mimeicons128dir)'; $(am__uninstall_files_from_dir) +install-dist_mimeicons16DATA: $(dist_mimeicons16_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_mimeicons16_DATA)'; test -n "$(mimeicons16dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(mimeicons16dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(mimeicons16dir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mimeicons16dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(mimeicons16dir)" || exit $$?; \ + done + +uninstall-dist_mimeicons16DATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_mimeicons16_DATA)'; test -n "$(mimeicons16dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(mimeicons16dir)'; $(am__uninstall_files_from_dir) +install-dist_mimeicons256DATA: $(dist_mimeicons256_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_mimeicons256_DATA)'; test -n "$(mimeicons256dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(mimeicons256dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(mimeicons256dir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mimeicons256dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(mimeicons256dir)" || exit $$?; \ + done + +uninstall-dist_mimeicons256DATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_mimeicons256_DATA)'; test -n "$(mimeicons256dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(mimeicons256dir)'; $(am__uninstall_files_from_dir) +install-dist_mimeicons32DATA: $(dist_mimeicons32_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_mimeicons32_DATA)'; test -n "$(mimeicons32dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(mimeicons32dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(mimeicons32dir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mimeicons32dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(mimeicons32dir)" || exit $$?; \ + done + +uninstall-dist_mimeicons32DATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_mimeicons32_DATA)'; test -n "$(mimeicons32dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(mimeicons32dir)'; $(am__uninstall_files_from_dir) +install-dist_mimeicons48DATA: $(dist_mimeicons48_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_mimeicons48_DATA)'; test -n "$(mimeicons48dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(mimeicons48dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(mimeicons48dir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mimeicons48dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(mimeicons48dir)" || exit $$?; \ + done + +uninstall-dist_mimeicons48DATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_mimeicons48_DATA)'; test -n "$(mimeicons48dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(mimeicons48dir)'; $(am__uninstall_files_from_dir) +install-dist_mimeicons64DATA: $(dist_mimeicons64_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_mimeicons64_DATA)'; test -n "$(mimeicons64dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(mimeicons64dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(mimeicons64dir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mimeicons64dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(mimeicons64dir)" || exit $$?; \ + done + +uninstall-dist_mimeicons64DATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_mimeicons64_DATA)'; test -n "$(mimeicons64dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(mimeicons64dir)'; $(am__uninstall_files_from_dir) +install-fusemimeDATA: $(fusemime_DATA) + @$(NORMAL_INSTALL) + @list='$(fusemime_DATA)'; test -n "$(fusemimedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(fusemimedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(fusemimedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(fusemimedir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(fusemimedir)" || exit $$?; \ + done + +uninstall-fusemimeDATA: + @$(NORMAL_UNINSTALL) + @list='$(fusemime_DATA)'; test -n "$(fusemimedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(fusemimedir)'; $(am__uninstall_files_from_dir) +install-metainfoDATA: $(metainfo_DATA) + @$(NORMAL_INSTALL) + @list='$(metainfo_DATA)'; test -n "$(metainfodir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(metainfodir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(metainfodir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(metainfodir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(metainfodir)" || exit $$?; \ + done + +uninstall-metainfoDATA: + @$(NORMAL_UNINSTALL) + @list='$(metainfo_DATA)'; test -n "$(metainfodir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(metainfodir)'; $(am__uninstall_files_from_dir) +install-pkgdataDATA: $(pkgdata_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ + done + +uninstall-pkgdataDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi - @if [ ! -f "$(APPCAST_DIR)/$(APPCAST_OUTPUT)" ]; then \ - echo "Error: appcast not found: $(APPCAST_DIR)/$(APPCAST_OUTPUT)"; \ - exit 1; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files +dist-hook: +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-zstd: distdir + tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + *.tar.zst*) \ + zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ fi - cp -f "$(APPCAST_DIR)/$(APPCAST_OUTPUT)" "$(APPCAST_PUSH_DIR)/$(APPCAST_OUTPUT)" - git -C "$(APPCAST_PUSH_DIR)" add "$(APPCAST_OUTPUT)" - @if git -C "$(APPCAST_PUSH_DIR)" diff --cached --quiet -- "$(APPCAST_OUTPUT)"; then \ - echo "No appcast changes to commit."; \ + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) $(HEADERS) config.h +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(appdatadir)" "$(DESTDIR)$(bashcompletiondir)" "$(DESTDIR)$(icons128dir)" "$(DESTDIR)$(icons16dir)" "$(DESTDIR)$(icons256dir)" "$(DESTDIR)$(icons32dir)" "$(DESTDIR)$(icons48dir)" "$(DESTDIR)$(icons64dir)" "$(DESTDIR)$(mimeicons128dir)" "$(DESTDIR)$(mimeicons16dir)" "$(DESTDIR)$(mimeicons256dir)" "$(DESTDIR)$(mimeicons32dir)" "$(DESTDIR)$(mimeicons48dir)" "$(DESTDIR)$(mimeicons64dir)" "$(DESTDIR)$(fusemimedir)" "$(DESTDIR)$(metainfodir)" "$(DESTDIR)$(pkgdatadir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ else \ - git -C "$(APPCAST_PUSH_DIR)" commit -m "Update FuseX $(FUSEX_VERSION)"; \ - git -C "$(APPCAST_PUSH_DIR)" push; \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f compat/$(DEPDIR)/$(am__dirstamp) + -rm -f compat/$(am__dirstamp) + -rm -f compat/amiga/$(DEPDIR)/$(am__dirstamp) + -rm -f compat/amiga/$(am__dirstamp) + -rm -f compat/linux/$(DEPDIR)/$(am__dirstamp) + -rm -f compat/linux/$(am__dirstamp) + -rm -f compat/morphos/$(DEPDIR)/$(am__dirstamp) + -rm -f compat/morphos/$(am__dirstamp) + -rm -f compat/unix/$(DEPDIR)/$(am__dirstamp) + -rm -f compat/unix/$(am__dirstamp) + -rm -f compat/wii/$(DEPDIR)/$(am__dirstamp) + -rm -f compat/wii/$(am__dirstamp) + -rm -f compat/win32/$(DEPDIR)/$(am__dirstamp) + -rm -f compat/win32/$(am__dirstamp) + -rm -f debugger/$(DEPDIR)/$(am__dirstamp) + -rm -f debugger/$(am__dirstamp) + -rm -f infrastructure/$(DEPDIR)/$(am__dirstamp) + -rm -f infrastructure/$(am__dirstamp) + -rm -f machines/$(DEPDIR)/$(am__dirstamp) + -rm -f machines/$(am__dirstamp) + -rm -f peripherals/$(DEPDIR)/$(am__dirstamp) + -rm -f peripherals/$(am__dirstamp) + -rm -f peripherals/disk/$(DEPDIR)/$(am__dirstamp) + -rm -f peripherals/disk/$(am__dirstamp) + -rm -f peripherals/flash/$(DEPDIR)/$(am__dirstamp) + -rm -f peripherals/flash/$(am__dirstamp) + -rm -f peripherals/fs/$(DEPDIR)/$(am__dirstamp) + -rm -f peripherals/fs/$(am__dirstamp) + -rm -f peripherals/http/$(DEPDIR)/$(am__dirstamp) + -rm -f peripherals/http/$(am__dirstamp) + -rm -f peripherals/ide/$(DEPDIR)/$(am__dirstamp) + -rm -f peripherals/ide/$(am__dirstamp) + -rm -f peripherals/nic/$(DEPDIR)/$(am__dirstamp) + -rm -f peripherals/nic/$(am__dirstamp) + -rm -f peripherals/nic/engines/$(DEPDIR)/$(am__dirstamp) + -rm -f peripherals/nic/engines/$(am__dirstamp) + -rm -f peripherals/nic/engines/jsonpath/$(DEPDIR)/$(am__dirstamp) + -rm -f peripherals/nic/engines/jsonpath/$(am__dirstamp) + -rm -f peripherals/security/$(DEPDIR)/$(am__dirstamp) + -rm -f peripherals/security/$(am__dirstamp) + -rm -f peripherals/sound/$(DEPDIR)/$(am__dirstamp) + -rm -f peripherals/sound/$(am__dirstamp) + -rm -f pokefinder/$(DEPDIR)/$(am__dirstamp) + -rm -f pokefinder/$(am__dirstamp) + -rm -f sound/$(DEPDIR)/$(am__dirstamp) + -rm -f sound/$(am__dirstamp) + -rm -f timer/$(DEPDIR)/$(am__dirstamp) + -rm -f timer/$(am__dirstamp) + -rm -f ui/fb/$(DEPDIR)/$(am__dirstamp) + -rm -f ui/fb/$(am__dirstamp) + -rm -f ui/gtk3/$(DEPDIR)/$(am__dirstamp) + -rm -f ui/gtk3/$(am__dirstamp) + -rm -f ui/null/$(DEPDIR)/$(am__dirstamp) + -rm -f ui/null/$(am__dirstamp) + -rm -f ui/scaler/$(DEPDIR)/$(am__dirstamp) + -rm -f ui/scaler/$(am__dirstamp) + -rm -f ui/sdl/$(DEPDIR)/$(am__dirstamp) + -rm -f ui/sdl/$(am__dirstamp) + -rm -f ui/sdl2/$(DEPDIR)/$(am__dirstamp) + -rm -f ui/sdl2/$(am__dirstamp) + -rm -f ui/widget/$(DEPDIR)/$(am__dirstamp) + -rm -f ui/widget/$(am__dirstamp) + -rm -f ui/wii/$(DEPDIR)/$(am__dirstamp) + -rm -f ui/wii/$(am__dirstamp) + -rm -f ui/win32/$(DEPDIR)/$(am__dirstamp) + -rm -f ui/win32/$(am__dirstamp) + -rm -f ui/xlib/$(DEPDIR)/$(am__dirstamp) + -rm -f ui/xlib/$(am__dirstamp) + -rm -f unittests/$(DEPDIR)/$(am__dirstamp) + -rm -f unittests/$(am__dirstamp) + -rm -f z80/$(DEPDIR)/$(am__dirstamp) + -rm -f z80/$(am__dirstamp) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -rm -f debugger/commandl.c + -rm -f debugger/commandy.c + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +install-data-hook: +uninstall-hook: +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool \ + clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f ./$(DEPDIR)/display.Po + -rm -f ./$(DEPDIR)/event.Po + -rm -f ./$(DEPDIR)/fuse.Po + -rm -f ./$(DEPDIR)/input.Po + -rm -f ./$(DEPDIR)/keyboard.Po + -rm -f ./$(DEPDIR)/loader.Po + -rm -f ./$(DEPDIR)/machine.Po + -rm -f ./$(DEPDIR)/memory_pages.Po + -rm -f ./$(DEPDIR)/mempool.Po + -rm -f ./$(DEPDIR)/menu.Po + -rm -f ./$(DEPDIR)/module.Po + -rm -f ./$(DEPDIR)/movie.Po + -rm -f ./$(DEPDIR)/periph.Po + -rm -f ./$(DEPDIR)/phantom_typist.Po + -rm -f ./$(DEPDIR)/profile.Po + -rm -f ./$(DEPDIR)/psg.Po + -rm -f ./$(DEPDIR)/rectangle.Po + -rm -f ./$(DEPDIR)/rzx.Po + -rm -f ./$(DEPDIR)/screenshot.Po + -rm -f ./$(DEPDIR)/settings.Po + -rm -f ./$(DEPDIR)/slt.Po + -rm -f ./$(DEPDIR)/snapshot.Po + -rm -f ./$(DEPDIR)/sound.Po + -rm -f ./$(DEPDIR)/spectrum.Po + -rm -f ./$(DEPDIR)/svg.Po + -rm -f ./$(DEPDIR)/tape.Po + -rm -f ./$(DEPDIR)/ui.Po + -rm -f ./$(DEPDIR)/uidisplay.Po + -rm -f ./$(DEPDIR)/uimedia.Po + -rm -f ./$(DEPDIR)/unittests_displaytest-display.Po + -rm -f ./$(DEPDIR)/utils.Po + -rm -f compat/$(DEPDIR)/dirname.Po + -rm -f compat/$(DEPDIR)/getopt.Po + -rm -f compat/$(DEPDIR)/getopt1.Po + -rm -f compat/amiga/$(DEPDIR)/osname.Po + -rm -f compat/amiga/$(DEPDIR)/paths.Po + -rm -f compat/linux/$(DEPDIR)/relative_paths.Po + -rm -f compat/morphos/$(DEPDIR)/osname.Po + -rm -f compat/unix/$(DEPDIR)/dir.Po + -rm -f compat/unix/$(DEPDIR)/file.Po + -rm -f compat/unix/$(DEPDIR)/osname.Po + -rm -f compat/unix/$(DEPDIR)/paths.Po + -rm -f compat/unix/$(DEPDIR)/relative_paths.Po + -rm -f compat/unix/$(DEPDIR)/socket.Po + -rm -f compat/unix/$(DEPDIR)/timer.Po + -rm -f compat/unix/$(DEPDIR)/tuntap.Po + -rm -f compat/wii/$(DEPDIR)/osname.Po + -rm -f compat/wii/$(DEPDIR)/paths.Po + -rm -f compat/wii/$(DEPDIR)/timer.Po + -rm -f compat/win32/$(DEPDIR)/osname.Po + -rm -f compat/win32/$(DEPDIR)/paths.Po + -rm -f compat/win32/$(DEPDIR)/socket.Po + -rm -f compat/win32/$(DEPDIR)/timer.Po + -rm -f debugger/$(DEPDIR)/breakpoint.Po + -rm -f debugger/$(DEPDIR)/command.Po + -rm -f debugger/$(DEPDIR)/commandl.Po + -rm -f debugger/$(DEPDIR)/commandy.Po + -rm -f debugger/$(DEPDIR)/debugger.Po + -rm -f debugger/$(DEPDIR)/disassemble.Po + -rm -f debugger/$(DEPDIR)/event.Po + -rm -f debugger/$(DEPDIR)/expression.Po + -rm -f debugger/$(DEPDIR)/gdbserver.Po + -rm -f debugger/$(DEPDIR)/gdbserver_remote_commands.Po + -rm -f debugger/$(DEPDIR)/gdbserver_utils.Po + -rm -f debugger/$(DEPDIR)/packets.Po + -rm -f debugger/$(DEPDIR)/system_variable.Po + -rm -f debugger/$(DEPDIR)/variable.Po + -rm -f debugger/$(DEPDIR)/vfile.Po + -rm -f debugger/$(DEPDIR)/vfile_ext.Po + -rm -f infrastructure/$(DEPDIR)/startup_manager.Po + -rm -f machines/$(DEPDIR)/machines_periph.Po + -rm -f machines/$(DEPDIR)/pentagon.Po + -rm -f machines/$(DEPDIR)/pentagon1024.Po + -rm -f machines/$(DEPDIR)/pentagon512.Po + -rm -f machines/$(DEPDIR)/scorpion.Po + -rm -f machines/$(DEPDIR)/spec128.Po + -rm -f machines/$(DEPDIR)/spec16.Po + -rm -f machines/$(DEPDIR)/spec48.Po + -rm -f machines/$(DEPDIR)/spec48_ntsc.Po + -rm -f machines/$(DEPDIR)/spec_se.Po + -rm -f machines/$(DEPDIR)/specplus2.Po + -rm -f machines/$(DEPDIR)/specplus2a.Po + -rm -f machines/$(DEPDIR)/specplus3.Po + -rm -f machines/$(DEPDIR)/specplus3e.Po + -rm -f machines/$(DEPDIR)/tc2048.Po + -rm -f machines/$(DEPDIR)/tc2068.Po + -rm -f machines/$(DEPDIR)/ts2068.Po + -rm -f peripherals/$(DEPDIR)/dck.Po + -rm -f peripherals/$(DEPDIR)/if1.Po + -rm -f peripherals/$(DEPDIR)/if2.Po + -rm -f peripherals/$(DEPDIR)/joystick.Po + -rm -f peripherals/$(DEPDIR)/kempmouse.Po + -rm -f peripherals/$(DEPDIR)/multiface.Po + -rm -f peripherals/$(DEPDIR)/printer.Po + -rm -f peripherals/$(DEPDIR)/scld.Po + -rm -f peripherals/$(DEPDIR)/speccyboot.Po + -rm -f peripherals/$(DEPDIR)/spectranet.Po + -rm -f peripherals/$(DEPDIR)/ttx2000s.Po + -rm -f peripherals/$(DEPDIR)/ula.Po + -rm -f peripherals/$(DEPDIR)/usource.Po + -rm -f peripherals/disk/$(DEPDIR)/beta.Po + -rm -f peripherals/disk/$(DEPDIR)/crc.Po + -rm -f peripherals/disk/$(DEPDIR)/didaktik.Po + -rm -f peripherals/disk/$(DEPDIR)/disciple.Po + -rm -f peripherals/disk/$(DEPDIR)/disk.Po + -rm -f peripherals/disk/$(DEPDIR)/fdd.Po + -rm -f peripherals/disk/$(DEPDIR)/opus.Po + -rm -f peripherals/disk/$(DEPDIR)/plusd.Po + -rm -f peripherals/disk/$(DEPDIR)/trdos.Po + -rm -f peripherals/disk/$(DEPDIR)/upd_fdc.Po + -rm -f peripherals/disk/$(DEPDIR)/wd_fdc.Po + -rm -f peripherals/flash/$(DEPDIR)/am29f010.Po + -rm -f peripherals/fs/$(DEPDIR)/ramfs.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_compat.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_fs.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_https.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_https_compat.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_overlay.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_romfs.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_worker.Po + -rm -f peripherals/http/$(DEPDIR)/http_sck.Po + -rm -f peripherals/http/$(DEPDIR)/httpc.Po + -rm -f peripherals/ide/$(DEPDIR)/divide.Po + -rm -f peripherals/ide/$(DEPDIR)/divmmc.Po + -rm -f peripherals/ide/$(DEPDIR)/divxxx.Po + -rm -f peripherals/ide/$(DEPDIR)/ide.Po + -rm -f peripherals/ide/$(DEPDIR)/simpleide.Po + -rm -f peripherals/ide/$(DEPDIR)/zxatasp.Po + -rm -f peripherals/ide/$(DEPDIR)/zxcf.Po + -rm -f peripherals/ide/$(DEPDIR)/zxmmc.Po + -rm -f peripherals/nic/$(DEPDIR)/dns_processor.Po + -rm -f peripherals/nic/$(DEPDIR)/dns_resolver.Po + -rm -f peripherals/nic/$(DEPDIR)/enc28j60.Po + -rm -f peripherals/nic/$(DEPDIR)/spectranext_controller.Po + -rm -f peripherals/nic/$(DEPDIR)/spectranext_stdout.Po + -rm -f peripherals/nic/$(DEPDIR)/w5100.Po + -rm -f peripherals/nic/$(DEPDIR)/w5100_socket.Po + -rm -f peripherals/nic/engines/$(DEPDIR)/engine_argv.Po + -rm -f peripherals/nic/engines/$(DEPDIR)/engine_fs.Po + -rm -f peripherals/nic/engines/$(DEPDIR)/engine_utf8.Po + -rm -f peripherals/nic/engines/$(DEPDIR)/json.Po + -rm -f peripherals/nic/engines/$(DEPDIR)/parson.Po + -rm -f peripherals/nic/engines/$(DEPDIR)/xpath.Po + -rm -f peripherals/nic/engines/jsonpath/$(DEPDIR)/ast.Po + -rm -f peripherals/nic/engines/jsonpath/$(DEPDIR)/lexer.Po + -rm -f peripherals/nic/engines/jsonpath/$(DEPDIR)/matcher.Po + -rm -f peripherals/nic/engines/jsonpath/$(DEPDIR)/parser.Po + -rm -f peripherals/security/$(DEPDIR)/ssh.Po + -rm -f peripherals/security/$(DEPDIR)/tls.Po + -rm -f peripherals/sound/$(DEPDIR)/ay.Po + -rm -f peripherals/sound/$(DEPDIR)/covox.Po + -rm -f peripherals/sound/$(DEPDIR)/fuller.Po + -rm -f peripherals/sound/$(DEPDIR)/melodik.Po + -rm -f peripherals/sound/$(DEPDIR)/sp0256.Po + -rm -f peripherals/sound/$(DEPDIR)/specdrum.Po + -rm -f peripherals/sound/$(DEPDIR)/uspeech.Po + -rm -f pokefinder/$(DEPDIR)/pokefinder.Po + -rm -f pokefinder/$(DEPDIR)/pokemem.Po + -rm -f sound/$(DEPDIR)/alsasound.Po + -rm -f sound/$(DEPDIR)/aosound.Po + -rm -f sound/$(DEPDIR)/blipbuffer.Po + -rm -f sound/$(DEPDIR)/coreaudiosound.Po + -rm -f sound/$(DEPDIR)/dxsound.Po + -rm -f sound/$(DEPDIR)/hpsound.Po + -rm -f sound/$(DEPDIR)/nullsound.Po + -rm -f sound/$(DEPDIR)/osssound.Po + -rm -f sound/$(DEPDIR)/pulsesound.Po + -rm -f sound/$(DEPDIR)/sdl2sound.Po + -rm -f sound/$(DEPDIR)/sdlsound.Po + -rm -f sound/$(DEPDIR)/sfifo.Po + -rm -f sound/$(DEPDIR)/sunsound.Po + -rm -f sound/$(DEPDIR)/wiisound.Po + -rm -f sound/$(DEPDIR)/win32sound.Po + -rm -f timer/$(DEPDIR)/native.Po + -rm -f timer/$(DEPDIR)/sdl.Po + -rm -f timer/$(DEPDIR)/timer.Po + -rm -f ui/fb/$(DEPDIR)/fbdisplay.Po + -rm -f ui/fb/$(DEPDIR)/fbjoystick.Po + -rm -f ui/fb/$(DEPDIR)/fbkeyboard.Po + -rm -f ui/fb/$(DEPDIR)/fbmouse.Po + -rm -f ui/fb/$(DEPDIR)/fbui.Po + -rm -f ui/fb/$(DEPDIR)/keysyms.Po + -rm -f ui/gtk3/$(DEPDIR)/binary.Po + -rm -f ui/gtk3/$(DEPDIR)/browse.Po + -rm -f ui/gtk3/$(DEPDIR)/confirm.Po + -rm -f ui/gtk3/$(DEPDIR)/debugger.Po + -rm -f ui/gtk3/$(DEPDIR)/fileselector.Po + -rm -f ui/gtk3/$(DEPDIR)/filter_options.Po + -rm -f ui/gtk3/$(DEPDIR)/gtkdisplay.Po + -rm -f ui/gtk3/$(DEPDIR)/gtkjoystick.Po + -rm -f ui/gtk3/$(DEPDIR)/gtkkeyboard.Po + -rm -f ui/gtk3/$(DEPDIR)/gtkmouse.Po + -rm -f ui/gtk3/$(DEPDIR)/gtkui.Po + -rm -f ui/gtk3/$(DEPDIR)/keysyms.Po + -rm -f ui/gtk3/$(DEPDIR)/memory.Po + -rm -f ui/gtk3/$(DEPDIR)/menu_data.Po + -rm -f ui/gtk3/$(DEPDIR)/options.Po + -rm -f ui/gtk3/$(DEPDIR)/picture.Po + -rm -f ui/gtk3/$(DEPDIR)/pokefinder.Po + -rm -f ui/gtk3/$(DEPDIR)/pokemem.Po + -rm -f ui/gtk3/$(DEPDIR)/resources.Po + -rm -f ui/gtk3/$(DEPDIR)/rollback.Po + -rm -f ui/gtk3/$(DEPDIR)/roms.Po + -rm -f ui/gtk3/$(DEPDIR)/statusbar.Po + -rm -f ui/gtk3/$(DEPDIR)/stock.Po + -rm -f ui/null/$(DEPDIR)/null_ui.Po + -rm -f ui/null/$(DEPDIR)/options.Po + -rm -f ui/scaler/$(DEPDIR)/scaler.Po + -rm -f ui/scaler/$(DEPDIR)/snes_ntsc.Po + -rm -f ui/scaler/$(DEPDIR)/unittests_palcompositetest-snes_ntsc.Po + -rm -f ui/scaler/$(DEPDIR)/unittests_scalerexpandtest-scaler.Po + -rm -f ui/sdl/$(DEPDIR)/keysyms.Po + -rm -f ui/sdl/$(DEPDIR)/sdldisplay.Po + -rm -f ui/sdl/$(DEPDIR)/sdljoystick.Po + -rm -f ui/sdl/$(DEPDIR)/sdlkeyboard.Po + -rm -f ui/sdl/$(DEPDIR)/sdlui.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_display.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_display_internal.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_joystick.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_joystick_internal.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_keyboard.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_mouse_internal.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_scaler_state.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_ui.Po + -rm -f ui/sdl2/$(DEPDIR)/unittests_sdl2displaytest-sdl2_display_internal.Po + -rm -f ui/sdl2/$(DEPDIR)/unittests_sdl2joysticktest-sdl2_joystick_internal.Po + -rm -f ui/sdl2/$(DEPDIR)/unittests_sdl2mousetest-sdl2_mouse_internal.Po + -rm -f ui/sdl2/$(DEPDIR)/unittests_sdl2scalerstatetest-sdl2_scaler_state.Po + -rm -f ui/widget/$(DEPDIR)/about.Po + -rm -f ui/widget/$(DEPDIR)/binary.Po + -rm -f ui/widget/$(DEPDIR)/browse.Po + -rm -f ui/widget/$(DEPDIR)/debugger.Po + -rm -f ui/widget/$(DEPDIR)/error.Po + -rm -f ui/widget/$(DEPDIR)/filesel.Po + -rm -f ui/widget/$(DEPDIR)/memory.Po + -rm -f ui/widget/$(DEPDIR)/menu.Po + -rm -f ui/widget/$(DEPDIR)/menu_data.Po + -rm -f ui/widget/$(DEPDIR)/options.Po + -rm -f ui/widget/$(DEPDIR)/picture.Po + -rm -f ui/widget/$(DEPDIR)/pokefinder.Po + -rm -f ui/widget/$(DEPDIR)/pokemem.Po + -rm -f ui/widget/$(DEPDIR)/query.Po + -rm -f ui/widget/$(DEPDIR)/roms.Po + -rm -f ui/widget/$(DEPDIR)/select.Po + -rm -f ui/widget/$(DEPDIR)/text.Po + -rm -f ui/widget/$(DEPDIR)/widget.Po + -rm -f ui/wii/$(DEPDIR)/keysyms.Po + -rm -f ui/wii/$(DEPDIR)/wiidisplay.Po + -rm -f ui/wii/$(DEPDIR)/wiijoystick.Po + -rm -f ui/wii/$(DEPDIR)/wiikeyboard.Po + -rm -f ui/wii/$(DEPDIR)/wiimouse.Po + -rm -f ui/wii/$(DEPDIR)/wiiui.Po + -rm -f ui/win32/$(DEPDIR)/about.Po + -rm -f ui/win32/$(DEPDIR)/binary.Po + -rm -f ui/win32/$(DEPDIR)/browse.Po + -rm -f ui/win32/$(DEPDIR)/confirm.Po + -rm -f ui/win32/$(DEPDIR)/debugger.Po + -rm -f ui/win32/$(DEPDIR)/debuglog.Po + -rm -f ui/win32/$(DEPDIR)/fileselector.Po + -rm -f ui/win32/$(DEPDIR)/hyperlinks.Po + -rm -f ui/win32/$(DEPDIR)/keysyms.Po + -rm -f ui/win32/$(DEPDIR)/memorybrowser.Po + -rm -f ui/win32/$(DEPDIR)/menu_data.Po + -rm -f ui/win32/$(DEPDIR)/options.Po + -rm -f ui/win32/$(DEPDIR)/picture.Po + -rm -f ui/win32/$(DEPDIR)/pokefinder.Po + -rm -f ui/win32/$(DEPDIR)/pokemem.Po + -rm -f ui/win32/$(DEPDIR)/rollback.Po + -rm -f ui/win32/$(DEPDIR)/roms.Po + -rm -f ui/win32/$(DEPDIR)/statusbar.Po + -rm -f ui/win32/$(DEPDIR)/win32display.Po + -rm -f ui/win32/$(DEPDIR)/win32joystick.Po + -rm -f ui/win32/$(DEPDIR)/win32keyboard.Po + -rm -f ui/win32/$(DEPDIR)/win32mouse.Po + -rm -f ui/win32/$(DEPDIR)/win32ui.Po + -rm -f ui/win32/$(DEPDIR)/winsparkle.Po + -rm -f ui/xlib/$(DEPDIR)/keysyms.Po + -rm -f ui/xlib/$(DEPDIR)/xdisplay.Po + -rm -f ui/xlib/$(DEPDIR)/xerror.Po + -rm -f ui/xlib/$(DEPDIR)/xjoystick.Po + -rm -f ui/xlib/$(DEPDIR)/xkeyboard.Po + -rm -f ui/xlib/$(DEPDIR)/xui.Po + -rm -f unittests/$(DEPDIR)/displaytest-displaytest.Po + -rm -f unittests/$(DEPDIR)/palcompositetest-palcompositetest.Po + -rm -f unittests/$(DEPDIR)/scalerexpandtest-scalerexpandtest.Po + -rm -f unittests/$(DEPDIR)/sdl2displaytest-sdl2displaytest.Po + -rm -f unittests/$(DEPDIR)/sdl2joysticktest-sdl2joysticktest.Po + -rm -f unittests/$(DEPDIR)/sdl2mousetest-sdl2mousetest.Po + -rm -f unittests/$(DEPDIR)/sdl2scalerstatetest-sdl2scalerstatetest.Po + -rm -f unittests/$(DEPDIR)/unittests.Po + -rm -f z80/$(DEPDIR)/coretest-coretest.Po + -rm -f z80/$(DEPDIR)/coretest-z80.Po + -rm -f z80/$(DEPDIR)/z80.Po + -rm -f z80/$(DEPDIR)/z80_debugger_variables.Po + -rm -f z80/$(DEPDIR)/z80_ops.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-appdataDATA install-dist_bashcompletionDATA \ + install-dist_icons128DATA install-dist_icons16DATA \ + install-dist_icons256DATA install-dist_icons32DATA \ + install-dist_icons48DATA install-dist_icons64DATA \ + install-dist_mimeicons128DATA install-dist_mimeicons16DATA \ + install-dist_mimeicons256DATA install-dist_mimeicons32DATA \ + install-dist_mimeicons48DATA install-dist_mimeicons64DATA \ + install-fusemimeDATA install-man install-metainfoDATA \ + install-pkgdataDATA + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f ./$(DEPDIR)/display.Po + -rm -f ./$(DEPDIR)/event.Po + -rm -f ./$(DEPDIR)/fuse.Po + -rm -f ./$(DEPDIR)/input.Po + -rm -f ./$(DEPDIR)/keyboard.Po + -rm -f ./$(DEPDIR)/loader.Po + -rm -f ./$(DEPDIR)/machine.Po + -rm -f ./$(DEPDIR)/memory_pages.Po + -rm -f ./$(DEPDIR)/mempool.Po + -rm -f ./$(DEPDIR)/menu.Po + -rm -f ./$(DEPDIR)/module.Po + -rm -f ./$(DEPDIR)/movie.Po + -rm -f ./$(DEPDIR)/periph.Po + -rm -f ./$(DEPDIR)/phantom_typist.Po + -rm -f ./$(DEPDIR)/profile.Po + -rm -f ./$(DEPDIR)/psg.Po + -rm -f ./$(DEPDIR)/rectangle.Po + -rm -f ./$(DEPDIR)/rzx.Po + -rm -f ./$(DEPDIR)/screenshot.Po + -rm -f ./$(DEPDIR)/settings.Po + -rm -f ./$(DEPDIR)/slt.Po + -rm -f ./$(DEPDIR)/snapshot.Po + -rm -f ./$(DEPDIR)/sound.Po + -rm -f ./$(DEPDIR)/spectrum.Po + -rm -f ./$(DEPDIR)/svg.Po + -rm -f ./$(DEPDIR)/tape.Po + -rm -f ./$(DEPDIR)/ui.Po + -rm -f ./$(DEPDIR)/uidisplay.Po + -rm -f ./$(DEPDIR)/uimedia.Po + -rm -f ./$(DEPDIR)/unittests_displaytest-display.Po + -rm -f ./$(DEPDIR)/utils.Po + -rm -f compat/$(DEPDIR)/dirname.Po + -rm -f compat/$(DEPDIR)/getopt.Po + -rm -f compat/$(DEPDIR)/getopt1.Po + -rm -f compat/amiga/$(DEPDIR)/osname.Po + -rm -f compat/amiga/$(DEPDIR)/paths.Po + -rm -f compat/linux/$(DEPDIR)/relative_paths.Po + -rm -f compat/morphos/$(DEPDIR)/osname.Po + -rm -f compat/unix/$(DEPDIR)/dir.Po + -rm -f compat/unix/$(DEPDIR)/file.Po + -rm -f compat/unix/$(DEPDIR)/osname.Po + -rm -f compat/unix/$(DEPDIR)/paths.Po + -rm -f compat/unix/$(DEPDIR)/relative_paths.Po + -rm -f compat/unix/$(DEPDIR)/socket.Po + -rm -f compat/unix/$(DEPDIR)/timer.Po + -rm -f compat/unix/$(DEPDIR)/tuntap.Po + -rm -f compat/wii/$(DEPDIR)/osname.Po + -rm -f compat/wii/$(DEPDIR)/paths.Po + -rm -f compat/wii/$(DEPDIR)/timer.Po + -rm -f compat/win32/$(DEPDIR)/osname.Po + -rm -f compat/win32/$(DEPDIR)/paths.Po + -rm -f compat/win32/$(DEPDIR)/socket.Po + -rm -f compat/win32/$(DEPDIR)/timer.Po + -rm -f debugger/$(DEPDIR)/breakpoint.Po + -rm -f debugger/$(DEPDIR)/command.Po + -rm -f debugger/$(DEPDIR)/commandl.Po + -rm -f debugger/$(DEPDIR)/commandy.Po + -rm -f debugger/$(DEPDIR)/debugger.Po + -rm -f debugger/$(DEPDIR)/disassemble.Po + -rm -f debugger/$(DEPDIR)/event.Po + -rm -f debugger/$(DEPDIR)/expression.Po + -rm -f debugger/$(DEPDIR)/gdbserver.Po + -rm -f debugger/$(DEPDIR)/gdbserver_remote_commands.Po + -rm -f debugger/$(DEPDIR)/gdbserver_utils.Po + -rm -f debugger/$(DEPDIR)/packets.Po + -rm -f debugger/$(DEPDIR)/system_variable.Po + -rm -f debugger/$(DEPDIR)/variable.Po + -rm -f debugger/$(DEPDIR)/vfile.Po + -rm -f debugger/$(DEPDIR)/vfile_ext.Po + -rm -f infrastructure/$(DEPDIR)/startup_manager.Po + -rm -f machines/$(DEPDIR)/machines_periph.Po + -rm -f machines/$(DEPDIR)/pentagon.Po + -rm -f machines/$(DEPDIR)/pentagon1024.Po + -rm -f machines/$(DEPDIR)/pentagon512.Po + -rm -f machines/$(DEPDIR)/scorpion.Po + -rm -f machines/$(DEPDIR)/spec128.Po + -rm -f machines/$(DEPDIR)/spec16.Po + -rm -f machines/$(DEPDIR)/spec48.Po + -rm -f machines/$(DEPDIR)/spec48_ntsc.Po + -rm -f machines/$(DEPDIR)/spec_se.Po + -rm -f machines/$(DEPDIR)/specplus2.Po + -rm -f machines/$(DEPDIR)/specplus2a.Po + -rm -f machines/$(DEPDIR)/specplus3.Po + -rm -f machines/$(DEPDIR)/specplus3e.Po + -rm -f machines/$(DEPDIR)/tc2048.Po + -rm -f machines/$(DEPDIR)/tc2068.Po + -rm -f machines/$(DEPDIR)/ts2068.Po + -rm -f peripherals/$(DEPDIR)/dck.Po + -rm -f peripherals/$(DEPDIR)/if1.Po + -rm -f peripherals/$(DEPDIR)/if2.Po + -rm -f peripherals/$(DEPDIR)/joystick.Po + -rm -f peripherals/$(DEPDIR)/kempmouse.Po + -rm -f peripherals/$(DEPDIR)/multiface.Po + -rm -f peripherals/$(DEPDIR)/printer.Po + -rm -f peripherals/$(DEPDIR)/scld.Po + -rm -f peripherals/$(DEPDIR)/speccyboot.Po + -rm -f peripherals/$(DEPDIR)/spectranet.Po + -rm -f peripherals/$(DEPDIR)/ttx2000s.Po + -rm -f peripherals/$(DEPDIR)/ula.Po + -rm -f peripherals/$(DEPDIR)/usource.Po + -rm -f peripherals/disk/$(DEPDIR)/beta.Po + -rm -f peripherals/disk/$(DEPDIR)/crc.Po + -rm -f peripherals/disk/$(DEPDIR)/didaktik.Po + -rm -f peripherals/disk/$(DEPDIR)/disciple.Po + -rm -f peripherals/disk/$(DEPDIR)/disk.Po + -rm -f peripherals/disk/$(DEPDIR)/fdd.Po + -rm -f peripherals/disk/$(DEPDIR)/opus.Po + -rm -f peripherals/disk/$(DEPDIR)/plusd.Po + -rm -f peripherals/disk/$(DEPDIR)/trdos.Po + -rm -f peripherals/disk/$(DEPDIR)/upd_fdc.Po + -rm -f peripherals/disk/$(DEPDIR)/wd_fdc.Po + -rm -f peripherals/flash/$(DEPDIR)/am29f010.Po + -rm -f peripherals/fs/$(DEPDIR)/ramfs.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_compat.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_fs.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_https.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_https_compat.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_overlay.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_romfs.Po + -rm -f peripherals/fs/$(DEPDIR)/xfs_worker.Po + -rm -f peripherals/http/$(DEPDIR)/http_sck.Po + -rm -f peripherals/http/$(DEPDIR)/httpc.Po + -rm -f peripherals/ide/$(DEPDIR)/divide.Po + -rm -f peripherals/ide/$(DEPDIR)/divmmc.Po + -rm -f peripherals/ide/$(DEPDIR)/divxxx.Po + -rm -f peripherals/ide/$(DEPDIR)/ide.Po + -rm -f peripherals/ide/$(DEPDIR)/simpleide.Po + -rm -f peripherals/ide/$(DEPDIR)/zxatasp.Po + -rm -f peripherals/ide/$(DEPDIR)/zxcf.Po + -rm -f peripherals/ide/$(DEPDIR)/zxmmc.Po + -rm -f peripherals/nic/$(DEPDIR)/dns_processor.Po + -rm -f peripherals/nic/$(DEPDIR)/dns_resolver.Po + -rm -f peripherals/nic/$(DEPDIR)/enc28j60.Po + -rm -f peripherals/nic/$(DEPDIR)/spectranext_controller.Po + -rm -f peripherals/nic/$(DEPDIR)/spectranext_stdout.Po + -rm -f peripherals/nic/$(DEPDIR)/w5100.Po + -rm -f peripherals/nic/$(DEPDIR)/w5100_socket.Po + -rm -f peripherals/nic/engines/$(DEPDIR)/engine_argv.Po + -rm -f peripherals/nic/engines/$(DEPDIR)/engine_fs.Po + -rm -f peripherals/nic/engines/$(DEPDIR)/engine_utf8.Po + -rm -f peripherals/nic/engines/$(DEPDIR)/json.Po + -rm -f peripherals/nic/engines/$(DEPDIR)/parson.Po + -rm -f peripherals/nic/engines/$(DEPDIR)/xpath.Po + -rm -f peripherals/nic/engines/jsonpath/$(DEPDIR)/ast.Po + -rm -f peripherals/nic/engines/jsonpath/$(DEPDIR)/lexer.Po + -rm -f peripherals/nic/engines/jsonpath/$(DEPDIR)/matcher.Po + -rm -f peripherals/nic/engines/jsonpath/$(DEPDIR)/parser.Po + -rm -f peripherals/security/$(DEPDIR)/ssh.Po + -rm -f peripherals/security/$(DEPDIR)/tls.Po + -rm -f peripherals/sound/$(DEPDIR)/ay.Po + -rm -f peripherals/sound/$(DEPDIR)/covox.Po + -rm -f peripherals/sound/$(DEPDIR)/fuller.Po + -rm -f peripherals/sound/$(DEPDIR)/melodik.Po + -rm -f peripherals/sound/$(DEPDIR)/sp0256.Po + -rm -f peripherals/sound/$(DEPDIR)/specdrum.Po + -rm -f peripherals/sound/$(DEPDIR)/uspeech.Po + -rm -f pokefinder/$(DEPDIR)/pokefinder.Po + -rm -f pokefinder/$(DEPDIR)/pokemem.Po + -rm -f sound/$(DEPDIR)/alsasound.Po + -rm -f sound/$(DEPDIR)/aosound.Po + -rm -f sound/$(DEPDIR)/blipbuffer.Po + -rm -f sound/$(DEPDIR)/coreaudiosound.Po + -rm -f sound/$(DEPDIR)/dxsound.Po + -rm -f sound/$(DEPDIR)/hpsound.Po + -rm -f sound/$(DEPDIR)/nullsound.Po + -rm -f sound/$(DEPDIR)/osssound.Po + -rm -f sound/$(DEPDIR)/pulsesound.Po + -rm -f sound/$(DEPDIR)/sdl2sound.Po + -rm -f sound/$(DEPDIR)/sdlsound.Po + -rm -f sound/$(DEPDIR)/sfifo.Po + -rm -f sound/$(DEPDIR)/sunsound.Po + -rm -f sound/$(DEPDIR)/wiisound.Po + -rm -f sound/$(DEPDIR)/win32sound.Po + -rm -f timer/$(DEPDIR)/native.Po + -rm -f timer/$(DEPDIR)/sdl.Po + -rm -f timer/$(DEPDIR)/timer.Po + -rm -f ui/fb/$(DEPDIR)/fbdisplay.Po + -rm -f ui/fb/$(DEPDIR)/fbjoystick.Po + -rm -f ui/fb/$(DEPDIR)/fbkeyboard.Po + -rm -f ui/fb/$(DEPDIR)/fbmouse.Po + -rm -f ui/fb/$(DEPDIR)/fbui.Po + -rm -f ui/fb/$(DEPDIR)/keysyms.Po + -rm -f ui/gtk3/$(DEPDIR)/binary.Po + -rm -f ui/gtk3/$(DEPDIR)/browse.Po + -rm -f ui/gtk3/$(DEPDIR)/confirm.Po + -rm -f ui/gtk3/$(DEPDIR)/debugger.Po + -rm -f ui/gtk3/$(DEPDIR)/fileselector.Po + -rm -f ui/gtk3/$(DEPDIR)/filter_options.Po + -rm -f ui/gtk3/$(DEPDIR)/gtkdisplay.Po + -rm -f ui/gtk3/$(DEPDIR)/gtkjoystick.Po + -rm -f ui/gtk3/$(DEPDIR)/gtkkeyboard.Po + -rm -f ui/gtk3/$(DEPDIR)/gtkmouse.Po + -rm -f ui/gtk3/$(DEPDIR)/gtkui.Po + -rm -f ui/gtk3/$(DEPDIR)/keysyms.Po + -rm -f ui/gtk3/$(DEPDIR)/memory.Po + -rm -f ui/gtk3/$(DEPDIR)/menu_data.Po + -rm -f ui/gtk3/$(DEPDIR)/options.Po + -rm -f ui/gtk3/$(DEPDIR)/picture.Po + -rm -f ui/gtk3/$(DEPDIR)/pokefinder.Po + -rm -f ui/gtk3/$(DEPDIR)/pokemem.Po + -rm -f ui/gtk3/$(DEPDIR)/resources.Po + -rm -f ui/gtk3/$(DEPDIR)/rollback.Po + -rm -f ui/gtk3/$(DEPDIR)/roms.Po + -rm -f ui/gtk3/$(DEPDIR)/statusbar.Po + -rm -f ui/gtk3/$(DEPDIR)/stock.Po + -rm -f ui/null/$(DEPDIR)/null_ui.Po + -rm -f ui/null/$(DEPDIR)/options.Po + -rm -f ui/scaler/$(DEPDIR)/scaler.Po + -rm -f ui/scaler/$(DEPDIR)/snes_ntsc.Po + -rm -f ui/scaler/$(DEPDIR)/unittests_palcompositetest-snes_ntsc.Po + -rm -f ui/scaler/$(DEPDIR)/unittests_scalerexpandtest-scaler.Po + -rm -f ui/sdl/$(DEPDIR)/keysyms.Po + -rm -f ui/sdl/$(DEPDIR)/sdldisplay.Po + -rm -f ui/sdl/$(DEPDIR)/sdljoystick.Po + -rm -f ui/sdl/$(DEPDIR)/sdlkeyboard.Po + -rm -f ui/sdl/$(DEPDIR)/sdlui.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_display.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_display_internal.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_joystick.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_joystick_internal.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_keyboard.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_mouse_internal.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_scaler_state.Po + -rm -f ui/sdl2/$(DEPDIR)/sdl2_ui.Po + -rm -f ui/sdl2/$(DEPDIR)/unittests_sdl2displaytest-sdl2_display_internal.Po + -rm -f ui/sdl2/$(DEPDIR)/unittests_sdl2joysticktest-sdl2_joystick_internal.Po + -rm -f ui/sdl2/$(DEPDIR)/unittests_sdl2mousetest-sdl2_mouse_internal.Po + -rm -f ui/sdl2/$(DEPDIR)/unittests_sdl2scalerstatetest-sdl2_scaler_state.Po + -rm -f ui/widget/$(DEPDIR)/about.Po + -rm -f ui/widget/$(DEPDIR)/binary.Po + -rm -f ui/widget/$(DEPDIR)/browse.Po + -rm -f ui/widget/$(DEPDIR)/debugger.Po + -rm -f ui/widget/$(DEPDIR)/error.Po + -rm -f ui/widget/$(DEPDIR)/filesel.Po + -rm -f ui/widget/$(DEPDIR)/memory.Po + -rm -f ui/widget/$(DEPDIR)/menu.Po + -rm -f ui/widget/$(DEPDIR)/menu_data.Po + -rm -f ui/widget/$(DEPDIR)/options.Po + -rm -f ui/widget/$(DEPDIR)/picture.Po + -rm -f ui/widget/$(DEPDIR)/pokefinder.Po + -rm -f ui/widget/$(DEPDIR)/pokemem.Po + -rm -f ui/widget/$(DEPDIR)/query.Po + -rm -f ui/widget/$(DEPDIR)/roms.Po + -rm -f ui/widget/$(DEPDIR)/select.Po + -rm -f ui/widget/$(DEPDIR)/text.Po + -rm -f ui/widget/$(DEPDIR)/widget.Po + -rm -f ui/wii/$(DEPDIR)/keysyms.Po + -rm -f ui/wii/$(DEPDIR)/wiidisplay.Po + -rm -f ui/wii/$(DEPDIR)/wiijoystick.Po + -rm -f ui/wii/$(DEPDIR)/wiikeyboard.Po + -rm -f ui/wii/$(DEPDIR)/wiimouse.Po + -rm -f ui/wii/$(DEPDIR)/wiiui.Po + -rm -f ui/win32/$(DEPDIR)/about.Po + -rm -f ui/win32/$(DEPDIR)/binary.Po + -rm -f ui/win32/$(DEPDIR)/browse.Po + -rm -f ui/win32/$(DEPDIR)/confirm.Po + -rm -f ui/win32/$(DEPDIR)/debugger.Po + -rm -f ui/win32/$(DEPDIR)/debuglog.Po + -rm -f ui/win32/$(DEPDIR)/fileselector.Po + -rm -f ui/win32/$(DEPDIR)/hyperlinks.Po + -rm -f ui/win32/$(DEPDIR)/keysyms.Po + -rm -f ui/win32/$(DEPDIR)/memorybrowser.Po + -rm -f ui/win32/$(DEPDIR)/menu_data.Po + -rm -f ui/win32/$(DEPDIR)/options.Po + -rm -f ui/win32/$(DEPDIR)/picture.Po + -rm -f ui/win32/$(DEPDIR)/pokefinder.Po + -rm -f ui/win32/$(DEPDIR)/pokemem.Po + -rm -f ui/win32/$(DEPDIR)/rollback.Po + -rm -f ui/win32/$(DEPDIR)/roms.Po + -rm -f ui/win32/$(DEPDIR)/statusbar.Po + -rm -f ui/win32/$(DEPDIR)/win32display.Po + -rm -f ui/win32/$(DEPDIR)/win32joystick.Po + -rm -f ui/win32/$(DEPDIR)/win32keyboard.Po + -rm -f ui/win32/$(DEPDIR)/win32mouse.Po + -rm -f ui/win32/$(DEPDIR)/win32ui.Po + -rm -f ui/win32/$(DEPDIR)/winsparkle.Po + -rm -f ui/xlib/$(DEPDIR)/keysyms.Po + -rm -f ui/xlib/$(DEPDIR)/xdisplay.Po + -rm -f ui/xlib/$(DEPDIR)/xerror.Po + -rm -f ui/xlib/$(DEPDIR)/xjoystick.Po + -rm -f ui/xlib/$(DEPDIR)/xkeyboard.Po + -rm -f ui/xlib/$(DEPDIR)/xui.Po + -rm -f unittests/$(DEPDIR)/displaytest-displaytest.Po + -rm -f unittests/$(DEPDIR)/palcompositetest-palcompositetest.Po + -rm -f unittests/$(DEPDIR)/scalerexpandtest-scalerexpandtest.Po + -rm -f unittests/$(DEPDIR)/sdl2displaytest-sdl2displaytest.Po + -rm -f unittests/$(DEPDIR)/sdl2joysticktest-sdl2joysticktest.Po + -rm -f unittests/$(DEPDIR)/sdl2mousetest-sdl2mousetest.Po + -rm -f unittests/$(DEPDIR)/sdl2scalerstatetest-sdl2scalerstatetest.Po + -rm -f unittests/$(DEPDIR)/unittests.Po + -rm -f z80/$(DEPDIR)/coretest-coretest.Po + -rm -f z80/$(DEPDIR)/coretest-z80.Po + -rm -f z80/$(DEPDIR)/z80.Po + -rm -f z80/$(DEPDIR)/z80_debugger_variables.Po + -rm -f z80/$(DEPDIR)/z80_ops.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-appdataDATA uninstall-binPROGRAMS \ + uninstall-dist_bashcompletionDATA uninstall-dist_icons128DATA \ + uninstall-dist_icons16DATA uninstall-dist_icons256DATA \ + uninstall-dist_icons32DATA uninstall-dist_icons48DATA \ + uninstall-dist_icons64DATA uninstall-dist_mimeicons128DATA \ + uninstall-dist_mimeicons16DATA uninstall-dist_mimeicons256DATA \ + uninstall-dist_mimeicons32DATA uninstall-dist_mimeicons48DATA \ + uninstall-dist_mimeicons64DATA uninstall-fusemimeDATA \ + uninstall-man uninstall-metainfoDATA uninstall-pkgdataDATA + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +uninstall-man: uninstall-man1 + +.MAKE: all check check-am install install-am install-data-am \ + install-exec install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \ + check-am check-local clean clean-binPROGRAMS clean-cscope \ + clean-generic clean-libtool clean-noinstPROGRAMS cscope \ + cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \ + dist-zip dist-zstd distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-appdataDATA install-binPROGRAMS install-data \ + install-data-am install-data-hook \ + install-dist_bashcompletionDATA install-dist_icons128DATA \ + install-dist_icons16DATA install-dist_icons256DATA \ + install-dist_icons32DATA install-dist_icons48DATA \ + install-dist_icons64DATA install-dist_mimeicons128DATA \ + install-dist_mimeicons16DATA install-dist_mimeicons256DATA \ + install-dist_mimeicons32DATA install-dist_mimeicons48DATA \ + install-dist_mimeicons64DATA install-dvi install-dvi-am \ + install-exec install-exec-am install-fusemimeDATA install-html \ + install-html-am install-info install-info-am install-man \ + install-man1 install-metainfoDATA install-pdf install-pdf-am \ + install-pkgdataDATA install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-appdataDATA \ + uninstall-binPROGRAMS uninstall-dist_bashcompletionDATA \ + uninstall-dist_icons128DATA uninstall-dist_icons16DATA \ + uninstall-dist_icons256DATA uninstall-dist_icons32DATA \ + uninstall-dist_icons48DATA uninstall-dist_icons64DATA \ + uninstall-dist_mimeicons128DATA uninstall-dist_mimeicons16DATA \ + uninstall-dist_mimeicons256DATA uninstall-dist_mimeicons32DATA \ + uninstall-dist_mimeicons48DATA uninstall-dist_mimeicons64DATA \ + uninstall-fusemimeDATA uninstall-hook uninstall-man \ + uninstall-man1 uninstall-metainfoDATA uninstall-pkgdataDATA + +.PRECIOUS: Makefile + + +#settings.c: settings-win32.pl settings.dat +# $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/settings-win32.pl $(srcdir)/settings.dat > $@.tmp && mv $@.tmp $@ +settings.c: settings.pl settings.dat + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/settings.pl $(srcdir)/settings.dat > $@.tmp && mv $@.tmp $@ + +settings.h: settings-header.pl settings.dat + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/settings-header.pl $(srcdir)/settings.dat > $@.tmp && mv $@.tmp $@ + +options.h: $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/null/options-header.pl $(srcdir)/ui/options.dat $(srcdir)/perl/Fuse.pm $(srcdir)/perl/Fuse/Dialog.pm + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/options.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/ui/null/options-header.pl - public > $@.tmp && mv $@.tmp $@ + +test: z80/coretest unittests/displaytest + z80/coretest $(srcdir)/z80/tests/tests.in > z80/tests.actual + cmp z80/tests.actual $(srcdir)/z80/tests/tests.expected + ./unittests/displaytest + +#windres.o: windres.rc data/win32/winfuse.ico data/win32/fuse.manifest $(ui_win32_res) +# $(AM_V_GEN)$(WINDRES) -I$(srcdir) -I. $(srcdir)/windres.rc $(LIBSPECTRUM_CFLAGS) $(CPPFLAGS) windres.o + +# Generate fuse.xml according to libspectrum capabilities +#data/fuse.xml: $(srcdir)/data/fuse.xml.in +# $(AM_V_GEN)$(MKDIR_P) data; \ +# if test -z "$(LIBSPEC_HAVE_ZLIB)"; then \ +# mime_zlib='/LIBSPECTRUM_HAVE_ZLIB_BEGIN/,/LIBSPECTRUM_HAVE_ZLIB_END/d'; \ +# else \ +# mime_zlib='/LIBSPECTRUM_HAVE_ZLIB/d'; \ +# fi; \ +# if test -z "$(LIBSPEC_HAVE_BZ2)"; then \ +# mime_bz2='/LIBSPECTRUM_HAVE_BZ2_BEGIN/,/LIBSPECTRUM_HAVE_BZ2_END/d'; \ +# else \ +# mime_bz2='/LIBSPECTRUM_HAVE_BZ2/d'; \ +# fi; \ +# $(SED) -e "$$mime_zlib" -e "$$mime_bz2" < $(srcdir)/data/fuse.xml.in > $@ + +# Generate net.sourceforge.fuse_emulator.Fuse.desktop from fuse.xml to keep mime types list in sync +#data/net.sourceforge.fuse_emulator.Fuse.desktop: $(srcdir)/data/net.sourceforge.fuse_emulator.Fuse.desktop.in data/fuse.xml +# $(AM_V_GEN)$(MKDIR_P) data; \ +# list=`$(SED) -e '/.*/\1;/' -e t -e d < data/fuse.xml | tr -d '\n'` && \ +# $(SED) -e "s|@MIME_TYPES@|$$list|" \ +# -e 's|@FUSE_BIN_EXTENSION@|$(EXEEXT)|' \ +# -e 's|@EXTRA_DESKTOP_CATEGORIES@|$(EXTRA_DESKTOP_CATEGORIES)|' \ +# < $(srcdir)/data/net.sourceforge.fuse_emulator.Fuse.desktop.in > $@ + +#update-database-cache: +# if test -z "$(DESTDIR)"; then \ +# update-desktop-database $(DESKTOP_DATADIR)/applications; \ +# update-mime-database $(DESKTOP_DATADIR)/mime; \ +# touch --no-create $(iconsdatadir); \ +# $(GTK_UPDATE_ICON_CACHE) -t ${iconsdatadir}; \ +# fi + +#install-data-hook: update-database-cache + +#uninstall-hook: update-database-cache + +#validate: data/net.sourceforge.fuse_emulator.Fuse.desktop +# ( dfvalidate=`which desktop-file-validate`; \ +# if test x$$dfvalidate != x && test -x $$dfvalidate; then \ +# $$dfvalidate $< || ( echo "* $< INVALID *"; exit 1 ) \ +# fi ) + +#dist-hook: validate + +#install-win32: all +# test -n "$(DESTDIR)" || { echo "ERROR: set DESTDIR path"; exit 1; } +# $(MKDIR_P) $(DESTDIR)/roms/ || exit 1 +# $(MKDIR_P) $(DESTDIR)/lib/ || exit 1 +# $(MKDIR_P) $(DESTDIR)/3rd-party/ || exit 1 +# test "$(UI)" != "sdl" -a "$(UI)" != "sdl2" || $(MKDIR_P) $(DESTDIR)/ui/widget/ || exit 1 +# cp $(top_srcdir)/roms/*.rom $(DESTDIR)/roms +# cp $(top_srcdir)/roms/README.copyright $(DESTDIR)/roms +# if test -d "$(top_srcdir)/roms/spectranext-launcher"; then \ +# $(MKDIR_P) "$(DESTDIR)/roms/spectranext-launcher"; \ +# cp "$(top_srcdir)/roms/spectranext-launcher/"* "$(DESTDIR)/roms/spectranext-launcher/"; \ +# fi +# cp $(top_srcdir)/lib/*.bmp $(DESTDIR)/lib +# cp $(top_srcdir)/lib/*.png $(DESTDIR)/lib +# cp $(top_srcdir)/lib/*.scr $(DESTDIR)/lib +# test "$(UI)" != "sdl" -a "$(UI)" != "sdl2" || cp $(top_builddir)/ui/widget/fuse.font $(DESTDIR)/ui/widget +# Copy fuse executable (we should manually copy the required libraries) +# cp $(top_builddir)/.libs/fuse$(EXEEXT) $(DESTDIR) || \ +# cp $(top_builddir)/fuse$(EXEEXT) $(DESTDIR) +# Get text files +# for file in AUTHORS ChangeLog COPYING README; \ +# do cp "$(top_srcdir)/$$file" "$(DESTDIR)/$$file.txt"; \ +# done +# cp "$(top_srcdir)/data/win32/README-win32.txt" "$(DESTDIR)/README-win32.txt" +# cp "$(top_srcdir)/data/win32/LICENSES.txt" "$(DESTDIR)/LICENSES.txt" +# @has_sdl=no; \ +# has_sdl2=no; \ +# test -f "$(DESTDIR)/SDL.dll" && has_sdl=yes; \ +# test -f "$(DESTDIR)/SDL2.dll" && has_sdl2=yes; \ +# awk -v has_sdl="$$has_sdl" -v has_sdl2="$$has_sdl2" '\ +# /^Files: SDL\.dll$$/ { skip = ( has_sdl != "yes" ); } \ +# /^Files: SDL2\.dll$$/ { skip = ( has_sdl2 != "yes" ); } \ +# /^Files: / && $$0 != "Files: SDL.dll" && $$0 != "Files: SDL2.dll" { skip = 0; } \ +# !skip { print }' \ +# "$(DESTDIR)/LICENSES.txt" > "$(DESTDIR)/LICENSES.txt.tmp" && \ +# mv "$(DESTDIR)/LICENSES.txt.tmp" "$(DESTDIR)/LICENSES.txt" +# Get manuals +# if test -n "$(GROFF)"; then \ +# sed ':a;N;$$!ba;s/\.PP\n\.TS/\.bp\n&/g' $(top_srcdir)/man/fuse.1 | \ +# $(GROFF) -t -Thtml -man -P -I -P manual > $(DESTDIR)/fuse.html; \ +# elif test -n "$(MAN2HTML)"; then \ +# $(MAN2HTML) -r $(top_srcdir)/man/fuse.1 | sed '1d' > $(DESTDIR)/fuse.html; \ +# fi +# -mv manual*.png $(DESTDIR); +# Convert to DOS line endings +# test -z "$(UNIX2DOS)" || find $(DESTDIR) -type f \( -name "*.txt" -or -name "*.html" -or -name "*.copyright" \) -exec $(UNIX2DOS) {} \; + +#install-win32-strip: install-win32 +# test -z "$(STRIP)" || $(STRIP) $(DESTDIR)/fuse$(EXEEXT) + +# Build local 3rdparty tree (MSYS2) if missing — provides DLLs for dist-win32-*. +#3rdparty-dist: +# @if test ! -d "$(top_srcdir)/3rdparty/dist/bin"; then \ +# echo "Building 3rdparty dependencies into $(top_srcdir)/3rdparty/dist ..."; \ +# cd "$(top_srcdir)/3rdparty" && $(MAKE) || { echo "Error: 3rdparty build failed"; exit 1; }; \ +# else \ +# echo "Using existing $(top_srcdir)/3rdparty/dist"; \ +# fi + +#dist-win32-dir: 3rdparty-dist +# $(MAKE) DESTDIR="$(top_win32dir)" STRIP="$(STRIP)" install-win32-strip +# @if test -d "$(top_srcdir)/3rdparty/dist/bin"; then \ +# echo "Copying DLLs from 3rdparty/dist/bin ..."; \ +# for dll in "$(top_srcdir)/3rdparty/dist/bin"/*.dll; do \ +# if test -f "$$dll"; then \ +# cp "$$dll" "$(top_win32dir)/"; \ +# echo " copied $$(basename $$dll)"; \ +# fi; \ +# done; \ +# fi +# @MINGW_BIN=""; \ +# if test -n "$$MSYSTEM"; then \ +# if test "$$MSYSTEM" = "MINGW64"; then \ +# MINGW_BIN="/mingw64/bin"; \ +# elif test "$$MSYSTEM" = "MINGW32"; then \ +# MINGW_BIN="/mingw32/bin"; \ +# elif test "$$MSYSTEM" = "UCRT64"; then \ +# MINGW_BIN="/ucrt64/bin"; \ +# fi; \ +# fi; \ +# if test -z "$$MINGW_BIN" && test -d "/mingw64/bin"; then \ +# MINGW_BIN="/mingw64/bin"; \ +# elif test -z "$$MINGW_BIN" && test -d "/ucrt64/bin"; then \ +# MINGW_BIN="/ucrt64/bin"; \ +# elif test -z "$$MINGW_BIN" && test -d "/mingw32/bin"; then \ +# MINGW_BIN="/mingw32/bin"; \ +# fi; \ +# if test -n "$$MINGW_BIN"; then \ +# echo "Copying MinGW runtime DLLs from $$MINGW_BIN ..."; \ +# for dll in libwinpthread-1.dll libstdc++-6.dll libgcc_s_seh-1.dll libgcc_s_dw2-1.dll; do \ +# if test -f "$$MINGW_BIN/$$dll"; then \ +# cp "$$MINGW_BIN/$$dll" "$(top_win32dir)/"; \ +# echo " copied $$dll"; \ +# fi; \ +# done; \ +# fi +# @if test -f "$(top_srcdir)/data/win32/WinSparkle.dll"; then \ +# cp "$(top_srcdir)/data/win32/WinSparkle.dll" "$(top_win32dir)/"; \ +# echo " copied WinSparkle.dll"; \ +# fi + +#dist-win32-dir-debug: +# $(MAKE) DESTDIR="$(top_win32dir)" install-win32 + +#dist-win32-zip: dist-win32-dir +# rm -f -- $(top_builddir)/$(package_win32).zip +# rm -f -- $(top_builddir)/$(package_win32).zip.sha1 +# test -n "$(top_win32dir)" || exit 1 +# @test `find $(top_win32dir) -type f -name \*.dll -print | wc -l` -ne 0 || \ +# { echo "ERROR: external libraries not found in $(top_win32dir). Please, manually copy them."; exit 1; } +# cd $(top_win32dir) && \ +# zip -q -9 -r $(abs_top_builddir)/$(package_win32).zip . +# -sha1sum $(top_builddir)/$(package_win32).zip > $(top_builddir)/$(package_win32).zip.sha1 && \ +# { test -z "$(UNIX2DOS)" || $(UNIX2DOS) $(top_builddir)/$(package_win32).zip.sha1; } + +#dist-win32-7z: dist-win32-dir +# rm -f -- $(top_builddir)/$(package_win32).7z +# rm -f -- $(top_builddir)/$(package_win32).7z.sha1 +# test -n "$(top_win32dir)" || exit 1 +# @test `find $(top_win32dir) -type f -name \*.dll -print | wc -l` -ne 0 || \ +# { echo "ERROR: external libraries not found in $(top_win32dir). Please, manually copy them."; exit 1; } +# cd $(top_win32dir) && \ +# 7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on -bd $(abs_top_builddir)/$(package_win32).7z . +# -sha1sum $(top_builddir)/$(package_win32).7z > $(top_builddir)/$(package_win32).7z.sha1 && \ +# { test -z "$(UNIX2DOS)" || $(UNIX2DOS) $(top_builddir)/$(package_win32).7z.sha1; } + +#dist-win32-exe: dist-win32-dir +# rm -f -- $(top_builddir)/$(package_win32)-setup.exe +# rm -f -- $(top_builddir)/$(package_win32)-setup.exe.sha1 +# test -n "$(top_win32dir)" || exit 1 +# @test `find $(top_win32dir) -type f -name \*.dll -print | wc -l` -ne 0 || \ +# { echo "ERROR: external libraries not found in $(top_win32dir). Please, manually copy them."; exit 1; } +# Locate NSIS in PATH, MSYS /mingw64, or standard Windows install dirs (with or without .exe) +# @NSISFILE="$(abs_top_builddir)/data/win32/installer.nsi"; \ +# if makensis -VERSION > /dev/null 2>&1; then \ +# MAKENSIS="makensis"; \ +# elif [ -x "/mingw64/bin/makensis" ] || [ -x "/mingw64/bin/makensis.exe" ]; then \ +# MAKENSIS="/mingw64/bin/makensis"; \ +# elif [ -x "/ucrt64/bin/makensis" ] || [ -x "/ucrt64/bin/makensis.exe" ]; then \ +# MAKENSIS="/ucrt64/bin/makensis"; \ +# elif [ -x "/c/Program Files/NSIS/makensis.exe" ]; then \ +# MAKENSIS='/c/Program Files/NSIS/makensis.exe'; \ +# elif [ -x "/c/Program Files/NSIS/makensis" ]; then \ +# MAKENSIS='/c/Program Files/NSIS/makensis'; \ +# elif [ -x "/c/Program Files (x86)/NSIS/makensis.exe" ]; then \ +# MAKENSIS='/c/Program Files (x86)/NSIS/makensis.exe'; \ +# elif [ -x "/c/Program Files (x86)/NSIS/makensis" ]; then \ +# MAKENSIS='/c/Program Files (x86)/NSIS/makensis'; \ +# elif [ -x "/cygdrive/c/Program Files/NSIS/makensis.exe" ]; then \ +# MAKENSIS='/cygdrive/c/Program Files/NSIS/makensis.exe'; \ +# elif [ -x "/cygdrive/c/Program Files (x86)/NSIS/makensis.exe" ]; then \ +# MAKENSIS='/cygdrive/c/Program Files (x86)/NSIS/makensis.exe'; \ +# else \ +# echo 'ERROR: cannot locate makensis (install NSIS or: pacman -S mingw-w64-x86_64-nsis)'; exit 1; \ +# fi; \ +# case "`uname -s`" in \ +# CYGWIN*) NSISFILE=`cygpath -m $$NSISFILE`;; \ +# esac; \ +# cd $(top_win32dir); \ +# "$$MAKENSIS" -V2 -NOCD "$$NSISFILE" +# mv $(top_win32dir)/$(package_win32)-setup.exe $(top_builddir) +# -sha1sum $(top_builddir)/$(package_win32)-setup.exe > $(top_builddir)/$(package_win32)-setup.exe.sha1 && \ +# { test -z "$(UNIX2DOS)" || $(UNIX2DOS) $(top_builddir)/$(package_win32)-setup.exe.sha1; } + +#dist-win32: dist-win32-zip dist-win32-7z dist-win32-exe + +#distclean-win32: +# if test -d "$(top_builddir)/$(package_win32)"; then \ +# rm -rf -- "$(top_builddir)/$(package_win32)"; \ +# fi +# rm -f -- $(top_builddir)/$(package_win32).zip +# rm -f -- $(top_builddir)/$(package_win32).zip.sha1 +# rm -f -- $(top_builddir)/$(package_win32).7z +# rm -f -- $(top_builddir)/$(package_win32).7z.sha1 +# rm -f -- $(top_builddir)/$(package_win32)-setup.exe +# rm -f -- $(top_builddir)/$(package_win32)-setup.exe.sha1 + +#.PHONY: install-win32 install-win32-strip dist-win32 dist-win32-dir \ +# dist-win32-dir-debug dist-win32-zip dist-win32-7z dist-win32-exe \ +# distclean-win32 3rdparty-dist + +debugger/commandl.c: debugger/commandy.c +debugger/commandy.h: debugger/commandy.c + +ui/fb/keysyms.c: $(srcdir)/keysyms.pl $(srcdir)/keysyms.dat + @$(MKDIR_P) ui/fb + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/keysyms.pl fb $(srcdir)/keysyms.dat > $@.tmp && mv $@.tmp $@ + +ui/gtk3/keysyms.c: $(srcdir)/keysyms.pl $(srcdir)/keysyms.dat + @$(MKDIR_P) ui/gtk3 + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/keysyms.pl gtk $(srcdir)/keysyms.dat > $@.tmp && mv $@.tmp $@ + +ui/gtk3/menu_data.c: $(srcdir)/perl/cpp-perl.pl $(srcdir)/menu_data.pl $(srcdir)/menu_data.dat config.h + @$(MKDIR_P) ui/gtk3 + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/menu_data.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/menu_data.pl gtk c > $@.tmp && mv $@.tmp $@ + +ui/gtk3/menu_data.ui: $(srcdir)/perl/cpp-perl.pl $(srcdir)/menu_data.pl $(srcdir)/menu_data.dat config.h + @$(MKDIR_P) ui/gtk3 + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/menu_data.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/menu_data.pl gtk ui > $@.tmp && mv $@.tmp $@ + +ui/gtk3/options.stamp: $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/gtk3/options.pl $(srcdir)/ui/gtk3/options-header.pl $(srcdir)/ui/options.dat $(srcdir)/perl/Fuse.pm $(srcdir)/perl/Fuse/Dialog.pm + @$(MKDIR_P) ui/gtk3 + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/options.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/ui/gtk3/options.pl - > ui/gtk3/options.c.tmp && mv ui/gtk3/options.c.tmp ui/gtk3/options.c + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/options.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/ui/gtk3/options-header.pl - > ui/gtk3/options_internals.h.tmp && mv ui/gtk3/options_internals.h.tmp ui/gtk3/options_internals.h + @touch $@ + +ui/gtk3/options.c ui/gtk3/options_internals.h: ui/gtk3/options.stamp + +ui/gtk3/resources.c: ui/gtk3/resources.xml $(gtkui_resource_files) $(gtkui_built_resource_files) + $(AM_V_GEN)glib-compile-resources --sourcedir=$(srcdir) --sourcedir=$(builddir) --target=$@ --internal --generate-source --c-name=gtkui $< + +ui/gtk3/resources.h: ui/gtk3/resources.xml $(gtkui_resource_files) $(gtkui_built_resource_files) + $(AM_V_GEN)glib-compile-resources --sourcedir=$(srcdir) --sourcedir=$(builddir) --target=$@ --internal --generate-header --c-name=gtkui $< + +ui/null/options.c: $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/null/options.pl $(srcdir)/ui/options.dat $(srcdir)/perl/Fuse.pm $(srcdir)/perl/Fuse/Dialog.pm + @$(MKDIR_P) ui/null + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/options.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/ui/null/options.pl - > $@.tmp && mv $@.tmp $@ + +ui/scaler/scalers16.o: $(srcdir)/ui/scaler/scalers.c + $(AM_V_CC)$(COMPILE) -DSCALER_DATA_SIZE=2 -c $(srcdir)/ui/scaler/scalers.c -o $@ + +ui/scaler/scalers32.o: $(srcdir)/ui/scaler/scalers.c + $(AM_V_CC)$(COMPILE) -DSCALER_DATA_SIZE=4 -c $(srcdir)/ui/scaler/scalers.c -o $@ + +ui/sdl/keysyms.c: $(srcdir)/keysyms.pl $(srcdir)/keysyms.dat + @$(MKDIR_P) ui/sdl + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/keysyms.pl sdl $(srcdir)/keysyms.dat > $@.tmp && mv $@.tmp $@ + +ui/widget/menu_data.c: $(srcdir)/perl/cpp-perl.pl $(srcdir)/menu_data.dat $(srcdir)/menu_data.pl config.h + @$(MKDIR_P) ui/widget + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/menu_data.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/menu_data.pl widget > $@.tmp && mv $@.tmp $@ + +ui/widget/options.c: $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/widget/options.pl $(srcdir)/ui/options.dat $(srcdir)/perl/Fuse.pm $(srcdir)/perl/Fuse/Dialog.pm + @$(MKDIR_P) ui/widget + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/options.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/ui/widget/options.pl - > $@.tmp && mv $@.tmp $@ + +ui/widget/options_internals.h: $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/widget/options-header.pl $(srcdir)/ui/options.dat $(srcdir)/perl/Fuse.pm $(srcdir)/perl/Fuse/Dialog.pm + @$(MKDIR_P) ui/widget + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/options.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/ui/widget/options-header.pl - > $@.tmp && mv $@.tmp $@ + +ui/widget/fuse.font: $(srcdir)/ui/widget/mkfusefont.pl $(srcdir)/ui/widget/fuse.font.sbf + @$(MKDIR_P) ui/widget + $(AM_V_GEN)$(PERL) $(srcdir)/ui/widget/mkfusefont.pl $(srcdir)/ui/widget/fuse.font.sbf > $@.tmp && mv $@.tmp $@ + +ui/wii/keysyms.c: $(srcdir)/keysyms.pl $(srcdir)/keysyms.dat + @$(MKDIR_P) ui/wii + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/keysyms.pl wii $(srcdir)/keysyms.dat > $@.tmp && mv $@.tmp $@ + +ui/win32/keysyms.c: $(srcdir)/keysyms.pl $(srcdir)/keysyms.dat + @$(MKDIR_P) ui/win32 + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/keysyms.pl win32 $(srcdir)/keysyms.dat > $@.tmp && mv $@.tmp $@ + +ui/win32/menu_data.c: $(srcdir)/perl/cpp-perl.pl $(srcdir)/menu_data.pl $(srcdir)/menu_data.dat config.h + @$(MKDIR_P) ui/win32 + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/menu_data.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/menu_data.pl win32 c > $@.tmp && mv $@.tmp $@ + +ui/win32/menu_data.h: $(srcdir)/perl/cpp-perl.pl $(srcdir)/menu_data.pl $(srcdir)/menu_data.dat config.h + @$(MKDIR_P) ui/win32 + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/menu_data.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/menu_data.pl win32 h > $@.tmp && mv $@.tmp $@ + +ui/win32/menu_data.rc: $(srcdir)/perl/cpp-perl.pl $(srcdir)/menu_data.pl $(srcdir)/menu_data.dat config.h + @$(MKDIR_P) ui/win32 + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/menu_data.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/menu_data.pl win32 rc > $@.tmp && mv $@.tmp $@ + +ui/win32/options.c: $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/win32/options.pl $(srcdir)/ui/options.dat $(srcdir)/perl/Fuse.pm $(srcdir)/perl/Fuse/Dialog.pm + @$(MKDIR_P) ui/win32 + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/options.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/ui/win32/options.pl - > $@.tmp && mv $@.tmp $@ + +ui/win32/options_internals.h: $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/win32/options-header.pl $(srcdir)/ui/options.dat $(srcdir)/perl/Fuse.pm $(srcdir)/perl/Fuse/Dialog.pm + @$(MKDIR_P) ui/win32 + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/options.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/ui/win32/options-header.pl - > $@.tmp && mv $@.tmp $@ + +ui/win32/options.rc: $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/win32/options-resource.pl $(srcdir)/ui/options.dat $(srcdir)/perl/Fuse.pm $(srcdir)/perl/Fuse/Dialog.pm + @$(MKDIR_P) ui/win32 + $(AM_V_GEN)$(PERL) $(srcdir)/perl/cpp-perl.pl config.h $(srcdir)/ui/options.dat | $(PERL) -I$(srcdir)/perl $(srcdir)/ui/win32/options-resource.pl - > $@.tmp && mv $@.tmp $@ + +ui/xlib/keysyms.c: $(srcdir)/keysyms.pl $(srcdir)/keysyms.dat + @$(MKDIR_P) ui/xlib + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/keysyms.pl x $(srcdir)/keysyms.dat > $@.tmp && mv $@.tmp $@ + +ui/xlib/xpixmaps.c: ui/xlib/xstatusbar.pl $(srcdir)/ui/xlib/xpixmaps.c.in + @$(MKDIR_P) ui/xlib + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/ui/xlib/xstatusbar.pl $(srcdir)/ui/xlib/xpixmaps.c.in > $@.tmp && mv $@.tmp $@ + +z80/opcodes_base.c: $(srcdir)/z80/z80.pl $(srcdir)/z80/opcodes_base.dat + @$(MKDIR_P) z80 + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/z80/z80.pl $(srcdir)/z80/opcodes_base.dat > $@.tmp && mv $@.tmp $@ + +z80/z80_cb.c: $(srcdir)/z80/z80.pl $(srcdir)/z80/opcodes_cb.dat + @$(MKDIR_P) z80 + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/z80/z80.pl $(srcdir)/z80/opcodes_cb.dat > $@.tmp && mv $@.tmp $@ + +z80/z80_ddfd.c: $(srcdir)/z80/z80.pl $(srcdir)/z80/opcodes_ddfd.dat + @$(MKDIR_P) z80 + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/z80/z80.pl $(srcdir)/z80/opcodes_ddfd.dat > $@.tmp && mv $@.tmp $@ + +z80/z80_ddfdcb.c: $(srcdir)/z80/z80.pl $(srcdir)/z80/opcodes_ddfd.dat + @$(MKDIR_P) z80 + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/z80/z80.pl $(srcdir)/z80/opcodes_ddfdcb.dat > $@.tmp && mv $@.tmp $@ + +z80/z80_ed.c: $(srcdir)/z80/z80.pl $(srcdir)/z80/opcodes_ed.dat + @$(MKDIR_P) z80 + $(AM_V_GEN)$(PERL) -I$(srcdir)/perl $(srcdir)/z80/z80.pl $(srcdir)/z80/opcodes_ed.dat > $@.tmp && mv $@.tmp $@ + +z80/coretest.o: $(srcdir)/z80/coretest.c + $(AM_V_CC)$(COMPILE) -DCORETEST -c $(srcdir)/z80/coretest.c -o $@ + +z80/z80_coretest.o: z80/z80_ops.c + $(AM_V_CC)$(COMPILE) -DCORETEST -c $(srcdir)/z80/z80_ops.c -o $@ + +check-local: fuse unittests/displaytest unittests/sdl2displaytest unittests/sdl2scalerstatetest unittests/sdl2joysticktest unittests/sdl2mousetest unittests/palcompositetest unittests/scalerexpandtest z80/coretest + @test -e $(top_builddir)/roms || ln -sf "$(abs_top_srcdir)/roms" $(top_builddir)/roms + $(top_builddir)/fuse --unittests + $(top_builddir)/unittests/displaytest + $(top_builddir)/unittests/sdl2displaytest + $(top_builddir)/unittests/sdl2scalerstatetest + $(top_builddir)/unittests/sdl2joysticktest + $(top_builddir)/unittests/sdl2mousetest + $(top_builddir)/unittests/palcompositetest + $(top_builddir)/unittests/scalerexpandtest + $(top_builddir)/z80/coretest $(srcdir)/z80/tests/tests.in > $(top_builddir)/z80/tests.actual + cmp $(top_builddir)/z80/tests.actual $(srcdir)/z80/tests/tests.expected -clean-3rdparty: - @echo "Cleaning 3rdparty build artifacts..." - rm -rf 3rdparty/audiofile/build - rm -rf 3rdparty/libgcrypt/build - rm -rf 3rdparty/FuseGenerator/build - rm -rf 3rdparty/FuseImporter/build - rm -rf 3rdparty/mbedtls/build - rm -rf 3rdparty/libssh2/build - -clean: clean-3rdparty - @echo "Cleaning FuseX build artifacts..." - rm -rf fusepb/build - rm -rf build - rm -rf dist - rm -f FuseX*.dmg +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/debugger/Makefile.am b/debugger/Makefile.am index e8cf891d8..bffd9e3ef 100644 --- a/debugger/Makefile.am +++ b/debugger/Makefile.am @@ -32,12 +32,16 @@ fuse_SOURCES += \ debugger/gdbserver.c \ debugger/gdbserver_remote_commands.c \ debugger/gdbserver_utils.c \ - debugger/vfile.c \ - debugger/vfile_ext.c \ debugger/system_variable.c \ debugger/packets.c \ debugger/variable.c +if BUILD_SPECTRANET +fuse_SOURCES += \ + debugger/vfile.c \ + debugger/vfile_ext.c +endif + debugger/commandl.c: debugger/commandy.c debugger/commandy.h: debugger/commandy.c diff --git a/debugger/gdbserver.c b/debugger/gdbserver.c index bbf4ee83b..0b4891312 100644 --- a/debugger/gdbserver.c +++ b/debugger/gdbserver.c @@ -28,14 +28,15 @@ #include "mempool.h" #include "periph.h" #include "machine.h" -#include "peripherals/fs/xfs.h" #include "peripherals/spectranet.h" #include "settings.h" #include "utils.h" #include "ui/ui.h" #include "z80/z80.h" #include "z80/z80_macros.h" +#ifdef BUILD_SPECTRANET #include "vfile.h" +#endif #include #include @@ -333,7 +334,8 @@ static void process_vpacket(char *payload) } name = payload; - // Try vfile handler first (handles vFile: and vSpectranext: packets) + // vFile and vSpectranext are provided by the Spectranet XFS implementation. +#ifdef BUILD_SPECTRANET if (strncmp(name, "File:", 5) == 0 || strncmp(name, "Spectranext:", 12) == 0) { const char* response = vfile_handle_v(name, args ? args : "", (uint32_t)args_len); @@ -343,6 +345,7 @@ static void process_vpacket(char *payload) } return; } +#endif if (!strcmp("Cont", name)) { diff --git a/debugger/gdbserver_remote_commands.c b/debugger/gdbserver_remote_commands.c index 804462dd1..28c88b6ac 100644 --- a/debugger/gdbserver_remote_commands.c +++ b/debugger/gdbserver_remote_commands.c @@ -1,3 +1,5 @@ +#include "config.h" + #include "gdbserver_remote_commands.h" #include "gdbserver.h" @@ -9,11 +11,14 @@ #include "fuse.h" #include "libspectrum.h" -#include "peripherals/fs/xfs.h" #include "peripherals/spectranet.h" #include "snapshot.h" #include "utils.h" +#ifdef BUILD_SPECTRANET +#include "peripherals/fs/xfs.h" +#endif + static const char * skip_spaces( const char *text ) { @@ -208,6 +213,7 @@ remote_command_spectranet_set_pagein( const char *args ) return 1; } +#ifdef BUILD_SPECTRANET static uint8_t remote_command_xfs_debug( const char *args ) { int enable; @@ -260,6 +266,7 @@ static uint8_t remote_command_xfs_debug( const char *args ) return 0; } +#endif const struct remote_command_entry_t remote_commands[] = { { "help", remote_command_help }, @@ -268,6 +275,8 @@ const struct remote_command_entry_t remote_commands[] = { { "spectranet-info", remote_command_spectranet_info }, { "spectranet-set-page", remote_command_spectranet_set_page }, { "spectranet-set-pagein", remote_command_spectranet_set_pagein }, +#ifdef BUILD_SPECTRANET { "xfs-debug", remote_command_xfs_debug }, +#endif { NULL, NULL } }; diff --git a/peripherals/Makefile.am b/peripherals/Makefile.am index 4b58821b4..93c7497ec 100644 --- a/peripherals/Makefile.am +++ b/peripherals/Makefile.am @@ -65,15 +65,6 @@ if BUILD_SPECCYBOOT fuse_SOURCES += peripherals/nic/enc28j60.c endif -# The xfs core (RAM-backed filesystem engine) is always built: the GDB vfile -# debugger feature, which is compiled unconditionally, depends on it. Only the -# network engines (xfs_https.c) and their HTTP/TLS/SSH stack are Spectranet-only. -fuse_SOURCES += \ - peripherals/fs/xfs.c \ - peripherals/fs/xfs_worker.c \ - peripherals/fs/xfs_fs.c \ - peripherals/fs/xfs_overlay.c - if BUILD_SPECTRANET fuse_SOURCES += \ peripherals/flash/am29f010.c \ @@ -93,7 +84,11 @@ fuse_SOURCES += \ peripherals/nic/engines/parson.c \ peripherals/nic/spectranext_controller.c \ peripherals/nic/spectranext_stdout.c \ + peripherals/fs/xfs.c \ peripherals/fs/xfs_compat.c \ + peripherals/fs/xfs_worker.c \ + peripherals/fs/xfs_fs.c \ + peripherals/fs/xfs_overlay.c \ peripherals/fs/xfs_romfs.c \ peripherals/fs/ramfs.c \ peripherals/fs/xfs_https.c \ diff --git a/peripherals/fs/xfs.c b/peripherals/fs/xfs.c index 9954d79f4..695c7e212 100644 --- a/peripherals/fs/xfs.c +++ b/peripherals/fs/xfs.c @@ -208,9 +208,6 @@ void xfs_handle_mount(volatile struct xfs_registers_t* registers) return; } } -#ifdef BUILD_SPECTRANET - /* The http/https engines live in xfs_https.c, which is built only with - Spectranet as it needs the HTTP client and the mbedTLS stack. */ else if (strcmp(protocol, "https") == 0) { XFS_DEBUG("xfs: mount https hostname='%s' path='%s' mount_point=%d\n", hostname, path, mount_point); @@ -221,7 +218,6 @@ void xfs_handle_mount(volatile struct xfs_registers_t* registers) XFS_DEBUG("xfs: mount http hostname='%s' path='%s' mount_point=%d\n", hostname, path, mount_point); engine = &http_engine; } -#endif /* #ifdef BUILD_SPECTRANET */ else { XFS_DEBUG("xfs: mount failed: unknown protocol '%s' mount_point=%d\n", protocol, mount_point);