diff --git a/Android/Script/copySource.cmd b/Android/Script/copySource.cmd index 87806c1c4..e5da46031 100644 --- a/Android/Script/copySource.cmd +++ b/Android/Script/copySource.cmd @@ -32,7 +32,7 @@ xcopy "%base_dir%/Source/Android/PluginInput" "%base_dir%/Android/jni/Plugin-Inp IF %ERRORLEVEL% NEQ 0 (exit /B 1) echo copy PluginRSP -xcopy "%base_dir%/Source/Android/PluginRSP" "%base_dir%/Android/jni/Plugin-RspHle/" /D /I /F /Y /E +xcopy "%base_dir%/Source/Android/PluginRSP" "%base_dir%/Android/jni/Plugin-Rsp/" /D /I /F /Y /E IF %ERRORLEVEL% NEQ 0 (exit /B 1) echo copy Project64-bridge diff --git a/Android/app/build.gradle b/Android/app/build.gradle index b237473f7..3305f9d58 100644 --- a/Android/app/build.gradle +++ b/Android/app/build.gradle @@ -44,5 +44,4 @@ dependencies { implementation project(':jni:Project64-video') implementation project(':jni:Project64-audio') implementation project(':jni:Plugin-input') - implementation project(':jni:Plugin-RspHle') } diff --git a/Android/jni/Common/AndroidManifest.xml b/Android/jni/Common/AndroidManifest.xml index 1502b6e0b..c86b5de8c 100644 --- a/Android/jni/Common/AndroidManifest.xml +++ b/Android/jni/Common/AndroidManifest.xml @@ -1 +1 @@ - + diff --git a/Android/jni/Plugin-RspHle/.gitignore b/Android/jni/Plugin-Rsp/.gitignore similarity index 100% rename from Android/jni/Plugin-RspHle/.gitignore rename to Android/jni/Plugin-Rsp/.gitignore diff --git a/Android/jni/Plugin-Rsp/AndroidManifest.xml b/Android/jni/Plugin-Rsp/AndroidManifest.xml new file mode 100644 index 000000000..5e38b67b9 --- /dev/null +++ b/Android/jni/Plugin-Rsp/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/Android/jni/Plugin-Rsp/CMakeLists.txt b/Android/jni/Plugin-Rsp/CMakeLists.txt new file mode 100644 index 000000000..ab26d81ad --- /dev/null +++ b/Android/jni/Plugin-Rsp/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 2.8.12) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_C_STANDARD 99) + +project("Project64-rsp") +include_directories(..) + +add_library(Project64-rsp SHARED + main.cpp) + +add_definitions(-DANDROID) + +ADD_SUBDIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/../Settings ${CMAKE_CURRENT_BINARY_DIR}/Settings) +target_link_libraries(Project64-rsp settings) diff --git a/Android/jni/Plugin-RspHle/build.gradle b/Android/jni/Plugin-Rsp/build.gradle similarity index 100% rename from Android/jni/Plugin-RspHle/build.gradle rename to Android/jni/Plugin-Rsp/build.gradle diff --git a/Android/jni/Plugin-RspHle/AndroidManifest.xml b/Android/jni/Plugin-RspHle/AndroidManifest.xml deleted file mode 100644 index 5b9e51cce..000000000 --- a/Android/jni/Plugin-RspHle/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Android/jni/Plugin-RspHle/CMakeLists.txt b/Android/jni/Plugin-RspHle/CMakeLists.txt deleted file mode 100644 index be16bd52a..000000000 --- a/Android/jni/Plugin-RspHle/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12) -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_C_STANDARD 99) - -project("Project64-rsp-hle") - -add_library(Project64-rsp-hle SHARED - alist.cpp - alist_audio.cpp - alist_naudio.cpp - alist_nead.cpp - audio.cpp - cicx105.cpp - hle.cpp - jpeg.cpp - main.cpp - mem.cpp - mp3.cpp - musyx.cpp) - -add_definitions(-DANDROID) - -target_link_libraries(Project64-rsp-hle) diff --git a/Android/jni/Project64-core/AndroidManifest.xml b/Android/jni/Project64-core/AndroidManifest.xml index d4e3c3fa5..2ab25f856 100644 --- a/Android/jni/Project64-core/AndroidManifest.xml +++ b/Android/jni/Project64-core/AndroidManifest.xml @@ -1 +1 @@ - + diff --git a/Android/jni/Project64-rsp-core/AndroidManifest.xml b/Android/jni/Project64-rsp-core/AndroidManifest.xml new file mode 100644 index 000000000..babd11487 --- /dev/null +++ b/Android/jni/Project64-rsp-core/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/Android/jni/Project64-rsp-core/CMakeLists.txt b/Android/jni/Project64-rsp-core/CMakeLists.txt new file mode 100644 index 000000000..de5de383b --- /dev/null +++ b/Android/jni/Project64-rsp-core/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 2.8.12) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_C_STANDARD 99) + +project("Project64.rsp.core") + +add_library(Project64.rsp.core STATIC + Hle/alist.cpp) + +add_definitions(-DANDROID) + +target_link_libraries(Project64.rsp.core) diff --git a/Android/jni/Project64-rsp-core/build.gradle b/Android/jni/Project64-rsp-core/build.gradle new file mode 100644 index 000000000..c4b7a750a --- /dev/null +++ b/Android/jni/Project64-rsp-core/build.gradle @@ -0,0 +1,63 @@ +apply plugin: 'com.android.library' +apply from: '../../config/version.gradle' + +android { + + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + ndk { + debugSymbolLevel 'FULL' + } + } + debug { + minifyEnabled true + jniDebuggable true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + ndk { + debugSymbolLevel 'FULL' + } + } + } + + externalNativeBuild { + cmake { + version "3.22.1" + path "CMakeLists.txt" + } + } + + defaultConfig { + externalNativeBuild { + cmake { + arguments "-DANDROID=1", "-DCMAKE_BUILD_TYPE=Release", "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang" + cppFlags "-fexceptions", "-ffast-math", "-ftree-vectorize" + cFlags "-ffast-math", "-ftree-vectorize" + abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" + } + } + } + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + } + } + + packagingOptions { + exclude 'lib/x86/libc++_shared.so' + exclude 'lib/x86_64/libc++_shared.so' + exclude 'lib/armeabi-v7a/libc++_shared.so' + exclude 'lib/arm64-v8a/libc++_shared.so' + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) +} + diff --git a/Android/jni/Project64-rsp-core/proguard-rules.pro b/Android/jni/Project64-rsp-core/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/Android/jni/Project64-rsp-core/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/Android/settings.gradle b/Android/settings.gradle index b5356919f..ef6194156 100644 --- a/Android/settings.gradle +++ b/Android/settings.gradle @@ -1,2 +1,2 @@ rootProject.name = 'Project64' -include ':app', ':jni:3rdParty:asmjit', ':jni:3rdParty:png', ':jni:3rdParty:zlib', ':jni:Common', ':jni:Settings', ':jni:Project64-core', ':jni:Project64-bridge', ':jni:Project64-video', ':jni:Project64-audio', ':jni:Plugin-input', ':jni:Plugin-RspHle' +include ':app', ':jni:3rdParty:asmjit', ':jni:3rdParty:png', ':jni:3rdParty:zlib', ':jni:Common', ':jni:Settings', ':jni:Project64-core', ':jni:Project64-bridge', ':jni:Project64-video', ':jni:Project64-audio', ':jni:Plugin-input' diff --git a/Project64.sln b/Project64.sln index 1511d8c89..0ed4cc0ba 100644 --- a/Project64.sln +++ b/Project64.sln @@ -60,7 +60,6 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Project64", "Source\Project64\Project64.vcxproj", "{7E534C8E-1ACE-4A88-8807-39A11ED4DA18}" ProjectSection(ProjectDependencies) = postProject {A7ED562C-63F3-4B7E-B6B3-2CF7848752E1} = {A7ED562C-63F3-4B7E-B6B3-2CF7848752E1} - {B685BB34-D700-4FCC-8503-9B6AA1A0C95D} = {B685BB34-D700-4FCC-8503-9B6AA1A0C95D} {D3F979CE-8FA7-48C9-A2B3-A33594B48536} = {D3F979CE-8FA7-48C9-A2B3-A33594B48536} EndProjectSection EndProject diff --git a/Source/Android/PluginRSP/PluginRSP.vcxproj b/Source/Android/PluginRSP/PluginRSP.vcxproj index ace8f7e86..0b22ff741 100644 --- a/Source/Android/PluginRSP/PluginRSP.vcxproj +++ b/Source/Android/PluginRSP/PluginRSP.vcxproj @@ -20,8 +20,7 @@ {B685BB34-D700-4FCC-8503-9B6AA1A0C95D} - Win32Proj - RSPhle + RSPbasic DynamicLibrary @@ -33,45 +32,34 @@ - RSP-HLE - RSP-HLE_d + Project64-RSP-Basic + Project64-RSP-Basic_d $(SolutionDir)Plugin\RSP\ $(SolutionDir)Plugin64\RSP\ NotUsing - Level3 - 4800;%(DisableSpecificWarnings) - - - - - - - - - - - - - Create - - - - - - - - - - - + + {b4a4b994-9111-42b1-93c2-6f1ca8bc4421} + + + {7598f6b8-9da6-4897-b26f-f6865f824bf4} + + + {8b9961b1-88d9-4ea3-a752-507a00dd9f3d} + + + + + + + \ No newline at end of file diff --git a/Source/Android/PluginRSP/PluginRSP.vcxproj.filters b/Source/Android/PluginRSP/PluginRSP.vcxproj.filters index 4b42503c2..ce42de2e2 100644 --- a/Source/Android/PluginRSP/PluginRSP.vcxproj.filters +++ b/Source/Android/PluginRSP/PluginRSP.vcxproj.filters @@ -18,72 +18,14 @@ Source Files - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - + + Resource Files + + + + Header Files diff --git a/Source/Android/PluginRSP/Project64-rsp.rc b/Source/Android/PluginRSP/Project64-rsp.rc new file mode 100644 index 000000000..76806e016 --- /dev/null +++ b/Source/Android/PluginRSP/Project64-rsp.rc @@ -0,0 +1,74 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" +#include "../../Project64-rsp-core/Version.h" + +#define APSTUDIO_READONLY_SYMBOLS + +#include "WinResrc.h" + +#ifdef IDC_STATIC +#undef IDC_STATIC +#endif +#define IDC_STATIC (-1) + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (Australia) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENA) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VER_FILE_VERSION + PRODUCTVERSION VER_PRODUCT_VERSION + FILEFLAGSMASK 0x3fL + FILEFLAGS VER_FILEFLAGS + FILEOS VER_FILEOS + FILETYPE VER_FILETYPE + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "0c0904b0" + BEGIN + VALUE "FileDescription", VER_FILE_DESCRIPTION_STR "\0" + VALUE "FileVersion", VER_FILE_VERSION_STR "\0" + VALUE "InternalName", VER_INTERNAL_NAME_STR "\0" + VALUE "LegalCopyright", VER_COPYRIGHT_STR "\0" + VALUE "OriginalFilename", VER_ORIGINAL_FILENAME_STR "\0" + VALUE "ProductName", VER_PRODUCTNAME_STR + VALUE "ProductVersion", VER_PRODUCT_VERSION_STR "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // English (Australia) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Source/Android/PluginRSP/Rsp.h b/Source/Android/PluginRSP/Rsp.h index 97fcfa70b..c9af82038 100644 --- a/Source/Android/PluginRSP/Rsp.h +++ b/Source/Android/PluginRSP/Rsp.h @@ -5,7 +5,7 @@ typedef struct { void * hInst; - int32_t MemoryBswaped; // If this is set to TRUE, then the memory has been pre-bswap'd on a DWORD (32-bits) boundary + int32_t MemoryBswaped; // If this is set to TRUE, then the memory has been pre-bswap'd on a DWORD (32-bits) boundary uint8_t * RDRAM; uint8_t * DMEM; uint8_t * IMEM; @@ -31,11 +31,11 @@ typedef struct uint32_t * DPC_PIPEBUSY_REG; uint32_t * DPC_TMEM_REG; - void(*CheckInterrupts)(void); - void(*ProcessDList)(void); - void(*ProcessAList)(void); - void(*ProcessRdpList)(void); - void(*ShowCFB)(void); + void (*CheckInterrupts)(void); + void (*ProcessDList)(void); + void (*ProcessAList)(void); + void (*ProcessRdpList)(void); + void (*ShowCFB)(void); } RSP_INFO; EXPORT void CloseDLL(void); diff --git a/Source/Android/PluginRSP/Version.h b/Source/Android/PluginRSP/Version.h deleted file mode 100644 index 1a18a3958..000000000 --- a/Source/Android/PluginRSP/Version.h +++ /dev/null @@ -1,31 +0,0 @@ -#define STRINGIZE2(s) #s -#define STRINGIZE(s) STRINGIZE2(s) - -#define VERSION_MAJOR 1 -#define VERSION_MINOR 0 -#define VERSION_REVISION 1 -#define VERSION_BUILD 9999 - -#define VER_FILE_DESCRIPTION_STR "RSP HLE Plugin" -#define VER_FILE_VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, VERSION_BUILD -#define VER_FILE_VERSION_STR STRINGIZE(VERSION_MAJOR) \ - "." STRINGIZE(VERSION_MINOR) \ - "." STRINGIZE(VERSION_REVISION) \ - "." STRINGIZE(VERSION_BUILD) \ - -#define VER_PRODUCTNAME_STR "RSP-HLE" -#define VER_PRODUCT_VERSION VER_FILE_VERSION -#define VER_PRODUCT_VERSION_STR VER_FILE_VERSION_STR -#define VER_ORIGINAL_FILENAME_STR VER_PRODUCTNAME_STR ".dll" -#define VER_INTERNAL_NAME_STR VER_PRODUCTNAME_STR -#define VER_COPYRIGHT_STR "Copyright (C) 2021" - -#ifdef _DEBUG -#define VER_VER_DEBUG VS_FF_DEBUG -#else -#define VER_VER_DEBUG 0 -#endif - -#define VER_FILEOS VOS_NT_WINDOWS32 -#define VER_FILEFLAGS VER_VER_DEBUG -#define VER_FILETYPE VFT_DLL diff --git a/Source/Android/PluginRSP/alist.h b/Source/Android/PluginRSP/alist.h deleted file mode 100644 index daaf2c005..000000000 --- a/Source/Android/PluginRSP/alist.h +++ /dev/null @@ -1,50 +0,0 @@ -// Project64 - A Nintendo 64 emulator -// https://www.pj64-emu.com/ -// Copyright(C) 2001-2021 Project64 -// Copyright(C) 2014 Bobby Smiles -// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html - -#pragma once -class CHle; - -typedef void(*acmd_callback_t)(CHle* hle, uint32_t w1, uint32_t w2); - -void alist_process(CHle * hle, const acmd_callback_t abi[], unsigned int abi_size); -uint32_t alist_get_address(CHle * hle, uint32_t so, const uint32_t *segments, size_t n); -void alist_set_address(CHle * hle, uint32_t so, uint32_t *segments, size_t n); -void alist_clear(CHle * hle, uint16_t dmem, uint16_t count); -void alist_load(CHle * hle, uint16_t dmem, uint32_t address, uint16_t count); -void alist_save(CHle * hle, uint16_t dmem, uint32_t address, uint16_t count); -void alist_move(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count); -void alist_copy_every_other_sample(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count); -void alist_repeat64(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint8_t count); -void alist_copy_blocks(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t block_size, uint8_t count); -void alist_interleave(CHle * hle, uint16_t dmemo, uint16_t left, uint16_t right, uint16_t count); -void alist_envmix_exp( CHle * hle, bool init, bool aux, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, uint16_t count, int16_t dry, int16_t wet, const int16_t *vol, const int16_t *target, const int32_t *rate, uint32_t address); -void alist_envmix_ge( CHle * hle, bool init, bool aux, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, uint16_t count, int16_t dry, int16_t wet, const int16_t *vol, const int16_t *target, const int32_t *rate, uint32_t address); -void alist_envmix_lin( CHle * hle, bool init, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, uint16_t count, int16_t dry, int16_t wet, const int16_t *vol, const int16_t *target, const int32_t *rate, uint32_t address); -void alist_envmix_nead( CHle * hle, bool swap_wet_LR, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, unsigned count, uint16_t *env_values, uint16_t *env_steps, const int16_t *xors); -void alist_mix(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count, int16_t gain); -void alist_multQ44(CHle * hle, uint16_t dmem, uint16_t count, int8_t gain); -void alist_add(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count); -void alist_adpcm( CHle * hle, bool init, bool loop, bool two_bit_per_sample, uint16_t dmemo, uint16_t dmemi, uint16_t count, const int16_t* codebook, uint32_t loop_address, uint32_t last_frame_address); -void alist_resample( CHle * hle, bool init, bool flag2, uint16_t dmemo, uint16_t dmemi, uint16_t count, uint32_t pitch, uint32_t address); -void alist_polef( CHle * hle, bool init,uint16_t dmemo, uint16_t dmemi, uint16_t count, uint16_t gain, int16_t* table, uint32_t address); -void alist_iirf( CHle * hle, bool init, uint16_t dmemo, uint16_t dmemi, uint16_t count, int16_t* table, uint32_t address); -void alist_resample_zoh( CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count, uint32_t pitch, uint32_t pitch_accu); -void alist_filter( CHle * hle, uint16_t dmem, uint16_t count, uint32_t address, const uint32_t* lut_address); - -// Audio flags - -#define A_INIT 0x01 -#define A_CONTINUE 0x00 -#define A_LOOP 0x02 -#define A_OUT 0x02 -#define A_LEFT 0x02 -#define A_RIGHT 0x00 -#define A_VOL 0x04 -#define A_RATE 0x00 -#define A_AUX 0x08 -#define A_NOAUX 0x00 -#define A_MAIN 0x00 -#define A_MIX 0x10 diff --git a/Source/Android/PluginRSP/audio.cpp b/Source/Android/PluginRSP/audio.cpp deleted file mode 100644 index 6f88df073..000000000 --- a/Source/Android/PluginRSP/audio.cpp +++ /dev/null @@ -1,114 +0,0 @@ -// Project64 - A Nintendo 64 emulator -// https://www.pj64-emu.com/ -// Copyright(C) 2001-2021 Project64 -// Copyright(C) 2014 Bobby Smiles -// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html - -#include "stdafx.h" -#include -#include "audio.h" - -#include "arithmetics.h" - -const int16_t RESAMPLE_LUT[64 * 4] = -{ - (int16_t)0x0c39u, (int16_t)0x66adu, (int16_t)0x0d46u, (int16_t)0xffdfu, - (int16_t)0x0b39u, (int16_t)0x6696u, (int16_t)0x0e5fu, (int16_t)0xffd8u, - (int16_t)0x0a44u, (int16_t)0x6669u, (int16_t)0x0f83u, (int16_t)0xffd0u, - (int16_t)0x095au, (int16_t)0x6626u, (int16_t)0x10b4u, (int16_t)0xffc8u, - (int16_t)0x087du, (int16_t)0x65cdu, (int16_t)0x11f0u, (int16_t)0xffbfu, - (int16_t)0x07abu, (int16_t)0x655eu, (int16_t)0x1338u, (int16_t)0xffb6u, - (int16_t)0x06e4u, (int16_t)0x64d9u, (int16_t)0x148cu, (int16_t)0xffacu, - (int16_t)0x0628u, (int16_t)0x643fu, (int16_t)0x15ebu, (int16_t)0xffa1u, - (int16_t)0x0577u, (int16_t)0x638fu, (int16_t)0x1756u, (int16_t)0xff96u, - (int16_t)0x04d1u, (int16_t)0x62cbu, (int16_t)0x18cbu, (int16_t)0xff8au, - (int16_t)0x0435u, (int16_t)0x61f3u, (int16_t)0x1a4cu, (int16_t)0xff7eu, - (int16_t)0x03a4u, (int16_t)0x6106u, (int16_t)0x1bd7u, (int16_t)0xff71u, - (int16_t)0x031cu, (int16_t)0x6007u, (int16_t)0x1d6cu, (int16_t)0xff64u, - (int16_t)0x029fu, (int16_t)0x5ef5u, (int16_t)0x1f0bu, (int16_t)0xff56u, - (int16_t)0x022au, (int16_t)0x5dd0u, (int16_t)0x20b3u, (int16_t)0xff48u, - (int16_t)0x01beu, (int16_t)0x5c9au, (int16_t)0x2264u, (int16_t)0xff3au, - (int16_t)0x015bu, (int16_t)0x5b53u, (int16_t)0x241eu, (int16_t)0xff2cu, - (int16_t)0x0101u, (int16_t)0x59fcu, (int16_t)0x25e0u, (int16_t)0xff1eu, - (int16_t)0x00aeu, (int16_t)0x5896u, (int16_t)0x27a9u, (int16_t)0xff10u, - (int16_t)0x0063u, (int16_t)0x5720u, (int16_t)0x297au, (int16_t)0xff02u, - (int16_t)0x001fu, (int16_t)0x559du, (int16_t)0x2b50u, (int16_t)0xfef4u, - (int16_t)0xffe2u, (int16_t)0x540du, (int16_t)0x2d2cu, (int16_t)0xfee8u, - (int16_t)0xffacu, (int16_t)0x5270u, (int16_t)0x2f0du, (int16_t)0xfedbu, - (int16_t)0xff7cu, (int16_t)0x50c7u, (int16_t)0x30f3u, (int16_t)0xfed0u, - (int16_t)0xff53u, (int16_t)0x4f14u, (int16_t)0x32dcu, (int16_t)0xfec6u, - (int16_t)0xff2eu, (int16_t)0x4d57u, (int16_t)0x34c8u, (int16_t)0xfebdu, - (int16_t)0xff0fu, (int16_t)0x4b91u, (int16_t)0x36b6u, (int16_t)0xfeb6u, - (int16_t)0xfef5u, (int16_t)0x49c2u, (int16_t)0x38a5u, (int16_t)0xfeb0u, - (int16_t)0xfedfu, (int16_t)0x47edu, (int16_t)0x3a95u, (int16_t)0xfeacu, - (int16_t)0xfeceu, (int16_t)0x4611u, (int16_t)0x3c85u, (int16_t)0xfeabu, - (int16_t)0xfec0u, (int16_t)0x4430u, (int16_t)0x3e74u, (int16_t)0xfeacu, - (int16_t)0xfeb6u, (int16_t)0x424au, (int16_t)0x4060u, (int16_t)0xfeafu, - (int16_t)0xfeafu, (int16_t)0x4060u, (int16_t)0x424au, (int16_t)0xfeb6u, - (int16_t)0xfeacu, (int16_t)0x3e74u, (int16_t)0x4430u, (int16_t)0xfec0u, - (int16_t)0xfeabu, (int16_t)0x3c85u, (int16_t)0x4611u, (int16_t)0xfeceu, - (int16_t)0xfeacu, (int16_t)0x3a95u, (int16_t)0x47edu, (int16_t)0xfedfu, - (int16_t)0xfeb0u, (int16_t)0x38a5u, (int16_t)0x49c2u, (int16_t)0xfef5u, - (int16_t)0xfeb6u, (int16_t)0x36b6u, (int16_t)0x4b91u, (int16_t)0xff0fu, - (int16_t)0xfebdu, (int16_t)0x34c8u, (int16_t)0x4d57u, (int16_t)0xff2eu, - (int16_t)0xfec6u, (int16_t)0x32dcu, (int16_t)0x4f14u, (int16_t)0xff53u, - (int16_t)0xfed0u, (int16_t)0x30f3u, (int16_t)0x50c7u, (int16_t)0xff7cu, - (int16_t)0xfedbu, (int16_t)0x2f0du, (int16_t)0x5270u, (int16_t)0xffacu, - (int16_t)0xfee8u, (int16_t)0x2d2cu, (int16_t)0x540du, (int16_t)0xffe2u, - (int16_t)0xfef4u, (int16_t)0x2b50u, (int16_t)0x559du, (int16_t)0x001fu, - (int16_t)0xff02u, (int16_t)0x297au, (int16_t)0x5720u, (int16_t)0x0063u, - (int16_t)0xff10u, (int16_t)0x27a9u, (int16_t)0x5896u, (int16_t)0x00aeu, - (int16_t)0xff1eu, (int16_t)0x25e0u, (int16_t)0x59fcu, (int16_t)0x0101u, - (int16_t)0xff2cu, (int16_t)0x241eu, (int16_t)0x5b53u, (int16_t)0x015bu, - (int16_t)0xff3au, (int16_t)0x2264u, (int16_t)0x5c9au, (int16_t)0x01beu, - (int16_t)0xff48u, (int16_t)0x20b3u, (int16_t)0x5dd0u, (int16_t)0x022au, - (int16_t)0xff56u, (int16_t)0x1f0bu, (int16_t)0x5ef5u, (int16_t)0x029fu, - (int16_t)0xff64u, (int16_t)0x1d6cu, (int16_t)0x6007u, (int16_t)0x031cu, - (int16_t)0xff71u, (int16_t)0x1bd7u, (int16_t)0x6106u, (int16_t)0x03a4u, - (int16_t)0xff7eu, (int16_t)0x1a4cu, (int16_t)0x61f3u, (int16_t)0x0435u, - (int16_t)0xff8au, (int16_t)0x18cbu, (int16_t)0x62cbu, (int16_t)0x04d1u, - (int16_t)0xff96u, (int16_t)0x1756u, (int16_t)0x638fu, (int16_t)0x0577u, - (int16_t)0xffa1u, (int16_t)0x15ebu, (int16_t)0x643fu, (int16_t)0x0628u, - (int16_t)0xffacu, (int16_t)0x148cu, (int16_t)0x64d9u, (int16_t)0x06e4u, - (int16_t)0xffb6u, (int16_t)0x1338u, (int16_t)0x655eu, (int16_t)0x07abu, - (int16_t)0xffbfu, (int16_t)0x11f0u, (int16_t)0x65cdu, (int16_t)0x087du, - (int16_t)0xffc8u, (int16_t)0x10b4u, (int16_t)0x6626u, (int16_t)0x095au, - (int16_t)0xffd0u, (int16_t)0x0f83u, (int16_t)0x6669u, (int16_t)0x0a44u, - (int16_t)0xffd8u, (int16_t)0x0e5fu, (int16_t)0x6696u, (int16_t)0x0b39u, - (int16_t)0xffdfu, (int16_t)0x0d46u, (int16_t)0x66adu, (int16_t)0x0c39u -}; - -int32_t rdot(size_t n, const int16_t *x, const int16_t *y) -{ - int32_t accu = 0; - - y += n; - - while (n != 0) { - accu += *(x++) * *(--y); - --n; - } - - return accu; -} - -void adpcm_compute_residuals(int16_t* dst, const int16_t* src, - const int16_t* cb_entry, const int16_t* last_samples, size_t count) -{ - const int16_t* const book1 = cb_entry; - const int16_t* const book2 = cb_entry + 8; - - const int16_t l1 = last_samples[0]; - const int16_t l2 = last_samples[1]; - - size_t i; - - assert(count <= 8); - - for (i = 0; i < count; ++i) - { - int32_t accu = (int32_t)src[i] << 11; - accu += book1[i] * l1 + book2[i] * l2 + rdot(i, book2, src); - dst[i] = clamp_s16(accu >> 11); - } -} diff --git a/Source/Android/PluginRSP/common.h b/Source/Android/PluginRSP/common.h deleted file mode 100644 index fb48ad270..000000000 --- a/Source/Android/PluginRSP/common.h +++ /dev/null @@ -1,51 +0,0 @@ -// Project64 - A Nintendo 64 emulator -// https://www.pj64-emu.com/ -// Copyright(C) 2001-2021 Project64 -// Copyright(C) 2014 Bobby Smiles -// Copyright(C) 2009 Richard Goedeken -// Copyright(C) 2002 Hacktarux -// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html - -#pragma once - -// Macro for unused variable warning suppression -#ifdef __GNUC__ -# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__)) -#else -# define UNUSED(x) /* x */ -#endif - -// Macro for inline keyword -#ifdef _MSC_VER -#define inline __inline -#endif - -// DLL function linking -#if defined(_WIN32) -#define EXPORT extern "C" __declspec(dllexport) -#define CALL __cdecl -#else -#define EXPORT extern "C" __attribute__((visibility("default"))) -#define CALL -#endif - -// Plugin types -enum -{ - PLUGIN_TYPE_RSP = 1, - PLUGIN_TYPE_VIDEO = 2, - PLUGIN_TYPE_AUDIO = 3, - PLUGIN_TYPE_CONTROLLER = 4, -}; - -// Structures -typedef struct -{ - uint16_t Version; // Should be set to 0x0101 - uint16_t Type; // Set to PLUGIN_TYPE_RSP - char Name[100]; // Name of the DLL - - // If DLL supports memory, these memory options then set them to TRUE or FALSE if it does not support it - int NormalMemory; // A normal BYTE array - int MemoryBswaped; // A normal BYTE array where the memory has been pre-bswap'd on a DWORD (32-bits) boundary -} PLUGIN_INFO; diff --git a/Source/Android/PluginRSP/hle.h b/Source/Android/PluginRSP/hle.h deleted file mode 100644 index 964a68d5f..000000000 --- a/Source/Android/PluginRSP/hle.h +++ /dev/null @@ -1,158 +0,0 @@ -// Project64 - A Nintendo 64 emulator -// https://www.pj64-emu.com/ -// Copyright(C) 2001-2021 Project64 -// Copyright(C) 2014 Bobby Smiles -// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html - -#pragma once -#include -#include "Rsp.h" -#include "ucodes.h" - -// Signal processor interface flags - -enum -{ - SP_CLR_HALT = 0x00001, // Bit 0: Clear halt - SP_SET_HALT = 0x00002, // Bit 1: Set halt - SP_CLR_BROKE = 0x00004, // Bit 2: Clear broke - SP_CLR_INTR = 0x00008, // Bit 3: Clear INTR - SP_SET_INTR = 0x00010, // Bit 4: Set INTR - SP_CLR_SSTEP = 0x00020, // Bit 5: Clear SSTEP - SP_SET_SSTEP = 0x00040, // Bit 6: Set SSTEP - SP_CLR_INTR_BREAK = 0x00080, // Bit 7: Clear INTR on break - SP_SET_INTR_BREAK = 0x00100, // Bit 8: Set INTR on break - SP_CLR_SIG0 = 0x00200, // Bit 9: Clear signal 0 - SP_SET_SIG0 = 0x00400, // Bit 10: Set signal 0 - SP_CLR_SIG1 = 0x00800, // Bit 11: Clear signal 1 - SP_SET_SIG1 = 0x01000, // Bit 12: Set signal 1 - SP_CLR_SIG2 = 0x02000, // Bit 13: Clear signal 2 - SP_SET_SIG2 = 0x04000, // Bit 14: Set signal 2 - SP_CLR_SIG3 = 0x08000, // Bit 15: Clear signal 3 - SP_SET_SIG3 = 0x10000, // Bit 16: Set signal 3 - SP_CLR_SIG4 = 0x20000, // Bit 17: Clear signal 4 - SP_SET_SIG4 = 0x40000, // Bit 18: Set signal 4 - SP_CLR_SIG5 = 0x80000, // Bit 19: Clear signal 5 - SP_SET_SIG5 = 0x100000, // Bit 20: Set signal 5 - SP_CLR_SIG6 = 0x200000, // Bit 21: Clear signal 6 - SP_SET_SIG6 = 0x400000, // Bit 22: Set signal 6 - SP_CLR_SIG7 = 0x800000, // Bit 23: Clear signal 7 - SP_SET_SIG7 = 0x1000000, // Bit 24: Set signal 7 - - SP_STATUS_HALT = 0x001, // Bit 0: Halt - SP_STATUS_BROKE = 0x002, // Bit 1: Broke - SP_STATUS_DMA_BUSY = 0x004, // Bit 2: DMA busy - SP_STATUS_DMA_FULL = 0x008, // Bit 3: DMA full - SP_STATUS_IO_FULL = 0x010, // Bit 4: IO full - SP_STATUS_SSTEP = 0x020, // Bit 5: Single step - SP_STATUS_INTR_BREAK = 0x040, // Bit 6: Interrupt on break - SP_STATUS_SIG0 = 0x080, // Bit 7: Signal 0 set - SP_STATUS_SIG1 = 0x100, // Bit 8: Signal 1 set - SP_STATUS_SIG2 = 0x200, // Bit 9: Signal 2 set - SP_STATUS_SIG3 = 0x400, // Bit 10: Signal 3 set - SP_STATUS_SIG4 = 0x800, // Bit 11: Signal 4 set - SP_STATUS_SIG5 = 0x1000, // Bit 12: Signal 5 set - SP_STATUS_SIG6 = 0x2000, // Bit 13: Signal 6 set - SP_STATUS_SIG7 = 0x4000, // Bit 14: Signal 7 set -}; - -// MIPS interface flags - -enum -{ - MI_INTR_SP = 0x01, // Bit 0: SP INTR - MI_INTR_SI = 0x02, // Bit 1: SI INTR - MI_INTR_AI = 0x04, // Bit 2: AI INTR - MI_INTR_VI = 0x08, // Bit 3: VI INTR - MI_INTR_PI = 0x10, // Bit 4: PI INTR - MI_INTR_DP = 0x20, // Bit 5: DP INTR -}; - -class CHle -{ -public: - CHle(const RSP_INFO & Rsp_Info); - ~CHle(); - - uint8_t * dram() { return m_dram; } - uint8_t * dmem() { return m_dmem; } - uint8_t * imem() { return m_imem; } - - bool AudioHle() { return m_AudioHle; } - bool GraphicsHle() { return m_GraphicsHle; } - struct alist_audio_t & alist_audio() { return m_alist_audio; } - struct alist_naudio_t & alist_naudio() { return m_alist_naudio; } - struct alist_nead_t & alist_nead() { return m_alist_nead; } - uint8_t * mp3_buffer() { return &m_mp3_buffer[0]; } - - uint8_t * alist_buffer() { return &m_alist_buffer[0]; } - - void VerboseMessage(const char *message, ...); - void WarnMessage(const char *message, ...); - void ErrorMessage(const char *message, ...); - - void rsp_break(uint32_t setbits); - void hle_execute(void); - -private: - CHle(void); - CHle(const CHle&); - CHle& operator=(const CHle&); - - bool is_task(void); - bool try_fast_audio_dispatching(void); - bool try_fast_task_dispatching(void); - void normal_task_dispatching(void); - void non_task_dispatching(void); - - uint8_t * m_dram; - uint8_t * m_dmem; - uint8_t * m_imem; - - uint32_t* m_mi_intr; - - uint32_t* m_sp_mem_addr; - uint32_t* m_sp_dram_addr; - uint32_t* m_sp_rd_length; - uint32_t* m_sp_wr_length; - uint32_t* m_sp_status; - uint32_t* m_sp_dma_full; - uint32_t* m_sp_dma_busy; - uint32_t* m_sp_pc; - uint32_t* m_sp_semaphore; - - uint32_t* m_dpc_start; - uint32_t* m_dpc_end; - uint32_t* m_dpc_current; - uint32_t* m_dpc_status; - uint32_t* m_dpc_clock; - uint32_t* m_dpc_bufbusy; - uint32_t* m_dpc_pipebusy; - uint32_t* m_dpc_tmem; - - void(*m_CheckInterrupts)(void); - void(*m_ProcessDList)(void); - void(*m_ProcessAList)(void); - void(*m_ProcessRdpList)(void); - void(*m_ShowCFB)(void); - - // alist.cpp - uint8_t m_alist_buffer[0x1000]; - - // alist_audio.cpp - struct alist_audio_t m_alist_audio; - - // alist_naudio.cpp - struct alist_naudio_t m_alist_naudio; - - // alist_nead.cpp - struct alist_nead_t m_alist_nead; - - // mp3.cpp - uint8_t m_mp3_buffer[0x1000]; - - bool m_AudioHle; - bool m_GraphicsHle; - bool m_ForwardAudio; - bool m_ForwardGFX; -}; diff --git a/Source/Android/PluginRSP/main.cpp b/Source/Android/PluginRSP/main.cpp index f31bc1d88..cdbe8d53d 100644 --- a/Source/Android/PluginRSP/main.cpp +++ b/Source/Android/PluginRSP/main.cpp @@ -1,7 +1,8 @@ -#include "stdafx.h" -#include "Rsp.h" - -CHle * g_hle = NULL; +#include +#include +#include +#include +#include #ifdef _WIN32 #include @@ -17,123 +18,101 @@ BOOL WINAPI DllMain(void * hinst, DWORD /*fdwReason*/, LPVOID /*lpvReserved*/) /* Function: CloseDLL -Purpose: This function is called when the emulator is closing +Purpose: This function is called when the emulator is closing down allowing the DLL to de-initialize. -Input: None -Output: None +Input: None +Output: None */ void CloseDLL(void) { - if (g_hle) - { - delete g_hle; - g_hle = NULL; - } + FreeRSP(); } /* Function: DllAbout -Purpose: This function is optional function that is provided +Purpose: This function is optional function that is provided to give further information about the DLL. -Input: A handle to the window that calls this function -Output: None +Input: A handle to the window that calls this function +Output: None */ void DllAbout(void * hParent) { #ifdef _WIN32 - MessageBox((HWND)hParent, L"need to do", L"About", MB_OK | MB_ICONINFORMATION); + MessageBox((HWND)hParent, L"need to do", L"About", MB_OK | MB_ICONINFORMATION); #endif } -/* -Function: DoRspCycles -Purpose: This function is to allow the RSP to run in parallel with -the r4300 switching control back to the r4300 once the -function ends. -Input: The number of cycles that is meant to be executed -Output: The number of cycles that was executed. This value can -be greater than the number of cycles that the RSP -should have performed. -(this value is ignored if the RSP is stopped) -*/ - -uint32_t DoRspCycles(uint32_t Cycles) -{ - if (g_hle) - { - g_hle->hle_execute(); - } - return Cycles; -} - /* Function: GetDllInfo -Purpose: This function allows the emulator to gather information +Purpose: This function allows the emulator to gather information about the DLL by filling in the PluginInfo structure. -Input: A pointer to a PLUGIN_INFO structure that needs to be +Input: A pointer to a PLUGIN_INFO structure that needs to be filled by the function. (see def above) -Output: None +Output: None */ -void GetDllInfo(PLUGIN_INFO * PluginInfo) +EXPORT void GetDllInfo(PLUGIN_INFO * PluginInfo) { - PluginInfo->Version = 0x0102; + PluginInfo->Version = 0x0103; PluginInfo->Type = PLUGIN_TYPE_RSP; #ifdef _DEBUG - sprintf(PluginInfo->Name, "RSP HLE debug plugin %s", VER_FILE_VERSION_STR); + sprintf(PluginInfo->Name, "RSP Basic Debug Plugin %s", VER_FILE_VERSION_STR); #else - sprintf(PluginInfo->Name, "RSP HLE plugin %s", VER_FILE_VERSION_STR); + sprintf(PluginInfo->Name, "RSP Basic Plugin %s", VER_FILE_VERSION_STR); #endif - PluginInfo->NormalMemory = false; - PluginInfo->MemoryBswaped = true; + PluginInfo->Reserved2 = false; + PluginInfo->Reserved1 = true; } /* Function: InitiateRSP -Purpose: This function is called when the DLL is started to give -information from the emulator that the N64 RSP -interface needs -Input: Rsp_Info is passed to this function which is defined +Purpose: This function is called when the DLL is started to give +information from the emulator that the N64 RSP interface needs. +Input: Rsp_Info is passed to this function which is defined above. CycleCount is the number of cycles between switching control between the RSP and r4300i core. -Output: None +Output: None */ -void InitiateRSP(RSP_INFO Rsp_Info, uint32_t * /*CycleCount*/) +EXPORT void InitiateRSP(RSP_INFO Rsp_Info, uint32_t * CycleCount) { - if (g_hle) - { - delete g_hle; - g_hle = NULL; - } - g_hle = new CHle(Rsp_Info); + InitilizeRSP(Rsp_Info); + *CycleCount = 0; } /* Function: RomOpen -Purpose: This function is called when a ROM is opened -Input: None -Output: None +Purpose: This function is called when a ROM is opened. +Input: None +Output: None */ -void RomOpen(void) +EXPORT void RomOpen(void) { + RspRomOpened(); } /* Function: RomClosed -Purpose: This function is called when a ROM is closed -Input: None -Output: None +Purpose: This function is called when a ROM is closed. +Input: None +Output: None */ -void RomClosed(void) +EXPORT void RomClosed(void) { + RspRomClosed(); } void PluginLoaded(void) { + RspPluginLoaded(); } + +void UseUnregisteredSetting(int /*SettingID*/) +{ + g_Notify->BreakPoint(__FILE__, __LINE__); +} \ No newline at end of file diff --git a/Source/Android/PluginRSP/mem.h b/Source/Android/PluginRSP/mem.h deleted file mode 100644 index 6b7aeb586..000000000 --- a/Source/Android/PluginRSP/mem.h +++ /dev/null @@ -1,112 +0,0 @@ -// Project64 - A Nintendo 64 emulator -// https://www.pj64-emu.com/ -// Copyright(C) 2001-2021 Project64 -// Copyright(C) 2014 Bobby Smiles -// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html - -#pragma once -#include - -#define S 1 -#define S16 2 -#define S8 3 - -enum -{ - TASK_TYPE = 0xfc0, - TASK_FLAGS = 0xfc4, - TASK_UCODE_BOOT = 0xfc8, - TASK_UCODE_BOOT_SIZE = 0xfcc, - TASK_UCODE = 0xfd0, - TASK_UCODE_SIZE = 0xfd4, - TASK_UCODE_DATA = 0xfd8, - TASK_UCODE_DATA_SIZE = 0xfdc, - TASK_DRAM_STACK = 0xfe0, - TASK_DRAM_STACK_SIZE = 0xfe4, - TASK_OUTPUT_BUFF = 0xfe8, - TASK_OUTPUT_BUFF_SIZE = 0xfec, - TASK_DATA_PTR = 0xff0, - TASK_DATA_SIZE = 0xff4, - TASK_YIELD_DATA_PTR = 0xff8, - TASK_YIELD_DATA_SIZE = 0xffc -}; - -static inline unsigned int align(unsigned int x, unsigned amount) -{ - --amount; - return (x + amount) & ~amount; -} - -static inline uint8_t* u8(const unsigned char* buffer, unsigned address) -{ - return (uint8_t*)(buffer + (address ^ S8)); -} - -static inline uint16_t* u16(const unsigned char* buffer, unsigned address) -{ - assert((address & 1) == 0); - return (uint16_t*)(buffer + (address ^ S16)); -} - -static inline uint32_t* u32(const unsigned char* buffer, unsigned address) -{ - assert((address & 3) == 0); - return (uint32_t*)(buffer + address); -} - -void load_u8 (uint8_t* dst, const unsigned char* buffer, unsigned address, size_t count); -void load_u16(uint16_t* dst, const unsigned char* buffer, unsigned address, size_t count); -void load_u32(uint32_t* dst, const unsigned char* buffer, unsigned address, size_t count); -void store_u16(unsigned char* buffer, unsigned address, const uint16_t* src, size_t count); -void store_u32(unsigned char* buffer, unsigned address, const uint32_t* src, size_t count); - -static inline uint32_t* dmem_u32(CHle * hle, uint16_t address) -{ - return u32(hle->dmem(), address & 0xfff); -} - -static inline void dmem_store_u32(CHle * hle, const uint32_t* src, uint16_t address, size_t count) -{ - store_u32(hle->dmem(), address & 0xfff, src, count); -} - -// Convenient functions DRAM access -static inline uint8_t* dram_u8(CHle * hle, uint32_t address) -{ - return u8(hle->dram(), address & 0xffffff); -} - -static inline uint16_t* dram_u16(CHle * hle, uint32_t address) -{ - return u16(hle->dram(), address & 0xffffff); -} - -static inline uint32_t* dram_u32(CHle * hle, uint32_t address) -{ - return u32(hle->dram(), address & 0xffffff); -} - -static inline void dram_load_u8(CHle * hle, uint8_t* dst, uint32_t address, size_t count) -{ - load_u8(dst, hle->dram(), address & 0xffffff, count); -} - -static inline void dram_load_u16(CHle * hle, uint16_t* dst, uint32_t address, size_t count) -{ - load_u16(dst, hle->dram(), address & 0xffffff, count); -} - -static inline void dram_load_u32(CHle * hle, uint32_t* dst, uint32_t address, size_t count) -{ - load_u32(dst, hle->dram(), address & 0xffffff, count); -} - -static inline void dram_store_u16(CHle * hle, const uint16_t* src, uint32_t address, size_t count) -{ - store_u16(hle->dram(), address & 0xffffff, src, count); -} - -static inline void dram_store_u32(CHle * hle, const uint32_t* src, uint32_t address, size_t count) -{ - store_u32(hle->dram(), address & 0xffffff, src, count); -} diff --git a/Source/Android/PluginRSP/resource.h b/Source/Android/PluginRSP/resource.h new file mode 100644 index 000000000..08aa21fa6 --- /dev/null +++ b/Source/Android/PluginRSP/resource.h @@ -0,0 +1,15 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by RSP.rc +// + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 5001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Source/Android/PluginRSP/stdafx.cpp b/Source/Android/PluginRSP/stdafx.cpp deleted file mode 100644 index fd4f341c7..000000000 --- a/Source/Android/PluginRSP/stdafx.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "stdafx.h" diff --git a/Source/Android/PluginRSP/stdafx.h b/Source/Android/PluginRSP/stdafx.h deleted file mode 100644 index e2d2cffcf..000000000 --- a/Source/Android/PluginRSP/stdafx.h +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include -#include -#include "Version.h" -#include "Rsp.h" -#include "hle.h" diff --git a/Source/Android/PluginRSP/alist.cpp b/Source/Project64-rsp-core/Hle/alist.cpp similarity index 61% rename from Source/Android/PluginRSP/alist.cpp rename to Source/Project64-rsp-core/Hle/alist.cpp index 311f0a1d8..100a46432 100644 --- a/Source/Android/PluginRSP/alist.cpp +++ b/Source/Project64-rsp-core/Hle/alist.cpp @@ -6,12 +6,15 @@ // Copyright(C) 2002 Hacktarux // GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html -#include "stdafx.h" -#include #include "alist.h" #include "arithmetics.h" #include "audio.h" +#include "hle.h" #include "mem.h" +#include +#include + +aaa struct ramp_t { @@ -22,34 +25,34 @@ struct ramp_t // Local functions -static void swap(int16_t **a, int16_t **b) +static void swap(int16_t ** a, int16_t ** b) { - int16_t* tmp = *b; + int16_t * tmp = *b; *b = *a; *a = tmp; } -static int16_t* sample(CHle * hle, unsigned pos) +static int16_t * sample(CHle * hle, unsigned pos) { - return (int16_t*)hle->alist_buffer() + (pos ^ S); + return (int16_t *)hle->alist_buffer() + (pos ^ S); } -static uint8_t* alist_u8(CHle * hle, uint16_t dmem) +static uint8_t * alist_u8(CHle * hle, uint16_t dmem) { return u8(hle->alist_buffer(), dmem); } -static int16_t* alist_s16(CHle * hle, uint16_t dmem) +static int16_t * alist_s16(CHle * hle, uint16_t dmem) { - return (int16_t*)u16(hle->alist_buffer(), dmem); + return (int16_t *)u16(hle->alist_buffer(), dmem); } -static void sample_mix(int16_t* dst, int16_t src, int16_t gain) +static void sample_mix(int16_t * dst, int16_t src, int16_t gain) { *dst = clamp_s16(*dst + ((src * gain) >> 15)); } -static void alist_envmix_mix(size_t n, int16_t** dst, const int16_t* gains, int16_t src) +static void alist_envmix_mix(size_t n, int16_t ** dst, const int16_t * gains, int16_t src) { size_t i; @@ -59,7 +62,7 @@ static void alist_envmix_mix(size_t n, int16_t** dst, const int16_t* gains, int1 } } -static int16_t ramp_step(struct ramp_t* ramp) +static int16_t ramp_step(struct ramp_t * ramp) { bool target_reached; @@ -83,8 +86,8 @@ void alist_process(CHle * hle, const acmd_callback_t abi[], unsigned int abi_siz uint32_t w1, w2; unsigned int acmd; - const uint32_t *alist = dram_u32(hle, *dmem_u32(hle, TASK_DATA_PTR)); - const uint32_t *const alist_end = alist + (*dmem_u32(hle, TASK_DATA_SIZE) >> 2); + const uint32_t * alist = dram_u32(hle, *dmem_u32(hle, TASK_DATA_PTR)); + const uint32_t * const alist_end = alist + (*dmem_u32(hle, TASK_DATA_SIZE) >> 2); while (alist != alist_end) { @@ -104,9 +107,9 @@ void alist_process(CHle * hle, const acmd_callback_t abi[], unsigned int abi_siz } } -uint32_t alist_get_address(CHle * hle, uint32_t so, const uint32_t *segments, size_t n) +uint32_t alist_get_address(CHle * hle, uint32_t so, const uint32_t * segments, size_t n) { - uint8_t segment = (so >> 24) & 0x3f; + uint8_t segment = (so >> 24) & 0x3f; uint32_t offset = (so & 0xffffff); if (segment >= n) @@ -118,9 +121,9 @@ uint32_t alist_get_address(CHle * hle, uint32_t so, const uint32_t *segments, si return segments[segment] + offset; } -void alist_set_address(CHle * hle, uint32_t so, uint32_t *segments, size_t n) +void alist_set_address(CHle * hle, uint32_t so, uint32_t * segments, size_t n) { - uint8_t segment = (so >> 24) & 0x3f; + uint8_t segment = (so >> 24) & 0x3f; uint32_t offset = (so & 0xffffff); if (segment >= n) @@ -146,7 +149,7 @@ void alist_load(CHle * hle, uint16_t dmem, uint32_t address, uint16_t count) // Enforce DMA alignment constraints dmem &= ~3; address &= ~7; - count = align(count, 8); + count = (uint16_t)align(count, 8); memcpy(hle->alist_buffer() + dmem, hle->dram() + address, count); } @@ -184,7 +187,7 @@ void alist_repeat64(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint8_t count) uint16_t buffer[64]; memcpy(buffer, hle->alist_buffer() + dmemi, 128); - while(count != 0) + while (count != 0) { memcpy(hle->alist_buffer() + dmemo, buffer, 128); dmemo += 128; @@ -206,17 +209,17 @@ void alist_copy_blocks(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t bloc dmemi += 0x20; dmemo += 0x20; - } while(bytes_left > 0); + } while (bytes_left > 0); --block_left; - } while(block_left > 0); + } while (block_left > 0); } void alist_interleave(CHle * hle, uint16_t dmemo, uint16_t left, uint16_t right, uint16_t count) { - uint16_t *dst = (uint16_t*)(hle->alist_buffer() + dmemo); - const uint16_t *srcL = (uint16_t*)(hle->alist_buffer() + left); - const uint16_t *srcR = (uint16_t*)(hle->alist_buffer() + right); + uint16_t * dst = (uint16_t *)(hle->alist_buffer() + dmemo); + const uint16_t * srcL = (uint16_t *)(hle->alist_buffer() + left); + const uint16_t * srcR = (uint16_t *)(hle->alist_buffer() + right); count >>= 2; @@ -242,15 +245,15 @@ void alist_interleave(CHle * hle, uint16_t dmemo, uint16_t left, uint16_t right, } } -void alist_envmix_exp( CHle * hle, bool init, bool aux, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, uint16_t count, int16_t dry, int16_t wet, const int16_t *vol, const int16_t *target, const int32_t *rate, uint32_t address) +void alist_envmix_exp(CHle * hle, bool init, bool aux, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, uint16_t count, int16_t dry, int16_t wet, const int16_t * vol, const int16_t * target, const int32_t * rate, uint32_t address) { size_t n = (aux) ? 4 : 2; - const int16_t* const in = (int16_t*)(hle->alist_buffer() + dmemi); - int16_t* const dl = (int16_t*)(hle->alist_buffer() + dmem_dl); - int16_t* const dr = (int16_t*)(hle->alist_buffer() + dmem_dr); - int16_t* const wl = (int16_t*)(hle->alist_buffer() + dmem_wl); - int16_t* const wr = (int16_t*)(hle->alist_buffer() + dmem_wr); + const int16_t * const in = (int16_t *)(hle->alist_buffer() + dmemi); + int16_t * const dl = (int16_t *)(hle->alist_buffer() + dmem_dl); + int16_t * const dr = (int16_t *)(hle->alist_buffer() + dmem_dr); + int16_t * const wl = (int16_t *)(hle->alist_buffer() + dmem_wl); + int16_t * const wr = (int16_t *)(hle->alist_buffer() + dmem_wr); struct ramp_t ramps[2]; int32_t exp_seq[2]; @@ -274,14 +277,14 @@ void alist_envmix_exp( CHle * hle, bool init, bool aux, uint16_t dmem_dl, uint16 } else { - wet = *(int16_t *)(save_buffer + 0); // 0-1 - dry = *(int16_t *)(save_buffer + 2); // 2-3 + wet = *(int16_t *)(save_buffer + 0); // 0-1 + dry = *(int16_t *)(save_buffer + 2); // 2-3 ramps[0].target = *(int32_t *)(save_buffer + 4); // 4-5 ramps[1].target = *(int32_t *)(save_buffer + 6); // 6-7 - exp_rates[0] = *(int32_t *)(save_buffer + 8); // 8-9 (save_buffer is a 16-bit pointer) - exp_rates[1] = *(int32_t *)(save_buffer + 10); // 10-11 - exp_seq[0] = *(int32_t *)(save_buffer + 12); // 12-13 - exp_seq[1] = *(int32_t *)(save_buffer + 14); // 14-15 + exp_rates[0] = *(int32_t *)(save_buffer + 8); // 8-9 (save_buffer is a 16-bit pointer) + exp_rates[1] = *(int32_t *)(save_buffer + 10); // 10-11 + exp_seq[0] = *(int32_t *)(save_buffer + 12); // 12-13 + exp_seq[1] = *(int32_t *)(save_buffer + 14); // 14-15 ramps[0].value = *(int32_t *)(save_buffer + 16); // 12-13 ramps[1].value = *(int32_t *)(save_buffer + 18); // 14-15 } @@ -306,49 +309,49 @@ void alist_envmix_exp( CHle * hle, bool init, bool aux, uint16_t dmem_dl, uint16 for (x = 0; x < 8; ++x) { - int16_t gains[4]; - int16_t* buffers[4]; + int16_t gains[4]; + int16_t * buffers[4]; int16_t l_vol = ramp_step(&ramps[0]); int16_t r_vol = ramp_step(&ramps[1]); - buffers[0] = dl + (ptr^S); - buffers[1] = dr + (ptr^S); - buffers[2] = wl + (ptr^S); - buffers[3] = wr + (ptr^S); + buffers[0] = dl + (ptr ^ S); + buffers[1] = dr + (ptr ^ S); + buffers[2] = wl + (ptr ^ S); + buffers[3] = wr + (ptr ^ S); gains[0] = clamp_s16((l_vol * dry + 0x4000) >> 15); gains[1] = clamp_s16((r_vol * dry + 0x4000) >> 15); gains[2] = clamp_s16((l_vol * wet + 0x4000) >> 15); gains[3] = clamp_s16((r_vol * wet + 0x4000) >> 15); - alist_envmix_mix(n, buffers, gains, in[ptr^S]); + alist_envmix_mix(n, buffers, gains, in[ptr ^ S]); ++ptr; } } - *(int16_t *)(save_buffer + 0) = wet; // 0-1 - *(int16_t *)(save_buffer + 2) = dry; // 2-3 - *(int32_t *)(save_buffer + 4) = (int32_t)ramps[0].target; // 4-5 - *(int32_t *)(save_buffer + 6) = (int32_t)ramps[1].target; // 6-7 - *(int32_t *)(save_buffer + 8) = exp_rates[0]; // 8-9 (save_buffer is a 16-bit pointer) - *(int32_t *)(save_buffer + 10) = exp_rates[1]; // 10-11 - *(int32_t *)(save_buffer + 12) = exp_seq[0]; // 12-13 - *(int32_t *)(save_buffer + 14) = exp_seq[1]; // 14-15 - *(int32_t *)(save_buffer + 16) = (int32_t)ramps[0].value; // 12-13 - *(int32_t *)(save_buffer + 18) = (int32_t)ramps[1].value; // 14-15 + *(int16_t *)(save_buffer + 0) = wet; // 0-1 + *(int16_t *)(save_buffer + 2) = dry; // 2-3 + *(int32_t *)(save_buffer + 4) = (int32_t)ramps[0].target; // 4-5 + *(int32_t *)(save_buffer + 6) = (int32_t)ramps[1].target; // 6-7 + *(int32_t *)(save_buffer + 8) = exp_rates[0]; // 8-9 (save_buffer is a 16-bit pointer) + *(int32_t *)(save_buffer + 10) = exp_rates[1]; // 10-11 + *(int32_t *)(save_buffer + 12) = exp_seq[0]; // 12-13 + *(int32_t *)(save_buffer + 14) = exp_seq[1]; // 14-15 + *(int32_t *)(save_buffer + 16) = (int32_t)ramps[0].value; // 12-13 + *(int32_t *)(save_buffer + 18) = (int32_t)ramps[1].value; // 14-15 memcpy(hle->dram() + address, (uint8_t *)save_buffer, sizeof(save_buffer)); } -void alist_envmix_ge( CHle * hle, bool init, bool aux, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, uint16_t count, int16_t dry, int16_t wet, const int16_t *vol, const int16_t *target, const int32_t *rate, uint32_t address) +void alist_envmix_ge(CHle * hle, bool init, bool aux, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, uint16_t count, int16_t dry, int16_t wet, const int16_t * vol, const int16_t * target, const int32_t * rate, uint32_t address) { unsigned k; size_t n = (aux) ? 4 : 2; - const int16_t* const in = (int16_t*)(hle->alist_buffer() + dmemi); - int16_t* const dl = (int16_t*)(hle->alist_buffer() + dmem_dl); - int16_t* const dr = (int16_t*)(hle->alist_buffer() + dmem_dr); - int16_t* const wl = (int16_t*)(hle->alist_buffer() + dmem_wl); - int16_t* const wr = (int16_t*)(hle->alist_buffer() + dmem_wr); + const int16_t * const in = (int16_t *)(hle->alist_buffer() + dmemi); + int16_t * const dl = (int16_t *)(hle->alist_buffer() + dmem_dl); + int16_t * const dr = (int16_t *)(hle->alist_buffer() + dmem_dr); + int16_t * const wl = (int16_t *)(hle->alist_buffer() + dmem_wl); + int16_t * const wr = (int16_t *)(hle->alist_buffer() + dmem_wr); struct ramp_t ramps[2]; short save_buffer[40]; @@ -365,122 +368,122 @@ void alist_envmix_ge( CHle * hle, bool init, bool aux, uint16_t dmem_dl, uint16_ } else { - wet = *(int16_t *)(save_buffer + 0); // 0-1 - dry = *(int16_t *)(save_buffer + 2); // 2-3 - ramps[0].target = *(int32_t *)(save_buffer + 4); // 4-5 - ramps[1].target = *(int32_t *)(save_buffer + 6); // 6-7 - ramps[0].step = *(int32_t *)(save_buffer + 8); // 8-9 (save_buffer is a 16-bit pointer) - ramps[1].step = *(int32_t *)(save_buffer + 10); // 10-11 + wet = *(int16_t *)(save_buffer + 0); // 0-1 + dry = *(int16_t *)(save_buffer + 2); // 2-3 + ramps[0].target = *(int32_t *)(save_buffer + 4); // 4-5 + ramps[1].target = *(int32_t *)(save_buffer + 6); // 6-7 + ramps[0].step = *(int32_t *)(save_buffer + 8); // 8-9 (save_buffer is a 16-bit pointer) + ramps[1].step = *(int32_t *)(save_buffer + 10); // 10-11 /* *(int32_t *)(save_buffer + 12);*/ // 12-13 /* *(int32_t *)(save_buffer + 14);*/ // 14-15 - ramps[0].value = *(int32_t *)(save_buffer + 16); // 12-13 - ramps[1].value = *(int32_t *)(save_buffer + 18); // 14-15 + ramps[0].value = *(int32_t *)(save_buffer + 16); // 12-13 + ramps[1].value = *(int32_t *)(save_buffer + 18); // 14-15 } count >>= 1; for (k = 0; k < count; ++k) { - int16_t gains[4]; - int16_t* buffers[4]; + int16_t gains[4]; + int16_t * buffers[4]; int16_t l_vol = ramp_step(&ramps[0]); int16_t r_vol = ramp_step(&ramps[1]); - buffers[0] = dl + (k^S); - buffers[1] = dr + (k^S); - buffers[2] = wl + (k^S); - buffers[3] = wr + (k^S); + buffers[0] = dl + (k ^ S); + buffers[1] = dr + (k ^ S); + buffers[2] = wl + (k ^ S); + buffers[3] = wr + (k ^ S); gains[0] = clamp_s16((l_vol * dry + 0x4000) >> 15); gains[1] = clamp_s16((r_vol * dry + 0x4000) >> 15); gains[2] = clamp_s16((l_vol * wet + 0x4000) >> 15); gains[3] = clamp_s16((r_vol * wet + 0x4000) >> 15); - alist_envmix_mix(n, buffers, gains, in[k^S]); + alist_envmix_mix(n, buffers, gains, in[k ^ S]); } - *(int16_t *)(save_buffer + 0) = wet; // 0-1 - *(int16_t *)(save_buffer + 2) = dry; // 2-3 - *(int32_t *)(save_buffer + 4) = (int32_t)ramps[0].target; // 4-5 - *(int32_t *)(save_buffer + 6) = (int32_t)ramps[1].target; // 6-7 - *(int32_t *)(save_buffer + 8) = (int32_t)ramps[0].step; // 8-9 (save_buffer is a 16-bit pointer) - *(int32_t *)(save_buffer + 10) = (int32_t)ramps[1].step; // 10-11 - /**(int32_t *)(save_buffer + 12);*/ // 12-13 - /**(int32_t *)(save_buffer + 14);*/ // 14-15 - *(int32_t *)(save_buffer + 16) = (int32_t)ramps[0].value; // 12-13 - *(int32_t *)(save_buffer + 18) = (int32_t)ramps[1].value; // 14-15 + *(int16_t *)(save_buffer + 0) = wet; // 0-1 + *(int16_t *)(save_buffer + 2) = dry; // 2-3 + *(int32_t *)(save_buffer + 4) = (int32_t)ramps[0].target; // 4-5 + *(int32_t *)(save_buffer + 6) = (int32_t)ramps[1].target; // 6-7 + *(int32_t *)(save_buffer + 8) = (int32_t)ramps[0].step; // 8-9 (save_buffer is a 16-bit pointer) + *(int32_t *)(save_buffer + 10) = (int32_t)ramps[1].step; // 10-11 + /**(int32_t *)(save_buffer + 12);*/ // 12-13 + /**(int32_t *)(save_buffer + 14);*/ // 14-15 + *(int32_t *)(save_buffer + 16) = (int32_t)ramps[0].value; // 12-13 + *(int32_t *)(save_buffer + 18) = (int32_t)ramps[1].value; // 14-15 memcpy(hle->dram() + address, (uint8_t *)save_buffer, 80); } -void alist_envmix_lin(CHle * hle, bool init, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, uint16_t count, int16_t dry, int16_t wet, const int16_t *vol, const int16_t *target, const int32_t *rate, uint32_t address) +void alist_envmix_lin(CHle * hle, bool init, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, uint16_t count, int16_t dry, int16_t wet, const int16_t * vol, const int16_t * target, const int32_t * rate, uint32_t address) { size_t k; struct ramp_t ramps[2]; int16_t save_buffer[40]; - const int16_t * const in = (int16_t*)(hle->alist_buffer() + dmemi); - int16_t* const dl = (int16_t*)(hle->alist_buffer() + dmem_dl); - int16_t* const dr = (int16_t*)(hle->alist_buffer() + dmem_dr); - int16_t* const wl = (int16_t*)(hle->alist_buffer() + dmem_wl); - int16_t* const wr = (int16_t*)(hle->alist_buffer() + dmem_wr); + const int16_t * const in = (int16_t *)(hle->alist_buffer() + dmemi); + int16_t * const dl = (int16_t *)(hle->alist_buffer() + dmem_dl); + int16_t * const dr = (int16_t *)(hle->alist_buffer() + dmem_dr); + int16_t * const wl = (int16_t *)(hle->alist_buffer() + dmem_wl); + int16_t * const wr = (int16_t *)(hle->alist_buffer() + dmem_wr); memcpy((uint8_t *)save_buffer, hle->dram() + address, 80); if (init) { - ramps[0].step = rate[0] / 8; - ramps[0].value = (vol[0] << 16); + ramps[0].step = rate[0] / 8; + ramps[0].value = (vol[0] << 16); ramps[0].target = (target[0] << 16); - ramps[1].step = rate[1] / 8; - ramps[1].value = (vol[1] << 16); + ramps[1].step = rate[1] / 8; + ramps[1].value = (vol[1] << 16); ramps[1].target = (target[1] << 16); } else { - wet = *(int16_t *)(save_buffer + 0); // 0-1 - dry = *(int16_t *)(save_buffer + 2); // 2-3 - ramps[0].target = *(int16_t *)(save_buffer + 4) << 16; // 4-5 - ramps[1].target = *(int16_t *)(save_buffer + 6) << 16; // 6-7 - ramps[0].step = *(int32_t *)(save_buffer + 8); // 8-9 (save_buffer is a 16-bit pointer) - ramps[1].step = *(int32_t *)(save_buffer + 10); // 10-11 - ramps[0].value = *(int32_t *)(save_buffer + 16); // 16-17 - ramps[1].value = *(int32_t *)(save_buffer + 18); // 16-17 + wet = *(int16_t *)(save_buffer + 0); // 0-1 + dry = *(int16_t *)(save_buffer + 2); // 2-3 + ramps[0].target = *(int16_t *)(save_buffer + 4) << 16; // 4-5 + ramps[1].target = *(int16_t *)(save_buffer + 6) << 16; // 6-7 + ramps[0].step = *(int32_t *)(save_buffer + 8); // 8-9 (save_buffer is a 16-bit pointer) + ramps[1].step = *(int32_t *)(save_buffer + 10); // 10-11 + ramps[0].value = *(int32_t *)(save_buffer + 16); // 16-17 + ramps[1].value = *(int32_t *)(save_buffer + 18); // 16-17 } count >>= 1; - for(k = 0; k < count; ++k) + for (k = 0; k < count; ++k) { - int16_t gains[4]; - int16_t* buffers[4]; + int16_t gains[4]; + int16_t * buffers[4]; int16_t l_vol = ramp_step(&ramps[0]); int16_t r_vol = ramp_step(&ramps[1]); - buffers[0] = dl + (k^S); - buffers[1] = dr + (k^S); - buffers[2] = wl + (k^S); - buffers[3] = wr + (k^S); + buffers[0] = dl + (k ^ S); + buffers[1] = dr + (k ^ S); + buffers[2] = wl + (k ^ S); + buffers[3] = wr + (k ^ S); gains[0] = clamp_s16((l_vol * dry + 0x4000) >> 15); gains[1] = clamp_s16((r_vol * dry + 0x4000) >> 15); gains[2] = clamp_s16((l_vol * wet + 0x4000) >> 15); gains[3] = clamp_s16((r_vol * wet + 0x4000) >> 15); - alist_envmix_mix(4, buffers, gains, in[k^S]); + alist_envmix_mix(4, buffers, gains, in[k ^ S]); } - *(int16_t *)(save_buffer + 0) = wet; // 0-1 - *(int16_t *)(save_buffer + 2) = dry; // 2-3 - *(int16_t *)(save_buffer + 4) = (int16_t)(ramps[0].target >> 16); // 4-5 - *(int16_t *)(save_buffer + 6) = (int16_t)(ramps[1].target >> 16); // 6-7 - *(int32_t *)(save_buffer + 8) = (int32_t)ramps[0].step; // 8-9 (save_buffer is a 16-bit pointer) - *(int32_t *)(save_buffer + 10) = (int32_t)ramps[1].step; // 10-11 - *(int32_t *)(save_buffer + 16) = (int32_t)ramps[0].value; // 16-17 - *(int32_t *)(save_buffer + 18) = (int32_t)ramps[1].value; // 18-19 + *(int16_t *)(save_buffer + 0) = wet; // 0-1 + *(int16_t *)(save_buffer + 2) = dry; // 2-3 + *(int16_t *)(save_buffer + 4) = (int16_t)(ramps[0].target >> 16); // 4-5 + *(int16_t *)(save_buffer + 6) = (int16_t)(ramps[1].target >> 16); // 6-7 + *(int32_t *)(save_buffer + 8) = (int32_t)ramps[0].step; // 8-9 (save_buffer is a 16-bit pointer) + *(int32_t *)(save_buffer + 10) = (int32_t)ramps[1].step; // 10-11 + *(int32_t *)(save_buffer + 16) = (int32_t)ramps[0].value; // 16-17 + *(int32_t *)(save_buffer + 18) = (int32_t)ramps[1].value; // 18-19 memcpy(hle->dram() + address, (uint8_t *)save_buffer, 80); } void alist_mix(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count, int16_t gain) { - int16_t *dst = (int16_t*)(hle->alist_buffer() + dmemo); - const int16_t *src = (int16_t*)(hle->alist_buffer() + dmemi); + int16_t * dst = (int16_t *)(hle->alist_buffer() + dmemo); + const int16_t * src = (int16_t *)(hle->alist_buffer() + dmemi); count >>= 1; @@ -494,13 +497,13 @@ void alist_mix(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count, int16 } } -void alist_envmix_nead( CHle * hle, bool swap_wet_LR, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, unsigned count, uint16_t *env_values, uint16_t *env_steps, const int16_t *xors) +void alist_envmix_nead(CHle * hle, bool swap_wet_LR, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, unsigned count, uint16_t * env_values, uint16_t * env_steps, const int16_t * xors) { - int16_t *in = (int16_t*)(hle->alist_buffer() + dmemi); - int16_t *dl = (int16_t*)(hle->alist_buffer() + dmem_dl); - int16_t *dr = (int16_t*)(hle->alist_buffer() + dmem_dr); - int16_t *wl = (int16_t*)(hle->alist_buffer() + dmem_wl); - int16_t *wr = (int16_t*)(hle->alist_buffer() + dmem_wr); + int16_t * in = (int16_t *)(hle->alist_buffer() + dmemi); + int16_t * dl = (int16_t *)(hle->alist_buffer() + dmem_dl); + int16_t * dr = (int16_t *)(hle->alist_buffer() + dmem_dr); + int16_t * wl = (int16_t *)(hle->alist_buffer() + dmem_wl); + int16_t * wr = (int16_t *)(hle->alist_buffer() + dmem_wr); // Make sure count is a multiple of 8 count = align(count, 8); @@ -513,17 +516,17 @@ void alist_envmix_nead( CHle * hle, bool swap_wet_LR, uint16_t dmem_dl, uint16_t while (count != 0) { size_t i; - for(i = 0; i < 8; ++i) + for (i = 0; i < 8; ++i) { - int16_t l = (((int32_t)in[i^S] * (uint32_t)env_values[0]) >> 16) ^ xors[0]; - int16_t r = (((int32_t)in[i^S] * (uint32_t)env_values[1]) >> 16) ^ xors[1]; + int16_t l = (((int32_t)in[i ^ S] * (uint32_t)env_values[0]) >> 16) ^ xors[0]; + int16_t r = (((int32_t)in[i ^ S] * (uint32_t)env_values[1]) >> 16) ^ xors[1]; int16_t l2 = (((int32_t)l * (uint32_t)env_values[2]) >> 16) ^ xors[2]; int16_t r2 = (((int32_t)r * (uint32_t)env_values[2]) >> 16) ^ xors[3]; - dl[i^S] = clamp_s16(dl[i^S] + l); - dr[i^S] = clamp_s16(dr[i^S] + r); - wl[i^S] = clamp_s16(wl[i^S] + l2); - wr[i^S] = clamp_s16(wr[i^S] + r2); + dl[i ^ S] = clamp_s16(dl[i ^ S] + l); + dr[i ^ S] = clamp_s16(dr[i ^ S] + r); + wl[i ^ S] = clamp_s16(wl[i ^ S] + l2); + wr[i ^ S] = clamp_s16(wr[i ^ S] + r2); } env_values[0] += env_steps[0]; @@ -541,12 +544,12 @@ void alist_envmix_nead( CHle * hle, bool swap_wet_LR, uint16_t dmem_dl, uint16_t void alist_add(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count) { - int16_t *dst = (int16_t*)(hle->alist_buffer() + dmemo); - const int16_t *src = (int16_t*)(hle->alist_buffer() + dmemi); + int16_t * dst = (int16_t *)(hle->alist_buffer() + dmemo); + const int16_t * src = (int16_t *)(hle->alist_buffer() + dmemi); count >>= 1; - while(count != 0) + while (count != 0) { *dst = clamp_s16(*dst + *src); @@ -558,11 +561,11 @@ void alist_add(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count) void alist_multQ44(CHle * hle, uint16_t dmem, uint16_t count, int8_t gain) { - int16_t *dst = (int16_t*)(hle->alist_buffer() + dmem); + int16_t * dst = (int16_t *)(hle->alist_buffer() + dmem); count >>= 1; - while(count != 0) + while (count != 0) { *dst = clamp_s16(*dst * gain >> 4); @@ -571,7 +574,7 @@ void alist_multQ44(CHle * hle, uint16_t dmem, uint16_t count, int8_t gain) } } -static void alist_resample_reset(CHle * hle, uint16_t pos, uint32_t* pitch_accu) +static void alist_resample_reset(CHle * hle, uint16_t pos, uint32_t * pitch_accu) { unsigned k; @@ -582,7 +585,7 @@ static void alist_resample_reset(CHle * hle, uint16_t pos, uint32_t* pitch_accu) *pitch_accu = 0; } -static void alist_resample_load(CHle * hle, uint32_t address, uint16_t pos, uint32_t* pitch_accu) +static void alist_resample_load(CHle * hle, uint32_t address, uint16_t pos, uint32_t * pitch_accu) { *sample(hle, pos + 0) = *dram_u16(hle, address + 0); *sample(hle, pos + 1) = *dram_u16(hle, address + 2); @@ -602,7 +605,7 @@ static void alist_resample_save(CHle * hle, uint32_t address, uint16_t pos, uint *dram_u16(hle, address + 8) = pitch_accu; } -void alist_resample( CHle * hle, bool init, bool flag2, uint16_t dmemo, uint16_t dmemi, uint16_t count, uint32_t pitch /* Q16.16 */, uint32_t address) +void alist_resample(CHle * hle, bool init, bool flag2, uint16_t dmemo, uint16_t dmemi, uint16_t count, uint32_t pitch /* Q16.16 */, uint32_t address) { uint32_t pitch_accu; @@ -627,13 +630,14 @@ void alist_resample( CHle * hle, bool init, bool flag2, uint16_t dmemo, uint16_t while (count != 0) { - const int16_t* lut = RESAMPLE_LUT + ((pitch_accu & 0xfc00) >> 8); + const int16_t * lut = RESAMPLE_LUT + ((pitch_accu & 0xfc00) >> 8); - *sample(hle, opos++) = clamp_s16( ( - (*sample(hle, ipos ) * lut[0]) + - (*sample(hle, ipos + 1) * lut[1]) + - (*sample(hle, ipos + 2) * lut[2]) + - (*sample(hle, ipos + 3) * lut[3]) ) >> 15); + *sample(hle, opos++) = clamp_s16(( + (*sample(hle, ipos) * lut[0]) + + (*sample(hle, ipos + 1) * lut[1]) + + (*sample(hle, ipos + 2) * lut[2]) + + (*sample(hle, ipos + 3) * lut[3])) >> + 15); pitch_accu += pitch; ipos += (pitch_accu >> 16); @@ -650,7 +654,7 @@ void alist_resample_zoh(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t cou uint16_t opos = dmemo >> 1; count >>= 1; - while(count != 0) + while (count != 0) { *sample(hle, opos++) = *sample(hle, ipos); @@ -661,9 +665,9 @@ void alist_resample_zoh(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t cou } } -typedef unsigned int(*adpcm_predict_frame_t)(CHle * hle, int16_t* dst, uint16_t dmemi, unsigned char scale); +typedef unsigned int (*adpcm_predict_frame_t)(CHle * hle, int16_t * dst, uint16_t dmemi, unsigned char scale); -static unsigned int adpcm_predict_frame_4bits(CHle * hle, int16_t* dst, uint16_t dmemi, unsigned char scale) +static unsigned int adpcm_predict_frame_4bits(CHle * hle, int16_t * dst, uint16_t dmemi, unsigned char scale) { unsigned int i; unsigned int rshift = (scale < 12) ? 12 - scale : 0; @@ -679,7 +683,7 @@ static unsigned int adpcm_predict_frame_4bits(CHle * hle, int16_t* dst, uint16_t return 8; } -static unsigned int adpcm_predict_frame_2bits(CHle * hle, int16_t* dst, uint16_t dmemi, unsigned char scale) +static unsigned int adpcm_predict_frame_2bits(CHle * hle, int16_t * dst, uint16_t dmemi, unsigned char scale) { unsigned int i; unsigned int rshift = (scale < 14) ? 14 - scale : 0; @@ -697,14 +701,14 @@ static unsigned int adpcm_predict_frame_2bits(CHle * hle, int16_t* dst, uint16_t return 4; } -void alist_adpcm( CHle * hle, bool init, bool loop, bool two_bit_per_sample, uint16_t dmemo, uint16_t dmemi, uint16_t count, const int16_t* codebook, uint32_t loop_address, uint32_t last_frame_address) +void alist_adpcm(CHle * hle, bool init, bool loop, bool two_bit_per_sample, uint16_t dmemo, uint16_t dmemi, uint16_t count, const int16_t * codebook, uint32_t loop_address, uint32_t last_frame_address) { int16_t last_frame[16]; size_t i; adpcm_predict_frame_t predict_frame = (two_bit_per_sample) - ? adpcm_predict_frame_2bits - : adpcm_predict_frame_4bits; + ? adpcm_predict_frame_2bits + : adpcm_predict_frame_4bits; assert((count & 0x1f) == 0); @@ -714,7 +718,7 @@ void alist_adpcm( CHle * hle, bool init, bool loop, bool two_bit_per_sample, uin } else { - dram_load_u16(hle, (uint16_t*)last_frame, (loop) ? loop_address : last_frame_address, 16); + dram_load_u16(hle, (uint16_t *)last_frame, (loop) ? loop_address : last_frame_address, 16); } for (i = 0; i < 16; ++i, dmemo += 2) @@ -726,7 +730,7 @@ void alist_adpcm( CHle * hle, bool init, bool loop, bool two_bit_per_sample, uin int16_t frame[16]; uint8_t code = *alist_u8(hle, dmemi++); unsigned char scale = (code & 0xf0) >> 4; - const int16_t* const cb_entry = codebook + ((code & 0xf) << 4); + const int16_t * const cb_entry = codebook + ((code & 0xf) << 4); dmemi += predict_frame(hle, frame, dmemi, scale); @@ -740,20 +744,20 @@ void alist_adpcm( CHle * hle, bool init, bool loop, bool two_bit_per_sample, uin count -= 32; } - dram_store_u16(hle, (uint16_t*)last_frame, last_frame_address, 16); + dram_store_u16(hle, (uint16_t *)last_frame, last_frame_address, 16); } -void alist_filter( CHle * hle, uint16_t dmem,uint16_t count, uint32_t address, const uint32_t* lut_address) +void alist_filter(CHle * hle, uint16_t dmem, uint16_t count, uint32_t address, const uint32_t * lut_address) { int x; int16_t outbuff[0x3c0]; - int16_t *outp = outbuff; + int16_t * outp = outbuff; - int16_t* const lutt6 = (int16_t*)(hle->dram() + lut_address[0]); - int16_t* const lutt5 = (int16_t*)(hle->dram() + lut_address[1]); + int16_t * const lutt6 = (int16_t *)(hle->dram() + lut_address[0]); + int16_t * const lutt5 = (int16_t *)(hle->dram() + lut_address[1]); - int16_t* in1 = (int16_t*)(hle->dram() + address); - int16_t* in2 = (int16_t*)(hle->alist_buffer() + dmem); + int16_t * in1 = (int16_t *)(hle->dram() + address); + int16_t * in2 = (int16_t *)(hle->alist_buffer() + dmem); for (x = 0; x < 8; ++x) { @@ -765,7 +769,7 @@ void alist_filter( CHle * hle, uint16_t dmem,uint16_t count, uint32_t address, c { int32_t v[8]; - v[1] = in1[0] * lutt6[6]; + v[1] = in1[0] * lutt6[6]; v[1] += in1[3] * lutt6[7]; v[1] += in1[2] * lutt6[4]; v[1] += in1[5] * lutt6[5]; @@ -774,7 +778,7 @@ void alist_filter( CHle * hle, uint16_t dmem,uint16_t count, uint32_t address, c v[1] += in1[6] * lutt6[0]; v[1] += in2[1] * lutt6[1]; // 1 - v[0] = in1[3] * lutt6[6]; + v[0] = in1[3] * lutt6[6]; v[0] += in1[2] * lutt6[7]; v[0] += in1[5] * lutt6[4]; v[0] += in1[4] * lutt6[5]; @@ -783,7 +787,7 @@ void alist_filter( CHle * hle, uint16_t dmem,uint16_t count, uint32_t address, c v[0] += in2[1] * lutt6[0]; v[0] += in2[0] * lutt6[1]; - v[3] = in1[2] * lutt6[6]; + v[3] = in1[2] * lutt6[6]; v[3] += in1[5] * lutt6[7]; v[3] += in1[4] * lutt6[4]; v[3] += in1[7] * lutt6[5]; @@ -792,7 +796,7 @@ void alist_filter( CHle * hle, uint16_t dmem,uint16_t count, uint32_t address, c v[3] += in2[0] * lutt6[0]; v[3] += in2[3] * lutt6[1]; - v[2] = in1[5] * lutt6[6]; + v[2] = in1[5] * lutt6[6]; v[2] += in1[4] * lutt6[7]; v[2] += in1[7] * lutt6[4]; v[2] += in1[6] * lutt6[5]; @@ -801,7 +805,7 @@ void alist_filter( CHle * hle, uint16_t dmem,uint16_t count, uint32_t address, c v[2] += in2[3] * lutt6[0]; v[2] += in2[2] * lutt6[1]; - v[5] = in1[4] * lutt6[6]; + v[5] = in1[4] * lutt6[6]; v[5] += in1[7] * lutt6[7]; v[5] += in1[6] * lutt6[4]; v[5] += in2[1] * lutt6[5]; @@ -810,7 +814,7 @@ void alist_filter( CHle * hle, uint16_t dmem,uint16_t count, uint32_t address, c v[5] += in2[2] * lutt6[0]; v[5] += in2[5] * lutt6[1]; - v[4] = in1[7] * lutt6[6]; + v[4] = in1[7] * lutt6[6]; v[4] += in1[6] * lutt6[7]; v[4] += in2[1] * lutt6[4]; v[4] += in2[0] * lutt6[5]; @@ -819,7 +823,7 @@ void alist_filter( CHle * hle, uint16_t dmem,uint16_t count, uint32_t address, c v[4] += in2[5] * lutt6[0]; v[4] += in2[4] * lutt6[1]; - v[7] = in1[6] * lutt6[6]; + v[7] = in1[6] * lutt6[6]; v[7] += in2[1] * lutt6[7]; v[7] += in2[0] * lutt6[4]; v[7] += in2[3] * lutt6[5]; @@ -828,7 +832,7 @@ void alist_filter( CHle * hle, uint16_t dmem,uint16_t count, uint32_t address, c v[7] += in2[4] * lutt6[0]; v[7] += in2[7] * lutt6[1]; - v[6] = in2[1] * lutt6[6]; + v[6] = in2[1] * lutt6[6]; v[6] += in2[0] * lutt6[7]; v[6] += in2[3] * lutt6[4]; v[6] += in2[2] * lutt6[5]; @@ -854,12 +858,12 @@ void alist_filter( CHle * hle, uint16_t dmem,uint16_t count, uint32_t address, c memcpy(hle->alist_buffer() + dmem, outbuff, count); } -void alist_polef(CHle * hle, bool init, uint16_t dmemo, uint16_t dmemi, uint16_t count, uint16_t gain, int16_t* table, uint32_t address) +void alist_polef(CHle * hle, bool init, uint16_t dmemo, uint16_t dmemi, uint16_t count, uint16_t gain, int16_t * table, uint32_t address) { - int16_t *dst = (int16_t*)(hle->alist_buffer() + dmemo); + int16_t * dst = (int16_t *)(hle->alist_buffer() + dmemo); - const int16_t* const h1 = table; - int16_t* const h2 = table + 8; + const int16_t * const h1 = table; + int16_t * const h2 = table + 8; unsigned i; int16_t l1, l2; @@ -897,7 +901,7 @@ void alist_polef(CHle * hle, bool init, uint16_t dmemo, uint16_t dmemi, uint16_t { int32_t accu = frame[i] * gain; accu += h1[i] * l1 + h2_before[i] * l2 + rdot(i, h2, frame); - dst[i^S] = clamp_s16(accu >> 14); + dst[i ^ S] = clamp_s16(accu >> 14); } l1 = dst[6 ^ S]; @@ -907,12 +911,12 @@ void alist_polef(CHle * hle, bool init, uint16_t dmemo, uint16_t dmemi, uint16_t count -= 16; } while (count != 0); - dram_store_u32(hle, (uint32_t*)(dst - 4), address, 2); + dram_store_u32(hle, (uint32_t *)(dst - 4), address, 2); } -void alist_iirf(CHle * hle, bool init, uint16_t dmemo, uint16_t dmemi, uint16_t count, int16_t* table, uint32_t address) +void alist_iirf(CHle * hle, bool init, uint16_t dmemo, uint16_t dmemi, uint16_t count, int16_t * table, uint32_t address) { - int16_t *dst = (int16_t*)(hle->alist_buffer() + dmemo); + int16_t * dst = (int16_t *)(hle->alist_buffer() + dmemo); int32_t i, prev; int16_t frame[8]; int16_t ibuf[4]; @@ -920,9 +924,9 @@ void alist_iirf(CHle * hle, bool init, uint16_t dmemo, uint16_t dmemi, uint16_t count = align(count, 16); - if(init) + if (init) { - for(i = 0; i < 8; ++i) + for (i = 0; i < 8; ++i) { frame[i] = 0; } @@ -940,24 +944,24 @@ void alist_iirf(CHle * hle, bool init, uint16_t dmemo, uint16_t dmemi, uint16_t prev = vmulf(table[9], frame[6]) * 2; do { - for(i = 0; i < 8; ++i) + for (i = 0; i < 8; ++i) { int32_t accu; - ibuf[index&3] = *alist_s16(hle, dmemi); + ibuf[index & 3] = *alist_s16(hle, dmemi); - accu = prev + vmulf(table[0], ibuf[index&3]) + vmulf(table[1], ibuf[(index-1)&3]) + vmulf(table[0], ibuf[(index-2)&3]); + accu = prev + vmulf(table[0], ibuf[index & 3]) + vmulf(table[1], ibuf[(index - 1) & 3]) + vmulf(table[0], ibuf[(index - 2) & 3]); accu += vmulf(table[8], frame[index]) * 2; prev = vmulf(table[9], frame[index]) * 2; - dst[i^S] = frame[i] = accu; + dst[i ^ S] = frame[i] = accu; - index=(index+1)&7; + index = (index + 1) & 7; dmemi += 2; } dst += 8; count -= 0x10; } while (count > 0); - dram_store_u16(hle, (uint16_t*)&frame[6], address + 4, 4); - dram_store_u16(hle, (uint16_t*)&ibuf[(index-2)&3], address+8, 2); - dram_store_u16(hle, (uint16_t*)&ibuf[(index-1)&3], address+10, 2); + dram_store_u16(hle, (uint16_t *)&frame[6], address + 4, 4); + dram_store_u16(hle, (uint16_t *)&ibuf[(index - 2) & 3], address + 8, 2); + dram_store_u16(hle, (uint16_t *)&ibuf[(index - 1) & 3], address + 10, 2); } diff --git a/Source/Project64-rsp-core/Hle/alist.h b/Source/Project64-rsp-core/Hle/alist.h new file mode 100644 index 000000000..16cd0623f --- /dev/null +++ b/Source/Project64-rsp-core/Hle/alist.h @@ -0,0 +1,52 @@ +// Project64 - A Nintendo 64 emulator +// https://www.pj64-emu.com/ +// Copyright(C) 2001-2021 Project64 +// Copyright(C) 2014 Bobby Smiles +// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html + +#pragma once +#include + +class CHle; + +typedef void (*acmd_callback_t)(CHle * hle, uint32_t w1, uint32_t w2); + +void alist_process(CHle * hle, const acmd_callback_t abi[], unsigned int abi_size); +uint32_t alist_get_address(CHle * hle, uint32_t so, const uint32_t * segments, size_t n); +void alist_set_address(CHle * hle, uint32_t so, uint32_t * segments, size_t n); +void alist_clear(CHle * hle, uint16_t dmem, uint16_t count); +void alist_load(CHle * hle, uint16_t dmem, uint32_t address, uint16_t count); +void alist_save(CHle * hle, uint16_t dmem, uint32_t address, uint16_t count); +void alist_move(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count); +void alist_copy_every_other_sample(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count); +void alist_repeat64(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint8_t count); +void alist_copy_blocks(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t block_size, uint8_t count); +void alist_interleave(CHle * hle, uint16_t dmemo, uint16_t left, uint16_t right, uint16_t count); +void alist_envmix_exp(CHle * hle, bool init, bool aux, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, uint16_t count, int16_t dry, int16_t wet, const int16_t * vol, const int16_t * target, const int32_t * rate, uint32_t address); +void alist_envmix_ge(CHle * hle, bool init, bool aux, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, uint16_t count, int16_t dry, int16_t wet, const int16_t * vol, const int16_t * target, const int32_t * rate, uint32_t address); +void alist_envmix_lin(CHle * hle, bool init, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, uint16_t count, int16_t dry, int16_t wet, const int16_t * vol, const int16_t * target, const int32_t * rate, uint32_t address); +void alist_envmix_nead(CHle * hle, bool swap_wet_LR, uint16_t dmem_dl, uint16_t dmem_dr, uint16_t dmem_wl, uint16_t dmem_wr, uint16_t dmemi, unsigned count, uint16_t * env_values, uint16_t * env_steps, const int16_t * xors); +void alist_mix(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count, int16_t gain); +void alist_multQ44(CHle * hle, uint16_t dmem, uint16_t count, int8_t gain); +void alist_add(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count); +void alist_adpcm(CHle * hle, bool init, bool loop, bool two_bit_per_sample, uint16_t dmemo, uint16_t dmemi, uint16_t count, const int16_t * codebook, uint32_t loop_address, uint32_t last_frame_address); +void alist_resample(CHle * hle, bool init, bool flag2, uint16_t dmemo, uint16_t dmemi, uint16_t count, uint32_t pitch, uint32_t address); +void alist_polef(CHle * hle, bool init, uint16_t dmemo, uint16_t dmemi, uint16_t count, uint16_t gain, int16_t * table, uint32_t address); +void alist_iirf(CHle * hle, bool init, uint16_t dmemo, uint16_t dmemi, uint16_t count, int16_t * table, uint32_t address); +void alist_resample_zoh(CHle * hle, uint16_t dmemo, uint16_t dmemi, uint16_t count, uint32_t pitch, uint32_t pitch_accu); +void alist_filter(CHle * hle, uint16_t dmem, uint16_t count, uint32_t address, const uint32_t * lut_address); + +// Audio flags + +#define A_INIT 0x01 +#define A_CONTINUE 0x00 +#define A_LOOP 0x02 +#define A_OUT 0x02 +#define A_LEFT 0x02 +#define A_RIGHT 0x00 +#define A_VOL 0x04 +#define A_RATE 0x00 +#define A_AUX 0x08 +#define A_NOAUX 0x00 +#define A_MAIN 0x00 +#define A_MIX 0x10 diff --git a/Source/Android/PluginRSP/alist_audio.cpp b/Source/Project64-rsp-core/Hle/alist_audio.cpp similarity index 86% rename from Source/Android/PluginRSP/alist_audio.cpp rename to Source/Project64-rsp-core/Hle/alist_audio.cpp index e6347c6f0..fe586437c 100644 --- a/Source/Android/PluginRSP/alist_audio.cpp +++ b/Source/Project64-rsp-core/Hle/alist_audio.cpp @@ -6,16 +6,18 @@ // Copyright(C) 2002 Hacktarux // GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html -#include "stdafx.h" +#include #include #include "alist.h" -#include "common.h" #include "hle.h" #include "mem.h" #include "ucodes.h" -enum { DMEM_BASE = 0x5c0 }; +enum +{ + DMEM_BASE = 0x5c0 +}; // Helper functions @@ -31,7 +33,7 @@ static void set_address(CHle * hle, uint32_t so) static void clear_segments(CHle * hle) { - memset(hle->alist_audio().segments, 0, N_SEGMENTS*sizeof(hle->alist_audio().segments[0])); + memset(hle->alist_audio().segments, 0, N_SEGMENTS * sizeof(hle->alist_audio().segments[0])); } // Audio commands definition @@ -53,7 +55,7 @@ static void CLEARBUFF(CHle * hle, uint32_t w1, uint32_t w2) static void ENVMIXER(CHle * hle, uint32_t w1, uint32_t w2) { - uint8_t flags = (w1 >> 16) & 0xFF; + uint8_t flags = (w1 >> 16) & 0xFF; uint32_t address = get_address(hle, w2); alist_envmix_exp( @@ -72,7 +74,7 @@ static void ENVMIXER(CHle * hle, uint32_t w1, uint32_t w2) static void ENVMIXER_GE(CHle * hle, uint32_t w1, uint32_t w2) { - uint8_t flags = (w1 >> 16); + uint8_t flags = (w1 >> 16); uint32_t address = get_address(hle, w2); alist_envmix_ge( @@ -91,7 +93,7 @@ static void ENVMIXER_GE(CHle * hle, uint32_t w1, uint32_t w2) static void RESAMPLE(CHle * hle, uint32_t w1, uint32_t w2) { - uint8_t flags = (w1 >> 16) & 0xFF; + uint8_t flags = (w1 >> 16) & 0xFF; uint16_t pitch = w1 & 0xFFFF; uint32_t address = get_address(hle, w2); @@ -138,14 +140,14 @@ static void SETLOOP(CHle * hle, uint32_t UNUSED(w1), uint32_t w2) static void ADPCM(CHle * hle, uint32_t w1, uint32_t w2) { - uint8_t flags = (w1 >> 16) & 0xFF; + uint8_t flags = (w1 >> 16) & 0xFF; uint32_t address = get_address(hle, w2); alist_adpcm( hle, flags & 0x1, flags & 0x2, - false, // Unsupported in this microcode + false, // Unsupported in this microcode hle->alist_audio().out, hle->alist_audio().in, align(hle->alist_audio().count, 32), @@ -199,7 +201,7 @@ static void DMEMMOVE(CHle * hle, uint32_t w1, uint32_t w2) { uint16_t dmemi = (w1 + DMEM_BASE) & 0xFFFF; uint16_t dmemo = (w2 >> 16) + DMEM_BASE; - uint16_t count = (w2)& 0xFFFF; + uint16_t count = (w2)&0xFFFF; if (count == 0) return; @@ -212,7 +214,7 @@ static void LOADADPCM(CHle * hle, uint32_t w1, uint32_t w2) uint16_t count = (w1 & 0xFFFF); uint32_t address = get_address(hle, w2); - dram_load_u16(hle, (uint16_t*)hle->alist_audio().table, address, align(count, 8) >> 1); + dram_load_u16(hle, (uint16_t *)hle->alist_audio().table, address, align(count, 8) >> 1); } static void INTERLEAVE(CHle * hle, uint32_t UNUSED(w1), uint32_t w2) @@ -228,7 +230,7 @@ static void INTERLEAVE(CHle * hle, uint32_t UNUSED(w1), uint32_t w2) static void MIXER(CHle * hle, uint32_t w1, uint32_t w2) { - int16_t gain = (w1)& 0xFFFF; + int16_t gain = (w1)&0xFFFF; uint16_t dmemi = ((w2 >> 16) + DMEM_BASE) & 0xFFFF; uint16_t dmemo = (w2 + DMEM_BASE) & 0xFFFF; @@ -245,7 +247,7 @@ static void SEGMENT(CHle * hle, uint32_t UNUSED(w1), uint32_t w2) static void POLEF(CHle * hle, uint32_t w1, uint32_t w2) { - uint8_t flags = (w1 >> 16); + uint8_t flags = (w1 >> 16); uint16_t gain = w1; uint32_t address = get_address(hle, w2); @@ -271,8 +273,7 @@ void alist_process_audio(CHle * hle) SPNOOP, ADPCM, CLEARBUFF, ENVMIXER, LOADBUFF, RESAMPLE, SAVEBUFF, SEGMENT, SETBUFF, SETVOL, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, POLEF, SETLOOP - }; + MIXER, INTERLEAVE, POLEF, SETLOOP}; clear_segments(hle); alist_process(hle, ABI, 0x10); @@ -281,12 +282,11 @@ void alist_process_audio(CHle * hle) void alist_process_audio_ge(CHle * hle) { static const acmd_callback_t ABI[0x10] = - { - SPNOOP, ADPCM, CLEARBUFF, ENVMIXER_GE, - LOADBUFF, RESAMPLE, SAVEBUFF, SEGMENT, - SETBUFF, SETVOL, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, POLEF, SETLOOP - }; + { + SPNOOP, ADPCM, CLEARBUFF, ENVMIXER_GE, + LOADBUFF, RESAMPLE, SAVEBUFF, SEGMENT, + SETBUFF, SETVOL, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, POLEF, SETLOOP}; clear_segments(hle); alist_process(hle, ABI, 0x10); @@ -295,12 +295,11 @@ void alist_process_audio_ge(CHle * hle) void alist_process_audio_bc(CHle * hle) { static const acmd_callback_t ABI[0x10] = - { - SPNOOP, ADPCM, CLEARBUFF, ENVMIXER_GE, - LOADBUFF, RESAMPLE, SAVEBUFF, SEGMENT, - SETBUFF, SETVOL, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, POLEF, SETLOOP - }; + { + SPNOOP, ADPCM, CLEARBUFF, ENVMIXER_GE, + LOADBUFF, RESAMPLE, SAVEBUFF, SEGMENT, + SETBUFF, SETVOL, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, POLEF, SETLOOP}; clear_segments(hle); alist_process(hle, ABI, 0x10); diff --git a/Source/Android/PluginRSP/alist_naudio.cpp b/Source/Project64-rsp-core/Hle/alist_naudio.cpp similarity index 76% rename from Source/Android/PluginRSP/alist_naudio.cpp rename to Source/Project64-rsp-core/Hle/alist_naudio.cpp index 0f1ad5b17..4a41dd59a 100644 --- a/Source/Android/PluginRSP/alist_naudio.cpp +++ b/Source/Project64-rsp-core/Hle/alist_naudio.cpp @@ -6,13 +6,17 @@ // Copyright(C) 2002 Hacktarux // GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html -#include "stdafx.h" +#include #include "alist.h" #include "mem.h" -enum { NAUDIO_COUNT = 0x170 }; // i.e. 184 samples -enum { +enum +{ + NAUDIO_COUNT = 0x170 +}; // i.e. 184 samples +enum +{ NAUDIO_MAIN = 0x4f0, NAUDIO_MAIN2 = 0x660, NAUDIO_DRY_LEFT = 0x9d0, @@ -49,10 +53,10 @@ static void NAUDIO_02B0(CHle * hle, uint32_t UNUSED(w1), uint32_t w2) static void NAUDIO_14(CHle * hle, uint32_t w1, uint32_t w2) { - uint8_t flags = (w1 >> 16); - uint16_t gain = w1; - uint8_t select_main = (w2 >> 24); - uint32_t address = (w2 & 0xffffff); + uint8_t flags = (w1 >> 16); + uint16_t gain = w1; + uint8_t select_main = (w2 >> 24); + uint32_t address = (w2 & 0xffffff); uint16_t dmem = (select_main == 0) ? NAUDIO_MAIN : NAUDIO_MAIN2; @@ -62,7 +66,7 @@ static void NAUDIO_14(CHle * hle, uint32_t w1, uint32_t w2) } else { - alist_iirf( hle, flags & A_INIT, dmem, dmem, NAUDIO_COUNT, hle->alist_naudio().table, address); + alist_iirf(hle, flags & A_INIT, dmem, dmem, NAUDIO_COUNT, hle->alist_naudio().table, address); } } @@ -70,13 +74,16 @@ static void SETVOL(CHle * hle, uint32_t w1, uint32_t w2) { uint8_t flags = (w1 >> 16); - if (flags & 0x4) { - if (flags & 0x2) { + if (flags & 0x4) + { + if (flags & 0x2) + { hle->alist_naudio().vol[0] = w1; hle->alist_naudio().dry = (w2 >> 16); hle->alist_naudio().wet = w2; } - else { + else + { hle->alist_naudio().target[1] = w1; hle->alist_naudio().rate[1] = w2; } @@ -90,7 +97,7 @@ static void SETVOL(CHle * hle, uint32_t w1, uint32_t w2) static void ENVMIXER(CHle * hle, uint32_t w1, uint32_t w2) { - uint8_t flags = (w1 >> 16); + uint8_t flags = (w1 >> 16); uint32_t address = (w2 & 0xffffff); hle->alist_naudio().vol[1] = w1; @@ -122,7 +129,7 @@ static void CLEARBUFF(CHle * hle, uint32_t w1, uint32_t w2) static void MIXER(CHle * hle, uint32_t w1, uint32_t w2) { - int16_t gain = w1; + int16_t gain = w1; uint16_t dmemi = (w2 >> 16) + NAUDIO_MAIN; uint16_t dmemo = w2 + NAUDIO_MAIN; @@ -152,7 +159,7 @@ static void LOADADPCM(CHle * hle, uint32_t w1, uint32_t w2) uint16_t count = w1; uint32_t address = (w2 & 0xffffff); - dram_load_u16(hle, (uint16_t*)hle->alist_naudio().table, address, count >> 1); + dram_load_u16(hle, (uint16_t *)hle->alist_naudio().table, address, count >> 1); } static void DMEMMOVE(CHle * hle, uint32_t w1, uint32_t w2) @@ -172,7 +179,7 @@ static void SETLOOP(CHle * hle, uint32_t UNUSED(w1), uint32_t w2) static void ADPCM(CHle * hle, uint32_t w1, uint32_t w2) { uint32_t address = (w1 & 0xffffff); - uint8_t flags = (w2 >> 28); + uint8_t flags = (w2 >> 28); uint16_t count = (w2 >> 16) & 0xfff; uint16_t dmemi = ((w2 >> 12) & 0xf) + NAUDIO_MAIN; uint16_t dmemo = (w2 & 0xfff) + NAUDIO_MAIN; @@ -181,7 +188,7 @@ static void ADPCM(CHle * hle, uint32_t w1, uint32_t w2) hle, flags & 0x1, flags & 0x2, - false, // Unsupported by this microcode + false, // Unsupported by this microcode dmemo, dmemi, (count + 0x1f) & ~0x1f, @@ -193,7 +200,7 @@ static void ADPCM(CHle * hle, uint32_t w1, uint32_t w2) static void RESAMPLE(CHle * hle, uint32_t w1, uint32_t w2) { uint32_t address = (w1 & 0xffffff); - uint8_t flags = (w2 >> 30); + uint8_t flags = (w2 >> 30); uint16_t pitch = (w2 >> 14); uint16_t dmemi = ((w2 >> 2) & 0xfff) + NAUDIO_MAIN; uint16_t dmemo = (w2 & 0x3) ? NAUDIO_MAIN2 : NAUDIO_MAIN; @@ -201,7 +208,7 @@ static void RESAMPLE(CHle * hle, uint32_t w1, uint32_t w2) alist_resample( hle, flags & 0x1, - false, // TODO: check which ABI supports it + false, // TODO: check which ABI supports it dmemo, dmemi, NAUDIO_COUNT, @@ -231,12 +238,11 @@ static void MP3(CHle * hle, uint32_t w1, uint32_t w2) void alist_process_naudio(CHle * hle) { static const acmd_callback_t ABI[0x10] = - { - SPNOOP, ADPCM, CLEARBUFF, ENVMIXER, - LOADBUFF, RESAMPLE, SAVEBUFF, NAUDIO_0000, - NAUDIO_0000, SETVOL, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, NAUDIO_02B0, SETLOOP - }; + { + SPNOOP, ADPCM, CLEARBUFF, ENVMIXER, + LOADBUFF, RESAMPLE, SAVEBUFF, NAUDIO_0000, + NAUDIO_0000, SETVOL, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, NAUDIO_02B0, SETLOOP}; alist_process(hle, ABI, 0x10); } @@ -244,13 +250,12 @@ void alist_process_naudio(CHle * hle) void alist_process_naudio_bk(CHle * hle) { // TODO: see what differs from alist_process_naudio - + static const acmd_callback_t ABI[0x10] = { - SPNOOP, ADPCM, CLEARBUFF, ENVMIXER, - LOADBUFF, RESAMPLE, SAVEBUFF, NAUDIO_0000, - NAUDIO_0000, SETVOL, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, NAUDIO_02B0, SETLOOP - }; + SPNOOP, ADPCM, CLEARBUFF, ENVMIXER, + LOADBUFF, RESAMPLE, SAVEBUFF, NAUDIO_0000, + NAUDIO_0000, SETVOL, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, NAUDIO_02B0, SETLOOP}; alist_process(hle, ABI, 0x10); } @@ -258,13 +263,12 @@ void alist_process_naudio_bk(CHle * hle) void alist_process_naudio_dk(CHle * hle) { // TODO: see what differs from alist_process_naudio - + static const acmd_callback_t ABI[0x10] = { - SPNOOP, ADPCM, CLEARBUFF, ENVMIXER, - LOADBUFF, RESAMPLE, SAVEBUFF, MIXER, - MIXER, SETVOL, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, NAUDIO_02B0, SETLOOP - }; + SPNOOP, ADPCM, CLEARBUFF, ENVMIXER, + LOADBUFF, RESAMPLE, SAVEBUFF, MIXER, + MIXER, SETVOL, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, NAUDIO_02B0, SETLOOP}; alist_process(hle, ABI, 0x10); } @@ -272,11 +276,10 @@ void alist_process_naudio_dk(CHle * hle) void alist_process_naudio_mp3(CHle * hle) { static const acmd_callback_t ABI[0x10] = { - UNKNOWN, ADPCM, CLEARBUFF, ENVMIXER, - LOADBUFF, RESAMPLE, SAVEBUFF, MP3, - MP3ADDY, SETVOL, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, NAUDIO_14, SETLOOP - }; + UNKNOWN, ADPCM, CLEARBUFF, ENVMIXER, + LOADBUFF, RESAMPLE, SAVEBUFF, MP3, + MP3ADDY, SETVOL, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, NAUDIO_14, SETLOOP}; alist_process(hle, ABI, 0x10); } @@ -284,13 +287,12 @@ void alist_process_naudio_mp3(CHle * hle) void alist_process_naudio_cbfd(CHle * hle) { // TODO: see what differs from alist_process_naudio_mp3 - + static const acmd_callback_t ABI[0x10] = { - UNKNOWN, ADPCM, CLEARBUFF, ENVMIXER, - LOADBUFF, RESAMPLE, SAVEBUFF, MP3, - MP3ADDY, SETVOL, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, NAUDIO_14, SETLOOP - }; + UNKNOWN, ADPCM, CLEARBUFF, ENVMIXER, + LOADBUFF, RESAMPLE, SAVEBUFF, MP3, + MP3ADDY, SETVOL, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, NAUDIO_14, SETLOOP}; alist_process(hle, ABI, 0x10); } diff --git a/Source/Android/PluginRSP/alist_nead.cpp b/Source/Project64-rsp-core/Hle/alist_nead.cpp similarity index 53% rename from Source/Android/PluginRSP/alist_nead.cpp rename to Source/Project64-rsp-core/Hle/alist_nead.cpp index d3530b842..f05e76dbe 100644 --- a/Source/Android/PluginRSP/alist_nead.cpp +++ b/Source/Project64-rsp-core/Hle/alist_nead.cpp @@ -6,7 +6,8 @@ // Copyright(C) 2002 Hacktarux // GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html -#include "stdafx.h" +#include "hle.h" +#include #include "alist.h" #include "mem.h" @@ -25,10 +26,10 @@ static void SPNOOP(CHle * UNUSED(hle), uint32_t UNUSED(w1), uint32_t UNUSED(w2)) static void LOADADPCM(CHle * hle, uint32_t w1, uint32_t w2) { - uint16_t count = w1; + uint16_t count = w1; uint32_t address = (w2 & 0xffffff); - dram_load_u16(hle, (uint16_t*)hle->alist_nead().table, address, count >> 1); + dram_load_u16(hle, (uint16_t *)hle->alist_nead().table, address, count >> 1); } static void SETLOOP(CHle * hle, uint32_t UNUSED(w1), uint32_t w2) @@ -38,14 +39,14 @@ static void SETLOOP(CHle * hle, uint32_t UNUSED(w1), uint32_t w2) static void SETBUFF(CHle * hle, uint32_t w1, uint32_t w2) { - hle->alist_nead().in = w1; - hle->alist_nead().out = (w2 >> 16); + hle->alist_nead().in = w1; + hle->alist_nead().out = (w2 >> 16); hle->alist_nead().count = w2; } static void ADPCM(CHle * hle, uint32_t w1, uint32_t w2) { - uint8_t flags = (w1 >> 16); + uint8_t flags = (w1 >> 16); uint32_t address = (w2 & 0xffffff); alist_adpcm( @@ -63,7 +64,7 @@ static void ADPCM(CHle * hle, uint32_t w1, uint32_t w2) static void CLEARBUFF(CHle * hle, uint32_t w1, uint32_t w2) { - uint16_t dmem = w1; + uint16_t dmem = w1; uint16_t count = w2; if (count == 0) @@ -74,8 +75,8 @@ static void CLEARBUFF(CHle * hle, uint32_t w1, uint32_t w2) static void LOADBUFF(CHle * hle, uint32_t w1, uint32_t w2) { - uint16_t count = (w1 >> 12) & 0xfff; - uint16_t dmem = (w1 & 0xfff); + uint16_t count = (w1 >> 12) & 0xfff; + uint16_t dmem = (w1 & 0xfff); uint32_t address = (w2 & 0xffffff); alist_load(hle, dmem, address, count); @@ -83,8 +84,8 @@ static void LOADBUFF(CHle * hle, uint32_t w1, uint32_t w2) static void SAVEBUFF(CHle * hle, uint32_t w1, uint32_t w2) { - uint16_t count = (w1 >> 12) & 0xfff; - uint16_t dmem = (w1 & 0xfff); + uint16_t count = (w1 >> 12) & 0xfff; + uint16_t dmem = (w1 & 0xfff); uint32_t address = (w2 & 0xffffff); alist_save(hle, dmem, address, count); @@ -93,7 +94,7 @@ static void SAVEBUFF(CHle * hle, uint32_t w1, uint32_t w2) static void MIXER(CHle * hle, uint32_t w1, uint32_t w2) { uint16_t count = (w1 >> 12) & 0xff0; - int16_t gain = w1; + int16_t gain = w1; uint16_t dmemi = (w2 >> 16); uint16_t dmemo = w2; @@ -102,14 +103,14 @@ static void MIXER(CHle * hle, uint32_t w1, uint32_t w2) static void RESAMPLE(CHle * hle, uint32_t w1, uint32_t w2) { - uint8_t flags = (w1 >> 16); - uint16_t pitch = w1; + uint8_t flags = (w1 >> 16); + uint16_t pitch = w1; uint32_t address = (w2 & 0xffffff); alist_resample( hle, flags & 0x1, - false, // TODO: check which ABI supports it + false, // TODO: check which ABI supports it hle->alist_nead().out, hle->alist_nead().in, (hle->alist_nead().count + 0xf) & ~0xf, @@ -119,7 +120,7 @@ static void RESAMPLE(CHle * hle, uint32_t w1, uint32_t w2) static void RESAMPLE_ZOH(CHle * hle, uint32_t w1, uint32_t w2) { - uint16_t pitch = w1; + uint16_t pitch = w1; uint16_t pitch_accu = w2; alist_resample_zoh( @@ -146,17 +147,17 @@ static void DMEMMOVE(CHle * hle, uint32_t w1, uint32_t w2) static void ENVSETUP1_MK(CHle * hle, uint32_t w1, uint32_t w2) { hle->alist_nead().env_values[2] = (w1 >> 8) & 0xff00; - hle->alist_nead().env_steps[2] = 0; - hle->alist_nead().env_steps[0] = (w2 >> 16); - hle->alist_nead().env_steps[1] = w2; + hle->alist_nead().env_steps[2] = 0; + hle->alist_nead().env_steps[0] = (w2 >> 16); + hle->alist_nead().env_steps[1] = w2; } static void ENVSETUP1(CHle * hle, uint32_t w1, uint32_t w2) { hle->alist_nead().env_values[2] = (w1 >> 8) & 0xff00; - hle->alist_nead().env_steps[2] = w1; - hle->alist_nead().env_steps[0] = (w2 >> 16); - hle->alist_nead().env_steps[1] = w2; + hle->alist_nead().env_steps[2] = w1; + hle->alist_nead().env_steps[0] = (w2 >> 16); + hle->alist_nead().env_steps[1] = w2; } static void ENVSETUP2(CHle * hle, uint32_t UNUSED(w1), uint32_t w2) @@ -170,20 +171,20 @@ static void ENVMIXER_MK(CHle * hle, uint32_t w1, uint32_t w2) int16_t xors[4]; uint16_t dmemi = (w1 >> 12) & 0xff0; - uint8_t count = (w1 >> 8) & 0xff; + uint8_t count = (w1 >> 8) & 0xff; uint16_t dmem_dl = (w2 >> 20) & 0xff0; uint16_t dmem_dr = (w2 >> 12) & 0xff0; - uint16_t dmem_wl = (w2 >> 4) & 0xff0; - uint16_t dmem_wr = (w2 << 4) & 0xff0; + uint16_t dmem_wl = (w2 >> 4) & 0xff0; + uint16_t dmem_wr = (w2 << 4) & 0xff0; - xors[2] = 0; // Unsupported by this microcode - xors[3] = 0; // Unsupported by this microcode + xors[2] = 0; // Unsupported by this microcode + xors[3] = 0; // Unsupported by this microcode xors[0] = 0 - (int16_t)((w1 & 0x2) >> 1); - xors[1] = 0 - (int16_t)((w1 & 0x1) ); + xors[1] = 0 - (int16_t)((w1 & 0x1)); alist_envmix_nead( hle, - false, // Unsupported by this microcode + false, // Unsupported by this microcode dmem_dl, dmem_dr, dmem_wl, dmem_wr, dmemi, count, @@ -197,17 +198,17 @@ static void ENVMIXER(CHle * hle, uint32_t w1, uint32_t w2) int16_t xors[4]; uint16_t dmemi = (w1 >> 12) & 0xff0; - uint8_t count = (w1 >> 8) & 0xff; - bool swap_wet_LR = (w1 >> 4) & 0x1; + uint8_t count = (w1 >> 8) & 0xff; + bool swap_wet_LR = (w1 >> 4) & 0x1; uint16_t dmem_dl = (w2 >> 20) & 0xff0; uint16_t dmem_dr = (w2 >> 12) & 0xff0; - uint16_t dmem_wl = (w2 >> 4) & 0xff0; - uint16_t dmem_wr = (w2 << 4) & 0xff0; + uint16_t dmem_wl = (w2 >> 4) & 0xff0; + uint16_t dmem_wr = (w2 << 4) & 0xff0; xors[2] = 0 - (int16_t)((w1 & 0x8) >> 1); xors[3] = 0 - (int16_t)((w1 & 0x4) >> 1); xors[0] = 0 - (int16_t)((w1 & 0x2) >> 1); - xors[1] = 0 - (int16_t)((w1 & 0x1) ); + xors[1] = 0 - (int16_t)((w1 & 0x1)); alist_envmix_nead( hle, @@ -222,7 +223,7 @@ static void ENVMIXER(CHle * hle, uint32_t w1, uint32_t w2) static void DUPLICATE(CHle * hle, uint32_t w1, uint32_t w2) { - uint8_t count = (w1 >> 16); + uint8_t count = (w1 >> 16); uint16_t dmemi = w1; uint16_t dmemo = (w2 >> 16); @@ -270,23 +271,25 @@ static void ADDMIXER(CHle * hle, uint32_t w1, uint32_t w2) static void HILOGAIN(CHle * hle, uint32_t w1, uint32_t w2) { - int8_t gain = (w1 >> 16); // Q4.4 signed + int8_t gain = (w1 >> 16); // Q4.4 signed uint16_t count = w1; - uint16_t dmem = (w2 >> 16); + uint16_t dmem = (w2 >> 16); alist_multQ44(hle, dmem, count, gain); } static void FILTER(CHle * hle, uint32_t w1, uint32_t w2) { - uint8_t flags = (w1 >> 16); + uint8_t flags = (w1 >> 16); uint32_t address = (w2 & 0xffffff); - if (flags > 1) { - hle->alist_nead().filter_count = w1; + if (flags > 1) + { + hle->alist_nead().filter_count = w1; hle->alist_nead().filter_lut_address[0] = address; // T6 } - else { + else + { uint16_t dmem = w1; hle->alist_nead().filter_lut_address[1] = address + 0x10; // T5 @@ -300,9 +303,9 @@ static void SEGMENT(CHle * UNUSED(hle), uint32_t UNUSED(w1), uint32_t UNUSED(w2) static void NEAD_16(CHle * hle, uint32_t w1, uint32_t w2) { - uint8_t count = (w1 >> 16); - uint16_t dmemi = w1; - uint16_t dmemo = (w2 >> 16); + uint8_t count = (w1 >> 16); + uint16_t dmemi = w1; + uint16_t dmemo = (w2 >> 16); uint16_t block_size = w2; alist_copy_blocks(hle, dmemo, dmemi, block_size, count); @@ -310,8 +313,8 @@ static void NEAD_16(CHle * hle, uint32_t w1, uint32_t w2) static void POLEF(CHle * hle, uint32_t w1, uint32_t w2) { - uint8_t flags = (w1 >> 16); - uint16_t gain = w1; + uint8_t flags = (w1 >> 16); + uint16_t gain = w1; uint32_t address = (w2 & 0xffffff); if (hle->alist_nead().count == 0) @@ -331,15 +334,14 @@ static void POLEF(CHle * hle, uint32_t w1, uint32_t w2) void alist_process_nead_mk(CHle * hle) { static const acmd_callback_t ABI[0x20] = { - SPNOOP, ADPCM, CLEARBUFF, SPNOOP, - SPNOOP, RESAMPLE, SPNOOP, SEGMENT, - SETBUFF, SPNOOP, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE_MK, POLEF, SETLOOP, - NEAD_16, INTERL, ENVSETUP1_MK, ENVMIXER_MK, - LOADBUFF, SAVEBUFF, ENVSETUP2, SPNOOP, - SPNOOP, SPNOOP, SPNOOP, SPNOOP, - SPNOOP, SPNOOP, SPNOOP, SPNOOP - }; + SPNOOP, ADPCM, CLEARBUFF, SPNOOP, + SPNOOP, RESAMPLE, SPNOOP, SEGMENT, + SETBUFF, SPNOOP, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE_MK, POLEF, SETLOOP, + NEAD_16, INTERL, ENVSETUP1_MK, ENVMIXER_MK, + LOADBUFF, SAVEBUFF, ENVSETUP2, SPNOOP, + SPNOOP, SPNOOP, SPNOOP, SPNOOP, + SPNOOP, SPNOOP, SPNOOP, SPNOOP}; alist_process(hle, ABI, 0x20); } @@ -347,15 +349,14 @@ void alist_process_nead_mk(CHle * hle) void alist_process_nead_sf(CHle * hle) { static const acmd_callback_t ABI[0x20] = { - SPNOOP, ADPCM, CLEARBUFF, SPNOOP, - ADDMIXER, RESAMPLE, RESAMPLE_ZOH, SPNOOP, - SETBUFF, SPNOOP, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE_MK, POLEF, SETLOOP, - NEAD_16, INTERL, ENVSETUP1, ENVMIXER, - LOADBUFF, SAVEBUFF, ENVSETUP2, SPNOOP, - HILOGAIN, UNKNOWN, DUPLICATE, SPNOOP, - SPNOOP, SPNOOP, SPNOOP, SPNOOP - }; + SPNOOP, ADPCM, CLEARBUFF, SPNOOP, + ADDMIXER, RESAMPLE, RESAMPLE_ZOH, SPNOOP, + SETBUFF, SPNOOP, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE_MK, POLEF, SETLOOP, + NEAD_16, INTERL, ENVSETUP1, ENVMIXER, + LOADBUFF, SAVEBUFF, ENVSETUP2, SPNOOP, + HILOGAIN, UNKNOWN, DUPLICATE, SPNOOP, + SPNOOP, SPNOOP, SPNOOP, SPNOOP}; alist_process(hle, ABI, 0x20); } @@ -363,15 +364,14 @@ void alist_process_nead_sf(CHle * hle) void alist_process_nead_sfj(CHle * hle) { static const acmd_callback_t ABI[0x20] = { - SPNOOP, ADPCM, CLEARBUFF, SPNOOP, - ADDMIXER, RESAMPLE, RESAMPLE_ZOH, SPNOOP, - SETBUFF, SPNOOP, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE_MK, POLEF, SETLOOP, - NEAD_16, INTERL, ENVSETUP1, ENVMIXER, - LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN, - HILOGAIN, UNKNOWN, DUPLICATE, SPNOOP, - SPNOOP, SPNOOP, SPNOOP, SPNOOP - }; + SPNOOP, ADPCM, CLEARBUFF, SPNOOP, + ADDMIXER, RESAMPLE, RESAMPLE_ZOH, SPNOOP, + SETBUFF, SPNOOP, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE_MK, POLEF, SETLOOP, + NEAD_16, INTERL, ENVSETUP1, ENVMIXER, + LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN, + HILOGAIN, UNKNOWN, DUPLICATE, SPNOOP, + SPNOOP, SPNOOP, SPNOOP, SPNOOP}; alist_process(hle, ABI, 0x20); } @@ -379,15 +379,14 @@ void alist_process_nead_sfj(CHle * hle) void alist_process_nead_fz(CHle * hle) { static const acmd_callback_t ABI[0x20] = { - UNKNOWN, ADPCM, CLEARBUFF, SPNOOP, - ADDMIXER, RESAMPLE, SPNOOP, SPNOOP, - SETBUFF, SPNOOP, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, SPNOOP, SETLOOP, - NEAD_16, INTERL, ENVSETUP1, ENVMIXER, - LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN, - SPNOOP, UNKNOWN, DUPLICATE, SPNOOP, - SPNOOP, SPNOOP, SPNOOP, SPNOOP - }; + UNKNOWN, ADPCM, CLEARBUFF, SPNOOP, + ADDMIXER, RESAMPLE, SPNOOP, SPNOOP, + SETBUFF, SPNOOP, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, SPNOOP, SETLOOP, + NEAD_16, INTERL, ENVSETUP1, ENVMIXER, + LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN, + SPNOOP, UNKNOWN, DUPLICATE, SPNOOP, + SPNOOP, SPNOOP, SPNOOP, SPNOOP}; alist_process(hle, ABI, 0x20); } @@ -395,15 +394,14 @@ void alist_process_nead_fz(CHle * hle) void alist_process_nead_wrjb(CHle * hle) { static const acmd_callback_t ABI[0x20] = { - SPNOOP, ADPCM, CLEARBUFF, UNKNOWN, - ADDMIXER, RESAMPLE, RESAMPLE_ZOH, SPNOOP, - SETBUFF, SPNOOP, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, SPNOOP, SETLOOP, - NEAD_16, INTERL, ENVSETUP1, ENVMIXER, - LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN, - HILOGAIN, UNKNOWN, DUPLICATE, FILTER, - SPNOOP, SPNOOP, SPNOOP, SPNOOP - }; + SPNOOP, ADPCM, CLEARBUFF, UNKNOWN, + ADDMIXER, RESAMPLE, RESAMPLE_ZOH, SPNOOP, + SETBUFF, SPNOOP, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, SPNOOP, SETLOOP, + NEAD_16, INTERL, ENVSETUP1, ENVMIXER, + LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN, + HILOGAIN, UNKNOWN, DUPLICATE, FILTER, + SPNOOP, SPNOOP, SPNOOP, SPNOOP}; alist_process(hle, ABI, 0x20); } @@ -411,13 +409,12 @@ void alist_process_nead_wrjb(CHle * hle) void alist_process_nead_ys(CHle * hle) { static const acmd_callback_t ABI[0x18] = { - UNKNOWN, ADPCM, CLEARBUFF, UNKNOWN, - ADDMIXER, RESAMPLE, RESAMPLE_ZOH, FILTER, - SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, HILOGAIN, SETLOOP, - NEAD_16, INTERL, ENVSETUP1, ENVMIXER, - LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN - }; + UNKNOWN, ADPCM, CLEARBUFF, UNKNOWN, + ADDMIXER, RESAMPLE, RESAMPLE_ZOH, FILTER, + SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, HILOGAIN, SETLOOP, + NEAD_16, INTERL, ENVSETUP1, ENVMIXER, + LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN}; alist_process(hle, ABI, 0x18); } @@ -425,13 +422,12 @@ void alist_process_nead_ys(CHle * hle) void alist_process_nead_1080(CHle * hle) { static const acmd_callback_t ABI[0x18] = { - UNKNOWN, ADPCM, CLEARBUFF, UNKNOWN, - ADDMIXER, RESAMPLE, RESAMPLE_ZOH, FILTER, - SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, HILOGAIN, SETLOOP, - NEAD_16, INTERL, ENVSETUP1, ENVMIXER, - LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN - }; + UNKNOWN, ADPCM, CLEARBUFF, UNKNOWN, + ADDMIXER, RESAMPLE, RESAMPLE_ZOH, FILTER, + SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, HILOGAIN, SETLOOP, + NEAD_16, INTERL, ENVSETUP1, ENVMIXER, + LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN}; alist_process(hle, ABI, 0x18); } @@ -439,13 +435,12 @@ void alist_process_nead_1080(CHle * hle) void alist_process_nead_oot(CHle * hle) { static const acmd_callback_t ABI[0x18] = { - UNKNOWN, ADPCM, CLEARBUFF, UNKNOWN, - ADDMIXER, RESAMPLE, RESAMPLE_ZOH, FILTER, - SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, HILOGAIN, SETLOOP, - NEAD_16, INTERL, ENVSETUP1, ENVMIXER, - LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN - }; + UNKNOWN, ADPCM, CLEARBUFF, UNKNOWN, + ADDMIXER, RESAMPLE, RESAMPLE_ZOH, FILTER, + SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, HILOGAIN, SETLOOP, + NEAD_16, INTERL, ENVSETUP1, ENVMIXER, + LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN}; alist_process(hle, ABI, 0x18); } @@ -453,13 +448,12 @@ void alist_process_nead_oot(CHle * hle) void alist_process_nead_mm(CHle * hle) { static const acmd_callback_t ABI[0x18] = { - UNKNOWN, ADPCM, CLEARBUFF, SPNOOP, - ADDMIXER, RESAMPLE, RESAMPLE_ZOH, FILTER, - SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, HILOGAIN, SETLOOP, - NEAD_16, INTERL, ENVSETUP1, ENVMIXER, - LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN - }; + UNKNOWN, ADPCM, CLEARBUFF, SPNOOP, + ADDMIXER, RESAMPLE, RESAMPLE_ZOH, FILTER, + SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, HILOGAIN, SETLOOP, + NEAD_16, INTERL, ENVSETUP1, ENVMIXER, + LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN}; alist_process(hle, ABI, 0x18); } @@ -467,13 +461,12 @@ void alist_process_nead_mm(CHle * hle) void alist_process_nead_mmb(CHle * hle) { static const acmd_callback_t ABI[0x18] = { - SPNOOP, ADPCM, CLEARBUFF, SPNOOP, - ADDMIXER, RESAMPLE, RESAMPLE_ZOH, FILTER, - SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, HILOGAIN, SETLOOP, - NEAD_16, INTERL, ENVSETUP1, ENVMIXER, - LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN - }; + SPNOOP, ADPCM, CLEARBUFF, SPNOOP, + ADDMIXER, RESAMPLE, RESAMPLE_ZOH, FILTER, + SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, HILOGAIN, SETLOOP, + NEAD_16, INTERL, ENVSETUP1, ENVMIXER, + LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN}; alist_process(hle, ABI, 0x18); } @@ -481,13 +474,12 @@ void alist_process_nead_mmb(CHle * hle) void alist_process_nead_ac(CHle * hle) { static const acmd_callback_t ABI[0x18] = { - UNKNOWN, ADPCM, CLEARBUFF, SPNOOP, - ADDMIXER, RESAMPLE, RESAMPLE_ZOH, FILTER, - SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM, - MIXER, INTERLEAVE, HILOGAIN, SETLOOP, - NEAD_16, INTERL, ENVSETUP1, ENVMIXER, - LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN - }; + UNKNOWN, ADPCM, CLEARBUFF, SPNOOP, + ADDMIXER, RESAMPLE, RESAMPLE_ZOH, FILTER, + SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM, + MIXER, INTERLEAVE, HILOGAIN, SETLOOP, + NEAD_16, INTERL, ENVSETUP1, ENVMIXER, + LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN}; alist_process(hle, ABI, 0x18); } diff --git a/Source/Android/PluginRSP/arithmetics.h b/Source/Project64-rsp-core/Hle/arithmetics.h similarity index 87% rename from Source/Android/PluginRSP/arithmetics.h rename to Source/Project64-rsp-core/Hle/arithmetics.h index 27eeb385d..e99831bd5 100644 --- a/Source/Android/PluginRSP/arithmetics.h +++ b/Source/Project64-rsp-core/Hle/arithmetics.h @@ -16,5 +16,5 @@ static inline int16_t clamp_s16(int_fast32_t x) static inline int32_t vmulf(int16_t x, int16_t y) { - return (((int32_t)(x))*((int32_t)(y))+0x4000)>>15; + return (((int32_t)(x)) * ((int32_t)(y)) + 0x4000) >> 15; } diff --git a/Source/Project64-rsp-core/Hle/audio.cpp b/Source/Project64-rsp-core/Hle/audio.cpp new file mode 100644 index 000000000..c6c6898df --- /dev/null +++ b/Source/Project64-rsp-core/Hle/audio.cpp @@ -0,0 +1,114 @@ +// Project64 - A Nintendo 64 emulator +// https://www.pj64-emu.com/ +// Copyright(C) 2001-2021 Project64 +// Copyright(C) 2014 Bobby Smiles +// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html + +#include "audio.h" +#include +#include + +#include "arithmetics.h" + +const int16_t RESAMPLE_LUT[64 * 4] = + { + (int16_t)0x0c39u, (int16_t)0x66adu, (int16_t)0x0d46u, (int16_t)0xffdfu, + (int16_t)0x0b39u, (int16_t)0x6696u, (int16_t)0x0e5fu, (int16_t)0xffd8u, + (int16_t)0x0a44u, (int16_t)0x6669u, (int16_t)0x0f83u, (int16_t)0xffd0u, + (int16_t)0x095au, (int16_t)0x6626u, (int16_t)0x10b4u, (int16_t)0xffc8u, + (int16_t)0x087du, (int16_t)0x65cdu, (int16_t)0x11f0u, (int16_t)0xffbfu, + (int16_t)0x07abu, (int16_t)0x655eu, (int16_t)0x1338u, (int16_t)0xffb6u, + (int16_t)0x06e4u, (int16_t)0x64d9u, (int16_t)0x148cu, (int16_t)0xffacu, + (int16_t)0x0628u, (int16_t)0x643fu, (int16_t)0x15ebu, (int16_t)0xffa1u, + (int16_t)0x0577u, (int16_t)0x638fu, (int16_t)0x1756u, (int16_t)0xff96u, + (int16_t)0x04d1u, (int16_t)0x62cbu, (int16_t)0x18cbu, (int16_t)0xff8au, + (int16_t)0x0435u, (int16_t)0x61f3u, (int16_t)0x1a4cu, (int16_t)0xff7eu, + (int16_t)0x03a4u, (int16_t)0x6106u, (int16_t)0x1bd7u, (int16_t)0xff71u, + (int16_t)0x031cu, (int16_t)0x6007u, (int16_t)0x1d6cu, (int16_t)0xff64u, + (int16_t)0x029fu, (int16_t)0x5ef5u, (int16_t)0x1f0bu, (int16_t)0xff56u, + (int16_t)0x022au, (int16_t)0x5dd0u, (int16_t)0x20b3u, (int16_t)0xff48u, + (int16_t)0x01beu, (int16_t)0x5c9au, (int16_t)0x2264u, (int16_t)0xff3au, + (int16_t)0x015bu, (int16_t)0x5b53u, (int16_t)0x241eu, (int16_t)0xff2cu, + (int16_t)0x0101u, (int16_t)0x59fcu, (int16_t)0x25e0u, (int16_t)0xff1eu, + (int16_t)0x00aeu, (int16_t)0x5896u, (int16_t)0x27a9u, (int16_t)0xff10u, + (int16_t)0x0063u, (int16_t)0x5720u, (int16_t)0x297au, (int16_t)0xff02u, + (int16_t)0x001fu, (int16_t)0x559du, (int16_t)0x2b50u, (int16_t)0xfef4u, + (int16_t)0xffe2u, (int16_t)0x540du, (int16_t)0x2d2cu, (int16_t)0xfee8u, + (int16_t)0xffacu, (int16_t)0x5270u, (int16_t)0x2f0du, (int16_t)0xfedbu, + (int16_t)0xff7cu, (int16_t)0x50c7u, (int16_t)0x30f3u, (int16_t)0xfed0u, + (int16_t)0xff53u, (int16_t)0x4f14u, (int16_t)0x32dcu, (int16_t)0xfec6u, + (int16_t)0xff2eu, (int16_t)0x4d57u, (int16_t)0x34c8u, (int16_t)0xfebdu, + (int16_t)0xff0fu, (int16_t)0x4b91u, (int16_t)0x36b6u, (int16_t)0xfeb6u, + (int16_t)0xfef5u, (int16_t)0x49c2u, (int16_t)0x38a5u, (int16_t)0xfeb0u, + (int16_t)0xfedfu, (int16_t)0x47edu, (int16_t)0x3a95u, (int16_t)0xfeacu, + (int16_t)0xfeceu, (int16_t)0x4611u, (int16_t)0x3c85u, (int16_t)0xfeabu, + (int16_t)0xfec0u, (int16_t)0x4430u, (int16_t)0x3e74u, (int16_t)0xfeacu, + (int16_t)0xfeb6u, (int16_t)0x424au, (int16_t)0x4060u, (int16_t)0xfeafu, + (int16_t)0xfeafu, (int16_t)0x4060u, (int16_t)0x424au, (int16_t)0xfeb6u, + (int16_t)0xfeacu, (int16_t)0x3e74u, (int16_t)0x4430u, (int16_t)0xfec0u, + (int16_t)0xfeabu, (int16_t)0x3c85u, (int16_t)0x4611u, (int16_t)0xfeceu, + (int16_t)0xfeacu, (int16_t)0x3a95u, (int16_t)0x47edu, (int16_t)0xfedfu, + (int16_t)0xfeb0u, (int16_t)0x38a5u, (int16_t)0x49c2u, (int16_t)0xfef5u, + (int16_t)0xfeb6u, (int16_t)0x36b6u, (int16_t)0x4b91u, (int16_t)0xff0fu, + (int16_t)0xfebdu, (int16_t)0x34c8u, (int16_t)0x4d57u, (int16_t)0xff2eu, + (int16_t)0xfec6u, (int16_t)0x32dcu, (int16_t)0x4f14u, (int16_t)0xff53u, + (int16_t)0xfed0u, (int16_t)0x30f3u, (int16_t)0x50c7u, (int16_t)0xff7cu, + (int16_t)0xfedbu, (int16_t)0x2f0du, (int16_t)0x5270u, (int16_t)0xffacu, + (int16_t)0xfee8u, (int16_t)0x2d2cu, (int16_t)0x540du, (int16_t)0xffe2u, + (int16_t)0xfef4u, (int16_t)0x2b50u, (int16_t)0x559du, (int16_t)0x001fu, + (int16_t)0xff02u, (int16_t)0x297au, (int16_t)0x5720u, (int16_t)0x0063u, + (int16_t)0xff10u, (int16_t)0x27a9u, (int16_t)0x5896u, (int16_t)0x00aeu, + (int16_t)0xff1eu, (int16_t)0x25e0u, (int16_t)0x59fcu, (int16_t)0x0101u, + (int16_t)0xff2cu, (int16_t)0x241eu, (int16_t)0x5b53u, (int16_t)0x015bu, + (int16_t)0xff3au, (int16_t)0x2264u, (int16_t)0x5c9au, (int16_t)0x01beu, + (int16_t)0xff48u, (int16_t)0x20b3u, (int16_t)0x5dd0u, (int16_t)0x022au, + (int16_t)0xff56u, (int16_t)0x1f0bu, (int16_t)0x5ef5u, (int16_t)0x029fu, + (int16_t)0xff64u, (int16_t)0x1d6cu, (int16_t)0x6007u, (int16_t)0x031cu, + (int16_t)0xff71u, (int16_t)0x1bd7u, (int16_t)0x6106u, (int16_t)0x03a4u, + (int16_t)0xff7eu, (int16_t)0x1a4cu, (int16_t)0x61f3u, (int16_t)0x0435u, + (int16_t)0xff8au, (int16_t)0x18cbu, (int16_t)0x62cbu, (int16_t)0x04d1u, + (int16_t)0xff96u, (int16_t)0x1756u, (int16_t)0x638fu, (int16_t)0x0577u, + (int16_t)0xffa1u, (int16_t)0x15ebu, (int16_t)0x643fu, (int16_t)0x0628u, + (int16_t)0xffacu, (int16_t)0x148cu, (int16_t)0x64d9u, (int16_t)0x06e4u, + (int16_t)0xffb6u, (int16_t)0x1338u, (int16_t)0x655eu, (int16_t)0x07abu, + (int16_t)0xffbfu, (int16_t)0x11f0u, (int16_t)0x65cdu, (int16_t)0x087du, + (int16_t)0xffc8u, (int16_t)0x10b4u, (int16_t)0x6626u, (int16_t)0x095au, + (int16_t)0xffd0u, (int16_t)0x0f83u, (int16_t)0x6669u, (int16_t)0x0a44u, + (int16_t)0xffd8u, (int16_t)0x0e5fu, (int16_t)0x6696u, (int16_t)0x0b39u, + (int16_t)0xffdfu, (int16_t)0x0d46u, (int16_t)0x66adu, (int16_t)0x0c39u}; + +int32_t rdot(size_t n, const int16_t * x, const int16_t * y) +{ + int32_t accu = 0; + + y += n; + + while (n != 0) + { + accu += *(x++) * *(--y); + --n; + } + + return accu; +} + +void adpcm_compute_residuals(int16_t * dst, const int16_t * src, + const int16_t * cb_entry, const int16_t * last_samples, size_t count) +{ + const int16_t * const book1 = cb_entry; + const int16_t * const book2 = cb_entry + 8; + + const int16_t l1 = last_samples[0]; + const int16_t l2 = last_samples[1]; + + size_t i; + + assert(count <= 8); + + for (i = 0; i < count; ++i) + { + int32_t accu = (int32_t)src[i] << 11; + accu += book1[i] * l1 + book2[i] * l2 + rdot(i, book2, src); + dst[i] = clamp_s16(accu >> 11); + } +} diff --git a/Source/Android/PluginRSP/audio.h b/Source/Project64-rsp-core/Hle/audio.h similarity index 57% rename from Source/Android/PluginRSP/audio.h rename to Source/Project64-rsp-core/Hle/audio.h index ffa229c67..cb018016e 100644 --- a/Source/Android/PluginRSP/audio.h +++ b/Source/Project64-rsp-core/Hle/audio.h @@ -5,18 +5,19 @@ // GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html #pragma once +#include extern const int16_t RESAMPLE_LUT[64 * 4]; -int32_t rdot(size_t n, const int16_t *x, const int16_t *y); +int32_t rdot(size_t n, const int16_t * x, const int16_t * y); static inline int16_t adpcm_predict_sample(uint8_t byte, uint8_t mask, - unsigned lshift, unsigned rshift) + unsigned lshift, unsigned rshift) { int16_t sample = (uint16_t)(byte & mask) << lshift; sample >>= rshift; // Signed return sample; } -void adpcm_compute_residuals(int16_t* dst, const int16_t* src, - const int16_t* cb_entry, const int16_t* last_samples, size_t count); +void adpcm_compute_residuals(int16_t * dst, const int16_t * src, + const int16_t * cb_entry, const int16_t * last_samples, size_t count); diff --git a/Source/Android/PluginRSP/cicx105.cpp b/Source/Project64-rsp-core/Hle/cicx105.cpp similarity index 87% rename from Source/Android/PluginRSP/cicx105.cpp rename to Source/Project64-rsp-core/Hle/cicx105.cpp index 4d093565b..5942d9794 100644 --- a/Source/Android/PluginRSP/cicx105.cpp +++ b/Source/Project64-rsp-core/Hle/cicx105.cpp @@ -6,9 +6,11 @@ // Copyright(C) 2002 Hacktarux // GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html -#include "stdafx.h" +#include #include +#include "hle.h" + /* During IPL3 stage of CIC x105 games, the RSP performs some checks and transactions necessary for booting the game. @@ -22,8 +24,8 @@ void cicx105_ucode(CHle * hle) { // memcpy is okay to use because access constraints are met (alignment, size) unsigned int i; - unsigned char *dst = hle->dram() + 0x2fb1f0; - unsigned char *src = hle->imem() + 0x120; + unsigned char * dst = hle->dram() + 0x2fb1f0; + unsigned char * src = hle->imem() + 0x120; // dma_read(0x1120, 0x1e8, 0x1e8) memcpy(hle->imem() + 0x120, hle->dram() + 0x1e8, 0x1f0); diff --git a/Source/Android/PluginRSP/hle.cpp b/Source/Project64-rsp-core/Hle/hle.cpp similarity index 96% rename from Source/Android/PluginRSP/hle.cpp rename to Source/Project64-rsp-core/Hle/hle.cpp index 71cf152cb..0b09ec55c 100644 --- a/Source/Android/PluginRSP/hle.cpp +++ b/Source/Project64-rsp-core/Hle/hle.cpp @@ -6,19 +6,20 @@ // Copyright(C) 2002 Hacktarux // GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html -#include "stdafx.h" -#if defined (_WIN32) && defined(_DEBUG) +#include "hle.h" +#include +#if defined(_WIN32) && defined(_DEBUG) #include #endif #include "mem.h" #include "ucodes.h" #include -#define min(a,b) (((a) < (b)) ? (a) : (b)) +#define min(a, b) (((a) < (b)) ? (a) : (b)) // Helper functions prototypes -static unsigned int sum_bytes(const uint8_t *bytes, uint32_t size); +static unsigned int sum_bytes(const uint8_t * bytes, uint32_t size); CHle::CHle(const RSP_INFO & Rsp_Info) : m_dram(Rsp_Info.RDRAM), @@ -98,7 +99,7 @@ void CHle::hle_execute(void) static unsigned int sum_bytes(const uint8_t * bytes, unsigned int size) { unsigned int sum = 0; - const unsigned char *const bytes_end = bytes + size; + const unsigned char * const bytes_end = bytes + size; while (bytes != bytes_end) { @@ -265,7 +266,8 @@ void CHle::normal_task_dispatching(void) const unsigned int sum = sum_bytes((const uint8_t *)dram_u32(this, *dmem_u32(this, TASK_UCODE)), min(*dmem_u32(this, TASK_UCODE_SIZE), 0xf80) >> 1); - switch (sum) { + switch (sum) + { // StoreVe12: found in Zelda Ocarina of Time [misleading task->type == 4] case 0x278: // Nothing to emulate @@ -320,7 +322,7 @@ void CHle::non_task_dispatching(void) #endif } -void CHle::VerboseMessage(const char *message, ...) +void CHle::VerboseMessage(const char * /*message*/, ...) { #if defined(_WIN32) && defined(_DEBUG) // These can get annoying @@ -330,7 +332,7 @@ void CHle::VerboseMessage(const char *message, ...) #endif } -void CHle::WarnMessage(const char *message, ...) +void CHle::WarnMessage(const char * message, ...) { #if defined(_WIN32) && defined(_DEBUG) MessageBoxA(NULL, message, "HLE warning message", MB_OK); diff --git a/Source/Project64-rsp-core/Hle/hle.h b/Source/Project64-rsp-core/Hle/hle.h new file mode 100644 index 000000000..24dbac589 --- /dev/null +++ b/Source/Project64-rsp-core/Hle/hle.h @@ -0,0 +1,138 @@ +// Project64 - A Nintendo 64 emulator +// https://www.pj64-emu.com/ +// Copyright(C) 2001-2021 Project64 +// Copyright(C) 2014 Bobby Smiles +// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html + +#pragma once +#include "ucodes.h" +#include +#include +#include + +// Macro for unused variable warning suppression +#ifdef __GNUC__ +#define UNUSED(x) UNUSED_##x __attribute__((__unused__)) +#else +#define UNUSED(x) /* x */ +#endif + +class CHle +{ +public: + CHle(const RSP_INFO & Rsp_Info); + ~CHle(); + + uint8_t * dram() + { + return m_dram; + } + uint8_t * dmem() + { + return m_dmem; + } + uint8_t * imem() + { + return m_imem; + } + + bool AudioHle() + { + return m_AudioHle; + } + bool GraphicsHle() + { + return m_GraphicsHle; + } + struct alist_audio_t & alist_audio() + { + return m_alist_audio; + } + struct alist_naudio_t & alist_naudio() + { + return m_alist_naudio; + } + struct alist_nead_t & alist_nead() + { + return m_alist_nead; + } + uint8_t * mp3_buffer() + { + return &m_mp3_buffer[0]; + } + + uint8_t * alist_buffer() + { + return &m_alist_buffer[0]; + } + + void VerboseMessage(const char * message, ...); + void WarnMessage(const char * message, ...); + void ErrorMessage(const char * message, ...); + + void rsp_break(uint32_t setbits); + void hle_execute(void); + + bool try_fast_audio_dispatching(void); + +private: + CHle(void); + CHle(const CHle &); + CHle & operator=(const CHle &); + + bool is_task(void); + bool try_fast_task_dispatching(void); + void normal_task_dispatching(void); + void non_task_dispatching(void); + + uint8_t * m_dram; + uint8_t * m_dmem; + uint8_t * m_imem; + + uint32_t * m_mi_intr; + + uint32_t * m_sp_mem_addr; + uint32_t * m_sp_dram_addr; + uint32_t * m_sp_rd_length; + uint32_t * m_sp_wr_length; + uint32_t * m_sp_status; + uint32_t * m_sp_dma_full; + uint32_t * m_sp_dma_busy; + uint32_t * m_sp_pc; + uint32_t * m_sp_semaphore; + + uint32_t * m_dpc_start; + uint32_t * m_dpc_end; + uint32_t * m_dpc_current; + uint32_t * m_dpc_status; + uint32_t * m_dpc_clock; + uint32_t * m_dpc_bufbusy; + uint32_t * m_dpc_pipebusy; + uint32_t * m_dpc_tmem; + + void (*m_CheckInterrupts)(void); + void (*m_ProcessDList)(void); + void (*m_ProcessAList)(void); + void (*m_ProcessRdpList)(void); + void (*m_ShowCFB)(void); + + // alist.cpp + uint8_t m_alist_buffer[0x1000]; + + // alist_audio.cpp + struct alist_audio_t m_alist_audio; + + // alist_naudio.cpp + struct alist_naudio_t m_alist_naudio; + + // alist_nead.cpp + struct alist_nead_t m_alist_nead; + + // mp3.cpp + uint8_t m_mp3_buffer[0x1000]; + + bool m_AudioHle; + bool m_GraphicsHle; + bool m_ForwardAudio; + bool m_ForwardGFX; +}; diff --git a/Source/Android/PluginRSP/jpeg.cpp b/Source/Project64-rsp-core/Hle/jpeg.cpp similarity index 73% rename from Source/Android/PluginRSP/jpeg.cpp rename to Source/Project64-rsp-core/Hle/jpeg.cpp index 1b1b4dd4d..405cae1f5 100644 --- a/Source/Android/PluginRSP/jpeg.cpp +++ b/Source/Project64-rsp-core/Hle/jpeg.cpp @@ -6,7 +6,7 @@ // Copyright(C) 2002 Hacktarux // GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html -#include "stdafx.h" +#include #include #include "arithmetics.h" @@ -14,15 +14,15 @@ #define SUBBLOCK_SIZE 64 -typedef void(*tile_line_emitter_t)(CHle * hle, const int16_t *y, const int16_t *u, uint32_t address); -typedef void(*subblock_transform_t)(int16_t *dst, const int16_t *src); +typedef void (*tile_line_emitter_t)(CHle * hle, const int16_t * y, const int16_t * u, uint32_t address); +typedef void (*subblock_transform_t)(int16_t * dst, const int16_t * src); // Standard JPEG microcode decoder static void jpeg_decode_std(CHle * hle, - const char *const version, - const subblock_transform_t transform_luma, - const subblock_transform_t transform_chroma, - const tile_line_emitter_t emit_line); + const char * const version, + const subblock_transform_t transform_luma, + const subblock_transform_t transform_chroma, + const tile_line_emitter_t emit_line); // Helper functions static uint8_t clamp_u8(int16_t x); @@ -34,30 +34,30 @@ static uint32_t GetUYVY(int16_t y1, int16_t y2, int16_t u, int16_t v); static uint16_t GetRGBA(int16_t y, int16_t u, int16_t v); // Tile line emitters -static void EmitYUVTileLine(CHle * hle, const int16_t *y, const int16_t *u, uint32_t address); -static void EmitRGBATileLine(CHle * hle, const int16_t *y, const int16_t *u, uint32_t address); +static void EmitYUVTileLine(CHle * hle, const int16_t * y, const int16_t * u, uint32_t address); +static void EmitRGBATileLine(CHle * hle, const int16_t * y, const int16_t * u, uint32_t address); // Macroblocks operations -static void decode_macroblock_ob(int16_t *macroblock, int32_t *y_dc, int32_t *u_dc, int32_t *v_dc, const int16_t *qtable); +static void decode_macroblock_ob(int16_t * macroblock, int32_t * y_dc, int32_t * u_dc, int32_t * v_dc, const int16_t * qtable); static void decode_macroblock_std(const subblock_transform_t transform_luma, - const subblock_transform_t transform_chroma, - int16_t *macroblock, - unsigned int subblock_count, - const int16_t qtables[3][SUBBLOCK_SIZE]); -static void EmitTilesMode0(CHle * hle, const tile_line_emitter_t emit_line, const int16_t *macroblock, uint32_t address); -static void EmitTilesMode2(CHle * hle, const tile_line_emitter_t emit_line, const int16_t *macroblock, uint32_t address); + const subblock_transform_t transform_chroma, + int16_t * macroblock, + unsigned int subblock_count, + const int16_t qtables[3][SUBBLOCK_SIZE]); +static void EmitTilesMode0(CHle * hle, const tile_line_emitter_t emit_line, const int16_t * macroblock, uint32_t address); +static void EmitTilesMode2(CHle * hle, const tile_line_emitter_t emit_line, const int16_t * macroblock, uint32_t address); // Sub blocks operations -static void TransposeSubBlock(int16_t *dst, const int16_t *src); -static void ZigZagSubBlock(int16_t *dst, const int16_t *src); -static void ReorderSubBlock(int16_t *dst, const int16_t *src, const unsigned int *table); -static void MultSubBlocks(int16_t *dst, const int16_t *src1, const int16_t *src2, unsigned int shift); -static void ScaleSubBlock(int16_t *dst, const int16_t *src, int16_t scale); -static void RShiftSubBlock(int16_t *dst, const int16_t *src, unsigned int shift); -static void InverseDCT1D(const float *const x, float *dst, unsigned int stride); -static void InverseDCTSubBlock(int16_t *dst, const int16_t *src); -static void RescaleYSubBlock(int16_t *dst, const int16_t *src); -static void RescaleUVSubBlock(int16_t *dst, const int16_t *src); +static void TransposeSubBlock(int16_t * dst, const int16_t * src); +static void ZigZagSubBlock(int16_t * dst, const int16_t * src); +static void ReorderSubBlock(int16_t * dst, const int16_t * src, const unsigned int * table); +static void MultSubBlocks(int16_t * dst, const int16_t * src1, const int16_t * src2, unsigned int shift); +static void ScaleSubBlock(int16_t * dst, const int16_t * src, int16_t scale); +static void RShiftSubBlock(int16_t * dst, const int16_t * src, unsigned int shift); +static void InverseDCT1D(const float * const x, float * dst, unsigned int stride); +static void InverseDCTSubBlock(int16_t * dst, const int16_t * src); +static void RescaleYSubBlock(int16_t * dst, const int16_t * src); +static void RescaleUVSubBlock(int16_t * dst, const int16_t * src); // Transposed dequantization table static const int16_t DEFAULT_QTABLE[SUBBLOCK_SIZE] = { @@ -68,8 +68,7 @@ static const int16_t DEFAULT_QTABLE[SUBBLOCK_SIZE] = { 24, 26, 40, 51, 68, 81, 103, 112, 40, 58, 57, 87, 109, 104, 121, 100, 51, 60, 69, 80, 103, 113, 120, 103, - 61, 55, 56, 62, 77, 92, 101, 99 -}; + 61, 55, 56, 62, 77, 92, 101, 99}; // Zig-zag indices static const unsigned int ZIGZAG_TABLE[SUBBLOCK_SIZE] = { @@ -80,8 +79,7 @@ static const unsigned int ZIGZAG_TABLE[SUBBLOCK_SIZE] = { 10, 19, 23, 32, 39, 45, 52, 54, 20, 22, 33, 38, 46, 51, 55, 60, 21, 34, 37, 47, 50, 56, 59, 61, - 35, 36, 48, 49, 57, 58, 62, 63 -}; + 35, 36, 48, 49, 57, 58, 62, 63}; // Transposition indices static const unsigned int TRANSPOSE_TABLE[SUBBLOCK_SIZE] = { @@ -92,24 +90,23 @@ static const unsigned int TRANSPOSE_TABLE[SUBBLOCK_SIZE] = { 4, 12, 20, 28, 36, 44, 52, 60, 5, 13, 21, 29, 37, 45, 53, 61, 6, 14, 22, 30, 38, 46, 54, 62, - 7, 15, 23, 31, 39, 47, 55, 63 -}; + 7, 15, 23, 31, 39, 47, 55, 63}; /* IDCT related constants * Cn = alpha * cos(n * PI / 16) (alpha is chosen such as C4 = 1) */ static const float IDCT_C3 = 1.175875602f; static const float IDCT_C6 = 0.541196100f; static const float IDCT_K[10] = { - 0.765366865f, // C2-C6 - -1.847759065f, // -C2-C6 - -0.390180644f, // C5-C3 - -1.961570561f, // -C5-C3 - 1.501321110f, // C1+C3-C5-C7 - 2.053119869f, // C1+C3-C5+C7 - 3.072711027f, // C1+C3+C5-C7 - 0.298631336f, // -C1+C3+C5-C7 - -0.899976223f, // C7-C3 - -2.562915448f // -C1-C3 + 0.765366865f, // C2-C6 + -1.847759065f, // -C2-C6 + -0.390180644f, // C5-C3 + -1.961570561f, // -C5-C3 + 1.501321110f, // C1+C3-C5-C7 + 2.053119869f, // C1+C3-C5+C7 + 3.072711027f, // C1+C3+C5-C7 + 0.298631336f, // -C1+C3+C5-C7 + -0.899976223f, // C7-C3 + -2.562915448f // -C1-C3 }; // Global functions @@ -128,7 +125,6 @@ void jpeg_decode_PS(CHle * hle) jpeg_decode_std(hle, "PS", NULL, NULL, EmitRGBATileLine); } - // JPEG decoding microcode found in Ogre Battle and Bottom of the 9th void jpeg_decode_OB(CHle * hle) @@ -140,9 +136,9 @@ void jpeg_decode_OB(CHle * hle) int32_t u_dc = 0; int32_t v_dc = 0; - uint32_t address = *dmem_u32(hle, TASK_DATA_PTR); + uint32_t address = *dmem_u32(hle, TASK_DATA_PTR); const unsigned int macroblock_count = *dmem_u32(hle, TASK_DATA_SIZE); - const int qscale = *dmem_u32(hle, TASK_YIELD_DATA_SIZE); + const int qscale = *dmem_u32(hle, TASK_YIELD_DATA_SIZE); hle->VerboseMessage("jpeg_decode_OB: *buffer=%x, #MB=%d, qscale=%d", address, macroblock_count, qscale); @@ -172,7 +168,7 @@ void jpeg_decode_OB(CHle * hle) // Local functions -static void jpeg_decode_std(CHle * hle, const char *const version, const subblock_transform_t transform_luma, const subblock_transform_t transform_chroma, const tile_line_emitter_t emit_line) +static void jpeg_decode_std(CHle * hle, const char * const version, const subblock_transform_t transform_luma, const subblock_transform_t transform_chroma, const tile_line_emitter_t emit_line) { int16_t qtables[3][SUBBLOCK_SIZE]; unsigned int mb; @@ -268,9 +264,9 @@ static uint16_t clamp_RGBA_component(int16_t x) static uint32_t GetUYVY(int16_t y1, int16_t y2, int16_t u, int16_t v) { return (uint32_t)clamp_u8(u) << 24 | - (uint32_t)clamp_u8(y1) << 16 | - (uint32_t)clamp_u8(v) << 8 | - (uint32_t)clamp_u8(y2); + (uint32_t)clamp_u8(y1) << 16 | + (uint32_t)clamp_u8(v) << 8 | + (uint32_t)clamp_u8(y2); } static uint16_t GetRGBA(int16_t y, int16_t u, int16_t v) @@ -286,12 +282,12 @@ static uint16_t GetRGBA(int16_t y, int16_t u, int16_t v) return (r << 4) | (g >> 1) | (b >> 6) | 1; } -static void EmitYUVTileLine(CHle * hle, const int16_t *y, const int16_t *u, uint32_t address) +static void EmitYUVTileLine(CHle * hle, const int16_t * y, const int16_t * u, uint32_t address) { uint32_t uyvy[8]; - const int16_t *const v = u + SUBBLOCK_SIZE; - const int16_t *const y2 = y + SUBBLOCK_SIZE; + const int16_t * const v = u + SUBBLOCK_SIZE; + const int16_t * const y2 = y + SUBBLOCK_SIZE; uyvy[0] = GetUYVY(y[0], y[1], u[0], v[0]); uyvy[1] = GetUYVY(y[2], y[3], u[1], v[1]); @@ -305,12 +301,12 @@ static void EmitYUVTileLine(CHle * hle, const int16_t *y, const int16_t *u, uint dram_store_u32(hle, uyvy, address, 8); } -static void EmitRGBATileLine(CHle * hle, const int16_t *y, const int16_t *u, uint32_t address) +static void EmitRGBATileLine(CHle * hle, const int16_t * y, const int16_t * u, uint32_t address) { uint16_t rgba[16]; - const int16_t *const v = u + SUBBLOCK_SIZE; - const int16_t *const y2 = y + SUBBLOCK_SIZE; + const int16_t * const v = u + SUBBLOCK_SIZE; + const int16_t * const y2 = y + SUBBLOCK_SIZE; rgba[0] = GetRGBA(y[0], u[0], v[0]); rgba[1] = GetRGBA(y[1], u[0], v[0]); @@ -332,14 +328,15 @@ static void EmitRGBATileLine(CHle * hle, const int16_t *y, const int16_t *u, uin dram_store_u16(hle, rgba, address, 16); } -static void EmitTilesMode0(CHle * hle, const tile_line_emitter_t emit_line, const int16_t *macroblock, uint32_t address) +static void EmitTilesMode0(CHle * hle, const tile_line_emitter_t emit_line, const int16_t * macroblock, uint32_t address) { unsigned int i; unsigned int y_offset = 0; unsigned int u_offset = 2 * SUBBLOCK_SIZE; - for (i = 0; i < 8; ++i) { + for (i = 0; i < 8; ++i) + { emit_line(hle, ¯oblock[y_offset], ¯oblock[u_offset], address); y_offset += 8; @@ -348,7 +345,7 @@ static void EmitTilesMode0(CHle * hle, const tile_line_emitter_t emit_line, cons } } -static void EmitTilesMode2(CHle * hle, const tile_line_emitter_t emit_line, const int16_t *macroblock, uint32_t address) +static void EmitTilesMode2(CHle * hle, const tile_line_emitter_t emit_line, const int16_t * macroblock, uint32_t address) { unsigned int i; @@ -366,16 +363,18 @@ static void EmitTilesMode2(CHle * hle, const tile_line_emitter_t emit_line, cons } } -static void decode_macroblock_ob(int16_t *macroblock, int32_t *y_dc, int32_t *u_dc, int32_t *v_dc, const int16_t *qtable) +static void decode_macroblock_ob(int16_t * macroblock, int32_t * y_dc, int32_t * u_dc, int32_t * v_dc, const int16_t * qtable) { int sb; - for (sb = 0; sb < 6; ++sb) { + for (sb = 0; sb < 6; ++sb) + { int16_t tmp_sb[SUBBLOCK_SIZE]; // Update decode int32_t dc = (int32_t)macroblock[0]; - switch (sb) { + switch (sb) + { case 0: case 1: case 2: @@ -406,10 +405,10 @@ static void decode_macroblock_ob(int16_t *macroblock, int32_t *y_dc, int32_t *u_ } static void decode_macroblock_std(const subblock_transform_t transform_luma, - const subblock_transform_t transform_chroma, - int16_t *macroblock, - unsigned int subblock_count, - const int16_t qtables[3][SUBBLOCK_SIZE]) + const subblock_transform_t transform_chroma, + int16_t * macroblock, + unsigned int subblock_count, + const int16_t qtables[3][SUBBLOCK_SIZE]) { unsigned int sb; unsigned int q = 0; @@ -446,17 +445,17 @@ static void decode_macroblock_std(const subblock_transform_t transform_luma, } } -static void TransposeSubBlock(int16_t *dst, const int16_t *src) +static void TransposeSubBlock(int16_t * dst, const int16_t * src) { ReorderSubBlock(dst, src, TRANSPOSE_TABLE); } -static void ZigZagSubBlock(int16_t *dst, const int16_t *src) +static void ZigZagSubBlock(int16_t * dst, const int16_t * src) { ReorderSubBlock(dst, src, ZIGZAG_TABLE); } -static void ReorderSubBlock(int16_t *dst, const int16_t *src, const unsigned int *table) +static void ReorderSubBlock(int16_t * dst, const int16_t * src, const unsigned int * table) { unsigned int i; @@ -467,7 +466,7 @@ static void ReorderSubBlock(int16_t *dst, const int16_t *src, const unsigned int dst[i] = src[table[i]]; } -static void MultSubBlocks(int16_t *dst, const int16_t *src1, const int16_t *src2, unsigned int shift) +static void MultSubBlocks(int16_t * dst, const int16_t * src1, const int16_t * src2, unsigned int shift) { unsigned int i; @@ -478,17 +477,18 @@ static void MultSubBlocks(int16_t *dst, const int16_t *src1, const int16_t *src2 } } -static void ScaleSubBlock(int16_t *dst, const int16_t *src, int16_t scale) +static void ScaleSubBlock(int16_t * dst, const int16_t * src, int16_t scale) { unsigned int i; - for (i = 0; i < SUBBLOCK_SIZE; ++i) { + for (i = 0; i < SUBBLOCK_SIZE; ++i) + { int32_t v = src[i] * scale; dst[i] = clamp_s16(v); } } -static void RShiftSubBlock(int16_t *dst, const int16_t *src, unsigned int shift) +static void RShiftSubBlock(int16_t * dst, const int16_t * src, unsigned int shift) { unsigned int i; @@ -503,8 +503,8 @@ Computations use single precision floats Implementation based on Wikipedia: https://fr.wikipedia.org/wiki/Transform%C3%A9e_en_cosinus_discr%C3%A8te */ - -static void InverseDCT1D(const float *const x, float *dst, unsigned int stride) + +static void InverseDCT1D(const float * const x, float * dst, unsigned int stride) { float e[4]; float f[4]; @@ -514,8 +514,8 @@ static void InverseDCT1D(const float *const x, float *dst, unsigned int stride) x37 = IDCT_K[3] * (x[3] + x[7]); x17 = IDCT_K[8] * (x[1] + x[7]); x35 = IDCT_K[9] * (x[3] + x[5]); - x1357 = IDCT_C3 * (x[1] + x[3] + x[5] + x[7]); - x26 = IDCT_C6 * (x[2] + x[6]); + x1357 = IDCT_C3 * (x[1] + x[3] + x[5] + x[7]); + x26 = IDCT_C6 * (x[2] + x[6]); f[0] = x[0] + x[4]; f[1] = x[0] - x[4]; @@ -544,7 +544,7 @@ static void InverseDCT1D(const float *const x, float *dst, unsigned int stride) *dst = f[0] + f[2] - e[0]; } -static void InverseDCTSubBlock(int16_t *dst, const int16_t *src) +static void InverseDCTSubBlock(int16_t * dst, const int16_t * src) { float x[8]; float block[SUBBLOCK_SIZE]; @@ -572,7 +572,7 @@ static void InverseDCTSubBlock(int16_t *dst, const int16_t *src) } } } -static void RescaleYSubBlock(int16_t *dst, const int16_t *src) +static void RescaleYSubBlock(int16_t * dst, const int16_t * src) { unsigned int i; @@ -581,7 +581,7 @@ static void RescaleYSubBlock(int16_t *dst, const int16_t *src) dst[i] = (((uint32_t)(clamp_s12(src[i]) + 0x800) * 0xdb0) >> 16) + 0x10; } } -static void RescaleUVSubBlock(int16_t *dst, const int16_t *src) +static void RescaleUVSubBlock(int16_t * dst, const int16_t * src) { unsigned int i; diff --git a/Source/Android/PluginRSP/mem.cpp b/Source/Project64-rsp-core/Hle/mem.cpp similarity index 64% rename from Source/Android/PluginRSP/mem.cpp rename to Source/Project64-rsp-core/Hle/mem.cpp index 4b8087fd0..68ea995c5 100644 --- a/Source/Android/PluginRSP/mem.cpp +++ b/Source/Project64-rsp-core/Hle/mem.cpp @@ -4,13 +4,14 @@ // Copyright(C) 2012 Bobby Smiles // GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html -#include "stdafx.h" +#include +#include #include #include "mem.h" // Global functions -void load_u8(uint8_t* dst, const unsigned char* buffer, unsigned address, size_t count) +void load_u8(uint8_t * dst, const unsigned char * buffer, unsigned address, size_t count) { while (count != 0) { @@ -20,7 +21,7 @@ void load_u8(uint8_t* dst, const unsigned char* buffer, unsigned address, size_t } } -void store_u16(unsigned char* buffer, unsigned address, const uint16_t* src, size_t count) +void store_u16(unsigned char * buffer, unsigned address, const uint16_t * src, size_t count) { while (count != 0) { @@ -30,13 +31,13 @@ void store_u16(unsigned char* buffer, unsigned address, const uint16_t* src, siz } } -void load_u32(uint32_t* dst, const unsigned char* buffer, unsigned address, size_t count) +void load_u32(uint32_t * dst, const unsigned char * buffer, unsigned address, size_t count) { // Optimization for uint32_t memcpy(dst, u32(buffer, address), count * sizeof(uint32_t)); } -void load_u16(uint16_t* dst, const unsigned char* buffer, unsigned address, size_t count) +void load_u16(uint16_t * dst, const unsigned char * buffer, unsigned address, size_t count) { while (count != 0) { @@ -46,7 +47,7 @@ void load_u16(uint16_t* dst, const unsigned char* buffer, unsigned address, size } } -void store_u32(unsigned char* buffer, unsigned address, const uint32_t* src, size_t count) +void store_u32(unsigned char * buffer, unsigned address, const uint32_t * src, size_t count) { // Optimization for uint32_t memcpy(u32(buffer, address), src, count * sizeof(uint32_t)); diff --git a/Source/Project64-rsp-core/Hle/mem.h b/Source/Project64-rsp-core/Hle/mem.h new file mode 100644 index 000000000..5fef1ecfe --- /dev/null +++ b/Source/Project64-rsp-core/Hle/mem.h @@ -0,0 +1,113 @@ +// Project64 - A Nintendo 64 emulator +// https://www.pj64-emu.com/ +// Copyright(C) 2001-2021 Project64 +// Copyright(C) 2014 Bobby Smiles +// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html + +#pragma once +#include "hle.h" +#include + +#define S 1 +#define S16 2 +#define S8 3 + +enum +{ + TASK_TYPE = 0xfc0, + TASK_FLAGS = 0xfc4, + TASK_UCODE_BOOT = 0xfc8, + TASK_UCODE_BOOT_SIZE = 0xfcc, + TASK_UCODE = 0xfd0, + TASK_UCODE_SIZE = 0xfd4, + TASK_UCODE_DATA = 0xfd8, + TASK_UCODE_DATA_SIZE = 0xfdc, + TASK_DRAM_STACK = 0xfe0, + TASK_DRAM_STACK_SIZE = 0xfe4, + TASK_OUTPUT_BUFF = 0xfe8, + TASK_OUTPUT_BUFF_SIZE = 0xfec, + TASK_DATA_PTR = 0xff0, + TASK_DATA_SIZE = 0xff4, + TASK_YIELD_DATA_PTR = 0xff8, + TASK_YIELD_DATA_SIZE = 0xffc +}; + +static inline unsigned int align(unsigned int x, unsigned amount) +{ + --amount; + return (x + amount) & ~amount; +} + +static inline uint8_t * u8(const unsigned char * buffer, unsigned address) +{ + return (uint8_t *)(buffer + (address ^ S8)); +} + +static inline uint16_t * u16(const unsigned char * buffer, unsigned address) +{ + assert((address & 1) == 0); + return (uint16_t *)(buffer + (address ^ S16)); +} + +static inline uint32_t * u32(const unsigned char * buffer, unsigned address) +{ + assert((address & 3) == 0); + return (uint32_t *)(buffer + address); +} + +void load_u8(uint8_t * dst, const unsigned char * buffer, unsigned address, size_t count); +void load_u16(uint16_t * dst, const unsigned char * buffer, unsigned address, size_t count); +void load_u32(uint32_t * dst, const unsigned char * buffer, unsigned address, size_t count); +void store_u16(unsigned char * buffer, unsigned address, const uint16_t * src, size_t count); +void store_u32(unsigned char * buffer, unsigned address, const uint32_t * src, size_t count); + +static inline uint32_t * dmem_u32(CHle * hle, uint16_t address) +{ + return u32(hle->dmem(), address & 0xfff); +} + +static inline void dmem_store_u32(CHle * hle, const uint32_t * src, uint16_t address, size_t count) +{ + store_u32(hle->dmem(), address & 0xfff, src, count); +} + +// Convenient functions DRAM access +static inline uint8_t * dram_u8(CHle * hle, uint32_t address) +{ + return u8(hle->dram(), address & 0xffffff); +} + +static inline uint16_t * dram_u16(CHle * hle, uint32_t address) +{ + return u16(hle->dram(), address & 0xffffff); +} + +static inline uint32_t * dram_u32(CHle * hle, uint32_t address) +{ + return u32(hle->dram(), address & 0xffffff); +} + +static inline void dram_load_u8(CHle * hle, uint8_t * dst, uint32_t address, size_t count) +{ + load_u8(dst, hle->dram(), address & 0xffffff, count); +} + +static inline void dram_load_u16(CHle * hle, uint16_t * dst, uint32_t address, size_t count) +{ + load_u16(dst, hle->dram(), address & 0xffffff, count); +} + +static inline void dram_load_u32(CHle * hle, uint32_t * dst, uint32_t address, size_t count) +{ + load_u32(dst, hle->dram(), address & 0xffffff, count); +} + +static inline void dram_store_u16(CHle * hle, const uint16_t * src, uint32_t address, size_t count) +{ + store_u16(hle->dram(), address & 0xffffff, src, count); +} + +static inline void dram_store_u32(CHle * hle, const uint32_t * src, uint32_t address, size_t count) +{ + store_u32(hle->dram(), address & 0xffffff, src, count); +} diff --git a/Source/Android/PluginRSP/mp3.cpp b/Source/Project64-rsp-core/Hle/mp3.cpp similarity index 87% rename from Source/Android/PluginRSP/mp3.cpp rename to Source/Project64-rsp-core/Hle/mp3.cpp index 7072d6516..24e2cb57d 100644 --- a/Source/Android/PluginRSP/mp3.cpp +++ b/Source/Project64-rsp-core/Hle/mp3.cpp @@ -6,7 +6,7 @@ // Copyright(C) 2002 Hacktarux // GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html -#include "stdafx.h" +#include #include #include "arithmetics.h" @@ -14,7 +14,7 @@ static void InnerLoop(CHle * hle, uint32_t outPtr, uint32_t inPtr, uint32_t t6, uint32_t t5, uint32_t t4); -static const uint16_t DeWindowLUT [0x420] = { +static const uint16_t DeWindowLUT[0x420] = { 0x0000, 0xFFF3, 0x005D, 0xFF38, 0x037A, 0xF736, 0x0B37, 0xC00E, 0x7FFF, 0x3FF2, 0x0B37, 0x08CA, 0x037A, 0x00C8, 0x005D, 0x000D, 0x0000, 0xFFF3, 0x005D, 0xFF38, 0x037A, 0xF736, 0x0B37, 0xC00E, @@ -146,18 +146,16 @@ static const uint16_t DeWindowLUT [0x420] = { 0x005D, 0x00C8, 0x037A, 0x08CA, 0x0B37, 0x3FF2, 0x7FFF, 0xC00E, 0x0B37, 0xF736, 0x037A, 0xFF38, 0x005D, 0xFFF3, 0x0000, 0x000D, 0x005D, 0x00C8, 0x037A, 0x08CA, 0x0B37, 0x3FF2, 0x7FFF, 0xC00E, - 0x0B37, 0xF736, 0x037A, 0xFF38, 0x005D, 0xFFF3, 0x0000, 0x0000 -}; + 0x0B37, 0xF736, 0x037A, 0xFF38, 0x005D, 0xFFF3, 0x0000, 0x0000}; -static void MP3AB0(int32_t* v) +static void MP3AB0(int32_t * v) { // Part 2 - 100% accurate static const uint16_t LUT2[8] = - { - 0xFEC4, 0xF4FA, 0xC5E4, 0xE1C4, - 0x1916, 0x4A50, 0xA268, 0x78AE - }; - static const uint16_t LUT3[4] = { 0xFB14, 0xD4DC, 0x31F2, 0x8E3A }; + { + 0xFEC4, 0xF4FA, 0xC5E4, 0xE1C4, + 0x1916, 0x4A50, 0xA268, 0x78AE}; + static const uint16_t LUT3[4] = {0xFB14, 0xD4DC, 0x31F2, 0x8E3A}; int i; for (i = 0; i < 8; i++) @@ -170,10 +168,10 @@ static void MP3AB0(int32_t* v) for (i = 0; i < 4; i++) { - v[0 + i] = v[16 + i] + v[20 + i]; - v[4 + i] = ((v[16 + i] - v[20 + i]) * LUT3[i]) >> 0x10; + v[0 + i] = v[16 + i] + v[20 + i]; + v[4 + i] = ((v[16 + i] - v[20 + i]) * LUT3[i]) >> 0x10; - v[8 + i] = v[24 + i] + v[28 + i]; + v[8 + i] = v[24 + i] + v[28 + i]; v[12 + i] = ((v[24 + i] - v[28 + i]) * LUT3[i]) >> 0x10; } @@ -192,12 +190,12 @@ static void MP3AB0(int32_t* v) void mp3_task(CHle * hle, unsigned int index, uint32_t address) { uint32_t inPtr, outPtr; - uint32_t t6;// = 0x08A0; - I think these are temporary storage buffers - uint32_t t5;// = 0x0AC0; - uint32_t t4;// = (w1 & 0x1E); + uint32_t t6; // = 0x08A0; - I think these are temporary storage buffers + uint32_t t5; // = 0x0AC0; + uint32_t t4; // = (w1 & 0x1E); // Initialization code - uint32_t readPtr; // S5 + uint32_t readPtr; // S5 uint32_t writePtr; // S6 uint32_t tmp; int cnt, cnt2; @@ -217,7 +215,7 @@ void mp3_task(CHle * hle, unsigned int index, uint32_t address) { // DMA: 0xCF0 <- RDRAM[s5] : 0x180 memcpy(hle->mp3_buffer() + 0xCF0, hle->dram() + readPtr, 0x180); - inPtr = 0xCF0; // S7 + inPtr = 0xCF0; // S7 outPtr = 0xE70; // S3 // Inner loop start for (cnt2 = 0; cnt2 < 0x180; cnt2 += 0x40) @@ -237,7 +235,7 @@ void mp3_task(CHle * hle, unsigned int index, uint32_t address) // Inner loop end memcpy(hle->dram() + writePtr, hle->mp3_buffer() + 0xe70, 0x180); writePtr += 0x180; - readPtr += 0x180; + readPtr += 0x180; } } @@ -247,12 +245,11 @@ static void InnerLoop(CHle * hle, uint32_t outPtr, uint32_t inPtr, uint32_t t6, // 0, 1, 3, 2, 7, 6, 4, 5, 7, 6, 4, 5, 0, 1, 3, 2 static const uint16_t LUT6[16] = - { - 0xFFB2, 0xFD3A, 0xF10A, 0xF854, - 0xBDAE, 0xCDA0, 0xE76C, 0xDB94, - 0x1920, 0x4B20, 0xAC7C, 0x7C68, - 0xABEC, 0x9880, 0xDAE8, 0x839C - }; + { + 0xFFB2, 0xFD3A, 0xF10A, 0xF854, + 0xBDAE, 0xCDA0, 0xE76C, 0xDB94, + 0x1920, 0x4B20, 0xAC7C, 0x7C68, + 0xABEC, 0x9880, 0xDAE8, 0x839C}; int i; uint32_t t0; uint32_t t1; @@ -351,7 +348,7 @@ static void InnerLoop(CHle * hle, uint32_t outPtr, uint32_t inPtr, uint32_t t6, v[2] = -v[2]; // ** Store v[2] -> (T2 + 0)** *(int16_t *)(hle->mp3_buffer() + ((t2 + (short)0x0))) = (short)v[2]; - v[3] = (((v[18] - v[19]) * 0x16A09) >> 0x10) + v[2]; + v[3] = (((v[18] - v[19]) * 0x16A09) >> 0x10) + v[2]; // ** Store v[3] -> (T0 + 0)** *(int16_t *)(hle->mp3_buffer() + ((t0 + (short)0x0))) = (short)v[3]; // 0x1400 - Verified... @@ -497,7 +494,7 @@ static void InnerLoop(CHle * hle, uint32_t outPtr, uint32_t inPtr, uint32_t t6, v[7] = (((v[22] - v[23]) * 0x2D413) >> 0x10) + v[0] + v[1] + v[3]; // 0x16A8 // Save v[0] -> (T3 + 0xFFE0) - *(int16_t *)(hle->mp3_buffer() + ((t3 + (short)0xFFE0))) = (short) - v[0]; + *(int16_t *)(hle->mp3_buffer() + ((t3 + (short)0xFFE0))) = (short)-v[0]; v[8] = v[24] + v[25]; v[9] = ((v[24] - v[25]) * 0x16A09) >> 0x10; v[10] = ((v[26] + v[27]) << 1) + v[8]; @@ -571,20 +568,20 @@ static void InnerLoop(CHle * hle, uint32_t outPtr, uint32_t inPtr, uint32_t t6, for (i = 7; i >= 0; i--) { - v2 += ((int) * (int16_t *)(hle->mp3_buffer() + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF; - v4 += ((int) * (int16_t *)(hle->mp3_buffer() + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF; - v6 += ((int) * (int16_t *)(hle->mp3_buffer() + (addptr) + 0x20) * (short)DeWindowLUT[offset + 0x20] + 0x4000) >> 0xF; - v8 += ((int) * (int16_t *)(hle->mp3_buffer() + (addptr) + 0x30) * (short)DeWindowLUT[offset + 0x28] + 0x4000) >> 0xF; + v2 += ((int)*(int16_t *)(hle->mp3_buffer() + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF; + v4 += ((int)*(int16_t *)(hle->mp3_buffer() + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF; + v6 += ((int)*(int16_t *)(hle->mp3_buffer() + (addptr) + 0x20) * (short)DeWindowLUT[offset + 0x20] + 0x4000) >> 0xF; + v8 += ((int)*(int16_t *)(hle->mp3_buffer() + (addptr) + 0x30) * (short)DeWindowLUT[offset + 0x28] + 0x4000) >> 0xF; addptr += 2; offset++; } - v0 = v2 + v4; + v0 = v2 + v4; v18 = v6 + v8; // Clamp(v0); // Clamp(v18); // Clamp? *(int16_t *)(hle->mp3_buffer() + (outPtr ^ S16)) = v0; - *(int16_t *)(hle->mp3_buffer() + ((outPtr + 2)^S16)) = v18; + *(int16_t *)(hle->mp3_buffer() + ((outPtr + 2) ^ S16)) = v18; outPtr += 4; addptr += 0x30; offset += 0x38; @@ -594,12 +591,12 @@ static void InnerLoop(CHle * hle, uint32_t outPtr, uint32_t inPtr, uint32_t t6, v2 = v4 = 0; for (i = 0; i < 4; i++) { - v2 += ((int) * (int16_t *)(hle->mp3_buffer() + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF; - v2 += ((int) * (int16_t *)(hle->mp3_buffer() + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF; + v2 += ((int)*(int16_t *)(hle->mp3_buffer() + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF; + v2 += ((int)*(int16_t *)(hle->mp3_buffer() + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF; addptr += 2; offset++; - v4 += ((int) * (int16_t *)(hle->mp3_buffer() + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF; - v4 += ((int) * (int16_t *)(hle->mp3_buffer() + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF; + v4 += ((int)*(int16_t *)(hle->mp3_buffer() + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF; + v4 += ((int)*(int16_t *)(hle->mp3_buffer() + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF; addptr += 2; offset++; } @@ -607,12 +604,12 @@ static void InnerLoop(CHle * hle, uint32_t outPtr, uint32_t inPtr, uint32_t t6, mult4 = *(int32_t *)(hle->mp3_buffer() + 0xCEC); if (t4 & 0x2) { - v2 = (v2 **(uint32_t *)(hle->mp3_buffer() + 0xCE8)) >> 0x10; + v2 = (v2 * *(uint32_t *)(hle->mp3_buffer() + 0xCE8)) >> 0x10; *(int16_t *)(hle->mp3_buffer() + (outPtr ^ S16)) = v2; } else { - v4 = (v4 **(uint32_t *)(hle->mp3_buffer() + 0xCE8)) >> 0x10; + v4 = (v4 * *(uint32_t *)(hle->mp3_buffer() + 0xCE8)) >> 0x10; *(int16_t *)(hle->mp3_buffer() + (outPtr ^ S16)) = v4; mult4 = *(uint32_t *)(hle->mp3_buffer() + 0xCE8); } @@ -628,24 +625,24 @@ static void InnerLoop(CHle * hle, uint32_t outPtr, uint32_t inPtr, uint32_t t6, for (i = 0; i < 4; i++) { - v2 += ((int) * (int16_t *)(hle->mp3_buffer() + (addptr) + 0x20) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF; - v2 -= ((int) * (int16_t *)(hle->mp3_buffer() + ((addptr + 2)) + 0x20) * (short)DeWindowLUT[offset + 0x01] + 0x4000) >> 0xF; - v4 += ((int) * (int16_t *)(hle->mp3_buffer() + (addptr) + 0x30) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF; - v4 -= ((int) * (int16_t *)(hle->mp3_buffer() + ((addptr + 2)) + 0x30) * (short)DeWindowLUT[offset + 0x09] + 0x4000) >> 0xF; - v6 += ((int) * (int16_t *)(hle->mp3_buffer() + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x20] + 0x4000) >> 0xF; - v6 -= ((int) * (int16_t *)(hle->mp3_buffer() + ((addptr + 2)) + 0x00) * (short)DeWindowLUT[offset + 0x21] + 0x4000) >> 0xF; - v8 += ((int) * (int16_t *)(hle->mp3_buffer() + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x28] + 0x4000) >> 0xF; - v8 -= ((int) * (int16_t *)(hle->mp3_buffer() + ((addptr + 2)) + 0x10) * (short)DeWindowLUT[offset + 0x29] + 0x4000) >> 0xF; + v2 += ((int)*(int16_t *)(hle->mp3_buffer() + (addptr) + 0x20) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF; + v2 -= ((int)*(int16_t *)(hle->mp3_buffer() + ((addptr + 2)) + 0x20) * (short)DeWindowLUT[offset + 0x01] + 0x4000) >> 0xF; + v4 += ((int)*(int16_t *)(hle->mp3_buffer() + (addptr) + 0x30) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF; + v4 -= ((int)*(int16_t *)(hle->mp3_buffer() + ((addptr + 2)) + 0x30) * (short)DeWindowLUT[offset + 0x09] + 0x4000) >> 0xF; + v6 += ((int)*(int16_t *)(hle->mp3_buffer() + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x20] + 0x4000) >> 0xF; + v6 -= ((int)*(int16_t *)(hle->mp3_buffer() + ((addptr + 2)) + 0x00) * (short)DeWindowLUT[offset + 0x21] + 0x4000) >> 0xF; + v8 += ((int)*(int16_t *)(hle->mp3_buffer() + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x28] + 0x4000) >> 0xF; + v8 -= ((int)*(int16_t *)(hle->mp3_buffer() + ((addptr + 2)) + 0x10) * (short)DeWindowLUT[offset + 0x29] + 0x4000) >> 0xF; addptr += 4; offset += 2; } - v0 = v2 + v4; + v0 = v2 + v4; v18 = v6 + v8; // Clamp(v0); // Clamp(v18); // Clamp? - *(int16_t *)(hle->mp3_buffer() + ((outPtr + 2)^S16)) = v0; - *(int16_t *)(hle->mp3_buffer() + ((outPtr + 4)^S16)) = v18; + *(int16_t *)(hle->mp3_buffer() + ((outPtr + 2) ^ S16)) = v0; + *(int16_t *)(hle->mp3_buffer() + ((outPtr + 4) ^ S16)) = v18; outPtr += 4; addptr -= 0x50; } @@ -659,20 +656,20 @@ static void InnerLoop(CHle * hle, uint32_t outPtr, uint32_t inPtr, uint32_t t6, for (i = 0; i < 8; i++) { // v0 - vt = (*(int16_t *)(hle->mp3_buffer() + ((tmp - 0x40)^S16)) * hi0); - *(int16_t *)((uint8_t *)hle->mp3_buffer() + ((tmp - 0x40)^S16)) = clamp_s16(vt); + vt = (*(int16_t *)(hle->mp3_buffer() + ((tmp - 0x40) ^ S16)) * hi0); + *(int16_t *)((uint8_t *)hle->mp3_buffer() + ((tmp - 0x40) ^ S16)) = clamp_s16(vt); // v17 - vt = (*(int16_t *)(hle->mp3_buffer() + ((tmp - 0x30)^S16)) * hi0); - *(int16_t *)((uint8_t *)hle->mp3_buffer() + ((tmp - 0x30)^S16)) = clamp_s16(vt); + vt = (*(int16_t *)(hle->mp3_buffer() + ((tmp - 0x30) ^ S16)) * hi0); + *(int16_t *)((uint8_t *)hle->mp3_buffer() + ((tmp - 0x30) ^ S16)) = clamp_s16(vt); // v2 - vt = (*(int16_t *)(hle->mp3_buffer() + ((tmp - 0x1E)^S16)) * hi1); - *(int16_t *)((uint8_t *)hle->mp3_buffer() + ((tmp - 0x1E)^S16)) = clamp_s16(vt); + vt = (*(int16_t *)(hle->mp3_buffer() + ((tmp - 0x1E) ^ S16)) * hi1); + *(int16_t *)((uint8_t *)hle->mp3_buffer() + ((tmp - 0x1E) ^ S16)) = clamp_s16(vt); // v4 - vt = (*(int16_t *)(hle->mp3_buffer() + ((tmp - 0xE)^S16)) * hi1); - *(int16_t *)((uint8_t *)hle->mp3_buffer() + ((tmp - 0xE)^S16)) = clamp_s16(vt); + vt = (*(int16_t *)(hle->mp3_buffer() + ((tmp - 0xE) ^ S16)) * hi1); + *(int16_t *)((uint8_t *)hle->mp3_buffer() + ((tmp - 0xE) ^ S16)) = clamp_s16(vt); tmp += 2; } diff --git a/Source/Android/PluginRSP/musyx.cpp b/Source/Project64-rsp-core/Hle/musyx.cpp similarity index 61% rename from Source/Android/PluginRSP/musyx.cpp rename to Source/Project64-rsp-core/Hle/musyx.cpp index e78488b85..bf9207637 100644 --- a/Source/Android/PluginRSP/musyx.cpp +++ b/Source/Project64-rsp-core/Hle/musyx.cpp @@ -4,7 +4,7 @@ // Copyright(C) 2013 Bobby Smiles // GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html -#include "stdafx.h" +#include #include #include "arithmetics.h" @@ -13,86 +13,95 @@ // Various constants -enum { SUBFRAME_SIZE = 192 }; -enum { MAX_VOICES = 32 }; - -enum { SAMPLE_BUFFER_SIZE = 0x200 }; +enum +{ + SUBFRAME_SIZE = 192 +}; +enum +{ + MAX_VOICES = 32 +}; enum { - SFD_SFX_INDEX = 0x2, - SFD_VOICE_BITMASK = 0x4, - SFD_STATE_PTR = 0x8, - SFD_SFX_PTR = 0xc, - SFD_VOICES = 0x10, + SAMPLE_BUFFER_SIZE = 0x200 +}; + +enum +{ + SFD_SFX_INDEX = 0x2, + SFD_VOICE_BITMASK = 0x4, + SFD_STATE_PTR = 0x8, + SFD_SFX_PTR = 0xc, + SFD_VOICES = 0x10, // v2 only - SFD2_10_PTR = 0x10, - SFD2_14_BITMASK = 0x14, - SFD2_15_BITMASK = 0x15, - SFD2_16_BITMASK = 0x16, - SFD2_18_PTR = 0x18, - SFD2_1C_PTR = 0x1c, - SFD2_20_PTR = 0x20, - SFD2_24_PTR = 0x24, - SFD2_VOICES = 0x28 + SFD2_10_PTR = 0x10, + SFD2_14_BITMASK = 0x14, + SFD2_15_BITMASK = 0x15, + SFD2_16_BITMASK = 0x16, + SFD2_18_PTR = 0x18, + SFD2_1C_PTR = 0x1c, + SFD2_20_PTR = 0x20, + SFD2_24_PTR = 0x24, + SFD2_VOICES = 0x28 }; enum { - VOICE_ENV_BEGIN = 0x00, - VOICE_ENV_STEP = 0x10, - VOICE_PITCH_Q16 = 0x20, - VOICE_PITCH_SHIFT = 0x22, - VOICE_CATSRC_0 = 0x24, - VOICE_CATSRC_1 = 0x30, - VOICE_ADPCM_FRAMES = 0x3c, - VOICE_SKIP_SAMPLES = 0x3e, + VOICE_ENV_BEGIN = 0x00, + VOICE_ENV_STEP = 0x10, + VOICE_PITCH_Q16 = 0x20, + VOICE_PITCH_SHIFT = 0x22, + VOICE_CATSRC_0 = 0x24, + VOICE_CATSRC_1 = 0x30, + VOICE_ADPCM_FRAMES = 0x3c, + VOICE_SKIP_SAMPLES = 0x3e, // For PCM16 - VOICE_U16_40 = 0x40, - VOICE_U16_42 = 0x42, + VOICE_U16_40 = 0x40, + VOICE_U16_42 = 0x42, // For ADPCM - VOICE_ADPCM_TABLE_PTR = 0x40, + VOICE_ADPCM_TABLE_PTR = 0x40, - VOICE_INTERLEAVED_PTR = 0x44, - VOICE_END_POINT = 0x48, - VOICE_RESTART_POINT = 0x4a, - VOICE_U16_4E = 0x4e, + VOICE_INTERLEAVED_PTR = 0x44, + VOICE_END_POINT = 0x48, + VOICE_RESTART_POINT = 0x4a, + VOICE_U16_4E = 0x4e, - VOICE_SIZE = 0x50 + VOICE_SIZE = 0x50 }; enum { - CATSRC_PTR1 = 0x00, - CATSRC_PTR2 = 0x04, - CATSRC_SIZE1 = 0x08, - CATSRC_SIZE2 = 0x0a + CATSRC_PTR1 = 0x00, + CATSRC_PTR2 = 0x04, + CATSRC_SIZE1 = 0x08, + CATSRC_SIZE2 = 0x0a }; enum { - STATE_LAST_SAMPLE = 0x0, - STATE_BASE_VOL = 0x100, - STATE_CC0 = 0x110, - STATE_740_LAST4_V1 = 0x290, + STATE_LAST_SAMPLE = 0x0, + STATE_BASE_VOL = 0x100, + STATE_CC0 = 0x110, + STATE_740_LAST4_V1 = 0x290, - STATE_740_LAST4_V2 = 0x110 + STATE_740_LAST4_V2 = 0x110 }; enum { - SFX_CBUFFER_PTR = 0x00, - SFX_CBUFFER_LENGTH = 0x04, - SFX_TAP_COUNT = 0x08, - SFX_FIR4_HGAIN = 0x0a, - SFX_TAP_DELAYS = 0x0c, - SFX_TAP_GAINS = 0x2c, - SFX_U16_3C = 0x3c, - SFX_U16_3E = 0x3e, - SFX_FIR4_HCOEFFS = 0x40 + SFX_CBUFFER_PTR = 0x00, + SFX_CBUFFER_LENGTH = 0x04, + SFX_TAP_COUNT = 0x08, + SFX_FIR4_HGAIN = 0x0a, + SFX_TAP_DELAYS = 0x0c, + SFX_TAP_GAINS = 0x2c, + SFX_U16_3C = 0x3c, + SFX_U16_3E = 0x3e, + SFX_FIR4_HCOEFFS = 0x40 }; // Struct definition @@ -112,38 +121,38 @@ typedef struct int16_t subframe_740_last4[4]; } musyx_t; -typedef void (*mix_sfx_with_main_subframes_t)(musyx_t *musyx, const int16_t *subframe, const uint16_t* gains); +typedef void (*mix_sfx_with_main_subframes_t)(musyx_t * musyx, const int16_t * subframe, const uint16_t * gains); // Helper functions prototypes -static void load_base_vol(CHle * hle, int32_t *base_vol, uint32_t address); -static void save_base_vol(CHle * hle, const int32_t *base_vol, uint32_t address); -static void update_base_vol(CHle * hle, int32_t *base_vol, uint32_t voice_mask, uint32_t last_sample_ptr, uint8_t mask_15, uint32_t ptr_24); -static void init_subframes_v1(musyx_t *musyx); -static void init_subframes_v2(musyx_t *musyx); +static void load_base_vol(CHle * hle, int32_t * base_vol, uint32_t address); +static void save_base_vol(CHle * hle, const int32_t * base_vol, uint32_t address); +static void update_base_vol(CHle * hle, int32_t * base_vol, uint32_t voice_mask, uint32_t last_sample_ptr, uint8_t mask_15, uint32_t ptr_24); +static void init_subframes_v1(musyx_t * musyx); +static void init_subframes_v2(musyx_t * musyx); -static uint32_t voice_stage(CHle * hle, musyx_t *musyx, uint32_t voice_ptr, uint32_t last_sample_ptr); -static void dma_cat8(CHle * hle, uint8_t *dst, uint32_t catsrc_ptr); -static void dma_cat16(CHle * hle, uint16_t *dst, uint32_t catsrc_ptr); -static void sfx_stage(CHle * hle, mix_sfx_with_main_subframes_t mix_sfx_with_main_subframes, musyx_t *musyx, uint32_t sfx_ptr, uint16_t idx); -static void load_samples_PCM16(CHle * hle, uint32_t voice_ptr, int16_t *samples, unsigned *segbase, unsigned *offset); -static void load_samples_ADPCM(CHle * hle, uint32_t voice_ptr, int16_t *samples, unsigned *segbase, unsigned *offset); -static void mix_voice_samples(CHle * hle, musyx_t *musyx, uint32_t voice_ptr, const int16_t *samples, unsigned segbase, unsigned offset, uint32_t last_sample_ptr); -static void adpcm_decode_frames(CHle * hle, int16_t *dst, const uint8_t *src, const int16_t *table, uint8_t count, uint8_t skip_samples); -static void adpcm_predict_frame(int16_t *dst, const uint8_t *src, const uint8_t *nibbles, unsigned int rshift); +static uint32_t voice_stage(CHle * hle, musyx_t * musyx, uint32_t voice_ptr, uint32_t last_sample_ptr); +static void dma_cat8(CHle * hle, uint8_t * dst, uint32_t catsrc_ptr); +static void dma_cat16(CHle * hle, uint16_t * dst, uint32_t catsrc_ptr); +static void sfx_stage(CHle * hle, mix_sfx_with_main_subframes_t mix_sfx_with_main_subframes, musyx_t * musyx, uint32_t sfx_ptr, uint16_t idx); +static void load_samples_PCM16(CHle * hle, uint32_t voice_ptr, int16_t * samples, unsigned * segbase, unsigned * offset); +static void load_samples_ADPCM(CHle * hle, uint32_t voice_ptr, int16_t * samples, unsigned * segbase, unsigned * offset); +static void mix_voice_samples(CHle * hle, musyx_t * musyx, uint32_t voice_ptr, const int16_t * samples, unsigned segbase, unsigned offset, uint32_t last_sample_ptr); +static void adpcm_decode_frames(CHle * hle, int16_t * dst, const uint8_t * src, const int16_t * table, uint8_t count, uint8_t skip_samples); +static void adpcm_predict_frame(int16_t * dst, const uint8_t * src, const uint8_t * nibbles, unsigned int rshift); -static void mix_sfx_with_main_subframes_v1(musyx_t *musyx, const int16_t *subframe, const uint16_t* gains); -static void mix_sfx_with_main_subframes_v2(musyx_t *musyx, const int16_t *subframe, const uint16_t* gains); +static void mix_sfx_with_main_subframes_v1(musyx_t * musyx, const int16_t * subframe, const uint16_t * gains); +static void mix_sfx_with_main_subframes_v2(musyx_t * musyx, const int16_t * subframe, const uint16_t * gains); -static void mix_samples(int16_t *y, int16_t x, int16_t hgain); -static void mix_subframes(int16_t *y, const int16_t *x, int16_t hgain); -static void mix_fir4(int16_t *y, const int16_t *x, int16_t hgain, const int16_t *hcoeffs); +static void mix_samples(int16_t * y, int16_t x, int16_t hgain); +static void mix_subframes(int16_t * y, const int16_t * x, int16_t hgain); +static void mix_fir4(int16_t * y, const int16_t * x, int16_t hgain, const int16_t * hcoeffs); -static void interleave_stage_v1(CHle * hle, musyx_t *musyx, uint32_t output_ptr); +static void interleave_stage_v1(CHle * hle, musyx_t * musyx, uint32_t output_ptr); -static void interleave_stage_v2(CHle * hle, musyx_t *musyx, uint16_t mask_16, uint32_t ptr_18, uint32_t ptr_1c, uint32_t output_ptr); +static void interleave_stage_v2(CHle * hle, musyx_t * musyx, uint16_t mask_16, uint32_t ptr_18, uint32_t ptr_1c, uint32_t output_ptr); -static int32_t dot4(const int16_t *x, const int16_t *y) +static int32_t dot4(const int16_t * x, const int16_t * y) { int32_t accu = 0; @@ -158,12 +167,12 @@ static int32_t dot4(const int16_t *x, const int16_t *y) void musyx_v1_task(CHle * hle) { - uint32_t sfd_ptr = *dmem_u32(hle, TASK_DATA_PTR); + uint32_t sfd_ptr = *dmem_u32(hle, TASK_DATA_PTR); uint32_t sfd_count = *dmem_u32(hle, TASK_DATA_SIZE); uint32_t state_ptr; musyx_t musyx; - hle->VerboseMessage("musyx_v1_task: *data=%x, #SF=%d", sfd_ptr,sfd_count); + hle->VerboseMessage("musyx_v1_task: *data=%x, #SF=%d", sfd_ptr, sfd_count); state_ptr = *dram_u32(hle, sfd_ptr + SFD_STATE_PTR); @@ -175,10 +184,10 @@ void musyx_v1_task(CHle * hle) for (;;) { // Parse SFD structure - uint16_t sfx_index = *dram_u16(hle, sfd_ptr + SFD_SFX_INDEX); - uint32_t voice_mask = *dram_u32(hle, sfd_ptr + SFD_VOICE_BITMASK); - uint32_t sfx_ptr = *dram_u32(hle, sfd_ptr + SFD_SFX_PTR); - uint32_t voice_ptr = sfd_ptr + SFD_VOICES; + uint16_t sfx_index = *dram_u16(hle, sfd_ptr + SFD_SFX_INDEX); + uint32_t voice_mask = *dram_u32(hle, sfd_ptr + SFD_VOICE_BITMASK); + uint32_t sfx_ptr = *dram_u32(hle, sfd_ptr + SFD_SFX_PTR); + uint32_t voice_ptr = sfd_ptr + SFD_VOICES; uint32_t last_sample_ptr = state_ptr + STATE_LAST_SAMPLE; uint32_t output_ptr; @@ -215,7 +224,7 @@ void musyx_v1_task(CHle * hle) void musyx_v2_task(CHle * hle) { - uint32_t sfd_ptr = *dmem_u32(hle, TASK_DATA_PTR); + uint32_t sfd_ptr = *dmem_u32(hle, TASK_DATA_PTR); uint32_t sfd_count = *dmem_u32(hle, TASK_DATA_SIZE); musyx_t musyx; @@ -224,20 +233,20 @@ void musyx_v2_task(CHle * hle) for (;;) { // Parse SFD structure - uint16_t sfx_index = *dram_u16(hle, sfd_ptr + SFD_SFX_INDEX); - uint32_t voice_mask = *dram_u32(hle, sfd_ptr + SFD_VOICE_BITMASK); - uint32_t state_ptr = *dram_u32(hle, sfd_ptr + SFD_STATE_PTR); - uint32_t sfx_ptr = *dram_u32(hle, sfd_ptr + SFD_SFX_PTR); - uint32_t voice_ptr = sfd_ptr + SFD2_VOICES; + uint16_t sfx_index = *dram_u16(hle, sfd_ptr + SFD_SFX_INDEX); + uint32_t voice_mask = *dram_u32(hle, sfd_ptr + SFD_VOICE_BITMASK); + uint32_t state_ptr = *dram_u32(hle, sfd_ptr + SFD_STATE_PTR); + uint32_t sfx_ptr = *dram_u32(hle, sfd_ptr + SFD_SFX_PTR); + uint32_t voice_ptr = sfd_ptr + SFD2_VOICES; - uint32_t ptr_10 = *dram_u32(hle, sfd_ptr + SFD2_10_PTR); - uint8_t mask_14 = *dram_u8 (hle, sfd_ptr + SFD2_14_BITMASK); - uint8_t mask_15 = *dram_u8 (hle, sfd_ptr + SFD2_15_BITMASK); - uint16_t mask_16 = *dram_u16(hle, sfd_ptr + SFD2_16_BITMASK); - uint32_t ptr_18 = *dram_u32(hle, sfd_ptr + SFD2_18_PTR); - uint32_t ptr_1c = *dram_u32(hle, sfd_ptr + SFD2_1C_PTR); - uint32_t ptr_20 = *dram_u32(hle, sfd_ptr + SFD2_20_PTR); - uint32_t ptr_24 = *dram_u32(hle, sfd_ptr + SFD2_24_PTR); + uint32_t ptr_10 = *dram_u32(hle, sfd_ptr + SFD2_10_PTR); + uint8_t mask_14 = *dram_u8(hle, sfd_ptr + SFD2_14_BITMASK); + uint8_t mask_15 = *dram_u8(hle, sfd_ptr + SFD2_15_BITMASK); + uint16_t mask_16 = *dram_u16(hle, sfd_ptr + SFD2_16_BITMASK); + uint32_t ptr_18 = *dram_u32(hle, sfd_ptr + SFD2_18_PTR); + uint32_t ptr_1c = *dram_u32(hle, sfd_ptr + SFD2_1C_PTR); + uint32_t ptr_20 = *dram_u32(hle, sfd_ptr + SFD2_20_PTR); + uint32_t ptr_24 = *dram_u32(hle, sfd_ptr + SFD2_24_PTR); uint32_t last_sample_ptr = state_ptr + STATE_LAST_SAMPLE; uint32_t output_ptr; @@ -261,13 +270,13 @@ void musyx_v2_task(CHle * hle) // Apply delay-based effects (optional) sfx_stage(hle, mix_sfx_with_main_subframes_v2, &musyx, sfx_ptr, sfx_index); - dram_store_u16(hle, (uint16_t*)musyx.left, output_ptr , SUBFRAME_SIZE); - dram_store_u16(hle, (uint16_t*)musyx.right, output_ptr + 2*SUBFRAME_SIZE, SUBFRAME_SIZE); - dram_store_u16(hle, (uint16_t*)musyx.cc0, output_ptr + 4*SUBFRAME_SIZE, SUBFRAME_SIZE); + dram_store_u16(hle, (uint16_t *)musyx.left, output_ptr, SUBFRAME_SIZE); + dram_store_u16(hle, (uint16_t *)musyx.right, output_ptr + 2 * SUBFRAME_SIZE, SUBFRAME_SIZE); + dram_store_u16(hle, (uint16_t *)musyx.cc0, output_ptr + 4 * SUBFRAME_SIZE, SUBFRAME_SIZE); // Store state save_base_vol(hle, musyx.base_vol, state_ptr + STATE_BASE_VOL); - dram_store_u16(hle, (uint16_t*)musyx.subframe_740_last4, state_ptr + STATE_740_LAST4_V2, 4); + dram_store_u16(hle, (uint16_t *)musyx.subframe_740_last4, state_ptr + STATE_740_LAST4_V2, 4); if (mask_16) { @@ -284,15 +293,15 @@ void musyx_v2_task(CHle * hle) } } -static void load_base_vol(CHle * hle, int32_t *base_vol, uint32_t address) +static void load_base_vol(CHle * hle, int32_t * base_vol, uint32_t address) { - base_vol[0] = ((uint32_t)(*dram_u16(hle, address)) << 16) | (*dram_u16(hle, address + 8)); + base_vol[0] = ((uint32_t)(*dram_u16(hle, address)) << 16) | (*dram_u16(hle, address + 8)); base_vol[1] = ((uint32_t)(*dram_u16(hle, address + 2)) << 16) | (*dram_u16(hle, address + 10)); base_vol[2] = ((uint32_t)(*dram_u16(hle, address + 4)) << 16) | (*dram_u16(hle, address + 12)); base_vol[3] = ((uint32_t)(*dram_u16(hle, address + 6)) << 16) | (*dram_u16(hle, address + 14)); } -static void save_base_vol(CHle * hle, const int32_t *base_vol, uint32_t address) +static void save_base_vol(CHle * hle, const int32_t * base_vol, uint32_t address) { unsigned k; @@ -309,7 +318,7 @@ static void save_base_vol(CHle * hle, const int32_t *base_vol, uint32_t address) } } -static void update_base_vol(CHle * hle, int32_t *base_vol, +static void update_base_vol(CHle * hle, int32_t * base_vol, uint32_t voice_mask, uint32_t last_sample_ptr, uint8_t mask_15, uint32_t ptr_24) { @@ -339,14 +348,14 @@ static void update_base_vol(CHle * hle, int32_t *base_vol, // Optimization: skip contributions entirely if mask_15 is empty if (mask_15 != 0) { - for(i = 0, mask = 1; i < 4; ++i, mask <<= 1, ptr_24 += 8) + for (i = 0, mask = 1; i < 4; ++i, mask <<= 1, ptr_24 += 8) { if ((mask_15 & mask) == 0) { continue; } - for(k = 0; k < 4; ++k) + for (k = 0; k < 4; ++k) { base_vol[k] += (int16_t)*dram_u16(hle, ptr_24 + k * 2); } @@ -361,34 +370,34 @@ static void update_base_vol(CHle * hle, int32_t *base_vol, hle->VerboseMessage("AFTER: base_vol = %08x %08x %08x %08x", base_vol[0], base_vol[1], base_vol[2], base_vol[3]); } -static void init_subframes_v1(musyx_t *musyx) +static void init_subframes_v1(musyx_t * musyx) { unsigned i; int16_t base_cc0 = clamp_s16(musyx->base_vol[2]); int16_t base_e50 = clamp_s16(musyx->base_vol[3]); - int16_t *left = musyx->left; - int16_t *right = musyx->right; - int16_t *cc0 = musyx->cc0; - int16_t *e50 = musyx->e50; + int16_t * left = musyx->left; + int16_t * right = musyx->right; + int16_t * cc0 = musyx->cc0; + int16_t * e50 = musyx->e50; for (i = 0; i < SUBFRAME_SIZE; ++i) { - *(e50++) = base_e50; - *(left++) = clamp_s16(*cc0 + base_cc0); - *(right++) = clamp_s16(-*cc0 - base_cc0); - *(cc0++) = 0; + *(e50++) = base_e50; + *(left++) = clamp_s16(*cc0 + base_cc0); + *(right++) = clamp_s16(-*cc0 - base_cc0); + *(cc0++) = 0; } } -static void init_subframes_v2(musyx_t *musyx) +static void init_subframes_v2(musyx_t * musyx) { - unsigned i,k; + unsigned i, k; int16_t values[4]; - int16_t* subframes[4]; + int16_t * subframes[4]; - for(k = 0; k < 4; ++k) + for (k = 0; k < 4; ++k) { values[k] = clamp_s16(musyx->base_vol[k]); } @@ -400,7 +409,7 @@ static void init_subframes_v2(musyx_t *musyx) for (i = 0; i < SUBFRAME_SIZE; ++i) { - for(k = 0; k < 4; ++k) + for (k = 0; k < 4; ++k) { *(subframes[k]++) = values[k]; } @@ -409,7 +418,7 @@ static void init_subframes_v2(musyx_t *musyx) // Process voices, and returns interleaved sub-frame destination address -static uint32_t voice_stage(CHle * hle, musyx_t *musyx, uint32_t voice_ptr, uint32_t last_sample_ptr) +static uint32_t voice_stage(CHle * hle, musyx_t * musyx, uint32_t voice_ptr, uint32_t last_sample_ptr) { uint32_t output_ptr; int i = 0; @@ -460,10 +469,10 @@ static uint32_t voice_stage(CHle * hle, musyx_t *musyx, uint32_t voice_ptr, uint return output_ptr; } -static void dma_cat8(CHle * hle, uint8_t *dst, uint32_t catsrc_ptr) +static void dma_cat8(CHle * hle, uint8_t * dst, uint32_t catsrc_ptr) { - uint32_t ptr1 = *dram_u32(hle, catsrc_ptr + CATSRC_PTR1); - uint32_t ptr2 = *dram_u32(hle, catsrc_ptr + CATSRC_PTR2); + uint32_t ptr1 = *dram_u32(hle, catsrc_ptr + CATSRC_PTR1); + uint32_t ptr2 = *dram_u32(hle, catsrc_ptr + CATSRC_PTR2); uint16_t size1 = *dram_u16(hle, catsrc_ptr + CATSRC_SIZE1); uint16_t size2 = *dram_u16(hle, catsrc_ptr + CATSRC_SIZE2); @@ -482,10 +491,10 @@ static void dma_cat8(CHle * hle, uint8_t *dst, uint32_t catsrc_ptr) dram_load_u8(hle, dst + count1, ptr2, count2); } -static void dma_cat16(CHle * hle, uint16_t *dst, uint32_t catsrc_ptr) +static void dma_cat16(CHle * hle, uint16_t * dst, uint32_t catsrc_ptr) { - uint32_t ptr1 = *dram_u32(hle, catsrc_ptr + CATSRC_PTR1); - uint32_t ptr2 = *dram_u32(hle, catsrc_ptr + CATSRC_PTR2); + uint32_t ptr1 = *dram_u32(hle, catsrc_ptr + CATSRC_PTR1); + uint32_t ptr2 = *dram_u32(hle, catsrc_ptr + CATSRC_PTR2); uint16_t size1 = *dram_u16(hle, catsrc_ptr + CATSRC_SIZE1); uint16_t size2 = *dram_u16(hle, catsrc_ptr + CATSRC_SIZE2); @@ -503,9 +512,9 @@ static void dma_cat16(CHle * hle, uint16_t *dst, uint32_t catsrc_ptr) dram_load_u16(hle, dst + count1, ptr2, count2); } -static void load_samples_PCM16(CHle * hle, uint32_t voice_ptr, int16_t *samples, unsigned *segbase, unsigned *offset) +static void load_samples_PCM16(CHle * hle, uint32_t voice_ptr, int16_t * samples, unsigned * segbase, unsigned * offset) { - uint8_t u8_3e = *dram_u8(hle, voice_ptr + VOICE_SKIP_SAMPLES); + uint8_t u8_3e = *dram_u8(hle, voice_ptr + VOICE_SKIP_SAMPLES); uint16_t u16_40 = *dram_u16(hle, voice_ptr + VOICE_U16_40); uint16_t u16_42 = *dram_u16(hle, voice_ptr + VOICE_U16_42); @@ -514,7 +523,7 @@ static void load_samples_PCM16(CHle * hle, uint32_t voice_ptr, int16_t *samples, hle->VerboseMessage("Format: PCM16"); *segbase = SAMPLE_BUFFER_SIZE - count; - *offset = u8_3e; + *offset = u8_3e; dma_cat16(hle, (uint16_t *)samples + *segbase, voice_ptr + VOICE_CATSRC_0); @@ -524,16 +533,16 @@ static void load_samples_PCM16(CHle * hle, uint32_t voice_ptr, int16_t *samples, } } -static void load_samples_ADPCM(CHle * hle, uint32_t voice_ptr, int16_t *samples, unsigned *segbase, unsigned *offset) +static void load_samples_ADPCM(CHle * hle, uint32_t voice_ptr, int16_t * samples, unsigned * segbase, unsigned * offset) { // Decompressed samples cannot exceed 0x400 bytes // ADPCM has a compression ratio of 5/16 uint8_t buffer[SAMPLE_BUFFER_SIZE * 2 * 5 / 16]; int16_t adpcm_table[128]; - uint8_t u8_3c = *dram_u8(hle, voice_ptr + VOICE_ADPCM_FRAMES ); + uint8_t u8_3c = *dram_u8(hle, voice_ptr + VOICE_ADPCM_FRAMES); uint8_t u8_3d = *dram_u8(hle, voice_ptr + VOICE_ADPCM_FRAMES + 1); - uint8_t u8_3e = *dram_u8(hle, voice_ptr + VOICE_SKIP_SAMPLES ); + uint8_t u8_3e = *dram_u8(hle, voice_ptr + VOICE_SKIP_SAMPLES); uint8_t u8_3f = *dram_u8(hle, voice_ptr + VOICE_SKIP_SAMPLES + 1); uint32_t adpcm_table_ptr = *dram_u32(hle, voice_ptr + VOICE_ADPCM_TABLE_PTR); unsigned count; @@ -546,7 +555,7 @@ static void load_samples_ADPCM(CHle * hle, uint32_t voice_ptr, int16_t *samples, count = u8_3c << 5; *segbase = SAMPLE_BUFFER_SIZE - count; - *offset = u8_3e & 0x1f; + *offset = u8_3e & 0x1f; dma_cat8(hle, buffer, voice_ptr + VOICE_CATSRC_0); adpcm_decode_frames(hle, samples + *segbase, buffer, adpcm_table, u8_3c, u8_3e); @@ -558,10 +567,10 @@ static void load_samples_ADPCM(CHle * hle, uint32_t voice_ptr, int16_t *samples, } } -static void adpcm_decode_frames(CHle * hle, int16_t *dst, const uint8_t *src, const int16_t *table, uint8_t count, uint8_t skip_samples) +static void adpcm_decode_frames(CHle * hle, int16_t * dst, const uint8_t * src, const int16_t * table, uint8_t count, uint8_t skip_samples) { int16_t frame[32]; - const uint8_t *nibbles = src + 8; + const uint8_t * nibbles = src + 8; unsigned i; bool jump_gap = false; @@ -578,14 +587,14 @@ static void adpcm_decode_frames(CHle * hle, int16_t *dst, const uint8_t *src, co { uint8_t c2 = nibbles[0]; - const int16_t *book = (c2 & 0xf0) + table; + const int16_t * book = (c2 & 0xf0) + table; unsigned int rshift = (c2 & 0x0f); adpcm_predict_frame(frame, src, nibbles, rshift); memcpy(dst, frame, 2 * sizeof(frame[0])); - adpcm_compute_residuals(dst + 2, frame + 2, book, dst , 6); - adpcm_compute_residuals(dst + 8, frame + 8, book, dst + 6, 8); + adpcm_compute_residuals(dst + 2, frame + 2, book, dst, 6); + adpcm_compute_residuals(dst + 8, frame + 8, book, dst + 6, 8); adpcm_compute_residuals(dst + 16, frame + 16, book, dst + 14, 8); adpcm_compute_residuals(dst + 24, frame + 24, book, dst + 22, 8); @@ -602,7 +611,7 @@ static void adpcm_decode_frames(CHle * hle, int16_t *dst, const uint8_t *src, co } } -static void adpcm_predict_frame(int16_t *dst, const uint8_t *src, const uint8_t *nibbles, unsigned int rshift) +static void adpcm_predict_frame(int16_t * dst, const uint8_t * src, const uint8_t * nibbles, unsigned int rshift) { unsigned int i; @@ -613,52 +622,58 @@ static void adpcm_predict_frame(int16_t *dst, const uint8_t *src, const uint8_t { uint8_t byte = nibbles[i]; - *(dst++) = adpcm_predict_sample(byte, 0xf0, 8, rshift); + *(dst++) = adpcm_predict_sample(byte, 0xf0, 8, rshift); *(dst++) = adpcm_predict_sample(byte, 0x0f, 12, rshift); } } -static void mix_voice_samples(CHle * hle, musyx_t *musyx, uint32_t voice_ptr, const int16_t *samples, unsigned segbase, unsigned offset, uint32_t last_sample_ptr) +static void mix_voice_samples(CHle * hle, musyx_t * musyx, uint32_t voice_ptr, const int16_t * samples, unsigned segbase, unsigned offset, uint32_t last_sample_ptr) { int i, k; // Parse VOICE structure - const uint16_t pitch_q16 = *dram_u16(hle, voice_ptr + VOICE_PITCH_Q16); + const uint16_t pitch_q16 = *dram_u16(hle, voice_ptr + VOICE_PITCH_Q16); const uint16_t pitch_shift = *dram_u16(hle, voice_ptr + VOICE_PITCH_SHIFT); // Q4.12 - const uint16_t end_point = *dram_u16(hle, voice_ptr + VOICE_END_POINT); + const uint16_t end_point = *dram_u16(hle, voice_ptr + VOICE_END_POINT); const uint16_t restart_point = *dram_u16(hle, voice_ptr + VOICE_RESTART_POINT); const uint16_t u16_4e = *dram_u16(hle, voice_ptr + VOICE_U16_4E); // Initialize values and pointers - const int16_t *sample = samples + segbase + offset + u16_4e; - const int16_t *const sample_end = samples + segbase + end_point; - const int16_t *const sample_restart = samples + (restart_point & 0x7fff) + - (((restart_point & 0x8000) != 0) ? 0x000 : segbase); + const int16_t * sample = samples + segbase + offset + u16_4e; + const int16_t * const sample_end = samples + segbase + end_point; + const int16_t * const sample_restart = samples + (restart_point & 0x7fff) + + (((restart_point & 0x8000) != 0) ? 0x000 : segbase); uint32_t pitch_accu = pitch_q16; uint32_t pitch_step = pitch_shift << 4; - int32_t v4_env[4]; - int32_t v4_env_step[4]; - int16_t *v4_dst[4]; - int16_t v4[4]; + int32_t v4_env[4]; + int32_t v4_env_step[4]; + int16_t * v4_dst[4]; + int16_t v4[4]; - dram_load_u32(hle, (uint32_t *)v4_env, voice_ptr + VOICE_ENV_BEGIN, 4); - dram_load_u32(hle, (uint32_t *)v4_env_step, voice_ptr + VOICE_ENV_STEP, 4); + dram_load_u32(hle, (uint32_t *)v4_env, voice_ptr + VOICE_ENV_BEGIN, 4); + dram_load_u32(hle, (uint32_t *)v4_env_step, voice_ptr + VOICE_ENV_STEP, 4); v4_dst[0] = musyx->left; v4_dst[1] = musyx->right; v4_dst[2] = musyx->cc0; v4_dst[3] = musyx->e50; - hle->VerboseMessage("Voice debug: segbase=%d" "\tu16_4e=%04x\n" "\tpitch: frac0=%04x shift=%04x\n" "\tend_point=%04x restart_point=%04x\n" "\tenv = %08x %08x %08x %08x\n" "\tenv_step = %08x %08x %08x %08x\n", segbase, u16_4e, pitch_q16, pitch_shift, end_point, restart_point, v4_env[0], v4_env[1], v4_env[2], v4_env[3], v4_env_step[0], v4_env_step[1], v4_env_step[2], v4_env_step[3]); + hle->VerboseMessage("Voice debug: segbase=%d" + "\tu16_4e=%04x\n" + "\tpitch: frac0=%04x shift=%04x\n" + "\tend_point=%04x restart_point=%04x\n" + "\tenv = %08x %08x %08x %08x\n" + "\tenv_step = %08x %08x %08x %08x\n", + segbase, u16_4e, pitch_q16, pitch_shift, end_point, restart_point, v4_env[0], v4_env[1], v4_env[2], v4_env[3], v4_env_step[0], v4_env_step[1], v4_env_step[2], v4_env_step[3]); for (i = 0; i < SUBFRAME_SIZE; ++i) { // Update sample and LUT pointers and then pitch_accu - const int16_t *lut = (RESAMPLE_LUT + ((pitch_accu & 0xfc00) >> 8)); + const int16_t * lut = (RESAMPLE_LUT + ((pitch_accu & 0xfc00) >> 8)); int dist; int16_t v; @@ -695,12 +710,12 @@ static void mix_voice_samples(CHle * hle, musyx_t *musyx, uint32_t voice_ptr, co hle->VerboseMessage("last_sample = %04x %04x %04x %04x", v4[0], v4[1], v4[2], v4[3]); } -static void sfx_stage(CHle * hle, mix_sfx_with_main_subframes_t mix_sfx_with_main_subframes, musyx_t *musyx, uint32_t sfx_ptr, uint16_t idx) +static void sfx_stage(CHle * hle, mix_sfx_with_main_subframes_t mix_sfx_with_main_subframes, musyx_t * musyx, uint32_t sfx_ptr, uint16_t idx) { unsigned int i; int16_t buffer[SUBFRAME_SIZE + 4]; - int16_t *subframe = buffer + 4; + int16_t * subframe = buffer + 4; uint32_t tap_delays[8]; int16_t tap_gains[8]; @@ -725,23 +740,26 @@ static void sfx_stage(CHle * hle, mix_sfx_with_main_subframes_t mix_sfx_with_mai } // Load SFX parameters - cbuffer_ptr = *dram_u32(hle, sfx_ptr + SFX_CBUFFER_PTR); + cbuffer_ptr = *dram_u32(hle, sfx_ptr + SFX_CBUFFER_PTR); cbuffer_length = *dram_u32(hle, sfx_ptr + SFX_CBUFFER_LENGTH); - tap_count = *dram_u16(hle, sfx_ptr + SFX_TAP_COUNT); + tap_count = *dram_u16(hle, sfx_ptr + SFX_TAP_COUNT); dram_load_u32(hle, tap_delays, sfx_ptr + SFX_TAP_DELAYS, 8); - dram_load_u16(hle, (uint16_t *)tap_gains, sfx_ptr + SFX_TAP_GAINS, 8); + dram_load_u16(hle, (uint16_t *)tap_gains, sfx_ptr + SFX_TAP_GAINS, 8); - fir4_hgain = *dram_u16(hle, sfx_ptr + SFX_FIR4_HGAIN); + fir4_hgain = *dram_u16(hle, sfx_ptr + SFX_FIR4_HGAIN); dram_load_u16(hle, (uint16_t *)fir4_hcoeffs, sfx_ptr + SFX_FIR4_HCOEFFS, 4); - sfx_gains[0] = *dram_u16(hle, sfx_ptr + SFX_U16_3C); - sfx_gains[1] = *dram_u16(hle, sfx_ptr + SFX_U16_3E); + sfx_gains[0] = *dram_u16(hle, sfx_ptr + SFX_U16_3C); + sfx_gains[1] = *dram_u16(hle, sfx_ptr + SFX_U16_3E); hle->VerboseMessage("cbuffer: ptr=%08x length=%x", cbuffer_ptr, cbuffer_length); hle->VerboseMessage("fir4: hgain=%04x hcoeff=%04x %04x %04x %04x", fir4_hgain, fir4_hcoeffs[0], fir4_hcoeffs[1], fir4_hcoeffs[2], fir4_hcoeffs[3]); - hle->VerboseMessage("tap count=%d\n" "delays: %08x %08x %08x %08x %08x %08x %08x %08x\n" "gains: %04x %04x %04x %04x %04x %04x %04x %04x", tap_count, tap_delays[0], tap_delays[1], tap_delays[2], tap_delays[3], tap_delays[4], tap_delays[5], tap_delays[6], tap_delays[7], tap_gains[0], tap_gains[1], tap_gains[2], tap_gains[3], tap_gains[4], tap_gains[5], tap_gains[6], tap_gains[7]); + hle->VerboseMessage("tap count=%d\n" + "delays: %08x %08x %08x %08x %08x %08x %08x %08x\n" + "gains: %04x %04x %04x %04x %04x %04x %04x %04x", + tap_count, tap_delays[0], tap_delays[1], tap_delays[2], tap_delays[3], tap_delays[4], tap_delays[5], tap_delays[6], tap_delays[7], tap_gains[0], tap_gains[1], tap_gains[2], tap_gains[3], tap_gains[4], tap_gains[5], tap_gains[6], tap_gains[7]); hle->VerboseMessage("sfx_gains=%04x %04x", sfx_gains[0], sfx_gains[1]); // Mix up to 8 delayed sub-frames @@ -776,19 +794,19 @@ static void sfx_stage(CHle * hle, mix_sfx_with_main_subframes_t mix_sfx_with_mai dram_store_u16(hle, (uint16_t *)musyx->e50, cbuffer_ptr + pos * 2, SUBFRAME_SIZE); } -static void mix_sfx_with_main_subframes_v1(musyx_t *musyx, const int16_t *subframe, const uint16_t* UNUSED(gains)) +static void mix_sfx_with_main_subframes_v1(musyx_t * musyx, const int16_t * subframe, const uint16_t * UNUSED(gains)) { unsigned i; for (i = 0; i < SUBFRAME_SIZE; ++i) { int16_t v = subframe[i]; - musyx->left[i] = clamp_s16(musyx->left[i] + v); + musyx->left[i] = clamp_s16(musyx->left[i] + v); musyx->right[i] = clamp_s16(musyx->right[i] + v); } } -static void mix_sfx_with_main_subframes_v2(musyx_t *musyx, const int16_t *subframe, const uint16_t* gains) +static void mix_sfx_with_main_subframes_v2(musyx_t * musyx, const int16_t * subframe, const uint16_t * gains) { unsigned i; @@ -798,18 +816,18 @@ static void mix_sfx_with_main_subframes_v2(musyx_t *musyx, const int16_t *subfra int16_t v1 = (int32_t)(v * gains[0]) >> 16; int16_t v2 = (int32_t)(v * gains[1]) >> 16; - musyx->left[i] = clamp_s16(musyx->left[i] + v1); + musyx->left[i] = clamp_s16(musyx->left[i] + v1); musyx->right[i] = clamp_s16(musyx->right[i] + v1); - musyx->cc0[i] = clamp_s16(musyx->cc0[i] + v2); + musyx->cc0[i] = clamp_s16(musyx->cc0[i] + v2); } } -static void mix_samples(int16_t *y, int16_t x, int16_t hgain) +static void mix_samples(int16_t * y, int16_t x, int16_t hgain) { *y = clamp_s16(*y + ((x * hgain + 0x4000) >> 15)); } -static void mix_subframes(int16_t *y, const int16_t *x, int16_t hgain) +static void mix_subframes(int16_t * y, const int16_t * x, int16_t hgain) { for (unsigned int i = 0; i < SUBFRAME_SIZE; ++i) { @@ -817,7 +835,7 @@ static void mix_subframes(int16_t *y, const int16_t *x, int16_t hgain) } } -static void mix_fir4(int16_t *y, const int16_t *x, int16_t hgain, const int16_t *hcoeffs) +static void mix_fir4(int16_t * y, const int16_t * x, int16_t hgain, const int16_t * hcoeffs) { unsigned int i; int32_t h[4]; @@ -834,50 +852,50 @@ static void mix_fir4(int16_t *y, const int16_t *x, int16_t hgain, const int16_t } } -static void interleave_stage_v1(CHle * hle, musyx_t *musyx, uint32_t output_ptr) +static void interleave_stage_v1(CHle * hle, musyx_t * musyx, uint32_t output_ptr) { size_t i; int16_t base_left; int16_t base_right; - int16_t *left; - int16_t *right; - uint32_t *dst; + int16_t * left; + int16_t * right; + uint32_t * dst; hle->VerboseMessage("Interleave: %08x", output_ptr); - base_left = clamp_s16(musyx->base_vol[0]); + base_left = clamp_s16(musyx->base_vol[0]); base_right = clamp_s16(musyx->base_vol[1]); - left = musyx->left; + left = musyx->left; right = musyx->right; - dst = dram_u32(hle, output_ptr); + dst = dram_u32(hle, output_ptr); for (i = 0; i < SUBFRAME_SIZE; ++i) { - uint16_t l = clamp_s16(*(left++) + base_left); + uint16_t l = clamp_s16(*(left++) + base_left); uint16_t r = clamp_s16(*(right++) + base_right); *(dst++) = (l << 16) | r; } } -static void interleave_stage_v2(CHle * hle, musyx_t *musyx, uint16_t mask_16, uint32_t ptr_18, uint32_t ptr_1c, uint32_t output_ptr) +static void interleave_stage_v2(CHle * hle, musyx_t * musyx, uint16_t mask_16, uint32_t ptr_18, uint32_t ptr_1c, uint32_t output_ptr) { unsigned i, k; int16_t subframe[SUBFRAME_SIZE]; - uint32_t *dst; + uint32_t * dst; uint16_t mask; hle->VerboseMessage("mask_16=%04x ptr_18=%08x ptr_1c=%08x output_ptr=%08x", mask_16, ptr_18, ptr_1c, output_ptr); // Compute L_total, R_total and update sub-frame @ptr_1c - memset(subframe, 0, SUBFRAME_SIZE*sizeof(subframe[0])); + memset(subframe, 0, SUBFRAME_SIZE * sizeof(subframe[0])); - for(i = 0; i < SUBFRAME_SIZE; ++i) + for (i = 0; i < SUBFRAME_SIZE; ++i) { - int16_t v = *dram_u16(hle, ptr_1c + i*2); + int16_t v = *dram_u16(hle, ptr_1c + i * 2); musyx->left[i] = v; musyx->right[i] = clamp_s16(-v); } @@ -893,19 +911,19 @@ static void interleave_stage_v2(CHle * hle, musyx_t *musyx, uint16_t mask_16, ui } address = *dram_u32(hle, ptr_18); - hgain = *dram_u16(hle, ptr_18 + 4); + hgain = *dram_u16(hle, ptr_18 + 4); - for(i = 0; i < SUBFRAME_SIZE; ++i, address += 2) + for (i = 0; i < SUBFRAME_SIZE; ++i, address += 2) { - mix_samples(&musyx->left[i], *dram_u16(hle, address), hgain); - mix_samples(&musyx->right[i], *dram_u16(hle, address + 2*SUBFRAME_SIZE), hgain); - mix_samples(&subframe[i], *dram_u16(hle, address + 4*SUBFRAME_SIZE), hgain); + mix_samples(&musyx->left[i], *dram_u16(hle, address), hgain); + mix_samples(&musyx->right[i], *dram_u16(hle, address + 2 * SUBFRAME_SIZE), hgain); + mix_samples(&subframe[i], *dram_u16(hle, address + 4 * SUBFRAME_SIZE), hgain); } } // Interleave L_total and R_total dst = dram_u32(hle, output_ptr); - for(i = 0; i < SUBFRAME_SIZE; ++i) + for (i = 0; i < SUBFRAME_SIZE; ++i) { uint16_t l = musyx->left[i]; uint16_t r = musyx->right[i]; @@ -913,5 +931,5 @@ static void interleave_stage_v2(CHle * hle, musyx_t *musyx, uint16_t mask_16, ui } // Writeback sub-frame @ptr_1c - dram_store_u16(hle, (uint16_t*)subframe, ptr_1c, SUBFRAME_SIZE); + dram_store_u16(hle, (uint16_t *)subframe, ptr_1c, SUBFRAME_SIZE); } diff --git a/Source/Android/PluginRSP/ucodes.h b/Source/Project64-rsp-core/Hle/ucodes.h similarity index 98% rename from Source/Android/PluginRSP/ucodes.h rename to Source/Project64-rsp-core/Hle/ucodes.h index 41fce0d3a..bf2f4f21d 100644 --- a/Source/Android/PluginRSP/ucodes.h +++ b/Source/Project64-rsp-core/Hle/ucodes.h @@ -5,6 +5,7 @@ // GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html #pragma once +#include class CHle; @@ -14,7 +15,10 @@ void cicx105_ucode(CHle * hle); // Audio list microcodes -enum { N_SEGMENTS = 16 }; +enum +{ + N_SEGMENTS = 16 +}; struct alist_audio_t { diff --git a/Source/Project64-rsp-core/Project64-rsp-core.vcxproj b/Source/Project64-rsp-core/Project64-rsp-core.vcxproj index a905a6524..dde7c5380 100644 --- a/Source/Project64-rsp-core/Project64-rsp-core.vcxproj +++ b/Source/Project64-rsp-core/Project64-rsp-core.vcxproj @@ -51,6 +51,17 @@ + + + + + + + + + + + @@ -76,6 +87,12 @@ + + + + + + diff --git a/Source/Project64-rsp-core/Project64-rsp-core.vcxproj.filters b/Source/Project64-rsp-core/Project64-rsp-core.vcxproj.filters index 568da679b..de4e4ec2d 100644 --- a/Source/Project64-rsp-core/Project64-rsp-core.vcxproj.filters +++ b/Source/Project64-rsp-core/Project64-rsp-core.vcxproj.filters @@ -31,6 +31,12 @@ {bb961984-d173-4bd2-8a8b-f9a0416188f4} + + {77e5dadf-84ad-45b1-a66b-f88004e0fcea} + + + {615a5abd-6592-4b84-8611-cc432c2148ea} + @@ -99,6 +105,39 @@ Source Files\cpu + + Source Files\hle + + + Source Files\hle + + + Source Files\hle + + + Source Files\hle + + + Source Files\hle + + + Source Files\hle + + + Source Files\hle + + + Source Files\hle + + + Source Files\hle + + + Source Files\hle + + + Source Files\hle + @@ -161,5 +200,23 @@ Header Files\cpu + + Header Files\hle + + + Header Files\hle + + + Header Files\hle + + + Header Files\hle + + + Header Files\hle + + + Header Files\hle + \ No newline at end of file diff --git a/Source/Project64-rsp-core/RSPInfo.cpp b/Source/Project64-rsp-core/RSPInfo.cpp index 39b593c54..c9d27f92b 100644 --- a/Source/Project64-rsp-core/RSPInfo.cpp +++ b/Source/Project64-rsp-core/RSPInfo.cpp @@ -1,13 +1,118 @@ #include "RSPInfo.h" +#include +#include +#include #include #include #include #include +#include #include #include +#if defined(_MSC_VER) +#include +#endif + RSP_INFO RSPInfo; uint32_t RdramSize = 0; +CHle * g_hle = nullptr; + +void ClearAllx86Code(void); + +void DetectCpuSpecs(void) +{ + uint32_t Intel_Features = 0; + uint32_t AMD_Features = 0; + +#if defined(_MSC_VER) + __try + { +#ifdef _M_IX86 + _asm { + // Intel features + mov eax, 1 + cpuid + mov[Intel_Features], edx + + // AMD features + mov eax, 80000001h + cpuid + or [AMD_Features], edx + } +#else + int cpuInfo[4]; + __cpuid(cpuInfo, 1); + Intel_Features = cpuInfo[3]; + __cpuid(cpuInfo, 0x80000001); + AMD_Features = cpuInfo[3]; +#endif + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + AMD_Features = Intel_Features = 0; + } +#else + + /* + TODO: With GCC, there is , but __cpuid() there is a macro and + needs five arguments, not two. Also, GCC lacks SEH. + */ + + AMD_Features = Intel_Features = 0; +#endif + + if (Intel_Features & 0x02000000) + { + Compiler.mmx2 = true; + Compiler.sse = true; + } + if (Intel_Features & 0x00800000) + { + Compiler.mmx = true; + } + if (AMD_Features & 0x40000000) + { + Compiler.mmx2 = true; + } + if (Intel_Features & 0x00008000) + { + ConditionalMove = true; + } + else + { + ConditionalMove = false; + } +} + +void RspPluginLoaded(void) +{ + BreakOnStart = false; +#ifndef _M_X64 + g_CPUCore = RecompilerCPU; +#else + g_CPUCore = InterpreterCPU; +#endif + LogRDP = false; + LogX86Code = false; + Profiling = false; + IndvidualBlock = false; + ShowErrors = false; + + memset(&Compiler, 0, sizeof(Compiler)); + + Compiler.bDest = true; + Compiler.bAlignVector = false; + Compiler.bFlags = true; + Compiler.bReOrdering = true; + Compiler.bSections = true; + Compiler.bAccum = true; + Compiler.bGPRConstants = true; + DetectCpuSpecs(); + + InitializeRspSetting(); + SetCPU(g_CPUCore); +} void InitilizeRSP(RSP_INFO & Rsp_Info) { @@ -22,4 +127,51 @@ void InitilizeRSP(RSP_INFO & Rsp_Info) #ifdef GenerateLog Start_Log(); #endif + + if (g_hle != nullptr) + { + delete g_hle; + g_hle = nullptr; + } } + +void RspRomOpened(void) +{ + ClearAllx86Code(); + JumpTableSize = GetSetting(Set_JumpTableSize); + Mfc0Count = GetSetting(Set_Mfc0Count); + SemaphoreExit = GetSetting(Set_SemaphoreExit); + RdramSize = Set_AllocatedRdramSize != 0 ? GetSystemSetting(Set_AllocatedRdramSize) : 0; + if (RdramSize == 0) + { + RdramSize = 0x00400000; + } + g_RSPRegisterHandler.reset(new RSPRegisterHandlerPlugin(RSPInfo, RdramSize)); +} + +void RspRomClosed(void) +{ + if (Profiling) + { + StopTimer(); + GenerateTimerResults(); + } + g_RSPRegisterHandler.reset(nullptr); + ClearAllx86Code(); + StopRDPLog(); + StopCPULog(); + +#ifdef GenerateLog + Stop_Log(); +#endif +} + +void FreeRSP(void) +{ + FreeMemory(); + if (g_hle != nullptr) + { + delete g_hle; + g_hle = nullptr; + } +} \ No newline at end of file diff --git a/Source/Project64-rsp-core/RSPInfo.h b/Source/Project64-rsp-core/RSPInfo.h index 911a2625b..2d7db73d9 100644 --- a/Source/Project64-rsp-core/RSPInfo.h +++ b/Source/Project64-rsp-core/RSPInfo.h @@ -1,6 +1,13 @@ #include +class CHle; + extern RSP_INFO RSPInfo; extern uint32_t RdramSize; +extern CHle * g_hle; void InitilizeRSP(RSP_INFO & Rsp_Info); +void RspPluginLoaded(void); +void RspRomOpened(void); +void RspRomClosed(void); +void FreeRSP(void); \ No newline at end of file diff --git a/Source/Project64-rsp-core/Recompiler/RspRecompilerCPU.cpp b/Source/Project64-rsp-core/Recompiler/RspRecompilerCPU.cpp index 5361ac752..a6b4961b3 100644 --- a/Source/Project64-rsp-core/Recompiler/RspRecompilerCPU.cpp +++ b/Source/Project64-rsp-core/Recompiler/RspRecompilerCPU.cpp @@ -27,6 +27,7 @@ bool ChangedPC; RSP_BLOCK CurrentBlock; RSP_CODE RspCode; +RSP_COMPILER Compiler; uint8_t *pLastSecondary = NULL, *pLastPrimary = NULL; diff --git a/Source/Project64-rsp-core/Settings/RspSettings.cpp b/Source/Project64-rsp-core/Settings/RspSettings.cpp index 731c14ee2..c4b301603 100644 --- a/Source/Project64-rsp-core/Settings/RspSettings.cpp +++ b/Source/Project64-rsp-core/Settings/RspSettings.cpp @@ -5,7 +5,7 @@ #include uint16_t Set_AudioHle = 0, Set_GraphicsHle = 0, Set_AllocatedRdramSize = 0; -bool GraphicsHle = true, AudioHle, ConditionalMove; +bool GraphicsHle = true, AudioHle, ConditionalMove, HleAlistTask = false; bool DebuggingEnabled = false, Profiling, IndvidualBlock, ShowErrors, BreakOnStart = false, LogRDP = false, LogX86Code = false; void InitializeRspSetting(void) @@ -22,6 +22,7 @@ void InitializeRspSetting(void) RegisterSetting(Set_Profiling, Data_DWORD_General, "Profiling", NULL, Profiling, NULL); RegisterSetting(Set_IndvidualBlock, Data_DWORD_General, "Individual Block", NULL, IndvidualBlock, NULL); RegisterSetting(Set_ShowErrors, Data_DWORD_General, "Show Errors", NULL, ShowErrors, NULL); + RegisterSetting(Set_HleAlistTask, Data_DWORD_General, "Hle Alist Task", NULL, HleAlistTask, NULL); // Compiler settings RegisterSetting(Set_CheckDest, Data_DWORD_General, "Check Destination Vector", NULL, Compiler.bDest, NULL); diff --git a/Source/Project64-rsp-core/Settings/RspSettings.h b/Source/Project64-rsp-core/Settings/RspSettings.h index e2bf1d834..196f8d6fc 100644 --- a/Source/Project64-rsp-core/Settings/RspSettings.h +++ b/Source/Project64-rsp-core/Settings/RspSettings.h @@ -4,5 +4,5 @@ void InitializeRspSetting(void); extern uint16_t Set_AudioHle, Set_GraphicsHle, Set_AllocatedRdramSize; -extern bool GraphicsHle, AudioHle, ConditionalMove; +extern bool GraphicsHle, AudioHle, ConditionalMove, HleAlistTask; extern bool DebuggingEnabled, Profiling, IndvidualBlock, ShowErrors, BreakOnStart, LogRDP, LogX86Code; \ No newline at end of file diff --git a/Source/Project64-rsp-core/Settings/RspSettingsID.h b/Source/Project64-rsp-core/Settings/RspSettingsID.h index 196078592..e7eae627b 100644 --- a/Source/Project64-rsp-core/Settings/RspSettingsID.h +++ b/Source/Project64-rsp-core/Settings/RspSettingsID.h @@ -9,6 +9,7 @@ enum Set_Profiling, Set_IndvidualBlock, Set_ShowErrors, + Set_HleAlistTask, // Compiler settings Set_CheckDest, diff --git a/Source/Project64-rsp-core/cpu/RSPCpu.cpp b/Source/Project64-rsp-core/cpu/RSPCpu.cpp index fa72c3cf0..6966ff232 100644 --- a/Source/Project64-rsp-core/cpu/RSPCpu.cpp +++ b/Source/Project64-rsp-core/cpu/RSPCpu.cpp @@ -1,5 +1,6 @@ #include "RSPCpu.h" #include +#include #include #include #include @@ -54,7 +55,10 @@ void Build_RSP(void) SQrootResult.UW = 0; SetCPU(g_CPUCore); - g_RSPDebugger->ResetTimerList(); + if (g_RSPDebugger != nullptr) + { + g_RSPDebugger->ResetTimerList(); + } EleSpec[0].DW = 0x0001020304050607; // None EleSpec[1].DW = 0x0001020304050607; // None @@ -144,13 +148,30 @@ uint32_t DoRspCycles(uint32_t Cycles) *RSPInfo.DPC_STATUS_REG &= ~0x0002; return Cycles; } + else if (TaskType == 2 && HleAlistTask) + { + if (g_hle == nullptr) + { + g_hle = new CHle(RSPInfo); + } + if (g_hle != nullptr) + { + g_hle->try_fast_audio_dispatching(); + *RSPInfo.SP_STATUS_REG |= SP_STATUS_SIG2 | SP_STATUS_BROKE | SP_STATUS_HALT; + if ((*RSPInfo.SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0) + { + *RSPInfo.MI_INTR_REG |= MI_INTR_SP; + RSPInfo.CheckInterrupts(); + } + } + } else if (TaskType == 2 && AudioHle) { if (RSPInfo.ProcessAList != NULL) { RSPInfo.ProcessAList(); } - *RSPInfo.SP_STATUS_REG |= (0x0203); + *RSPInfo.SP_STATUS_REG |= SP_STATUS_SIG2 | SP_STATUS_BROKE | SP_STATUS_HALT; if ((*RSPInfo.SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0) { *RSPInfo.MI_INTR_REG |= MI_INTR_SP; @@ -163,17 +184,10 @@ uint32_t DoRspCycles(uint32_t Cycles) RSPInfo.ShowCFB(); } - /* - *RSPInfo.SP_STATUS_REG |= (0x0203 ); - if ((*RSPInfo.SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0 ) - { - *RSPInfo.MI_INTR_REG |= MI_INTR_SP; - RSPInfo.CheckInterrupts(); - } - //return Cycles; -*/ - - g_RSPDebugger->RspCyclesStart(); + if (g_RSPDebugger != nullptr) + { + g_RSPDebugger->RspCyclesStart(); + } CGuard Guard(g_CPUCriticalSection); switch (g_CPUCore) @@ -185,6 +199,9 @@ uint32_t DoRspCycles(uint32_t Cycles) RunInterpreterCPU(Cycles); break; } - g_RSPDebugger->RspCyclesStop(); + if (g_RSPDebugger != nullptr) + { + g_RSPDebugger->RspCyclesStop(); + } return Cycles; } diff --git a/Source/Project64-rsp-core/cpu/RSPInterpreterCPU.cpp b/Source/Project64-rsp-core/cpu/RSPInterpreterCPU.cpp index b6ff689e9..1d23b67cf 100644 --- a/Source/Project64-rsp-core/cpu/RSPInterpreterCPU.cpp +++ b/Source/Project64-rsp-core/cpu/RSPInterpreterCPU.cpp @@ -375,13 +375,18 @@ uint32_t RunInterpreterCPU(uint32_t Cycles) { uint32_t CycleCount; RSP_Running = true; - g_RSPDebugger->StartingCPU(); + if (g_RSPDebugger != nullptr) + { + g_RSPDebugger->StartingCPU(); + } CycleCount = 0; while (RSP_Running) { - g_RSPDebugger->BeforeExecuteOp(); - + if (g_RSPDebugger != nullptr) + { + g_RSPDebugger->BeforeExecuteOp(); + } RSPOpC.Value = *(uint32_t *)(RSPInfo.IMEM + (*PrgCount & 0xFFC)); RSP_Opcode[RSPOpC.op](); RSP_GPR[0].W = 0x00000000; // MIPS $zero hard-wired to 0 diff --git a/Source/Project64-rsp-core/cpu/RSPInterpreterOps.cpp b/Source/Project64-rsp-core/cpu/RSPInterpreterOps.cpp index 18daf33dd..208da0719 100644 --- a/Source/Project64-rsp-core/cpu/RSPInterpreterOps.cpp +++ b/Source/Project64-rsp-core/cpu/RSPInterpreterOps.cpp @@ -413,7 +413,10 @@ void RSP_Opcode_BGEZAL(void) void RSP_Cop0_MF(void) { - g_RSPDebugger->RDP_LogMF0(*PrgCount, RSPOpC.rd); + if (g_RSPDebugger != nullptr) + { + g_RSPDebugger->RDP_LogMF0(*PrgCount, RSPOpC.rd); + } switch (RSPOpC.rd) { case 0: RSP_GPR[RSPOpC.rt].UW = g_RSPRegisterHandler->ReadReg(RSPRegister_MEM_ADDR); break; @@ -1678,5 +1681,8 @@ void RSP_Opcode_SWV(void) void rsp_UnknownOpcode(void) { - g_RSPDebugger->UnknownOpcode(); + if (g_RSPDebugger != nullptr) + { + g_RSPDebugger->UnknownOpcode(); + } } diff --git a/Source/Project64-rsp/Main.cpp b/Source/Project64-rsp/Main.cpp index ad5e70d7b..a001997be 100644 --- a/Source/Project64-rsp/Main.cpp +++ b/Source/Project64-rsp/Main.cpp @@ -33,7 +33,6 @@ #include #include -void ClearAllx86Code(void); void ProcessMenuItem(int32_t ID); #ifdef _WIN32 BOOL CALLBACK CompilerDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -131,7 +130,7 @@ Output: None EXPORT void CloseDLL(void) { - FreeMemory(); + FreeRSP(); } /* @@ -178,6 +177,7 @@ void FixMenuState(void) CheckMenuItem(hRSPMenu, ID_CPUMETHOD_INTERPT, MF_BYCOMMAND | (g_CPUCore == InterpreterCPU ? MFS_CHECKED : MF_UNCHECKED)); CheckMenuItem(hRSPMenu, ID_BREAKONSTARTOFTASK, MF_BYCOMMAND | (BreakOnStart ? MFS_CHECKED : MF_UNCHECKED)); CheckMenuItem(hRSPMenu, ID_LOGRDPCOMMANDS, MF_BYCOMMAND | (LogRDP ? MFS_CHECKED : MF_UNCHECKED)); + CheckMenuItem(hRSPMenu, ID_SETTINGS_HLEALISTTASK, MF_BYCOMMAND | (HleAlistTask ? MFS_CHECKED : MF_UNCHECKED)); CheckMenuItem(hRSPMenu, ID_SETTINGS_LOGX86CODE, MF_BYCOMMAND | (LogX86Code ? MFS_CHECKED : MF_UNCHECKED)); CheckMenuItem(hRSPMenu, ID_SETTINGS_MULTITHREADED, MF_BYCOMMAND | (MultiThreadedDefault ? MFS_CHECKED : MF_UNCHECKED)); CheckMenuItem(hRSPMenu, ID_PROFILING_ON, MF_BYCOMMAND | (Profiling ? MFS_CHECKED : MF_UNCHECKED)); @@ -255,74 +255,6 @@ CycleCount is the number of cycles between switching control between the RSP and r4300i core. Output: None */ - -RSP_COMPILER Compiler; - -void DetectCpuSpecs(void) -{ - DWORD Intel_Features = 0; - DWORD AMD_Features = 0; - -#if defined(_MSC_VER) - __try - { -#ifdef _M_IX86 - _asm { - // Intel features - mov eax, 1 - cpuid - mov [Intel_Features], edx - - // AMD features - mov eax, 80000001h - cpuid - or [AMD_Features], edx - } -#else - int cpuInfo[4]; - __cpuid(cpuInfo, 1); - Intel_Features = cpuInfo[3]; - __cpuid(cpuInfo, 0x80000001); - AMD_Features = cpuInfo[3]; -#endif - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - AMD_Features = Intel_Features = 0; - } -#else - - /* -TODO: With GCC, there is , but __cpuid() there is a macro and -needs five arguments, not two. Also, GCC lacks SEH. -*/ - - AMD_Features = Intel_Features = 0; -#endif - - if (Intel_Features & 0x02000000) - { - Compiler.mmx2 = true; - Compiler.sse = true; - } - if (Intel_Features & 0x00800000) - { - Compiler.mmx = true; - } - if (AMD_Features & 0x40000000) - { - Compiler.mmx2 = true; - } - if (Intel_Features & 0x00008000) - { - ConditionalMove = true; - } - else - { - ConditionalMove = false; - } -} - EXPORT void InitiateRSP(RSP_INFO Rsp_Info, uint32_t * CycleCount) { g_RSPDebuggerUI.reset(new RSPDebuggerUI); @@ -446,6 +378,13 @@ void ProcessMenuItem(int32_t ID) } break; } + case ID_SETTINGS_HLEALISTTASK: + { + bool Checked = (GetMenuState(hRSPMenu, ID_SETTINGS_HLEALISTTASK, MF_BYCOMMAND) & MFS_CHECKED) != 0; + CheckMenuItem(hRSPMenu, ID_SETTINGS_HLEALISTTASK, MF_BYCOMMAND | (Checked ? MFS_UNCHECKED : MFS_CHECKED)); + SetSetting(Set_HleAlistTask, !Checked); + break; + } case ID_SETTINGS_MULTITHREADED: { bool Checked = (GetMenuState(hRSPMenu, ID_SETTINGS_MULTITHREADED, MF_BYCOMMAND) & MFS_CHECKED) != 0; @@ -482,21 +421,11 @@ Output: None EXPORT void RomOpen(void) { - ClearAllx86Code(); + RspRomOpened(); if (DebuggingEnabled) { EnableDebugging(true); } - JumpTableSize = GetSetting(Set_JumpTableSize); - Mfc0Count = GetSetting(Set_Mfc0Count); - SemaphoreExit = GetSetting(Set_SemaphoreExit); - - RdramSize = Set_AllocatedRdramSize != 0 ? GetSystemSetting(Set_AllocatedRdramSize) : 0; - if (RdramSize == 0) - { - RdramSize = 0x00400000; - } - g_RSPRegisterHandler.reset(new RSPRegisterHandlerPlugin(RSPInfo, RdramSize)); } /* @@ -508,19 +437,7 @@ Output: None EXPORT void RomClosed(void) { - if (Profiling) - { - StopTimer(); - GenerateTimerResults(); - } - g_RSPRegisterHandler.reset(nullptr); - ClearAllx86Code(); - StopRDPLog(); - StopCPULog(); - -#ifdef GenerateLog - Stop_Log(); -#endif + RspRomClosed(); } #ifdef _WIN32 @@ -672,6 +589,7 @@ EXPORT void EnableDebugging(int Enabled) Profiling = GetSetting(Set_Profiling) != 0; IndvidualBlock = GetSetting(Set_IndvidualBlock) != 0; ShowErrors = GetSetting(Set_ShowErrors) != 0; + HleAlistTask = GetSetting(Set_HleAlistTask) != 0; Compiler.bDest = GetSetting(Set_CheckDest) != 0; Compiler.bAccum = GetSetting(Set_Accum) != 0; @@ -702,31 +620,7 @@ EXPORT void EnableDebugging(int Enabled) EXPORT void PluginLoaded(void) { - BreakOnStart = false; -#ifndef _M_X64 - g_CPUCore = RecompilerCPU; -#else - g_CPUCore = InterpreterCPU; -#endif - LogRDP = false; - LogX86Code = false; - Profiling = false; - IndvidualBlock = false; - ShowErrors = false; - - memset(&Compiler, 0, sizeof(Compiler)); - - Compiler.bDest = true; - Compiler.bAlignVector = false; - Compiler.bFlags = true; - Compiler.bReOrdering = true; - Compiler.bSections = true; - Compiler.bAccum = true; - Compiler.bGPRConstants = true; - DetectCpuSpecs(); - - InitializeRspSetting(); - SetCPU(g_CPUCore); + RspPluginLoaded(); } #ifdef _WIN32 diff --git a/Source/Project64-rsp/Project64-rsp.rc b/Source/Project64-rsp/Project64-rsp.rc index 1ada0073b..573a4806a 100644 --- a/Source/Project64-rsp/Project64-rsp.rc +++ b/Source/Project64-rsp/Project64-rsp.rc @@ -190,6 +190,7 @@ BEGIN END POPUP "Settings" BEGIN + MENUITEM "HLE alist task", ID_SETTINGS_HLEALISTTASK MENUITEM "Show Compiler Errors", ID_SHOWCOMPILERERRORS MENUITEM "Break on start of task", ID_BREAKONSTARTOFTASK MENUITEM "Log RDP Commands", ID_LOGRDPCOMMANDS diff --git a/Source/Project64-rsp/Project64-rsp.vcxproj b/Source/Project64-rsp/Project64-rsp.vcxproj index d646b4a92..be4958f68 100644 --- a/Source/Project64-rsp/Project64-rsp.vcxproj +++ b/Source/Project64-rsp/Project64-rsp.vcxproj @@ -67,9 +67,6 @@ {8b9961b1-88d9-4ea3-a752-507a00dd9f3d} - - {1968162c-0793-491d-91a1-81645a24d399} - diff --git a/Source/Project64-rsp/resource.h b/Source/Project64-rsp/resource.h index b528e8cb5..d065afd8b 100644 --- a/Source/Project64-rsp/resource.h +++ b/Source/Project64-rsp/resource.h @@ -38,13 +38,14 @@ #define ID_CPUMETHOD_INTERPT 5017 #define ID_SETTINGS_LOGX86CODE 5019 #define ID_SETTINGS_MULTITHREADED 5020 +#define ID_SETTINGS_HLEALISTTASK 5021 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 108 -#define _APS_NEXT_COMMAND_VALUE 5021 +#define _APS_NEXT_COMMAND_VALUE 5022 #define _APS_NEXT_CONTROL_VALUE 1032 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/Source/Script/clang.cmd b/Source/Script/clang.cmd index 760336f4c..f371d1253 100644 --- a/Source/Script/clang.cmd +++ b/Source/Script/clang.cmd @@ -12,6 +12,7 @@ set ScanDir[2]="%base_dir%\Source\Project64-core" set ScanDir[3]="%base_dir%\Source\Project64-rsp" set ScanDir[4]="%base_dir%\Source\Project64-rsp-core" set ScanDir[5]="%base_dir%\Source\Android\Bridge" +set ScanDir[6]="%base_dir%\Source\Android\PluginRSP" set ScanFiles[0]="*.cpp" set ScanFiles[1]="*.h"