Android: Move hle audio code in to main rsp plugin

This commit is contained in:
zilmar 2023-11-02 20:06:58 +10:30
parent 924197ca9a
commit 6fbc5c0264
63 changed files with 1771 additions and 1613 deletions

View File

@ -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

View File

@ -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')
}

View File

@ -0,0 +1 @@
<manifest package="emu.project64.plugin_rsp" />

View File

@ -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)

View File

@ -1 +0,0 @@
<manifest package="emu.project64.plugin_rsphle" />

View File

@ -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)

View File

@ -0,0 +1 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="emu.project64.project64_rsp_core" />

View File

@ -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)

View File

@ -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'])
}

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -20,8 +20,7 @@
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{B685BB34-D700-4FCC-8503-9B6AA1A0C95D}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>RSPhle</RootNamespace>
<RootNamespace>RSPbasic</RootNamespace>
</PropertyGroup>
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
@ -33,45 +32,34 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<PropertyGroup>
<TargetName>RSP-HLE</TargetName>
<TargetName Condition="'$(Configuration)'=='Debug'">RSP-HLE_d</TargetName>
<TargetName>Project64-RSP-Basic</TargetName>
<TargetName Condition="'$(Configuration)'=='Debug'">Project64-RSP-Basic_d</TargetName>
<OutDir>$(SolutionDir)Plugin\RSP\</OutDir>
<OutDir Condition="'$(Platform)'=='x64'">$(SolutionDir)Plugin64\RSP\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DisableSpecificWarnings>4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="alist.cpp" />
<ClCompile Include="alist_audio.cpp" />
<ClCompile Include="alist_naudio.cpp" />
<ClCompile Include="alist_nead.cpp" />
<ClCompile Include="audio.cpp" />
<ClCompile Include="cicx105.cpp" />
<ClCompile Include="hle.cpp" />
<ClCompile Include="jpeg.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="mem.cpp" />
<ClCompile Include="mp3.cpp" />
<ClCompile Include="musyx.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader>Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="alist.h" />
<ClInclude Include="arithmetics.h" />
<ClInclude Include="audio.h" />
<ClInclude Include="common.h" />
<ClInclude Include="hle.h" />
<ClInclude Include="mem.h" />
<ClInclude Include="Rsp.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="ucodes.h" />
<ClInclude Include="Version.h" />
<ProjectReference Include="..\..\Common\Common.vcxproj">
<Project>{b4a4b994-9111-42b1-93c2-6f1ca8bc4421}</Project>
</ProjectReference>
<ProjectReference Include="..\..\Project64-rsp-core\Project64-rsp-core.vcxproj">
<Project>{7598f6b8-9da6-4897-b26f-f6865f824bf4}</Project>
</ProjectReference>
<ProjectReference Include="..\..\Settings\Settings.vcxproj">
<Project>{8b9961b1-88d9-4ea3-a752-507a00dd9f3d}</Project>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Project64-rsp.rc" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="resource.h" />
</ItemGroup>
</Project>

View File

@ -18,72 +18,14 @@
<ClCompile Include="main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="hle.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="alist_audio.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="alist.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="audio.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="mem.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jpeg.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="alist_naudio.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="alist_nead.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="mp3.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="musyx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="cicx105.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Rsp.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Version.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="hle.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="ucodes.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="alist.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="common.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="mem.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="arithmetics.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="audio.h">
<ResourceCompile Include="Project64-rsp.rc">
<Filter>Resource Files</Filter>
</ResourceCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="resource.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 <assert.h>
#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);
}
}

View File

@ -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;

View File

@ -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 <stdint.h>
#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;
};

View File

@ -1,7 +1,8 @@
#include "stdafx.h"
#include "Rsp.h"
CHle * g_hle = NULL;
#include <Project64-rsp-core/RSPInfo.h>
#include <Project64-rsp-core/Version.h>
#include <Settings/Settings.h>
#include <stdio.h>
#include <string.h>
#ifdef _WIN32
#include <Windows.h>
@ -25,11 +26,7 @@ Output: None
void CloseDLL(void)
{
if (g_hle)
{
delete g_hle;
g_hle = NULL;
}
FreeRSP();
}
/*
@ -47,27 +44,6 @@ void DllAbout(void * hParent)
#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
@ -77,24 +53,23 @@ filled by the function. (see def above)
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
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
@ -102,38 +77,42 @@ control between the RSP and r4300i core.
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
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
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__);
}

View File

@ -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 <assert.h>
#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);
}

View File

@ -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

View File

@ -1 +0,0 @@
#include "stdafx.h"

View File

@ -1,6 +0,0 @@
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "Version.h"
#include "Rsp.h"
#include "hle.h"

View File

@ -6,12 +6,15 @@
// Copyright(C) 2002 Hacktarux
// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html
#include "stdafx.h"
#include <memory.h>
#include "alist.h"
#include "arithmetics.h"
#include "audio.h"
#include "hle.h"
#include "mem.h"
#include <memory.h>
#include <stdint.h>
aaa
struct ramp_t
{
@ -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);
}
@ -633,7 +636,8 @@ void alist_resample( CHle * hle, bool init, bool flag2, uint16_t dmemo, uint16_t
(*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, ipos + 3) * lut[3])) >>
15);
pitch_accu += pitch;
ipos += (pitch_accu >> 16);

View File

@ -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 <stdint.h>
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

View File

@ -6,16 +6,18 @@
// Copyright(C) 2002 Hacktarux
// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html
#include "stdafx.h"
#include <stdint.h>
#include <string.h>
#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
@ -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);
@ -285,8 +286,7 @@ void alist_process_audio_ge(CHle * hle)
SPNOOP, ADPCM, CLEARBUFF, ENVMIXER_GE,
LOADBUFF, RESAMPLE, SAVEBUFF, SEGMENT,
SETBUFF, SETVOL, DMEMMOVE, LOADADPCM,
MIXER, INTERLEAVE, POLEF, SETLOOP
};
MIXER, INTERLEAVE, POLEF, SETLOOP};
clear_segments(hle);
alist_process(hle, ABI, 0x10);
@ -299,8 +299,7 @@ void alist_process_audio_bc(CHle * hle)
SPNOOP, ADPCM, CLEARBUFF, ENVMIXER_GE,
LOADBUFF, RESAMPLE, SAVEBUFF, SEGMENT,
SETBUFF, SETVOL, DMEMMOVE, LOADADPCM,
MIXER, INTERLEAVE, POLEF, SETLOOP
};
MIXER, INTERLEAVE, POLEF, SETLOOP};
clear_segments(hle);
alist_process(hle, ABI, 0x10);

View File

@ -6,13 +6,17 @@
// Copyright(C) 2002 Hacktarux
// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html
#include "stdafx.h"
#include <stdint.h>
#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,
@ -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;
}
@ -235,8 +242,7 @@ void alist_process_naudio(CHle * hle)
SPNOOP, ADPCM, CLEARBUFF, ENVMIXER,
LOADBUFF, RESAMPLE, SAVEBUFF, NAUDIO_0000,
NAUDIO_0000, SETVOL, DMEMMOVE, LOADADPCM,
MIXER, INTERLEAVE, NAUDIO_02B0, SETLOOP
};
MIXER, INTERLEAVE, NAUDIO_02B0, SETLOOP};
alist_process(hle, ABI, 0x10);
}
@ -249,8 +255,7 @@ void alist_process_naudio_bk(CHle * hle)
SPNOOP, ADPCM, CLEARBUFF, ENVMIXER,
LOADBUFF, RESAMPLE, SAVEBUFF, NAUDIO_0000,
NAUDIO_0000, SETVOL, DMEMMOVE, LOADADPCM,
MIXER, INTERLEAVE, NAUDIO_02B0, SETLOOP
};
MIXER, INTERLEAVE, NAUDIO_02B0, SETLOOP};
alist_process(hle, ABI, 0x10);
}
@ -263,8 +268,7 @@ void alist_process_naudio_dk(CHle * hle)
SPNOOP, ADPCM, CLEARBUFF, ENVMIXER,
LOADBUFF, RESAMPLE, SAVEBUFF, MIXER,
MIXER, SETVOL, DMEMMOVE, LOADADPCM,
MIXER, INTERLEAVE, NAUDIO_02B0, SETLOOP
};
MIXER, INTERLEAVE, NAUDIO_02B0, SETLOOP};
alist_process(hle, ABI, 0x10);
}
@ -275,8 +279,7 @@ void alist_process_naudio_mp3(CHle * hle)
UNKNOWN, ADPCM, CLEARBUFF, ENVMIXER,
LOADBUFF, RESAMPLE, SAVEBUFF, MP3,
MP3ADDY, SETVOL, DMEMMOVE, LOADADPCM,
MIXER, INTERLEAVE, NAUDIO_14, SETLOOP
};
MIXER, INTERLEAVE, NAUDIO_14, SETLOOP};
alist_process(hle, ABI, 0x10);
}
@ -289,8 +292,7 @@ void alist_process_naudio_cbfd(CHle * hle)
UNKNOWN, ADPCM, CLEARBUFF, ENVMIXER,
LOADBUFF, RESAMPLE, SAVEBUFF, MP3,
MP3ADDY, SETVOL, DMEMMOVE, LOADADPCM,
MIXER, INTERLEAVE, NAUDIO_14, SETLOOP
};
MIXER, INTERLEAVE, NAUDIO_14, SETLOOP};
alist_process(hle, ABI, 0x10);
}

View File

@ -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 <stdint.h>
#include "alist.h"
#include "mem.h"
@ -282,11 +283,13 @@ static void FILTER(CHle * hle, uint32_t w1, uint32_t w2)
uint8_t flags = (w1 >> 16);
uint32_t address = (w2 & 0xffffff);
if (flags > 1) {
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
@ -338,8 +341,7 @@ void alist_process_nead_mk(CHle * hle)
NEAD_16, INTERL, ENVSETUP1_MK, ENVMIXER_MK,
LOADBUFF, SAVEBUFF, ENVSETUP2, SPNOOP,
SPNOOP, SPNOOP, SPNOOP, SPNOOP,
SPNOOP, SPNOOP, SPNOOP, SPNOOP
};
SPNOOP, SPNOOP, SPNOOP, SPNOOP};
alist_process(hle, ABI, 0x20);
}
@ -354,8 +356,7 @@ void alist_process_nead_sf(CHle * hle)
NEAD_16, INTERL, ENVSETUP1, ENVMIXER,
LOADBUFF, SAVEBUFF, ENVSETUP2, SPNOOP,
HILOGAIN, UNKNOWN, DUPLICATE, SPNOOP,
SPNOOP, SPNOOP, SPNOOP, SPNOOP
};
SPNOOP, SPNOOP, SPNOOP, SPNOOP};
alist_process(hle, ABI, 0x20);
}
@ -370,8 +371,7 @@ void alist_process_nead_sfj(CHle * hle)
NEAD_16, INTERL, ENVSETUP1, ENVMIXER,
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN,
HILOGAIN, UNKNOWN, DUPLICATE, SPNOOP,
SPNOOP, SPNOOP, SPNOOP, SPNOOP
};
SPNOOP, SPNOOP, SPNOOP, SPNOOP};
alist_process(hle, ABI, 0x20);
}
@ -386,8 +386,7 @@ void alist_process_nead_fz(CHle * hle)
NEAD_16, INTERL, ENVSETUP1, ENVMIXER,
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN,
SPNOOP, UNKNOWN, DUPLICATE, SPNOOP,
SPNOOP, SPNOOP, SPNOOP, SPNOOP
};
SPNOOP, SPNOOP, SPNOOP, SPNOOP};
alist_process(hle, ABI, 0x20);
}
@ -402,8 +401,7 @@ void alist_process_nead_wrjb(CHle * hle)
NEAD_16, INTERL, ENVSETUP1, ENVMIXER,
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN,
HILOGAIN, UNKNOWN, DUPLICATE, FILTER,
SPNOOP, SPNOOP, SPNOOP, SPNOOP
};
SPNOOP, SPNOOP, SPNOOP, SPNOOP};
alist_process(hle, ABI, 0x20);
}
@ -416,8 +414,7 @@ void alist_process_nead_ys(CHle * hle)
SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM,
MIXER, INTERLEAVE, HILOGAIN, SETLOOP,
NEAD_16, INTERL, ENVSETUP1, ENVMIXER,
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN
};
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN};
alist_process(hle, ABI, 0x18);
}
@ -430,8 +427,7 @@ void alist_process_nead_1080(CHle * hle)
SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM,
MIXER, INTERLEAVE, HILOGAIN, SETLOOP,
NEAD_16, INTERL, ENVSETUP1, ENVMIXER,
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN
};
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN};
alist_process(hle, ABI, 0x18);
}
@ -444,8 +440,7 @@ void alist_process_nead_oot(CHle * hle)
SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM,
MIXER, INTERLEAVE, HILOGAIN, SETLOOP,
NEAD_16, INTERL, ENVSETUP1, ENVMIXER,
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN
};
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN};
alist_process(hle, ABI, 0x18);
}
@ -458,8 +453,7 @@ void alist_process_nead_mm(CHle * hle)
SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM,
MIXER, INTERLEAVE, HILOGAIN, SETLOOP,
NEAD_16, INTERL, ENVSETUP1, ENVMIXER,
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN
};
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN};
alist_process(hle, ABI, 0x18);
}
@ -472,8 +466,7 @@ void alist_process_nead_mmb(CHle * hle)
SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM,
MIXER, INTERLEAVE, HILOGAIN, SETLOOP,
NEAD_16, INTERL, ENVSETUP1, ENVMIXER,
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN
};
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN};
alist_process(hle, ABI, 0x18);
}
@ -486,8 +479,7 @@ void alist_process_nead_ac(CHle * hle)
SETBUFF, DUPLICATE, DMEMMOVE, LOADADPCM,
MIXER, INTERLEAVE, HILOGAIN, SETLOOP,
NEAD_16, INTERL, ENVSETUP1, ENVMIXER,
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN
};
LOADBUFF, SAVEBUFF, ENVSETUP2, UNKNOWN};
alist_process(hle, ABI, 0x18);
}

View File

@ -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 <assert.h>
#include <stdint.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);
}
}

View File

@ -5,6 +5,7 @@
// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html
#pragma once
#include <stdint.h>
extern const int16_t RESAMPLE_LUT[64 * 4];

View File

@ -6,9 +6,11 @@
// Copyright(C) 2002 Hacktarux
// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html
#include "stdafx.h"
#include <stdint.h>
#include <string.h>
#include "hle.h"
/*
During IPL3 stage of CIC x105 games, the RSP performs some checks and transactions
necessary for booting the game.

View File

@ -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 <stdint.h>
#if defined(_WIN32) && defined(_DEBUG)
#include <Windows.h>
#endif
@ -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

View File

@ -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 <Project64-rsp-core/RSPInfo.h>
#include <Project64-rsp-core/cpu/RSPRegisters.h>
#include <stdint.h>
// 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;
};

View File

@ -6,7 +6,7 @@
// Copyright(C) 2002 Hacktarux
// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html
#include "stdafx.h"
#include <stdint.h>
#include <stdlib.h>
#include "arithmetics.h"
@ -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,8 +90,7 @@ 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) */
@ -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)
@ -339,7 +335,8 @@ static void EmitTilesMode0(CHle * hle, const tile_line_emitter_t emit_line, cons
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, &macroblock[y_offset], &macroblock[u_offset], address);
y_offset += 8;
@ -370,12 +367,14 @@ static void decode_macroblock_ob(int16_t *macroblock, int32_t *y_dc, int32_t *u_
{
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:
@ -482,7 +481,8 @@ 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);
}

View File

@ -4,7 +4,8 @@
// Copyright(C) 2012 Bobby Smiles
// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html
#include "stdafx.h"
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "mem.h"

View File

@ -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 <assert.h>
#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);
}

View File

@ -6,7 +6,7 @@
// Copyright(C) 2002 Hacktarux
// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html
#include "stdafx.h"
#include <stdint.h>
#include <string.h>
#include "arithmetics.h"
@ -146,8 +146,7 @@ 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)
{
@ -155,8 +154,7 @@ static void MP3AB0(int32_t* v)
static const uint16_t LUT2[8] =
{
0xFEC4, 0xF4FA, 0xC5E4, 0xE1C4,
0x1916, 0x4A50, 0xA268, 0x78AE
};
0x1916, 0x4A50, 0xA268, 0x78AE};
static const uint16_t LUT3[4] = {0xFB14, 0xD4DC, 0x31F2, 0x8E3A};
int i;
@ -251,8 +249,7 @@ static void InnerLoop(CHle * hle, uint32_t outPtr, uint32_t inPtr, uint32_t t6,
0xFFB2, 0xFD3A, 0xF10A, 0xF854,
0xBDAE, 0xCDA0, 0xE76C, 0xDB94,
0x1920, 0x4B20, 0xAC7C, 0x7C68,
0xABEC, 0x9880, 0xDAE8, 0x839C
};
0xABEC, 0x9880, 0xDAE8, 0x839C};
int i;
uint32_t t0;
uint32_t t1;

View File

@ -4,7 +4,7 @@
// Copyright(C) 2013 Bobby Smiles
// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html
#include "stdafx.h"
#include <stdint.h>
#include <string.h>
#include "arithmetics.h"
@ -13,10 +13,19 @@
// Various constants
enum { SUBFRAME_SIZE = 192 };
enum { MAX_VOICES = 32 };
enum
{
SUBFRAME_SIZE = 192
};
enum
{
MAX_VOICES = 32
};
enum { SAMPLE_BUFFER_SIZE = 0x200 };
enum
{
SAMPLE_BUFFER_SIZE = 0x200
};
enum
{
@ -653,7 +662,13 @@ static void mix_voice_samples(CHle * hle, musyx_t *musyx, uint32_t voice_ptr, co
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)
{
@ -741,7 +756,10 @@ static void sfx_stage(CHle * hle, mix_sfx_with_main_subframes_t mix_sfx_with_mai
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

View File

@ -5,6 +5,7 @@
// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html
#pragma once
#include <stdint.h>
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
{

View File

@ -51,6 +51,17 @@
<ClCompile Include="cpu\RSPRegisterHandler.cpp" />
<ClCompile Include="cpu\RSPRegisterHandlerPlugin.cpp" />
<ClCompile Include="cpu\RspTypes.cpp" />
<ClCompile Include="Hle\alist.cpp" />
<ClCompile Include="Hle\alist_audio.cpp" />
<ClCompile Include="Hle\alist_naudio.cpp" />
<ClCompile Include="Hle\alist_nead.cpp" />
<ClCompile Include="Hle\audio.cpp" />
<ClCompile Include="Hle\cicx105.cpp" />
<ClCompile Include="Hle\hle.cpp" />
<ClCompile Include="Hle\jpeg.cpp" />
<ClCompile Include="Hle\mem.cpp" />
<ClCompile Include="Hle\mp3.cpp" />
<ClCompile Include="Hle\musyx.cpp" />
<ClCompile Include="Recompiler\Mmx.cpp" />
<ClCompile Include="Recompiler\RspProfiling.cpp" />
<ClCompile Include="Recompiler\RspRecompilerAnalysis.cpp" />
@ -76,6 +87,12 @@
<ClInclude Include="cpu\RSPRegisterHandlerPlugin.h" />
<ClInclude Include="cpu\RSPRegisters.h" />
<ClInclude Include="cpu\RspTypes.h" />
<ClInclude Include="Hle\alist.h" />
<ClInclude Include="Hle\arithmetics.h" />
<ClInclude Include="Hle\audio.h" />
<ClInclude Include="Hle\hle.h" />
<ClInclude Include="Hle\mem.h" />
<ClInclude Include="Hle\ucodes.h" />
<ClInclude Include="Recompiler\RspProfiling.h" />
<ClInclude Include="Recompiler\RspRecompilerCPU.h" />
<ClInclude Include="Recompiler\RspRecompilerOps.h" />

View File

@ -31,6 +31,12 @@
<Filter Include="Source Files\Recompiler">
<UniqueIdentifier>{bb961984-d173-4bd2-8a8b-f9a0416188f4}</UniqueIdentifier>
</Filter>
<Filter Include="Header Files\hle">
<UniqueIdentifier>{77e5dadf-84ad-45b1-a66b-f88004e0fcea}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\hle">
<UniqueIdentifier>{615a5abd-6592-4b84-8611-cc432c2148ea}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="cpu\RSPiInstruction.cpp">
@ -99,6 +105,39 @@
<ClCompile Include="cpu\RSPRegisterHandlerPlugin.cpp">
<Filter>Source Files\cpu</Filter>
</ClCompile>
<ClCompile Include="Hle\alist.cpp">
<Filter>Source Files\hle</Filter>
</ClCompile>
<ClCompile Include="Hle\audio.cpp">
<Filter>Source Files\hle</Filter>
</ClCompile>
<ClCompile Include="Hle\mem.cpp">
<Filter>Source Files\hle</Filter>
</ClCompile>
<ClCompile Include="Hle\hle.cpp">
<Filter>Source Files\hle</Filter>
</ClCompile>
<ClCompile Include="Hle\alist_audio.cpp">
<Filter>Source Files\hle</Filter>
</ClCompile>
<ClCompile Include="Hle\alist_naudio.cpp">
<Filter>Source Files\hle</Filter>
</ClCompile>
<ClCompile Include="Hle\alist_nead.cpp">
<Filter>Source Files\hle</Filter>
</ClCompile>
<ClCompile Include="Hle\cicx105.cpp">
<Filter>Source Files\hle</Filter>
</ClCompile>
<ClCompile Include="Hle\mp3.cpp">
<Filter>Source Files\hle</Filter>
</ClCompile>
<ClCompile Include="Hle\musyx.cpp">
<Filter>Source Files\hle</Filter>
</ClCompile>
<ClCompile Include="Hle\jpeg.cpp">
<Filter>Source Files\hle</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="cpu\RSPInstruction.h">
@ -161,5 +200,23 @@
<ClInclude Include="cpu\RSPRegisterHandlerPlugin.h">
<Filter>Header Files\cpu</Filter>
</ClInclude>
<ClInclude Include="Hle\alist.h">
<Filter>Header Files\hle</Filter>
</ClInclude>
<ClInclude Include="Hle\arithmetics.h">
<Filter>Header Files\hle</Filter>
</ClInclude>
<ClInclude Include="Hle\audio.h">
<Filter>Header Files\hle</Filter>
</ClInclude>
<ClInclude Include="Hle\mem.h">
<Filter>Header Files\hle</Filter>
</ClInclude>
<ClInclude Include="Hle\hle.h">
<Filter>Header Files\hle</Filter>
</ClInclude>
<ClInclude Include="Hle\ucodes.h">
<Filter>Header Files\hle</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -1,13 +1,118 @@
#include "RSPInfo.h"
#include <Project64-rsp-core/Hle/hle.h>
#include <Project64-rsp-core/Recompiler/RspProfiling.h>
#include <Project64-rsp-core/Recompiler/RspRecompilerCPU.h>
#include <Project64-rsp-core/Settings/RspSettings.h>
#include <Project64-rsp-core/Settings/RspSettingsID.h>
#include <Project64-rsp-core/cpu/RSPCpu.h>
#include <Project64-rsp-core/cpu/RSPRegisters.h>
#include <Project64-rsp-core/cpu/RspLog.h>
#include <Project64-rsp-core/cpu/RspMemory.h>
#include <Settings/Settings.h>
#if defined(_MSC_VER)
#include <Windows.h>
#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 <cpuid.h>, 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;
}
}

View File

@ -1,6 +1,13 @@
#include <Project64-plugin-spec/Rsp.h>
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);

View File

@ -27,6 +27,7 @@ bool ChangedPC;
RSP_BLOCK CurrentBlock;
RSP_CODE RspCode;
RSP_COMPILER Compiler;
uint8_t *pLastSecondary = NULL, *pLastPrimary = NULL;

View File

@ -5,7 +5,7 @@
#include <Settings/Settings.h>
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);

View File

@ -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;

View File

@ -9,6 +9,7 @@ enum
Set_Profiling,
Set_IndvidualBlock,
Set_ShowErrors,
Set_HleAlistTask,
// Compiler settings
Set_CheckDest,

View File

@ -1,5 +1,6 @@
#include "RSPCpu.h"
#include <Common/CriticalSection.h>
#include <Project64-rsp-core/Hle/hle.h>
#include <Project64-rsp-core/RSPDebugger.h>
#include <Project64-rsp-core/RSPInfo.h>
#include <Project64-rsp-core/Settings/RspSettings.h>
@ -54,7 +55,10 @@ void Build_RSP(void)
SQrootResult.UW = 0;
SetCPU(g_CPUCore);
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 )
if (g_RSPDebugger != nullptr)
{
*RSPInfo.MI_INTR_REG |= MI_INTR_SP;
RSPInfo.CheckInterrupts();
}
//return Cycles;
*/
g_RSPDebugger->RspCyclesStart();
}
CGuard Guard(g_CPUCriticalSection);
switch (g_CPUCore)
@ -185,6 +199,9 @@ uint32_t DoRspCycles(uint32_t Cycles)
RunInterpreterCPU(Cycles);
break;
}
if (g_RSPDebugger != nullptr)
{
g_RSPDebugger->RspCyclesStop();
}
return Cycles;
}

View File

@ -375,13 +375,18 @@ uint32_t RunInterpreterCPU(uint32_t Cycles)
{
uint32_t CycleCount;
RSP_Running = true;
if (g_RSPDebugger != nullptr)
{
g_RSPDebugger->StartingCPU();
}
CycleCount = 0;
while (RSP_Running)
{
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

View File

@ -412,8 +412,11 @@ void RSP_Opcode_BGEZAL(void)
// COP0 functions
void RSP_Cop0_MF(void)
{
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;
@ -1677,6 +1680,9 @@ void RSP_Opcode_SWV(void)
// Other functions
void rsp_UnknownOpcode(void)
{
if (g_RSPDebugger != nullptr)
{
g_RSPDebugger->UnknownOpcode();
}
}

View File

@ -33,7 +33,6 @@
#include <Project64-rsp-core/cpu/RspMemory.h>
#include <Project64-rsp-core/cpu/RspTypes.h>
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 <cpuid.h>, 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

View File

@ -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

View File

@ -67,9 +67,6 @@
<ProjectReference Include="..\Settings\Settings.vcxproj">
<Project>{8b9961b1-88d9-4ea3-a752-507a00dd9f3d}</Project>
</ProjectReference>
<ProjectReference Include="..\UpdateVersion\UpdateVersion.vcxproj">
<Project>{1968162c-0793-491d-91a1-81645a24d399}</Project>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Project64-rsp.rc" />

View File

@ -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

View File

@ -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"