From f5d73cac8a2d21962ed34b18de5aee36c2bce9ad Mon Sep 17 00:00:00 2001 From: Thomas Edvalson Date: Mon, 11 Apr 2016 15:15:42 -0400 Subject: [PATCH] 3DS: Add CIA format build, add timer handler thread, fix APT service suspending/sleeping/exiting --- backends/platform/3ds/3ds.mk | 21 +- backends/platform/3ds/app/banner.png | Bin 0 -> 19241 bytes backends/platform/3ds/app/banner.wav | Bin 0 -> 2212 bytes backends/platform/3ds/{ => app}/icon.png | Bin backends/platform/3ds/app/scummvm.rsf | 218 +++++++++++++++++++++ backends/platform/3ds/osystem-audio.cpp | 17 +- backends/platform/3ds/osystem-events.cpp | 55 +++++- backends/platform/3ds/osystem-graphics.cpp | 11 +- backends/platform/3ds/osystem.cpp | 9 +- backends/platform/3ds/osystem.h | 4 + configure | 9 +- 11 files changed, 314 insertions(+), 30 deletions(-) create mode 100644 backends/platform/3ds/app/banner.png create mode 100644 backends/platform/3ds/app/banner.wav rename backends/platform/3ds/{ => app}/icon.png (100%) create mode 100644 backends/platform/3ds/app/scummvm.rsf diff --git a/backends/platform/3ds/3ds.mk b/backends/platform/3ds/3ds.mk index bd8e743e1437..7ab58995f6d8 100644 --- a/backends/platform/3ds/3ds.mk +++ b/backends/platform/3ds/3ds.mk @@ -3,7 +3,11 @@ TARGET := scummvm APP_TITLE := ScummVM APP_DESCRIPTION := Point-and-click adventure game engines APP_AUTHOR := ScummVM Team -APP_ICON := backends/platform/3ds/icon.png +APP_ICON := backends/platform/3ds/app/icon.png + +APP_RSF := backends/platform/3ds/app/scummvm.rsf +APP_BANNER_IMAGE:= backends/platform/3ds/app/banner.png +APP_BANNER_AUDIO:= backends/platform/3ds/app/banner.wav ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft CXXFLAGS += -std=gnu++11 @@ -12,20 +16,27 @@ LDFLAGS += -specs=3dsx.specs $(ARCH) -L$(DEVKITPRO)/libctru/lib -L$(DEVKITPRO)/ .PHONY: clean_3ds -all: $(TARGET).3dsx - clean: clean_3ds clean_3ds: $(RM) $(TARGET).3dsx + $(RM) $(TARGET).cia -$(TARGET).smdh: $(APP_ICON) $(MAKEFILE_LIST) - @smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ +$(TARGET).smdh: $(APP_ICON) + @bannertool makesmdh -s "$(APP_TITLE)" -l "$(APP_DESCRIPTION)" -p "$(APP_AUTHOR)" -i $(APP_ICON) -o $@ @echo built ... $(notdir $@) $(TARGET).3dsx: $(EXECUTABLE) $(TARGET).smdh @3dsxtool $< $@ --smdh=$(TARGET).smdh @echo built ... $(notdir $@) + +$(TARGET).bnr: $(APP_BANNER_IMAGE) $(APP_BANNER_AUDIO) + @bannertool makebanner -o $@ -i $(APP_BANNER_IMAGE) -a $(APP_BANNER_AUDIO) + @echo built ... $(notdir $@) + +$(TARGET).cia: $(EXECUTABLE) $(APP_RSF) $(TARGET).smdh $(TARGET).bnr + @makerom -f cia -target t -exefslogo -o $@ -elf $(EXECUTABLE) -rsf $(APP_RSF) -banner $(TARGET).bnr -icon $(TARGET).smdh + @echo built ... $(notdir $@) #--------------------------------------------------------------------------------- # rules for assembling GPU shaders diff --git a/backends/platform/3ds/app/banner.png b/backends/platform/3ds/app/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b02150ecdbccb7899d16d358ec427f1281c81e GIT binary patch literal 19241 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 literal 0 HcmV?d00001 diff --git a/backends/platform/3ds/app/banner.wav b/backends/platform/3ds/app/banner.wav new file mode 100644 index 0000000000000000000000000000000000000000..e0b684b62fea209617584c9533dfc2432b67ebfc GIT binary patch literal 2212 zcmZ9O!H&~F5JboJ*iLTw1bzhxR^rM5&MP5q-1fl7@CjV_IChiR&QPyw8wVn7Y|pf- zyQ``v`|-oW!;eELpWl9Z|MlC`n^P&JD}8zQvy{`XzSMFmUml+xzbhs`eYv%@jf%Rq zQbsMWjdz-!ioRPs6-C{2SGBhMjcctJJ~3Q3tq+RZTGi94wLxp_IRXrjL8{tY6gdd5 zi~F@5gnriA^or%$x2Ud`i{3hD=OQqw+=NALqW;Av4_PxGHSosrnw=U}t<8Z(wN-Dd zLaN%?qR+(av{Ql&YG;*i@H-*yeP@sKeN#5NgVjmbt1^s=U9{8du2&CqIYcZB@G-vc zK?eVR%@ui{UEZTsSoR%jsL+CcRGNfvQN*kWo~aTXdLE_sB1VVuqUTxHy>oL)_8N6} zLTWMwC_tq49r_e~f$4t9t@OLQV1&bw-zYLW%lgKtm= z7t$HtMKhGKXJOM>(GVUEipIxAr8n2WyUw{+Vx_6itWUbjv*SfrbdA2&%-Zb8sGhF& zIpRup#qHfO`eU-F45jdXIvpl(?nO)-)xlX@&$^mzxPo2Jf!U*f&Lpdc6OwD66sU*4 z(H{p@v3M2g6elL93#*$l9>msjT*puuWOI`Kf*WgrHdd088#e7lYQoJ|p-nm;IGdR~ zSfJaZV$V@6b<($I4;R`O;F0zJxi&-TVRShvk_?Do^d`*p{e6Ju7_xYu3c51pYD-N@Izf7 xP>)gb%%cx}8$3Hc{Wx(^2etUk^#2K<@H@vY^Z8p?v)%(cdDWIac#166@ek+nz@z{G literal 0 HcmV?d00001 diff --git a/backends/platform/3ds/icon.png b/backends/platform/3ds/app/icon.png similarity index 100% rename from backends/platform/3ds/icon.png rename to backends/platform/3ds/app/icon.png diff --git a/backends/platform/3ds/app/scummvm.rsf b/backends/platform/3ds/app/scummvm.rsf new file mode 100644 index 000000000000..d403bdbe914b --- /dev/null +++ b/backends/platform/3ds/app/scummvm.rsf @@ -0,0 +1,218 @@ +BasicInfo: + Title : ScummVM + ProductCode : ScummVM + Logo : Nintendo # Nintendo / Licensed / Distributed / iQue / iQueForSystem + +TitleInfo: + Category : Application + UniqueId : 0xFF321 + +Option: + UseOnSD : true # true if App is to be installed to SD + FreeProductCode : true # Removes limitations on ProductCode + MediaFootPadding : false # If true CCI files are created with padding + EnableCrypt : false # Enables encryption for NCCH and CIA + EnableCompress : false # Compresses where applicable (currently only exefs:/.code) + +AccessControlInfo: + CoreVersion : 2 + + # Exheader Format Version + DescVersion : 2 + + # Minimum Required Kernel Version (below is for 4.5.0) + ReleaseKernelMajor : "02" + ReleaseKernelMinor : "33" + + # ExtData + UseExtSaveData : false # enables ExtData + #ExtSaveDataId : 0x300 # only set this when the ID is different to the UniqueId + + # FS:USER Archive Access Permissions + # Uncomment as required + FileSystemAccess: + #- CategorySystemApplication + #- CategoryHardwareCheck + #- CategoryFileSystemTool + #- Debug + #- TwlCardBackup + #- TwlNandData + #- Boss + - DirectSdmc + #- Core + #- CtrNandRo + #- CtrNandRw + #- CtrNandRoWrite + #- CategorySystemSettings + #- CardBoard + #- ExportImportIvs + #- DirectSdmcWrite + #- SwitchCleanup + #- SaveDataMove + #- Shop + #- Shell + #- CategoryHomeMenu + + # Process Settings + MemoryType : Application # Application/System/Base + SystemMode : 64MB # 64MB(Default)/96MB/80MB/72MB/32MB + IdealProcessor : 0 + AffinityMask : 1 + Priority : 16 + MaxCpu : 0 # Let system decide + HandleTableSize : 0x200 + DisableDebug : false + EnableForceDebug : false + CanWriteSharedPage : true + CanUsePrivilegedPriority : false + CanUseNonAlphabetAndNumber : true + PermitMainFunctionArgument : true + CanShareDeviceMemory : true + RunnableOnSleep : false + SpecialMemoryArrange : true + + # New3DS Exclusive Process Settings + SystemModeExt : 124MB # Legacy(Default)/124MB/178MB Legacy:Use Old3DS SystemMode + CpuSpeed : 804MHz # 268MHz(Default)/804MHz + EnableL2Cache : true # false(default)/true + CanAccessCore2 : true + + # Virtual Address Mappings + IORegisterMapping: + - 1ff00000-1ff7ffff # DSP memory + MemoryMapping: + - 1f000000-1f5fffff:r # VRAM + + # Accessible SVCs, : + SystemCallAccess: + ArbitrateAddress: 34 + Break: 60 + CancelTimer: 28 + ClearEvent: 25 + ClearTimer: 29 + CloseHandle: 35 + ConnectToPort: 45 + ControlMemory: 1 + CreateAddressArbiter: 33 + CreateEvent: 23 + CreateMemoryBlock: 30 + CreateMutex: 19 + CreateSemaphore: 21 + CreateThread: 8 + CreateTimer: 26 + DuplicateHandle: 39 + ExitProcess: 3 + ExitThread: 9 + GetCurrentProcessorNumber: 17 + GetHandleInfo: 41 + GetProcessId: 53 + GetProcessIdOfThread: 54 + GetProcessIdealProcessor: 6 + GetProcessInfo: 43 + GetResourceLimit: 56 + GetResourceLimitCurrentValues: 58 + GetResourceLimitLimitValues: 57 + GetSystemInfo: 42 + GetSystemTick: 40 + GetThreadContext: 59 + GetThreadId: 55 + GetThreadIdealProcessor: 15 + GetThreadInfo: 44 + GetThreadPriority: 11 + MapMemoryBlock: 31 + OutputDebugString: 61 + QueryMemory: 2 + ReleaseMutex: 20 + ReleaseSemaphore: 22 + SendSyncRequest1: 46 + SendSyncRequest2: 47 + SendSyncRequest3: 48 + SendSyncRequest4: 49 + SendSyncRequest: 50 + SetThreadPriority: 12 + SetTimer: 27 + SignalEvent: 24 + SleepThread: 10 + UnmapMemoryBlock: 32 + WaitSynchronization1: 36 + WaitSynchronizationN: 37 + Backdoor: 123 + + # Service List + # Maximum 34 services (32 if firmware is prior to 9.3.0) + ServiceAccessControl: + - cfg:u + - fs:USER + - gsp::Gpu + - hid:USER + - ndm:u + - pxi:dev + - APT:U + - ac:u + - act:u + - am:net + - boss:U + - cam:u + - cecd:u + - dsp::DSP + - frd:u + - http:C + - ir:USER + - ir:u + - ir:rst + - ldr:ro + - mic:u + - news:u + - nim:aoc + - nwm::UDS + - ptm:u + - qtm:u + - soc:U + - ssl:C + - y2r:u + + +SystemControlInfo: + SaveDataSize: 0K + RemasterVersion: 0 + StackSize: 0x40000 + + # Modules that run services listed above should be included below + # Maximum 48 dependencies + # If a module is listed that isn't present on the 3DS, the title will get stuck at the logo (3ds waves) + # So act, nfc and qtm are commented for 4.x support. Uncomment if you need these. + # : + Dependency: + ac: 0x0004013000002402 + #act: 0x0004013000003802 + am: 0x0004013000001502 + boss: 0x0004013000003402 + camera: 0x0004013000001602 + cecd: 0x0004013000002602 + cfg: 0x0004013000001702 + codec: 0x0004013000001802 + csnd: 0x0004013000002702 + dlp: 0x0004013000002802 + dsp: 0x0004013000001a02 + friends: 0x0004013000003202 + gpio: 0x0004013000001b02 + gsp: 0x0004013000001c02 + hid: 0x0004013000001d02 + http: 0x0004013000002902 + i2c: 0x0004013000001e02 + ir: 0x0004013000003302 + mcu: 0x0004013000001f02 + mic: 0x0004013000002002 + ndm: 0x0004013000002b02 + news: 0x0004013000003502 + #nfc: 0x0004013000004002 + nim: 0x0004013000002c02 + nwm: 0x0004013000002d02 + pdn: 0x0004013000002102 + ps: 0x0004013000003102 + ptm: 0x0004013000002202 + #qtm: 0x0004013020004202 + ro: 0x0004013000003702 + socket: 0x0004013000002e02 + spi: 0x0004013000002302 + ssl: 0x0004013000002f02 diff --git a/backends/platform/3ds/osystem-audio.cpp b/backends/platform/3ds/osystem-audio.cpp index 7ff788b430b3..7e4822b8e937 100644 --- a/backends/platform/3ds/osystem-audio.cpp +++ b/backends/platform/3ds/osystem-audio.cpp @@ -21,8 +21,8 @@ */ #include "osystem.h" +#include "audio/mixer.h" -static bool exitAudioThread = false; static bool hasAudio = false; static void audioThreadFunc(void* arg) { @@ -34,7 +34,7 @@ static void audioThreadFunc(void* arg) { int bufferIndex = 0; const int bufferCount = 3; const int bufferSize = 80000; // Can't be too small, based on delayMillis duration - const int sampleRate = 22050; + const int sampleRate = mixer->getOutputRate(); int sampleLen = 0; uint32 lastTime = osys->getMillis(true); uint32 time = lastTime; @@ -52,18 +52,18 @@ static void audioThreadFunc(void* arg) { ndspChnSetRate(channel, sampleRate); ndspChnSetFormat(channel, NDSP_FORMAT_STEREO_PCM16); - while(!exitAudioThread) { - bufferIndex++; - bufferIndex %= bufferCount; - ndspWaveBuf* buf = &buffers[bufferIndex]; - + while(!osys->exiting) { osys->delayMillis(100); // Note: Increasing the delay requires a bigger buffer time = osys->getMillis(true); sampleLen = (time - lastTime) * 22 * 4; // sampleRate / 1000 * channelCount * sizeof(int16); lastTime = time; - if (sampleLen > 0) { + if (!osys->sleeping && sampleLen > 0) { + bufferIndex++; + bufferIndex %= bufferCount; + ndspWaveBuf* buf = &buffers[bufferIndex]; + buf->nsamples = mixer->mixCallback(buf->data_adpcm, sampleLen); if (buf->nsamples > 0) { DSP_FlushDataCache(buf->data_vaddr, bufferSize); @@ -91,7 +91,6 @@ void OSystem_3DS::initAudio() { void OSystem_3DS::destroyAudio() { if (hasAudio) { - exitAudioThread = true; threadJoin(audioThread, U64_MAX); threadFree(audioThread); ndspExit(); diff --git a/backends/platform/3ds/osystem-events.cpp b/backends/platform/3ds/osystem-events.cpp index a4ce92c394b2..46efdd3b7ac4 100644 --- a/backends/platform/3ds/osystem-events.cpp +++ b/backends/platform/3ds/osystem-events.cpp @@ -21,12 +21,13 @@ */ #define FORBIDDEN_SYMBOL_ALLOW_ALL +#include "backends/timer/default/default-timer.h" #include "backends/platform/3ds/gui.h" #include "osystem.h" static Common::Mutex *eventMutex; -static bool exitEventThread = false; static InputMode inputMode = MODE_DRAG; +static aptHookCookie cookie; static void pushEventQueue(Common::Queue* queue, Common::Event& event) { Common::StackLock lock(*eventMutex); @@ -42,8 +43,10 @@ static void eventThreadFunc(void* arg) { bool isRightClick = false; Common::Event event; - while(!exitEventThread) { - osys->delayMillis(10); + while(!osys->exiting) { + do { + osys->delayMillis(10); + } while (osys->sleeping && !osys->exiting); hidScanInput(); touchPosition touch; @@ -51,10 +54,6 @@ static void eventThreadFunc(void* arg) { u32 keysPressed = hidKeysDown(); u32 keysReleased = hidKeysUp(); - if (!aptMainLoop()) { - event.type = Common::EVENT_QUIT; - pushEventQueue(eventQueue, event); - } if (held & KEY_TOUCH) { hidTouchRead(&touch); osys->transformPoint(touch); @@ -151,15 +150,53 @@ static void eventThreadFunc(void* arg) { } } +static void aptHookFunc(APT_HookType hookType, void* param) { + auto eventQueue = (Common::Queue*) param; + OSystem_3DS* osys = (OSystem_3DS*) g_system; + Common::Event event; + + switch (hookType) { + case APTHOOK_ONSUSPEND: + case APTHOOK_ONSLEEP: + event.type = Common::EVENT_MAINMENU; + pushEventQueue(eventQueue, event); + osys->sleeping = true; + break; + case APTHOOK_ONRESTORE: + case APTHOOK_ONWAKEUP: + osys->sleeping = false; + break; + default: + event.type = Common::EVENT_QUIT; + pushEventQueue(eventQueue, event); + break; + } +} + +static void timerThreadFunc(void *arg) { + OSystem_3DS* osys = (OSystem_3DS*) arg; + DefaultTimerManager *tm = (DefaultTimerManager *) osys->getTimerManager(); + while (!osys->exiting) { + tm->handler(); + g_system->delayMillis(10); + aptMainLoop(); // Call apt hook when necessary + } +} + void OSystem_3DS::initEvents() { eventMutex = new Common::Mutex(); s32 prio = 0; svcGetThreadPriority(&prio, CUR_THREAD_HANDLE); - _eventThread = threadCreate(&eventThreadFunc, &_eventQueue, 2048, prio-1, -2, false); + _timerThread = threadCreate(&timerThreadFunc, this, 32*1024, prio-1, -2, false); + _eventThread = threadCreate(&eventThreadFunc, &_eventQueue, 32*1024, prio-1, -2, false); + + aptHook(&cookie, aptHookFunc, &_eventQueue); } void OSystem_3DS::destroyEvents() { - exitEventThread = true; + threadJoin(_timerThread, U64_MAX); + threadFree(_timerThread); + threadJoin(_eventThread, U64_MAX); threadFree(_eventThread); delete eventMutex; diff --git a/backends/platform/3ds/osystem-graphics.cpp b/backends/platform/3ds/osystem-graphics.cpp index 5e70dced739d..7ee4efa0a5e7 100644 --- a/backends/platform/3ds/osystem-graphics.cpp +++ b/backends/platform/3ds/osystem-graphics.cpp @@ -180,6 +180,12 @@ void OSystem_3DS::initSize(uint width, uint height, } _gameTexture.setPosition(_gameX, _gameY); _cursorTexture.setScale(_gameTexture.getScaleX(), _gameTexture.getScaleY()); + + float ratio = 400.f / _gameWidth; + int y = (_gameHeight * ratio - 240.f) / 2; + Mtx_Identity(&_focusMatrix); + Mtx_Translate(&_focusMatrix, 0, -y, 0); + Mtx_Scale(&_focusMatrix, ratio, ratio, 1.f); } Common::List OSystem_3DS::getSupportedFormats() const { @@ -248,8 +254,11 @@ void OSystem_3DS::unlockScreen() { } void OSystem_3DS::updateScreen() { + + if (sleeping || exiting) + return; - updateFocus(); +// updateFocus(); C3D_FrameBegin(C3D_FRAME_SYNCDRAW); // Render top screen diff --git a/backends/platform/3ds/osystem.cpp b/backends/platform/3ds/osystem.cpp index fa2980a361c2..d3fc1c71367f 100644 --- a/backends/platform/3ds/osystem.cpp +++ b/backends/platform/3ds/osystem.cpp @@ -65,13 +65,16 @@ _cursorHotspotY(0), _gameX(0), _gameY(0), _gameWidth(320), -_gameHeight(240) { - chdir("/"); +_gameHeight(240), +exiting(false), +sleeping(false) { + chdir("sdmc:/"); _fsFactory = new POSIXFilesystemFactory(); Posix::assureDirectoryExists("/3ds/scummvm/saves/"); } OSystem_3DS::~OSystem_3DS() { + exiting = true; destroyEvents(); destroyAudio(); destroyGraphics(); @@ -81,7 +84,7 @@ OSystem_3DS::~OSystem_3DS() { } void OSystem_3DS::quit() { - // + printf("OSystem_3DS::quit()\n"); } void OSystem_3DS::initBackend() { diff --git a/backends/platform/3ds/osystem.h b/backends/platform/3ds/osystem.h index 98d9ad0cb606..a8c2a909f177 100644 --- a/backends/platform/3ds/osystem.h +++ b/backends/platform/3ds/osystem.h @@ -55,6 +55,9 @@ class OSystem_3DS : public EventsBaseBackend, public PaletteManager { public: OSystem_3DS(); ~OSystem_3DS(); + + volatile bool exiting; + volatile bool sleeping; virtual void initBackend(); @@ -191,6 +194,7 @@ class OSystem_3DS : public EventsBaseBackend, public PaletteManager { // Events Thread _eventThread; + Thread _timerThread; Common::Queue _eventQueue; Common::String _messageOSD; diff --git a/configure b/configure index 03fd5a858db9..c23f9e703c67 100755 --- a/configure +++ b/configure @@ -2409,7 +2409,7 @@ case $_host_os in 3ds) _optimization_level=-O2 append_var DEFINES "-D__3DS__" - append_var DEFINES "-D_3DS" + append_var DEFINES "-DARM" append_var DEFINES "-DARM11" append_var CXXFLAGS "-march=armv6k" append_var CXXFLAGS "-mtune=mpcore" @@ -2737,8 +2737,6 @@ if test -n "$_host"; then append_var DEFINES "-DDISABLE_FANCY_THEMES" append_var DEFINES "-DDISABLE_SID" append_var DEFINES "-DDISABLE_NES_APU" - append_var DEFINES "-DDISABLE_NES_APU" - append_var DEFINES "-DSTREAM_AUDIO_FROM_DISK" _backend="3ds" _build_scalers=no _vkeybd=yes @@ -2749,6 +2747,8 @@ if test -n "$_host"; then _zlib=yes _jpeg=yes _png=yes + _flac=yes + _faad=yes _freetype2=yes _port_mk="backends/platform/3ds/3ds.mk" ;; @@ -4592,6 +4592,9 @@ case $_backend in # during linking stage append_var LIBS "-lc -lgcc -lnosys" ;; + 3ds) + append_var LIBS "-logg -lpng" + ;; esac