From a11985c46d5eab5c61a1034005858286e6f3da3b Mon Sep 17 00:00:00 2001 From: cameron Date: Fri, 28 Apr 2017 00:24:57 +0100 Subject: [PATCH] RISCOS: Add RISC OS support --- .gitignore | 1 + backends/platform/sdl/module.mk | 6 ++ backends/platform/sdl/posix/posix-main.cpp | 2 +- backends/platform/sdl/riscos/riscos-main.cpp | 53 ++++++++++ backends/platform/sdl/riscos/riscos.cpp | 106 +++++++++++++++++++ backends/platform/sdl/riscos/riscos.h | 52 +++++++++ backends/platform/sdl/riscos/riscos.mk | 20 ++++ configure | 38 ++++++- dists/riscos/!Boot,feb | 8 ++ dists/riscos/!Help,feb | 1 + dists/riscos/!Run,feb | 13 +++ dists/riscos/!Sprites,ff9 | Bin 0 -> 7324 bytes dists/riscos/!Sprites11,ff9 | Bin 0 -> 11132 bytes 13 files changed, 294 insertions(+), 6 deletions(-) create mode 100644 backends/platform/sdl/riscos/riscos-main.cpp create mode 100644 backends/platform/sdl/riscos/riscos.cpp create mode 100644 backends/platform/sdl/riscos/riscos.h create mode 100644 backends/platform/sdl/riscos/riscos.mk create mode 100644 dists/riscos/!Boot,feb create mode 100644 dists/riscos/!Help,feb create mode 100644 dists/riscos/!Run,feb create mode 100644 dists/riscos/!Sprites,ff9 create mode 100644 dists/riscos/!Sprites11,ff9 diff --git a/.gitignore b/.gitignore index 1c2edd7ace1..8981b94acb4 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ lib*.a /MT32_PCM.ROM /ScummVM.app /scummvm.docktileplugin +/\!ScummVM /scummvm-ps3.pkg /*.ipk /.project diff --git a/backends/platform/sdl/module.mk b/backends/platform/sdl/module.mk index 7fde04037f1..bb11aaae97a 100644 --- a/backends/platform/sdl/module.mk +++ b/backends/platform/sdl/module.mk @@ -31,6 +31,12 @@ MODULE_OBJS += \ amigaos/amigaos.o endif +ifdef RISCOS +MODULE_OBJS += \ + riscos/riscos-main.o \ + riscos/riscos.o +endif + ifdef PLAYSTATION3 MODULE_OBJS += \ ps3/ps3-main.o \ diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp index 92354b273ef..e378c37849f 100644 --- a/backends/platform/sdl/posix/posix-main.cpp +++ b/backends/platform/sdl/posix/posix-main.cpp @@ -22,7 +22,7 @@ #include "common/scummsys.h" -#if defined(POSIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(MAEMO) && !defined(WEBOS) && !defined(LINUXMOTO) && !defined(GPH_DEVICE) && !defined(GP2X) && !defined(DINGUX) && !defined(OPENPANDORA) && !defined(PLAYSTATION3) && !defined(PSP2) && !defined(ANDROIDSDL) +#if defined(POSIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(MAEMO) && !defined(WEBOS) && !defined(LINUXMOTO) && !defined(GPH_DEVICE) && !defined(GP2X) && !defined(DINGUX) && !defined(OPENPANDORA) && !defined(PLAYSTATION3) && !defined(PSP2) && !defined(ANDROIDSDL) && !defined(RISCOS) #include "backends/platform/sdl/posix/posix.h" #include "backends/plugins/sdl/sdl-provider.h" diff --git a/backends/platform/sdl/riscos/riscos-main.cpp b/backends/platform/sdl/riscos/riscos-main.cpp new file mode 100644 index 00000000000..2ff8294c1a3 --- /dev/null +++ b/backends/platform/sdl/riscos/riscos-main.cpp @@ -0,0 +1,53 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/scummsys.h" + +#if defined(RISCOS) + +#include "backends/platform/sdl/riscos/riscos.h" +#include "backends/plugins/sdl/sdl-provider.h" +#include "base/main.h" + +int main(int argc, char *argv[]) { + + // Create our OSystem instance + g_system = new OSystem_RISCOS(); + assert(g_system); + + // Pre initialize the backend + ((OSystem_RISCOS *)g_system)->init(); + +#ifdef DYNAMIC_MODULES + PluginManager::instance().addPluginProvider(new SDLPluginProvider()); +#endif + + // Invoke the actual ScummVM main entry point + int res = scummvm_main(argc, argv); + + // Free OSystem + delete (OSystem_RISCOS *)g_system; + + return res; +} + +#endif diff --git a/backends/platform/sdl/riscos/riscos.cpp b/backends/platform/sdl/riscos/riscos.cpp new file mode 100644 index 00000000000..2c761d0f4ca --- /dev/null +++ b/backends/platform/sdl/riscos/riscos.cpp @@ -0,0 +1,106 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#define FORBIDDEN_SYMBOL_EXCEPTION_unistd_h + +#include "common/scummsys.h" + +#ifdef RISCOS + +#include "backends/platform/sdl/riscos/riscos.h" +#include "backends/saves/default/default-saves.h" +#include "backends/fs/posix/posix-fs-factory.h" +#include "backends/fs/posix/posix-fs.h" + +#include +#include + +#ifndef URI_Dispatch +#define URI_Dispatch 0x4e381 +#endif + +void OSystem_RISCOS::init() { + // Initialze File System Factory + _fsFactory = new POSIXFilesystemFactory(); + + // Invoke parent implementation of this method + OSystem_SDL::init(); +} + +void OSystem_RISCOS::initBackend() { + // Create the savefile manager + if (_savefileManager == 0) { + Common::String savePath = "//ScummVM/Saves"; + if (Posix::assureDirectoryExists(savePath)) + _savefileManager = new DefaultSaveFileManager(savePath); + } + + // Invoke parent implementation of this method + OSystem_SDL::initBackend(); +} + +bool OSystem_RISCOS::hasFeature(Feature f) { + if (f == kFeatureOpenUrl) + return true; + + return OSystem_SDL::hasFeature(f); +} + +bool OSystem_RISCOS::openUrl(const Common::String &url) { + int flags; + if (_swix(URI_Dispatch, _INR(0,2)|_OUT(0), 0, url.c_str(), 0, &flags) != NULL) { + warning("openUrl() (RISCOS) failed to open URL"); + return false; + } + if ((flags & 1) == 1) { + warning("openUrl() (RISCOS) failed to open URL"); + return false; + } + return true; +} + +Common::String OSystem_RISCOS::getDefaultConfigFileName() { + return "//ScummVM/scummvm.ini"; +} + +Common::WriteStream *OSystem_RISCOS::createLogFile() { + // Start out by resetting _logFilePath, so that in case + // of a failure, we know that no log file is open. + _logFilePath.clear(); + + Common::String logFile = "//ScummVM/Logs"; + + if (!Posix::assureDirectoryExists(logFile)) { + return 0; + } + + logFile += "/scummvm.log"; + + Common::FSNode file(logFile); + Common::WriteStream *stream = file.createWriteStream(); + if (stream) + _logFilePath = logFile; + return stream; +} + +#endif + diff --git a/backends/platform/sdl/riscos/riscos.h b/backends/platform/sdl/riscos/riscos.h new file mode 100644 index 00000000000..fb23a3e6e35 --- /dev/null +++ b/backends/platform/sdl/riscos/riscos.h @@ -0,0 +1,52 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef PLATFORM_SDL_RISCOS_H +#define PLATFORM_SDL_RISCOS_H + +#include "backends/platform/sdl/sdl.h" + +class OSystem_RISCOS : public OSystem_SDL { +public: + virtual void init(); + virtual void initBackend(); + + virtual bool hasFeature(Feature f); + + virtual bool openUrl(const Common::String &url); + +protected: + /** + * The path of the currently open log file, if any. + * + * @note This is currently a string and not an FSNode for simplicity; + * e.g. we don't need to include fs.h here, and currently the + * only use of this value is to use it to open the log file in an + * editor; for that, we need it only as a string anyway. + */ + Common::String _logFilePath; + + virtual Common::String getDefaultConfigFileName(); + virtual Common::WriteStream *createLogFile(); +}; + +#endif diff --git a/backends/platform/sdl/riscos/riscos.mk b/backends/platform/sdl/riscos/riscos.mk new file mode 100644 index 00000000000..4b631016b71 --- /dev/null +++ b/backends/platform/sdl/riscos/riscos.mk @@ -0,0 +1,20 @@ +# Special target to create an RISC OS snapshot installation +riscosdist: $(EXECUTABLE) + mkdir -p !ScummVM + elf2aif $(EXECUTABLE) !ScummVM/$(EXECUTABLE),ff8 + cp ${srcdir}/dists/riscos/!Boot,feb !ScummVM/!Boot,feb + cp ${srcdir}/dists/riscos/!Run,feb !ScummVM/!Run,feb + cp ${srcdir}/dists/riscos/!Sprites,ff9 !ScummVM/!Sprites,ff9 + cp ${srcdir}/dists/riscos/!Sprites11,ff9 !ScummVM/!Sprites11,ff9 + mkdir -p !ScummVM/data + cp $(DIST_FILES_THEMES) !ScummVM/data/ +ifdef DIST_FILES_ENGINEDATA + cp $(DIST_FILES_ENGINEDATA) !ScummVM/data/ +endif +ifdef DYNAMIC_MODULES + mkdir -p !ScummVM/plugins + cp $(PLUGINS) !ScummVM/plugins/ +endif + mkdir -p !ScummVM/docs + cp ${srcdir}/dists/riscos/!Help,feb !ScummVM/!Help,feb + cp $(DIST_FILES_DOCS) !ScummVM/docs \ No newline at end of file diff --git a/configure b/configure index 3f35902f785..bc85d5b3db9 100755 --- a/configure +++ b/configure @@ -488,7 +488,7 @@ find_libcurlconfig() { # get_system_exe_extension() { case $1 in - arm-riscos) + arm-*riscos) _exeext=",ff8" ;; 3ds | dreamcast | ds | gamecube | n64 | ps2 | psp | wii) @@ -1427,9 +1427,12 @@ androidsdl-x86_64) _host_cpu=x86_64 _host_alias=x86_64-linux-android ;; -arm-riscos) +arm-*riscos) _host_os=riscos _host_cpu=arm + datarootdir='/\' + datadir='${datarootdir}/data' + docdir='${datarootdir}/docs' ;; raspberrypi) _host_os=linux @@ -2712,6 +2715,20 @@ case $_host_os in append_var CXXFLAGS "-D_PSP_FW_VERSION=150" add_line_to_config_mk 'PSP = 1' ;; + riscos) + append_var DEFINES "-DRISCOS" + add_line_to_config_mk 'RISCOS = 1' + append_var LDFLAGS "-L$GCCSDK_INSTALL_ENV/lib" + append_var CXXFLAGS "-I$GCCSDK_INSTALL_ENV/include" + _sdlpath=$GCCSDK_INSTALL_ENV/bin + _freetypepath=$GCCSDK_INSTALL_ENV/bin + _libcurlpath=$GCCSDK_INSTALL_ENV/bin + append_var CXXFLAGS "-march=armv4" + append_var CXXFLAGS "-mtune=xscale" + append_var LDFLAGS "-static" + _optimization_level=-O3 + _port_mk="backends/platform/sdl/riscos/riscos.mk" + ;; solaris*) append_var DEFINES "-DSOLARIS" append_var DEFINES "-DSYSTEM_NOT_SUPPORTING_D_TYPE" @@ -2819,8 +2836,16 @@ if test -n "$_host"; then ;; arm-linux|arm*-linux-gnueabi|arm-*-linux) ;; - arm-riscos|linupy) - append_var DEFINES "-DLINUPY" + arm-*riscos) + _seq_midi=no + _timidity=no + _opengl_mode=none + _build_hq_scalers=no + # toolchain binaries prefixed by host + _ranlib=$_host-ranlib + _strip=$_host-strip + _ar="$_host-ar cru" + _as="$_host-as" ;; bfin*) ;; @@ -3013,6 +3038,9 @@ if test -n "$_host"; then _seq_midi=no _timidity=no ;; + linupy) + append_var DEFINES "-DLINUPY" + ;; m68k-atari-mint) append_var DEFINES "-DSYSTEM_NOT_SUPPORTING_D_TYPE" _ranlib=m68k-atari-mint-ranlib @@ -3577,7 +3605,7 @@ case $_host_os in amigaos* | cygwin* | dreamcast | ds | gamecube | mingw* | n64 | ps2 | ps3 | psp2 | psp | wii | wince) _posix=no ;; - 3ds | android | androidsdl | beos* | bsd* | darwin* | freebsd* | gnu* | gph-linux | haiku* | hpux* | iphone | ios7 | irix*| k*bsd*-gnu* | linux* | maemo | mint* | netbsd* | openbsd* | solaris* | sunos* | uclinux* | webos) + 3ds | android | androidsdl | beos* | bsd* | darwin* | freebsd* | gnu* | gph-linux | haiku* | hpux* | iphone | ios7 | irix*| k*bsd*-gnu* | linux* | maemo | mint* | netbsd* | openbsd* | riscos | solaris* | sunos* | uclinux* | webos) _posix=yes ;; os2-emx*) diff --git a/dists/riscos/!Boot,feb b/dists/riscos/!Boot,feb new file mode 100644 index 00000000000..b286b449fa2 --- /dev/null +++ b/dists/riscos/!Boot,feb @@ -0,0 +1,8 @@ +Set ScummVM$Dir +IconSprites .!Sprites + +Set ScummVM$Title "ScummVM" +Set ScummVM$Description "Play certain classic graphical point-and-click adventure games" +Set ScummVM$Publisher "ScummVM Developers" +Set ScummVM$Web "http://www.scummvm.org/" +Set ScummVM$Version "1.10.0git" diff --git a/dists/riscos/!Help,feb b/dists/riscos/!Help,feb new file mode 100644 index 00000000000..fca98bc69dc --- /dev/null +++ b/dists/riscos/!Help,feb @@ -0,0 +1 @@ +Filer_Opendir .docs diff --git a/dists/riscos/!Run,feb b/dists/riscos/!Run,feb new file mode 100644 index 00000000000..6c38b4b658f --- /dev/null +++ b/dists/riscos/!Run,feb @@ -0,0 +1,13 @@ +Run .!Boot + +RMEnsure SharedUnixLibrary 1.14 RMLoad System:Modules.SharedULib +RMEnsure SharedUnixLibrary 1.14 Error ScummVM requires SharedUnixLibrary 1.14 or later. This can be downloaded from https://www.riscos.info/packages/LibraryDetails.html#SharedUnixLibrary + +RMEnsure DigitalRenderer 0.56 RMLoad System:Modules.DRenderer +RMEnsure DigitalRenderer 0.56 Error ScummVM requires DigitalRenderer 0.56 or later. This can be downloaded from https://www.riscos.info/packages/LibraryDetails.html#DRenderer + +Set ScummVM$stdout >.ScummVM.stdout 2>.ScummVM.stderr +If ""="commands" Then Unset ScummVM$stdout Else CDir .ScummVM + +WimpSlot -min 8192K +Do Run .scummvm %*0 diff --git a/dists/riscos/!Sprites,ff9 b/dists/riscos/!Sprites,ff9 new file mode 100644 index 0000000000000000000000000000000000000000..20d12bbca42e546d184c9c7e389dc235ecbc63ac GIT binary patch literal 7324 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 uFFtF9zj2pmvo-$2cjsvcYtgj?7mkR2l