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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 S+8!N?I6iu%g@+PVfPVwyF8=ud literal 0 HcmV?d00001 diff --git a/dists/riscos/!Sprites11,ff9 b/dists/riscos/!Sprites11,ff9 new file mode 100644 index 0000000000000000000000000000000000000000..3038943e876990451366df25e161455ec62801eb GIT binary patch literal 11132 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 X$?&YJZx=o?iuOM5F6MMZW4!+ZBF5PT literal 0 HcmV?d00001